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,241 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Edmonds-Karp algorithm for maximum flow problems.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
from networkx.algorithms.flow.utils import build_residual_network
|
|
7
|
-
|
|
8
|
-
__all__ = ["edmonds_karp"]
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def edmonds_karp_core(R, s, t, cutoff):
|
|
12
|
-
"""Implementation of the Edmonds-Karp algorithm."""
|
|
13
|
-
R_nodes = R.nodes
|
|
14
|
-
R_pred = R.pred
|
|
15
|
-
R_succ = R.succ
|
|
16
|
-
|
|
17
|
-
inf = R.graph["inf"]
|
|
18
|
-
|
|
19
|
-
def augment(path):
|
|
20
|
-
"""Augment flow along a path from s to t."""
|
|
21
|
-
# Determine the path residual capacity.
|
|
22
|
-
flow = inf
|
|
23
|
-
it = iter(path)
|
|
24
|
-
u = next(it)
|
|
25
|
-
for v in it:
|
|
26
|
-
attr = R_succ[u][v]
|
|
27
|
-
flow = min(flow, attr["capacity"] - attr["flow"])
|
|
28
|
-
u = v
|
|
29
|
-
if flow * 2 > inf:
|
|
30
|
-
raise nx.NetworkXUnbounded("Infinite capacity path, flow unbounded above.")
|
|
31
|
-
# Augment flow along the path.
|
|
32
|
-
it = iter(path)
|
|
33
|
-
u = next(it)
|
|
34
|
-
for v in it:
|
|
35
|
-
R_succ[u][v]["flow"] += flow
|
|
36
|
-
R_succ[v][u]["flow"] -= flow
|
|
37
|
-
u = v
|
|
38
|
-
return flow
|
|
39
|
-
|
|
40
|
-
def bidirectional_bfs():
|
|
41
|
-
"""Bidirectional breadth-first search for an augmenting path."""
|
|
42
|
-
pred = {s: None}
|
|
43
|
-
q_s = [s]
|
|
44
|
-
succ = {t: None}
|
|
45
|
-
q_t = [t]
|
|
46
|
-
while True:
|
|
47
|
-
q = []
|
|
48
|
-
if len(q_s) <= len(q_t):
|
|
49
|
-
for u in q_s:
|
|
50
|
-
for v, attr in R_succ[u].items():
|
|
51
|
-
if v not in pred and attr["flow"] < attr["capacity"]:
|
|
52
|
-
pred[v] = u
|
|
53
|
-
if v in succ:
|
|
54
|
-
return v, pred, succ
|
|
55
|
-
q.append(v)
|
|
56
|
-
if not q:
|
|
57
|
-
return None, None, None
|
|
58
|
-
q_s = q
|
|
59
|
-
else:
|
|
60
|
-
for u in q_t:
|
|
61
|
-
for v, attr in R_pred[u].items():
|
|
62
|
-
if v not in succ and attr["flow"] < attr["capacity"]:
|
|
63
|
-
succ[v] = u
|
|
64
|
-
if v in pred:
|
|
65
|
-
return v, pred, succ
|
|
66
|
-
q.append(v)
|
|
67
|
-
if not q:
|
|
68
|
-
return None, None, None
|
|
69
|
-
q_t = q
|
|
70
|
-
|
|
71
|
-
# Look for shortest augmenting paths using breadth-first search.
|
|
72
|
-
flow_value = 0
|
|
73
|
-
while flow_value < cutoff:
|
|
74
|
-
v, pred, succ = bidirectional_bfs()
|
|
75
|
-
if pred is None:
|
|
76
|
-
break
|
|
77
|
-
path = [v]
|
|
78
|
-
# Trace a path from s to v.
|
|
79
|
-
u = v
|
|
80
|
-
while u != s:
|
|
81
|
-
u = pred[u]
|
|
82
|
-
path.append(u)
|
|
83
|
-
path.reverse()
|
|
84
|
-
# Trace a path from v to t.
|
|
85
|
-
u = v
|
|
86
|
-
while u != t:
|
|
87
|
-
u = succ[u]
|
|
88
|
-
path.append(u)
|
|
89
|
-
flow_value += augment(path)
|
|
90
|
-
|
|
91
|
-
return flow_value
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
def edmonds_karp_impl(G, s, t, capacity, residual, cutoff):
|
|
95
|
-
"""Implementation of the Edmonds-Karp algorithm."""
|
|
96
|
-
if s not in G:
|
|
97
|
-
raise nx.NetworkXError(f"node {str(s)} not in graph")
|
|
98
|
-
if t not in G:
|
|
99
|
-
raise nx.NetworkXError(f"node {str(t)} not in graph")
|
|
100
|
-
if s == t:
|
|
101
|
-
raise nx.NetworkXError("source and sink are the same node")
|
|
102
|
-
|
|
103
|
-
if residual is None:
|
|
104
|
-
R = build_residual_network(G, capacity)
|
|
105
|
-
else:
|
|
106
|
-
R = residual
|
|
107
|
-
|
|
108
|
-
# Initialize/reset the residual network.
|
|
109
|
-
for u in R:
|
|
110
|
-
for e in R[u].values():
|
|
111
|
-
e["flow"] = 0
|
|
112
|
-
|
|
113
|
-
if cutoff is None:
|
|
114
|
-
cutoff = float("inf")
|
|
115
|
-
R.graph["flow_value"] = edmonds_karp_core(R, s, t, cutoff)
|
|
116
|
-
|
|
117
|
-
return R
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
@nx._dispatchable(edge_attrs={"capacity": float("inf")}, returns_graph=True)
|
|
121
|
-
def edmonds_karp(
|
|
122
|
-
G, s, t, capacity="capacity", residual=None, value_only=False, cutoff=None
|
|
123
|
-
):
|
|
124
|
-
"""Find a maximum single-commodity flow using the Edmonds-Karp algorithm.
|
|
125
|
-
|
|
126
|
-
This function returns the residual network resulting after computing
|
|
127
|
-
the maximum flow. See below for details about the conventions
|
|
128
|
-
NetworkX uses for defining residual networks.
|
|
129
|
-
|
|
130
|
-
This algorithm has a running time of $O(n m^2)$ for $n$ nodes and $m$
|
|
131
|
-
edges.
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
Parameters
|
|
135
|
-
----------
|
|
136
|
-
G : NetworkX graph
|
|
137
|
-
Edges of the graph are expected to have an attribute called
|
|
138
|
-
'capacity'. If this attribute is not present, the edge is
|
|
139
|
-
considered to have infinite capacity.
|
|
140
|
-
|
|
141
|
-
s : node
|
|
142
|
-
Source node for the flow.
|
|
143
|
-
|
|
144
|
-
t : node
|
|
145
|
-
Sink node for the flow.
|
|
146
|
-
|
|
147
|
-
capacity : string
|
|
148
|
-
Edges of the graph G are expected to have an attribute capacity
|
|
149
|
-
that indicates how much flow the edge can support. If this
|
|
150
|
-
attribute is not present, the edge is considered to have
|
|
151
|
-
infinite capacity. Default value: 'capacity'.
|
|
152
|
-
|
|
153
|
-
residual : NetworkX graph
|
|
154
|
-
Residual network on which the algorithm is to be executed. If None, a
|
|
155
|
-
new residual network is created. Default value: None.
|
|
156
|
-
|
|
157
|
-
value_only : bool
|
|
158
|
-
If True compute only the value of the maximum flow. This parameter
|
|
159
|
-
will be ignored by this algorithm because it is not applicable.
|
|
160
|
-
|
|
161
|
-
cutoff : integer, float
|
|
162
|
-
If specified, the algorithm will terminate when the flow value reaches
|
|
163
|
-
or exceeds the cutoff. In this case, it may be unable to immediately
|
|
164
|
-
determine a minimum cut. Default value: None.
|
|
165
|
-
|
|
166
|
-
Returns
|
|
167
|
-
-------
|
|
168
|
-
R : NetworkX DiGraph
|
|
169
|
-
Residual network after computing the maximum flow.
|
|
170
|
-
|
|
171
|
-
Raises
|
|
172
|
-
------
|
|
173
|
-
NetworkXError
|
|
174
|
-
The algorithm does not support MultiGraph and MultiDiGraph. If
|
|
175
|
-
the input graph is an instance of one of these two classes, a
|
|
176
|
-
NetworkXError is raised.
|
|
177
|
-
|
|
178
|
-
NetworkXUnbounded
|
|
179
|
-
If the graph has a path of infinite capacity, the value of a
|
|
180
|
-
feasible flow on the graph is unbounded above and the function
|
|
181
|
-
raises a NetworkXUnbounded.
|
|
182
|
-
|
|
183
|
-
See also
|
|
184
|
-
--------
|
|
185
|
-
:meth:`maximum_flow`
|
|
186
|
-
:meth:`minimum_cut`
|
|
187
|
-
:meth:`preflow_push`
|
|
188
|
-
:meth:`shortest_augmenting_path`
|
|
189
|
-
|
|
190
|
-
Notes
|
|
191
|
-
-----
|
|
192
|
-
The residual network :samp:`R` from an input graph :samp:`G` has the
|
|
193
|
-
same nodes as :samp:`G`. :samp:`R` is a DiGraph that contains a pair
|
|
194
|
-
of edges :samp:`(u, v)` and :samp:`(v, u)` iff :samp:`(u, v)` is not a
|
|
195
|
-
self-loop, and at least one of :samp:`(u, v)` and :samp:`(v, u)` exists
|
|
196
|
-
in :samp:`G`.
|
|
197
|
-
|
|
198
|
-
For each edge :samp:`(u, v)` in :samp:`R`, :samp:`R[u][v]['capacity']`
|
|
199
|
-
is equal to the capacity of :samp:`(u, v)` in :samp:`G` if it exists
|
|
200
|
-
in :samp:`G` or zero otherwise. If the capacity is infinite,
|
|
201
|
-
:samp:`R[u][v]['capacity']` will have a high arbitrary finite value
|
|
202
|
-
that does not affect the solution of the problem. This value is stored in
|
|
203
|
-
:samp:`R.graph['inf']`. For each edge :samp:`(u, v)` in :samp:`R`,
|
|
204
|
-
:samp:`R[u][v]['flow']` represents the flow function of :samp:`(u, v)` and
|
|
205
|
-
satisfies :samp:`R[u][v]['flow'] == -R[v][u]['flow']`.
|
|
206
|
-
|
|
207
|
-
The flow value, defined as the total flow into :samp:`t`, the sink, is
|
|
208
|
-
stored in :samp:`R.graph['flow_value']`. If :samp:`cutoff` is not
|
|
209
|
-
specified, reachability to :samp:`t` using only edges :samp:`(u, v)` such
|
|
210
|
-
that :samp:`R[u][v]['flow'] < R[u][v]['capacity']` induces a minimum
|
|
211
|
-
:samp:`s`-:samp:`t` cut.
|
|
212
|
-
|
|
213
|
-
Examples
|
|
214
|
-
--------
|
|
215
|
-
>>> from networkx.algorithms.flow import edmonds_karp
|
|
216
|
-
|
|
217
|
-
The functions that implement flow algorithms and output a residual
|
|
218
|
-
network, such as this one, are not imported to the base NetworkX
|
|
219
|
-
namespace, so you have to explicitly import them from the flow package.
|
|
220
|
-
|
|
221
|
-
>>> G = nx.DiGraph()
|
|
222
|
-
>>> G.add_edge("x", "a", capacity=3.0)
|
|
223
|
-
>>> G.add_edge("x", "b", capacity=1.0)
|
|
224
|
-
>>> G.add_edge("a", "c", capacity=3.0)
|
|
225
|
-
>>> G.add_edge("b", "c", capacity=5.0)
|
|
226
|
-
>>> G.add_edge("b", "d", capacity=4.0)
|
|
227
|
-
>>> G.add_edge("d", "e", capacity=2.0)
|
|
228
|
-
>>> G.add_edge("c", "y", capacity=2.0)
|
|
229
|
-
>>> G.add_edge("e", "y", capacity=3.0)
|
|
230
|
-
>>> R = edmonds_karp(G, "x", "y")
|
|
231
|
-
>>> flow_value = nx.maximum_flow_value(G, "x", "y")
|
|
232
|
-
>>> flow_value
|
|
233
|
-
3.0
|
|
234
|
-
>>> flow_value == R.graph["flow_value"]
|
|
235
|
-
True
|
|
236
|
-
|
|
237
|
-
"""
|
|
238
|
-
R = edmonds_karp_impl(G, s, t, capacity, residual, cutoff)
|
|
239
|
-
R.graph["algorithm"] = "edmonds_karp"
|
|
240
|
-
nx._clear_cache(R)
|
|
241
|
-
return R
|
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Gomory-Hu tree of undirected Graphs.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
from networkx.utils import not_implemented_for
|
|
7
|
-
|
|
8
|
-
from .edmondskarp import edmonds_karp
|
|
9
|
-
from .utils import build_residual_network
|
|
10
|
-
|
|
11
|
-
default_flow_func = edmonds_karp
|
|
12
|
-
|
|
13
|
-
__all__ = ["gomory_hu_tree"]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@not_implemented_for("directed")
|
|
17
|
-
@nx._dispatchable(edge_attrs={"capacity": float("inf")}, returns_graph=True)
|
|
18
|
-
def gomory_hu_tree(G, capacity="capacity", flow_func=None):
|
|
19
|
-
r"""Returns the Gomory-Hu tree of an undirected graph G.
|
|
20
|
-
|
|
21
|
-
A Gomory-Hu tree of an undirected graph with capacities is a
|
|
22
|
-
weighted tree that represents the minimum s-t cuts for all s-t
|
|
23
|
-
pairs in the graph.
|
|
24
|
-
|
|
25
|
-
It only requires `n-1` minimum cut computations instead of the
|
|
26
|
-
obvious `n(n-1)/2`. The tree represents all s-t cuts as the
|
|
27
|
-
minimum cut value among any pair of nodes is the minimum edge
|
|
28
|
-
weight in the shortest path between the two nodes in the
|
|
29
|
-
Gomory-Hu tree.
|
|
30
|
-
|
|
31
|
-
The Gomory-Hu tree also has the property that removing the
|
|
32
|
-
edge with the minimum weight in the shortest path between
|
|
33
|
-
any two nodes leaves two connected components that form
|
|
34
|
-
a partition of the nodes in G that defines the minimum s-t
|
|
35
|
-
cut.
|
|
36
|
-
|
|
37
|
-
See Examples section below for details.
|
|
38
|
-
|
|
39
|
-
Parameters
|
|
40
|
-
----------
|
|
41
|
-
G : NetworkX graph
|
|
42
|
-
Undirected graph
|
|
43
|
-
|
|
44
|
-
capacity : string
|
|
45
|
-
Edges of the graph G are expected to have an attribute capacity
|
|
46
|
-
that indicates how much flow the edge can support. If this
|
|
47
|
-
attribute is not present, the edge is considered to have
|
|
48
|
-
infinite capacity. Default value: 'capacity'.
|
|
49
|
-
|
|
50
|
-
flow_func : function
|
|
51
|
-
Function to perform the underlying flow computations. Default value
|
|
52
|
-
:func:`edmonds_karp`. This function performs better in sparse graphs
|
|
53
|
-
with right tailed degree distributions.
|
|
54
|
-
:func:`shortest_augmenting_path` will perform better in denser
|
|
55
|
-
graphs.
|
|
56
|
-
|
|
57
|
-
Returns
|
|
58
|
-
-------
|
|
59
|
-
Tree : NetworkX graph
|
|
60
|
-
A NetworkX graph representing the Gomory-Hu tree of the input graph.
|
|
61
|
-
|
|
62
|
-
Raises
|
|
63
|
-
------
|
|
64
|
-
NetworkXNotImplemented
|
|
65
|
-
Raised if the input graph is directed.
|
|
66
|
-
|
|
67
|
-
NetworkXError
|
|
68
|
-
Raised if the input graph is an empty Graph.
|
|
69
|
-
|
|
70
|
-
Examples
|
|
71
|
-
--------
|
|
72
|
-
>>> G = nx.karate_club_graph()
|
|
73
|
-
>>> nx.set_edge_attributes(G, 1, "capacity")
|
|
74
|
-
>>> T = nx.gomory_hu_tree(G)
|
|
75
|
-
>>> # The value of the minimum cut between any pair
|
|
76
|
-
... # of nodes in G is the minimum edge weight in the
|
|
77
|
-
... # shortest path between the two nodes in the
|
|
78
|
-
... # Gomory-Hu tree.
|
|
79
|
-
... def minimum_edge_weight_in_shortest_path(T, u, v):
|
|
80
|
-
... path = nx.shortest_path(T, u, v, weight="weight")
|
|
81
|
-
... return min((T[u][v]["weight"], (u, v)) for (u, v) in zip(path, path[1:]))
|
|
82
|
-
>>> u, v = 0, 33
|
|
83
|
-
>>> cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
|
|
84
|
-
>>> cut_value
|
|
85
|
-
10
|
|
86
|
-
>>> nx.minimum_cut_value(G, u, v)
|
|
87
|
-
10
|
|
88
|
-
>>> # The Gomory-Hu tree also has the property that removing the
|
|
89
|
-
... # edge with the minimum weight in the shortest path between
|
|
90
|
-
... # any two nodes leaves two connected components that form
|
|
91
|
-
... # a partition of the nodes in G that defines the minimum s-t
|
|
92
|
-
... # cut.
|
|
93
|
-
... cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
|
|
94
|
-
>>> T.remove_edge(*edge)
|
|
95
|
-
>>> U, V = list(nx.connected_components(T))
|
|
96
|
-
>>> # Thus U and V form a partition that defines a minimum cut
|
|
97
|
-
... # between u and v in G. You can compute the edge cut set,
|
|
98
|
-
... # that is, the set of edges that if removed from G will
|
|
99
|
-
... # disconnect u from v in G, with this information:
|
|
100
|
-
... cutset = set()
|
|
101
|
-
>>> for x, nbrs in ((n, G[n]) for n in U):
|
|
102
|
-
... cutset.update((x, y) for y in nbrs if y in V)
|
|
103
|
-
>>> # Because we have set the capacities of all edges to 1
|
|
104
|
-
... # the cutset contains ten edges
|
|
105
|
-
... len(cutset)
|
|
106
|
-
10
|
|
107
|
-
>>> # You can use any maximum flow algorithm for the underlying
|
|
108
|
-
... # flow computations using the argument flow_func
|
|
109
|
-
... from networkx.algorithms import flow
|
|
110
|
-
>>> T = nx.gomory_hu_tree(G, flow_func=flow.boykov_kolmogorov)
|
|
111
|
-
>>> cut_value, edge = minimum_edge_weight_in_shortest_path(T, u, v)
|
|
112
|
-
>>> cut_value
|
|
113
|
-
10
|
|
114
|
-
>>> nx.minimum_cut_value(G, u, v, flow_func=flow.boykov_kolmogorov)
|
|
115
|
-
10
|
|
116
|
-
|
|
117
|
-
Notes
|
|
118
|
-
-----
|
|
119
|
-
This implementation is based on Gusfield approach [1]_ to compute
|
|
120
|
-
Gomory-Hu trees, which does not require node contractions and has
|
|
121
|
-
the same computational complexity than the original method.
|
|
122
|
-
|
|
123
|
-
See also
|
|
124
|
-
--------
|
|
125
|
-
:func:`minimum_cut`
|
|
126
|
-
:func:`maximum_flow`
|
|
127
|
-
|
|
128
|
-
References
|
|
129
|
-
----------
|
|
130
|
-
.. [1] Gusfield D: Very simple methods for all pairs network flow analysis.
|
|
131
|
-
SIAM J Comput 19(1):143-155, 1990.
|
|
132
|
-
|
|
133
|
-
"""
|
|
134
|
-
if flow_func is None:
|
|
135
|
-
flow_func = default_flow_func
|
|
136
|
-
|
|
137
|
-
if len(G) == 0: # empty graph
|
|
138
|
-
msg = "Empty Graph does not have a Gomory-Hu tree representation"
|
|
139
|
-
raise nx.NetworkXError(msg)
|
|
140
|
-
|
|
141
|
-
# Start the tree as a star graph with an arbitrary node at the center
|
|
142
|
-
tree = {}
|
|
143
|
-
labels = {}
|
|
144
|
-
iter_nodes = iter(G)
|
|
145
|
-
root = next(iter_nodes)
|
|
146
|
-
for n in iter_nodes:
|
|
147
|
-
tree[n] = root
|
|
148
|
-
|
|
149
|
-
# Reuse residual network
|
|
150
|
-
R = build_residual_network(G, capacity)
|
|
151
|
-
|
|
152
|
-
# For all the leaves in the star graph tree (that is n-1 nodes).
|
|
153
|
-
for source in tree:
|
|
154
|
-
# Find neighbor in the tree
|
|
155
|
-
target = tree[source]
|
|
156
|
-
# compute minimum cut
|
|
157
|
-
cut_value, partition = nx.minimum_cut(
|
|
158
|
-
G, source, target, capacity=capacity, flow_func=flow_func, residual=R
|
|
159
|
-
)
|
|
160
|
-
labels[(source, target)] = cut_value
|
|
161
|
-
# Update the tree
|
|
162
|
-
# Source will always be in partition[0] and target in partition[1]
|
|
163
|
-
for node in partition[0]:
|
|
164
|
-
if node != source and node in tree and tree[node] == target:
|
|
165
|
-
tree[node] = source
|
|
166
|
-
labels[node, source] = labels.get((node, target), cut_value)
|
|
167
|
-
#
|
|
168
|
-
if target != root and tree[target] in partition[0]:
|
|
169
|
-
labels[source, tree[target]] = labels[target, tree[target]]
|
|
170
|
-
labels[target, source] = cut_value
|
|
171
|
-
tree[source] = tree[target]
|
|
172
|
-
tree[target] = source
|
|
173
|
-
|
|
174
|
-
# Build the tree
|
|
175
|
-
T = nx.Graph()
|
|
176
|
-
T.add_nodes_from(G)
|
|
177
|
-
T.add_weighted_edges_from(((u, v, labels[u, v]) for u, v in tree.items()))
|
|
178
|
-
return T
|