okstra 0.113.0 → 0.115.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 (348) hide show
  1. package/README.kr.md +2 -2
  2. package/README.md +2 -2
  3. package/docs/for-ai/README.md +2 -2
  4. package/docs/for-ai/skills/{okstra-brief.md → okstra-brief-gen.md} +3 -3
  5. package/docs/for-ai/skills/okstra-inspect.md +1 -1
  6. package/docs/kr/architecture.md +11 -11
  7. package/docs/kr/cli.md +1 -1
  8. package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
  9. package/docs/project-structure-overview.md +2 -2
  10. package/package.json +1 -1
  11. package/runtime/BUILD.json +2 -2
  12. package/runtime/agents/workers/report-writer-worker.md +1 -0
  13. package/runtime/prompts/lead/context-loader.md +2 -2
  14. package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
  15. package/runtime/prompts/profiles/_common-contract.md +3 -3
  16. package/runtime/prompts/profiles/implementation-planning.md +1 -1
  17. package/runtime/prompts/profiles/requirements-discovery.md +2 -2
  18. package/runtime/python/okstra_ctl/fix_cycles.py +1 -1
  19. package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
  20. package/runtime/python/okstra_ctl/report_views.py +151 -12
  21. package/runtime/python/okstra_ctl/run.py +24 -24
  22. package/runtime/python/okstra_ctl/wizard.py +3 -3
  23. package/runtime/python/okstra_ctl/worktree.py +1 -1
  24. package/runtime/python/okstra_token_usage/claude.py +58 -19
  25. package/runtime/python/okstra_token_usage/collect.py +3 -1
  26. package/runtime/python/okstra_vendor/__init__.py +3 -0
  27. package/runtime/schemas/final-report-v1.0.schema.json +20 -0
  28. package/runtime/skills/{okstra-brief → okstra-brief-gen}/SKILL.md +6 -6
  29. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/reporter-confirmations.md +1 -1
  30. package/runtime/skills/{okstra-brief → okstra-brief-gen}/references/tracker-recursion.md +1 -1
  31. package/runtime/skills/okstra-inspect/SKILL.md +2 -2
  32. package/runtime/templates/reports/brief.template.md +2 -2
  33. package/runtime/templates/reports/final-report.template.md +14 -0
  34. package/runtime/templates/reports/i18n/en.json +23 -12
  35. package/runtime/templates/reports/i18n/ko.json +23 -12
  36. package/runtime/templates/reports/report.css +55 -0
  37. package/runtime/templates/reports/report.js +53 -1
  38. package/runtime/validators/validate-brief.py +5 -5
  39. package/runtime/validators/validate-brief.sh +1 -1
  40. package/src/commands/lifecycle/uninstall.mjs +2 -1
  41. package/src/lib/skill-catalog.mjs +2 -1
  42. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  43. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
  44. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
  45. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
  46. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
  47. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
  57. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
  59. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
  60. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
  61. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
  62. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
  63. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
  64. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
  66. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
  67. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
  68. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
  69. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
  70. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
  71. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
  72. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
  73. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
  74. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
  75. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
  76. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
  77. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
  78. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
  80. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
  81. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
  82. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
  83. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
  84. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
  85. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
  86. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
  87. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
  88. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
  89. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
  90. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
  91. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
  92. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
  93. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
  94. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
  95. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
  96. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
  97. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
  98. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
  99. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
  101. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
  103. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
  104. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
  105. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
  106. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
  107. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
  108. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
  109. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
  110. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
  111. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
  112. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
  113. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
  114. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
  115. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
  117. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
  118. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
  119. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
  120. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
  121. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
  122. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
  124. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
  125. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
  126. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
  127. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
  128. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
  129. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
  130. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
  131. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
  136. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
  137. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
  138. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
  139. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
  140. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
  147. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
  148. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
  149. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
  150. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
  151. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
  152. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
  153. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
  154. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
  155. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
  157. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
  158. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
  159. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
  161. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
  162. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
  163. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
  164. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
  166. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
  167. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
  168. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
  169. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
  170. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
  171. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
  173. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
  174. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
  175. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
  176. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
  177. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
  178. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
  179. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
  180. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
  181. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
  182. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
  183. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
  184. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
  185. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
  186. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
  187. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
  188. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
  189. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
  190. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
  191. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
  192. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
  193. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
  194. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
  195. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
  196. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
  197. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
  198. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
  199. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
  200. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
  201. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
  202. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
  203. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
  204. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
  205. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
  206. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
  207. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
  208. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
  209. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
  210. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
  211. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
  212. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
  213. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
  214. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
  215. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
  216. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
  217. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
  218. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
  219. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
  220. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
  221. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
  222. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
  223. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
  224. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
  225. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
  226. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
  227. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
  228. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
  229. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
  231. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
  232. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
  233. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
  234. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
  235. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
  237. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
  238. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
  239. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
  240. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
  241. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
  242. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
  243. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  244. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
  245. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
  246. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
  247. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
  248. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
  249. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
  250. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
  251. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
  252. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
  253. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
  254. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
  255. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
  256. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
  257. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
  258. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
  259. package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
  260. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  261. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  262. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  263. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  264. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  265. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  266. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  267. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
  268. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
  269. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
  270. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
  271. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
  272. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
  273. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  274. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
  275. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
  276. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
  277. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
  278. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
  279. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
  280. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
  281. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
  282. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
  283. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
  284. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
  285. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
  286. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
  287. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
  288. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
  289. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
  290. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
  291. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
  292. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
  293. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
  294. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
  295. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
  296. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
  297. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
  298. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
  299. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
  300. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
  301. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
  302. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  303. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
  304. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
  305. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
  306. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
  307. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
  308. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
  309. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
  310. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  311. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
  312. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
  313. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
  314. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
  315. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  316. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
  317. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
  318. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
  319. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
  320. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
  321. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
  322. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
  323. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
  324. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
  325. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
  326. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
  327. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  328. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
  329. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
  330. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
  331. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
  332. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
  333. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
  334. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
  335. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
  336. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
  337. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
  338. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  339. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
  340. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
  341. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
  342. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
  343. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
  344. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
  345. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
  346. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
  347. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
  348. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +0 -55
