okstra 0.108.0 → 0.110.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/README.kr.md +1 -1
- package/README.md +1 -1
- package/docs/kr/architecture.md +3 -3
- package/docs/kr/cli.md +2 -2
- package/docs/project-structure-overview.md +3 -3
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/prompts/profiles/_common-contract.md +1 -1
- 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/worktree.py +14 -13
- package/runtime/python/okstra_project/__init__.py +2 -0
- package/runtime/python/okstra_project/state.py +36 -0
- 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/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,296 @@
|
|
|
1
|
+
"""Functions for computing sparsifiers of graphs."""
|
|
2
|
+
|
|
3
|
+
import math
|
|
4
|
+
|
|
5
|
+
import networkx as nx
|
|
6
|
+
from networkx.utils import not_implemented_for, py_random_state
|
|
7
|
+
|
|
8
|
+
__all__ = ["spanner"]
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@not_implemented_for("directed")
|
|
12
|
+
@not_implemented_for("multigraph")
|
|
13
|
+
@py_random_state(3)
|
|
14
|
+
@nx._dispatchable(edge_attrs="weight", returns_graph=True)
|
|
15
|
+
def spanner(G, stretch, weight=None, seed=None):
|
|
16
|
+
"""Returns a spanner of the given graph with the given stretch.
|
|
17
|
+
|
|
18
|
+
A spanner of a graph G = (V, E) with stretch t is a subgraph
|
|
19
|
+
H = (V, E_S) such that E_S is a subset of E and the distance between
|
|
20
|
+
any pair of nodes in H is at most t times the distance between the
|
|
21
|
+
nodes in G.
|
|
22
|
+
|
|
23
|
+
Parameters
|
|
24
|
+
----------
|
|
25
|
+
G : NetworkX graph
|
|
26
|
+
An undirected simple graph.
|
|
27
|
+
|
|
28
|
+
stretch : float
|
|
29
|
+
The stretch of the spanner.
|
|
30
|
+
|
|
31
|
+
weight : object
|
|
32
|
+
The edge attribute to use as distance.
|
|
33
|
+
|
|
34
|
+
seed : integer, random_state, or None (default)
|
|
35
|
+
Indicator of random number generation state.
|
|
36
|
+
See :ref:`Randomness<randomness>`.
|
|
37
|
+
|
|
38
|
+
Returns
|
|
39
|
+
-------
|
|
40
|
+
NetworkX graph
|
|
41
|
+
A spanner of the given graph with the given stretch.
|
|
42
|
+
|
|
43
|
+
Raises
|
|
44
|
+
------
|
|
45
|
+
ValueError
|
|
46
|
+
If a stretch less than 1 is given.
|
|
47
|
+
|
|
48
|
+
Notes
|
|
49
|
+
-----
|
|
50
|
+
This function implements the spanner algorithm by Baswana and Sen,
|
|
51
|
+
see [1].
|
|
52
|
+
|
|
53
|
+
This algorithm is a randomized las vegas algorithm: The expected
|
|
54
|
+
running time is O(km) where k = (stretch + 1) // 2 and m is the
|
|
55
|
+
number of edges in G. The returned graph is always a spanner of the
|
|
56
|
+
given graph with the specified stretch. For weighted graphs the
|
|
57
|
+
number of edges in the spanner is O(k * n^(1 + 1 / k)) where k is
|
|
58
|
+
defined as above and n is the number of nodes in G. For unweighted
|
|
59
|
+
graphs the number of edges is O(n^(1 + 1 / k) + kn).
|
|
60
|
+
|
|
61
|
+
References
|
|
62
|
+
----------
|
|
63
|
+
[1] S. Baswana, S. Sen. A Simple and Linear Time Randomized
|
|
64
|
+
Algorithm for Computing Sparse Spanners in Weighted Graphs.
|
|
65
|
+
Random Struct. Algorithms 30(4): 532-563 (2007).
|
|
66
|
+
"""
|
|
67
|
+
if stretch < 1:
|
|
68
|
+
raise ValueError("stretch must be at least 1")
|
|
69
|
+
|
|
70
|
+
k = (stretch + 1) // 2
|
|
71
|
+
|
|
72
|
+
# initialize spanner H with empty edge set
|
|
73
|
+
H = nx.empty_graph()
|
|
74
|
+
H.add_nodes_from(G.nodes)
|
|
75
|
+
|
|
76
|
+
# phase 1: forming the clusters
|
|
77
|
+
# the residual graph has V' from the paper as its node set
|
|
78
|
+
# and E' from the paper as its edge set
|
|
79
|
+
residual_graph = _setup_residual_graph(G, weight)
|
|
80
|
+
# clustering is a dictionary that maps nodes in a cluster to the
|
|
81
|
+
# cluster center
|
|
82
|
+
clustering = {v: v for v in G.nodes}
|
|
83
|
+
sample_prob = math.pow(G.number_of_nodes(), -1 / k)
|
|
84
|
+
size_limit = 2 * math.pow(G.number_of_nodes(), 1 + 1 / k)
|
|
85
|
+
|
|
86
|
+
i = 0
|
|
87
|
+
while i < k - 1:
|
|
88
|
+
# step 1: sample centers
|
|
89
|
+
sampled_centers = set()
|
|
90
|
+
for center in set(clustering.values()):
|
|
91
|
+
if seed.random() < sample_prob:
|
|
92
|
+
sampled_centers.add(center)
|
|
93
|
+
|
|
94
|
+
# combined loop for steps 2 and 3
|
|
95
|
+
edges_to_add = set()
|
|
96
|
+
edges_to_remove = set()
|
|
97
|
+
new_clustering = {}
|
|
98
|
+
for v in residual_graph.nodes:
|
|
99
|
+
if clustering[v] in sampled_centers:
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# step 2: find neighboring (sampled) clusters and
|
|
103
|
+
# lightest edges to them
|
|
104
|
+
lightest_edge_neighbor, lightest_edge_weight = _lightest_edge_dicts(
|
|
105
|
+
residual_graph, clustering, v
|
|
106
|
+
)
|
|
107
|
+
neighboring_sampled_centers = (
|
|
108
|
+
set(lightest_edge_weight.keys()) & sampled_centers
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
# step 3: add edges to spanner
|
|
112
|
+
if not neighboring_sampled_centers:
|
|
113
|
+
# connect to each neighboring center via lightest edge
|
|
114
|
+
for neighbor in lightest_edge_neighbor.values():
|
|
115
|
+
edges_to_add.add((v, neighbor))
|
|
116
|
+
# remove all incident edges
|
|
117
|
+
for neighbor in residual_graph.adj[v]:
|
|
118
|
+
edges_to_remove.add((v, neighbor))
|
|
119
|
+
|
|
120
|
+
else: # there is a neighboring sampled center
|
|
121
|
+
closest_center = min(
|
|
122
|
+
neighboring_sampled_centers, key=lightest_edge_weight.get
|
|
123
|
+
)
|
|
124
|
+
closest_center_weight = lightest_edge_weight[closest_center]
|
|
125
|
+
closest_center_neighbor = lightest_edge_neighbor[closest_center]
|
|
126
|
+
|
|
127
|
+
edges_to_add.add((v, closest_center_neighbor))
|
|
128
|
+
new_clustering[v] = closest_center
|
|
129
|
+
|
|
130
|
+
# connect to centers with edge weight less than
|
|
131
|
+
# closest_center_weight
|
|
132
|
+
for center, edge_weight in lightest_edge_weight.items():
|
|
133
|
+
if edge_weight < closest_center_weight:
|
|
134
|
+
neighbor = lightest_edge_neighbor[center]
|
|
135
|
+
edges_to_add.add((v, neighbor))
|
|
136
|
+
|
|
137
|
+
# remove edges to centers with edge weight less than
|
|
138
|
+
# closest_center_weight
|
|
139
|
+
for neighbor in residual_graph.adj[v]:
|
|
140
|
+
nbr_cluster = clustering[neighbor]
|
|
141
|
+
nbr_weight = lightest_edge_weight[nbr_cluster]
|
|
142
|
+
if (
|
|
143
|
+
nbr_cluster == closest_center
|
|
144
|
+
or nbr_weight < closest_center_weight
|
|
145
|
+
):
|
|
146
|
+
edges_to_remove.add((v, neighbor))
|
|
147
|
+
|
|
148
|
+
# check whether iteration added too many edges to spanner,
|
|
149
|
+
# if so repeat
|
|
150
|
+
if len(edges_to_add) > size_limit:
|
|
151
|
+
# an iteration is repeated O(1) times on expectation
|
|
152
|
+
continue
|
|
153
|
+
|
|
154
|
+
# iteration succeeded
|
|
155
|
+
i = i + 1
|
|
156
|
+
|
|
157
|
+
# actually add edges to spanner
|
|
158
|
+
for u, v in edges_to_add:
|
|
159
|
+
_add_edge_to_spanner(H, residual_graph, u, v, weight)
|
|
160
|
+
|
|
161
|
+
# actually delete edges from residual graph
|
|
162
|
+
residual_graph.remove_edges_from(edges_to_remove)
|
|
163
|
+
|
|
164
|
+
# copy old clustering data to new_clustering
|
|
165
|
+
for node, center in clustering.items():
|
|
166
|
+
if center in sampled_centers:
|
|
167
|
+
new_clustering[node] = center
|
|
168
|
+
clustering = new_clustering
|
|
169
|
+
|
|
170
|
+
# step 4: remove intra-cluster edges
|
|
171
|
+
for u in residual_graph.nodes:
|
|
172
|
+
for v in list(residual_graph.adj[u]):
|
|
173
|
+
if clustering[u] == clustering[v]:
|
|
174
|
+
residual_graph.remove_edge(u, v)
|
|
175
|
+
|
|
176
|
+
# update residual graph node set
|
|
177
|
+
for v in list(residual_graph.nodes):
|
|
178
|
+
if v not in clustering:
|
|
179
|
+
residual_graph.remove_node(v)
|
|
180
|
+
|
|
181
|
+
# phase 2: vertex-cluster joining
|
|
182
|
+
for v in residual_graph.nodes:
|
|
183
|
+
lightest_edge_neighbor, _ = _lightest_edge_dicts(residual_graph, clustering, v)
|
|
184
|
+
for neighbor in lightest_edge_neighbor.values():
|
|
185
|
+
_add_edge_to_spanner(H, residual_graph, v, neighbor, weight)
|
|
186
|
+
|
|
187
|
+
return H
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
def _setup_residual_graph(G, weight):
|
|
191
|
+
"""Setup residual graph as a copy of G with unique edges weights.
|
|
192
|
+
|
|
193
|
+
The node set of the residual graph corresponds to the set V' from
|
|
194
|
+
the Baswana-Sen paper and the edge set corresponds to the set E'
|
|
195
|
+
from the paper.
|
|
196
|
+
|
|
197
|
+
This function associates distinct weights to the edges of the
|
|
198
|
+
residual graph (even for unweighted input graphs), as required by
|
|
199
|
+
the algorithm.
|
|
200
|
+
|
|
201
|
+
Parameters
|
|
202
|
+
----------
|
|
203
|
+
G : NetworkX graph
|
|
204
|
+
An undirected simple graph.
|
|
205
|
+
|
|
206
|
+
weight : object
|
|
207
|
+
The edge attribute to use as distance.
|
|
208
|
+
|
|
209
|
+
Returns
|
|
210
|
+
-------
|
|
211
|
+
NetworkX graph
|
|
212
|
+
The residual graph used for the Baswana-Sen algorithm.
|
|
213
|
+
"""
|
|
214
|
+
residual_graph = G.copy()
|
|
215
|
+
|
|
216
|
+
# establish unique edge weights, even for unweighted graphs
|
|
217
|
+
for u, v in G.edges():
|
|
218
|
+
if not weight:
|
|
219
|
+
residual_graph[u][v]["weight"] = (id(u), id(v))
|
|
220
|
+
else:
|
|
221
|
+
residual_graph[u][v]["weight"] = (G[u][v][weight], id(u), id(v))
|
|
222
|
+
|
|
223
|
+
return residual_graph
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def _lightest_edge_dicts(residual_graph, clustering, node):
|
|
227
|
+
"""Find the lightest edge to each cluster.
|
|
228
|
+
|
|
229
|
+
Searches for the minimum-weight edge to each cluster adjacent to
|
|
230
|
+
the given node.
|
|
231
|
+
|
|
232
|
+
Parameters
|
|
233
|
+
----------
|
|
234
|
+
residual_graph : NetworkX graph
|
|
235
|
+
The residual graph used by the Baswana-Sen algorithm.
|
|
236
|
+
|
|
237
|
+
clustering : dictionary
|
|
238
|
+
The current clustering of the nodes.
|
|
239
|
+
|
|
240
|
+
node : node
|
|
241
|
+
The node from which the search originates.
|
|
242
|
+
|
|
243
|
+
Returns
|
|
244
|
+
-------
|
|
245
|
+
lightest_edge_neighbor, lightest_edge_weight : dictionary, dictionary
|
|
246
|
+
lightest_edge_neighbor is a dictionary that maps a center C to
|
|
247
|
+
a node v in the corresponding cluster such that the edge from
|
|
248
|
+
the given node to v is the lightest edge from the given node to
|
|
249
|
+
any node in cluster. lightest_edge_weight maps a center C to the
|
|
250
|
+
weight of the aforementioned edge.
|
|
251
|
+
|
|
252
|
+
Notes
|
|
253
|
+
-----
|
|
254
|
+
If a cluster has no node that is adjacent to the given node in the
|
|
255
|
+
residual graph then the center of the cluster is not a key in the
|
|
256
|
+
returned dictionaries.
|
|
257
|
+
"""
|
|
258
|
+
lightest_edge_neighbor = {}
|
|
259
|
+
lightest_edge_weight = {}
|
|
260
|
+
for neighbor in residual_graph.adj[node]:
|
|
261
|
+
nbr_center = clustering[neighbor]
|
|
262
|
+
weight = residual_graph[node][neighbor]["weight"]
|
|
263
|
+
if (
|
|
264
|
+
nbr_center not in lightest_edge_weight
|
|
265
|
+
or weight < lightest_edge_weight[nbr_center]
|
|
266
|
+
):
|
|
267
|
+
lightest_edge_neighbor[nbr_center] = neighbor
|
|
268
|
+
lightest_edge_weight[nbr_center] = weight
|
|
269
|
+
return lightest_edge_neighbor, lightest_edge_weight
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def _add_edge_to_spanner(H, residual_graph, u, v, weight):
|
|
273
|
+
"""Add the edge {u, v} to the spanner H and take weight from
|
|
274
|
+
the residual graph.
|
|
275
|
+
|
|
276
|
+
Parameters
|
|
277
|
+
----------
|
|
278
|
+
H : NetworkX graph
|
|
279
|
+
The spanner under construction.
|
|
280
|
+
|
|
281
|
+
residual_graph : NetworkX graph
|
|
282
|
+
The residual graph used by the Baswana-Sen algorithm. The weight
|
|
283
|
+
for the edge is taken from this graph.
|
|
284
|
+
|
|
285
|
+
u : node
|
|
286
|
+
One endpoint of the edge.
|
|
287
|
+
|
|
288
|
+
v : node
|
|
289
|
+
The other endpoint of the edge.
|
|
290
|
+
|
|
291
|
+
weight : object
|
|
292
|
+
The edge attribute to use as distance.
|
|
293
|
+
"""
|
|
294
|
+
H.add_edge(u, v)
|
|
295
|
+
if weight:
|
|
296
|
+
H[u][v][weight] = residual_graph[u][v]["weight"][0]
|
|
@@ -0,0 +1,374 @@
|
|
|
1
|
+
"""Functions for computing measures of structural holes."""
|
|
2
|
+
|
|
3
|
+
import networkx as nx
|
|
4
|
+
|
|
5
|
+
__all__ = ["constraint", "local_constraint", "effective_size"]
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@nx._dispatchable(edge_attrs="weight")
|
|
9
|
+
def mutual_weight(G, u, v, weight=None):
|
|
10
|
+
"""Returns the sum of the weights of the edge from `u` to `v` and
|
|
11
|
+
the edge from `v` to `u` in `G`.
|
|
12
|
+
|
|
13
|
+
`weight` is the edge data key that represents the edge weight. If
|
|
14
|
+
the specified key is `None` or is not in the edge data for an edge,
|
|
15
|
+
that edge is assumed to have weight 1.
|
|
16
|
+
|
|
17
|
+
Pre-conditions: `u` and `v` must both be in `G`.
|
|
18
|
+
|
|
19
|
+
"""
|
|
20
|
+
try:
|
|
21
|
+
a_uv = G[u][v].get(weight, 1)
|
|
22
|
+
except KeyError:
|
|
23
|
+
a_uv = 0
|
|
24
|
+
try:
|
|
25
|
+
a_vu = G[v][u].get(weight, 1)
|
|
26
|
+
except KeyError:
|
|
27
|
+
a_vu = 0
|
|
28
|
+
return a_uv + a_vu
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
@nx._dispatchable(edge_attrs="weight")
|
|
32
|
+
def normalized_mutual_weight(G, u, v, norm=sum, weight=None):
|
|
33
|
+
"""Returns normalized mutual weight of the edges from `u` to `v`
|
|
34
|
+
with respect to the mutual weights of the neighbors of `u` in `G`.
|
|
35
|
+
|
|
36
|
+
`norm` specifies how the normalization factor is computed. It must
|
|
37
|
+
be a function that takes a single argument and returns a number.
|
|
38
|
+
The argument will be an iterable of mutual weights
|
|
39
|
+
of pairs ``(u, w)``, where ``w`` ranges over each (in- and
|
|
40
|
+
out-)neighbor of ``u``. Commons values for `normalization` are
|
|
41
|
+
``sum`` and ``max``.
|
|
42
|
+
|
|
43
|
+
`weight` can be ``None`` or a string, if None, all edge weights
|
|
44
|
+
are considered equal. Otherwise holds the name of the edge
|
|
45
|
+
attribute used as weight.
|
|
46
|
+
|
|
47
|
+
"""
|
|
48
|
+
scale = norm(mutual_weight(G, u, w, weight) for w in set(nx.all_neighbors(G, u)))
|
|
49
|
+
return 0 if scale == 0 else mutual_weight(G, u, v, weight) / scale
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@nx._dispatchable(edge_attrs="weight")
|
|
53
|
+
def effective_size(G, nodes=None, weight=None):
|
|
54
|
+
r"""Returns the effective size of all nodes in the graph ``G``.
|
|
55
|
+
|
|
56
|
+
The *effective size* of a node's ego network is based on the concept
|
|
57
|
+
of redundancy. A person's ego network has redundancy to the extent
|
|
58
|
+
that her contacts are connected to each other as well. The
|
|
59
|
+
nonredundant part of a person's relationships is the effective
|
|
60
|
+
size of her ego network [1]_. Formally, the effective size of a
|
|
61
|
+
node $u$, denoted $e(u)$, is defined by
|
|
62
|
+
|
|
63
|
+
.. math::
|
|
64
|
+
|
|
65
|
+
e(u) = \sum_{v \in N(u) \setminus \{u\}}
|
|
66
|
+
\left(1 - \sum_{w \in N(v)} p_{uw} m_{vw}\right)
|
|
67
|
+
|
|
68
|
+
where $N(u)$ is the set of neighbors of $u$ and $p_{uw}$ is the
|
|
69
|
+
normalized mutual weight of the (directed or undirected) edges
|
|
70
|
+
joining $u$ and $v$, for each vertex $u$ and $v$ [1]_. And $m_{vw}$
|
|
71
|
+
is the mutual weight of $v$ and $w$ divided by $v$ highest mutual
|
|
72
|
+
weight with any of its neighbors. The *mutual weight* of $u$ and $v$
|
|
73
|
+
is the sum of the weights of edges joining them (edge weights are
|
|
74
|
+
assumed to be one if the graph is unweighted).
|
|
75
|
+
|
|
76
|
+
For the case of unweighted and undirected graphs, Borgatti proposed
|
|
77
|
+
a simplified formula to compute effective size [2]_
|
|
78
|
+
|
|
79
|
+
.. math::
|
|
80
|
+
|
|
81
|
+
e(u) = n - \frac{2t}{n}
|
|
82
|
+
|
|
83
|
+
where `t` is the number of ties in the ego network (not including
|
|
84
|
+
ties to ego) and `n` is the number of nodes (excluding ego).
|
|
85
|
+
|
|
86
|
+
Parameters
|
|
87
|
+
----------
|
|
88
|
+
G : NetworkX graph
|
|
89
|
+
The graph containing ``v``. Directed graphs are treated like
|
|
90
|
+
undirected graphs when computing neighbors of ``v``.
|
|
91
|
+
|
|
92
|
+
nodes : container, optional
|
|
93
|
+
Container of nodes in the graph ``G`` to compute the effective size.
|
|
94
|
+
If None, the effective size of every node is computed.
|
|
95
|
+
|
|
96
|
+
weight : None or string, optional
|
|
97
|
+
If None, all edge weights are considered equal.
|
|
98
|
+
Otherwise holds the name of the edge attribute used as weight.
|
|
99
|
+
|
|
100
|
+
Returns
|
|
101
|
+
-------
|
|
102
|
+
dict
|
|
103
|
+
Dictionary with nodes as keys and the effective size of the node as values.
|
|
104
|
+
|
|
105
|
+
Notes
|
|
106
|
+
-----
|
|
107
|
+
Isolated nodes, including nodes which only have self-loop edges, do not
|
|
108
|
+
have a well-defined effective size::
|
|
109
|
+
|
|
110
|
+
>>> G = nx.path_graph(3)
|
|
111
|
+
>>> G.add_edge(4, 4)
|
|
112
|
+
>>> nx.effective_size(G)
|
|
113
|
+
{0: 1.0, 1: 2.0, 2: 1.0, 4: nan}
|
|
114
|
+
|
|
115
|
+
Burt also defined the related concept of *efficiency* of a node's ego
|
|
116
|
+
network, which is its effective size divided by the degree of that
|
|
117
|
+
node [1]_. So you can easily compute efficiency:
|
|
118
|
+
|
|
119
|
+
>>> G = nx.DiGraph()
|
|
120
|
+
>>> G.add_edges_from([(0, 1), (0, 2), (1, 0), (2, 1)])
|
|
121
|
+
>>> esize = nx.effective_size(G)
|
|
122
|
+
>>> efficiency = {n: v / G.degree(n) for n, v in esize.items()}
|
|
123
|
+
|
|
124
|
+
See also
|
|
125
|
+
--------
|
|
126
|
+
constraint
|
|
127
|
+
|
|
128
|
+
References
|
|
129
|
+
----------
|
|
130
|
+
.. [1] Burt, Ronald S.
|
|
131
|
+
*Structural Holes: The Social Structure of Competition.*
|
|
132
|
+
Cambridge: Harvard University Press, 1995.
|
|
133
|
+
|
|
134
|
+
.. [2] Borgatti, S.
|
|
135
|
+
"Structural Holes: Unpacking Burt's Redundancy Measures"
|
|
136
|
+
CONNECTIONS 20(1):35-38.
|
|
137
|
+
http://www.analytictech.com/connections/v20(1)/holes.htm
|
|
138
|
+
|
|
139
|
+
"""
|
|
140
|
+
|
|
141
|
+
def redundancy(G, u, v, weight=None):
|
|
142
|
+
nmw = normalized_mutual_weight
|
|
143
|
+
r = sum(
|
|
144
|
+
nmw(G, u, w, weight=weight) * nmw(G, v, w, norm=max, weight=weight)
|
|
145
|
+
for w in set(nx.all_neighbors(G, u))
|
|
146
|
+
)
|
|
147
|
+
return 1 - r
|
|
148
|
+
|
|
149
|
+
# Check if scipy is available
|
|
150
|
+
try:
|
|
151
|
+
# Needed for errstate
|
|
152
|
+
import numpy as np
|
|
153
|
+
|
|
154
|
+
# make sure nx.adjacency_matrix will not raise
|
|
155
|
+
import scipy as sp
|
|
156
|
+
|
|
157
|
+
has_scipy = True
|
|
158
|
+
except:
|
|
159
|
+
has_scipy = False
|
|
160
|
+
|
|
161
|
+
if nodes is None and has_scipy:
|
|
162
|
+
# In order to compute constraint of all nodes,
|
|
163
|
+
# algorithms based on sparse matrices can be much faster
|
|
164
|
+
|
|
165
|
+
# Obtain the adjacency matrix
|
|
166
|
+
P = nx.adjacency_matrix(G, weight=weight)
|
|
167
|
+
|
|
168
|
+
# Calculate mutual weights
|
|
169
|
+
mutual_weights1 = P + P.T
|
|
170
|
+
mutual_weights2 = mutual_weights1.copy()
|
|
171
|
+
|
|
172
|
+
with np.errstate(divide="ignore"):
|
|
173
|
+
# Mutual_weights1 = Normalize mutual weights by row sums
|
|
174
|
+
mutual_weights1 /= mutual_weights1.sum(axis=1)[:, np.newaxis]
|
|
175
|
+
|
|
176
|
+
# Mutual_weights2 = Normalize mutual weights by row max
|
|
177
|
+
mutual_weights2 /= mutual_weights2.max(axis=1).toarray()
|
|
178
|
+
|
|
179
|
+
# Calculate effective sizes
|
|
180
|
+
r = 1 - (mutual_weights1 @ mutual_weights2.T).toarray()
|
|
181
|
+
effective_size = ((mutual_weights1 > 0) * r).sum(axis=1)
|
|
182
|
+
|
|
183
|
+
# Special treatment: isolated nodes (ignoring selfloops) marked with "nan"
|
|
184
|
+
sum_mutual_weights = mutual_weights1.sum(axis=1) - mutual_weights1.diagonal()
|
|
185
|
+
isolated_nodes = sum_mutual_weights == 0
|
|
186
|
+
effective_size[isolated_nodes] = float("nan")
|
|
187
|
+
# Use tolist() to automatically convert numpy scalars -> Python scalars
|
|
188
|
+
return dict(zip(G, effective_size.tolist()))
|
|
189
|
+
|
|
190
|
+
# Results for only requested nodes
|
|
191
|
+
effective_size = {}
|
|
192
|
+
if nodes is None:
|
|
193
|
+
nodes = G
|
|
194
|
+
# Use Borgatti's simplified formula for unweighted and undirected graphs
|
|
195
|
+
if not G.is_directed() and weight is None:
|
|
196
|
+
for v in nodes:
|
|
197
|
+
# Effective size is not defined for isolated nodes, including nodes
|
|
198
|
+
# with only self-edges
|
|
199
|
+
if all(u == v for u in G[v]):
|
|
200
|
+
effective_size[v] = float("nan")
|
|
201
|
+
continue
|
|
202
|
+
E = nx.ego_graph(G, v, center=False, undirected=True)
|
|
203
|
+
effective_size[v] = len(E) - (2 * E.size()) / len(E)
|
|
204
|
+
else:
|
|
205
|
+
for v in nodes:
|
|
206
|
+
# Effective size is not defined for isolated nodes, including nodes
|
|
207
|
+
# with only self-edges
|
|
208
|
+
if all(u == v for u in G[v]):
|
|
209
|
+
effective_size[v] = float("nan")
|
|
210
|
+
continue
|
|
211
|
+
effective_size[v] = sum(
|
|
212
|
+
redundancy(G, v, u, weight) for u in set(nx.all_neighbors(G, v))
|
|
213
|
+
)
|
|
214
|
+
return effective_size
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
@nx._dispatchable(edge_attrs="weight")
|
|
218
|
+
def constraint(G, nodes=None, weight=None):
|
|
219
|
+
r"""Returns the constraint on all nodes in the graph ``G``.
|
|
220
|
+
|
|
221
|
+
The *constraint* is a measure of the extent to which a node *v* is
|
|
222
|
+
invested in those nodes that are themselves invested in the
|
|
223
|
+
neighbors of *v*. Formally, the *constraint on v*, denoted `c(v)`,
|
|
224
|
+
is defined by
|
|
225
|
+
|
|
226
|
+
.. math::
|
|
227
|
+
|
|
228
|
+
c(v) = \sum_{w \in N(v) \setminus \{v\}} \ell(v, w)
|
|
229
|
+
|
|
230
|
+
where $N(v)$ is the subset of the neighbors of `v` that are either
|
|
231
|
+
predecessors or successors of `v` and $\ell(v, w)$ is the local
|
|
232
|
+
constraint on `v` with respect to `w` [1]_. For the definition of local
|
|
233
|
+
constraint, see :func:`local_constraint`.
|
|
234
|
+
|
|
235
|
+
Parameters
|
|
236
|
+
----------
|
|
237
|
+
G : NetworkX graph
|
|
238
|
+
The graph containing ``v``. This can be either directed or undirected.
|
|
239
|
+
|
|
240
|
+
nodes : container, optional
|
|
241
|
+
Container of nodes in the graph ``G`` to compute the constraint. If
|
|
242
|
+
None, the constraint of every node is computed.
|
|
243
|
+
|
|
244
|
+
weight : None or string, optional
|
|
245
|
+
If None, all edge weights are considered equal.
|
|
246
|
+
Otherwise holds the name of the edge attribute used as weight.
|
|
247
|
+
|
|
248
|
+
Returns
|
|
249
|
+
-------
|
|
250
|
+
dict
|
|
251
|
+
Dictionary with nodes as keys and the constraint on the node as values.
|
|
252
|
+
|
|
253
|
+
See also
|
|
254
|
+
--------
|
|
255
|
+
local_constraint
|
|
256
|
+
|
|
257
|
+
References
|
|
258
|
+
----------
|
|
259
|
+
.. [1] Burt, Ronald S.
|
|
260
|
+
"Structural holes and good ideas".
|
|
261
|
+
American Journal of Sociology (110): 349–399.
|
|
262
|
+
|
|
263
|
+
"""
|
|
264
|
+
|
|
265
|
+
# Check if scipy is available
|
|
266
|
+
try:
|
|
267
|
+
# Needed for errstate
|
|
268
|
+
import numpy as np
|
|
269
|
+
|
|
270
|
+
# make sure nx.adjacency_matrix will not raise
|
|
271
|
+
import scipy as sp
|
|
272
|
+
|
|
273
|
+
has_scipy = True
|
|
274
|
+
except:
|
|
275
|
+
has_scipy = False
|
|
276
|
+
|
|
277
|
+
if nodes is None and has_scipy:
|
|
278
|
+
# In order to compute constraint of all nodes,
|
|
279
|
+
# algorithms based on sparse matrices can be much faster
|
|
280
|
+
|
|
281
|
+
# Obtain the adjacency matrix
|
|
282
|
+
P = nx.adjacency_matrix(G, weight=weight)
|
|
283
|
+
|
|
284
|
+
# Calculate mutual weights
|
|
285
|
+
mutual_weights = P + P.T
|
|
286
|
+
|
|
287
|
+
# Normalize mutual weights by row sums
|
|
288
|
+
sum_mutual_weights = mutual_weights.sum(axis=1)
|
|
289
|
+
with np.errstate(divide="ignore"):
|
|
290
|
+
mutual_weights /= sum_mutual_weights[:, np.newaxis]
|
|
291
|
+
|
|
292
|
+
# Calculate local constraints and constraints
|
|
293
|
+
local_constraints = (mutual_weights + mutual_weights @ mutual_weights) ** 2
|
|
294
|
+
constraints = ((mutual_weights > 0) * local_constraints).sum(axis=1)
|
|
295
|
+
|
|
296
|
+
# Special treatment: isolated nodes marked with "nan"
|
|
297
|
+
isolated_nodes = sum_mutual_weights - 2 * mutual_weights.diagonal() == 0
|
|
298
|
+
constraints[isolated_nodes] = float("nan")
|
|
299
|
+
# Use tolist() to automatically convert numpy scalars -> Python scalars
|
|
300
|
+
return dict(zip(G, constraints.tolist()))
|
|
301
|
+
|
|
302
|
+
# Result for only requested nodes
|
|
303
|
+
constraint = {}
|
|
304
|
+
if nodes is None:
|
|
305
|
+
nodes = G
|
|
306
|
+
for v in nodes:
|
|
307
|
+
# Constraint is not defined for isolated nodes
|
|
308
|
+
if len(G[v]) == 0:
|
|
309
|
+
constraint[v] = float("nan")
|
|
310
|
+
continue
|
|
311
|
+
constraint[v] = sum(
|
|
312
|
+
local_constraint(G, v, n, weight) for n in set(nx.all_neighbors(G, v))
|
|
313
|
+
)
|
|
314
|
+
return constraint
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
@nx._dispatchable(edge_attrs="weight")
|
|
318
|
+
def local_constraint(G, u, v, weight=None):
|
|
319
|
+
r"""Returns the local constraint on the node ``u`` with respect to
|
|
320
|
+
the node ``v`` in the graph ``G``.
|
|
321
|
+
|
|
322
|
+
Formally, the *local constraint on u with respect to v*, denoted
|
|
323
|
+
$\ell(u, v)$, is defined by
|
|
324
|
+
|
|
325
|
+
.. math::
|
|
326
|
+
|
|
327
|
+
\ell(u, v) = \left(p_{uv} + \sum_{w \in N(v)} p_{uw} p_{wv}\right)^2,
|
|
328
|
+
|
|
329
|
+
where $N(v)$ is the set of neighbors of $v$ and $p_{uv}$ is the
|
|
330
|
+
normalized mutual weight of the (directed or undirected) edges
|
|
331
|
+
joining $u$ and $v$, for each vertex $u$ and $v$ [1]_. The *mutual
|
|
332
|
+
weight* of $u$ and $v$ is the sum of the weights of edges joining
|
|
333
|
+
them (edge weights are assumed to be one if the graph is
|
|
334
|
+
unweighted).
|
|
335
|
+
|
|
336
|
+
Parameters
|
|
337
|
+
----------
|
|
338
|
+
G : NetworkX graph
|
|
339
|
+
The graph containing ``u`` and ``v``. This can be either
|
|
340
|
+
directed or undirected.
|
|
341
|
+
|
|
342
|
+
u : node
|
|
343
|
+
A node in the graph ``G``.
|
|
344
|
+
|
|
345
|
+
v : node
|
|
346
|
+
A node in the graph ``G``.
|
|
347
|
+
|
|
348
|
+
weight : None or string, optional
|
|
349
|
+
If None, all edge weights are considered equal.
|
|
350
|
+
Otherwise holds the name of the edge attribute used as weight.
|
|
351
|
+
|
|
352
|
+
Returns
|
|
353
|
+
-------
|
|
354
|
+
float
|
|
355
|
+
The constraint of the node ``v`` in the graph ``G``.
|
|
356
|
+
|
|
357
|
+
See also
|
|
358
|
+
--------
|
|
359
|
+
constraint
|
|
360
|
+
|
|
361
|
+
References
|
|
362
|
+
----------
|
|
363
|
+
.. [1] Burt, Ronald S.
|
|
364
|
+
"Structural holes and good ideas".
|
|
365
|
+
American Journal of Sociology (110): 349–399.
|
|
366
|
+
|
|
367
|
+
"""
|
|
368
|
+
nmw = normalized_mutual_weight
|
|
369
|
+
direct = nmw(G, u, v, weight=weight)
|
|
370
|
+
indirect = sum(
|
|
371
|
+
nmw(G, u, w, weight=weight) * nmw(G, w, v, weight=weight)
|
|
372
|
+
for w in set(nx.all_neighbors(G, u))
|
|
373
|
+
)
|
|
374
|
+
return (direct + indirect) ** 2
|