okstra 0.107.2 → 0.109.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/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/prompts/lead/okstra-lead-contract.md +1 -1
- package/runtime/prompts/profiles/_common-contract.md +3 -2
- package/runtime/python/okstra_ctl/graphify_cmd.py +225 -0
- package/runtime/python/okstra_ctl/resolve_task_key.py +15 -9
- package/runtime/python/okstra_ctl/session.py +44 -0
- package/runtime/python/okstra_project/__init__.py +2 -0
- package/runtime/python/okstra_project/state.py +36 -0
- package/runtime/python/okstra_token_usage/claude.py +15 -9
- package/runtime/python/okstra_token_usage/cli.py +23 -0
- package/runtime/python/okstra_token_usage/collect.py +163 -4
- package/runtime/python/okstra_vendor/__init__.py +41 -0
- package/runtime/python/okstra_vendor/graphify/.vendored-version +1 -0
- package/runtime/python/okstra_vendor/graphify/__init__.py +28 -0
- package/runtime/python/okstra_vendor/graphify/__main__.py +1371 -0
- package/runtime/python/okstra_vendor/graphify/analyze.py +540 -0
- package/runtime/python/okstra_vendor/graphify/benchmark.py +129 -0
- package/runtime/python/okstra_vendor/graphify/build.py +107 -0
- package/runtime/python/okstra_vendor/graphify/cache.py +169 -0
- package/runtime/python/okstra_vendor/graphify/cluster.py +137 -0
- package/runtime/python/okstra_vendor/graphify/detect.py +510 -0
- package/runtime/python/okstra_vendor/graphify/export.py +1014 -0
- package/runtime/python/okstra_vendor/graphify/extract.py +3277 -0
- package/runtime/python/okstra_vendor/graphify/hooks.py +220 -0
- package/runtime/python/okstra_vendor/graphify/ingest.py +297 -0
- package/runtime/python/okstra_vendor/graphify/manifest.py +4 -0
- package/runtime/python/okstra_vendor/graphify/report.py +175 -0
- package/runtime/python/okstra_vendor/graphify/security.py +203 -0
- package/runtime/python/okstra_vendor/graphify/serve.py +373 -0
- package/runtime/python/okstra_vendor/graphify/skill-aider.md +1184 -0
- package/runtime/python/okstra_vendor/graphify/skill-claw.md +1184 -0
- package/runtime/python/okstra_vendor/graphify/skill-codex.md +1242 -0
- package/runtime/python/okstra_vendor/graphify/skill-copilot.md +1268 -0
- package/runtime/python/okstra_vendor/graphify/skill-droid.md +1239 -0
- package/runtime/python/okstra_vendor/graphify/skill-kiro.md +1183 -0
- package/runtime/python/okstra_vendor/graphify/skill-opencode.md +1238 -0
- package/runtime/python/okstra_vendor/graphify/skill-trae.md +1208 -0
- package/runtime/python/okstra_vendor/graphify/skill-vscode.md +253 -0
- package/runtime/python/okstra_vendor/graphify/skill-windows.md +1245 -0
- package/runtime/python/okstra_vendor/graphify/skill.md +1319 -0
- package/runtime/python/okstra_vendor/graphify/transcribe.py +182 -0
- package/runtime/python/okstra_vendor/graphify/validate.py +72 -0
- package/runtime/python/okstra_vendor/graphify/watch.py +188 -0
- package/runtime/python/okstra_vendor/graphify/wiki.py +214 -0
- package/runtime/python/okstra_vendor/networkx/__init__.py +62 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +134 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +26 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +259 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +71 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +412 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +396 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +150 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +149 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +369 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +44 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +143 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +53 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +265 -0
- 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 +41 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +112 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +199 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +146 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +59 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +78 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +303 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +8 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +94 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +31 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +306 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +1014 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +274 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +68 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +1508 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +255 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +83 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +5 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +122 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +302 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +255 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +160 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +127 -0
- 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 +81 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +143 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +122 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +174 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +107 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +87 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +164 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +322 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +290 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +289 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +57 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +360 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +105 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +603 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +316 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +590 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +232 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +526 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +112 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +69 -0
- 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 +125 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +192 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +84 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +33 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +240 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +334 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +407 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +218 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +327 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +138 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +409 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +35 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +80 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +168 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +205 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +164 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +20 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +591 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +236 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +282 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +364 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +227 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +96 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +150 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +107 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +357 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +130 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +787 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +331 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +150 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +200 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +128 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +209 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +141 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +361 -0
- 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 +923 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +354 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +274 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +259 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +147 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +43 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +144 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +73 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +186 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +277 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +122 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +345 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +220 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +344 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +87 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +140 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +82 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +110 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +302 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +64 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +181 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +95 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +172 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +443 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +818 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +732 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +4 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +505 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +565 -0
- 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 +863 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +163 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +28 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +153 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +354 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +171 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +30 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +216 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +79 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +338 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +162 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +220 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +384 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +227 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +452 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +347 -0
- 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 +147 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +157 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +85 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +106 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +91 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +241 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +138 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +76 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +264 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +152 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +340 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +139 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +26 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +6 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +115 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +394 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +282 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +71 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +359 -0
- 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 +70 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +248 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +138 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +55 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +193 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +96 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +196 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +11 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +811 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +616 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +408 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +1270 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +592 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +220 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +235 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +152 -0
- 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 +421 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +309 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +249 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +502 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +488 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +323 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +280 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +102 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/core.py +588 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +142 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +416 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +1234 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +677 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +1392 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +1095 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +272 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +142 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +268 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +167 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +470 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +11 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +370 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +407 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +238 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +241 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +178 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +611 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +356 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +662 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +425 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +300 -0
- 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 +128 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +573 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +155 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +475 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +481 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +194 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +435 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +483 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +57 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +196 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +107 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +7 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +1306 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +336 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +1262 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +352 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +308 -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 +719 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +103 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +490 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +64 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +212 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +202 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +1655 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +3118 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +196 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +264 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +1102 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +192 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +2 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +337 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +498 -0
- 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 +77 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +213 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +687 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +280 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +1148 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +27 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +738 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +544 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +78 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +59 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +219 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +155 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +4 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +324 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +468 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +633 -0
- 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 +328 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +451 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +491 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +55 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +77 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +73 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +464 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +1463 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +306 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +98 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +167 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +138 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +5 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +239 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +264 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +716 -0
- 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 +254 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +212 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +511 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +149 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +983 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +625 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +2542 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +2107 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +966 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +404 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +30 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +296 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +374 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +564 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +406 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +23 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +154 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +144 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +109 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +136 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +129 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +300 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +678 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +80 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +266 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +85 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +171 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +984 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +340 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +835 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +831 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +85 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +299 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +115 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +58 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +314 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +872 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +163 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +46 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +24 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +26 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +615 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +459 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +556 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +179 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +62 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +15 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +140 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +60 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +27 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +274 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +556 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +57 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +37 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +149 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +1158 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +803 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +76 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +8 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +138 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +191 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +642 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +179 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +270 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +431 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +161 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +248 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +41 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +103 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +54 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +157 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +981 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +142 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +406 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +5 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +90 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +576 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +529 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +185 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +182 -0
- 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 +25 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +203 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +307 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +147 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +131 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +7 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +1042 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +413 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +88 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +219 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +1281 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +106 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +273 -0
- 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 +624 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +114 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +79 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +99 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +934 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +53 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +174 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +500 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +76 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +86 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +77 -0
- package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +278 -0
- package/runtime/python/okstra_vendor/networkx/classes/__init__.py +13 -0
- package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +435 -0
- package/runtime/python/okstra_vendor/networkx/classes/digraph.py +1363 -0
- package/runtime/python/okstra_vendor/networkx/classes/filters.py +95 -0
- package/runtime/python/okstra_vendor/networkx/classes/function.py +1549 -0
- package/runtime/python/okstra_vendor/networkx/classes/graph.py +2082 -0
- package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +269 -0
- package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +977 -0
- package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +1294 -0
- package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +1447 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +192 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +476 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +362 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +331 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +110 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +177 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +1045 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +950 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +12 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +349 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +459 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +528 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +1421 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +131 -0
- package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +371 -0
- package/runtime/python/okstra_vendor/networkx/conftest.py +261 -0
- package/runtime/python/okstra_vendor/networkx/convert.py +502 -0
- package/runtime/python/okstra_vendor/networkx/convert_matrix.py +1314 -0
- package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +7 -0
- package/runtime/python/okstra_vendor/networkx/drawing/layout.py +2036 -0
- package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +470 -0
- package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +570 -0
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +361 -0
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +2978 -0
- 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 +237 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +229 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +285 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +631 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +146 -0
- package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +1582 -0
- package/runtime/python/okstra_vendor/networkx/exception.py +131 -0
- package/runtime/python/okstra_vendor/networkx/generators/__init__.py +34 -0
- package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/atlas.py +227 -0
- package/runtime/python/okstra_vendor/networkx/generators/classic.py +1091 -0
- package/runtime/python/okstra_vendor/networkx/generators/cographs.py +68 -0
- package/runtime/python/okstra_vendor/networkx/generators/community.py +1070 -0
- package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +886 -0
- package/runtime/python/okstra_vendor/networkx/generators/directed.py +572 -0
- package/runtime/python/okstra_vendor/networkx/generators/duplication.py +174 -0
- package/runtime/python/okstra_vendor/networkx/generators/ego.py +66 -0
- package/runtime/python/okstra_vendor/networkx/generators/expanders.py +499 -0
- package/runtime/python/okstra_vendor/networkx/generators/geometric.py +1037 -0
- package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +163 -0
- package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +443 -0
- package/runtime/python/okstra_vendor/networkx/generators/intersection.py +125 -0
- package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +70 -0
- package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +664 -0
- package/runtime/python/okstra_vendor/networkx/generators/lattice.py +405 -0
- package/runtime/python/okstra_vendor/networkx/generators/line.py +501 -0
- package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +110 -0
- package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +259 -0
- package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +117 -0
- package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +1416 -0
- package/runtime/python/okstra_vendor/networkx/generators/small.py +1070 -0
- package/runtime/python/okstra_vendor/networkx/generators/social.py +554 -0
- package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +120 -0
- package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +54 -0
- package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +131 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +75 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +642 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +20 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +362 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +224 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +189 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +103 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +39 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +182 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +488 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +133 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +221 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +28 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +144 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +125 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +264 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +316 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +30 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +82 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +33 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +495 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +220 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +49 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +72 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +92 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +64 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +195 -0
- package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +15 -0
- package/runtime/python/okstra_vendor/networkx/generators/time_series.py +74 -0
- package/runtime/python/okstra_vendor/networkx/generators/trees.py +1070 -0
- package/runtime/python/okstra_vendor/networkx/generators/triads.py +94 -0
- package/runtime/python/okstra_vendor/networkx/lazy_imports.py +188 -0
- package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +13 -0
- package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +650 -0
- package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +466 -0
- package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +77 -0
- package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +168 -0
- package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +512 -0
- package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +166 -0
- package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +186 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +400 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +108 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +40 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +275 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +334 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +86 -0
- package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +70 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +17 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +330 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +489 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +1084 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +879 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +427 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +1053 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +19 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +156 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +190 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +261 -0
- 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 +78 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +78 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +109 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +48 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +137 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +108 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +393 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +113 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +286 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +379 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +354 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +318 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +612 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +744 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +181 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +1531 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +30 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +63 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +128 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +166 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +1742 -0
- package/runtime/python/okstra_vendor/networkx/readwrite/text.py +851 -0
- package/runtime/python/okstra_vendor/networkx/relabel.py +285 -0
- package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +248 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +321 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +531 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +349 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +281 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +40 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_import.py +11 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +96 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +349 -0
- package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +8 -0
- package/runtime/python/okstra_vendor/networkx/utils/__init__.py +8 -0
- package/runtime/python/okstra_vendor/networkx/utils/backends.py +2171 -0
- package/runtime/python/okstra_vendor/networkx/utils/configs.py +396 -0
- package/runtime/python/okstra_vendor/networkx/utils/decorators.py +1233 -0
- package/runtime/python/okstra_vendor/networkx/utils/heaps.py +338 -0
- package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +297 -0
- package/runtime/python/okstra_vendor/networkx/utils/misc.py +703 -0
- package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +198 -0
- package/runtime/python/okstra_vendor/networkx/utils/rcm.py +159 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +11 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +225 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +263 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +510 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +131 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +268 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +393 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +53 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +63 -0
- package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +55 -0
- package/runtime/python/okstra_vendor/networkx/utils/union_find.py +106 -0
- package/runtime/skills/okstra-graphify/SKILL.md +161 -0
- package/runtime/skills/okstra-inspect/SKILL.md +17 -9
- package/runtime/templates/reports/settings.template.json +4 -0
- package/runtime/validators/forbidden_actions.py +8 -2
- package/runtime/validators/validate_session_conformance.py +26 -5
- package/src/cli-registry.mjs +7 -0
- package/src/commands/graphify.mjs +32 -0
- package/src/commands/lifecycle/doctor.mjs +9 -0
- package/src/lib/skill-catalog.mjs +1 -0
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Miscellaneous Helpers for NetworkX.
|
|
3
|
+
|
|
4
|
+
These are not imported into the base networkx namespace but
|
|
5
|
+
can be accessed, for example, as
|
|
6
|
+
|
|
7
|
+
>>> import networkx as nx
|
|
8
|
+
>>> nx.utils.make_list_of_ints({1, 2, 3})
|
|
9
|
+
[1, 2, 3]
|
|
10
|
+
>>> nx.utils.arbitrary_element({5, 1, 7}) # doctest: +SKIP
|
|
11
|
+
1
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import itertools
|
|
15
|
+
import random
|
|
16
|
+
import warnings
|
|
17
|
+
from collections import defaultdict
|
|
18
|
+
from collections.abc import Iterable, Iterator, Sized
|
|
19
|
+
from itertools import chain, tee, zip_longest
|
|
20
|
+
|
|
21
|
+
import networkx as nx
|
|
22
|
+
|
|
23
|
+
__all__ = [
|
|
24
|
+
"flatten",
|
|
25
|
+
"make_list_of_ints",
|
|
26
|
+
"dict_to_numpy_array",
|
|
27
|
+
"arbitrary_element",
|
|
28
|
+
"pairwise",
|
|
29
|
+
"groups",
|
|
30
|
+
"create_random_state",
|
|
31
|
+
"create_py_random_state",
|
|
32
|
+
"PythonRandomInterface",
|
|
33
|
+
"PythonRandomViaNumpyBits",
|
|
34
|
+
"nodes_equal",
|
|
35
|
+
"edges_equal",
|
|
36
|
+
"graphs_equal",
|
|
37
|
+
"_clear_cache",
|
|
38
|
+
]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# some cookbook stuff
|
|
42
|
+
# used in deciding whether something is a bunch of nodes, edges, etc.
|
|
43
|
+
# see G.add_nodes and others in Graph Class in networkx/base.py
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def flatten(obj, result=None):
|
|
47
|
+
"""Return flattened version of (possibly nested) iterable object."""
|
|
48
|
+
if not isinstance(obj, Iterable | Sized) or isinstance(obj, str):
|
|
49
|
+
return obj
|
|
50
|
+
if result is None:
|
|
51
|
+
result = []
|
|
52
|
+
for item in obj:
|
|
53
|
+
if not isinstance(item, Iterable | Sized) or isinstance(item, str):
|
|
54
|
+
result.append(item)
|
|
55
|
+
else:
|
|
56
|
+
flatten(item, result)
|
|
57
|
+
return tuple(result)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def make_list_of_ints(sequence):
|
|
61
|
+
"""Return list of ints from sequence of integral numbers.
|
|
62
|
+
|
|
63
|
+
All elements of the sequence must satisfy int(element) == element
|
|
64
|
+
or a ValueError is raised. Sequence is iterated through once.
|
|
65
|
+
|
|
66
|
+
If sequence is a list, the non-int values are replaced with ints.
|
|
67
|
+
So, no new list is created
|
|
68
|
+
"""
|
|
69
|
+
if not isinstance(sequence, list):
|
|
70
|
+
result = []
|
|
71
|
+
for i in sequence:
|
|
72
|
+
errmsg = f"sequence is not all integers: {i}"
|
|
73
|
+
try:
|
|
74
|
+
ii = int(i)
|
|
75
|
+
except ValueError:
|
|
76
|
+
raise nx.NetworkXError(errmsg) from None
|
|
77
|
+
if ii != i:
|
|
78
|
+
raise nx.NetworkXError(errmsg)
|
|
79
|
+
result.append(ii)
|
|
80
|
+
return result
|
|
81
|
+
# original sequence is a list... in-place conversion to ints
|
|
82
|
+
for indx, i in enumerate(sequence):
|
|
83
|
+
errmsg = f"sequence is not all integers: {i}"
|
|
84
|
+
if isinstance(i, int):
|
|
85
|
+
continue
|
|
86
|
+
try:
|
|
87
|
+
ii = int(i)
|
|
88
|
+
except ValueError:
|
|
89
|
+
raise nx.NetworkXError(errmsg) from None
|
|
90
|
+
if ii != i:
|
|
91
|
+
raise nx.NetworkXError(errmsg)
|
|
92
|
+
sequence[indx] = ii
|
|
93
|
+
return sequence
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def dict_to_numpy_array(d, mapping=None):
|
|
97
|
+
"""Convert a dictionary of dictionaries to a numpy array
|
|
98
|
+
with optional mapping."""
|
|
99
|
+
try:
|
|
100
|
+
return _dict_to_numpy_array2(d, mapping)
|
|
101
|
+
except (AttributeError, TypeError):
|
|
102
|
+
# AttributeError is when no mapping was provided and v.keys() fails.
|
|
103
|
+
# TypeError is when a mapping was provided and d[k1][k2] fails.
|
|
104
|
+
return _dict_to_numpy_array1(d, mapping)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _dict_to_numpy_array2(d, mapping=None):
|
|
108
|
+
"""Convert a dictionary of dictionaries to a 2d numpy array
|
|
109
|
+
with optional mapping.
|
|
110
|
+
|
|
111
|
+
"""
|
|
112
|
+
import numpy as np
|
|
113
|
+
|
|
114
|
+
if mapping is None:
|
|
115
|
+
s = set(d.keys())
|
|
116
|
+
for k, v in d.items():
|
|
117
|
+
s.update(v.keys())
|
|
118
|
+
mapping = dict(zip(s, range(len(s))))
|
|
119
|
+
n = len(mapping)
|
|
120
|
+
a = np.zeros((n, n))
|
|
121
|
+
for k1, i in mapping.items():
|
|
122
|
+
for k2, j in mapping.items():
|
|
123
|
+
try:
|
|
124
|
+
a[i, j] = d[k1][k2]
|
|
125
|
+
except KeyError:
|
|
126
|
+
pass
|
|
127
|
+
return a
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _dict_to_numpy_array1(d, mapping=None):
|
|
131
|
+
"""Convert a dictionary of numbers to a 1d numpy array with optional mapping."""
|
|
132
|
+
import numpy as np
|
|
133
|
+
|
|
134
|
+
if mapping is None:
|
|
135
|
+
s = set(d.keys())
|
|
136
|
+
mapping = dict(zip(s, range(len(s))))
|
|
137
|
+
n = len(mapping)
|
|
138
|
+
a = np.zeros(n)
|
|
139
|
+
for k1, i in mapping.items():
|
|
140
|
+
i = mapping[k1]
|
|
141
|
+
a[i] = d[k1]
|
|
142
|
+
return a
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def arbitrary_element(iterable):
|
|
146
|
+
"""Returns an arbitrary element of `iterable` without removing it.
|
|
147
|
+
|
|
148
|
+
This is most useful for "peeking" at an arbitrary element of a set,
|
|
149
|
+
but can be used for any list, dictionary, etc., as well.
|
|
150
|
+
|
|
151
|
+
Parameters
|
|
152
|
+
----------
|
|
153
|
+
iterable : `abc.collections.Iterable` instance
|
|
154
|
+
Any object that implements ``__iter__``, e.g. set, dict, list, tuple,
|
|
155
|
+
etc.
|
|
156
|
+
|
|
157
|
+
Returns
|
|
158
|
+
-------
|
|
159
|
+
The object that results from ``next(iter(iterable))``
|
|
160
|
+
|
|
161
|
+
Raises
|
|
162
|
+
------
|
|
163
|
+
ValueError
|
|
164
|
+
If `iterable` is an iterator (because the current implementation of
|
|
165
|
+
this function would consume an element from the iterator).
|
|
166
|
+
|
|
167
|
+
Examples
|
|
168
|
+
--------
|
|
169
|
+
Arbitrary elements from common Iterable objects:
|
|
170
|
+
|
|
171
|
+
>>> nx.utils.arbitrary_element([1, 2, 3]) # list
|
|
172
|
+
1
|
|
173
|
+
>>> nx.utils.arbitrary_element((1, 2, 3)) # tuple
|
|
174
|
+
1
|
|
175
|
+
>>> nx.utils.arbitrary_element({1, 2, 3}) # set
|
|
176
|
+
1
|
|
177
|
+
>>> d = {k: v for k, v in zip([1, 2, 3], [3, 2, 1])}
|
|
178
|
+
>>> nx.utils.arbitrary_element(d) # dict_keys
|
|
179
|
+
1
|
|
180
|
+
>>> nx.utils.arbitrary_element(d.values()) # dict values
|
|
181
|
+
3
|
|
182
|
+
|
|
183
|
+
`str` is also an Iterable:
|
|
184
|
+
|
|
185
|
+
>>> nx.utils.arbitrary_element("hello")
|
|
186
|
+
'h'
|
|
187
|
+
|
|
188
|
+
:exc:`ValueError` is raised if `iterable` is an iterator:
|
|
189
|
+
|
|
190
|
+
>>> iterator = iter([1, 2, 3]) # Iterator, *not* Iterable
|
|
191
|
+
>>> nx.utils.arbitrary_element(iterator)
|
|
192
|
+
Traceback (most recent call last):
|
|
193
|
+
...
|
|
194
|
+
ValueError: cannot return an arbitrary item from an iterator
|
|
195
|
+
|
|
196
|
+
Notes
|
|
197
|
+
-----
|
|
198
|
+
This function does not return a *random* element. If `iterable` is
|
|
199
|
+
ordered, sequential calls will return the same value::
|
|
200
|
+
|
|
201
|
+
>>> l = [1, 2, 3]
|
|
202
|
+
>>> nx.utils.arbitrary_element(l)
|
|
203
|
+
1
|
|
204
|
+
>>> nx.utils.arbitrary_element(l)
|
|
205
|
+
1
|
|
206
|
+
|
|
207
|
+
"""
|
|
208
|
+
if isinstance(iterable, Iterator):
|
|
209
|
+
raise ValueError("cannot return an arbitrary item from an iterator")
|
|
210
|
+
# Another possible implementation is ``for x in iterable: return x``.
|
|
211
|
+
return next(iter(iterable))
|
|
212
|
+
|
|
213
|
+
|
|
214
|
+
def pairwise(iterable, cyclic=False):
|
|
215
|
+
"""Return successive overlapping pairs taken from an input iterable.
|
|
216
|
+
|
|
217
|
+
Parameters
|
|
218
|
+
----------
|
|
219
|
+
iterable : iterable
|
|
220
|
+
An iterable from which to generate pairs.
|
|
221
|
+
|
|
222
|
+
cyclic : bool, optional (default=False)
|
|
223
|
+
If `True`, a pair with the last and first items is included at the end.
|
|
224
|
+
|
|
225
|
+
Returns
|
|
226
|
+
-------
|
|
227
|
+
iterator
|
|
228
|
+
An iterator over successive overlapping pairs from the `iterable`.
|
|
229
|
+
|
|
230
|
+
See Also
|
|
231
|
+
--------
|
|
232
|
+
itertools.pairwise
|
|
233
|
+
|
|
234
|
+
Examples
|
|
235
|
+
--------
|
|
236
|
+
>>> list(nx.utils.pairwise([1, 2, 3, 4]))
|
|
237
|
+
[(1, 2), (2, 3), (3, 4)]
|
|
238
|
+
|
|
239
|
+
>>> list(nx.utils.pairwise([1, 2, 3, 4], cyclic=True))
|
|
240
|
+
[(1, 2), (2, 3), (3, 4), (4, 1)]
|
|
241
|
+
"""
|
|
242
|
+
if not cyclic:
|
|
243
|
+
return itertools.pairwise(iterable)
|
|
244
|
+
a, b = tee(iterable)
|
|
245
|
+
first = next(b, None)
|
|
246
|
+
return zip(a, chain(b, (first,)))
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
def groups(many_to_one):
|
|
250
|
+
"""Converts a many-to-one mapping into a one-to-many mapping.
|
|
251
|
+
|
|
252
|
+
`many_to_one` must be a dictionary whose keys and values are all
|
|
253
|
+
:term:`hashable`.
|
|
254
|
+
|
|
255
|
+
The return value is a dictionary mapping values from `many_to_one`
|
|
256
|
+
to sets of keys from `many_to_one` that have that value.
|
|
257
|
+
|
|
258
|
+
Examples
|
|
259
|
+
--------
|
|
260
|
+
>>> from networkx.utils import groups
|
|
261
|
+
>>> many_to_one = {"a": 1, "b": 1, "c": 2, "d": 3, "e": 3}
|
|
262
|
+
>>> groups(many_to_one) # doctest: +SKIP
|
|
263
|
+
{1: {'a', 'b'}, 2: {'c'}, 3: {'e', 'd'}}
|
|
264
|
+
"""
|
|
265
|
+
one_to_many = defaultdict(set)
|
|
266
|
+
for v, k in many_to_one.items():
|
|
267
|
+
one_to_many[k].add(v)
|
|
268
|
+
return dict(one_to_many)
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
def create_random_state(random_state=None):
|
|
272
|
+
"""Returns a numpy.random.RandomState or numpy.random.Generator instance
|
|
273
|
+
depending on input.
|
|
274
|
+
|
|
275
|
+
Parameters
|
|
276
|
+
----------
|
|
277
|
+
random_state : int or NumPy RandomState or Generator instance, optional (default=None)
|
|
278
|
+
If int, return a numpy.random.RandomState instance set with seed=int.
|
|
279
|
+
if `numpy.random.RandomState` instance, return it.
|
|
280
|
+
if `numpy.random.Generator` instance, return it.
|
|
281
|
+
if None or numpy.random, return the global random number generator used
|
|
282
|
+
by numpy.random.
|
|
283
|
+
"""
|
|
284
|
+
import numpy as np
|
|
285
|
+
|
|
286
|
+
if random_state is None or random_state is np.random:
|
|
287
|
+
return np.random.mtrand._rand
|
|
288
|
+
if isinstance(random_state, np.random.RandomState):
|
|
289
|
+
return random_state
|
|
290
|
+
if isinstance(random_state, int):
|
|
291
|
+
return np.random.RandomState(random_state)
|
|
292
|
+
if isinstance(random_state, np.random.Generator):
|
|
293
|
+
return random_state
|
|
294
|
+
msg = (
|
|
295
|
+
f"{random_state} cannot be used to create a numpy.random.RandomState or\n"
|
|
296
|
+
"numpy.random.Generator instance"
|
|
297
|
+
)
|
|
298
|
+
raise ValueError(msg)
|
|
299
|
+
|
|
300
|
+
|
|
301
|
+
class PythonRandomViaNumpyBits(random.Random):
|
|
302
|
+
"""Provide the random.random algorithms using a numpy.random bit generator
|
|
303
|
+
|
|
304
|
+
The intent is to allow people to contribute code that uses Python's random
|
|
305
|
+
library, but still allow users to provide a single easily controlled random
|
|
306
|
+
bit-stream for all work with NetworkX. This implementation is based on helpful
|
|
307
|
+
comments and code from Robert Kern on NumPy's GitHub Issue #24458.
|
|
308
|
+
|
|
309
|
+
This implementation supersedes that of `PythonRandomInterface` which rewrote
|
|
310
|
+
methods to account for subtle differences in API between `random` and
|
|
311
|
+
`numpy.random`. Instead this subclasses `random.Random` and overwrites
|
|
312
|
+
the methods `random`, `getrandbits`, `getstate`, `setstate` and `seed`.
|
|
313
|
+
It makes them use the rng values from an input numpy `RandomState` or `Generator`.
|
|
314
|
+
Those few methods allow the rest of the `random.Random` methods to provide
|
|
315
|
+
the API interface of `random.random` while using randomness generated by
|
|
316
|
+
a numpy generator.
|
|
317
|
+
"""
|
|
318
|
+
|
|
319
|
+
def __init__(self, rng=None):
|
|
320
|
+
try:
|
|
321
|
+
import numpy as np
|
|
322
|
+
except ImportError:
|
|
323
|
+
msg = "numpy not found, only random.random available."
|
|
324
|
+
warnings.warn(msg, ImportWarning)
|
|
325
|
+
|
|
326
|
+
if rng is None:
|
|
327
|
+
self._rng = np.random.mtrand._rand
|
|
328
|
+
else:
|
|
329
|
+
self._rng = rng
|
|
330
|
+
|
|
331
|
+
# Not necessary, given our overriding of gauss() below, but it's
|
|
332
|
+
# in the superclass and nominally public, so initialize it here.
|
|
333
|
+
self.gauss_next = None
|
|
334
|
+
|
|
335
|
+
def random(self):
|
|
336
|
+
"""Get the next random number in the range 0.0 <= X < 1.0."""
|
|
337
|
+
return self._rng.random()
|
|
338
|
+
|
|
339
|
+
def getrandbits(self, k):
|
|
340
|
+
"""getrandbits(k) -> x. Generates an int with k random bits."""
|
|
341
|
+
if k < 0:
|
|
342
|
+
raise ValueError("number of bits must be non-negative")
|
|
343
|
+
numbytes = (k + 7) // 8 # bits / 8 and rounded up
|
|
344
|
+
x = int.from_bytes(self._rng.bytes(numbytes), "big")
|
|
345
|
+
return x >> (numbytes * 8 - k) # trim excess bits
|
|
346
|
+
|
|
347
|
+
def getstate(self):
|
|
348
|
+
return self._rng.__getstate__()
|
|
349
|
+
|
|
350
|
+
def setstate(self, state):
|
|
351
|
+
self._rng.__setstate__(state)
|
|
352
|
+
|
|
353
|
+
def seed(self, *args, **kwds):
|
|
354
|
+
"Do nothing override method."
|
|
355
|
+
raise NotImplementedError("seed() not implemented in PythonRandomViaNumpyBits")
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
##################################################################
|
|
359
|
+
class PythonRandomInterface:
|
|
360
|
+
"""PythonRandomInterface is included for backward compatibility
|
|
361
|
+
New code should use PythonRandomViaNumpyBits instead.
|
|
362
|
+
"""
|
|
363
|
+
|
|
364
|
+
def __init__(self, rng=None):
|
|
365
|
+
try:
|
|
366
|
+
import numpy as np
|
|
367
|
+
except ImportError:
|
|
368
|
+
msg = "numpy not found, only random.random available."
|
|
369
|
+
warnings.warn(msg, ImportWarning)
|
|
370
|
+
|
|
371
|
+
if rng is None:
|
|
372
|
+
self._rng = np.random.mtrand._rand
|
|
373
|
+
else:
|
|
374
|
+
self._rng = rng
|
|
375
|
+
|
|
376
|
+
def random(self):
|
|
377
|
+
return self._rng.random()
|
|
378
|
+
|
|
379
|
+
def uniform(self, a, b):
|
|
380
|
+
return a + (b - a) * self._rng.random()
|
|
381
|
+
|
|
382
|
+
def randrange(self, a, b=None):
|
|
383
|
+
import numpy as np
|
|
384
|
+
|
|
385
|
+
if b is None:
|
|
386
|
+
a, b = 0, a
|
|
387
|
+
if b > 9223372036854775807: # from np.iinfo(np.int64).max
|
|
388
|
+
tmp_rng = PythonRandomViaNumpyBits(self._rng)
|
|
389
|
+
return tmp_rng.randrange(a, b)
|
|
390
|
+
|
|
391
|
+
if isinstance(self._rng, np.random.Generator):
|
|
392
|
+
return self._rng.integers(a, b)
|
|
393
|
+
return self._rng.randint(a, b)
|
|
394
|
+
|
|
395
|
+
# NOTE: the numpy implementations of `choice` don't support strings, so
|
|
396
|
+
# this cannot be replaced with self._rng.choice
|
|
397
|
+
def choice(self, seq):
|
|
398
|
+
import numpy as np
|
|
399
|
+
|
|
400
|
+
if isinstance(self._rng, np.random.Generator):
|
|
401
|
+
idx = self._rng.integers(0, len(seq))
|
|
402
|
+
else:
|
|
403
|
+
idx = self._rng.randint(0, len(seq))
|
|
404
|
+
return seq[idx]
|
|
405
|
+
|
|
406
|
+
def gauss(self, mu, sigma):
|
|
407
|
+
return self._rng.normal(mu, sigma)
|
|
408
|
+
|
|
409
|
+
def shuffle(self, seq):
|
|
410
|
+
return self._rng.shuffle(seq)
|
|
411
|
+
|
|
412
|
+
# Some methods don't match API for numpy RandomState.
|
|
413
|
+
# Commented out versions are not used by NetworkX
|
|
414
|
+
|
|
415
|
+
def sample(self, seq, k):
|
|
416
|
+
return self._rng.choice(list(seq), size=(k,), replace=False)
|
|
417
|
+
|
|
418
|
+
def randint(self, a, b):
|
|
419
|
+
import numpy as np
|
|
420
|
+
|
|
421
|
+
if b > 9223372036854775807: # from np.iinfo(np.int64).max
|
|
422
|
+
tmp_rng = PythonRandomViaNumpyBits(self._rng)
|
|
423
|
+
return tmp_rng.randint(a, b)
|
|
424
|
+
|
|
425
|
+
if isinstance(self._rng, np.random.Generator):
|
|
426
|
+
return self._rng.integers(a, b + 1)
|
|
427
|
+
return self._rng.randint(a, b + 1)
|
|
428
|
+
|
|
429
|
+
# exponential as expovariate with 1/argument,
|
|
430
|
+
def expovariate(self, scale):
|
|
431
|
+
return self._rng.exponential(1 / scale)
|
|
432
|
+
|
|
433
|
+
# pareto as paretovariate with argument,
|
|
434
|
+
def paretovariate(self, shape):
|
|
435
|
+
return self._rng.pareto(shape)
|
|
436
|
+
|
|
437
|
+
|
|
438
|
+
# weibull as weibullvariate multiplied by beta,
|
|
439
|
+
# def weibullvariate(self, alpha, beta):
|
|
440
|
+
# return self._rng.weibull(alpha) * beta
|
|
441
|
+
#
|
|
442
|
+
# def triangular(self, low, high, mode):
|
|
443
|
+
# return self._rng.triangular(low, mode, high)
|
|
444
|
+
#
|
|
445
|
+
# def choices(self, seq, weights=None, cum_weights=None, k=1):
|
|
446
|
+
# return self._rng.choice(seq
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def create_py_random_state(random_state=None):
|
|
450
|
+
"""Returns a random.Random instance depending on input.
|
|
451
|
+
|
|
452
|
+
Parameters
|
|
453
|
+
----------
|
|
454
|
+
random_state : int or random number generator or None (default=None)
|
|
455
|
+
- If int, return a `random.Random` instance set with seed=int.
|
|
456
|
+
- If `random.Random` instance, return it.
|
|
457
|
+
- If None or the `np.random` package, return the global random number
|
|
458
|
+
generator used by `np.random`.
|
|
459
|
+
- If an `np.random.Generator` instance, or the `np.random` package, or
|
|
460
|
+
the global numpy random number generator, then return it.
|
|
461
|
+
wrapped in a `PythonRandomViaNumpyBits` class.
|
|
462
|
+
- If a `PythonRandomViaNumpyBits` instance, return it.
|
|
463
|
+
- If a `PythonRandomInterface` instance, return it.
|
|
464
|
+
- If a `np.random.RandomState` instance and not the global numpy default,
|
|
465
|
+
return it wrapped in `PythonRandomInterface` for backward bit-stream
|
|
466
|
+
matching with legacy code.
|
|
467
|
+
|
|
468
|
+
Notes
|
|
469
|
+
-----
|
|
470
|
+
- A diagram intending to illustrate the relationships behind our support
|
|
471
|
+
for numpy random numbers is called
|
|
472
|
+
`NetworkX Numpy Random Numbers <https://excalidraw.com/#room=b5303f2b03d3af7ccc6a,e5ZDIWdWWCTTsg8OqoRvPA>`_.
|
|
473
|
+
- More discussion about this support also appears in
|
|
474
|
+
`gh-6869#comment <https://github.com/networkx/networkx/pull/6869#issuecomment-1944799534>`_.
|
|
475
|
+
- Wrappers of numpy.random number generators allow them to mimic the Python random
|
|
476
|
+
number generation algorithms. For example, Python can create arbitrarily large
|
|
477
|
+
random ints, and the wrappers use Numpy bit-streams with CPython's random module
|
|
478
|
+
to choose arbitrarily large random integers too.
|
|
479
|
+
- We provide two wrapper classes:
|
|
480
|
+
`PythonRandomViaNumpyBits` is usually what you want and is always used for
|
|
481
|
+
`np.Generator` instances. But for users who need to recreate random numbers
|
|
482
|
+
produced in NetworkX 3.2 or earlier, we maintain the `PythonRandomInterface`
|
|
483
|
+
wrapper as well. We use it only used if passed a (non-default) `np.RandomState`
|
|
484
|
+
instance pre-initialized from a seed. Otherwise the newer wrapper is used.
|
|
485
|
+
"""
|
|
486
|
+
if random_state is None or random_state is random:
|
|
487
|
+
return random._inst
|
|
488
|
+
if isinstance(random_state, random.Random):
|
|
489
|
+
return random_state
|
|
490
|
+
if isinstance(random_state, int):
|
|
491
|
+
return random.Random(random_state)
|
|
492
|
+
|
|
493
|
+
try:
|
|
494
|
+
import numpy as np
|
|
495
|
+
except ImportError:
|
|
496
|
+
pass
|
|
497
|
+
else:
|
|
498
|
+
if isinstance(random_state, PythonRandomInterface | PythonRandomViaNumpyBits):
|
|
499
|
+
return random_state
|
|
500
|
+
if isinstance(random_state, np.random.Generator):
|
|
501
|
+
return PythonRandomViaNumpyBits(random_state)
|
|
502
|
+
if random_state is np.random:
|
|
503
|
+
return PythonRandomViaNumpyBits(np.random.mtrand._rand)
|
|
504
|
+
|
|
505
|
+
if isinstance(random_state, np.random.RandomState):
|
|
506
|
+
if random_state is np.random.mtrand._rand:
|
|
507
|
+
return PythonRandomViaNumpyBits(random_state)
|
|
508
|
+
# Only need older interface if specially constructed RandomState used
|
|
509
|
+
return PythonRandomInterface(random_state)
|
|
510
|
+
|
|
511
|
+
msg = f"{random_state} cannot be used to generate a random.Random instance"
|
|
512
|
+
raise ValueError(msg)
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
def nodes_equal(nodes1, nodes2):
|
|
516
|
+
"""Check if nodes are equal.
|
|
517
|
+
|
|
518
|
+
Equality here means equal as Python objects.
|
|
519
|
+
Node data must match if included.
|
|
520
|
+
The order of nodes is not relevant.
|
|
521
|
+
|
|
522
|
+
Parameters
|
|
523
|
+
----------
|
|
524
|
+
nodes1, nodes2 : iterables of nodes, or (node, datadict) tuples
|
|
525
|
+
|
|
526
|
+
Returns
|
|
527
|
+
-------
|
|
528
|
+
bool
|
|
529
|
+
True if nodes are equal, False otherwise.
|
|
530
|
+
"""
|
|
531
|
+
nlist1 = list(nodes1)
|
|
532
|
+
nlist2 = list(nodes2)
|
|
533
|
+
try:
|
|
534
|
+
d1 = dict(nlist1)
|
|
535
|
+
d2 = dict(nlist2)
|
|
536
|
+
except (ValueError, TypeError):
|
|
537
|
+
d1 = dict.fromkeys(nlist1)
|
|
538
|
+
d2 = dict.fromkeys(nlist2)
|
|
539
|
+
return d1 == d2
|
|
540
|
+
|
|
541
|
+
|
|
542
|
+
def edges_equal(edges1, edges2, *, directed=False):
|
|
543
|
+
"""Return whether edgelists are equal.
|
|
544
|
+
|
|
545
|
+
Equality here means equal as Python objects. Edge data must match
|
|
546
|
+
if included. Ordering of edges in an edgelist is not relevant;
|
|
547
|
+
ordering of nodes in an edge is only relevant if ``directed == True``.
|
|
548
|
+
|
|
549
|
+
Parameters
|
|
550
|
+
----------
|
|
551
|
+
edges1, edges2 : iterables of tuples
|
|
552
|
+
Each tuple can be
|
|
553
|
+
an edge tuple ``(u, v)``, or
|
|
554
|
+
an edge tuple with data `dict` s ``(u, v, d)``, or
|
|
555
|
+
an edge tuple with keys and data `dict` s ``(u, v, k, d)``.
|
|
556
|
+
|
|
557
|
+
directed : bool, optional (default=False)
|
|
558
|
+
If `True`, edgelists are treated as coming from directed
|
|
559
|
+
graphs.
|
|
560
|
+
|
|
561
|
+
Returns
|
|
562
|
+
-------
|
|
563
|
+
bool
|
|
564
|
+
`True` if edgelists are equal, `False` otherwise.
|
|
565
|
+
|
|
566
|
+
Examples
|
|
567
|
+
--------
|
|
568
|
+
>>> G1 = nx.complete_graph(3)
|
|
569
|
+
>>> G2 = nx.cycle_graph(3)
|
|
570
|
+
>>> edges_equal(G1.edges, G2.edges)
|
|
571
|
+
True
|
|
572
|
+
|
|
573
|
+
Edge order is not taken into account:
|
|
574
|
+
|
|
575
|
+
>>> G1 = nx.Graph([(0, 1), (1, 2)])
|
|
576
|
+
>>> G2 = nx.Graph([(1, 2), (0, 1)])
|
|
577
|
+
>>> edges_equal(G1.edges, G2.edges)
|
|
578
|
+
True
|
|
579
|
+
|
|
580
|
+
The `directed` parameter controls whether edges are treated as
|
|
581
|
+
coming from directed graphs.
|
|
582
|
+
|
|
583
|
+
>>> DG1 = nx.DiGraph([(0, 1)])
|
|
584
|
+
>>> DG2 = nx.DiGraph([(1, 0)])
|
|
585
|
+
>>> edges_equal(DG1.edges, DG2.edges, directed=False) # Not recommended.
|
|
586
|
+
True
|
|
587
|
+
>>> edges_equal(DG1.edges, DG2.edges, directed=True)
|
|
588
|
+
False
|
|
589
|
+
|
|
590
|
+
This function is meant to be used on edgelists (i.e. the output of a
|
|
591
|
+
``G.edges()`` call), and can give unexpected results on unprocessed
|
|
592
|
+
lists of edges:
|
|
593
|
+
|
|
594
|
+
>>> l1 = [(0, 1)]
|
|
595
|
+
>>> l2 = [(0, 1), (1, 0)]
|
|
596
|
+
>>> edges_equal(l1, l2) # Not recommended.
|
|
597
|
+
False
|
|
598
|
+
>>> G1 = nx.Graph(l1)
|
|
599
|
+
>>> G2 = nx.Graph(l2)
|
|
600
|
+
>>> edges_equal(G1.edges, G2.edges)
|
|
601
|
+
True
|
|
602
|
+
>>> DG1 = nx.DiGraph(l1)
|
|
603
|
+
>>> DG2 = nx.DiGraph(l2)
|
|
604
|
+
>>> edges_equal(DG1.edges, DG2.edges, directed=True)
|
|
605
|
+
False
|
|
606
|
+
"""
|
|
607
|
+
d1 = defaultdict(list)
|
|
608
|
+
d2 = defaultdict(list)
|
|
609
|
+
|
|
610
|
+
for e1, e2 in zip_longest(edges1, edges2, fillvalue=None):
|
|
611
|
+
if e1 is None or e2 is None:
|
|
612
|
+
return False # One is longer.
|
|
613
|
+
for e, d in [(e1, d1), (e2, d2)]:
|
|
614
|
+
u, v, *data = e
|
|
615
|
+
d[u, v].append(data)
|
|
616
|
+
if not directed:
|
|
617
|
+
d[v, u].append(data)
|
|
618
|
+
|
|
619
|
+
# Can check one direction because lengths are the same.
|
|
620
|
+
return all(d1[e].count(data) == d2[e].count(data) for e in d1 for data in d1[e])
|
|
621
|
+
|
|
622
|
+
|
|
623
|
+
def graphs_equal(graph1, graph2):
|
|
624
|
+
"""Check if graphs are equal.
|
|
625
|
+
|
|
626
|
+
Equality here means equal as Python objects (not isomorphism).
|
|
627
|
+
Node, edge and graph data must match.
|
|
628
|
+
|
|
629
|
+
Parameters
|
|
630
|
+
----------
|
|
631
|
+
graph1, graph2 : graph
|
|
632
|
+
|
|
633
|
+
Returns
|
|
634
|
+
-------
|
|
635
|
+
bool
|
|
636
|
+
True if graphs are equal, False otherwise.
|
|
637
|
+
"""
|
|
638
|
+
return (
|
|
639
|
+
graph1.adj == graph2.adj
|
|
640
|
+
and graph1.nodes == graph2.nodes
|
|
641
|
+
and graph1.graph == graph2.graph
|
|
642
|
+
)
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
def _clear_cache(G):
|
|
646
|
+
"""Clear the cache of a graph (currently stores converted graphs).
|
|
647
|
+
|
|
648
|
+
Caching is controlled via ``nx.config.cache_converted_graphs`` configuration.
|
|
649
|
+
"""
|
|
650
|
+
if cache := getattr(G, "__networkx_cache__", None):
|
|
651
|
+
cache.clear()
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
def check_create_using(create_using, *, directed=None, multigraph=None, default=None):
|
|
655
|
+
"""Assert that create_using has good properties
|
|
656
|
+
|
|
657
|
+
This checks for desired directedness and multi-edge properties.
|
|
658
|
+
It returns `create_using` unless that is `None` when it returns
|
|
659
|
+
the optionally specified default value.
|
|
660
|
+
|
|
661
|
+
Parameters
|
|
662
|
+
----------
|
|
663
|
+
create_using : None, graph class or instance
|
|
664
|
+
The input value of create_using for a function.
|
|
665
|
+
directed : None or bool
|
|
666
|
+
Whether to check `create_using.is_directed() == directed`.
|
|
667
|
+
If None, do not assert directedness.
|
|
668
|
+
multigraph : None or bool
|
|
669
|
+
Whether to check `create_using.is_multigraph() == multigraph`.
|
|
670
|
+
If None, do not assert multi-edge property.
|
|
671
|
+
default : None or graph class
|
|
672
|
+
The graph class to return if create_using is None.
|
|
673
|
+
|
|
674
|
+
Returns
|
|
675
|
+
-------
|
|
676
|
+
create_using : graph class or instance
|
|
677
|
+
The provided graph class or instance, or if None, the `default` value.
|
|
678
|
+
|
|
679
|
+
Raises
|
|
680
|
+
------
|
|
681
|
+
NetworkXError
|
|
682
|
+
When `create_using` doesn't match the properties specified by `directed`
|
|
683
|
+
or `multigraph` parameters.
|
|
684
|
+
"""
|
|
685
|
+
if default is None:
|
|
686
|
+
default = nx.Graph
|
|
687
|
+
G = create_using if create_using is not None else default
|
|
688
|
+
|
|
689
|
+
G_directed = G.is_directed(None) if isinstance(G, type) else G.is_directed()
|
|
690
|
+
G_multigraph = G.is_multigraph(None) if isinstance(G, type) else G.is_multigraph()
|
|
691
|
+
|
|
692
|
+
if directed is not None:
|
|
693
|
+
if directed and not G_directed:
|
|
694
|
+
raise nx.NetworkXError("create_using must be directed")
|
|
695
|
+
if not directed and G_directed:
|
|
696
|
+
raise nx.NetworkXError("create_using must not be directed")
|
|
697
|
+
|
|
698
|
+
if multigraph is not None:
|
|
699
|
+
if multigraph and not G_multigraph:
|
|
700
|
+
raise nx.NetworkXError("create_using must be a multi-graph")
|
|
701
|
+
if not multigraph and G_multigraph:
|
|
702
|
+
raise nx.NetworkXError("create_using must not be a multi-graph")
|
|
703
|
+
return G
|