okstra 0.130.3 → 0.131.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.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 +21 -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/report_views.py +32 -5
- 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 +101 -6
- 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 +18 -12
- package/runtime/templates/reports/i18n/en.json +1 -0
- package/runtime/templates/reports/i18n/ko.json +1 -0
- package/runtime/templates/reports/report.css +18 -0
- package/runtime/validators/lib/fixtures.sh +6 -0
- package/runtime/validators/validate-run.py +1722 -98
- 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,483 +0,0 @@
|
|
|
1
|
-
"""Test sequences for graphiness."""
|
|
2
|
-
|
|
3
|
-
import heapq
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"is_graphical",
|
|
9
|
-
"is_multigraphical",
|
|
10
|
-
"is_pseudographical",
|
|
11
|
-
"is_digraphical",
|
|
12
|
-
"is_valid_degree_sequence_erdos_gallai",
|
|
13
|
-
"is_valid_degree_sequence_havel_hakimi",
|
|
14
|
-
]
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@nx._dispatchable(graphs=None)
|
|
18
|
-
def is_graphical(sequence, method="eg"):
|
|
19
|
-
"""Returns True if sequence is a valid degree sequence.
|
|
20
|
-
|
|
21
|
-
A degree sequence is valid if some graph can realize it.
|
|
22
|
-
|
|
23
|
-
Parameters
|
|
24
|
-
----------
|
|
25
|
-
sequence : list or iterable container
|
|
26
|
-
A sequence of integer node degrees
|
|
27
|
-
|
|
28
|
-
method : "eg" | "hh" (default: 'eg')
|
|
29
|
-
The method used to validate the degree sequence.
|
|
30
|
-
"eg" corresponds to the Erdős-Gallai algorithm
|
|
31
|
-
[EG1960]_, [choudum1986]_, and
|
|
32
|
-
"hh" to the Havel-Hakimi algorithm
|
|
33
|
-
[havel1955]_, [hakimi1962]_, [CL1996]_.
|
|
34
|
-
|
|
35
|
-
Returns
|
|
36
|
-
-------
|
|
37
|
-
valid : bool
|
|
38
|
-
True if the sequence is a valid degree sequence and False if not.
|
|
39
|
-
|
|
40
|
-
Examples
|
|
41
|
-
--------
|
|
42
|
-
>>> G = nx.path_graph(4)
|
|
43
|
-
>>> sequence = (d for n, d in G.degree())
|
|
44
|
-
>>> nx.is_graphical(sequence)
|
|
45
|
-
True
|
|
46
|
-
|
|
47
|
-
To test a non-graphical sequence:
|
|
48
|
-
>>> sequence_list = [d for n, d in G.degree()]
|
|
49
|
-
>>> sequence_list[-1] += 1
|
|
50
|
-
>>> nx.is_graphical(sequence_list)
|
|
51
|
-
False
|
|
52
|
-
|
|
53
|
-
References
|
|
54
|
-
----------
|
|
55
|
-
.. [EG1960] Erdős and Gallai, Mat. Lapok 11 264, 1960.
|
|
56
|
-
.. [choudum1986] S.A. Choudum. "A simple proof of the Erdős-Gallai theorem on
|
|
57
|
-
graph sequences." Bulletin of the Australian Mathematical Society, 33,
|
|
58
|
-
pp 67-70, 1986. https://doi.org/10.1017/S0004972700002872
|
|
59
|
-
.. [havel1955] Havel, V. "A Remark on the Existence of Finite Graphs"
|
|
60
|
-
Casopis Pest. Mat. 80, 477-480, 1955.
|
|
61
|
-
.. [hakimi1962] Hakimi, S. "On the Realizability of a Set of Integers as
|
|
62
|
-
Degrees of the Vertices of a Graph." SIAM J. Appl. Math. 10, 496-506, 1962.
|
|
63
|
-
.. [CL1996] G. Chartrand and L. Lesniak, "Graphs and Digraphs",
|
|
64
|
-
Chapman and Hall/CRC, 1996.
|
|
65
|
-
"""
|
|
66
|
-
if method == "eg":
|
|
67
|
-
valid = is_valid_degree_sequence_erdos_gallai(list(sequence))
|
|
68
|
-
elif method == "hh":
|
|
69
|
-
valid = is_valid_degree_sequence_havel_hakimi(list(sequence))
|
|
70
|
-
else:
|
|
71
|
-
msg = "`method` must be 'eg' or 'hh'"
|
|
72
|
-
raise nx.NetworkXException(msg)
|
|
73
|
-
return valid
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
def _basic_graphical_tests(deg_sequence):
|
|
77
|
-
# Sort and perform some simple tests on the sequence
|
|
78
|
-
deg_sequence = nx.utils.make_list_of_ints(deg_sequence)
|
|
79
|
-
p = len(deg_sequence)
|
|
80
|
-
num_degs = [0] * p
|
|
81
|
-
dmax, dmin, dsum, n = 0, p, 0, 0
|
|
82
|
-
for d in deg_sequence:
|
|
83
|
-
# Reject if degree is negative or larger than the sequence length
|
|
84
|
-
if d < 0 or d >= p:
|
|
85
|
-
raise nx.NetworkXUnfeasible
|
|
86
|
-
# Process only the non-zero integers
|
|
87
|
-
elif d > 0:
|
|
88
|
-
dmax, dmin, dsum, n = max(dmax, d), min(dmin, d), dsum + d, n + 1
|
|
89
|
-
num_degs[d] += 1
|
|
90
|
-
# Reject sequence if it has odd sum or is oversaturated
|
|
91
|
-
if dsum % 2 or dsum > n * (n - 1):
|
|
92
|
-
raise nx.NetworkXUnfeasible
|
|
93
|
-
return dmax, dmin, dsum, n, num_degs
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
@nx._dispatchable(graphs=None)
|
|
97
|
-
def is_valid_degree_sequence_havel_hakimi(deg_sequence):
|
|
98
|
-
r"""Returns True if deg_sequence can be realized by a simple graph.
|
|
99
|
-
|
|
100
|
-
The validation proceeds using the Havel-Hakimi theorem
|
|
101
|
-
[havel1955]_, [hakimi1962]_, [CL1996]_.
|
|
102
|
-
Worst-case run time is $O(s)$ where $s$ is the sum of the sequence.
|
|
103
|
-
|
|
104
|
-
Parameters
|
|
105
|
-
----------
|
|
106
|
-
deg_sequence : list
|
|
107
|
-
A list of integers where each element specifies the degree of a node
|
|
108
|
-
in a graph.
|
|
109
|
-
|
|
110
|
-
Returns
|
|
111
|
-
-------
|
|
112
|
-
valid : bool
|
|
113
|
-
True if deg_sequence is graphical and False if not.
|
|
114
|
-
|
|
115
|
-
Examples
|
|
116
|
-
--------
|
|
117
|
-
>>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
|
|
118
|
-
>>> sequence = (d for _, d in G.degree())
|
|
119
|
-
>>> nx.is_valid_degree_sequence_havel_hakimi(sequence)
|
|
120
|
-
True
|
|
121
|
-
|
|
122
|
-
To test a non-valid sequence:
|
|
123
|
-
>>> sequence_list = [d for _, d in G.degree()]
|
|
124
|
-
>>> sequence_list[-1] += 1
|
|
125
|
-
>>> nx.is_valid_degree_sequence_havel_hakimi(sequence_list)
|
|
126
|
-
False
|
|
127
|
-
|
|
128
|
-
Notes
|
|
129
|
-
-----
|
|
130
|
-
The ZZ condition says that for the sequence d if
|
|
131
|
-
|
|
132
|
-
.. math::
|
|
133
|
-
|d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)}
|
|
134
|
-
|
|
135
|
-
then d is graphical. This was shown in Theorem 6 in [1]_.
|
|
136
|
-
|
|
137
|
-
References
|
|
138
|
-
----------
|
|
139
|
-
.. [1] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory
|
|
140
|
-
of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992).
|
|
141
|
-
.. [havel1955] Havel, V. "A Remark on the Existence of Finite Graphs"
|
|
142
|
-
Casopis Pest. Mat. 80, 477-480, 1955.
|
|
143
|
-
.. [hakimi1962] Hakimi, S. "On the Realizability of a Set of Integers as
|
|
144
|
-
Degrees of the Vertices of a Graph." SIAM J. Appl. Math. 10, 496-506, 1962.
|
|
145
|
-
.. [CL1996] G. Chartrand and L. Lesniak, "Graphs and Digraphs",
|
|
146
|
-
Chapman and Hall/CRC, 1996.
|
|
147
|
-
"""
|
|
148
|
-
try:
|
|
149
|
-
dmax, dmin, dsum, n, num_degs = _basic_graphical_tests(deg_sequence)
|
|
150
|
-
except nx.NetworkXUnfeasible:
|
|
151
|
-
return False
|
|
152
|
-
# Accept if sequence has no non-zero degrees or passes the ZZ condition
|
|
153
|
-
if n == 0 or 4 * dmin * n >= (dmax + dmin + 1) * (dmax + dmin + 1):
|
|
154
|
-
return True
|
|
155
|
-
|
|
156
|
-
modstubs = [0] * (dmax + 1)
|
|
157
|
-
# Successively reduce degree sequence by removing the maximum degree
|
|
158
|
-
while n > 0:
|
|
159
|
-
# Retrieve the maximum degree in the sequence
|
|
160
|
-
while num_degs[dmax] == 0:
|
|
161
|
-
dmax -= 1
|
|
162
|
-
# If there are not enough stubs to connect to, then the sequence is
|
|
163
|
-
# not graphical
|
|
164
|
-
if dmax > n - 1:
|
|
165
|
-
return False
|
|
166
|
-
|
|
167
|
-
# Remove largest stub in list
|
|
168
|
-
num_degs[dmax], n = num_degs[dmax] - 1, n - 1
|
|
169
|
-
# Reduce the next dmax largest stubs
|
|
170
|
-
mslen = 0
|
|
171
|
-
k = dmax
|
|
172
|
-
for i in range(dmax):
|
|
173
|
-
while num_degs[k] == 0:
|
|
174
|
-
k -= 1
|
|
175
|
-
num_degs[k], n = num_degs[k] - 1, n - 1
|
|
176
|
-
if k > 1:
|
|
177
|
-
modstubs[mslen] = k - 1
|
|
178
|
-
mslen += 1
|
|
179
|
-
# Add back to the list any non-zero stubs that were removed
|
|
180
|
-
for i in range(mslen):
|
|
181
|
-
stub = modstubs[i]
|
|
182
|
-
num_degs[stub], n = num_degs[stub] + 1, n + 1
|
|
183
|
-
return True
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
@nx._dispatchable(graphs=None)
|
|
187
|
-
def is_valid_degree_sequence_erdos_gallai(deg_sequence):
|
|
188
|
-
r"""Returns True if deg_sequence can be realized by a simple graph.
|
|
189
|
-
|
|
190
|
-
The validation is done using the Erdős-Gallai theorem [EG1960]_.
|
|
191
|
-
|
|
192
|
-
Parameters
|
|
193
|
-
----------
|
|
194
|
-
deg_sequence : list
|
|
195
|
-
A list of integers
|
|
196
|
-
|
|
197
|
-
Returns
|
|
198
|
-
-------
|
|
199
|
-
valid : bool
|
|
200
|
-
True if deg_sequence is graphical and False if not.
|
|
201
|
-
|
|
202
|
-
Examples
|
|
203
|
-
--------
|
|
204
|
-
>>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
|
|
205
|
-
>>> sequence = (d for _, d in G.degree())
|
|
206
|
-
>>> nx.is_valid_degree_sequence_erdos_gallai(sequence)
|
|
207
|
-
True
|
|
208
|
-
|
|
209
|
-
To test a non-valid sequence:
|
|
210
|
-
>>> sequence_list = [d for _, d in G.degree()]
|
|
211
|
-
>>> sequence_list[-1] += 1
|
|
212
|
-
>>> nx.is_valid_degree_sequence_erdos_gallai(sequence_list)
|
|
213
|
-
False
|
|
214
|
-
|
|
215
|
-
Notes
|
|
216
|
-
-----
|
|
217
|
-
|
|
218
|
-
This implementation uses an equivalent form of the Erdős-Gallai criterion.
|
|
219
|
-
Worst-case run time is $O(n)$ where $n$ is the length of the sequence.
|
|
220
|
-
|
|
221
|
-
Specifically, a sequence d is graphical if and only if the
|
|
222
|
-
sum of the sequence is even and for all strong indices k in the sequence,
|
|
223
|
-
|
|
224
|
-
.. math::
|
|
225
|
-
|
|
226
|
-
\sum_{i=1}^{k} d_i \leq k(k-1) + \sum_{j=k+1}^{n} \min(d_i,k)
|
|
227
|
-
= k(n-1) - ( k \sum_{j=0}^{k-1} n_j - \sum_{j=0}^{k-1} j n_j )
|
|
228
|
-
|
|
229
|
-
A strong index k is any index where d_k >= k and the value n_j is the
|
|
230
|
-
number of occurrences of j in d. The maximal strong index is called the
|
|
231
|
-
Durfee index.
|
|
232
|
-
|
|
233
|
-
This particular rearrangement comes from the proof of Theorem 3 in [2]_.
|
|
234
|
-
|
|
235
|
-
The ZZ condition says that for the sequence d if
|
|
236
|
-
|
|
237
|
-
.. math::
|
|
238
|
-
|d| >= \frac{(\max(d) + \min(d) + 1)^2}{4*\min(d)}
|
|
239
|
-
|
|
240
|
-
then d is graphical. This was shown in Theorem 6 in [2]_.
|
|
241
|
-
|
|
242
|
-
References
|
|
243
|
-
----------
|
|
244
|
-
.. [1] A. Tripathi and S. Vijay. "A note on a theorem of Erdős & Gallai",
|
|
245
|
-
Discrete Mathematics, 265, pp. 417-420 (2003).
|
|
246
|
-
.. [2] I.E. Zverovich and V.E. Zverovich. "Contributions to the theory
|
|
247
|
-
of graphic sequences", Discrete Mathematics, 105, pp. 292-303 (1992).
|
|
248
|
-
.. [EG1960] Erdős and Gallai, Mat. Lapok 11 264, 1960.
|
|
249
|
-
"""
|
|
250
|
-
try:
|
|
251
|
-
dmax, dmin, dsum, n, num_degs = _basic_graphical_tests(deg_sequence)
|
|
252
|
-
except nx.NetworkXUnfeasible:
|
|
253
|
-
return False
|
|
254
|
-
# Accept if sequence has no non-zero degrees or passes the ZZ condition
|
|
255
|
-
if n == 0 or 4 * dmin * n >= (dmax + dmin + 1) * (dmax + dmin + 1):
|
|
256
|
-
return True
|
|
257
|
-
|
|
258
|
-
# Perform the EG checks using the reformulation of Zverovich and Zverovich
|
|
259
|
-
k, sum_deg, sum_nj, sum_jnj = 0, 0, 0, 0
|
|
260
|
-
for dk in range(dmax, dmin - 1, -1):
|
|
261
|
-
if dk < k + 1: # Check if already past Durfee index
|
|
262
|
-
return True
|
|
263
|
-
if num_degs[dk] > 0:
|
|
264
|
-
run_size = num_degs[dk] # Process a run of identical-valued degrees
|
|
265
|
-
if dk < k + run_size: # Check if end of run is past Durfee index
|
|
266
|
-
run_size = dk - k # Adjust back to Durfee index
|
|
267
|
-
sum_deg += run_size * dk
|
|
268
|
-
for v in range(run_size):
|
|
269
|
-
sum_nj += num_degs[k + v]
|
|
270
|
-
sum_jnj += (k + v) * num_degs[k + v]
|
|
271
|
-
k += run_size
|
|
272
|
-
if sum_deg > k * (n - 1) - k * sum_nj + sum_jnj:
|
|
273
|
-
return False
|
|
274
|
-
return True
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
@nx._dispatchable(graphs=None)
|
|
278
|
-
def is_multigraphical(sequence):
|
|
279
|
-
"""Returns True if some multigraph can realize the sequence.
|
|
280
|
-
|
|
281
|
-
Parameters
|
|
282
|
-
----------
|
|
283
|
-
sequence : list
|
|
284
|
-
A list of integers
|
|
285
|
-
|
|
286
|
-
Returns
|
|
287
|
-
-------
|
|
288
|
-
valid : bool
|
|
289
|
-
True if deg_sequence is a multigraphic degree sequence and False if not.
|
|
290
|
-
|
|
291
|
-
Examples
|
|
292
|
-
--------
|
|
293
|
-
>>> G = nx.MultiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
|
|
294
|
-
>>> sequence = (d for _, d in G.degree())
|
|
295
|
-
>>> nx.is_multigraphical(sequence)
|
|
296
|
-
True
|
|
297
|
-
|
|
298
|
-
To test a non-multigraphical sequence:
|
|
299
|
-
>>> sequence_list = [d for _, d in G.degree()]
|
|
300
|
-
>>> sequence_list[-1] += 1
|
|
301
|
-
>>> nx.is_multigraphical(sequence_list)
|
|
302
|
-
False
|
|
303
|
-
|
|
304
|
-
Notes
|
|
305
|
-
-----
|
|
306
|
-
The worst-case run time is $O(n)$ where $n$ is the length of the sequence.
|
|
307
|
-
|
|
308
|
-
References
|
|
309
|
-
----------
|
|
310
|
-
.. [1] S. L. Hakimi. "On the realizability of a set of integers as
|
|
311
|
-
degrees of the vertices of a linear graph", J. SIAM, 10, pp. 496-506
|
|
312
|
-
(1962).
|
|
313
|
-
"""
|
|
314
|
-
try:
|
|
315
|
-
deg_sequence = nx.utils.make_list_of_ints(sequence)
|
|
316
|
-
except nx.NetworkXError:
|
|
317
|
-
return False
|
|
318
|
-
dsum, dmax = 0, 0
|
|
319
|
-
for d in deg_sequence:
|
|
320
|
-
if d < 0:
|
|
321
|
-
return False
|
|
322
|
-
dsum, dmax = dsum + d, max(dmax, d)
|
|
323
|
-
if dsum % 2 or dsum < 2 * dmax:
|
|
324
|
-
return False
|
|
325
|
-
return True
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
@nx._dispatchable(graphs=None)
|
|
329
|
-
def is_pseudographical(sequence):
|
|
330
|
-
"""Returns True if some pseudograph can realize the sequence.
|
|
331
|
-
|
|
332
|
-
Every nonnegative integer sequence with an even sum is pseudographical
|
|
333
|
-
(see [1]_).
|
|
334
|
-
|
|
335
|
-
Parameters
|
|
336
|
-
----------
|
|
337
|
-
sequence : list or iterable container
|
|
338
|
-
A sequence of integer node degrees
|
|
339
|
-
|
|
340
|
-
Returns
|
|
341
|
-
-------
|
|
342
|
-
valid : bool
|
|
343
|
-
True if the sequence is a pseudographic degree sequence and False if not.
|
|
344
|
-
|
|
345
|
-
Examples
|
|
346
|
-
--------
|
|
347
|
-
>>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
|
|
348
|
-
>>> sequence = (d for _, d in G.degree())
|
|
349
|
-
>>> nx.is_pseudographical(sequence)
|
|
350
|
-
True
|
|
351
|
-
|
|
352
|
-
To test a non-pseudographical sequence:
|
|
353
|
-
>>> sequence_list = [d for _, d in G.degree()]
|
|
354
|
-
>>> sequence_list[-1] += 1
|
|
355
|
-
>>> nx.is_pseudographical(sequence_list)
|
|
356
|
-
False
|
|
357
|
-
|
|
358
|
-
Notes
|
|
359
|
-
-----
|
|
360
|
-
The worst-case run time is $O(n)$ where n is the length of the sequence.
|
|
361
|
-
|
|
362
|
-
References
|
|
363
|
-
----------
|
|
364
|
-
.. [1] F. Boesch and F. Harary. "Line removal algorithms for graphs
|
|
365
|
-
and their degree lists", IEEE Trans. Circuits and Systems, CAS-23(12),
|
|
366
|
-
pp. 778-782 (1976).
|
|
367
|
-
"""
|
|
368
|
-
try:
|
|
369
|
-
deg_sequence = nx.utils.make_list_of_ints(sequence)
|
|
370
|
-
except nx.NetworkXError:
|
|
371
|
-
return False
|
|
372
|
-
return sum(deg_sequence) % 2 == 0 and min(deg_sequence) >= 0
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
@nx._dispatchable(graphs=None)
|
|
376
|
-
def is_digraphical(in_sequence, out_sequence):
|
|
377
|
-
r"""Returns True if some directed graph can realize the in- and out-degree
|
|
378
|
-
sequences.
|
|
379
|
-
|
|
380
|
-
Parameters
|
|
381
|
-
----------
|
|
382
|
-
in_sequence : list or iterable container
|
|
383
|
-
A sequence of integer node in-degrees
|
|
384
|
-
|
|
385
|
-
out_sequence : list or iterable container
|
|
386
|
-
A sequence of integer node out-degrees
|
|
387
|
-
|
|
388
|
-
Returns
|
|
389
|
-
-------
|
|
390
|
-
valid : bool
|
|
391
|
-
True if in and out-sequences are digraphic False if not.
|
|
392
|
-
|
|
393
|
-
Examples
|
|
394
|
-
--------
|
|
395
|
-
>>> G = nx.DiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (4, 2), (5, 1), (5, 4)])
|
|
396
|
-
>>> in_seq = (d for n, d in G.in_degree())
|
|
397
|
-
>>> out_seq = (d for n, d in G.out_degree())
|
|
398
|
-
>>> nx.is_digraphical(in_seq, out_seq)
|
|
399
|
-
True
|
|
400
|
-
|
|
401
|
-
To test a non-digraphical scenario:
|
|
402
|
-
>>> in_seq_list = [d for n, d in G.in_degree()]
|
|
403
|
-
>>> in_seq_list[-1] += 1
|
|
404
|
-
>>> nx.is_digraphical(in_seq_list, out_seq)
|
|
405
|
-
False
|
|
406
|
-
|
|
407
|
-
Notes
|
|
408
|
-
-----
|
|
409
|
-
This algorithm is from Kleitman and Wang [1]_.
|
|
410
|
-
The worst case runtime is $O(s \times \log n)$ where $s$ and $n$ are the
|
|
411
|
-
sum and length of the sequences respectively.
|
|
412
|
-
|
|
413
|
-
References
|
|
414
|
-
----------
|
|
415
|
-
.. [1] D.J. Kleitman and D.L. Wang
|
|
416
|
-
Algorithms for Constructing Graphs and Digraphs with Given Valences
|
|
417
|
-
and Factors, Discrete Mathematics, 6(1), pp. 79-88 (1973)
|
|
418
|
-
"""
|
|
419
|
-
try:
|
|
420
|
-
in_deg_sequence = nx.utils.make_list_of_ints(in_sequence)
|
|
421
|
-
out_deg_sequence = nx.utils.make_list_of_ints(out_sequence)
|
|
422
|
-
except nx.NetworkXError:
|
|
423
|
-
return False
|
|
424
|
-
# Process the sequences and form two heaps to store degree pairs with
|
|
425
|
-
# either zero or non-zero out degrees
|
|
426
|
-
sumin, sumout, nin, nout = 0, 0, len(in_deg_sequence), len(out_deg_sequence)
|
|
427
|
-
maxn = max(nin, nout)
|
|
428
|
-
maxin = 0
|
|
429
|
-
if maxn == 0:
|
|
430
|
-
return True
|
|
431
|
-
stubheap, zeroheap = [], []
|
|
432
|
-
for n in range(maxn):
|
|
433
|
-
in_deg, out_deg = 0, 0
|
|
434
|
-
if n < nout:
|
|
435
|
-
out_deg = out_deg_sequence[n]
|
|
436
|
-
if n < nin:
|
|
437
|
-
in_deg = in_deg_sequence[n]
|
|
438
|
-
if in_deg < 0 or out_deg < 0:
|
|
439
|
-
return False
|
|
440
|
-
sumin, sumout, maxin = sumin + in_deg, sumout + out_deg, max(maxin, in_deg)
|
|
441
|
-
if in_deg > 0:
|
|
442
|
-
stubheap.append((-1 * out_deg, -1 * in_deg))
|
|
443
|
-
elif out_deg > 0:
|
|
444
|
-
zeroheap.append(-1 * out_deg)
|
|
445
|
-
if sumin != sumout:
|
|
446
|
-
return False
|
|
447
|
-
heapq.heapify(stubheap)
|
|
448
|
-
heapq.heapify(zeroheap)
|
|
449
|
-
|
|
450
|
-
modstubs = [(0, 0)] * (maxin + 1)
|
|
451
|
-
# Successively reduce degree sequence by removing the maximum out degree
|
|
452
|
-
while stubheap:
|
|
453
|
-
# Take the first value in the sequence with non-zero in degree
|
|
454
|
-
(freeout, freein) = heapq.heappop(stubheap)
|
|
455
|
-
freein *= -1
|
|
456
|
-
if freein > len(stubheap) + len(zeroheap):
|
|
457
|
-
return False
|
|
458
|
-
|
|
459
|
-
# Attach out stubs to the nodes with the most in stubs
|
|
460
|
-
mslen = 0
|
|
461
|
-
for i in range(freein):
|
|
462
|
-
if zeroheap and (not stubheap or stubheap[0][0] > zeroheap[0]):
|
|
463
|
-
stubout = heapq.heappop(zeroheap)
|
|
464
|
-
stubin = 0
|
|
465
|
-
else:
|
|
466
|
-
(stubout, stubin) = heapq.heappop(stubheap)
|
|
467
|
-
if stubout == 0:
|
|
468
|
-
return False
|
|
469
|
-
# Check if target is now totally connected
|
|
470
|
-
if stubout + 1 < 0 or stubin < 0:
|
|
471
|
-
modstubs[mslen] = (stubout + 1, stubin)
|
|
472
|
-
mslen += 1
|
|
473
|
-
|
|
474
|
-
# Add back the nodes to the heap that still have available stubs
|
|
475
|
-
for i in range(mslen):
|
|
476
|
-
stub = modstubs[i]
|
|
477
|
-
if stub[1] < 0:
|
|
478
|
-
heapq.heappush(stubheap, stub)
|
|
479
|
-
else:
|
|
480
|
-
heapq.heappush(zeroheap, stub[0])
|
|
481
|
-
if freeout < 0:
|
|
482
|
-
heapq.heappush(zeroheap, freeout)
|
|
483
|
-
return True
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Flow Hierarchy.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
|
|
7
|
-
__all__ = ["flow_hierarchy"]
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@nx._dispatchable(edge_attrs="weight")
|
|
11
|
-
def flow_hierarchy(G, weight=None):
|
|
12
|
-
"""Returns the flow hierarchy of a directed network.
|
|
13
|
-
|
|
14
|
-
Flow hierarchy is defined as the fraction of edges not participating
|
|
15
|
-
in cycles in a directed graph [1]_.
|
|
16
|
-
|
|
17
|
-
Parameters
|
|
18
|
-
----------
|
|
19
|
-
G : DiGraph or MultiDiGraph
|
|
20
|
-
A directed graph
|
|
21
|
-
|
|
22
|
-
weight : string, optional (default=None)
|
|
23
|
-
Attribute to use for edge weights. If None the weight defaults to 1.
|
|
24
|
-
|
|
25
|
-
Returns
|
|
26
|
-
-------
|
|
27
|
-
h : float
|
|
28
|
-
Flow hierarchy value
|
|
29
|
-
|
|
30
|
-
Raises
|
|
31
|
-
------
|
|
32
|
-
NetworkXError
|
|
33
|
-
If `G` is not a directed graph or if `G` has no edges.
|
|
34
|
-
|
|
35
|
-
Notes
|
|
36
|
-
-----
|
|
37
|
-
The algorithm described in [1]_ computes the flow hierarchy through
|
|
38
|
-
exponentiation of the adjacency matrix. This function implements an
|
|
39
|
-
alternative approach that finds strongly connected components.
|
|
40
|
-
An edge is in a cycle if and only if it is in a strongly connected
|
|
41
|
-
component, which can be found in $O(m)$ time using Tarjan's algorithm.
|
|
42
|
-
|
|
43
|
-
References
|
|
44
|
-
----------
|
|
45
|
-
.. [1] Luo, J.; Magee, C.L. (2011),
|
|
46
|
-
Detecting evolving patterns of self-organizing networks by flow
|
|
47
|
-
hierarchy measurement, Complexity, Volume 16 Issue 6 53-61.
|
|
48
|
-
DOI: 10.1002/cplx.20368
|
|
49
|
-
http://web.mit.edu/~cmagee/www/documents/28-DetectingEvolvingPatterns_FlowHierarchy.pdf
|
|
50
|
-
"""
|
|
51
|
-
# corner case: G has no edges
|
|
52
|
-
if nx.is_empty(G):
|
|
53
|
-
raise nx.NetworkXError("flow_hierarchy not applicable to empty graphs")
|
|
54
|
-
if not G.is_directed():
|
|
55
|
-
raise nx.NetworkXError("G must be a digraph in flow_hierarchy")
|
|
56
|
-
scc = nx.strongly_connected_components(G)
|
|
57
|
-
return 1 - sum(G.subgraph(c).size(weight) for c in scc) / G.size(weight)
|