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,255 +0,0 @@
|
|
|
1
|
-
"""Functions for computing treewidth decomposition.
|
|
2
|
-
|
|
3
|
-
Treewidth of an undirected graph is a number associated with the graph.
|
|
4
|
-
It can be defined as the size of the largest vertex set (bag) in a tree
|
|
5
|
-
decomposition of the graph minus one.
|
|
6
|
-
|
|
7
|
-
`Wikipedia: Treewidth <https://en.wikipedia.org/wiki/Treewidth>`_
|
|
8
|
-
|
|
9
|
-
The notions of treewidth and tree decomposition have gained their
|
|
10
|
-
attractiveness partly because many graph and network problems that are
|
|
11
|
-
intractable (e.g., NP-hard) on arbitrary graphs become efficiently
|
|
12
|
-
solvable (e.g., with a linear time algorithm) when the treewidth of the
|
|
13
|
-
input graphs is bounded by a constant [1]_ [2]_.
|
|
14
|
-
|
|
15
|
-
There are two different functions for computing a tree decomposition:
|
|
16
|
-
:func:`treewidth_min_degree` and :func:`treewidth_min_fill_in`.
|
|
17
|
-
|
|
18
|
-
.. [1] Hans L. Bodlaender and Arie M. C. A. Koster. 2010. "Treewidth
|
|
19
|
-
computations I.Upper bounds". Inf. Comput. 208, 3 (March 2010),259-275.
|
|
20
|
-
http://dx.doi.org/10.1016/j.ic.2009.03.008
|
|
21
|
-
|
|
22
|
-
.. [2] Hans L. Bodlaender. "Discovering Treewidth". Institute of Information
|
|
23
|
-
and Computing Sciences, Utrecht University.
|
|
24
|
-
Technical Report UU-CS-2005-018.
|
|
25
|
-
http://www.cs.uu.nl
|
|
26
|
-
|
|
27
|
-
.. [3] K. Wang, Z. Lu, and J. Hicks *Treewidth*.
|
|
28
|
-
https://web.archive.org/web/20210507025929/http://web.eecs.utk.edu/~cphill25/cs594_spring2015_projects/treewidth.pdf
|
|
29
|
-
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
import itertools
|
|
33
|
-
import sys
|
|
34
|
-
from heapq import heapify, heappop, heappush
|
|
35
|
-
|
|
36
|
-
import networkx as nx
|
|
37
|
-
from networkx.utils import not_implemented_for
|
|
38
|
-
|
|
39
|
-
__all__ = ["treewidth_min_degree", "treewidth_min_fill_in"]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
@not_implemented_for("directed")
|
|
43
|
-
@not_implemented_for("multigraph")
|
|
44
|
-
@nx._dispatchable(returns_graph=True)
|
|
45
|
-
def treewidth_min_degree(G):
|
|
46
|
-
"""Returns a treewidth decomposition using the Minimum Degree heuristic.
|
|
47
|
-
|
|
48
|
-
The heuristic chooses the nodes according to their degree, i.e., first
|
|
49
|
-
the node with the lowest degree is chosen, then the graph is updated
|
|
50
|
-
and the corresponding node is removed. Next, a new node with the lowest
|
|
51
|
-
degree is chosen, and so on.
|
|
52
|
-
|
|
53
|
-
Parameters
|
|
54
|
-
----------
|
|
55
|
-
G : NetworkX graph
|
|
56
|
-
|
|
57
|
-
Returns
|
|
58
|
-
-------
|
|
59
|
-
Treewidth decomposition : (int, Graph) tuple
|
|
60
|
-
2-tuple with treewidth and the corresponding decomposed tree.
|
|
61
|
-
"""
|
|
62
|
-
deg_heuristic = MinDegreeHeuristic(G)
|
|
63
|
-
return treewidth_decomp(G, lambda graph: deg_heuristic.best_node(graph))
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
@not_implemented_for("directed")
|
|
67
|
-
@not_implemented_for("multigraph")
|
|
68
|
-
@nx._dispatchable(returns_graph=True)
|
|
69
|
-
def treewidth_min_fill_in(G):
|
|
70
|
-
"""Returns a treewidth decomposition using the Minimum Fill-in heuristic.
|
|
71
|
-
|
|
72
|
-
The heuristic chooses a node from the graph, where the number of edges
|
|
73
|
-
added turning the neighborhood of the chosen node into clique is as
|
|
74
|
-
small as possible.
|
|
75
|
-
|
|
76
|
-
Parameters
|
|
77
|
-
----------
|
|
78
|
-
G : NetworkX graph
|
|
79
|
-
|
|
80
|
-
Returns
|
|
81
|
-
-------
|
|
82
|
-
Treewidth decomposition : (int, Graph) tuple
|
|
83
|
-
2-tuple with treewidth and the corresponding decomposed tree.
|
|
84
|
-
"""
|
|
85
|
-
return treewidth_decomp(G, min_fill_in_heuristic)
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class MinDegreeHeuristic:
|
|
89
|
-
"""Implements the Minimum Degree heuristic.
|
|
90
|
-
|
|
91
|
-
The heuristic chooses the nodes according to their degree
|
|
92
|
-
(number of neighbors), i.e., first the node with the lowest degree is
|
|
93
|
-
chosen, then the graph is updated and the corresponding node is
|
|
94
|
-
removed. Next, a new node with the lowest degree is chosen, and so on.
|
|
95
|
-
"""
|
|
96
|
-
|
|
97
|
-
def __init__(self, graph):
|
|
98
|
-
self._graph = graph
|
|
99
|
-
|
|
100
|
-
# nodes that have to be updated in the heap before each iteration
|
|
101
|
-
self._update_nodes = []
|
|
102
|
-
|
|
103
|
-
self._degreeq = [] # a heapq with 3-tuples (degree,unique_id,node)
|
|
104
|
-
self.count = itertools.count()
|
|
105
|
-
|
|
106
|
-
# build heap with initial degrees
|
|
107
|
-
for n in graph:
|
|
108
|
-
self._degreeq.append((len(graph[n]), next(self.count), n))
|
|
109
|
-
heapify(self._degreeq)
|
|
110
|
-
|
|
111
|
-
def best_node(self, graph):
|
|
112
|
-
# update nodes in self._update_nodes
|
|
113
|
-
for n in self._update_nodes:
|
|
114
|
-
# insert changed degrees into degreeq
|
|
115
|
-
heappush(self._degreeq, (len(graph[n]), next(self.count), n))
|
|
116
|
-
|
|
117
|
-
# get the next valid (minimum degree) node
|
|
118
|
-
while self._degreeq:
|
|
119
|
-
(min_degree, _, elim_node) = heappop(self._degreeq)
|
|
120
|
-
if elim_node not in graph or len(graph[elim_node]) != min_degree:
|
|
121
|
-
# outdated entry in degreeq
|
|
122
|
-
continue
|
|
123
|
-
elif min_degree == len(graph) - 1:
|
|
124
|
-
# fully connected: abort condition
|
|
125
|
-
return None
|
|
126
|
-
|
|
127
|
-
# remember to update nodes in the heap before getting the next node
|
|
128
|
-
self._update_nodes = graph[elim_node]
|
|
129
|
-
return elim_node
|
|
130
|
-
|
|
131
|
-
# the heap is empty: abort
|
|
132
|
-
return None
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
def min_fill_in_heuristic(graph_dict):
|
|
136
|
-
"""Implements the Minimum Degree heuristic.
|
|
137
|
-
|
|
138
|
-
graph_dict: dict keyed by node to sets of neighbors (no self-loops)
|
|
139
|
-
|
|
140
|
-
Returns the node from the graph, where the number of edges added when
|
|
141
|
-
turning the neighborhood of the chosen node into clique is as small as
|
|
142
|
-
possible. This algorithm chooses the nodes using the Minimum Fill-In
|
|
143
|
-
heuristic. The running time of the algorithm is :math:`O(V^3)` and it uses
|
|
144
|
-
additional constant memory.
|
|
145
|
-
"""
|
|
146
|
-
|
|
147
|
-
if len(graph_dict) == 0:
|
|
148
|
-
return None
|
|
149
|
-
|
|
150
|
-
min_fill_in_node = None
|
|
151
|
-
|
|
152
|
-
min_fill_in = sys.maxsize
|
|
153
|
-
|
|
154
|
-
# sort nodes by degree
|
|
155
|
-
nodes_by_degree = sorted(graph_dict, key=lambda x: len(graph_dict[x]))
|
|
156
|
-
min_degree = len(graph_dict[nodes_by_degree[0]])
|
|
157
|
-
|
|
158
|
-
# abort condition (handle complete graph)
|
|
159
|
-
if min_degree == len(graph_dict) - 1:
|
|
160
|
-
return None
|
|
161
|
-
|
|
162
|
-
for node in nodes_by_degree:
|
|
163
|
-
num_fill_in = 0
|
|
164
|
-
nbrs = graph_dict[node]
|
|
165
|
-
for nbr in nbrs:
|
|
166
|
-
# count how many nodes in nbrs current nbr is not connected to
|
|
167
|
-
# subtract 1 for the node itself
|
|
168
|
-
num_fill_in += len(nbrs - graph_dict[nbr]) - 1
|
|
169
|
-
if num_fill_in >= 2 * min_fill_in:
|
|
170
|
-
break
|
|
171
|
-
|
|
172
|
-
num_fill_in /= 2 # divide by 2 because of double counting
|
|
173
|
-
|
|
174
|
-
if num_fill_in < min_fill_in: # update min-fill-in node
|
|
175
|
-
if num_fill_in == 0:
|
|
176
|
-
return node
|
|
177
|
-
min_fill_in = num_fill_in
|
|
178
|
-
min_fill_in_node = node
|
|
179
|
-
|
|
180
|
-
return min_fill_in_node
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
@nx._dispatchable(returns_graph=True)
|
|
184
|
-
def treewidth_decomp(G, heuristic=min_fill_in_heuristic):
|
|
185
|
-
"""Returns a treewidth decomposition using the passed heuristic.
|
|
186
|
-
|
|
187
|
-
Parameters
|
|
188
|
-
----------
|
|
189
|
-
G : NetworkX graph
|
|
190
|
-
heuristic : heuristic function
|
|
191
|
-
|
|
192
|
-
Returns
|
|
193
|
-
-------
|
|
194
|
-
Treewidth decomposition : (int, Graph) tuple
|
|
195
|
-
2-tuple with treewidth and the corresponding decomposed tree.
|
|
196
|
-
"""
|
|
197
|
-
|
|
198
|
-
# make dict-of-sets structure
|
|
199
|
-
graph_dict = {n: set(G[n]) - {n} for n in G}
|
|
200
|
-
|
|
201
|
-
# stack containing nodes and neighbors in the order from the heuristic
|
|
202
|
-
node_stack = []
|
|
203
|
-
|
|
204
|
-
# get first node from heuristic
|
|
205
|
-
elim_node = heuristic(graph_dict)
|
|
206
|
-
while elim_node is not None:
|
|
207
|
-
# connect all neighbors with each other
|
|
208
|
-
nbrs = graph_dict[elim_node]
|
|
209
|
-
for u, v in itertools.permutations(nbrs, 2):
|
|
210
|
-
if v not in graph_dict[u]:
|
|
211
|
-
graph_dict[u].add(v)
|
|
212
|
-
|
|
213
|
-
# push node and its current neighbors on stack
|
|
214
|
-
node_stack.append((elim_node, nbrs))
|
|
215
|
-
|
|
216
|
-
# remove node from graph_dict
|
|
217
|
-
for u in graph_dict[elim_node]:
|
|
218
|
-
graph_dict[u].remove(elim_node)
|
|
219
|
-
|
|
220
|
-
del graph_dict[elim_node]
|
|
221
|
-
elim_node = heuristic(graph_dict)
|
|
222
|
-
|
|
223
|
-
# the abort condition is met; put all remaining nodes into one bag
|
|
224
|
-
decomp = nx.Graph()
|
|
225
|
-
first_bag = frozenset(graph_dict.keys())
|
|
226
|
-
decomp.add_node(first_bag)
|
|
227
|
-
|
|
228
|
-
treewidth = len(first_bag) - 1
|
|
229
|
-
|
|
230
|
-
while node_stack:
|
|
231
|
-
# get node and its neighbors from the stack
|
|
232
|
-
(curr_node, nbrs) = node_stack.pop()
|
|
233
|
-
|
|
234
|
-
# find a bag all neighbors are in
|
|
235
|
-
old_bag = None
|
|
236
|
-
for bag in decomp.nodes:
|
|
237
|
-
if nbrs <= bag:
|
|
238
|
-
old_bag = bag
|
|
239
|
-
break
|
|
240
|
-
|
|
241
|
-
if old_bag is None:
|
|
242
|
-
# no old_bag was found: just connect to the first_bag
|
|
243
|
-
old_bag = first_bag
|
|
244
|
-
|
|
245
|
-
# create new node for decomposition
|
|
246
|
-
nbrs.add(curr_node)
|
|
247
|
-
new_bag = frozenset(nbrs)
|
|
248
|
-
|
|
249
|
-
# update treewidth
|
|
250
|
-
treewidth = max(treewidth, len(new_bag) - 1)
|
|
251
|
-
|
|
252
|
-
# add edge to decomposition (implicitly also adds the new node)
|
|
253
|
-
decomp.add_edge(old_bag, new_bag)
|
|
254
|
-
|
|
255
|
-
return treewidth, decomp
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
"""Functions for computing an approximate minimum weight vertex cover.
|
|
2
|
-
|
|
3
|
-
A |vertex cover|_ is a subset of nodes such that each edge in the graph
|
|
4
|
-
is incident to at least one node in the subset.
|
|
5
|
-
|
|
6
|
-
.. _vertex cover: https://en.wikipedia.org/wiki/Vertex_cover
|
|
7
|
-
.. |vertex cover| replace:: *vertex cover*
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import networkx as nx
|
|
12
|
-
|
|
13
|
-
__all__ = ["min_weighted_vertex_cover"]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
@nx._dispatchable(node_attrs="weight")
|
|
17
|
-
def min_weighted_vertex_cover(G, weight=None):
|
|
18
|
-
r"""Returns an approximate minimum weighted vertex cover.
|
|
19
|
-
|
|
20
|
-
The set of nodes returned by this function is guaranteed to be a
|
|
21
|
-
vertex cover, and the total weight of the set is guaranteed to be at
|
|
22
|
-
most twice the total weight of the minimum weight vertex cover. In
|
|
23
|
-
other words,
|
|
24
|
-
|
|
25
|
-
.. math::
|
|
26
|
-
|
|
27
|
-
w(S) \leq 2 * w(S^*),
|
|
28
|
-
|
|
29
|
-
where $S$ is the vertex cover returned by this function,
|
|
30
|
-
$S^*$ is the vertex cover of minimum weight out of all vertex
|
|
31
|
-
covers of the graph, and $w$ is the function that computes the
|
|
32
|
-
sum of the weights of each node in that given set.
|
|
33
|
-
|
|
34
|
-
Parameters
|
|
35
|
-
----------
|
|
36
|
-
G : NetworkX graph
|
|
37
|
-
|
|
38
|
-
weight : string, optional (default = None)
|
|
39
|
-
If None, every node has weight 1. If a string, use this node
|
|
40
|
-
attribute as the node weight. A node without this attribute is
|
|
41
|
-
assumed to have weight 1.
|
|
42
|
-
|
|
43
|
-
Returns
|
|
44
|
-
-------
|
|
45
|
-
min_weighted_cover : set
|
|
46
|
-
Returns a set of nodes whose weight sum is no more than twice
|
|
47
|
-
the weight sum of the minimum weight vertex cover.
|
|
48
|
-
|
|
49
|
-
Notes
|
|
50
|
-
-----
|
|
51
|
-
For a directed graph, a vertex cover has the same definition: a set
|
|
52
|
-
of nodes such that each edge in the graph is incident to at least
|
|
53
|
-
one node in the set. Whether the node is the head or tail of the
|
|
54
|
-
directed edge is ignored.
|
|
55
|
-
|
|
56
|
-
This is the local-ratio algorithm for computing an approximate
|
|
57
|
-
vertex cover. The algorithm greedily reduces the costs over edges,
|
|
58
|
-
iteratively building a cover. The worst-case runtime of this
|
|
59
|
-
implementation is $O(m \log n)$, where $n$ is the number
|
|
60
|
-
of nodes and $m$ the number of edges in the graph.
|
|
61
|
-
|
|
62
|
-
References
|
|
63
|
-
----------
|
|
64
|
-
.. [1] Bar-Yehuda, R., and Even, S. (1985). "A local-ratio theorem for
|
|
65
|
-
approximating the weighted vertex cover problem."
|
|
66
|
-
*Annals of Discrete Mathematics*, 25, 27–46
|
|
67
|
-
<http://www.cs.technion.ac.il/~reuven/PDF/vc_lr.pdf>
|
|
68
|
-
|
|
69
|
-
"""
|
|
70
|
-
cost = dict(G.nodes(data=weight, default=1))
|
|
71
|
-
# While there are uncovered edges, choose an uncovered and update
|
|
72
|
-
# the cost of the remaining edges.
|
|
73
|
-
cover = set()
|
|
74
|
-
for u, v in G.edges():
|
|
75
|
-
if u in cover or v in cover:
|
|
76
|
-
continue
|
|
77
|
-
if cost[u] <= cost[v]:
|
|
78
|
-
cover.add(u)
|
|
79
|
-
cost[v] -= cost[u]
|
|
80
|
-
else:
|
|
81
|
-
cover.add(v)
|
|
82
|
-
cost[u] -= cost[v]
|
|
83
|
-
return cover
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
from networkx.algorithms.assortativity.connectivity import *
|
|
2
|
-
from networkx.algorithms.assortativity.correlation import *
|
|
3
|
-
from networkx.algorithms.assortativity.mixing import *
|
|
4
|
-
from networkx.algorithms.assortativity.neighbor_degree import *
|
|
5
|
-
from networkx.algorithms.assortativity.pairs import *
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
from collections import defaultdict
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
|
|
5
|
-
__all__ = ["average_degree_connectivity"]
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@nx._dispatchable(edge_attrs="weight")
|
|
9
|
-
def average_degree_connectivity(
|
|
10
|
-
G, source="in+out", target="in+out", nodes=None, weight=None
|
|
11
|
-
):
|
|
12
|
-
r"""Compute the average degree connectivity of graph.
|
|
13
|
-
|
|
14
|
-
The average degree connectivity is the average nearest neighbor degree of
|
|
15
|
-
nodes with degree k. For weighted graphs, an analogous measure can
|
|
16
|
-
be computed using the weighted average neighbors degree defined in
|
|
17
|
-
[1]_, for a node `i`, as
|
|
18
|
-
|
|
19
|
-
.. math::
|
|
20
|
-
|
|
21
|
-
k_{nn,i}^{w} = \frac{1}{s_i} \sum_{j \in N(i)} w_{ij} k_j
|
|
22
|
-
|
|
23
|
-
where `s_i` is the weighted degree of node `i`,
|
|
24
|
-
`w_{ij}` is the weight of the edge that links `i` and `j`,
|
|
25
|
-
and `N(i)` are the neighbors of node `i`.
|
|
26
|
-
|
|
27
|
-
Parameters
|
|
28
|
-
----------
|
|
29
|
-
G : NetworkX graph
|
|
30
|
-
|
|
31
|
-
source : "in"|"out"|"in+out" (default:"in+out")
|
|
32
|
-
Directed graphs only. Use "in"- or "out"-degree for source node.
|
|
33
|
-
|
|
34
|
-
target : "in"|"out"|"in+out" (default:"in+out"
|
|
35
|
-
Directed graphs only. Use "in"- or "out"-degree for target node.
|
|
36
|
-
|
|
37
|
-
nodes : list or iterable (optional)
|
|
38
|
-
Compute neighbor connectivity for these nodes. The default is all
|
|
39
|
-
nodes.
|
|
40
|
-
|
|
41
|
-
weight : string or None, optional (default=None)
|
|
42
|
-
The edge attribute that holds the numerical value used as a weight.
|
|
43
|
-
If None, then each edge has weight 1.
|
|
44
|
-
|
|
45
|
-
Returns
|
|
46
|
-
-------
|
|
47
|
-
d : dict
|
|
48
|
-
A dictionary keyed by degree k with the value of average connectivity.
|
|
49
|
-
|
|
50
|
-
Raises
|
|
51
|
-
------
|
|
52
|
-
NetworkXError
|
|
53
|
-
If either `source` or `target` are not one of 'in',
|
|
54
|
-
'out', or 'in+out'.
|
|
55
|
-
If either `source` or `target` is passed for an undirected graph.
|
|
56
|
-
|
|
57
|
-
Examples
|
|
58
|
-
--------
|
|
59
|
-
>>> G = nx.path_graph(4)
|
|
60
|
-
>>> G.edges[1, 2]["weight"] = 3
|
|
61
|
-
>>> nx.average_degree_connectivity(G)
|
|
62
|
-
{1: 2.0, 2: 1.5}
|
|
63
|
-
>>> nx.average_degree_connectivity(G, weight="weight")
|
|
64
|
-
{1: 2.0, 2: 1.75}
|
|
65
|
-
|
|
66
|
-
See Also
|
|
67
|
-
--------
|
|
68
|
-
average_neighbor_degree
|
|
69
|
-
|
|
70
|
-
References
|
|
71
|
-
----------
|
|
72
|
-
.. [1] A. Barrat, M. Barthélemy, R. Pastor-Satorras, and A. Vespignani,
|
|
73
|
-
"The architecture of complex weighted networks".
|
|
74
|
-
PNAS 101 (11): 3747–3752 (2004).
|
|
75
|
-
"""
|
|
76
|
-
# First, determine the type of neighbors and the type of degree to use.
|
|
77
|
-
if G.is_directed():
|
|
78
|
-
if source not in ("in", "out", "in+out"):
|
|
79
|
-
raise nx.NetworkXError('source must be one of "in", "out", or "in+out"')
|
|
80
|
-
if target not in ("in", "out", "in+out"):
|
|
81
|
-
raise nx.NetworkXError('target must be one of "in", "out", or "in+out"')
|
|
82
|
-
direction = {"out": G.out_degree, "in": G.in_degree, "in+out": G.degree}
|
|
83
|
-
neighbor_funcs = {
|
|
84
|
-
"out": G.successors,
|
|
85
|
-
"in": G.predecessors,
|
|
86
|
-
"in+out": G.neighbors,
|
|
87
|
-
}
|
|
88
|
-
source_degree = direction[source]
|
|
89
|
-
target_degree = direction[target]
|
|
90
|
-
neighbors = neighbor_funcs[source]
|
|
91
|
-
# `reverse` indicates whether to look at the in-edge when
|
|
92
|
-
# computing the weight of an edge.
|
|
93
|
-
reverse = source == "in"
|
|
94
|
-
else:
|
|
95
|
-
if source != "in+out" or target != "in+out":
|
|
96
|
-
raise nx.NetworkXError(
|
|
97
|
-
f"source and target arguments are only supported for directed graphs"
|
|
98
|
-
)
|
|
99
|
-
source_degree = G.degree
|
|
100
|
-
target_degree = G.degree
|
|
101
|
-
neighbors = G.neighbors
|
|
102
|
-
reverse = False
|
|
103
|
-
dsum = defaultdict(int)
|
|
104
|
-
dnorm = defaultdict(int)
|
|
105
|
-
# Check if `source_nodes` is actually a single node in the graph.
|
|
106
|
-
source_nodes = source_degree(nodes)
|
|
107
|
-
if nodes in G:
|
|
108
|
-
source_nodes = [(nodes, source_degree(nodes))]
|
|
109
|
-
for n, k in source_nodes:
|
|
110
|
-
nbrdeg = target_degree(neighbors(n))
|
|
111
|
-
if weight is None:
|
|
112
|
-
s = sum(d for n, d in nbrdeg)
|
|
113
|
-
else: # weight nbr degree by weight of (n,nbr) edge
|
|
114
|
-
if reverse:
|
|
115
|
-
s = sum(G[nbr][n].get(weight, 1) * d for nbr, d in nbrdeg)
|
|
116
|
-
else:
|
|
117
|
-
s = sum(G[n][nbr].get(weight, 1) * d for nbr, d in nbrdeg)
|
|
118
|
-
dnorm[k] += source_degree(n, weight=weight)
|
|
119
|
-
dsum[k] += s
|
|
120
|
-
|
|
121
|
-
# normalize
|
|
122
|
-
return {k: avg if dnorm[k] == 0 else avg / dnorm[k] for k, avg in dsum.items()}
|