@@ -1,275 +0,0 @@
1
- import pytest
2
-
3
- import networkx as nx
4
- from networkx.exception import NetworkXError
5
-
6
- np = pytest.importorskip("numpy")
7
- pytest.importorskip("scipy")
8
-
9
-
10
- def test_incidence_matrix_simple():
11
- deg = [3, 2, 2, 1, 0]
12
- G = nx.havel_hakimi_graph(deg)
13
- deg = [(1, 0), (1, 0), (1, 0), (2, 0), (1, 0), (2, 1), (0, 1), (0, 1)]
14
- MG = nx.random_clustered_graph(deg, seed=42)
15
-
16
- I = nx.incidence_matrix(G, dtype=int).todense()
17
- # fmt: off
18
- expected = np.array(
19
- [[1, 1, 1, 0],
20
- [0, 1, 0, 1],
21
- [1, 0, 0, 1],
22
- [0, 0, 1, 0],
23
- [0, 0, 0, 0]]
24
- )
25
- # fmt: on
26
- np.testing.assert_equal(I, expected)
27
-
28
- I = nx.incidence_matrix(MG, dtype=int).todense()
29
- # fmt: off
30
- expected = np.array(
31
- [[1, 0, 0, 0, 0, 0, 0],
32
- [1, 0, 0, 0, 0, 0, 0],
33
- [0, 1, 0, 0, 0, 0, 0],
34
- [0, 0, 0, 0, 0, 0, 0],
35
- [0, 1, 0, 0, 0, 0, 0],
36
- [0, 0, 0, 0, 1, 1, 0],
37
- [0, 0, 0, 0, 0, 1, 1],
38
- [0, 0, 0, 0, 1, 0, 1]]
39
- )
40
- # fmt: on
41
- np.testing.assert_equal(I, expected)
42
-
43
- with pytest.raises(NetworkXError):
44
- nx.incidence_matrix(G, nodelist=[0, 1])
45
-
46
-
47
- class TestGraphMatrix:
48
- @classmethod
49
- def setup_class(cls):
50
- deg = [3, 2, 2, 1, 0]
51
- cls.G = nx.havel_hakimi_graph(deg)
52
- # fmt: off
53
- cls.OI = np.array(
54
- [[-1, -1, -1, 0],
55
- [1, 0, 0, -1],
56
- [0, 1, 0, 1],
57
- [0, 0, 1, 0],
58
- [0, 0, 0, 0]]
59
- )
60
- cls.A = np.array(
61
- [[0, 1, 1, 1, 0],
62
- [1, 0, 1, 0, 0],
63
- [1, 1, 0, 0, 0],
64
- [1, 0, 0, 0, 0],
65
- [0, 0, 0, 0, 0]]
66
- )
67
- # fmt: on
68
- cls.WG = nx.havel_hakimi_graph(deg)
69
- cls.WG.add_edges_from(
70
- (u, v, {"weight": 0.5, "other": 0.3}) for (u, v) in cls.G.edges()
71
- )
72
- # fmt: off
73
- cls.WA = np.array(
74
- [[0, 0.5, 0.5, 0.5, 0],
75
- [0.5, 0, 0.5, 0, 0],
76
- [0.5, 0.5, 0, 0, 0],
77
- [0.5, 0, 0, 0, 0],
78
- [0, 0, 0, 0, 0]]
79
- )
80
- # fmt: on
81
- cls.MG = nx.MultiGraph(cls.G)
82
- cls.MG2 = cls.MG.copy()
83
- cls.MG2.add_edge(0, 1)
84
- # fmt: off
85
- cls.MG2A = np.array(
86
- [[0, 2, 1, 1, 0],
87
- [2, 0, 1, 0, 0],
88
- [1, 1, 0, 0, 0],
89
- [1, 0, 0, 0, 0],
90
- [0, 0, 0, 0, 0]]
91
- )
92
- cls.MGOI = np.array(
93
- [[-1, -1, -1, -1, 0],
94
- [1, 1, 0, 0, -1],
95
- [0, 0, 1, 0, 1],
96
- [0, 0, 0, 1, 0],
97
- [0, 0, 0, 0, 0]]
98
- )
99
- # fmt: on
100
- cls.no_edges_G = nx.Graph([(1, 2), (3, 2, {"weight": 8})])
101
- cls.no_edges_A = np.array([[0, 0], [0, 0]])
102
-
103
- def test_incidence_matrix(self):
104
- "Conversion to incidence matrix"
105
- I = nx.incidence_matrix(
106
- self.G,
107
- nodelist=sorted(self.G),
108
- edgelist=sorted(self.G.edges()),
109
- oriented=True,
110
- dtype=int,
111
- ).todense()
112
- np.testing.assert_equal(I, self.OI)
113
-
114
- I = nx.incidence_matrix(
115
- self.G,
116
- nodelist=sorted(self.G),
117
- edgelist=sorted(self.G.edges()),
118
- oriented=False,
119
- dtype=int,
120
- ).todense()
121
- np.testing.assert_equal(I, np.abs(self.OI))
122
-
123
- I = nx.incidence_matrix(
124
- self.MG,
125
- nodelist=sorted(self.MG),
126
- edgelist=sorted(self.MG.edges()),
127
- oriented=True,
128
- dtype=int,
129
- ).todense()
130
- np.testing.assert_equal(I, self.OI)
131
-
132
- I = nx.incidence_matrix(
133
- self.MG,
134
- nodelist=sorted(self.MG),
135
- edgelist=sorted(self.MG.edges()),
136
- oriented=False,
137
- dtype=int,
138
- ).todense()
139
- np.testing.assert_equal(I, np.abs(self.OI))
140
-
141
- I = nx.incidence_matrix(
142
- self.MG2,
143
- nodelist=sorted(self.MG2),
144
- edgelist=sorted(self.MG2.edges()),
145
- oriented=True,
146
- dtype=int,
147
- ).todense()
148
- np.testing.assert_equal(I, self.MGOI)
149
-
150
- I = nx.incidence_matrix(
151
- self.MG2,
152
- nodelist=sorted(self.MG),
153
- edgelist=sorted(self.MG2.edges()),
154
- oriented=False,
155
- dtype=int,
156
- ).todense()
157
- np.testing.assert_equal(I, np.abs(self.MGOI))
158
-
159
- I = nx.incidence_matrix(self.G, dtype=np.uint8)
160
- assert I.dtype == np.uint8
161
-
162
- def test_weighted_incidence_matrix(self):
163
- I = nx.incidence_matrix(
164
- self.WG,
165
- nodelist=sorted(self.WG),
166
- edgelist=sorted(self.WG.edges()),
167
- oriented=True,
168
- dtype=int,
169
- ).todense()
170
- np.testing.assert_equal(I, self.OI)
171
-
172
- I = nx.incidence_matrix(
173
- self.WG,
174
- nodelist=sorted(self.WG),
175
- edgelist=sorted(self.WG.edges()),
176
- oriented=False,
177
- dtype=int,
178
- ).todense()
179
- np.testing.assert_equal(I, np.abs(self.OI))
180
-
181
- # np.testing.assert_equal(nx.incidence_matrix(self.WG,oriented=True,
182
- # weight='weight').todense(),0.5*self.OI)
183
- # np.testing.assert_equal(nx.incidence_matrix(self.WG,weight='weight').todense(),
184
- # np.abs(0.5*self.OI))
185
- # np.testing.assert_equal(nx.incidence_matrix(self.WG,oriented=True,weight='other').todense(),
186
- # 0.3*self.OI)
187
-
188
- I = nx.incidence_matrix(
189
- self.WG,
190
- nodelist=sorted(self.WG),
191
- edgelist=sorted(self.WG.edges()),
192
- oriented=True,
193
- weight="weight",
194
- ).todense()
195
- np.testing.assert_equal(I, 0.5 * self.OI)
196
-
197
- I = nx.incidence_matrix(
198
- self.WG,
199
- nodelist=sorted(self.WG),
200
- edgelist=sorted(self.WG.edges()),
201
- oriented=False,
202
- weight="weight",
203
- ).todense()
204
- np.testing.assert_equal(I, np.abs(0.5 * self.OI))
205
-
206
- I = nx.incidence_matrix(
207
- self.WG,
208
- nodelist=sorted(self.WG),
209
- edgelist=sorted(self.WG.edges()),
210
- oriented=True,
211
- weight="other",
212
- ).todense()
213
- np.testing.assert_equal(I, 0.3 * self.OI)
214
-
215
- # WMG=nx.MultiGraph(self.WG)
216
- # WMG.add_edge(0,1,weight=0.5,other=0.3)
217
- # np.testing.assert_equal(nx.incidence_matrix(WMG,weight='weight').todense(),
218
- # np.abs(0.5*self.MGOI))
219
- # np.testing.assert_equal(nx.incidence_matrix(WMG,weight='weight',oriented=True).todense(),
220
- # 0.5*self.MGOI)
221
- # np.testing.assert_equal(nx.incidence_matrix(WMG,weight='other',oriented=True).todense(),
222
- # 0.3*self.MGOI)
223
-
224
- WMG = nx.MultiGraph(self.WG)
225
- WMG.add_edge(0, 1, weight=0.5, other=0.3)
226
-
227
- I = nx.incidence_matrix(
228
- WMG,
229
- nodelist=sorted(WMG),
230
- edgelist=sorted(WMG.edges(keys=True)),
231
- oriented=True,
232
- weight="weight",
233
- ).todense()
234
- np.testing.assert_equal(I, 0.5 * self.MGOI)
235
-
236
- I = nx.incidence_matrix(
237
- WMG,
238
- nodelist=sorted(WMG),
239
- edgelist=sorted(WMG.edges(keys=True)),
240
- oriented=False,
241
- weight="weight",
242
- ).todense()
243
- np.testing.assert_equal(I, np.abs(0.5 * self.MGOI))
244
-
245
- I = nx.incidence_matrix(
246
- WMG,
247
- nodelist=sorted(WMG),
248
- edgelist=sorted(WMG.edges(keys=True)),
249
- oriented=True,
250
- weight="other",
251
- ).todense()
252
- np.testing.assert_equal(I, 0.3 * self.MGOI)
253
-
254
- def test_adjacency_matrix(self):
255
- "Conversion to adjacency matrix"
256
- np.testing.assert_equal(nx.adjacency_matrix(self.G).todense(), self.A)
257
- np.testing.assert_equal(nx.adjacency_matrix(self.MG).todense(), self.A)
258
- np.testing.assert_equal(nx.adjacency_matrix(self.MG2).todense(), self.MG2A)
259
- np.testing.assert_equal(
260
- nx.adjacency_matrix(self.G, nodelist=[0, 1]).todense(), self.A[:2, :2]
261
- )
262
- np.testing.assert_equal(nx.adjacency_matrix(self.WG).todense(), self.WA)
263
- np.testing.assert_equal(
264
- nx.adjacency_matrix(self.WG, weight=None).todense(), self.A
265
- )
266
- np.testing.assert_equal(
267
- nx.adjacency_matrix(self.MG2, weight=None).todense(), self.MG2A
268
- )
269
- np.testing.assert_equal(
270
- nx.adjacency_matrix(self.WG, weight="other").todense(), 0.6 * self.WA
271
- )
272
- np.testing.assert_equal(
273
- nx.adjacency_matrix(self.no_edges_G, nodelist=[1, 3]).todense(),
274
- self.no_edges_A,
275
- )
@@ -1,334 +0,0 @@
1
- import pytest
2
-
3
- import networkx as nx
4
-
5
- np = pytest.importorskip("numpy")
6
- pytest.importorskip("scipy")
7
-
8
-
9
- class TestLaplacian:
10
- @classmethod
11
- def setup_class(cls):
12
- deg = [3, 2, 2, 1, 0]
13
- cls.G = nx.havel_hakimi_graph(deg)
14
- cls.WG = nx.Graph(
15
- (u, v, {"weight": 0.5, "other": 0.3}) for (u, v) in cls.G.edges()
16
- )
17
- cls.WG.add_node(4)
18
- cls.MG = nx.MultiGraph(cls.G)
19
-
20
- # Graph with clsloops
21
- cls.Gsl = cls.G.copy()
22
- for node in cls.Gsl.nodes():
23
- cls.Gsl.add_edge(node, node)
24
-
25
- # Graph used as an example in Sec. 4.1 of Langville and Meyer,
26
- # "Google's PageRank and Beyond".
27
- cls.DiG = nx.DiGraph()
28
- cls.DiG.add_edges_from(
29
- (
30
- (1, 2),
31
- (1, 3),
32
- (3, 1),
33
- (3, 2),
34
- (3, 5),
35
- (4, 5),
36
- (4, 6),
37
- (5, 4),
38
- (5, 6),
39
- (6, 4),
40
- )
41
- )
42
- cls.DiMG = nx.MultiDiGraph(cls.DiG)
43
- cls.DiWG = nx.DiGraph(
44
- (u, v, {"weight": 0.5, "other": 0.3}) for (u, v) in cls.DiG.edges()
45
- )
46
- cls.DiGsl = cls.DiG.copy()
47
- for node in cls.DiGsl.nodes():
48
- cls.DiGsl.add_edge(node, node)
49
-
50
- def test_laplacian(self):
51
- "Graph Laplacian"
52
- # fmt: off
53
- NL = np.array([[ 3, -1, -1, -1, 0],
54
- [-1, 2, -1, 0, 0],
55
- [-1, -1, 2, 0, 0],
56
- [-1, 0, 0, 1, 0],
57
- [ 0, 0, 0, 0, 0]])
58
- # fmt: on
59
- WL = 0.5 * NL
60
- OL = 0.3 * NL
61
- # fmt: off
62
- DiNL = np.array([[ 2, -1, -1, 0, 0, 0],
63
- [ 0, 0, 0, 0, 0, 0],
64
- [-1, -1, 3, -1, 0, 0],
65
- [ 0, 0, 0, 2, -1, -1],
66
- [ 0, 0, 0, -1, 2, -1],
67
- [ 0, 0, 0, 0, -1, 1]])
68
- # fmt: on
69
- DiWL = 0.5 * DiNL
70
- DiOL = 0.3 * DiNL
71
- np.testing.assert_equal(nx.laplacian_matrix(self.G).todense(), NL)
72
- np.testing.assert_equal(nx.laplacian_matrix(self.MG).todense(), NL)
73
- np.testing.assert_equal(
74
- nx.laplacian_matrix(self.G, nodelist=[0, 1]).todense(),
75
- np.array([[1, -1], [-1, 1]]),
76
- )
77
- np.testing.assert_equal(nx.laplacian_matrix(self.WG).todense(), WL)
78
- np.testing.assert_equal(nx.laplacian_matrix(self.WG, weight=None).todense(), NL)
79
- np.testing.assert_equal(
80
- nx.laplacian_matrix(self.WG, weight="other").todense(), OL
81
- )
82
-
83
- np.testing.assert_equal(nx.laplacian_matrix(self.DiG).todense(), DiNL)
84
- np.testing.assert_equal(nx.laplacian_matrix(self.DiMG).todense(), DiNL)
85
- np.testing.assert_equal(
86
- nx.laplacian_matrix(self.DiG, nodelist=[1, 2]).todense(),
87
- np.array([[1, -1], [0, 0]]),
88
- )
89
- np.testing.assert_equal(nx.laplacian_matrix(self.DiWG).todense(), DiWL)
90
- np.testing.assert_equal(
91
- nx.laplacian_matrix(self.DiWG, weight=None).todense(), DiNL
92
- )
93
- np.testing.assert_equal(
94
- nx.laplacian_matrix(self.DiWG, weight="other").todense(), DiOL
95
- )
96
-
97
- def test_normalized_laplacian(self):
98
- "Generalized Graph Laplacian"
99
- # fmt: off
100
- G = np.array([[ 1. , -0.408, -0.408, -0.577, 0.],
101
- [-0.408, 1. , -0.5 , 0. , 0.],
102
- [-0.408, -0.5 , 1. , 0. , 0.],
103
- [-0.577, 0. , 0. , 1. , 0.],
104
- [ 0. , 0. , 0. , 0. , 0.]])
105
- GL = np.array([[ 1. , -0.408, -0.408, -0.577, 0. ],
106
- [-0.408, 1. , -0.5 , 0. , 0. ],
107
- [-0.408, -0.5 , 1. , 0. , 0. ],
108
- [-0.577, 0. , 0. , 1. , 0. ],
109
- [ 0. , 0. , 0. , 0. , 0. ]])
110
- Lsl = np.array([[ 0.75 , -0.2887, -0.2887, -0.3536, 0. ],
111
- [-0.2887, 0.6667, -0.3333, 0. , 0. ],
112
- [-0.2887, -0.3333, 0.6667, 0. , 0. ],
113
- [-0.3536, 0. , 0. , 0.5 , 0. ],
114
- [ 0. , 0. , 0. , 0. , 0. ]])
115
-
116
- DiG = np.array([[ 1. , 0. , -0.4082, 0. , 0. , 0. ],
117
- [ 0. , 0. , 0. , 0. , 0. , 0. ],
118
- [-0.4082, 0. , 1. , 0. , -0.4082, 0. ],
119
- [ 0. , 0. , 0. , 1. , -0.5 , -0.7071],
120
- [ 0. , 0. , 0. , -0.5 , 1. , -0.7071],
121
- [ 0. , 0. , 0. , -0.7071, 0. , 1. ]])
122
- DiGL = np.array([[ 1. , 0. , -0.4082, 0. , 0. , 0. ],
123
- [ 0. , 0. , 0. , 0. , 0. , 0. ],
124
- [-0.4082, 0. , 1. , -0.4082, 0. , 0. ],
125
- [ 0. , 0. , 0. , 1. , -0.5 , -0.7071],
126
- [ 0. , 0. , 0. , -0.5 , 1. , -0.7071],
127
- [ 0. , 0. , 0. , 0. , -0.7071, 1. ]])
128
- DiLsl = np.array([[ 0.6667, -0.5774, -0.2887, 0. , 0. , 0. ],
129
- [ 0. , 0. , 0. , 0. , 0. , 0. ],
130
- [-0.2887, -0.5 , 0.75 , -0.2887, 0. , 0. ],
131
- [ 0. , 0. , 0. , 0.6667, -0.3333, -0.4082],
132
- [ 0. , 0. , 0. , -0.3333, 0.6667, -0.4082],
133
- [ 0. , 0. , 0. , 0. , -0.4082, 0.5 ]])
134
- # fmt: on
135
-
136
- np.testing.assert_almost_equal(
137
- nx.normalized_laplacian_matrix(self.G, nodelist=range(5)).todense(),
138
- G,
139
- decimal=3,
140
- )
141
- np.testing.assert_almost_equal(
142
- nx.normalized_laplacian_matrix(self.G).todense(), GL, decimal=3
143
- )
144
- np.testing.assert_almost_equal(
145
- nx.normalized_laplacian_matrix(self.MG).todense(), GL, decimal=3
146
- )
147
- np.testing.assert_almost_equal(
148
- nx.normalized_laplacian_matrix(self.WG).todense(), GL, decimal=3
149
- )
150
- np.testing.assert_almost_equal(
151
- nx.normalized_laplacian_matrix(self.WG, weight="other").todense(),
152
- GL,
153
- decimal=3,
154
- )
155
- np.testing.assert_almost_equal(
156
- nx.normalized_laplacian_matrix(self.Gsl).todense(), Lsl, decimal=3
157
- )
158
-
159
- np.testing.assert_almost_equal(
160
- nx.normalized_laplacian_matrix(
161
- self.DiG,
162
- nodelist=range(1, 1 + 6),
163
- ).todense(),
164
- DiG,
165
- decimal=3,
166
- )
167
- np.testing.assert_almost_equal(
168
- nx.normalized_laplacian_matrix(self.DiG).todense(), DiGL, decimal=3
169
- )
170
- np.testing.assert_almost_equal(
171
- nx.normalized_laplacian_matrix(self.DiMG).todense(), DiGL, decimal=3
172
- )
173
- np.testing.assert_almost_equal(
174
- nx.normalized_laplacian_matrix(self.DiWG).todense(), DiGL, decimal=3
175
- )
176
- np.testing.assert_almost_equal(
177
- nx.normalized_laplacian_matrix(self.DiWG, weight="other").todense(),
178
- DiGL,
179
- decimal=3,
180
- )
181
- np.testing.assert_almost_equal(
182
- nx.normalized_laplacian_matrix(self.DiGsl).todense(), DiLsl, decimal=3
183
- )
184
-
185
-
186
- def test_directed_laplacian():
187
- "Directed Laplacian"
188
- # Graph used as an example in Sec. 4.1 of Langville and Meyer,
189
- # "Google's PageRank and Beyond". The graph contains dangling nodes, so
190
- # the pagerank random walk is selected by directed_laplacian
191
- G = nx.DiGraph()
192
- G.add_edges_from(
193
- (
194
- (1, 2),
195
- (1, 3),
196
- (3, 1),
197
- (3, 2),
198
- (3, 5),
199
- (4, 5),
200
- (4, 6),
201
- (5, 4),
202
- (5, 6),
203
- (6, 4),
204
- )
205
- )
206
- # fmt: off
207
- GL = np.array([[ 0.9833, -0.2941, -0.3882, -0.0291, -0.0231, -0.0261],
208
- [-0.2941, 0.8333, -0.2339, -0.0536, -0.0589, -0.0554],
209
- [-0.3882, -0.2339, 0.9833, -0.0278, -0.0896, -0.0251],
210
- [-0.0291, -0.0536, -0.0278, 0.9833, -0.4878, -0.6675],
211
- [-0.0231, -0.0589, -0.0896, -0.4878, 0.9833, -0.2078],
212
- [-0.0261, -0.0554, -0.0251, -0.6675, -0.2078, 0.9833]])
213
- # fmt: on
214
- L = nx.directed_laplacian_matrix(G, alpha=0.9, nodelist=sorted(G))
215
- np.testing.assert_almost_equal(L, GL, decimal=3)
216
-
217
- # Make the graph strongly connected, so we can use a random and lazy walk
218
- G.add_edges_from(((2, 5), (6, 1)))
219
- # fmt: off
220
- GL = np.array([[ 1. , -0.3062, -0.4714, 0. , 0. , -0.3227],
221
- [-0.3062, 1. , -0.1443, 0. , -0.3162, 0. ],
222
- [-0.4714, -0.1443, 1. , 0. , -0.0913, 0. ],
223
- [ 0. , 0. , 0. , 1. , -0.5 , -0.5 ],
224
- [ 0. , -0.3162, -0.0913, -0.5 , 1. , -0.25 ],
225
- [-0.3227, 0. , 0. , -0.5 , -0.25 , 1. ]])
226
- # fmt: on
227
- L = nx.directed_laplacian_matrix(
228
- G, alpha=0.9, nodelist=sorted(G), walk_type="random"
229
- )
230
- np.testing.assert_almost_equal(L, GL, decimal=3)
231
-
232
- # fmt: off
233
- GL = np.array([[ 0.5 , -0.1531, -0.2357, 0. , 0. , -0.1614],
234
- [-0.1531, 0.5 , -0.0722, 0. , -0.1581, 0. ],
235
- [-0.2357, -0.0722, 0.5 , 0. , -0.0456, 0. ],
236
- [ 0. , 0. , 0. , 0.5 , -0.25 , -0.25 ],
237
- [ 0. , -0.1581, -0.0456, -0.25 , 0.5 , -0.125 ],
238
- [-0.1614, 0. , 0. , -0.25 , -0.125 , 0.5 ]])
239
- # fmt: on
240
- L = nx.directed_laplacian_matrix(G, alpha=0.9, nodelist=sorted(G), walk_type="lazy")
241
- np.testing.assert_almost_equal(L, GL, decimal=3)
242
-
243
- # Make a strongly connected periodic graph
244
- G = nx.DiGraph()
245
- G.add_edges_from(((1, 2), (2, 4), (4, 1), (1, 3), (3, 4)))
246
- # fmt: off
247
- GL = np.array([[ 0.5 , -0.176, -0.176, -0.25 ],
248
- [-0.176, 0.5 , 0. , -0.176],
249
- [-0.176, 0. , 0.5 , -0.176],
250
- [-0.25 , -0.176, -0.176, 0.5 ]])
251
- # fmt: on
252
- L = nx.directed_laplacian_matrix(G, alpha=0.9, nodelist=sorted(G))
253
- np.testing.assert_almost_equal(L, GL, decimal=3)
254
-
255
-
256
- def test_directed_combinatorial_laplacian():
257
- "Directed combinatorial Laplacian"
258
- # Graph used as an example in Sec. 4.1 of Langville and Meyer,
259
- # "Google's PageRank and Beyond". The graph contains dangling nodes, so
260
- # the pagerank random walk is selected by directed_laplacian
261
- G = nx.DiGraph()
262
- G.add_edges_from(
263
- (
264
- (1, 2),
265
- (1, 3),
266
- (3, 1),
267
- (3, 2),
268
- (3, 5),
269
- (4, 5),
270
- (4, 6),
271
- (5, 4),
272
- (5, 6),
273
- (6, 4),
274
- )
275
- )
276
- # fmt: off
277
- GL = np.array([[ 0.0366, -0.0132, -0.0153, -0.0034, -0.0020, -0.0027],
278
- [-0.0132, 0.0450, -0.0111, -0.0076, -0.0062, -0.0069],
279
- [-0.0153, -0.0111, 0.0408, -0.0035, -0.0083, -0.0027],
280
- [-0.0034, -0.0076, -0.0035, 0.3688, -0.1356, -0.2187],
281
- [-0.0020, -0.0062, -0.0083, -0.1356, 0.2026, -0.0505],
282
- [-0.0027, -0.0069, -0.0027, -0.2187, -0.0505, 0.2815]])
283
- # fmt: on
284
-
285
- L = nx.directed_combinatorial_laplacian_matrix(G, alpha=0.9, nodelist=sorted(G))
286
- np.testing.assert_almost_equal(L, GL, decimal=3)
287
-
288
- # Make the graph strongly connected, so we can use a random and lazy walk
289
- G.add_edges_from(((2, 5), (6, 1)))
290
-
291
- # fmt: off
292
- GL = np.array([[ 0.1395, -0.0349, -0.0465, 0. , 0. , -0.0581],
293
- [-0.0349, 0.093 , -0.0116, 0. , -0.0465, 0. ],
294
- [-0.0465, -0.0116, 0.0698, 0. , -0.0116, 0. ],
295
- [ 0. , 0. , 0. , 0.2326, -0.1163, -0.1163],
296
- [ 0. , -0.0465, -0.0116, -0.1163, 0.2326, -0.0581],
297
- [-0.0581, 0. , 0. , -0.1163, -0.0581, 0.2326]])
298
- # fmt: on
299
-
300
- L = nx.directed_combinatorial_laplacian_matrix(
301
- G, alpha=0.9, nodelist=sorted(G), walk_type="random"
302
- )
303
- np.testing.assert_almost_equal(L, GL, decimal=3)
304
-
305
- # fmt: off
306
- GL = np.array([[ 0.0698, -0.0174, -0.0233, 0. , 0. , -0.0291],
307
- [-0.0174, 0.0465, -0.0058, 0. , -0.0233, 0. ],
308
- [-0.0233, -0.0058, 0.0349, 0. , -0.0058, 0. ],
309
- [ 0. , 0. , 0. , 0.1163, -0.0581, -0.0581],
310
- [ 0. , -0.0233, -0.0058, -0.0581, 0.1163, -0.0291],
311
- [-0.0291, 0. , 0. , -0.0581, -0.0291, 0.1163]])
312
- # fmt: on
313
-
314
- L = nx.directed_combinatorial_laplacian_matrix(
315
- G, alpha=0.9, nodelist=sorted(G), walk_type="lazy"
316
- )
317
- np.testing.assert_almost_equal(L, GL, decimal=3)
318
-
319
- E = nx.DiGraph(nx.margulis_gabber_galil_graph(2))
320
- L = nx.directed_combinatorial_laplacian_matrix(E)
321
- # fmt: off
322
- expected = np.array(
323
- [[ 0.16666667, -0.08333333, -0.08333333, 0. ],
324
- [-0.08333333, 0.16666667, 0. , -0.08333333],
325
- [-0.08333333, 0. , 0.16666667, -0.08333333],
326
- [ 0. , -0.08333333, -0.08333333, 0.16666667]]
327
- )
328
- # fmt: on
329
- np.testing.assert_almost_equal(L, expected, decimal=6)
330
-
331
- with pytest.raises(nx.NetworkXError):
332
- nx.directed_combinatorial_laplacian_matrix(G, walk_type="pagerank", alpha=100)
333
- with pytest.raises(nx.NetworkXError):
334
- nx.directed_combinatorial_laplacian_matrix(G, walk_type="silly")
@@ -1,86 +0,0 @@
1
- import pytest
2
-
3
- import networkx as nx
4
-
5
- np = pytest.importorskip("numpy")
6
- pytest.importorskip("scipy")
7
-
8
-
9
- class TestModularity:
10
- @classmethod
11
- def setup_class(cls):
12
- deg = [3, 2, 2, 1, 0]
13
- cls.G = nx.havel_hakimi_graph(deg)
14
- # Graph used as an example in Sec. 4.1 of Langville and Meyer,
15
- # "Google's PageRank and Beyond". (Used for test_directed_laplacian)
16
- cls.DG = nx.DiGraph()
17
- cls.DG.add_edges_from(
18
- (
19
- (1, 2),
20
- (1, 3),
21
- (3, 1),
22
- (3, 2),
23
- (3, 5),
24
- (4, 5),
25
- (4, 6),
26
- (5, 4),
27
- (5, 6),
28
- (6, 4),
29
- )
30
- )
31
-
32
- def test_modularity(self):
33
- "Modularity matrix"
34
- # fmt: off
35
- B = np.array([[-1.125, 0.25, 0.25, 0.625, 0.],
36
- [0.25, -0.5, 0.5, -0.25, 0.],
37
- [0.25, 0.5, -0.5, -0.25, 0.],
38
- [0.625, -0.25, -0.25, -0.125, 0.],
39
- [0., 0., 0., 0., 0.]])
40
- # fmt: on
41
-
42
- permutation = [4, 0, 1, 2, 3]
43
- np.testing.assert_equal(nx.modularity_matrix(self.G), B)
44
- np.testing.assert_equal(
45
- nx.modularity_matrix(self.G, nodelist=permutation),
46
- B[np.ix_(permutation, permutation)],
47
- )
48
-
49
- def test_modularity_weight(self):
50
- "Modularity matrix with weights"
51
- # fmt: off
52
- B = np.array([[-1.125, 0.25, 0.25, 0.625, 0.],
53
- [0.25, -0.5, 0.5, -0.25, 0.],
54
- [0.25, 0.5, -0.5, -0.25, 0.],
55
- [0.625, -0.25, -0.25, -0.125, 0.],
56
- [0., 0., 0., 0., 0.]])
57
- # fmt: on
58
-
59
- G_weighted = self.G.copy()
60
- for n1, n2 in G_weighted.edges():
61
- G_weighted.edges[n1, n2]["weight"] = 0.5
62
- # The following test would fail in networkx 1.1
63
- np.testing.assert_equal(nx.modularity_matrix(G_weighted), B)
64
- # The following test that the modularity matrix get rescaled accordingly
65
- np.testing.assert_equal(
66
- nx.modularity_matrix(G_weighted, weight="weight"), 0.5 * B
67
- )
68
-
69
- def test_directed_modularity(self):
70
- "Directed Modularity matrix"
71
- # fmt: off
72
- B = np.array([[-0.2, 0.6, 0.8, -0.4, -0.4, -0.4],
73
- [0., 0., 0., 0., 0., 0.],
74
- [0.7, 0.4, -0.3, -0.6, 0.4, -0.6],
75
- [-0.2, -0.4, -0.2, -0.4, 0.6, 0.6],
76
- [-0.2, -0.4, -0.2, 0.6, -0.4, 0.6],
77
- [-0.1, -0.2, -0.1, 0.8, -0.2, -0.2]])
78
- # fmt: on
79
- node_permutation = [5, 1, 2, 3, 4, 6]
80
- idx_permutation = [4, 0, 1, 2, 3, 5]
81
- mm = nx.directed_modularity_matrix(self.DG, nodelist=sorted(self.DG))
82
- np.testing.assert_equal(mm, B)
83
- np.testing.assert_equal(
84
- nx.directed_modularity_matrix(self.DG, nodelist=node_permutation),
85
- B[np.ix_(idx_permutation, idx_permutation)],
86
- )