okstra 0.130.4 → 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 +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 +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,259 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Implementation of the Wright, Richmond, Odlyzko and McKay (WROM)
|
|
3
|
-
algorithm for the enumeration of all non-isomorphic free trees of a
|
|
4
|
-
given order. Rooted trees are represented by level sequences, i.e.,
|
|
5
|
-
lists in which the i-th element specifies the distance of vertex i to
|
|
6
|
-
the root.
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
__all__ = ["nonisomorphic_trees", "number_of_nonisomorphic_trees"]
|
|
11
|
-
|
|
12
|
-
from functools import lru_cache
|
|
13
|
-
|
|
14
|
-
import networkx as nx
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
18
|
-
def nonisomorphic_trees(order):
|
|
19
|
-
"""Generate nonisomorphic trees of specified `order`.
|
|
20
|
-
|
|
21
|
-
Parameters
|
|
22
|
-
----------
|
|
23
|
-
order : int
|
|
24
|
-
order of the desired tree(s)
|
|
25
|
-
|
|
26
|
-
Yields
|
|
27
|
-
------
|
|
28
|
-
`networkx.Graph` instances
|
|
29
|
-
A tree with `order` number of nodes that is not isomorphic to any other
|
|
30
|
-
yielded tree.
|
|
31
|
-
|
|
32
|
-
Raises
|
|
33
|
-
------
|
|
34
|
-
ValueError
|
|
35
|
-
If `order` is negative.
|
|
36
|
-
|
|
37
|
-
Examples
|
|
38
|
-
--------
|
|
39
|
-
There are 11 unique (non-isomorphic) trees with 7 nodes.
|
|
40
|
-
|
|
41
|
-
>>> n = 7
|
|
42
|
-
>>> nit_list = list(nx.nonisomorphic_trees(n))
|
|
43
|
-
>>> len(nit_list) == nx.number_of_nonisomorphic_trees(n) == 11
|
|
44
|
-
True
|
|
45
|
-
|
|
46
|
-
All trees yielded by the generator have the specified order.
|
|
47
|
-
|
|
48
|
-
>>> all(len(G) == n for G in nx.nonisomorphic_trees(n))
|
|
49
|
-
True
|
|
50
|
-
|
|
51
|
-
Each tree is nonisomorphic to every other tree yielded by the generator.
|
|
52
|
-
>>> seen = []
|
|
53
|
-
>>> for G in nx.nonisomorphic_trees(n):
|
|
54
|
-
... assert not any(nx.is_isomorphic(G, H) for H in seen)
|
|
55
|
-
... seen.append(G)
|
|
56
|
-
|
|
57
|
-
See Also
|
|
58
|
-
--------
|
|
59
|
-
number_of_nonisomorphic_trees
|
|
60
|
-
"""
|
|
61
|
-
if order < 0:
|
|
62
|
-
raise ValueError("order must be non-negative")
|
|
63
|
-
if order == 0:
|
|
64
|
-
# Idiom for empty generator, i.e. list(nonisomorphic_trees(0)) == []
|
|
65
|
-
return
|
|
66
|
-
yield
|
|
67
|
-
if order == 1:
|
|
68
|
-
yield nx.empty_graph(1)
|
|
69
|
-
return
|
|
70
|
-
# start at the path graph rooted at its center
|
|
71
|
-
layout = list(range(order // 2 + 1)) + list(range(1, (order + 1) // 2))
|
|
72
|
-
|
|
73
|
-
while layout is not None:
|
|
74
|
-
layout = _next_tree(layout)
|
|
75
|
-
if layout is not None:
|
|
76
|
-
yield _layout_to_graph(layout)
|
|
77
|
-
layout = _next_rooted_tree(layout)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
@nx._dispatchable(graphs=None)
|
|
81
|
-
def number_of_nonisomorphic_trees(order):
|
|
82
|
-
"""Returns the number of nonisomorphic trees of the specified `order`.
|
|
83
|
-
|
|
84
|
-
Based on an algorithm by Alois P. Heinz in
|
|
85
|
-
`OEIS entry A000055 <https://oeis.org/A000055>`_. Complexity is ``O(n ** 3)``.
|
|
86
|
-
|
|
87
|
-
Parameters
|
|
88
|
-
----------
|
|
89
|
-
order : int
|
|
90
|
-
Order of the desired tree(s).
|
|
91
|
-
|
|
92
|
-
Returns
|
|
93
|
-
-------
|
|
94
|
-
int
|
|
95
|
-
Number of nonisomorphic trees with `order` number of nodes.
|
|
96
|
-
|
|
97
|
-
Raises
|
|
98
|
-
------
|
|
99
|
-
ValueError
|
|
100
|
-
If `order` is negative.
|
|
101
|
-
|
|
102
|
-
Examples
|
|
103
|
-
--------
|
|
104
|
-
>>> nx.number_of_nonisomorphic_trees(10)
|
|
105
|
-
106
|
|
106
|
-
|
|
107
|
-
See Also
|
|
108
|
-
--------
|
|
109
|
-
nonisomorphic_trees
|
|
110
|
-
"""
|
|
111
|
-
if order < 0:
|
|
112
|
-
raise ValueError("order must be non-negative")
|
|
113
|
-
return _unlabeled_trees(order)
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
@lru_cache(None)
|
|
117
|
-
def _unlabeled_trees(n):
|
|
118
|
-
"""Implements OEIS A000055 (number of unlabeled trees)."""
|
|
119
|
-
|
|
120
|
-
value = 0
|
|
121
|
-
for k in range(n + 1):
|
|
122
|
-
value += _rooted_trees(k) * _rooted_trees(n - k)
|
|
123
|
-
if n % 2 == 0:
|
|
124
|
-
value -= _rooted_trees(n // 2)
|
|
125
|
-
return _rooted_trees(n) - value // 2
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
@lru_cache(None)
|
|
129
|
-
def _rooted_trees(n):
|
|
130
|
-
"""Implements OEIS A000081 (number of unlabeled rooted trees)."""
|
|
131
|
-
|
|
132
|
-
if n < 2:
|
|
133
|
-
return n
|
|
134
|
-
value = 0
|
|
135
|
-
for j in range(1, n):
|
|
136
|
-
for d in range(1, n):
|
|
137
|
-
if j % d == 0:
|
|
138
|
-
value += d * _rooted_trees(d) * _rooted_trees(n - j)
|
|
139
|
-
return value // (n - 1)
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
def _next_rooted_tree(predecessor, p=None):
|
|
143
|
-
"""One iteration of the Beyer-Hedetniemi algorithm."""
|
|
144
|
-
|
|
145
|
-
if p is None:
|
|
146
|
-
p = len(predecessor) - 1
|
|
147
|
-
while predecessor[p] == 1:
|
|
148
|
-
p -= 1
|
|
149
|
-
if p == 0:
|
|
150
|
-
return None
|
|
151
|
-
|
|
152
|
-
q = p - 1
|
|
153
|
-
while predecessor[q] != predecessor[p] - 1:
|
|
154
|
-
q -= 1
|
|
155
|
-
result = list(predecessor)
|
|
156
|
-
for i in range(p, len(result)):
|
|
157
|
-
result[i] = result[i - p + q]
|
|
158
|
-
return result
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
def _next_tree(candidate):
|
|
162
|
-
"""One iteration of the Wright, Richmond, Odlyzko and McKay
|
|
163
|
-
algorithm."""
|
|
164
|
-
|
|
165
|
-
# valid representation of a free tree if:
|
|
166
|
-
# there are at least two vertices at layer 1
|
|
167
|
-
# (this is always the case because we start at the path graph)
|
|
168
|
-
left, rest = _split_tree(candidate)
|
|
169
|
-
|
|
170
|
-
# and the left subtree of the root
|
|
171
|
-
# is less high than the tree with the left subtree removed
|
|
172
|
-
left_height = max(left)
|
|
173
|
-
rest_height = max(rest)
|
|
174
|
-
valid = rest_height >= left_height
|
|
175
|
-
|
|
176
|
-
if valid and rest_height == left_height:
|
|
177
|
-
# and, if left and rest are of the same height,
|
|
178
|
-
# if left does not encompass more vertices
|
|
179
|
-
if len(left) > len(rest):
|
|
180
|
-
valid = False
|
|
181
|
-
# and, if they have the same number or vertices,
|
|
182
|
-
# if left does not come after rest lexicographically
|
|
183
|
-
elif len(left) == len(rest) and left > rest:
|
|
184
|
-
valid = False
|
|
185
|
-
|
|
186
|
-
if valid:
|
|
187
|
-
return candidate
|
|
188
|
-
else:
|
|
189
|
-
# jump to the next valid free tree
|
|
190
|
-
p = len(left)
|
|
191
|
-
new_candidate = _next_rooted_tree(candidate, p)
|
|
192
|
-
if candidate[p] > 2:
|
|
193
|
-
new_left, new_rest = _split_tree(new_candidate)
|
|
194
|
-
new_left_height = max(new_left)
|
|
195
|
-
suffix = range(1, new_left_height + 2)
|
|
196
|
-
new_candidate[-len(suffix) :] = suffix
|
|
197
|
-
return new_candidate
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
def _split_tree(layout):
|
|
201
|
-
"""Returns a tuple of two layouts, one containing the left
|
|
202
|
-
subtree of the root vertex, and one containing the original tree
|
|
203
|
-
with the left subtree removed."""
|
|
204
|
-
|
|
205
|
-
one_found = False
|
|
206
|
-
m = None
|
|
207
|
-
for i in range(len(layout)):
|
|
208
|
-
if layout[i] == 1:
|
|
209
|
-
if one_found:
|
|
210
|
-
m = i
|
|
211
|
-
break
|
|
212
|
-
else:
|
|
213
|
-
one_found = True
|
|
214
|
-
|
|
215
|
-
if m is None:
|
|
216
|
-
m = len(layout)
|
|
217
|
-
|
|
218
|
-
left = [layout[i] - 1 for i in range(1, m)]
|
|
219
|
-
rest = [0] + [layout[i] for i in range(m, len(layout))]
|
|
220
|
-
return (left, rest)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
def _layout_to_matrix(layout):
|
|
224
|
-
"""Create the adjacency matrix for the tree specified by the
|
|
225
|
-
given layout (level sequence)."""
|
|
226
|
-
|
|
227
|
-
result = [[0] * len(layout) for i in range(len(layout))]
|
|
228
|
-
stack = []
|
|
229
|
-
for i in range(len(layout)):
|
|
230
|
-
i_level = layout[i]
|
|
231
|
-
if stack:
|
|
232
|
-
j = stack[-1]
|
|
233
|
-
j_level = layout[j]
|
|
234
|
-
while j_level >= i_level:
|
|
235
|
-
stack.pop()
|
|
236
|
-
j = stack[-1]
|
|
237
|
-
j_level = layout[j]
|
|
238
|
-
result[i][j] = result[j][i] = 1
|
|
239
|
-
stack.append(i)
|
|
240
|
-
return result
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
def _layout_to_graph(layout):
|
|
244
|
-
"""Create a NetworkX Graph for the tree specified by the
|
|
245
|
-
given layout(level sequence)"""
|
|
246
|
-
G = nx.Graph()
|
|
247
|
-
stack = []
|
|
248
|
-
for i in range(len(layout)):
|
|
249
|
-
i_level = layout[i]
|
|
250
|
-
if stack:
|
|
251
|
-
j = stack[-1]
|
|
252
|
-
j_level = layout[j]
|
|
253
|
-
while j_level >= i_level:
|
|
254
|
-
stack.pop()
|
|
255
|
-
j = stack[-1]
|
|
256
|
-
j_level = layout[j]
|
|
257
|
-
G.add_edge(i, j)
|
|
258
|
-
stack.append(i)
|
|
259
|
-
return G
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
"""Generate graphs with given degree and triangle sequence."""
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
from networkx.utils import py_random_state
|
|
5
|
-
|
|
6
|
-
__all__ = ["random_clustered_graph"]
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
@py_random_state(2)
|
|
10
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
11
|
-
def random_clustered_graph(joint_degree_sequence, create_using=None, seed=None):
|
|
12
|
-
r"""Generate a random graph with the given joint independent edge degree and
|
|
13
|
-
triangle degree sequence.
|
|
14
|
-
|
|
15
|
-
This uses a configuration model-like approach to generate a random graph
|
|
16
|
-
(with parallel edges and self-loops) by randomly assigning edges to match
|
|
17
|
-
the given joint degree sequence.
|
|
18
|
-
|
|
19
|
-
The joint degree sequence is a list of pairs of integers of the form
|
|
20
|
-
$[(d_{1,i}, d_{1,t}), \dotsc, (d_{n,i}, d_{n,t})]$. According to this list,
|
|
21
|
-
vertex $u$ is a member of $d_{u,t}$ triangles and has $d_{u, i}$ other
|
|
22
|
-
edges. The number $d_{u,t}$ is the *triangle degree* of $u$ and the number
|
|
23
|
-
$d_{u,i}$ is the *independent edge degree*.
|
|
24
|
-
|
|
25
|
-
Parameters
|
|
26
|
-
----------
|
|
27
|
-
joint_degree_sequence : list of integer pairs
|
|
28
|
-
Each list entry corresponds to the independent edge degree and
|
|
29
|
-
triangle degree of a node.
|
|
30
|
-
create_using : NetworkX graph constructor, optional (default MultiGraph)
|
|
31
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
32
|
-
seed : integer, random_state, or None (default)
|
|
33
|
-
Indicator of random number generation state.
|
|
34
|
-
See :ref:`Randomness<randomness>`.
|
|
35
|
-
|
|
36
|
-
Returns
|
|
37
|
-
-------
|
|
38
|
-
G : MultiGraph
|
|
39
|
-
A graph with the specified degree sequence. Nodes are labeled
|
|
40
|
-
starting at 0 with an index corresponding to the position in
|
|
41
|
-
deg_sequence.
|
|
42
|
-
|
|
43
|
-
Raises
|
|
44
|
-
------
|
|
45
|
-
NetworkXError
|
|
46
|
-
If the independent edge degree sequence sum is not even
|
|
47
|
-
or the triangle degree sequence sum is not divisible by 3.
|
|
48
|
-
|
|
49
|
-
Notes
|
|
50
|
-
-----
|
|
51
|
-
As described by Miller [1]_ (see also Newman [2]_ for an equivalent
|
|
52
|
-
description).
|
|
53
|
-
|
|
54
|
-
A non-graphical degree sequence (not realizable by some simple
|
|
55
|
-
graph) is allowed since this function returns graphs with self
|
|
56
|
-
loops and parallel edges. An exception is raised if the
|
|
57
|
-
independent degree sequence does not have an even sum or the
|
|
58
|
-
triangle degree sequence sum is not divisible by 3.
|
|
59
|
-
|
|
60
|
-
This configuration model-like construction process can lead to
|
|
61
|
-
duplicate edges and loops. You can remove the self-loops and
|
|
62
|
-
parallel edges (see below) which will likely result in a graph
|
|
63
|
-
that doesn't have the exact degree sequence specified. This
|
|
64
|
-
"finite-size effect" decreases as the size of the graph increases.
|
|
65
|
-
|
|
66
|
-
References
|
|
67
|
-
----------
|
|
68
|
-
.. [1] Joel C. Miller. "Percolation and epidemics in random clustered
|
|
69
|
-
networks". In: Physical review. E, Statistical, nonlinear, and soft
|
|
70
|
-
matter physics 80 (2 Part 1 August 2009).
|
|
71
|
-
.. [2] M. E. J. Newman. "Random Graphs with Clustering".
|
|
72
|
-
In: Physical Review Letters 103 (5 July 2009)
|
|
73
|
-
|
|
74
|
-
Examples
|
|
75
|
-
--------
|
|
76
|
-
>>> deg = [(1, 0), (1, 0), (1, 0), (2, 0), (1, 0), (2, 1), (0, 1), (0, 1)]
|
|
77
|
-
>>> G = nx.random_clustered_graph(deg)
|
|
78
|
-
|
|
79
|
-
To remove parallel edges:
|
|
80
|
-
|
|
81
|
-
>>> G = nx.Graph(G)
|
|
82
|
-
|
|
83
|
-
To remove self loops:
|
|
84
|
-
|
|
85
|
-
>>> G.remove_edges_from(nx.selfloop_edges(G))
|
|
86
|
-
|
|
87
|
-
"""
|
|
88
|
-
# In Python 3, zip() returns an iterator. Make this into a list.
|
|
89
|
-
joint_degree_sequence = list(joint_degree_sequence)
|
|
90
|
-
|
|
91
|
-
N = len(joint_degree_sequence)
|
|
92
|
-
G = nx.empty_graph(N, create_using, default=nx.MultiGraph)
|
|
93
|
-
if G.is_directed():
|
|
94
|
-
raise nx.NetworkXError("Directed Graph not supported")
|
|
95
|
-
|
|
96
|
-
ilist = []
|
|
97
|
-
tlist = []
|
|
98
|
-
for n in G:
|
|
99
|
-
degrees = joint_degree_sequence[n]
|
|
100
|
-
for icount in range(degrees[0]):
|
|
101
|
-
ilist.append(n)
|
|
102
|
-
for tcount in range(degrees[1]):
|
|
103
|
-
tlist.append(n)
|
|
104
|
-
|
|
105
|
-
if len(ilist) % 2 != 0 or len(tlist) % 3 != 0:
|
|
106
|
-
raise nx.NetworkXError("Invalid degree sequence")
|
|
107
|
-
|
|
108
|
-
seed.shuffle(ilist)
|
|
109
|
-
seed.shuffle(tlist)
|
|
110
|
-
while ilist:
|
|
111
|
-
G.add_edge(ilist.pop(), ilist.pop())
|
|
112
|
-
while tlist:
|
|
113
|
-
n1 = tlist.pop()
|
|
114
|
-
n2 = tlist.pop()
|
|
115
|
-
n3 = tlist.pop()
|
|
116
|
-
G.add_edges_from([(n1, n2), (n1, n3), (n2, n3)])
|
|
117
|
-
return G
|