okstra 0.108.0 → 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/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_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,352 @@
|
|
|
1
|
+
"""Functions which help end users define customize node_match and
|
|
2
|
+
edge_match functions to use during isomorphism checks.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import math
|
|
6
|
+
import types
|
|
7
|
+
from itertools import permutations
|
|
8
|
+
|
|
9
|
+
__all__ = [
|
|
10
|
+
"categorical_node_match",
|
|
11
|
+
"categorical_edge_match",
|
|
12
|
+
"categorical_multiedge_match",
|
|
13
|
+
"numerical_node_match",
|
|
14
|
+
"numerical_edge_match",
|
|
15
|
+
"numerical_multiedge_match",
|
|
16
|
+
"generic_node_match",
|
|
17
|
+
"generic_edge_match",
|
|
18
|
+
"generic_multiedge_match",
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def copyfunc(f, name=None):
|
|
23
|
+
"""Returns a deepcopy of a function."""
|
|
24
|
+
return types.FunctionType(
|
|
25
|
+
f.__code__, f.__globals__, name or f.__name__, f.__defaults__, f.__closure__
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def allclose(x, y, rtol=1.0000000000000001e-05, atol=1e-08):
|
|
30
|
+
"""Returns True if x and y are sufficiently close, elementwise.
|
|
31
|
+
|
|
32
|
+
Parameters
|
|
33
|
+
----------
|
|
34
|
+
rtol : float
|
|
35
|
+
The relative error tolerance.
|
|
36
|
+
atol : float
|
|
37
|
+
The absolute error tolerance.
|
|
38
|
+
|
|
39
|
+
"""
|
|
40
|
+
# assume finite weights, see numpy.allclose() for reference
|
|
41
|
+
return all(math.isclose(xi, yi, rel_tol=rtol, abs_tol=atol) for xi, yi in zip(x, y))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
categorical_doc = """
|
|
45
|
+
Returns a comparison function for a categorical node attribute.
|
|
46
|
+
|
|
47
|
+
The value(s) of the attr(s) must be hashable and comparable via the ==
|
|
48
|
+
operator since they are placed into a set([]) object. If the sets from
|
|
49
|
+
G1 and G2 are the same, then the constructed function returns True.
|
|
50
|
+
|
|
51
|
+
Parameters
|
|
52
|
+
----------
|
|
53
|
+
attr : string | list
|
|
54
|
+
The categorical node attribute to compare, or a list of categorical
|
|
55
|
+
node attributes to compare.
|
|
56
|
+
default : value | list
|
|
57
|
+
The default value for the categorical node attribute, or a list of
|
|
58
|
+
default values for the categorical node attributes.
|
|
59
|
+
|
|
60
|
+
Returns
|
|
61
|
+
-------
|
|
62
|
+
match : function
|
|
63
|
+
The customized, categorical `node_match` function.
|
|
64
|
+
|
|
65
|
+
Examples
|
|
66
|
+
--------
|
|
67
|
+
>>> import networkx.algorithms.isomorphism as iso
|
|
68
|
+
>>> nm = iso.categorical_node_match("size", 1)
|
|
69
|
+
>>> nm = iso.categorical_node_match(["color", "size"], ["red", 2])
|
|
70
|
+
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def categorical_node_match(attr, default):
|
|
75
|
+
if isinstance(attr, str):
|
|
76
|
+
|
|
77
|
+
def match(data1, data2):
|
|
78
|
+
return data1.get(attr, default) == data2.get(attr, default)
|
|
79
|
+
|
|
80
|
+
else:
|
|
81
|
+
attrs = list(zip(attr, default)) # Python 3
|
|
82
|
+
|
|
83
|
+
def match(data1, data2):
|
|
84
|
+
return all(data1.get(attr, d) == data2.get(attr, d) for attr, d in attrs)
|
|
85
|
+
|
|
86
|
+
return match
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
categorical_edge_match = copyfunc(categorical_node_match, "categorical_edge_match")
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def categorical_multiedge_match(attr, default):
|
|
93
|
+
if isinstance(attr, str):
|
|
94
|
+
|
|
95
|
+
def match(datasets1, datasets2):
|
|
96
|
+
values1 = {data.get(attr, default) for data in datasets1.values()}
|
|
97
|
+
values2 = {data.get(attr, default) for data in datasets2.values()}
|
|
98
|
+
return values1 == values2
|
|
99
|
+
|
|
100
|
+
else:
|
|
101
|
+
attrs = list(zip(attr, default)) # Python 3
|
|
102
|
+
|
|
103
|
+
def match(datasets1, datasets2):
|
|
104
|
+
values1 = set()
|
|
105
|
+
for data1 in datasets1.values():
|
|
106
|
+
x = tuple(data1.get(attr, d) for attr, d in attrs)
|
|
107
|
+
values1.add(x)
|
|
108
|
+
values2 = set()
|
|
109
|
+
for data2 in datasets2.values():
|
|
110
|
+
x = tuple(data2.get(attr, d) for attr, d in attrs)
|
|
111
|
+
values2.add(x)
|
|
112
|
+
return values1 == values2
|
|
113
|
+
|
|
114
|
+
return match
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
# Docstrings for categorical functions.
|
|
118
|
+
categorical_node_match.__doc__ = categorical_doc
|
|
119
|
+
categorical_edge_match.__doc__ = categorical_doc.replace("node", "edge")
|
|
120
|
+
tmpdoc = categorical_doc.replace("node", "edge")
|
|
121
|
+
tmpdoc = tmpdoc.replace("categorical_edge_match", "categorical_multiedge_match")
|
|
122
|
+
categorical_multiedge_match.__doc__ = tmpdoc
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
numerical_doc = """
|
|
126
|
+
Returns a comparison function for a numerical node attribute.
|
|
127
|
+
|
|
128
|
+
The value(s) of the attr(s) must be numerical and sortable. If the
|
|
129
|
+
sorted list of values from G1 and G2 are the same within some
|
|
130
|
+
tolerance, then the constructed function returns True.
|
|
131
|
+
|
|
132
|
+
Parameters
|
|
133
|
+
----------
|
|
134
|
+
attr : string | list
|
|
135
|
+
The numerical node attribute to compare, or a list of numerical
|
|
136
|
+
node attributes to compare.
|
|
137
|
+
default : value | list
|
|
138
|
+
The default value for the numerical node attribute, or a list of
|
|
139
|
+
default values for the numerical node attributes.
|
|
140
|
+
rtol : float
|
|
141
|
+
The relative error tolerance.
|
|
142
|
+
atol : float
|
|
143
|
+
The absolute error tolerance.
|
|
144
|
+
|
|
145
|
+
Returns
|
|
146
|
+
-------
|
|
147
|
+
match : function
|
|
148
|
+
The customized, numerical `node_match` function.
|
|
149
|
+
|
|
150
|
+
Examples
|
|
151
|
+
--------
|
|
152
|
+
>>> import networkx.algorithms.isomorphism as iso
|
|
153
|
+
>>> nm = iso.numerical_node_match("weight", 1.0)
|
|
154
|
+
>>> nm = iso.numerical_node_match(["weight", "linewidth"], [0.25, 0.5])
|
|
155
|
+
|
|
156
|
+
"""
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def numerical_node_match(attr, default, rtol=1.0000000000000001e-05, atol=1e-08):
|
|
160
|
+
if isinstance(attr, str):
|
|
161
|
+
|
|
162
|
+
def match(data1, data2):
|
|
163
|
+
return math.isclose(
|
|
164
|
+
data1.get(attr, default),
|
|
165
|
+
data2.get(attr, default),
|
|
166
|
+
rel_tol=rtol,
|
|
167
|
+
abs_tol=atol,
|
|
168
|
+
)
|
|
169
|
+
|
|
170
|
+
else:
|
|
171
|
+
attrs = list(zip(attr, default)) # Python 3
|
|
172
|
+
|
|
173
|
+
def match(data1, data2):
|
|
174
|
+
values1 = [data1.get(attr, d) for attr, d in attrs]
|
|
175
|
+
values2 = [data2.get(attr, d) for attr, d in attrs]
|
|
176
|
+
return allclose(values1, values2, rtol=rtol, atol=atol)
|
|
177
|
+
|
|
178
|
+
return match
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
numerical_edge_match = copyfunc(numerical_node_match, "numerical_edge_match")
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def numerical_multiedge_match(attr, default, rtol=1.0000000000000001e-05, atol=1e-08):
|
|
185
|
+
if isinstance(attr, str):
|
|
186
|
+
|
|
187
|
+
def match(datasets1, datasets2):
|
|
188
|
+
values1 = sorted(data.get(attr, default) for data in datasets1.values())
|
|
189
|
+
values2 = sorted(data.get(attr, default) for data in datasets2.values())
|
|
190
|
+
return allclose(values1, values2, rtol=rtol, atol=atol)
|
|
191
|
+
|
|
192
|
+
else:
|
|
193
|
+
attrs = list(zip(attr, default)) # Python 3
|
|
194
|
+
|
|
195
|
+
def match(datasets1, datasets2):
|
|
196
|
+
values1 = []
|
|
197
|
+
for data1 in datasets1.values():
|
|
198
|
+
x = tuple(data1.get(attr, d) for attr, d in attrs)
|
|
199
|
+
values1.append(x)
|
|
200
|
+
values2 = []
|
|
201
|
+
for data2 in datasets2.values():
|
|
202
|
+
x = tuple(data2.get(attr, d) for attr, d in attrs)
|
|
203
|
+
values2.append(x)
|
|
204
|
+
values1.sort()
|
|
205
|
+
values2.sort()
|
|
206
|
+
for xi, yi in zip(values1, values2):
|
|
207
|
+
if not allclose(xi, yi, rtol=rtol, atol=atol):
|
|
208
|
+
return False
|
|
209
|
+
else:
|
|
210
|
+
return True
|
|
211
|
+
|
|
212
|
+
return match
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
# Docstrings for numerical functions.
|
|
216
|
+
numerical_node_match.__doc__ = numerical_doc
|
|
217
|
+
numerical_edge_match.__doc__ = numerical_doc.replace("node", "edge")
|
|
218
|
+
tmpdoc = numerical_doc.replace("node", "edge")
|
|
219
|
+
tmpdoc = tmpdoc.replace("numerical_edge_match", "numerical_multiedge_match")
|
|
220
|
+
numerical_multiedge_match.__doc__ = tmpdoc
|
|
221
|
+
|
|
222
|
+
|
|
223
|
+
generic_doc = """
|
|
224
|
+
Returns a comparison function for a generic attribute.
|
|
225
|
+
|
|
226
|
+
The value(s) of the attr(s) are compared using the specified
|
|
227
|
+
operators. If all the attributes are equal, then the constructed
|
|
228
|
+
function returns True.
|
|
229
|
+
|
|
230
|
+
Parameters
|
|
231
|
+
----------
|
|
232
|
+
attr : string | list
|
|
233
|
+
The node attribute to compare, or a list of node attributes
|
|
234
|
+
to compare.
|
|
235
|
+
default : value | list
|
|
236
|
+
The default value for the node attribute, or a list of
|
|
237
|
+
default values for the node attributes.
|
|
238
|
+
op : callable | list
|
|
239
|
+
The operator to use when comparing attribute values, or a list
|
|
240
|
+
of operators to use when comparing values for each attribute.
|
|
241
|
+
|
|
242
|
+
Returns
|
|
243
|
+
-------
|
|
244
|
+
match : function
|
|
245
|
+
The customized, generic `node_match` function.
|
|
246
|
+
|
|
247
|
+
Examples
|
|
248
|
+
--------
|
|
249
|
+
>>> from operator import eq
|
|
250
|
+
>>> from math import isclose
|
|
251
|
+
>>> from networkx.algorithms.isomorphism import generic_node_match
|
|
252
|
+
>>> nm = generic_node_match("weight", 1.0, isclose)
|
|
253
|
+
>>> nm = generic_node_match("color", "red", eq)
|
|
254
|
+
>>> nm = generic_node_match(["weight", "color"], [1.0, "red"], [isclose, eq])
|
|
255
|
+
|
|
256
|
+
"""
|
|
257
|
+
|
|
258
|
+
|
|
259
|
+
def generic_node_match(attr, default, op):
|
|
260
|
+
if isinstance(attr, str):
|
|
261
|
+
|
|
262
|
+
def match(data1, data2):
|
|
263
|
+
return op(data1.get(attr, default), data2.get(attr, default))
|
|
264
|
+
|
|
265
|
+
else:
|
|
266
|
+
attrs = list(zip(attr, default, op)) # Python 3
|
|
267
|
+
|
|
268
|
+
def match(data1, data2):
|
|
269
|
+
for attr, d, operator in attrs:
|
|
270
|
+
if not operator(data1.get(attr, d), data2.get(attr, d)):
|
|
271
|
+
return False
|
|
272
|
+
else:
|
|
273
|
+
return True
|
|
274
|
+
|
|
275
|
+
return match
|
|
276
|
+
|
|
277
|
+
|
|
278
|
+
generic_edge_match = copyfunc(generic_node_match, "generic_edge_match")
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def generic_multiedge_match(attr, default, op):
|
|
282
|
+
"""Returns a comparison function for a generic attribute.
|
|
283
|
+
|
|
284
|
+
The value(s) of the attr(s) are compared using the specified
|
|
285
|
+
operators. If all the attributes are equal, then the constructed
|
|
286
|
+
function returns True. Potentially, the constructed edge_match
|
|
287
|
+
function can be slow since it must verify that no isomorphism
|
|
288
|
+
exists between the multiedges before it returns False.
|
|
289
|
+
|
|
290
|
+
Parameters
|
|
291
|
+
----------
|
|
292
|
+
attr : string | list
|
|
293
|
+
The edge attribute to compare, or a list of node attributes
|
|
294
|
+
to compare.
|
|
295
|
+
default : value | list
|
|
296
|
+
The default value for the edge attribute, or a list of
|
|
297
|
+
default values for the edgeattributes.
|
|
298
|
+
op : callable | list
|
|
299
|
+
The operator to use when comparing attribute values, or a list
|
|
300
|
+
of operators to use when comparing values for each attribute.
|
|
301
|
+
|
|
302
|
+
Returns
|
|
303
|
+
-------
|
|
304
|
+
match : function
|
|
305
|
+
The customized, generic `edge_match` function.
|
|
306
|
+
|
|
307
|
+
Examples
|
|
308
|
+
--------
|
|
309
|
+
>>> from operator import eq
|
|
310
|
+
>>> from math import isclose
|
|
311
|
+
>>> from networkx.algorithms.isomorphism import generic_node_match
|
|
312
|
+
>>> nm = generic_node_match("weight", 1.0, isclose)
|
|
313
|
+
>>> nm = generic_node_match("color", "red", eq)
|
|
314
|
+
>>> nm = generic_node_match(["weight", "color"], [1.0, "red"], [isclose, eq])
|
|
315
|
+
|
|
316
|
+
"""
|
|
317
|
+
|
|
318
|
+
# This is slow, but generic.
|
|
319
|
+
# We must test every possible isomorphism between the edges.
|
|
320
|
+
if isinstance(attr, str):
|
|
321
|
+
attr = [attr]
|
|
322
|
+
default = [default]
|
|
323
|
+
op = [op]
|
|
324
|
+
attrs = list(zip(attr, default)) # Python 3
|
|
325
|
+
|
|
326
|
+
def match(datasets1, datasets2):
|
|
327
|
+
values1 = []
|
|
328
|
+
for data1 in datasets1.values():
|
|
329
|
+
x = tuple(data1.get(attr, d) for attr, d in attrs)
|
|
330
|
+
values1.append(x)
|
|
331
|
+
values2 = []
|
|
332
|
+
for data2 in datasets2.values():
|
|
333
|
+
x = tuple(data2.get(attr, d) for attr, d in attrs)
|
|
334
|
+
values2.append(x)
|
|
335
|
+
for vals2 in permutations(values2):
|
|
336
|
+
for xi, yi in zip(values1, vals2):
|
|
337
|
+
if not all(map(lambda x, y, z: z(x, y), xi, yi, op)):
|
|
338
|
+
# This is not an isomorphism, go to next permutation.
|
|
339
|
+
break
|
|
340
|
+
else:
|
|
341
|
+
# Then we found an isomorphism.
|
|
342
|
+
return True
|
|
343
|
+
else:
|
|
344
|
+
# Then there are no isomorphisms between the multiedges.
|
|
345
|
+
return False
|
|
346
|
+
|
|
347
|
+
return match
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
# Docstrings for numerical functions.
|
|
351
|
+
generic_node_match.__doc__ = generic_doc
|
|
352
|
+
generic_edge_match.__doc__ = generic_doc.replace("node", "edge")
|
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
"""
|
|
2
|
+
*****************************
|
|
3
|
+
Time-respecting VF2 Algorithm
|
|
4
|
+
*****************************
|
|
5
|
+
|
|
6
|
+
An extension of the VF2 algorithm for time-respecting graph isomorphism
|
|
7
|
+
testing in temporal graphs.
|
|
8
|
+
|
|
9
|
+
A temporal graph is one in which edges contain a datetime attribute,
|
|
10
|
+
denoting when interaction occurred between the incident nodes. A
|
|
11
|
+
time-respecting subgraph of a temporal graph is a subgraph such that
|
|
12
|
+
all interactions incident to a node occurred within a time threshold,
|
|
13
|
+
delta, of each other. A directed time-respecting subgraph has the
|
|
14
|
+
added constraint that incoming interactions to a node must precede
|
|
15
|
+
outgoing interactions from the same node - this enforces a sense of
|
|
16
|
+
directed flow.
|
|
17
|
+
|
|
18
|
+
Introduction
|
|
19
|
+
------------
|
|
20
|
+
|
|
21
|
+
The TimeRespectingGraphMatcher and TimeRespectingDiGraphMatcher
|
|
22
|
+
extend the GraphMatcher and DiGraphMatcher classes, respectively,
|
|
23
|
+
to include temporal constraints on matches. This is achieved through
|
|
24
|
+
a semantic check, via the semantic_feasibility() function.
|
|
25
|
+
|
|
26
|
+
As well as including G1 (the graph in which to seek embeddings) and
|
|
27
|
+
G2 (the subgraph structure of interest), the name of the temporal
|
|
28
|
+
attribute on the edges and the time threshold, delta, must be supplied
|
|
29
|
+
as arguments to the matching constructors.
|
|
30
|
+
|
|
31
|
+
A delta of zero is the strictest temporal constraint on the match -
|
|
32
|
+
only embeddings in which all interactions occur at the same time will
|
|
33
|
+
be returned. A delta of one day will allow embeddings in which
|
|
34
|
+
adjacent interactions occur up to a day apart.
|
|
35
|
+
|
|
36
|
+
Examples
|
|
37
|
+
--------
|
|
38
|
+
|
|
39
|
+
Examples will be provided when the datetime type has been incorporated.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
Temporal Subgraph Isomorphism
|
|
43
|
+
-----------------------------
|
|
44
|
+
|
|
45
|
+
A brief discussion of the somewhat diverse current literature will be
|
|
46
|
+
included here.
|
|
47
|
+
|
|
48
|
+
References
|
|
49
|
+
----------
|
|
50
|
+
|
|
51
|
+
[1] Redmond, U. and Cunningham, P. Temporal subgraph isomorphism. In:
|
|
52
|
+
The 2013 IEEE/ACM International Conference on Advances in Social
|
|
53
|
+
Networks Analysis and Mining (ASONAM). Niagara Falls, Canada; 2013:
|
|
54
|
+
pages 1451 - 1452. [65]
|
|
55
|
+
|
|
56
|
+
For a discussion of the literature on temporal networks:
|
|
57
|
+
|
|
58
|
+
[3] P. Holme and J. Saramaki. Temporal networks. Physics Reports,
|
|
59
|
+
519(3):97–125, 2012.
|
|
60
|
+
|
|
61
|
+
Notes
|
|
62
|
+
-----
|
|
63
|
+
|
|
64
|
+
Handles directed and undirected graphs and graphs with parallel edges.
|
|
65
|
+
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
import networkx as nx
|
|
69
|
+
|
|
70
|
+
from .isomorphvf2 import DiGraphMatcher, GraphMatcher
|
|
71
|
+
|
|
72
|
+
__all__ = ["TimeRespectingGraphMatcher", "TimeRespectingDiGraphMatcher"]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class TimeRespectingGraphMatcher(GraphMatcher):
|
|
76
|
+
def __init__(self, G1, G2, temporal_attribute_name, delta):
|
|
77
|
+
"""Initialize TimeRespectingGraphMatcher.
|
|
78
|
+
|
|
79
|
+
G1 and G2 should be nx.Graph or nx.MultiGraph instances.
|
|
80
|
+
|
|
81
|
+
Examples
|
|
82
|
+
--------
|
|
83
|
+
To create a TimeRespectingGraphMatcher which checks for
|
|
84
|
+
syntactic and semantic feasibility:
|
|
85
|
+
|
|
86
|
+
>>> from networkx.algorithms import isomorphism
|
|
87
|
+
>>> from datetime import timedelta
|
|
88
|
+
>>> G1 = nx.Graph(nx.path_graph(4, create_using=nx.Graph()))
|
|
89
|
+
|
|
90
|
+
>>> G2 = nx.Graph(nx.path_graph(4, create_using=nx.Graph()))
|
|
91
|
+
|
|
92
|
+
>>> GM = isomorphism.TimeRespectingGraphMatcher(
|
|
93
|
+
... G1, G2, "date", timedelta(days=1)
|
|
94
|
+
... )
|
|
95
|
+
"""
|
|
96
|
+
self.temporal_attribute_name = temporal_attribute_name
|
|
97
|
+
self.delta = delta
|
|
98
|
+
super().__init__(G1, G2)
|
|
99
|
+
|
|
100
|
+
def one_hop(self, Gx, Gx_node, neighbors):
|
|
101
|
+
"""
|
|
102
|
+
Edges one hop out from a node in the mapping should be
|
|
103
|
+
time-respecting with respect to each other.
|
|
104
|
+
"""
|
|
105
|
+
dates = []
|
|
106
|
+
for n in neighbors:
|
|
107
|
+
if isinstance(Gx, nx.Graph): # Graph G[u][v] returns the data dictionary.
|
|
108
|
+
dates.append(Gx[Gx_node][n][self.temporal_attribute_name])
|
|
109
|
+
else: # MultiGraph G[u][v] returns a dictionary of key -> data dictionary.
|
|
110
|
+
for edge in Gx[Gx_node][
|
|
111
|
+
n
|
|
112
|
+
].values(): # Iterates all edges between node pair.
|
|
113
|
+
dates.append(edge[self.temporal_attribute_name])
|
|
114
|
+
if any(x is None for x in dates):
|
|
115
|
+
raise ValueError("Datetime not supplied for at least one edge.")
|
|
116
|
+
return not dates or max(dates) - min(dates) <= self.delta
|
|
117
|
+
|
|
118
|
+
def two_hop(self, Gx, core_x, Gx_node, neighbors):
|
|
119
|
+
"""
|
|
120
|
+
Paths of length 2 from Gx_node should be time-respecting.
|
|
121
|
+
"""
|
|
122
|
+
return all(
|
|
123
|
+
self.one_hop(Gx, v, [n for n in Gx[v] if n in core_x] + [Gx_node])
|
|
124
|
+
for v in neighbors
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
def semantic_feasibility(self, G1_node, G2_node):
|
|
128
|
+
"""Returns True if adding (G1_node, G2_node) is semantically
|
|
129
|
+
feasible.
|
|
130
|
+
|
|
131
|
+
Any subclass which redefines semantic_feasibility() must
|
|
132
|
+
maintain the self.tests if needed, to keep the match() method
|
|
133
|
+
functional. Implementations should consider multigraphs.
|
|
134
|
+
"""
|
|
135
|
+
neighbors = [n for n in self.G1[G1_node] if n in self.core_1]
|
|
136
|
+
if not self.one_hop(self.G1, G1_node, neighbors): # Fail fast on first node.
|
|
137
|
+
return False
|
|
138
|
+
if not self.two_hop(self.G1, self.core_1, G1_node, neighbors):
|
|
139
|
+
return False
|
|
140
|
+
# Otherwise, this node is semantically feasible!
|
|
141
|
+
return True
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
class TimeRespectingDiGraphMatcher(DiGraphMatcher):
|
|
145
|
+
def __init__(self, G1, G2, temporal_attribute_name, delta):
|
|
146
|
+
"""Initialize TimeRespectingDiGraphMatcher.
|
|
147
|
+
|
|
148
|
+
G1 and G2 should be nx.DiGraph or nx.MultiDiGraph instances.
|
|
149
|
+
|
|
150
|
+
Examples
|
|
151
|
+
--------
|
|
152
|
+
To create a TimeRespectingDiGraphMatcher which checks for
|
|
153
|
+
syntactic and semantic feasibility:
|
|
154
|
+
|
|
155
|
+
>>> from networkx.algorithms import isomorphism
|
|
156
|
+
>>> from datetime import timedelta
|
|
157
|
+
>>> G1 = nx.DiGraph(nx.path_graph(4, create_using=nx.DiGraph()))
|
|
158
|
+
|
|
159
|
+
>>> G2 = nx.DiGraph(nx.path_graph(4, create_using=nx.DiGraph()))
|
|
160
|
+
|
|
161
|
+
>>> GM = isomorphism.TimeRespectingDiGraphMatcher(
|
|
162
|
+
... G1, G2, "date", timedelta(days=1)
|
|
163
|
+
... )
|
|
164
|
+
"""
|
|
165
|
+
self.temporal_attribute_name = temporal_attribute_name
|
|
166
|
+
self.delta = delta
|
|
167
|
+
super().__init__(G1, G2)
|
|
168
|
+
|
|
169
|
+
def get_pred_dates(self, Gx, Gx_node, core_x, pred):
|
|
170
|
+
"""
|
|
171
|
+
Get the dates of edges from predecessors.
|
|
172
|
+
"""
|
|
173
|
+
pred_dates = []
|
|
174
|
+
if isinstance(Gx, nx.DiGraph): # Graph G[u][v] returns the data dictionary.
|
|
175
|
+
for n in pred:
|
|
176
|
+
pred_dates.append(Gx[n][Gx_node][self.temporal_attribute_name])
|
|
177
|
+
else: # MultiGraph G[u][v] returns a dictionary of key -> data dictionary.
|
|
178
|
+
for n in pred:
|
|
179
|
+
for edge in Gx[n][
|
|
180
|
+
Gx_node
|
|
181
|
+
].values(): # Iterates all edge data between node pair.
|
|
182
|
+
pred_dates.append(edge[self.temporal_attribute_name])
|
|
183
|
+
return pred_dates
|
|
184
|
+
|
|
185
|
+
def get_succ_dates(self, Gx, Gx_node, core_x, succ):
|
|
186
|
+
"""
|
|
187
|
+
Get the dates of edges to successors.
|
|
188
|
+
"""
|
|
189
|
+
succ_dates = []
|
|
190
|
+
if isinstance(Gx, nx.DiGraph): # Graph G[u][v] returns the data dictionary.
|
|
191
|
+
for n in succ:
|
|
192
|
+
succ_dates.append(Gx[Gx_node][n][self.temporal_attribute_name])
|
|
193
|
+
else: # MultiGraph G[u][v] returns a dictionary of key -> data dictionary.
|
|
194
|
+
for n in succ:
|
|
195
|
+
for edge in Gx[Gx_node][
|
|
196
|
+
n
|
|
197
|
+
].values(): # Iterates all edge data between node pair.
|
|
198
|
+
succ_dates.append(edge[self.temporal_attribute_name])
|
|
199
|
+
return succ_dates
|
|
200
|
+
|
|
201
|
+
def one_hop(self, Gx, Gx_node, core_x, pred, succ):
|
|
202
|
+
"""
|
|
203
|
+
The ego node.
|
|
204
|
+
"""
|
|
205
|
+
pred_dates = self.get_pred_dates(Gx, Gx_node, core_x, pred)
|
|
206
|
+
succ_dates = self.get_succ_dates(Gx, Gx_node, core_x, succ)
|
|
207
|
+
return self.test_one(pred_dates, succ_dates) and self.test_two(
|
|
208
|
+
pred_dates, succ_dates
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
def two_hop_pred(self, Gx, Gx_node, core_x, pred):
|
|
212
|
+
"""
|
|
213
|
+
The predecessors of the ego node.
|
|
214
|
+
"""
|
|
215
|
+
return all(
|
|
216
|
+
self.one_hop(
|
|
217
|
+
Gx,
|
|
218
|
+
p,
|
|
219
|
+
core_x,
|
|
220
|
+
self.preds(Gx, core_x, p),
|
|
221
|
+
self.succs(Gx, core_x, p, Gx_node),
|
|
222
|
+
)
|
|
223
|
+
for p in pred
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
def two_hop_succ(self, Gx, Gx_node, core_x, succ):
|
|
227
|
+
"""
|
|
228
|
+
The successors of the ego node.
|
|
229
|
+
"""
|
|
230
|
+
return all(
|
|
231
|
+
self.one_hop(
|
|
232
|
+
Gx,
|
|
233
|
+
s,
|
|
234
|
+
core_x,
|
|
235
|
+
self.preds(Gx, core_x, s, Gx_node),
|
|
236
|
+
self.succs(Gx, core_x, s),
|
|
237
|
+
)
|
|
238
|
+
for s in succ
|
|
239
|
+
)
|
|
240
|
+
|
|
241
|
+
def preds(self, Gx, core_x, v, Gx_node=None):
|
|
242
|
+
pred = [n for n in Gx.predecessors(v) if n in core_x]
|
|
243
|
+
if Gx_node:
|
|
244
|
+
pred.append(Gx_node)
|
|
245
|
+
return pred
|
|
246
|
+
|
|
247
|
+
def succs(self, Gx, core_x, v, Gx_node=None):
|
|
248
|
+
succ = [n for n in Gx.successors(v) if n in core_x]
|
|
249
|
+
if Gx_node:
|
|
250
|
+
succ.append(Gx_node)
|
|
251
|
+
return succ
|
|
252
|
+
|
|
253
|
+
def test_one(self, pred_dates, succ_dates):
|
|
254
|
+
"""
|
|
255
|
+
Edges one hop out from Gx_node in the mapping should be
|
|
256
|
+
time-respecting with respect to each other, regardless of
|
|
257
|
+
direction.
|
|
258
|
+
"""
|
|
259
|
+
time_respecting = True
|
|
260
|
+
dates = pred_dates + succ_dates
|
|
261
|
+
|
|
262
|
+
if any(x is None for x in dates):
|
|
263
|
+
raise ValueError("Date or datetime not supplied for at least one edge.")
|
|
264
|
+
|
|
265
|
+
dates.sort() # Small to large.
|
|
266
|
+
if 0 < len(dates) and not (dates[-1] - dates[0] <= self.delta):
|
|
267
|
+
time_respecting = False
|
|
268
|
+
return time_respecting
|
|
269
|
+
|
|
270
|
+
def test_two(self, pred_dates, succ_dates):
|
|
271
|
+
"""
|
|
272
|
+
Edges from a dual Gx_node in the mapping should be ordered in
|
|
273
|
+
a time-respecting manner.
|
|
274
|
+
"""
|
|
275
|
+
time_respecting = True
|
|
276
|
+
pred_dates.sort()
|
|
277
|
+
succ_dates.sort()
|
|
278
|
+
# First out before last in; negative of the necessary condition for time-respect.
|
|
279
|
+
if (
|
|
280
|
+
0 < len(succ_dates)
|
|
281
|
+
and 0 < len(pred_dates)
|
|
282
|
+
and succ_dates[0] < pred_dates[-1]
|
|
283
|
+
):
|
|
284
|
+
time_respecting = False
|
|
285
|
+
return time_respecting
|
|
286
|
+
|
|
287
|
+
def semantic_feasibility(self, G1_node, G2_node):
|
|
288
|
+
"""Returns True if adding (G1_node, G2_node) is semantically
|
|
289
|
+
feasible.
|
|
290
|
+
|
|
291
|
+
Any subclass which redefines semantic_feasibility() must
|
|
292
|
+
maintain the self.tests if needed, to keep the match() method
|
|
293
|
+
functional. Implementations should consider multigraphs.
|
|
294
|
+
"""
|
|
295
|
+
pred, succ = (
|
|
296
|
+
[n for n in self.G1.predecessors(G1_node) if n in self.core_1],
|
|
297
|
+
[n for n in self.G1.successors(G1_node) if n in self.core_1],
|
|
298
|
+
)
|
|
299
|
+
if not self.one_hop(
|
|
300
|
+
self.G1, G1_node, self.core_1, pred, succ
|
|
301
|
+
): # Fail fast on first node.
|
|
302
|
+
return False
|
|
303
|
+
if not self.two_hop_pred(self.G1, G1_node, self.core_1, pred):
|
|
304
|
+
return False
|
|
305
|
+
if not self.two_hop_succ(self.G1, G1_node, self.core_1, succ):
|
|
306
|
+
return False
|
|
307
|
+
# Otherwise, this node is semantically feasible!
|
|
308
|
+
return True
|
|
File without changes
|
|
Binary file
|
|
Binary file
|
|
Binary file
|