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
|
@@ -1,221 +0,0 @@
|
|
|
1
|
-
from pytest import approx
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
from networkx import is_connected, neighbors
|
|
5
|
-
from networkx.generators.internet_as_graphs import (
|
|
6
|
-
AS_graph_generator,
|
|
7
|
-
choose_pref_attach,
|
|
8
|
-
random_internet_as_graph,
|
|
9
|
-
)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TestInternetASTopology:
|
|
13
|
-
@classmethod
|
|
14
|
-
def setup_class(cls):
|
|
15
|
-
cls.n = 1000
|
|
16
|
-
cls.seed = 42
|
|
17
|
-
cls.G = random_internet_as_graph(cls.n, cls.seed)
|
|
18
|
-
cls.T = []
|
|
19
|
-
cls.M = []
|
|
20
|
-
cls.C = []
|
|
21
|
-
cls.CP = []
|
|
22
|
-
cls.customers = {}
|
|
23
|
-
cls.providers = {}
|
|
24
|
-
|
|
25
|
-
for i in cls.G.nodes():
|
|
26
|
-
if cls.G.nodes[i]["type"] == "T":
|
|
27
|
-
cls.T.append(i)
|
|
28
|
-
elif cls.G.nodes[i]["type"] == "M":
|
|
29
|
-
cls.M.append(i)
|
|
30
|
-
elif cls.G.nodes[i]["type"] == "C":
|
|
31
|
-
cls.C.append(i)
|
|
32
|
-
elif cls.G.nodes[i]["type"] == "CP":
|
|
33
|
-
cls.CP.append(i)
|
|
34
|
-
else:
|
|
35
|
-
raise ValueError("Inconsistent data in the graph node attributes")
|
|
36
|
-
cls.set_customers(i)
|
|
37
|
-
cls.set_providers(i)
|
|
38
|
-
|
|
39
|
-
@classmethod
|
|
40
|
-
def set_customers(cls, i):
|
|
41
|
-
if i not in cls.customers:
|
|
42
|
-
cls.customers[i] = set()
|
|
43
|
-
for j in neighbors(cls.G, i):
|
|
44
|
-
e = cls.G.edges[(i, j)]
|
|
45
|
-
if e["type"] == "transit":
|
|
46
|
-
customer = int(e["customer"])
|
|
47
|
-
if j == customer:
|
|
48
|
-
cls.set_customers(j)
|
|
49
|
-
cls.customers[i] = cls.customers[i].union(cls.customers[j])
|
|
50
|
-
cls.customers[i].add(j)
|
|
51
|
-
elif i != customer:
|
|
52
|
-
raise ValueError(
|
|
53
|
-
"Inconsistent data in the graph edge attributes"
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
@classmethod
|
|
57
|
-
def set_providers(cls, i):
|
|
58
|
-
if i not in cls.providers:
|
|
59
|
-
cls.providers[i] = set()
|
|
60
|
-
for j in neighbors(cls.G, i):
|
|
61
|
-
e = cls.G.edges[(i, j)]
|
|
62
|
-
if e["type"] == "transit":
|
|
63
|
-
customer = int(e["customer"])
|
|
64
|
-
if i == customer:
|
|
65
|
-
cls.set_providers(j)
|
|
66
|
-
cls.providers[i] = cls.providers[i].union(cls.providers[j])
|
|
67
|
-
cls.providers[i].add(j)
|
|
68
|
-
elif j != customer:
|
|
69
|
-
raise ValueError(
|
|
70
|
-
"Inconsistent data in the graph edge attributes"
|
|
71
|
-
)
|
|
72
|
-
|
|
73
|
-
def test_wrong_input(self):
|
|
74
|
-
G = random_internet_as_graph(0)
|
|
75
|
-
assert len(G.nodes()) == 0
|
|
76
|
-
|
|
77
|
-
G = random_internet_as_graph(-1)
|
|
78
|
-
assert len(G.nodes()) == 0
|
|
79
|
-
|
|
80
|
-
G = random_internet_as_graph(1)
|
|
81
|
-
assert len(G.nodes()) == 1
|
|
82
|
-
|
|
83
|
-
def test_node_numbers(self):
|
|
84
|
-
assert len(self.G.nodes()) == self.n
|
|
85
|
-
assert len(self.T) < 7
|
|
86
|
-
assert len(self.M) == round(self.n * 0.15)
|
|
87
|
-
assert len(self.CP) == round(self.n * 0.05)
|
|
88
|
-
numb = self.n - len(self.T) - len(self.M) - len(self.CP)
|
|
89
|
-
assert len(self.C) == numb
|
|
90
|
-
|
|
91
|
-
def test_connectivity(self):
|
|
92
|
-
assert is_connected(self.G)
|
|
93
|
-
|
|
94
|
-
def test_relationships(self):
|
|
95
|
-
# T nodes are not customers of anyone
|
|
96
|
-
for i in self.T:
|
|
97
|
-
assert len(self.providers[i]) == 0
|
|
98
|
-
|
|
99
|
-
# C nodes are not providers of anyone
|
|
100
|
-
for i in self.C:
|
|
101
|
-
assert len(self.customers[i]) == 0
|
|
102
|
-
|
|
103
|
-
# CP nodes are not providers of anyone
|
|
104
|
-
for i in self.CP:
|
|
105
|
-
assert len(self.customers[i]) == 0
|
|
106
|
-
|
|
107
|
-
# test whether there is a customer-provider loop
|
|
108
|
-
for i in self.G.nodes():
|
|
109
|
-
assert len(self.customers[i].intersection(self.providers[i])) == 0
|
|
110
|
-
|
|
111
|
-
# test whether there is a peering with a customer or provider
|
|
112
|
-
for i, j in self.G.edges():
|
|
113
|
-
if self.G.edges[(i, j)]["type"] == "peer":
|
|
114
|
-
assert j not in self.customers[i]
|
|
115
|
-
assert i not in self.customers[j]
|
|
116
|
-
assert j not in self.providers[i]
|
|
117
|
-
assert i not in self.providers[j]
|
|
118
|
-
|
|
119
|
-
def test_degree_values(self):
|
|
120
|
-
d_m = 0 # multihoming degree for M nodes
|
|
121
|
-
d_cp = 0 # multihoming degree for CP nodes
|
|
122
|
-
d_c = 0 # multihoming degree for C nodes
|
|
123
|
-
p_m_m = 0 # avg number of peering edges between M and M
|
|
124
|
-
p_cp_m = 0 # avg number of peering edges between CP and M
|
|
125
|
-
p_cp_cp = 0 # avg number of peering edges between CP and CP
|
|
126
|
-
t_m = 0 # probability M's provider is T
|
|
127
|
-
t_cp = 0 # probability CP's provider is T
|
|
128
|
-
t_c = 0 # probability C's provider is T
|
|
129
|
-
|
|
130
|
-
for i, j in self.G.edges():
|
|
131
|
-
e = self.G.edges[(i, j)]
|
|
132
|
-
if e["type"] == "transit":
|
|
133
|
-
cust = int(e["customer"])
|
|
134
|
-
if i == cust:
|
|
135
|
-
prov = j
|
|
136
|
-
elif j == cust:
|
|
137
|
-
prov = i
|
|
138
|
-
else:
|
|
139
|
-
raise ValueError("Inconsistent data in the graph edge attributes")
|
|
140
|
-
if cust in self.M:
|
|
141
|
-
d_m += 1
|
|
142
|
-
if self.G.nodes[prov]["type"] == "T":
|
|
143
|
-
t_m += 1
|
|
144
|
-
elif cust in self.C:
|
|
145
|
-
d_c += 1
|
|
146
|
-
if self.G.nodes[prov]["type"] == "T":
|
|
147
|
-
t_c += 1
|
|
148
|
-
elif cust in self.CP:
|
|
149
|
-
d_cp += 1
|
|
150
|
-
if self.G.nodes[prov]["type"] == "T":
|
|
151
|
-
t_cp += 1
|
|
152
|
-
else:
|
|
153
|
-
raise ValueError("Inconsistent data in the graph edge attributes")
|
|
154
|
-
elif e["type"] == "peer":
|
|
155
|
-
if self.G.nodes[i]["type"] == "M" and self.G.nodes[j]["type"] == "M":
|
|
156
|
-
p_m_m += 1
|
|
157
|
-
if self.G.nodes[i]["type"] == "CP" and self.G.nodes[j]["type"] == "CP":
|
|
158
|
-
p_cp_cp += 1
|
|
159
|
-
if (
|
|
160
|
-
self.G.nodes[i]["type"] == "M"
|
|
161
|
-
and self.G.nodes[j]["type"] == "CP"
|
|
162
|
-
or self.G.nodes[i]["type"] == "CP"
|
|
163
|
-
and self.G.nodes[j]["type"] == "M"
|
|
164
|
-
):
|
|
165
|
-
p_cp_m += 1
|
|
166
|
-
else:
|
|
167
|
-
raise ValueError("Unexpected data in the graph edge attributes")
|
|
168
|
-
|
|
169
|
-
assert d_m / len(self.M) == approx((2 + (2.5 * self.n) / 10000), abs=1e-0)
|
|
170
|
-
assert d_cp / len(self.CP) == approx((2 + (1.5 * self.n) / 10000), abs=1e-0)
|
|
171
|
-
assert d_c / len(self.C) == approx((1 + (5 * self.n) / 100000), abs=1e-0)
|
|
172
|
-
|
|
173
|
-
assert p_m_m / len(self.M) == approx((1 + (2 * self.n) / 10000), abs=1e-0)
|
|
174
|
-
assert p_cp_m / len(self.CP) == approx((0.2 + (2 * self.n) / 10000), abs=1e-0)
|
|
175
|
-
assert p_cp_cp / len(self.CP) == approx(
|
|
176
|
-
(0.05 + (2 * self.n) / 100000), abs=1e-0
|
|
177
|
-
)
|
|
178
|
-
|
|
179
|
-
assert t_m / d_m == approx(0.375, abs=1e-1)
|
|
180
|
-
assert t_cp / d_cp == approx(0.375, abs=1e-1)
|
|
181
|
-
assert t_c / d_c == approx(0.125, abs=1e-1)
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
def test_AS_graph_coverage():
|
|
185
|
-
"""Add test coverage for some hard-to-hit branches."""
|
|
186
|
-
GG = AS_graph_generator(20, seed=42)
|
|
187
|
-
G = GG.generate()
|
|
188
|
-
assert len(G) == 20
|
|
189
|
-
|
|
190
|
-
# Proportion of M nodes is 0.15, so there are 3 when n = 20.
|
|
191
|
-
assert len(GG.nodes["M"]) == 3
|
|
192
|
-
m_node = nx.utils.arbitrary_element(GG.nodes["M"])
|
|
193
|
-
# Proportion of CP nodes is 0.05, so there is 1 when n = 20.
|
|
194
|
-
assert len(GG.nodes["CP"]) == 1
|
|
195
|
-
cp_node = nx.utils.arbitrary_element(GG.nodes["CP"])
|
|
196
|
-
|
|
197
|
-
# All M nodes are already connected to each other.
|
|
198
|
-
assert all(u in G[v] for u in GG.nodes["M"] for v in GG.nodes["M"] if u != v)
|
|
199
|
-
|
|
200
|
-
# Add coverage for the unsuccessful branches when adding peering links.
|
|
201
|
-
# `add_m_peering_link` cannot add edges when the nodes are already connected.
|
|
202
|
-
assert not GG.add_m_peering_link(m_node, "M")
|
|
203
|
-
# Artificially add nodes to `customers` to check customer neighbors are
|
|
204
|
-
# correctly excluded.
|
|
205
|
-
GG.customers[m_node] = set(GG.nodes["M"])
|
|
206
|
-
assert not GG.add_m_peering_link(m_node, "M")
|
|
207
|
-
|
|
208
|
-
# Artificially remove nodes from `providers` to check neighbors are
|
|
209
|
-
# correctly excluded (otherwise they might already get disqualified).
|
|
210
|
-
GG.providers[cp_node] = set()
|
|
211
|
-
assert not GG.add_cp_peering_link(cp_node, "CP")
|
|
212
|
-
assert not GG.add_cp_peering_link(cp_node, "M")
|
|
213
|
-
|
|
214
|
-
# Add coverage for trying to add a new M node where one already exists.
|
|
215
|
-
GG.add_node(m_node, "M", 1, 2, 0.5)
|
|
216
|
-
assert len(GG.nodes["M"]) == 3
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
def test_choose_pref_attach():
|
|
220
|
-
"""Add test coverage for the empty `degs` branch in `choose_pref_attach`."""
|
|
221
|
-
assert choose_pref_attach([], seed=42) is None
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import pytest
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class TestIntersectionGraph:
|
|
7
|
-
def test_random_intersection_graph(self):
|
|
8
|
-
G = nx.uniform_random_intersection_graph(10, 5, 0.5)
|
|
9
|
-
assert len(G) == 10
|
|
10
|
-
|
|
11
|
-
def test_k_random_intersection_graph(self):
|
|
12
|
-
G = nx.k_random_intersection_graph(10, 5, 2)
|
|
13
|
-
assert len(G) == 10
|
|
14
|
-
|
|
15
|
-
def test_k_random_intersection_graph_seeded(self):
|
|
16
|
-
G = nx.k_random_intersection_graph(10, 5, 2, seed=1234)
|
|
17
|
-
assert len(G) == 10
|
|
18
|
-
|
|
19
|
-
def test_general_random_intersection_graph(self):
|
|
20
|
-
G = nx.general_random_intersection_graph(10, 5, [0.1, 0.2, 0.2, 0.1, 0.1])
|
|
21
|
-
assert len(G) == 10
|
|
22
|
-
pytest.raises(
|
|
23
|
-
ValueError,
|
|
24
|
-
nx.general_random_intersection_graph,
|
|
25
|
-
10,
|
|
26
|
-
5,
|
|
27
|
-
[0.1, 0.2, 0.2, 0.1],
|
|
28
|
-
)
|
|
@@ -1,144 +0,0 @@
|
|
|
1
|
-
"""Unit tests for the :mod:`networkx.generators.interval_graph` module."""
|
|
2
|
-
|
|
3
|
-
import math
|
|
4
|
-
|
|
5
|
-
import pytest
|
|
6
|
-
|
|
7
|
-
import networkx as nx
|
|
8
|
-
from networkx.generators.interval_graph import interval_graph
|
|
9
|
-
from networkx.utils import edges_equal
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class TestIntervalGraph:
|
|
13
|
-
"""Unit tests for :func:`networkx.generators.interval_graph.interval_graph`"""
|
|
14
|
-
|
|
15
|
-
def test_empty(self):
|
|
16
|
-
"""Tests for trivial case of empty input"""
|
|
17
|
-
assert len(interval_graph([])) == 0
|
|
18
|
-
|
|
19
|
-
def test_interval_graph_check_invalid(self):
|
|
20
|
-
"""Tests for conditions that raise Exceptions"""
|
|
21
|
-
|
|
22
|
-
invalids_having_none = [None, (1, 2)]
|
|
23
|
-
with pytest.raises(TypeError):
|
|
24
|
-
interval_graph(invalids_having_none)
|
|
25
|
-
|
|
26
|
-
invalids_having_set = [{1, 2}]
|
|
27
|
-
with pytest.raises(TypeError):
|
|
28
|
-
interval_graph(invalids_having_set)
|
|
29
|
-
|
|
30
|
-
invalids_having_seq_but_not_length2 = [(1, 2, 3)]
|
|
31
|
-
with pytest.raises(TypeError):
|
|
32
|
-
interval_graph(invalids_having_seq_but_not_length2)
|
|
33
|
-
|
|
34
|
-
invalids_interval = [[3, 2]]
|
|
35
|
-
with pytest.raises(ValueError):
|
|
36
|
-
interval_graph(invalids_interval)
|
|
37
|
-
|
|
38
|
-
def test_interval_graph_0(self):
|
|
39
|
-
intervals = [(1, 2), (1, 3)]
|
|
40
|
-
|
|
41
|
-
expected_graph = nx.Graph()
|
|
42
|
-
expected_graph.add_edge(*intervals)
|
|
43
|
-
|
|
44
|
-
actual_g = interval_graph(intervals)
|
|
45
|
-
|
|
46
|
-
assert set(actual_g.nodes) == set(expected_graph.nodes)
|
|
47
|
-
assert edges_equal(expected_graph, actual_g)
|
|
48
|
-
|
|
49
|
-
def test_interval_graph_1(self):
|
|
50
|
-
intervals = [(1, 2), (2, 3), (3, 4), (1, 4)]
|
|
51
|
-
|
|
52
|
-
expected_graph = nx.Graph()
|
|
53
|
-
expected_graph.add_nodes_from(intervals)
|
|
54
|
-
e1 = ((1, 4), (1, 2))
|
|
55
|
-
e2 = ((1, 4), (2, 3))
|
|
56
|
-
e3 = ((1, 4), (3, 4))
|
|
57
|
-
e4 = ((3, 4), (2, 3))
|
|
58
|
-
e5 = ((1, 2), (2, 3))
|
|
59
|
-
|
|
60
|
-
expected_graph.add_edges_from([e1, e2, e3, e4, e5])
|
|
61
|
-
|
|
62
|
-
actual_g = interval_graph(intervals)
|
|
63
|
-
|
|
64
|
-
assert set(actual_g.nodes) == set(expected_graph.nodes)
|
|
65
|
-
assert edges_equal(expected_graph, actual_g)
|
|
66
|
-
|
|
67
|
-
def test_interval_graph_2(self):
|
|
68
|
-
intervals = [(1, 2), [3, 5], [6, 8], (9, 10)]
|
|
69
|
-
|
|
70
|
-
expected_graph = nx.Graph()
|
|
71
|
-
expected_graph.add_nodes_from([(1, 2), (3, 5), (6, 8), (9, 10)])
|
|
72
|
-
|
|
73
|
-
actual_g = interval_graph(intervals)
|
|
74
|
-
|
|
75
|
-
assert set(actual_g.nodes) == set(expected_graph.nodes)
|
|
76
|
-
assert edges_equal(expected_graph, actual_g)
|
|
77
|
-
|
|
78
|
-
def test_interval_graph_3(self):
|
|
79
|
-
intervals = [(1, 4), [3, 5], [2.5, 4]]
|
|
80
|
-
|
|
81
|
-
expected_graph = nx.Graph()
|
|
82
|
-
expected_graph.add_nodes_from([(1, 4), (3, 5), (2.5, 4)])
|
|
83
|
-
e1 = ((1, 4), (3, 5))
|
|
84
|
-
e2 = ((1, 4), (2.5, 4))
|
|
85
|
-
e3 = ((3, 5), (2.5, 4))
|
|
86
|
-
|
|
87
|
-
expected_graph.add_edges_from([e1, e2, e3])
|
|
88
|
-
|
|
89
|
-
actual_g = interval_graph(intervals)
|
|
90
|
-
|
|
91
|
-
assert set(actual_g.nodes) == set(expected_graph.nodes)
|
|
92
|
-
assert edges_equal(expected_graph, actual_g)
|
|
93
|
-
|
|
94
|
-
def test_interval_graph_4(self):
|
|
95
|
-
"""test all possible overlaps"""
|
|
96
|
-
intervals = [
|
|
97
|
-
(0, 2),
|
|
98
|
-
(-2, -1),
|
|
99
|
-
(-2, 0),
|
|
100
|
-
(-2, 1),
|
|
101
|
-
(-2, 2),
|
|
102
|
-
(-2, 3),
|
|
103
|
-
(0, 1),
|
|
104
|
-
(0, 2),
|
|
105
|
-
(0, 3),
|
|
106
|
-
(1, 2),
|
|
107
|
-
(1, 3),
|
|
108
|
-
(2, 3),
|
|
109
|
-
(3, 4),
|
|
110
|
-
]
|
|
111
|
-
|
|
112
|
-
expected_graph = nx.Graph()
|
|
113
|
-
expected_graph.add_nodes_from(intervals)
|
|
114
|
-
expected_nbrs = {
|
|
115
|
-
(-2, 0),
|
|
116
|
-
(-2, 1),
|
|
117
|
-
(-2, 2),
|
|
118
|
-
(-2, 3),
|
|
119
|
-
(0, 1),
|
|
120
|
-
(0, 2),
|
|
121
|
-
(0, 3),
|
|
122
|
-
(1, 2),
|
|
123
|
-
(1, 3),
|
|
124
|
-
(2, 3),
|
|
125
|
-
}
|
|
126
|
-
actual_g = nx.interval_graph(intervals)
|
|
127
|
-
actual_nbrs = nx.neighbors(actual_g, (0, 2))
|
|
128
|
-
|
|
129
|
-
assert set(actual_nbrs) == expected_nbrs
|
|
130
|
-
|
|
131
|
-
def test_interval_graph_5(self):
|
|
132
|
-
"""this test is to see that an interval supports infinite number"""
|
|
133
|
-
intervals = {(-math.inf, 0), (-1, -1), (0.5, 0.5), (1, 1), (1, math.inf)}
|
|
134
|
-
|
|
135
|
-
expected_graph = nx.Graph()
|
|
136
|
-
expected_graph.add_nodes_from(intervals)
|
|
137
|
-
e1 = ((-math.inf, 0), (-1, -1))
|
|
138
|
-
e2 = ((1, 1), (1, math.inf))
|
|
139
|
-
|
|
140
|
-
expected_graph.add_edges_from([e1, e2])
|
|
141
|
-
actual_g = interval_graph(intervals)
|
|
142
|
-
|
|
143
|
-
assert set(actual_g.nodes) == set(expected_graph.nodes)
|
|
144
|
-
assert edges_equal(expected_graph, actual_g)
|
|
@@ -1,125 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
|
|
3
|
-
from networkx.algorithms.assortativity import degree_mixing_dict
|
|
4
|
-
from networkx.generators import gnm_random_graph, powerlaw_cluster_graph
|
|
5
|
-
from networkx.generators.joint_degree_seq import (
|
|
6
|
-
directed_joint_degree_graph,
|
|
7
|
-
is_valid_directed_joint_degree,
|
|
8
|
-
is_valid_joint_degree,
|
|
9
|
-
joint_degree_graph,
|
|
10
|
-
)
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def test_is_valid_joint_degree():
|
|
14
|
-
"""Tests for conditions that invalidate a joint degree dict"""
|
|
15
|
-
|
|
16
|
-
# valid joint degree that satisfies all five conditions
|
|
17
|
-
joint_degrees = {
|
|
18
|
-
1: {4: 1},
|
|
19
|
-
2: {2: 2, 3: 2, 4: 2},
|
|
20
|
-
3: {2: 2, 4: 1},
|
|
21
|
-
4: {1: 1, 2: 2, 3: 1},
|
|
22
|
-
}
|
|
23
|
-
assert is_valid_joint_degree(joint_degrees)
|
|
24
|
-
|
|
25
|
-
# test condition 1
|
|
26
|
-
# joint_degrees_1[1][4] not integer
|
|
27
|
-
joint_degrees_1 = {
|
|
28
|
-
1: {4: 1.5},
|
|
29
|
-
2: {2: 2, 3: 2, 4: 2},
|
|
30
|
-
3: {2: 2, 4: 1},
|
|
31
|
-
4: {1: 1.5, 2: 2, 3: 1},
|
|
32
|
-
}
|
|
33
|
-
assert not is_valid_joint_degree(joint_degrees_1)
|
|
34
|
-
|
|
35
|
-
# test condition 2
|
|
36
|
-
# degree_count[2] = sum(joint_degrees_2[2][j)/2, is not an int
|
|
37
|
-
# degree_count[4] = sum(joint_degrees_2[4][j)/4, is not an int
|
|
38
|
-
joint_degrees_2 = {
|
|
39
|
-
1: {4: 1},
|
|
40
|
-
2: {2: 2, 3: 2, 4: 3},
|
|
41
|
-
3: {2: 2, 4: 1},
|
|
42
|
-
4: {1: 1, 2: 3, 3: 1},
|
|
43
|
-
}
|
|
44
|
-
assert not is_valid_joint_degree(joint_degrees_2)
|
|
45
|
-
|
|
46
|
-
# test conditions 3 and 4
|
|
47
|
-
# joint_degrees_3[1][4]>degree_count[1]*degree_count[4]
|
|
48
|
-
joint_degrees_3 = {
|
|
49
|
-
1: {4: 2},
|
|
50
|
-
2: {2: 2, 3: 2, 4: 2},
|
|
51
|
-
3: {2: 2, 4: 1},
|
|
52
|
-
4: {1: 2, 2: 2, 3: 1},
|
|
53
|
-
}
|
|
54
|
-
assert not is_valid_joint_degree(joint_degrees_3)
|
|
55
|
-
|
|
56
|
-
# test condition 5
|
|
57
|
-
# joint_degrees_5[1][1] not even
|
|
58
|
-
joint_degrees_5 = {1: {1: 9}}
|
|
59
|
-
assert not is_valid_joint_degree(joint_degrees_5)
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def test_joint_degree_graph(ntimes=10):
|
|
63
|
-
for _ in range(ntimes):
|
|
64
|
-
seed = int(time.time())
|
|
65
|
-
|
|
66
|
-
n, m, p = 20, 10, 1
|
|
67
|
-
# generate random graph with model powerlaw_cluster and calculate
|
|
68
|
-
# its joint degree
|
|
69
|
-
g = powerlaw_cluster_graph(n, m, p, seed=seed)
|
|
70
|
-
joint_degrees_g = degree_mixing_dict(g, normalized=False)
|
|
71
|
-
|
|
72
|
-
# generate simple undirected graph with given joint degree
|
|
73
|
-
# joint_degrees_g
|
|
74
|
-
G = joint_degree_graph(joint_degrees_g)
|
|
75
|
-
joint_degrees_G = degree_mixing_dict(G, normalized=False)
|
|
76
|
-
|
|
77
|
-
# assert that the given joint degree is equal to the generated
|
|
78
|
-
# graph's joint degree
|
|
79
|
-
assert joint_degrees_g == joint_degrees_G
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
def test_is_valid_directed_joint_degree():
|
|
83
|
-
in_degrees = [0, 1, 1, 2]
|
|
84
|
-
out_degrees = [1, 1, 1, 1]
|
|
85
|
-
nkk = {1: {1: 2, 2: 2}}
|
|
86
|
-
assert is_valid_directed_joint_degree(in_degrees, out_degrees, nkk)
|
|
87
|
-
|
|
88
|
-
# not realizable, values are not integers.
|
|
89
|
-
nkk = {1: {1: 1.5, 2: 2.5}}
|
|
90
|
-
assert not is_valid_directed_joint_degree(in_degrees, out_degrees, nkk)
|
|
91
|
-
|
|
92
|
-
# not realizable, number of edges between 1-2 are insufficient.
|
|
93
|
-
nkk = {1: {1: 2, 2: 1}}
|
|
94
|
-
assert not is_valid_directed_joint_degree(in_degrees, out_degrees, nkk)
|
|
95
|
-
|
|
96
|
-
# not realizable, in/out degree sequences have different number of nodes.
|
|
97
|
-
out_degrees = [1, 1, 1]
|
|
98
|
-
nkk = {1: {1: 2, 2: 2}}
|
|
99
|
-
assert not is_valid_directed_joint_degree(in_degrees, out_degrees, nkk)
|
|
100
|
-
|
|
101
|
-
# not realizable, degree sequences have fewer than required nodes.
|
|
102
|
-
in_degrees = [0, 1, 2]
|
|
103
|
-
assert not is_valid_directed_joint_degree(in_degrees, out_degrees, nkk)
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
def test_directed_joint_degree_graph(n=15, m=100, ntimes=1000):
|
|
107
|
-
for _ in range(ntimes):
|
|
108
|
-
# generate gnm random graph and calculate its joint degree.
|
|
109
|
-
g = gnm_random_graph(n, m, None, directed=True)
|
|
110
|
-
|
|
111
|
-
# in-degree sequence of g as a list of integers.
|
|
112
|
-
in_degrees = list(dict(g.in_degree()).values())
|
|
113
|
-
# out-degree sequence of g as a list of integers.
|
|
114
|
-
out_degrees = list(dict(g.out_degree()).values())
|
|
115
|
-
nkk = degree_mixing_dict(g)
|
|
116
|
-
|
|
117
|
-
# generate simple directed graph with given degree sequence and joint
|
|
118
|
-
# degree matrix.
|
|
119
|
-
G = directed_joint_degree_graph(in_degrees, out_degrees, nkk)
|
|
120
|
-
|
|
121
|
-
# assert degree sequence correctness.
|
|
122
|
-
assert in_degrees == list(dict(G.in_degree()).values())
|
|
123
|
-
assert out_degrees == list(dict(G.out_degree()).values())
|
|
124
|
-
# assert joint degree matrix correctness.
|
|
125
|
-
assert nkk == degree_mixing_dict(G)
|