okstra 0.130.4 → 0.131.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -1
- package/docs/architecture.md +2 -2
- package/docs/cli.md +1 -1
- package/docs/for-ai/README.md +0 -2
- package/docs/for-ai/skills/okstra-run.md +13 -2
- package/docs/for-ai/skills/okstra-setup.md +4 -1
- package/docs/project-structure-overview.md +5 -4
- package/docs/task-process/implementation-planning.md +13 -0
- package/docs/task-process/implementation.md +17 -2
- package/package.json +1 -1
- package/runtime/BUILD.json +2 -2
- package/runtime/agents/workers/report-writer-worker.md +7 -0
- package/runtime/bin/lib/okstra/usage.sh +4 -4
- package/runtime/prompts/lead/okstra-lead-contract.md +2 -2
- package/runtime/prompts/lead/plan-body-verification.md +26 -5
- package/runtime/prompts/lead/report-writer.md +6 -2
- package/runtime/prompts/profiles/_common-contract.md +2 -1
- package/runtime/prompts/profiles/_implementation-deliverable.md +6 -1
- package/runtime/prompts/profiles/_implementation-executor.md +2 -2
- package/runtime/prompts/profiles/_implementation-verifier.md +33 -10
- package/runtime/prompts/profiles/final-verification.md +21 -6
- package/runtime/prompts/profiles/implementation-planning.md +16 -4
- package/runtime/python/okstra_ctl/codex_dispatch.py +31 -0
- package/runtime/python/okstra_ctl/conformance.py +49 -11
- package/runtime/python/okstra_ctl/report_finalize.py +52 -1
- package/runtime/python/okstra_ctl/run.py +15 -3
- package/runtime/python/okstra_ctl/worker_prompt_contract.py +14 -6
- package/runtime/python/okstra_ctl/worker_prompt_policy.py +19 -1
- package/runtime/python/okstra_vendor/__init__.py +0 -44
- package/runtime/schemas/final-report-v1.0.schema.json +99 -5
- package/runtime/skills/okstra-run/SKILL.md +11 -4
- package/runtime/skills/okstra-setup/SKILL.md +3 -2
- package/runtime/skills/okstra-setup/references/project-config.md +16 -7
- package/runtime/templates/reports/final-report.template.md +15 -9
- package/runtime/templates/reports/i18n/en.json +1 -0
- package/runtime/templates/reports/i18n/ko.json +1 -0
- package/runtime/validators/lib/fixtures.sh +6 -0
- package/runtime/validators/validate-run.py +2019 -96
- package/src/cli-registry.mjs +0 -7
- package/src/commands/lifecycle/doctor.mjs +0 -9
- package/src/lib/skill-catalog.mjs +0 -1
- package/docs/for-ai/skills/okstra-graphify.md +0 -64
- package/runtime/python/okstra_ctl/graphify_cmd.py +0 -225
- package/runtime/python/okstra_vendor/graphify/.vendored-version +0 -1
- package/runtime/python/okstra_vendor/graphify/__init__.py +0 -28
- package/runtime/python/okstra_vendor/graphify/__main__.py +0 -1371
- package/runtime/python/okstra_vendor/graphify/analyze.py +0 -540
- package/runtime/python/okstra_vendor/graphify/benchmark.py +0 -129
- package/runtime/python/okstra_vendor/graphify/build.py +0 -107
- package/runtime/python/okstra_vendor/graphify/cache.py +0 -169
- package/runtime/python/okstra_vendor/graphify/cluster.py +0 -137
- package/runtime/python/okstra_vendor/graphify/detect.py +0 -510
- package/runtime/python/okstra_vendor/graphify/export.py +0 -1014
- package/runtime/python/okstra_vendor/graphify/extract.py +0 -3277
- package/runtime/python/okstra_vendor/graphify/hooks.py +0 -220
- package/runtime/python/okstra_vendor/graphify/ingest.py +0 -297
- package/runtime/python/okstra_vendor/graphify/manifest.py +0 -4
- package/runtime/python/okstra_vendor/graphify/report.py +0 -175
- package/runtime/python/okstra_vendor/graphify/security.py +0 -203
- package/runtime/python/okstra_vendor/graphify/serve.py +0 -373
- package/runtime/python/okstra_vendor/graphify/skill-aider.md +0 -1184
- package/runtime/python/okstra_vendor/graphify/skill-claw.md +0 -1184
- package/runtime/python/okstra_vendor/graphify/skill-codex.md +0 -1242
- package/runtime/python/okstra_vendor/graphify/skill-copilot.md +0 -1268
- package/runtime/python/okstra_vendor/graphify/skill-droid.md +0 -1239
- package/runtime/python/okstra_vendor/graphify/skill-kiro.md +0 -1183
- package/runtime/python/okstra_vendor/graphify/skill-opencode.md +0 -1238
- package/runtime/python/okstra_vendor/graphify/skill-trae.md +0 -1208
- package/runtime/python/okstra_vendor/graphify/skill-vscode.md +0 -253
- package/runtime/python/okstra_vendor/graphify/skill-windows.md +0 -1245
- package/runtime/python/okstra_vendor/graphify/skill.md +0 -1319
- package/runtime/python/okstra_vendor/graphify/transcribe.py +0 -182
- package/runtime/python/okstra_vendor/graphify/validate.py +0 -72
- package/runtime/python/okstra_vendor/graphify/watch.py +0 -188
- package/runtime/python/okstra_vendor/graphify/wiki.py +0 -214
- package/runtime/python/okstra_vendor/networkx/__init__.py +0 -62
- package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +0 -134
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +0 -26
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +0 -259
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +0 -71
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +0 -412
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +0 -396
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +0 -149
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +0 -369
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +0 -44
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +0 -143
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +0 -53
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +0 -265
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +0 -1508
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +0 -255
- package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +0 -83
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +0 -122
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +0 -302
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +0 -255
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +0 -160
- package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +0 -127
- package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +0 -164
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +0 -322
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +0 -290
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +0 -289
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +0 -360
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +0 -105
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +0 -603
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +0 -316
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +0 -590
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +0 -232
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +0 -526
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +0 -112
- package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +0 -69
- package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +0 -168
- package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +0 -205
- package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +0 -164
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +0 -20
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +0 -591
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +0 -236
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +0 -282
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +0 -364
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +0 -227
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +0 -96
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +0 -357
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +0 -130
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +0 -787
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +0 -331
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +0 -150
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +0 -200
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +0 -128
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +0 -209
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +0 -141
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +0 -361
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +0 -181
- package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +0 -95
- package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +0 -172
- package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +0 -443
- package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +0 -818
- package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +0 -732
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +0 -4
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +0 -505
- package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +0 -565
- package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +0 -163
- package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +0 -28
- package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +0 -153
- package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +0 -354
- package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +0 -171
- package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +0 -30
- package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +0 -216
- package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +0 -79
- package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +0 -338
- package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +0 -162
- package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +0 -384
- package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +0 -227
- package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +0 -452
- package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +0 -347
- package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +0 -6
- package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +0 -115
- package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +0 -394
- package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +0 -282
- package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +0 -71
- package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +0 -359
- package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +0 -11
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +0 -811
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +0 -616
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +0 -408
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +0 -1270
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +0 -592
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +0 -220
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +0 -235
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +0 -152
- package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/core.py +0 -588
- package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +0 -416
- package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +0 -1234
- package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +0 -677
- package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +0 -1392
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +0 -1095
- package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +0 -272
- package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +0 -268
- package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +0 -167
- package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +0 -470
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +0 -11
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +0 -370
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +0 -407
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +0 -238
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +0 -241
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +0 -178
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +0 -611
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +0 -356
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +0 -662
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +0 -425
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +0 -300
- package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +0 -194
- package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +0 -435
- package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +0 -483
- package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +0 -57
- package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +0 -196
- package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +0 -107
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +0 -1306
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +0 -336
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +0 -1262
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +0 -352
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +0 -308
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +0 -1102
- package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +0 -192
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +0 -2
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +0 -337
- package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +0 -498
- package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +0 -687
- package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +0 -280
- package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +0 -1148
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +0 -27
- package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +0 -738
- package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +0 -78
- package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +0 -59
- package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +0 -219
- package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +0 -155
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +0 -4
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +0 -324
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +0 -468
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +0 -633
- package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +0 -73
- package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +0 -464
- package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +0 -1463
- package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +0 -306
- package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +0 -98
- package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +0 -167
- package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +0 -138
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +0 -239
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +0 -264
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +0 -716
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +0 -625
- package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +0 -2542
- package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +0 -2107
- package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +0 -966
- package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +0 -404
- package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +0 -30
- package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +0 -296
- package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +0 -374
- package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +0 -564
- package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +0 -406
- package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +0 -981
- package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +0 -142
- package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +0 -406
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +0 -5
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +0 -90
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +0 -576
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +0 -529
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +0 -185
- package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +0 -182
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +0 -1042
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +0 -413
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +0 -88
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +0 -219
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +0 -1281
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +0 -106
- package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +0 -273
- package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +0 -500
- package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +0 -76
- package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +0 -86
- package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +0 -77
- package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +0 -278
- package/runtime/python/okstra_vendor/networkx/classes/__init__.py +0 -13
- package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +0 -435
- package/runtime/python/okstra_vendor/networkx/classes/digraph.py +0 -1363
- package/runtime/python/okstra_vendor/networkx/classes/filters.py +0 -95
- package/runtime/python/okstra_vendor/networkx/classes/function.py +0 -1549
- package/runtime/python/okstra_vendor/networkx/classes/graph.py +0 -2082
- package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +0 -269
- package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +0 -977
- package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +0 -1294
- package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +0 -1447
- package/runtime/python/okstra_vendor/networkx/convert.py +0 -502
- package/runtime/python/okstra_vendor/networkx/convert_matrix.py +0 -1314
- package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +0 -7
- package/runtime/python/okstra_vendor/networkx/drawing/layout.py +0 -2036
- package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +0 -470
- package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +0 -570
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +0 -361
- package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +0 -2978
- package/runtime/python/okstra_vendor/networkx/exception.py +0 -131
- package/runtime/python/okstra_vendor/networkx/generators/__init__.py +0 -34
- package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
- package/runtime/python/okstra_vendor/networkx/generators/atlas.py +0 -227
- package/runtime/python/okstra_vendor/networkx/generators/classic.py +0 -1091
- package/runtime/python/okstra_vendor/networkx/generators/cographs.py +0 -68
- package/runtime/python/okstra_vendor/networkx/generators/community.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +0 -886
- package/runtime/python/okstra_vendor/networkx/generators/directed.py +0 -572
- package/runtime/python/okstra_vendor/networkx/generators/duplication.py +0 -174
- package/runtime/python/okstra_vendor/networkx/generators/ego.py +0 -66
- package/runtime/python/okstra_vendor/networkx/generators/expanders.py +0 -499
- package/runtime/python/okstra_vendor/networkx/generators/geometric.py +0 -1037
- package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +0 -163
- package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +0 -443
- package/runtime/python/okstra_vendor/networkx/generators/intersection.py +0 -125
- package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +0 -70
- package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +0 -664
- package/runtime/python/okstra_vendor/networkx/generators/lattice.py +0 -405
- package/runtime/python/okstra_vendor/networkx/generators/line.py +0 -501
- package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +0 -110
- package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +0 -259
- package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +0 -117
- package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +0 -1416
- package/runtime/python/okstra_vendor/networkx/generators/small.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/social.py +0 -554
- package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +0 -120
- package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +0 -54
- package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +0 -131
- package/runtime/python/okstra_vendor/networkx/generators/time_series.py +0 -74
- package/runtime/python/okstra_vendor/networkx/generators/trees.py +0 -1070
- package/runtime/python/okstra_vendor/networkx/generators/triads.py +0 -94
- package/runtime/python/okstra_vendor/networkx/lazy_imports.py +0 -188
- package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +0 -13
- package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +0 -650
- package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +0 -466
- package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +0 -77
- package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +0 -168
- package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +0 -512
- package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +0 -166
- package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +0 -186
- package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +0 -17
- package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +0 -330
- package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +0 -489
- package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +0 -1084
- package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +0 -879
- package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +0 -427
- package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +0 -1053
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +0 -19
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +0 -156
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +0 -190
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +0 -261
- package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +0 -137
- package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +0 -108
- package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +0 -393
- package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +0 -113
- package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +0 -286
- package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +0 -379
- package/runtime/python/okstra_vendor/networkx/readwrite/text.py +0 -851
- package/runtime/python/okstra_vendor/networkx/relabel.py +0 -285
- package/runtime/python/okstra_vendor/networkx/utils/__init__.py +0 -8
- package/runtime/python/okstra_vendor/networkx/utils/backends.py +0 -2171
- package/runtime/python/okstra_vendor/networkx/utils/configs.py +0 -396
- package/runtime/python/okstra_vendor/networkx/utils/decorators.py +0 -1233
- package/runtime/python/okstra_vendor/networkx/utils/heaps.py +0 -338
- package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +0 -297
- package/runtime/python/okstra_vendor/networkx/utils/misc.py +0 -703
- package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +0 -198
- package/runtime/python/okstra_vendor/networkx/utils/rcm.py +0 -159
- package/runtime/python/okstra_vendor/networkx/utils/union_find.py +0 -106
- package/runtime/skills/okstra-graphify/SKILL.md +0 -169
- package/src/commands/graphify.mjs +0 -32
|
@@ -1,405 +0,0 @@
|
|
|
1
|
-
"""Functions for generating grid graphs and lattices
|
|
2
|
-
|
|
3
|
-
The :func:`grid_2d_graph`, :func:`triangular_lattice_graph`, and
|
|
4
|
-
:func:`hexagonal_lattice_graph` functions correspond to the three
|
|
5
|
-
`regular tilings of the plane`_, the square, triangular, and hexagonal
|
|
6
|
-
tilings, respectively. :func:`grid_graph` and :func:`hypercube_graph`
|
|
7
|
-
are similar for arbitrary dimensions. Useful relevant discussion can
|
|
8
|
-
be found about `Triangular Tiling`_, and `Square, Hex and Triangle Grids`_
|
|
9
|
-
|
|
10
|
-
.. _regular tilings of the plane: https://en.wikipedia.org/wiki/List_of_regular_polytopes_and_compounds#Euclidean_tilings
|
|
11
|
-
.. _Square, Hex and Triangle Grids: http://www-cs-students.stanford.edu/~amitp/game-programming/grids/
|
|
12
|
-
.. _Triangular Tiling: https://en.wikipedia.org/wiki/Triangular_tiling
|
|
13
|
-
|
|
14
|
-
"""
|
|
15
|
-
|
|
16
|
-
from itertools import repeat
|
|
17
|
-
from math import sqrt
|
|
18
|
-
|
|
19
|
-
import networkx as nx
|
|
20
|
-
from networkx.classes import set_node_attributes
|
|
21
|
-
from networkx.exception import NetworkXError
|
|
22
|
-
from networkx.generators.classic import cycle_graph, empty_graph, path_graph
|
|
23
|
-
from networkx.relabel import relabel_nodes
|
|
24
|
-
from networkx.utils import flatten, nodes_or_number, pairwise
|
|
25
|
-
|
|
26
|
-
__all__ = [
|
|
27
|
-
"grid_2d_graph",
|
|
28
|
-
"grid_graph",
|
|
29
|
-
"hypercube_graph",
|
|
30
|
-
"triangular_lattice_graph",
|
|
31
|
-
"hexagonal_lattice_graph",
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
36
|
-
@nodes_or_number([0, 1])
|
|
37
|
-
def grid_2d_graph(m, n, periodic=False, create_using=None):
|
|
38
|
-
"""Returns the two-dimensional grid graph.
|
|
39
|
-
|
|
40
|
-
The grid graph has each node connected to its four nearest neighbors.
|
|
41
|
-
|
|
42
|
-
Parameters
|
|
43
|
-
----------
|
|
44
|
-
m, n : int or iterable container of nodes
|
|
45
|
-
If an integer, nodes are from `range(n)`.
|
|
46
|
-
If a container, elements become the coordinate of the nodes.
|
|
47
|
-
|
|
48
|
-
periodic : bool or iterable
|
|
49
|
-
If `periodic` is True, both dimensions are periodic. If False, none
|
|
50
|
-
are periodic. If `periodic` is iterable, it should yield 2 bool
|
|
51
|
-
values indicating whether the 1st and 2nd axes, respectively, are
|
|
52
|
-
periodic.
|
|
53
|
-
|
|
54
|
-
create_using : NetworkX graph constructor, optional (default=nx.Graph)
|
|
55
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
56
|
-
|
|
57
|
-
Returns
|
|
58
|
-
-------
|
|
59
|
-
NetworkX graph
|
|
60
|
-
The (possibly periodic) grid graph of the specified dimensions.
|
|
61
|
-
|
|
62
|
-
See Also
|
|
63
|
-
--------
|
|
64
|
-
triangular_lattice_graph, hexagonal_lattice_graph :
|
|
65
|
-
Other 2D lattice graphs
|
|
66
|
-
grid_graph, hypercube_graph :
|
|
67
|
-
N-dimensional lattice graphs
|
|
68
|
-
"""
|
|
69
|
-
G = empty_graph(0, create_using)
|
|
70
|
-
row_name, rows = m
|
|
71
|
-
col_name, cols = n
|
|
72
|
-
G.add_nodes_from((i, j) for i in rows for j in cols)
|
|
73
|
-
G.add_edges_from(((i, j), (pi, j)) for pi, i in pairwise(rows) for j in cols)
|
|
74
|
-
G.add_edges_from(((i, j), (i, pj)) for i in rows for pj, j in pairwise(cols))
|
|
75
|
-
|
|
76
|
-
try:
|
|
77
|
-
periodic_r, periodic_c = periodic
|
|
78
|
-
except TypeError:
|
|
79
|
-
periodic_r = periodic_c = periodic
|
|
80
|
-
|
|
81
|
-
if periodic_r and len(rows) > 2:
|
|
82
|
-
first = rows[0]
|
|
83
|
-
last = rows[-1]
|
|
84
|
-
G.add_edges_from(((first, j), (last, j)) for j in cols)
|
|
85
|
-
if periodic_c and len(cols) > 2:
|
|
86
|
-
first = cols[0]
|
|
87
|
-
last = cols[-1]
|
|
88
|
-
G.add_edges_from(((i, first), (i, last)) for i in rows)
|
|
89
|
-
# both directions for directed
|
|
90
|
-
if G.is_directed():
|
|
91
|
-
G.add_edges_from((v, u) for u, v in G.edges())
|
|
92
|
-
return G
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
96
|
-
def grid_graph(dim, periodic=False):
|
|
97
|
-
"""Returns the *n*-dimensional grid graph.
|
|
98
|
-
|
|
99
|
-
The dimension *n* is the length of the list `dim` and the size in
|
|
100
|
-
each dimension is the value of the corresponding list element.
|
|
101
|
-
|
|
102
|
-
Parameters
|
|
103
|
-
----------
|
|
104
|
-
dim : list or tuple of numbers or iterables of nodes
|
|
105
|
-
'dim' is a tuple or list with, for each dimension, either a number
|
|
106
|
-
that is the size of that dimension or an iterable of nodes for
|
|
107
|
-
that dimension. The dimension of the grid_graph is the length
|
|
108
|
-
of `dim`.
|
|
109
|
-
|
|
110
|
-
periodic : bool or iterable
|
|
111
|
-
If `periodic` is True, all dimensions are periodic. If False all
|
|
112
|
-
dimensions are not periodic. If `periodic` is iterable, it should
|
|
113
|
-
yield `dim` bool values each of which indicates whether the
|
|
114
|
-
corresponding axis is periodic.
|
|
115
|
-
|
|
116
|
-
Returns
|
|
117
|
-
-------
|
|
118
|
-
NetworkX graph
|
|
119
|
-
The (possibly periodic) grid graph of the specified dimensions.
|
|
120
|
-
|
|
121
|
-
See Also
|
|
122
|
-
--------
|
|
123
|
-
grid_2d_graph, triangular_lattice_graph, hexagonal_lattice_graph :
|
|
124
|
-
2D lattice graphs
|
|
125
|
-
hypercube_graph :
|
|
126
|
-
A special case of `grid_graph` where all elements of `dim` are identical
|
|
127
|
-
|
|
128
|
-
Examples
|
|
129
|
-
--------
|
|
130
|
-
To produce a 2 by 3 by 4 grid graph, a graph on 24 nodes:
|
|
131
|
-
|
|
132
|
-
>>> from networkx import grid_graph
|
|
133
|
-
>>> G = grid_graph(dim=(2, 3, 4))
|
|
134
|
-
>>> len(G)
|
|
135
|
-
24
|
|
136
|
-
>>> G = grid_graph(dim=(range(7, 9), range(3, 6)))
|
|
137
|
-
>>> len(G)
|
|
138
|
-
6
|
|
139
|
-
"""
|
|
140
|
-
from collections.abc import Iterable
|
|
141
|
-
|
|
142
|
-
from networkx.algorithms.operators.product import cartesian_product
|
|
143
|
-
|
|
144
|
-
if not dim:
|
|
145
|
-
return empty_graph(0)
|
|
146
|
-
|
|
147
|
-
periodic = repeat(periodic) if not isinstance(periodic, Iterable) else periodic
|
|
148
|
-
func = (cycle_graph if p else path_graph for p in periodic)
|
|
149
|
-
|
|
150
|
-
G = next(func)(dim[0])
|
|
151
|
-
for current_dim in dim[1:]:
|
|
152
|
-
Gnew = next(func)(current_dim)
|
|
153
|
-
G = cartesian_product(Gnew, G)
|
|
154
|
-
# graph G is done but has labels of the form (1, (2, (3, 1))) so relabel
|
|
155
|
-
H = relabel_nodes(G, flatten)
|
|
156
|
-
return H
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
160
|
-
def hypercube_graph(n):
|
|
161
|
-
"""Returns the *n*-dimensional hypercube graph.
|
|
162
|
-
|
|
163
|
-
The *n*-dimensional hypercube graph [1]_ has ``2**n`` nodes, each represented as
|
|
164
|
-
a binary integer in the form of a tuple of 0's and 1's. Edges exist between
|
|
165
|
-
nodes that differ in exactly one bit.
|
|
166
|
-
|
|
167
|
-
Parameters
|
|
168
|
-
----------
|
|
169
|
-
n : int
|
|
170
|
-
Dimension of the hypercube, must be a positive integer.
|
|
171
|
-
|
|
172
|
-
Returns
|
|
173
|
-
-------
|
|
174
|
-
networkx.Graph
|
|
175
|
-
The n-dimensional hypercube graph as an undirected graph.
|
|
176
|
-
|
|
177
|
-
See Also
|
|
178
|
-
--------
|
|
179
|
-
grid_2d_graph, triangular_lattice_graph, hexagonal_lattice_graph :
|
|
180
|
-
2D lattice graphs
|
|
181
|
-
grid_graph :
|
|
182
|
-
A more general N-dimensional grid
|
|
183
|
-
|
|
184
|
-
Examples
|
|
185
|
-
--------
|
|
186
|
-
>>> G = nx.hypercube_graph(3)
|
|
187
|
-
>>> list(G.neighbors((0, 0, 0)))
|
|
188
|
-
[(1, 0, 0), (0, 1, 0), (0, 0, 1)]
|
|
189
|
-
|
|
190
|
-
References
|
|
191
|
-
----------
|
|
192
|
-
.. [1] https://en.wikipedia.org/wiki/Hypercube_graph
|
|
193
|
-
"""
|
|
194
|
-
dim = n * [2]
|
|
195
|
-
G = grid_graph(dim)
|
|
196
|
-
return G
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
200
|
-
def triangular_lattice_graph(
|
|
201
|
-
m, n, periodic=False, with_positions=True, create_using=None
|
|
202
|
-
):
|
|
203
|
-
r"""Returns the $m$ by $n$ triangular lattice graph.
|
|
204
|
-
|
|
205
|
-
The `triangular lattice graph`_ is a two-dimensional `grid graph`_ in
|
|
206
|
-
which each square unit has a diagonal edge (each grid unit has a chord).
|
|
207
|
-
|
|
208
|
-
The returned graph has $m$ rows and $n$ columns of triangles. Rows and
|
|
209
|
-
columns include both triangles pointing up and down. Rows form a strip
|
|
210
|
-
of constant height. Columns form a series of diamond shapes, staggered
|
|
211
|
-
with the columns on either side. Another way to state the size is that
|
|
212
|
-
the nodes form a grid of `m+1` rows and `(n + 1) // 2` columns.
|
|
213
|
-
The odd row nodes are shifted horizontally relative to the even rows.
|
|
214
|
-
|
|
215
|
-
Directed graph types have edges pointed up or right.
|
|
216
|
-
|
|
217
|
-
Positions of nodes are computed by default or `with_positions is True`.
|
|
218
|
-
The position of each node (embedded in a euclidean plane) is stored in
|
|
219
|
-
the graph using equilateral triangles with sidelength 1.
|
|
220
|
-
The height between rows of nodes is thus $\sqrt(3)/2$.
|
|
221
|
-
Nodes lie in the first quadrant with the node $(0, 0)$ at the origin.
|
|
222
|
-
|
|
223
|
-
.. _triangular lattice graph: http://mathworld.wolfram.com/TriangularGrid.html
|
|
224
|
-
.. _grid graph: http://www-cs-students.stanford.edu/~amitp/game-programming/grids/
|
|
225
|
-
.. _Triangular Tiling: https://en.wikipedia.org/wiki/Triangular_tiling
|
|
226
|
-
|
|
227
|
-
Parameters
|
|
228
|
-
----------
|
|
229
|
-
m : int
|
|
230
|
-
The number of rows in the lattice.
|
|
231
|
-
|
|
232
|
-
n : int
|
|
233
|
-
The number of columns in the lattice.
|
|
234
|
-
|
|
235
|
-
periodic : bool (default: False)
|
|
236
|
-
If True, join the boundary vertices of the grid using periodic
|
|
237
|
-
boundary conditions. The join between boundaries is the final row
|
|
238
|
-
and column of triangles. This means there is one row and one column
|
|
239
|
-
fewer nodes for the periodic lattice. Periodic lattices require
|
|
240
|
-
`m >= 3`, `n >= 5` and are allowed but misaligned if `m` or `n` are odd
|
|
241
|
-
|
|
242
|
-
with_positions : bool (default: True)
|
|
243
|
-
Store the coordinates of each node in the graph node attribute 'pos'.
|
|
244
|
-
The coordinates provide a lattice with equilateral triangles.
|
|
245
|
-
Periodic positions shift the nodes vertically in a nonlinear way so
|
|
246
|
-
the edges don't overlap so much.
|
|
247
|
-
|
|
248
|
-
create_using : NetworkX graph constructor, optional (default=nx.Graph)
|
|
249
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
250
|
-
|
|
251
|
-
Returns
|
|
252
|
-
-------
|
|
253
|
-
NetworkX graph
|
|
254
|
-
The *m* by *n* triangular lattice graph.
|
|
255
|
-
|
|
256
|
-
See Also
|
|
257
|
-
--------
|
|
258
|
-
grid_2d_graph, hexagonal_lattice_graph :
|
|
259
|
-
Other 2D lattice graphs
|
|
260
|
-
grid_graph, hypercube_graph :
|
|
261
|
-
N-dimensional lattice graphs
|
|
262
|
-
"""
|
|
263
|
-
H = empty_graph(0, create_using)
|
|
264
|
-
if n == 0 or m == 0:
|
|
265
|
-
return H
|
|
266
|
-
if periodic:
|
|
267
|
-
if n < 5 or m < 3:
|
|
268
|
-
msg = f"m > 2 and n > 4 required for periodic. m={m}, n={n}"
|
|
269
|
-
raise NetworkXError(msg)
|
|
270
|
-
|
|
271
|
-
N = (n + 1) // 2 # number of nodes in row
|
|
272
|
-
rows = range(m + 1)
|
|
273
|
-
cols = range(N + 1)
|
|
274
|
-
# Make grid
|
|
275
|
-
H.add_edges_from(((i, j), (i + 1, j)) for j in rows for i in cols[:N])
|
|
276
|
-
H.add_edges_from(((i, j), (i, j + 1)) for j in rows[:m] for i in cols)
|
|
277
|
-
# add diagonals
|
|
278
|
-
H.add_edges_from(((i, j), (i + 1, j + 1)) for j in rows[1:m:2] for i in cols[:N])
|
|
279
|
-
H.add_edges_from(((i + 1, j), (i, j + 1)) for j in rows[:m:2] for i in cols[:N])
|
|
280
|
-
|
|
281
|
-
# identify boundary nodes if periodic
|
|
282
|
-
if periodic is True:
|
|
283
|
-
for i in cols:
|
|
284
|
-
H = nx.contracted_nodes(H, (i, 0), (i, m), store_contraction_as=None)
|
|
285
|
-
for j in rows[:m]:
|
|
286
|
-
H = nx.contracted_nodes(H, (0, j), (N, j), store_contraction_as=None)
|
|
287
|
-
elif n % 2:
|
|
288
|
-
# remove extra nodes
|
|
289
|
-
H.remove_nodes_from((N, j) for j in rows[1::2])
|
|
290
|
-
|
|
291
|
-
# Add position node attributes
|
|
292
|
-
if with_positions:
|
|
293
|
-
ii = (i for i in cols for j in rows)
|
|
294
|
-
jj = (j for i in cols for j in rows)
|
|
295
|
-
xx = (0.5 * (j % 2) + i for i in cols for j in rows)
|
|
296
|
-
h = sqrt(3) / 2
|
|
297
|
-
if periodic:
|
|
298
|
-
yy = (h * j + 0.01 * i * i for i in cols for j in rows)
|
|
299
|
-
else:
|
|
300
|
-
yy = (h * j for i in cols for j in rows)
|
|
301
|
-
pos = {(i, j): (x, y) for i, j, x, y in zip(ii, jj, xx, yy) if (i, j) in H}
|
|
302
|
-
set_node_attributes(H, pos, "pos")
|
|
303
|
-
return H
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
307
|
-
def hexagonal_lattice_graph(
|
|
308
|
-
m, n, periodic=False, with_positions=True, create_using=None
|
|
309
|
-
):
|
|
310
|
-
"""Returns an `m` by `n` hexagonal lattice graph.
|
|
311
|
-
|
|
312
|
-
The *hexagonal lattice graph* is a graph whose nodes and edges are
|
|
313
|
-
the `hexagonal tiling`_ of the plane.
|
|
314
|
-
|
|
315
|
-
The returned graph will have `m` rows and `n` columns of hexagons.
|
|
316
|
-
`Odd numbered columns`_ are shifted up relative to even numbered columns.
|
|
317
|
-
|
|
318
|
-
Positions of nodes are computed by default or `with_positions is True`.
|
|
319
|
-
Node positions creating the standard embedding in the plane
|
|
320
|
-
with sidelength 1 and are stored in the node attribute 'pos'.
|
|
321
|
-
`pos = nx.get_node_attributes(G, 'pos')` creates a dict ready for drawing.
|
|
322
|
-
|
|
323
|
-
.. _hexagonal tiling: https://en.wikipedia.org/wiki/Hexagonal_tiling
|
|
324
|
-
.. _Odd numbered columns: http://www-cs-students.stanford.edu/~amitp/game-programming/grids/
|
|
325
|
-
|
|
326
|
-
Parameters
|
|
327
|
-
----------
|
|
328
|
-
m : int
|
|
329
|
-
The number of rows of hexagons in the lattice.
|
|
330
|
-
|
|
331
|
-
n : int
|
|
332
|
-
The number of columns of hexagons in the lattice.
|
|
333
|
-
|
|
334
|
-
periodic : bool
|
|
335
|
-
Whether to make a periodic grid by joining the boundary vertices.
|
|
336
|
-
For this to work `n` must be even and both `n > 1` and `m > 1`.
|
|
337
|
-
The periodic connections create another row and column of hexagons
|
|
338
|
-
so these graphs have fewer nodes as boundary nodes are identified.
|
|
339
|
-
|
|
340
|
-
with_positions : bool (default: True)
|
|
341
|
-
Store the coordinates of each node in the graph node attribute 'pos'.
|
|
342
|
-
The coordinates provide a lattice with vertical columns of hexagons
|
|
343
|
-
offset to interleave and cover the plane.
|
|
344
|
-
Periodic positions shift the nodes vertically in a nonlinear way so
|
|
345
|
-
the edges don't overlap so much.
|
|
346
|
-
|
|
347
|
-
create_using : NetworkX graph constructor, optional (default=nx.Graph)
|
|
348
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
349
|
-
If graph is directed, edges will point up or right.
|
|
350
|
-
|
|
351
|
-
Returns
|
|
352
|
-
-------
|
|
353
|
-
NetworkX graph
|
|
354
|
-
The *m* by *n* hexagonal lattice graph.
|
|
355
|
-
|
|
356
|
-
See Also
|
|
357
|
-
--------
|
|
358
|
-
grid_2d_graph, triangular_lattice_graph :
|
|
359
|
-
Other 2D lattice graphs
|
|
360
|
-
grid_graph, hypercube_graph :
|
|
361
|
-
N-dimensional lattice graphs
|
|
362
|
-
"""
|
|
363
|
-
G = empty_graph(0, create_using)
|
|
364
|
-
if m == 0 or n == 0:
|
|
365
|
-
return G
|
|
366
|
-
if periodic and (n % 2 == 1 or m < 2 or n < 2):
|
|
367
|
-
msg = "periodic hexagonal lattice needs m > 1, n > 1 and even n"
|
|
368
|
-
raise NetworkXError(msg)
|
|
369
|
-
|
|
370
|
-
M = 2 * m # twice as many nodes as hexagons vertically
|
|
371
|
-
rows = range(M + 2)
|
|
372
|
-
cols = range(n + 1)
|
|
373
|
-
# make lattice
|
|
374
|
-
col_edges = (((i, j), (i, j + 1)) for i in cols for j in rows[: M + 1])
|
|
375
|
-
row_edges = (((i, j), (i + 1, j)) for i in cols[:n] for j in rows if i % 2 == j % 2)
|
|
376
|
-
G.add_edges_from(col_edges)
|
|
377
|
-
G.add_edges_from(row_edges)
|
|
378
|
-
# Remove corner nodes with one edge
|
|
379
|
-
G.remove_node((0, M + 1))
|
|
380
|
-
G.remove_node((n, (M + 1) * (n % 2)))
|
|
381
|
-
|
|
382
|
-
# identify boundary nodes if periodic
|
|
383
|
-
if periodic:
|
|
384
|
-
for i in cols[:n]:
|
|
385
|
-
G = nx.contracted_nodes(G, (i, 0), (i, M), store_contraction_as=None)
|
|
386
|
-
for i in cols[1:]:
|
|
387
|
-
G = nx.contracted_nodes(G, (i, 1), (i, M + 1), store_contraction_as=None)
|
|
388
|
-
for j in rows[1:M]:
|
|
389
|
-
G = nx.contracted_nodes(G, (0, j), (n, j), store_contraction_as=None)
|
|
390
|
-
G.remove_node((n, M))
|
|
391
|
-
|
|
392
|
-
# calc position in embedded space
|
|
393
|
-
if with_positions:
|
|
394
|
-
ii = (i for i in cols for j in rows)
|
|
395
|
-
jj = (j for i in cols for j in rows)
|
|
396
|
-
xx = (0.5 + i + i // 2 + (j % 2) * ((i % 2) - 0.5) for i in cols for j in rows)
|
|
397
|
-
h = sqrt(3) / 2
|
|
398
|
-
if periodic:
|
|
399
|
-
yy = (h * j + 0.01 * i * i for i in cols for j in rows)
|
|
400
|
-
else:
|
|
401
|
-
yy = (h * j for i in cols for j in rows)
|
|
402
|
-
# exclude nodes not in G
|
|
403
|
-
pos = {(i, j): (x, y) for i, j, x, y in zip(ii, jj, xx, yy) if (i, j) in G}
|
|
404
|
-
set_node_attributes(G, pos, "pos")
|
|
405
|
-
return G
|