okstra 0.114.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.
- package/docs/kr/architecture.md +2 -2
- package/docs/kr/follow-ups/2026-07-10-final-report-option-3.md +51 -0
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/report-writer-worker.md +1 -0
- package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
- package/runtime/python/okstra_ctl/implementation_stage.py +46 -39
- package/runtime/python/okstra_ctl/report_views.py +151 -12
- package/runtime/python/okstra_ctl/run.py +24 -24
- package/runtime/python/okstra_ctl/worktree.py +1 -1
- package/runtime/python/okstra_token_usage/claude.py +58 -19
- package/runtime/python/okstra_token_usage/collect.py +3 -1
- package/runtime/python/okstra_vendor/__init__.py +3 -0
- package/runtime/schemas/final-report-v1.0.schema.json +20 -0
- package/runtime/templates/reports/final-report.template.md +14 -0
- package/runtime/templates/reports/i18n/en.json +23 -12
- package/runtime/templates/reports/i18n/ko.json +23 -12
- package/runtime/templates/reports/report.css +55 -0
- package/runtime/templates/reports/report.js +53 -1
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +0 -41
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +0 -112
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +0 -199
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +0 -146
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +0 -59
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +0 -78
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +0 -303
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +0 -8
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +0 -94
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +0 -31
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +0 -306
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +0 -1014
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +0 -68
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +0 -81
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +0 -143
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +0 -174
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +0 -87
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +0 -125
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +0 -192
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +0 -84
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +0 -33
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +0 -240
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +0 -334
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +0 -407
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +0 -218
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +0 -327
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +0 -409
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +0 -35
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +0 -80
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +0 -923
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +0 -354
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +0 -259
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +0 -43
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +0 -144
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +0 -73
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +0 -186
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +0 -277
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +0 -345
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +0 -344
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +0 -87
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +0 -140
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +0 -82
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +0 -110
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +0 -302
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +0 -64
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +0 -863
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +0 -157
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +0 -106
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +0 -91
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +0 -241
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +0 -152
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +0 -340
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +0 -139
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +0 -70
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +0 -248
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +0 -55
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +0 -193
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +0 -96
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +0 -421
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +0 -309
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +0 -249
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +0 -502
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +0 -488
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +0 -323
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +0 -280
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +0 -102
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +0 -128
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +0 -573
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +0 -155
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +0 -475
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +0 -481
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +0 -719
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +0 -103
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +0 -490
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +0 -64
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +0 -212
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +0 -202
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +0 -1655
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +0 -3118
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +0 -213
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +0 -544
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +0 -328
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +0 -451
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +0 -491
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +0 -55
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +0 -254
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +0 -212
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +0 -511
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +0 -983
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +0 -23
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +0 -154
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +0 -144
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +0 -109
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +0 -136
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +0 -129
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +0 -300
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +0 -678
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +0 -80
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +0 -266
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +0 -171
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +0 -984
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +0 -340
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +0 -835
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +0 -831
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +0 -85
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +0 -299
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +0 -115
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +0 -58
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +0 -314
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +0 -872
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +0 -163
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +0 -46
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +0 -24
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +0 -615
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +0 -459
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +0 -556
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +0 -179
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +0 -62
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +0 -15
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +0 -140
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +0 -60
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +0 -27
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +0 -274
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +0 -556
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +0 -37
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +0 -1158
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +0 -803
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +0 -8
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +0 -191
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +0 -642
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +0 -179
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +0 -270
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +0 -431
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +0 -161
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +0 -248
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +0 -41
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +0 -103
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +0 -54
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +0 -157
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +0 -25
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +0 -203
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +0 -307
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +0 -147
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +0 -131
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +0 -624
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +0 -114
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +0 -79
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +0 -99
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +0 -934
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +0 -53
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +0 -174
- package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +0 -192
- package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +0 -476
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +0 -362
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +0 -331
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +0 -110
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +0 -177
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +0 -1045
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +0 -950
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +0 -12
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +0 -349
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +0 -459
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +0 -528
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +0 -1421
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +0 -131
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +0 -371
- package/runtime/python/okstra_vendor/networkx/conftest.py +0 -261
- package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +0 -237
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +0 -229
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +0 -285
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +0 -631
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +0 -146
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +0 -1582
- package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +0 -75
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +0 -642
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +0 -20
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +0 -362
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +0 -224
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +0 -189
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +0 -103
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +0 -39
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +0 -182
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +0 -488
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +0 -133
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +0 -221
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +0 -28
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +0 -144
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +0 -125
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +0 -264
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +0 -316
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +0 -30
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +0 -82
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +0 -33
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +0 -495
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +0 -220
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +0 -49
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +0 -72
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +0 -92
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +0 -64
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +0 -195
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +0 -15
- package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +0 -400
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +0 -108
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +0 -40
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +0 -275
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +0 -334
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +0 -86
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +0 -70
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +0 -78
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +0 -78
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +0 -109
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +0 -48
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +0 -354
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +0 -318
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +0 -612
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +0 -744
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +0 -181
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +0 -1531
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +0 -30
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +0 -63
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +0 -128
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +0 -166
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +0 -1742
- package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +0 -248
- package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +0 -321
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +0 -531
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +0 -349
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +0 -281
- package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +0 -40
- package/runtime/python/okstra_vendor/networkx/tests/test_import.py +0 -11
- package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +0 -96
- package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +0 -349
- package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +0 -8
- package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +0 -11
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +0 -225
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +0 -263
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +0 -510
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +0 -131
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +0 -268
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +0 -393
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +0 -53
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +0 -63
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +0 -55
package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py
DELETED
|
@@ -1,488 +0,0 @@
|
|
|
1
|
-
import itertools as it
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
from networkx.algorithms.connectivity import EdgeComponentAuxGraph, bridge_components
|
|
7
|
-
from networkx.algorithms.connectivity.edge_kcomponents import general_k_edge_subgraphs
|
|
8
|
-
from networkx.utils import pairwise
|
|
9
|
-
|
|
10
|
-
# ----------------
|
|
11
|
-
# Helper functions
|
|
12
|
-
# ----------------
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
def fset(list_of_sets):
|
|
16
|
-
"""allows == to be used for list of sets"""
|
|
17
|
-
return set(map(frozenset, list_of_sets))
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def _assert_subgraph_edge_connectivity(G, ccs_subgraph, k):
|
|
21
|
-
"""
|
|
22
|
-
tests properties of k-edge-connected subgraphs
|
|
23
|
-
|
|
24
|
-
the actual edge connectivity should be no less than k unless the cc is a
|
|
25
|
-
single node.
|
|
26
|
-
"""
|
|
27
|
-
for cc in ccs_subgraph:
|
|
28
|
-
C = G.subgraph(cc)
|
|
29
|
-
if len(cc) > 1:
|
|
30
|
-
connectivity = nx.edge_connectivity(C)
|
|
31
|
-
assert connectivity >= k
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def _memo_connectivity(G, u, v, memo):
|
|
35
|
-
edge = (u, v)
|
|
36
|
-
if edge in memo:
|
|
37
|
-
return memo[edge]
|
|
38
|
-
if not G.is_directed():
|
|
39
|
-
redge = (v, u)
|
|
40
|
-
if redge in memo:
|
|
41
|
-
return memo[redge]
|
|
42
|
-
memo[edge] = nx.edge_connectivity(G, *edge)
|
|
43
|
-
return memo[edge]
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def _all_pairs_connectivity(G, cc, k, memo):
|
|
47
|
-
# Brute force check
|
|
48
|
-
for u, v in it.combinations(cc, 2):
|
|
49
|
-
# Use a memoization dict to save on computation
|
|
50
|
-
connectivity = _memo_connectivity(G, u, v, memo)
|
|
51
|
-
if G.is_directed():
|
|
52
|
-
connectivity = min(connectivity, _memo_connectivity(G, v, u, memo))
|
|
53
|
-
assert connectivity >= k
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def _assert_local_cc_edge_connectivity(G, ccs_local, k, memo):
|
|
57
|
-
"""
|
|
58
|
-
tests properties of k-edge-connected components
|
|
59
|
-
|
|
60
|
-
the local edge connectivity between each pair of nodes in the original
|
|
61
|
-
graph should be no less than k unless the cc is a single node.
|
|
62
|
-
"""
|
|
63
|
-
for cc in ccs_local:
|
|
64
|
-
if len(cc) > 1:
|
|
65
|
-
# Strategy for testing a bit faster: If the subgraph has high edge
|
|
66
|
-
# connectivity then it must have local connectivity
|
|
67
|
-
C = G.subgraph(cc)
|
|
68
|
-
connectivity = nx.edge_connectivity(C)
|
|
69
|
-
if connectivity < k:
|
|
70
|
-
# Otherwise do the brute force (with memoization) check
|
|
71
|
-
_all_pairs_connectivity(G, cc, k, memo)
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
# Helper function
|
|
75
|
-
def _check_edge_connectivity(G):
|
|
76
|
-
"""
|
|
77
|
-
Helper - generates all k-edge-components using the aux graph. Checks the
|
|
78
|
-
both local and subgraph edge connectivity of each cc. Also checks that
|
|
79
|
-
alternate methods of computing the k-edge-ccs generate the same result.
|
|
80
|
-
"""
|
|
81
|
-
# Construct the auxiliary graph that can be used to make each k-cc or k-sub
|
|
82
|
-
aux_graph = EdgeComponentAuxGraph.construct(G)
|
|
83
|
-
|
|
84
|
-
# memoize the local connectivity in this graph
|
|
85
|
-
memo = {}
|
|
86
|
-
|
|
87
|
-
for k in it.count(1):
|
|
88
|
-
# Test "local" k-edge-components and k-edge-subgraphs
|
|
89
|
-
ccs_local = fset(aux_graph.k_edge_components(k))
|
|
90
|
-
ccs_subgraph = fset(aux_graph.k_edge_subgraphs(k))
|
|
91
|
-
|
|
92
|
-
# Check connectivity properties that should be guaranteed by the
|
|
93
|
-
# algorithms.
|
|
94
|
-
_assert_local_cc_edge_connectivity(G, ccs_local, k, memo)
|
|
95
|
-
_assert_subgraph_edge_connectivity(G, ccs_subgraph, k)
|
|
96
|
-
|
|
97
|
-
if k == 1 or k == 2 and not G.is_directed():
|
|
98
|
-
assert ccs_local == ccs_subgraph, (
|
|
99
|
-
"Subgraphs and components should be the same when k == 1 or (k == 2 and not G.directed())"
|
|
100
|
-
)
|
|
101
|
-
|
|
102
|
-
if G.is_directed():
|
|
103
|
-
# Test special case methods are the same as the aux graph
|
|
104
|
-
if k == 1:
|
|
105
|
-
alt_sccs = fset(nx.strongly_connected_components(G))
|
|
106
|
-
assert alt_sccs == ccs_local, "k=1 failed alt"
|
|
107
|
-
assert alt_sccs == ccs_subgraph, "k=1 failed alt"
|
|
108
|
-
else:
|
|
109
|
-
# Test special case methods are the same as the aux graph
|
|
110
|
-
if k == 1:
|
|
111
|
-
alt_ccs = fset(nx.connected_components(G))
|
|
112
|
-
assert alt_ccs == ccs_local, "k=1 failed alt"
|
|
113
|
-
assert alt_ccs == ccs_subgraph, "k=1 failed alt"
|
|
114
|
-
elif k == 2:
|
|
115
|
-
alt_bridge_ccs = fset(bridge_components(G))
|
|
116
|
-
assert alt_bridge_ccs == ccs_local, "k=2 failed alt"
|
|
117
|
-
assert alt_bridge_ccs == ccs_subgraph, "k=2 failed alt"
|
|
118
|
-
# if new methods for k == 3 or k == 4 are implemented add them here
|
|
119
|
-
|
|
120
|
-
# Check the general subgraph method works by itself
|
|
121
|
-
alt_subgraph_ccs = fset(
|
|
122
|
-
[set(C.nodes()) for C in general_k_edge_subgraphs(G, k=k)]
|
|
123
|
-
)
|
|
124
|
-
assert alt_subgraph_ccs == ccs_subgraph, "alt subgraph method failed"
|
|
125
|
-
|
|
126
|
-
# Stop once k is larger than all special case methods
|
|
127
|
-
# and we cannot break down ccs any further.
|
|
128
|
-
if k > 2 and all(len(cc) == 1 for cc in ccs_local):
|
|
129
|
-
break
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
# ----------------
|
|
133
|
-
# Misc tests
|
|
134
|
-
# ----------------
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
def test_zero_k_exception():
|
|
138
|
-
G = nx.Graph()
|
|
139
|
-
# functions that return generators error immediately
|
|
140
|
-
pytest.raises(ValueError, nx.k_edge_components, G, k=0)
|
|
141
|
-
pytest.raises(ValueError, nx.k_edge_subgraphs, G, k=0)
|
|
142
|
-
|
|
143
|
-
# actual generators only error when you get the first item
|
|
144
|
-
aux_graph = EdgeComponentAuxGraph.construct(G)
|
|
145
|
-
pytest.raises(ValueError, list, aux_graph.k_edge_components(k=0))
|
|
146
|
-
pytest.raises(ValueError, list, aux_graph.k_edge_subgraphs(k=0))
|
|
147
|
-
|
|
148
|
-
pytest.raises(ValueError, list, general_k_edge_subgraphs(G, k=0))
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def test_empty_input():
|
|
152
|
-
G = nx.Graph()
|
|
153
|
-
assert [] == list(nx.k_edge_components(G, k=5))
|
|
154
|
-
assert [] == list(nx.k_edge_subgraphs(G, k=5))
|
|
155
|
-
|
|
156
|
-
G = nx.DiGraph()
|
|
157
|
-
assert [] == list(nx.k_edge_components(G, k=5))
|
|
158
|
-
assert [] == list(nx.k_edge_subgraphs(G, k=5))
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def test_not_implemented():
|
|
162
|
-
G = nx.MultiGraph()
|
|
163
|
-
pytest.raises(nx.NetworkXNotImplemented, EdgeComponentAuxGraph.construct, G)
|
|
164
|
-
pytest.raises(nx.NetworkXNotImplemented, nx.k_edge_components, G, k=2)
|
|
165
|
-
pytest.raises(nx.NetworkXNotImplemented, nx.k_edge_subgraphs, G, k=2)
|
|
166
|
-
with pytest.raises(nx.NetworkXNotImplemented):
|
|
167
|
-
next(bridge_components(G))
|
|
168
|
-
with pytest.raises(nx.NetworkXNotImplemented):
|
|
169
|
-
next(bridge_components(nx.DiGraph()))
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
def test_general_k_edge_subgraph_quick_return():
|
|
173
|
-
# tests quick return optimization
|
|
174
|
-
G = nx.Graph()
|
|
175
|
-
G.add_node(0)
|
|
176
|
-
subgraphs = list(general_k_edge_subgraphs(G, k=1))
|
|
177
|
-
assert len(subgraphs) == 1
|
|
178
|
-
for subgraph in subgraphs:
|
|
179
|
-
assert subgraph.number_of_nodes() == 1
|
|
180
|
-
|
|
181
|
-
G.add_node(1)
|
|
182
|
-
subgraphs = list(general_k_edge_subgraphs(G, k=1))
|
|
183
|
-
assert len(subgraphs) == 2
|
|
184
|
-
for subgraph in subgraphs:
|
|
185
|
-
assert subgraph.number_of_nodes() == 1
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
# ----------------
|
|
189
|
-
# Undirected tests
|
|
190
|
-
# ----------------
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
def test_random_gnp():
|
|
194
|
-
# seeds = [1550709854, 1309423156, 4208992358, 2785630813, 1915069929]
|
|
195
|
-
seeds = [12, 13]
|
|
196
|
-
|
|
197
|
-
for seed in seeds:
|
|
198
|
-
G = nx.gnp_random_graph(20, 0.2, seed=seed)
|
|
199
|
-
_check_edge_connectivity(G)
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
def test_configuration():
|
|
203
|
-
# seeds = [2718183590, 2470619828, 1694705158, 3001036531, 2401251497]
|
|
204
|
-
seeds = [14, 15]
|
|
205
|
-
for seed in seeds:
|
|
206
|
-
deg_seq = nx.random_powerlaw_tree_sequence(20, seed=seed, tries=5000)
|
|
207
|
-
G = nx.Graph(nx.configuration_model(deg_seq, seed=seed))
|
|
208
|
-
G.remove_edges_from(nx.selfloop_edges(G))
|
|
209
|
-
_check_edge_connectivity(G)
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
def test_shell():
|
|
213
|
-
# seeds = [2057382236, 3331169846, 1840105863, 476020778, 2247498425]
|
|
214
|
-
seeds = [20]
|
|
215
|
-
for seed in seeds:
|
|
216
|
-
constructor = [(12, 70, 0.8), (15, 40, 0.6)]
|
|
217
|
-
G = nx.random_shell_graph(constructor, seed=seed)
|
|
218
|
-
_check_edge_connectivity(G)
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def test_karate():
|
|
222
|
-
G = nx.karate_club_graph()
|
|
223
|
-
_check_edge_connectivity(G)
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
def test_tarjan_bridge():
|
|
227
|
-
# graph from tarjan paper
|
|
228
|
-
# RE Tarjan - "A note on finding the bridges of a graph"
|
|
229
|
-
# Information Processing Letters, 1974 - Elsevier
|
|
230
|
-
# doi:10.1016/0020-0190(74)90003-9.
|
|
231
|
-
# define 2-connected components and bridges
|
|
232
|
-
ccs = [
|
|
233
|
-
(1, 2, 4, 3, 1, 4),
|
|
234
|
-
(5, 6, 7, 5),
|
|
235
|
-
(8, 9, 10, 8),
|
|
236
|
-
(17, 18, 16, 15, 17),
|
|
237
|
-
(11, 12, 14, 13, 11, 14),
|
|
238
|
-
]
|
|
239
|
-
bridges = [(4, 8), (3, 5), (3, 17)]
|
|
240
|
-
G = nx.Graph(it.chain(*(pairwise(path) for path in ccs + bridges)))
|
|
241
|
-
_check_edge_connectivity(G)
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
def test_bridge_cc():
|
|
245
|
-
# define 2-connected components and bridges
|
|
246
|
-
cc2 = [(1, 2, 4, 3, 1, 4), (8, 9, 10, 8), (11, 12, 13, 11)]
|
|
247
|
-
bridges = [(4, 8), (3, 5), (20, 21), (22, 23, 24)]
|
|
248
|
-
G = nx.Graph(it.chain(*(pairwise(path) for path in cc2 + bridges)))
|
|
249
|
-
bridge_ccs = fset(bridge_components(G))
|
|
250
|
-
target_ccs = fset(
|
|
251
|
-
[{1, 2, 3, 4}, {5}, {8, 9, 10}, {11, 12, 13}, {20}, {21}, {22}, {23}, {24}]
|
|
252
|
-
)
|
|
253
|
-
assert bridge_ccs == target_ccs
|
|
254
|
-
_check_edge_connectivity(G)
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
def test_undirected_aux_graph():
|
|
258
|
-
# Graph similar to the one in
|
|
259
|
-
# http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0136264
|
|
260
|
-
a, b, c, d, e, f, g, h, i = "abcdefghi"
|
|
261
|
-
paths = [
|
|
262
|
-
(a, d, b, f, c),
|
|
263
|
-
(a, e, b),
|
|
264
|
-
(a, e, b, c, g, b, a),
|
|
265
|
-
(c, b),
|
|
266
|
-
(f, g, f),
|
|
267
|
-
(h, i),
|
|
268
|
-
]
|
|
269
|
-
G = nx.Graph(it.chain(*[pairwise(path) for path in paths]))
|
|
270
|
-
aux_graph = EdgeComponentAuxGraph.construct(G)
|
|
271
|
-
|
|
272
|
-
components_1 = fset(aux_graph.k_edge_subgraphs(k=1))
|
|
273
|
-
target_1 = fset([{a, b, c, d, e, f, g}, {h, i}])
|
|
274
|
-
assert target_1 == components_1
|
|
275
|
-
|
|
276
|
-
# Check that the undirected case for k=1 agrees with CCs
|
|
277
|
-
alt_1 = fset(nx.k_edge_subgraphs(G, k=1))
|
|
278
|
-
assert alt_1 == components_1
|
|
279
|
-
|
|
280
|
-
components_2 = fset(aux_graph.k_edge_subgraphs(k=2))
|
|
281
|
-
target_2 = fset([{a, b, c, d, e, f, g}, {h}, {i}])
|
|
282
|
-
assert target_2 == components_2
|
|
283
|
-
|
|
284
|
-
# Check that the undirected case for k=2 agrees with bridge components
|
|
285
|
-
alt_2 = fset(nx.k_edge_subgraphs(G, k=2))
|
|
286
|
-
assert alt_2 == components_2
|
|
287
|
-
|
|
288
|
-
components_3 = fset(aux_graph.k_edge_subgraphs(k=3))
|
|
289
|
-
target_3 = fset([{a}, {b, c, f, g}, {d}, {e}, {h}, {i}])
|
|
290
|
-
assert target_3 == components_3
|
|
291
|
-
|
|
292
|
-
components_4 = fset(aux_graph.k_edge_subgraphs(k=4))
|
|
293
|
-
target_4 = fset([{a}, {b}, {c}, {d}, {e}, {f}, {g}, {h}, {i}])
|
|
294
|
-
assert target_4 == components_4
|
|
295
|
-
|
|
296
|
-
_check_edge_connectivity(G)
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
def test_local_subgraph_difference():
|
|
300
|
-
paths = [
|
|
301
|
-
(11, 12, 13, 14, 11, 13, 14, 12), # first 4-clique
|
|
302
|
-
(21, 22, 23, 24, 21, 23, 24, 22), # second 4-clique
|
|
303
|
-
# paths connecting each node of the 4 cliques
|
|
304
|
-
(11, 101, 21),
|
|
305
|
-
(12, 102, 22),
|
|
306
|
-
(13, 103, 23),
|
|
307
|
-
(14, 104, 24),
|
|
308
|
-
]
|
|
309
|
-
G = nx.Graph(it.chain(*[pairwise(path) for path in paths]))
|
|
310
|
-
aux_graph = EdgeComponentAuxGraph.construct(G)
|
|
311
|
-
|
|
312
|
-
# Each clique is returned separately in k-edge-subgraphs
|
|
313
|
-
subgraph_ccs = fset(aux_graph.k_edge_subgraphs(3))
|
|
314
|
-
subgraph_target = fset(
|
|
315
|
-
[{101}, {102}, {103}, {104}, {21, 22, 23, 24}, {11, 12, 13, 14}]
|
|
316
|
-
)
|
|
317
|
-
assert subgraph_ccs == subgraph_target
|
|
318
|
-
|
|
319
|
-
# But in k-edge-ccs they are returned together
|
|
320
|
-
# because they are locally 3-edge-connected
|
|
321
|
-
local_ccs = fset(aux_graph.k_edge_components(3))
|
|
322
|
-
local_target = fset([{101}, {102}, {103}, {104}, {11, 12, 13, 14, 21, 22, 23, 24}])
|
|
323
|
-
assert local_ccs == local_target
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
def test_local_subgraph_difference_directed():
|
|
327
|
-
dipaths = [(1, 2, 3, 4, 1), (1, 3, 1)]
|
|
328
|
-
G = nx.DiGraph(it.chain(*[pairwise(path) for path in dipaths]))
|
|
329
|
-
|
|
330
|
-
assert fset(nx.k_edge_components(G, k=1)) == fset(nx.k_edge_subgraphs(G, k=1))
|
|
331
|
-
|
|
332
|
-
# Unlike undirected graphs, when k=2, for directed graphs there is a case
|
|
333
|
-
# where the k-edge-ccs are not the same as the k-edge-subgraphs.
|
|
334
|
-
# (in directed graphs ccs and subgraphs are the same when k=2)
|
|
335
|
-
assert fset(nx.k_edge_components(G, k=2)) != fset(nx.k_edge_subgraphs(G, k=2))
|
|
336
|
-
|
|
337
|
-
assert fset(nx.k_edge_components(G, k=3)) == fset(nx.k_edge_subgraphs(G, k=3))
|
|
338
|
-
|
|
339
|
-
_check_edge_connectivity(G)
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
def test_triangles():
|
|
343
|
-
paths = [
|
|
344
|
-
(11, 12, 13, 11), # first 3-clique
|
|
345
|
-
(21, 22, 23, 21), # second 3-clique
|
|
346
|
-
(11, 21), # connected by an edge
|
|
347
|
-
]
|
|
348
|
-
G = nx.Graph(it.chain(*[pairwise(path) for path in paths]))
|
|
349
|
-
|
|
350
|
-
# subgraph and ccs are the same in all cases here
|
|
351
|
-
assert fset(nx.k_edge_components(G, k=1)) == fset(nx.k_edge_subgraphs(G, k=1))
|
|
352
|
-
|
|
353
|
-
assert fset(nx.k_edge_components(G, k=2)) == fset(nx.k_edge_subgraphs(G, k=2))
|
|
354
|
-
|
|
355
|
-
assert fset(nx.k_edge_components(G, k=3)) == fset(nx.k_edge_subgraphs(G, k=3))
|
|
356
|
-
|
|
357
|
-
_check_edge_connectivity(G)
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
def test_four_clique():
|
|
361
|
-
paths = [
|
|
362
|
-
(11, 12, 13, 14, 11, 13, 14, 12), # first 4-clique
|
|
363
|
-
(21, 22, 23, 24, 21, 23, 24, 22), # second 4-clique
|
|
364
|
-
# paths connecting the 4 cliques such that they are
|
|
365
|
-
# 3-connected in G, but not in the subgraph.
|
|
366
|
-
# Case where the nodes bridging them do not have degree less than 3.
|
|
367
|
-
(100, 13),
|
|
368
|
-
(12, 100, 22),
|
|
369
|
-
(13, 200, 23),
|
|
370
|
-
(14, 300, 24),
|
|
371
|
-
]
|
|
372
|
-
G = nx.Graph(it.chain(*[pairwise(path) for path in paths]))
|
|
373
|
-
|
|
374
|
-
# The subgraphs and ccs are different for k=3
|
|
375
|
-
local_ccs = fset(nx.k_edge_components(G, k=3))
|
|
376
|
-
subgraphs = fset(nx.k_edge_subgraphs(G, k=3))
|
|
377
|
-
assert local_ccs != subgraphs
|
|
378
|
-
|
|
379
|
-
# The cliques ares in the same cc
|
|
380
|
-
clique1 = frozenset(paths[0])
|
|
381
|
-
clique2 = frozenset(paths[1])
|
|
382
|
-
assert clique1.union(clique2).union({100}) in local_ccs
|
|
383
|
-
|
|
384
|
-
# but different subgraphs
|
|
385
|
-
assert clique1 in subgraphs
|
|
386
|
-
assert clique2 in subgraphs
|
|
387
|
-
|
|
388
|
-
assert G.degree(100) == 3
|
|
389
|
-
|
|
390
|
-
_check_edge_connectivity(G)
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
def test_five_clique():
|
|
394
|
-
# Make a graph that can be disconnected less than 4 edges, but no node has
|
|
395
|
-
# degree less than 4.
|
|
396
|
-
G = nx.disjoint_union(nx.complete_graph(5), nx.complete_graph(5))
|
|
397
|
-
paths = [
|
|
398
|
-
# add aux-connections
|
|
399
|
-
(1, 100, 6),
|
|
400
|
-
(2, 100, 7),
|
|
401
|
-
(3, 200, 8),
|
|
402
|
-
(4, 200, 100),
|
|
403
|
-
]
|
|
404
|
-
G.add_edges_from(it.chain(*[pairwise(path) for path in paths]))
|
|
405
|
-
assert min(dict(nx.degree(G)).values()) == 4
|
|
406
|
-
|
|
407
|
-
# For k=3 they are the same
|
|
408
|
-
assert fset(nx.k_edge_components(G, k=3)) == fset(nx.k_edge_subgraphs(G, k=3))
|
|
409
|
-
|
|
410
|
-
# For k=4 they are the different
|
|
411
|
-
# the aux nodes are in the same CC as clique 1 but no the same subgraph
|
|
412
|
-
assert fset(nx.k_edge_components(G, k=4)) != fset(nx.k_edge_subgraphs(G, k=4))
|
|
413
|
-
|
|
414
|
-
# For k=5 they are not the same
|
|
415
|
-
assert fset(nx.k_edge_components(G, k=5)) != fset(nx.k_edge_subgraphs(G, k=5))
|
|
416
|
-
|
|
417
|
-
# For k=6 they are the same
|
|
418
|
-
assert fset(nx.k_edge_components(G, k=6)) == fset(nx.k_edge_subgraphs(G, k=6))
|
|
419
|
-
_check_edge_connectivity(G)
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
# ----------------
|
|
423
|
-
# Undirected tests
|
|
424
|
-
# ----------------
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
def test_directed_aux_graph():
|
|
428
|
-
# Graph similar to the one in
|
|
429
|
-
# http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0136264
|
|
430
|
-
a, b, c, d, e, f, g, h, i = "abcdefghi"
|
|
431
|
-
dipaths = [
|
|
432
|
-
(a, d, b, f, c),
|
|
433
|
-
(a, e, b),
|
|
434
|
-
(a, e, b, c, g, b, a),
|
|
435
|
-
(c, b),
|
|
436
|
-
(f, g, f),
|
|
437
|
-
(h, i),
|
|
438
|
-
]
|
|
439
|
-
G = nx.DiGraph(it.chain(*[pairwise(path) for path in dipaths]))
|
|
440
|
-
aux_graph = EdgeComponentAuxGraph.construct(G)
|
|
441
|
-
|
|
442
|
-
components_1 = fset(aux_graph.k_edge_subgraphs(k=1))
|
|
443
|
-
target_1 = fset([{a, b, c, d, e, f, g}, {h}, {i}])
|
|
444
|
-
assert target_1 == components_1
|
|
445
|
-
|
|
446
|
-
# Check that the directed case for k=1 agrees with SCCs
|
|
447
|
-
alt_1 = fset(nx.strongly_connected_components(G))
|
|
448
|
-
assert alt_1 == components_1
|
|
449
|
-
|
|
450
|
-
components_2 = fset(aux_graph.k_edge_subgraphs(k=2))
|
|
451
|
-
target_2 = fset([{i}, {e}, {d}, {b, c, f, g}, {h}, {a}])
|
|
452
|
-
assert target_2 == components_2
|
|
453
|
-
|
|
454
|
-
components_3 = fset(aux_graph.k_edge_subgraphs(k=3))
|
|
455
|
-
target_3 = fset([{a}, {b}, {c}, {d}, {e}, {f}, {g}, {h}, {i}])
|
|
456
|
-
assert target_3 == components_3
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
def test_random_gnp_directed():
|
|
460
|
-
# seeds = [3894723670, 500186844, 267231174, 2181982262, 1116750056]
|
|
461
|
-
seeds = [21]
|
|
462
|
-
for seed in seeds:
|
|
463
|
-
G = nx.gnp_random_graph(20, 0.2, directed=True, seed=seed)
|
|
464
|
-
_check_edge_connectivity(G)
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
def test_configuration_directed():
|
|
468
|
-
# seeds = [671221681, 2403749451, 124433910, 672335939, 1193127215]
|
|
469
|
-
seeds = [67]
|
|
470
|
-
for seed in seeds:
|
|
471
|
-
deg_seq = nx.random_powerlaw_tree_sequence(20, seed=seed, tries=5000)
|
|
472
|
-
G = nx.DiGraph(nx.configuration_model(deg_seq, seed=seed))
|
|
473
|
-
G.remove_edges_from(nx.selfloop_edges(G))
|
|
474
|
-
_check_edge_connectivity(G)
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
def test_shell_directed():
|
|
478
|
-
# seeds = [3134027055, 4079264063, 1350769518, 1405643020, 530038094]
|
|
479
|
-
seeds = [31]
|
|
480
|
-
for seed in seeds:
|
|
481
|
-
constructor = [(12, 70, 0.8), (15, 40, 0.6)]
|
|
482
|
-
G = nx.random_shell_graph(constructor, seed=seed).to_directed()
|
|
483
|
-
_check_edge_connectivity(G)
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
def test_karate_directed():
|
|
487
|
-
G = nx.karate_club_graph().to_directed()
|
|
488
|
-
_check_edge_connectivity(G)
|