okstra 0.130.4 → 0.131.1
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.md +0 -1
- package/docs/architecture.md +2 -2
- package/docs/cli.md +1 -1
- package/docs/for-ai/README.md +0 -2
- package/docs/for-ai/skills/okstra-run.md +13 -2
- package/docs/for-ai/skills/okstra-setup.md +4 -1
- package/docs/project-structure-overview.md +5 -4
- package/docs/task-process/implementation-planning.md +13 -0
- package/docs/task-process/implementation.md +17 -2
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/report-writer-worker.md +7 -0
- package/runtime/bin/lib/okstra/usage.sh +4 -4
- package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
- package/runtime/prompts/lead/plan-body-verification.md +26 -5
- package/runtime/prompts/lead/report-writer.md +6 -2
- package/runtime/prompts/profiles/_common-contract.md +2 -1
- package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
- package/runtime/prompts/profiles/_implementation-executor.md +2 -2
- package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
- package/runtime/prompts/profiles/final-verification.md +21 -6
- package/runtime/prompts/profiles/implementation-planning.md +16 -4
- package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
- package/runtime/python/okstra_ctl/conformance.py +49 -11
- package/runtime/python/okstra_ctl/report_finalize.py +52 -1
- package/runtime/python/okstra_ctl/run.py +15 -3
- package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
- package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
- package/runtime/python/okstra_vendor/__init__.py +0 -44
- package/runtime/schemas/final-report-v1.0.schema.json +99 -5
- package/runtime/skills/okstra-run/SKILL.md +11 -4
- package/runtime/skills/okstra-setup/SKILL.md +3 -2
- package/runtime/skills/okstra-setup/references/project-config.md +16 -7
- package/runtime/templates/reports/final-report.template.md +15 -9
- package/runtime/templates/reports/i18n/en.json +1 -0
- package/runtime/templates/reports/i18n/ko.json +1 -0
- package/runtime/validators/lib/fixtures.sh +6 -0
- package/runtime/validators/validate-run.py +2019 -96
- package/src/cli-registry.mjs +0 -7
- package/src/commands/lifecycle/doctor.mjs +0 -9
- package/src/lib/skill-catalog.mjs +0 -1
- package/docs/for-ai/skills/okstra-graphify.md +0 -64
- package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
- package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
- package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
- package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
- package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
- package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
- package/runtime/python/okstra_vendor/graphify/build.py +0 -107
- package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
- package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
- package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
- package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
- package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
- package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
- package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
- package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
- package/runtime/python/okstra_vendor/graphify/report.py +0 -175
- package/runtime/python/okstra_vendor/graphify/security.py +0 -203
- package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
- package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
- package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
- package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
- package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
- package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
- package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
- package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
- package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
- package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
- package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
- package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
- package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
- package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
- package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
- package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
- package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
- package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
- package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
- package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
- package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
- package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
- package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
- package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
- package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
- package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
- package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
- package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
- package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
- package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
- package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
- package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
- package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
- package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
- package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
- package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
- package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
- package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
- package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
- package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
- package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
- package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
- package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
- package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
- package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
- package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
- package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
- package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
- package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
- package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
- package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
- package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
- package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
- package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
- package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
- package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
- package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
- package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
- package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
- package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
- package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
- package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
- package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
- package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
- package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
- package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
- package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
- package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
- package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
- package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
- package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
- package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
- package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
- package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
- package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
- package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
- package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
- package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
- package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
- package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
- package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
- package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
- package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
- package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
- package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
- package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
- package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
- package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
- package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
- package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
- package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
- package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
- package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
- package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
- package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
- package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
- package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
- package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
- package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
- package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
- package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
- package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
- package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
- package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
- package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
- package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
- package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
- package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
- package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
- package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
- package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
- package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
- package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
- package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
- package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
- package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
- package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
- package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
- package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
- package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
- package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
- package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
- package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
- package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
- package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
- package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
- package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
- package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
- package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
- package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
- package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
- package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
- package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
- package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
- package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
- package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
- package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
- package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
- package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
- package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
- package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
- package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
- package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
- package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
- package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
- package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
- package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
- package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
- package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
- package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
- package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
- package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
- package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
- package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
- package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
- package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
- package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
- package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
- package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
- package/runtime/skills/okstra-graphify/SKILL.md +0 -169
- package/src/commands/graphify.mjs +0 -32
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"""Semiconnectedness."""
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
from networkx.utils import not_implemented_for, pairwise
|
|
5
|
-
|
|
6
|
-
__all__ = ["is_semiconnected"]
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@not_implemented_for("undirected")
|
|
10
|
-
@nx._dispatchable
|
|
11
|
-
def is_semiconnected(G):
|
|
12
|
-
r"""Returns True if the graph is semiconnected, False otherwise.
|
|
13
|
-
|
|
14
|
-
A graph is semiconnected if and only if for any pair of nodes, either one
|
|
15
|
-
is reachable from the other, or they are mutually reachable.
|
|
16
|
-
|
|
17
|
-
This function uses a theorem that states that a DAG is semiconnected
|
|
18
|
-
if for any topological sort, for node $v_n$ in that sort, there is an
|
|
19
|
-
edge $(v_i, v_{i+1})$. That allows us to check if a non-DAG `G` is
|
|
20
|
-
semiconnected by condensing the graph: i.e. constructing a new graph `H`
|
|
21
|
-
with nodes being the strongly connected components of `G`, and edges
|
|
22
|
-
(scc_1, scc_2) if there is a edge $(v_1, v_2)$ in `G` for some
|
|
23
|
-
$v_1 \in scc_1$ and $v_2 \in scc_2$. That results in a DAG, so we compute
|
|
24
|
-
the topological sort of `H` and check if for every $n$ there is an edge
|
|
25
|
-
$(scc_n, scc_{n+1})$.
|
|
26
|
-
|
|
27
|
-
Parameters
|
|
28
|
-
----------
|
|
29
|
-
G : NetworkX graph
|
|
30
|
-
A directed graph.
|
|
31
|
-
|
|
32
|
-
Returns
|
|
33
|
-
-------
|
|
34
|
-
semiconnected : bool
|
|
35
|
-
True if the graph is semiconnected, False otherwise.
|
|
36
|
-
|
|
37
|
-
Raises
|
|
38
|
-
------
|
|
39
|
-
NetworkXNotImplemented
|
|
40
|
-
If the input graph is undirected.
|
|
41
|
-
|
|
42
|
-
NetworkXPointlessConcept
|
|
43
|
-
If the graph is empty.
|
|
44
|
-
|
|
45
|
-
Examples
|
|
46
|
-
--------
|
|
47
|
-
>>> G = nx.path_graph(4, create_using=nx.DiGraph())
|
|
48
|
-
>>> print(nx.is_semiconnected(G))
|
|
49
|
-
True
|
|
50
|
-
>>> G = nx.DiGraph([(1, 2), (3, 2)])
|
|
51
|
-
>>> print(nx.is_semiconnected(G))
|
|
52
|
-
False
|
|
53
|
-
|
|
54
|
-
See Also
|
|
55
|
-
--------
|
|
56
|
-
is_strongly_connected
|
|
57
|
-
is_weakly_connected
|
|
58
|
-
is_connected
|
|
59
|
-
is_biconnected
|
|
60
|
-
"""
|
|
61
|
-
if len(G) == 0:
|
|
62
|
-
raise nx.NetworkXPointlessConcept(
|
|
63
|
-
"Connectivity is undefined for the null graph."
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
if not nx.is_weakly_connected(G):
|
|
67
|
-
return False
|
|
68
|
-
|
|
69
|
-
H = nx.condensation(G)
|
|
70
|
-
|
|
71
|
-
return all(H.has_edge(u, v) for u, v in pairwise(nx.topological_sort(H)))
|
|
@@ -1,359 +0,0 @@
|
|
|
1
|
-
"""Strongly connected components."""
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
from networkx.utils.decorators import not_implemented_for
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"number_strongly_connected_components",
|
|
8
|
-
"strongly_connected_components",
|
|
9
|
-
"is_strongly_connected",
|
|
10
|
-
"kosaraju_strongly_connected_components",
|
|
11
|
-
"condensation",
|
|
12
|
-
]
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@not_implemented_for("undirected")
|
|
16
|
-
@nx._dispatchable
|
|
17
|
-
def strongly_connected_components(G):
|
|
18
|
-
"""Generate nodes in strongly connected components of graph.
|
|
19
|
-
|
|
20
|
-
Parameters
|
|
21
|
-
----------
|
|
22
|
-
G : NetworkX Graph
|
|
23
|
-
A directed graph.
|
|
24
|
-
|
|
25
|
-
Returns
|
|
26
|
-
-------
|
|
27
|
-
comp : generator of sets
|
|
28
|
-
A generator of sets of nodes, one for each strongly connected
|
|
29
|
-
component of G.
|
|
30
|
-
|
|
31
|
-
Raises
|
|
32
|
-
------
|
|
33
|
-
NetworkXNotImplemented
|
|
34
|
-
If G is undirected.
|
|
35
|
-
|
|
36
|
-
Examples
|
|
37
|
-
--------
|
|
38
|
-
Generate a sorted list of strongly connected components, largest first.
|
|
39
|
-
|
|
40
|
-
>>> G = nx.cycle_graph(4, create_using=nx.DiGraph())
|
|
41
|
-
>>> nx.add_cycle(G, [10, 11, 12])
|
|
42
|
-
>>> [
|
|
43
|
-
... len(c)
|
|
44
|
-
... for c in sorted(nx.strongly_connected_components(G), key=len, reverse=True)
|
|
45
|
-
... ]
|
|
46
|
-
[4, 3]
|
|
47
|
-
|
|
48
|
-
If you only want the largest component, it's more efficient to
|
|
49
|
-
use max instead of sort.
|
|
50
|
-
|
|
51
|
-
>>> largest = max(nx.strongly_connected_components(G), key=len)
|
|
52
|
-
|
|
53
|
-
See Also
|
|
54
|
-
--------
|
|
55
|
-
connected_components
|
|
56
|
-
weakly_connected_components
|
|
57
|
-
kosaraju_strongly_connected_components
|
|
58
|
-
|
|
59
|
-
Notes
|
|
60
|
-
-----
|
|
61
|
-
Uses Tarjan's algorithm[1]_ with Nuutila's modifications[2]_.
|
|
62
|
-
Nonrecursive version of algorithm.
|
|
63
|
-
|
|
64
|
-
References
|
|
65
|
-
----------
|
|
66
|
-
.. [1] Depth-first search and linear graph algorithms, R. Tarjan
|
|
67
|
-
SIAM Journal of Computing 1(2):146-160, (1972).
|
|
68
|
-
|
|
69
|
-
.. [2] On finding the strongly connected components in a directed graph.
|
|
70
|
-
E. Nuutila and E. Soisalon-Soinen
|
|
71
|
-
Information Processing Letters 49(1): 9-14, (1994)..
|
|
72
|
-
|
|
73
|
-
"""
|
|
74
|
-
preorder = {}
|
|
75
|
-
lowlink = {}
|
|
76
|
-
scc_found = set()
|
|
77
|
-
scc_queue = []
|
|
78
|
-
i = 0 # Preorder counter
|
|
79
|
-
neighbors = {v: iter(G._adj[v]) for v in G}
|
|
80
|
-
for source in G:
|
|
81
|
-
if source not in scc_found:
|
|
82
|
-
queue = [source]
|
|
83
|
-
while queue:
|
|
84
|
-
v = queue[-1]
|
|
85
|
-
if v not in preorder:
|
|
86
|
-
i = i + 1
|
|
87
|
-
preorder[v] = i
|
|
88
|
-
done = True
|
|
89
|
-
for w in neighbors[v]:
|
|
90
|
-
if w not in preorder:
|
|
91
|
-
queue.append(w)
|
|
92
|
-
done = False
|
|
93
|
-
break
|
|
94
|
-
if done:
|
|
95
|
-
lowlink[v] = preorder[v]
|
|
96
|
-
for w in G._adj[v]:
|
|
97
|
-
if w not in scc_found:
|
|
98
|
-
if preorder[w] > preorder[v]:
|
|
99
|
-
lowlink[v] = min([lowlink[v], lowlink[w]])
|
|
100
|
-
else:
|
|
101
|
-
lowlink[v] = min([lowlink[v], preorder[w]])
|
|
102
|
-
queue.pop()
|
|
103
|
-
if lowlink[v] == preorder[v]:
|
|
104
|
-
scc = {v}
|
|
105
|
-
while scc_queue and preorder[scc_queue[-1]] > preorder[v]:
|
|
106
|
-
k = scc_queue.pop()
|
|
107
|
-
scc.add(k)
|
|
108
|
-
scc_found.update(scc)
|
|
109
|
-
yield scc
|
|
110
|
-
else:
|
|
111
|
-
scc_queue.append(v)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@not_implemented_for("undirected")
|
|
115
|
-
@nx._dispatchable
|
|
116
|
-
def kosaraju_strongly_connected_components(G, source=None):
|
|
117
|
-
"""Generate nodes in strongly connected components of graph.
|
|
118
|
-
|
|
119
|
-
Parameters
|
|
120
|
-
----------
|
|
121
|
-
G : NetworkX Graph
|
|
122
|
-
A directed graph.
|
|
123
|
-
|
|
124
|
-
source : node, optional (default=None)
|
|
125
|
-
Specify a node from which to start the depth-first search.
|
|
126
|
-
If not provided, the algorithm will start from an arbitrary node.
|
|
127
|
-
|
|
128
|
-
Yields
|
|
129
|
-
------
|
|
130
|
-
set
|
|
131
|
-
A set of all nodes in a strongly connected component of `G`.
|
|
132
|
-
|
|
133
|
-
Raises
|
|
134
|
-
------
|
|
135
|
-
NetworkXNotImplemented
|
|
136
|
-
If `G` is undirected.
|
|
137
|
-
|
|
138
|
-
NetworkXError
|
|
139
|
-
If `source` is not a node in `G`.
|
|
140
|
-
|
|
141
|
-
Examples
|
|
142
|
-
--------
|
|
143
|
-
Generate a list of strongly connected components of a graph:
|
|
144
|
-
|
|
145
|
-
>>> G = nx.cycle_graph(4, create_using=nx.DiGraph())
|
|
146
|
-
>>> nx.add_cycle(G, [10, 11, 12])
|
|
147
|
-
>>> sorted(nx.kosaraju_strongly_connected_components(G), key=len, reverse=True)
|
|
148
|
-
[{0, 1, 2, 3}, {10, 11, 12}]
|
|
149
|
-
|
|
150
|
-
If you only want the largest component, it's more efficient to
|
|
151
|
-
use `max()` instead of `sorted()`.
|
|
152
|
-
|
|
153
|
-
>>> max(nx.kosaraju_strongly_connected_components(G), key=len)
|
|
154
|
-
{0, 1, 2, 3}
|
|
155
|
-
|
|
156
|
-
See Also
|
|
157
|
-
--------
|
|
158
|
-
strongly_connected_components
|
|
159
|
-
|
|
160
|
-
Notes
|
|
161
|
-
-----
|
|
162
|
-
Uses Kosaraju's algorithm.
|
|
163
|
-
"""
|
|
164
|
-
post = list(nx.dfs_postorder_nodes(G.reverse(copy=False), source=source))
|
|
165
|
-
n = len(post)
|
|
166
|
-
seen = set()
|
|
167
|
-
while post and len(seen) < n:
|
|
168
|
-
r = post.pop()
|
|
169
|
-
if r in seen:
|
|
170
|
-
continue
|
|
171
|
-
new = {r}
|
|
172
|
-
seen.add(r)
|
|
173
|
-
stack = [r]
|
|
174
|
-
while stack and len(seen) < n:
|
|
175
|
-
v = stack.pop()
|
|
176
|
-
for w in G._adj[v]:
|
|
177
|
-
if w not in seen:
|
|
178
|
-
new.add(w)
|
|
179
|
-
seen.add(w)
|
|
180
|
-
stack.append(w)
|
|
181
|
-
yield new
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
@not_implemented_for("undirected")
|
|
185
|
-
@nx._dispatchable
|
|
186
|
-
def number_strongly_connected_components(G):
|
|
187
|
-
"""Returns number of strongly connected components in graph.
|
|
188
|
-
|
|
189
|
-
Parameters
|
|
190
|
-
----------
|
|
191
|
-
G : NetworkX graph
|
|
192
|
-
A directed graph.
|
|
193
|
-
|
|
194
|
-
Returns
|
|
195
|
-
-------
|
|
196
|
-
n : integer
|
|
197
|
-
Number of strongly connected components
|
|
198
|
-
|
|
199
|
-
Raises
|
|
200
|
-
------
|
|
201
|
-
NetworkXNotImplemented
|
|
202
|
-
If G is undirected.
|
|
203
|
-
|
|
204
|
-
Examples
|
|
205
|
-
--------
|
|
206
|
-
>>> G = nx.DiGraph(
|
|
207
|
-
... [(0, 1), (1, 2), (2, 0), (2, 3), (4, 5), (3, 4), (5, 6), (6, 3), (6, 7)]
|
|
208
|
-
... )
|
|
209
|
-
>>> nx.number_strongly_connected_components(G)
|
|
210
|
-
3
|
|
211
|
-
|
|
212
|
-
See Also
|
|
213
|
-
--------
|
|
214
|
-
strongly_connected_components
|
|
215
|
-
number_connected_components
|
|
216
|
-
number_weakly_connected_components
|
|
217
|
-
|
|
218
|
-
Notes
|
|
219
|
-
-----
|
|
220
|
-
For directed graphs only.
|
|
221
|
-
"""
|
|
222
|
-
return sum(1 for scc in strongly_connected_components(G))
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
@not_implemented_for("undirected")
|
|
226
|
-
@nx._dispatchable
|
|
227
|
-
def is_strongly_connected(G):
|
|
228
|
-
"""Test directed graph for strong connectivity.
|
|
229
|
-
|
|
230
|
-
A directed graph is strongly connected if and only if every vertex in
|
|
231
|
-
the graph is reachable from every other vertex.
|
|
232
|
-
|
|
233
|
-
Parameters
|
|
234
|
-
----------
|
|
235
|
-
G : NetworkX Graph
|
|
236
|
-
A directed graph.
|
|
237
|
-
|
|
238
|
-
Returns
|
|
239
|
-
-------
|
|
240
|
-
connected : bool
|
|
241
|
-
True if the graph is strongly connected, False otherwise.
|
|
242
|
-
|
|
243
|
-
Examples
|
|
244
|
-
--------
|
|
245
|
-
>>> G = nx.DiGraph([(0, 1), (1, 2), (2, 3), (3, 0), (2, 4), (4, 2)])
|
|
246
|
-
>>> nx.is_strongly_connected(G)
|
|
247
|
-
True
|
|
248
|
-
>>> G.remove_edge(2, 3)
|
|
249
|
-
>>> nx.is_strongly_connected(G)
|
|
250
|
-
False
|
|
251
|
-
|
|
252
|
-
Raises
|
|
253
|
-
------
|
|
254
|
-
NetworkXNotImplemented
|
|
255
|
-
If G is undirected.
|
|
256
|
-
|
|
257
|
-
See Also
|
|
258
|
-
--------
|
|
259
|
-
is_weakly_connected
|
|
260
|
-
is_semiconnected
|
|
261
|
-
is_connected
|
|
262
|
-
is_biconnected
|
|
263
|
-
strongly_connected_components
|
|
264
|
-
|
|
265
|
-
Notes
|
|
266
|
-
-----
|
|
267
|
-
For directed graphs only.
|
|
268
|
-
"""
|
|
269
|
-
if len(G) == 0:
|
|
270
|
-
raise nx.NetworkXPointlessConcept(
|
|
271
|
-
"""Connectivity is undefined for the null graph."""
|
|
272
|
-
)
|
|
273
|
-
|
|
274
|
-
return len(next(strongly_connected_components(G))) == len(G)
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
@not_implemented_for("undirected")
|
|
278
|
-
@nx._dispatchable(returns_graph=True)
|
|
279
|
-
def condensation(G, scc=None):
|
|
280
|
-
"""Returns the condensation of G.
|
|
281
|
-
|
|
282
|
-
The condensation of G is the graph with each of the strongly connected
|
|
283
|
-
components contracted into a single node.
|
|
284
|
-
|
|
285
|
-
Parameters
|
|
286
|
-
----------
|
|
287
|
-
G : NetworkX DiGraph
|
|
288
|
-
A directed graph.
|
|
289
|
-
|
|
290
|
-
scc: list or generator (optional, default=None)
|
|
291
|
-
Strongly connected components. If provided, the elements in
|
|
292
|
-
`scc` must partition the nodes in `G`. If not provided, it will be
|
|
293
|
-
calculated as scc=nx.strongly_connected_components(G).
|
|
294
|
-
|
|
295
|
-
Returns
|
|
296
|
-
-------
|
|
297
|
-
C : NetworkX DiGraph
|
|
298
|
-
The condensation graph C of G. The node labels are integers
|
|
299
|
-
corresponding to the index of the component in the list of
|
|
300
|
-
strongly connected components of G. C has a graph attribute named
|
|
301
|
-
'mapping' with a dictionary mapping the original nodes to the
|
|
302
|
-
nodes in C to which they belong. Each node in C also has a node
|
|
303
|
-
attribute 'members' with the set of original nodes in G that
|
|
304
|
-
form the SCC that the node in C represents.
|
|
305
|
-
|
|
306
|
-
Raises
|
|
307
|
-
------
|
|
308
|
-
NetworkXNotImplemented
|
|
309
|
-
If G is undirected.
|
|
310
|
-
|
|
311
|
-
Examples
|
|
312
|
-
--------
|
|
313
|
-
Contracting two sets of strongly connected nodes into two distinct SCC
|
|
314
|
-
using the barbell graph.
|
|
315
|
-
|
|
316
|
-
>>> G = nx.barbell_graph(4, 0)
|
|
317
|
-
>>> G.remove_edge(3, 4)
|
|
318
|
-
>>> G = nx.DiGraph(G)
|
|
319
|
-
>>> H = nx.condensation(G)
|
|
320
|
-
>>> H.nodes.data()
|
|
321
|
-
NodeDataView({0: {'members': {0, 1, 2, 3}}, 1: {'members': {4, 5, 6, 7}}})
|
|
322
|
-
>>> H.graph["mapping"]
|
|
323
|
-
{0: 0, 1: 0, 2: 0, 3: 0, 4: 1, 5: 1, 6: 1, 7: 1}
|
|
324
|
-
|
|
325
|
-
Contracting a complete graph into one single SCC.
|
|
326
|
-
|
|
327
|
-
>>> G = nx.complete_graph(7, create_using=nx.DiGraph)
|
|
328
|
-
>>> H = nx.condensation(G)
|
|
329
|
-
>>> H.nodes
|
|
330
|
-
NodeView((0,))
|
|
331
|
-
>>> H.nodes.data()
|
|
332
|
-
NodeDataView({0: {'members': {0, 1, 2, 3, 4, 5, 6}}})
|
|
333
|
-
|
|
334
|
-
Notes
|
|
335
|
-
-----
|
|
336
|
-
After contracting all strongly connected components to a single node,
|
|
337
|
-
the resulting graph is a directed acyclic graph.
|
|
338
|
-
|
|
339
|
-
"""
|
|
340
|
-
if scc is None:
|
|
341
|
-
scc = nx.strongly_connected_components(G)
|
|
342
|
-
mapping = {}
|
|
343
|
-
members = {}
|
|
344
|
-
C = nx.DiGraph()
|
|
345
|
-
# Add mapping dict as graph attribute
|
|
346
|
-
C.graph["mapping"] = mapping
|
|
347
|
-
if len(G) == 0:
|
|
348
|
-
return C
|
|
349
|
-
for i, component in enumerate(scc):
|
|
350
|
-
members[i] = component
|
|
351
|
-
mapping.update((n, i) for n in component)
|
|
352
|
-
number_of_components = i + 1
|
|
353
|
-
C.add_nodes_from(range(number_of_components))
|
|
354
|
-
C.add_edges_from(
|
|
355
|
-
(mapping[u], mapping[v]) for u, v in G.edges() if mapping[u] != mapping[v]
|
|
356
|
-
)
|
|
357
|
-
# Add a list of members (ie original nodes) to each node (ie scc) in C.
|
|
358
|
-
nx.set_node_attributes(C, members, "members")
|
|
359
|
-
return C
|
|
@@ -1,196 +0,0 @@
|
|
|
1
|
-
"""Weakly connected components."""
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
from networkx.utils.decorators import not_implemented_for
|
|
5
|
-
|
|
6
|
-
__all__ = [
|
|
7
|
-
"number_weakly_connected_components",
|
|
8
|
-
"weakly_connected_components",
|
|
9
|
-
"is_weakly_connected",
|
|
10
|
-
]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@not_implemented_for("undirected")
|
|
14
|
-
@nx._dispatchable
|
|
15
|
-
def weakly_connected_components(G):
|
|
16
|
-
"""Generate weakly connected components of G.
|
|
17
|
-
|
|
18
|
-
Parameters
|
|
19
|
-
----------
|
|
20
|
-
G : NetworkX graph
|
|
21
|
-
A directed graph
|
|
22
|
-
|
|
23
|
-
Returns
|
|
24
|
-
-------
|
|
25
|
-
comp : generator of sets
|
|
26
|
-
A generator of sets of nodes, one for each weakly connected
|
|
27
|
-
component of G.
|
|
28
|
-
|
|
29
|
-
Raises
|
|
30
|
-
------
|
|
31
|
-
NetworkXNotImplemented
|
|
32
|
-
If G is undirected.
|
|
33
|
-
|
|
34
|
-
Examples
|
|
35
|
-
--------
|
|
36
|
-
Generate a sorted list of weakly connected components, largest first.
|
|
37
|
-
|
|
38
|
-
>>> G = nx.path_graph(4, create_using=nx.DiGraph())
|
|
39
|
-
>>> nx.add_path(G, [10, 11, 12])
|
|
40
|
-
>>> [
|
|
41
|
-
... len(c)
|
|
42
|
-
... for c in sorted(nx.weakly_connected_components(G), key=len, reverse=True)
|
|
43
|
-
... ]
|
|
44
|
-
[4, 3]
|
|
45
|
-
|
|
46
|
-
If you only want the largest component, it's more efficient to
|
|
47
|
-
use max instead of sort:
|
|
48
|
-
|
|
49
|
-
>>> largest_cc = max(nx.weakly_connected_components(G), key=len)
|
|
50
|
-
|
|
51
|
-
See Also
|
|
52
|
-
--------
|
|
53
|
-
connected_components
|
|
54
|
-
strongly_connected_components
|
|
55
|
-
|
|
56
|
-
Notes
|
|
57
|
-
-----
|
|
58
|
-
For directed graphs only.
|
|
59
|
-
|
|
60
|
-
"""
|
|
61
|
-
seen = set()
|
|
62
|
-
n = len(G) # must be outside the loop to avoid performance hit with graph views
|
|
63
|
-
for v in G:
|
|
64
|
-
if v not in seen:
|
|
65
|
-
c = _plain_bfs(G, n - len(seen), v)
|
|
66
|
-
seen.update(c)
|
|
67
|
-
yield c
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
@not_implemented_for("undirected")
|
|
71
|
-
@nx._dispatchable
|
|
72
|
-
def number_weakly_connected_components(G):
|
|
73
|
-
"""Returns the number of weakly connected components in G.
|
|
74
|
-
|
|
75
|
-
Parameters
|
|
76
|
-
----------
|
|
77
|
-
G : NetworkX graph
|
|
78
|
-
A directed graph.
|
|
79
|
-
|
|
80
|
-
Returns
|
|
81
|
-
-------
|
|
82
|
-
n : integer
|
|
83
|
-
Number of weakly connected components
|
|
84
|
-
|
|
85
|
-
Raises
|
|
86
|
-
------
|
|
87
|
-
NetworkXNotImplemented
|
|
88
|
-
If G is undirected.
|
|
89
|
-
|
|
90
|
-
Examples
|
|
91
|
-
--------
|
|
92
|
-
>>> G = nx.DiGraph([(0, 1), (2, 1), (3, 4)])
|
|
93
|
-
>>> nx.number_weakly_connected_components(G)
|
|
94
|
-
2
|
|
95
|
-
|
|
96
|
-
See Also
|
|
97
|
-
--------
|
|
98
|
-
weakly_connected_components
|
|
99
|
-
number_connected_components
|
|
100
|
-
number_strongly_connected_components
|
|
101
|
-
|
|
102
|
-
Notes
|
|
103
|
-
-----
|
|
104
|
-
For directed graphs only.
|
|
105
|
-
|
|
106
|
-
"""
|
|
107
|
-
return sum(1 for _ in weakly_connected_components(G))
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
@not_implemented_for("undirected")
|
|
111
|
-
@nx._dispatchable
|
|
112
|
-
def is_weakly_connected(G):
|
|
113
|
-
"""Test directed graph for weak connectivity.
|
|
114
|
-
|
|
115
|
-
A directed graph is weakly connected if and only if the graph
|
|
116
|
-
is connected when the direction of the edge between nodes is ignored.
|
|
117
|
-
|
|
118
|
-
Note that if a graph is strongly connected (i.e. the graph is connected
|
|
119
|
-
even when we account for directionality), it is by definition weakly
|
|
120
|
-
connected as well.
|
|
121
|
-
|
|
122
|
-
Parameters
|
|
123
|
-
----------
|
|
124
|
-
G : NetworkX Graph
|
|
125
|
-
A directed graph.
|
|
126
|
-
|
|
127
|
-
Returns
|
|
128
|
-
-------
|
|
129
|
-
connected : bool
|
|
130
|
-
True if the graph is weakly connected, False otherwise.
|
|
131
|
-
|
|
132
|
-
Raises
|
|
133
|
-
------
|
|
134
|
-
NetworkXNotImplemented
|
|
135
|
-
If G is undirected.
|
|
136
|
-
|
|
137
|
-
Examples
|
|
138
|
-
--------
|
|
139
|
-
>>> G = nx.DiGraph([(0, 1), (2, 1)])
|
|
140
|
-
>>> G.add_node(3)
|
|
141
|
-
>>> nx.is_weakly_connected(G) # node 3 is not connected to the graph
|
|
142
|
-
False
|
|
143
|
-
>>> G.add_edge(2, 3)
|
|
144
|
-
>>> nx.is_weakly_connected(G)
|
|
145
|
-
True
|
|
146
|
-
|
|
147
|
-
See Also
|
|
148
|
-
--------
|
|
149
|
-
is_strongly_connected
|
|
150
|
-
is_semiconnected
|
|
151
|
-
is_connected
|
|
152
|
-
is_biconnected
|
|
153
|
-
weakly_connected_components
|
|
154
|
-
|
|
155
|
-
Notes
|
|
156
|
-
-----
|
|
157
|
-
For directed graphs only.
|
|
158
|
-
|
|
159
|
-
"""
|
|
160
|
-
n = len(G)
|
|
161
|
-
if n == 0:
|
|
162
|
-
raise nx.NetworkXPointlessConcept(
|
|
163
|
-
"""Connectivity is undefined for the null graph."""
|
|
164
|
-
)
|
|
165
|
-
|
|
166
|
-
return len(next(weakly_connected_components(G))) == n
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
def _plain_bfs(G, n, source):
|
|
170
|
-
"""A fast BFS node generator
|
|
171
|
-
|
|
172
|
-
The direction of the edge between nodes is ignored.
|
|
173
|
-
|
|
174
|
-
For directed graphs only.
|
|
175
|
-
|
|
176
|
-
"""
|
|
177
|
-
Gsucc = G._succ
|
|
178
|
-
Gpred = G._pred
|
|
179
|
-
seen = {source}
|
|
180
|
-
nextlevel = [source]
|
|
181
|
-
|
|
182
|
-
while nextlevel:
|
|
183
|
-
thislevel = nextlevel
|
|
184
|
-
nextlevel = []
|
|
185
|
-
for v in thislevel:
|
|
186
|
-
for w in Gsucc[v]:
|
|
187
|
-
if w not in seen:
|
|
188
|
-
seen.add(w)
|
|
189
|
-
nextlevel.append(w)
|
|
190
|
-
for w in Gpred[v]:
|
|
191
|
-
if w not in seen:
|
|
192
|
-
seen.add(w)
|
|
193
|
-
nextlevel.append(w)
|
|
194
|
-
if len(seen) == n:
|
|
195
|
-
return seen
|
|
196
|
-
return seen
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"""Connectivity and cut algorithms"""
|
|
2
|
-
|
|
3
|
-
from .connectivity import *
|
|
4
|
-
from .cuts import *
|
|
5
|
-
from .edge_augmentation import *
|
|
6
|
-
from .edge_kcomponents import *
|
|
7
|
-
from .disjoint_paths import *
|
|
8
|
-
from .kcomponents import *
|
|
9
|
-
from .kcutsets import *
|
|
10
|
-
from .stoerwagner import *
|
|
11
|
-
from .utils import *
|