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,499 +0,0 @@
|
|
|
1
|
-
"""Provides explicit constructions of expander graphs."""
|
|
2
|
-
|
|
3
|
-
import itertools
|
|
4
|
-
|
|
5
|
-
import networkx as nx
|
|
6
|
-
|
|
7
|
-
__all__ = [
|
|
8
|
-
"margulis_gabber_galil_graph",
|
|
9
|
-
"chordal_cycle_graph",
|
|
10
|
-
"paley_graph",
|
|
11
|
-
"maybe_regular_expander",
|
|
12
|
-
"maybe_regular_expander_graph",
|
|
13
|
-
"is_regular_expander",
|
|
14
|
-
"random_regular_expander_graph",
|
|
15
|
-
]
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
# Other discrete torus expanders can be constructed by using the following edge
|
|
19
|
-
# sets. For more information, see Chapter 4, "Expander Graphs", in
|
|
20
|
-
# "Pseudorandomness", by Salil Vadhan.
|
|
21
|
-
#
|
|
22
|
-
# For a directed expander, add edges from (x, y) to:
|
|
23
|
-
#
|
|
24
|
-
# (x, y),
|
|
25
|
-
# ((x + 1) % n, y),
|
|
26
|
-
# (x, (y + 1) % n),
|
|
27
|
-
# (x, (x + y) % n),
|
|
28
|
-
# (-y % n, x)
|
|
29
|
-
#
|
|
30
|
-
# For an undirected expander, add the reverse edges.
|
|
31
|
-
#
|
|
32
|
-
# Also appearing in the paper of Gabber and Galil:
|
|
33
|
-
#
|
|
34
|
-
# (x, y),
|
|
35
|
-
# (x, (x + y) % n),
|
|
36
|
-
# (x, (x + y + 1) % n),
|
|
37
|
-
# ((x + y) % n, y),
|
|
38
|
-
# ((x + y + 1) % n, y)
|
|
39
|
-
#
|
|
40
|
-
# and:
|
|
41
|
-
#
|
|
42
|
-
# (x, y),
|
|
43
|
-
# ((x + 2*y) % n, y),
|
|
44
|
-
# ((x + (2*y + 1)) % n, y),
|
|
45
|
-
# ((x + (2*y + 2)) % n, y),
|
|
46
|
-
# (x, (y + 2*x) % n),
|
|
47
|
-
# (x, (y + (2*x + 1)) % n),
|
|
48
|
-
# (x, (y + (2*x + 2)) % n),
|
|
49
|
-
#
|
|
50
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
51
|
-
def margulis_gabber_galil_graph(n, create_using=None):
|
|
52
|
-
r"""Returns the Margulis-Gabber-Galil undirected MultiGraph on `n^2` nodes.
|
|
53
|
-
|
|
54
|
-
The undirected MultiGraph is regular with degree `8`. Nodes are integer
|
|
55
|
-
pairs. The second-largest eigenvalue of the adjacency matrix of the graph
|
|
56
|
-
is at most `5 \sqrt{2}`, regardless of `n`.
|
|
57
|
-
|
|
58
|
-
Parameters
|
|
59
|
-
----------
|
|
60
|
-
n : int
|
|
61
|
-
Determines the number of nodes in the graph: `n^2`.
|
|
62
|
-
create_using : NetworkX graph constructor, optional (default MultiGraph)
|
|
63
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
64
|
-
|
|
65
|
-
Returns
|
|
66
|
-
-------
|
|
67
|
-
G : graph
|
|
68
|
-
The constructed undirected multigraph.
|
|
69
|
-
|
|
70
|
-
Raises
|
|
71
|
-
------
|
|
72
|
-
NetworkXError
|
|
73
|
-
If the graph is directed or not a multigraph.
|
|
74
|
-
|
|
75
|
-
"""
|
|
76
|
-
G = nx.empty_graph(0, create_using, default=nx.MultiGraph)
|
|
77
|
-
if G.is_directed() or not G.is_multigraph():
|
|
78
|
-
msg = "`create_using` must be an undirected multigraph."
|
|
79
|
-
raise nx.NetworkXError(msg)
|
|
80
|
-
|
|
81
|
-
for x, y in itertools.product(range(n), repeat=2):
|
|
82
|
-
for u, v in (
|
|
83
|
-
((x + 2 * y) % n, y),
|
|
84
|
-
((x + (2 * y + 1)) % n, y),
|
|
85
|
-
(x, (y + 2 * x) % n),
|
|
86
|
-
(x, (y + (2 * x + 1)) % n),
|
|
87
|
-
):
|
|
88
|
-
G.add_edge((x, y), (u, v))
|
|
89
|
-
G.graph["name"] = f"margulis_gabber_galil_graph({n})"
|
|
90
|
-
return G
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
94
|
-
def chordal_cycle_graph(p, create_using=None):
|
|
95
|
-
"""Returns the chordal cycle graph on `p` nodes.
|
|
96
|
-
|
|
97
|
-
The returned graph is a cycle graph on `p` nodes with chords joining each
|
|
98
|
-
vertex `x` to its inverse modulo `p`. This graph is a (mildly explicit)
|
|
99
|
-
3-regular expander [1]_.
|
|
100
|
-
|
|
101
|
-
`p` *must* be a prime number.
|
|
102
|
-
|
|
103
|
-
Parameters
|
|
104
|
-
----------
|
|
105
|
-
p : a prime number
|
|
106
|
-
|
|
107
|
-
The number of vertices in the graph. This also indicates where the
|
|
108
|
-
chordal edges in the cycle will be created.
|
|
109
|
-
|
|
110
|
-
create_using : NetworkX graph constructor, optional (default=nx.Graph)
|
|
111
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
112
|
-
|
|
113
|
-
Returns
|
|
114
|
-
-------
|
|
115
|
-
G : graph
|
|
116
|
-
The constructed undirected multigraph.
|
|
117
|
-
|
|
118
|
-
Raises
|
|
119
|
-
------
|
|
120
|
-
NetworkXError
|
|
121
|
-
|
|
122
|
-
If `create_using` indicates directed or not a multigraph.
|
|
123
|
-
|
|
124
|
-
References
|
|
125
|
-
----------
|
|
126
|
-
|
|
127
|
-
.. [1] Theorem 4.4.2 in A. Lubotzky. "Discrete groups, expanding graphs and
|
|
128
|
-
invariant measures", volume 125 of Progress in Mathematics.
|
|
129
|
-
Birkhäuser Verlag, Basel, 1994.
|
|
130
|
-
|
|
131
|
-
"""
|
|
132
|
-
G = nx.empty_graph(0, create_using, default=nx.MultiGraph)
|
|
133
|
-
if G.is_directed() or not G.is_multigraph():
|
|
134
|
-
msg = "`create_using` must be an undirected multigraph."
|
|
135
|
-
raise nx.NetworkXError(msg)
|
|
136
|
-
|
|
137
|
-
for x in range(p):
|
|
138
|
-
left = (x - 1) % p
|
|
139
|
-
right = (x + 1) % p
|
|
140
|
-
# Here we apply Fermat's Little Theorem to compute the multiplicative
|
|
141
|
-
# inverse of x in Z/pZ. By Fermat's Little Theorem,
|
|
142
|
-
#
|
|
143
|
-
# x^p = x (mod p)
|
|
144
|
-
#
|
|
145
|
-
# Therefore,
|
|
146
|
-
#
|
|
147
|
-
# x * x^(p - 2) = 1 (mod p)
|
|
148
|
-
#
|
|
149
|
-
# The number 0 is a special case: we just let its inverse be itself.
|
|
150
|
-
chord = pow(x, p - 2, p) if x > 0 else 0
|
|
151
|
-
for y in (left, right, chord):
|
|
152
|
-
G.add_edge(x, y)
|
|
153
|
-
G.graph["name"] = f"chordal_cycle_graph({p})"
|
|
154
|
-
return G
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
158
|
-
def paley_graph(p, create_using=None):
|
|
159
|
-
r"""Returns the Paley $\frac{(p-1)}{2}$ -regular graph on $p$ nodes.
|
|
160
|
-
|
|
161
|
-
The returned graph is a graph on $\mathbb{Z}/p\mathbb{Z}$ with edges between $x$ and $y$
|
|
162
|
-
if and only if $x-y$ is a nonzero square in $\mathbb{Z}/p\mathbb{Z}$.
|
|
163
|
-
|
|
164
|
-
If $p \equiv 1 \pmod 4$, $-1$ is a square in
|
|
165
|
-
$\mathbb{Z}/p\mathbb{Z}$ and therefore $x-y$ is a square if and
|
|
166
|
-
only if $y-x$ is also a square, i.e the edges in the Paley graph are symmetric.
|
|
167
|
-
|
|
168
|
-
If $p \equiv 3 \pmod 4$, $-1$ is not a square in $\mathbb{Z}/p\mathbb{Z}$
|
|
169
|
-
and therefore either $x-y$ or $y-x$ is a square in $\mathbb{Z}/p\mathbb{Z}$ but not both.
|
|
170
|
-
|
|
171
|
-
Note that a more general definition of Paley graphs extends this construction
|
|
172
|
-
to graphs over $q=p^n$ vertices, by using the finite field $F_q$ instead of
|
|
173
|
-
$\mathbb{Z}/p\mathbb{Z}$.
|
|
174
|
-
This construction requires to compute squares in general finite fields and is
|
|
175
|
-
not what is implemented here (i.e `paley_graph(25)` does not return the true
|
|
176
|
-
Paley graph associated with $5^2$).
|
|
177
|
-
|
|
178
|
-
Parameters
|
|
179
|
-
----------
|
|
180
|
-
p : int, an odd prime number.
|
|
181
|
-
|
|
182
|
-
create_using : NetworkX graph constructor, optional (default=nx.Graph)
|
|
183
|
-
Graph type to create. If graph instance, then cleared before populated.
|
|
184
|
-
|
|
185
|
-
Returns
|
|
186
|
-
-------
|
|
187
|
-
G : graph
|
|
188
|
-
The constructed directed graph.
|
|
189
|
-
|
|
190
|
-
Raises
|
|
191
|
-
------
|
|
192
|
-
NetworkXError
|
|
193
|
-
If the graph is a multigraph.
|
|
194
|
-
|
|
195
|
-
References
|
|
196
|
-
----------
|
|
197
|
-
Chapter 13 in B. Bollobas, Random Graphs. Second edition.
|
|
198
|
-
Cambridge Studies in Advanced Mathematics, 73.
|
|
199
|
-
Cambridge University Press, Cambridge (2001).
|
|
200
|
-
"""
|
|
201
|
-
G = nx.empty_graph(0, create_using, default=nx.DiGraph)
|
|
202
|
-
if G.is_multigraph():
|
|
203
|
-
msg = "`create_using` cannot be a multigraph."
|
|
204
|
-
raise nx.NetworkXError(msg)
|
|
205
|
-
|
|
206
|
-
# Compute the squares in Z/pZ.
|
|
207
|
-
# Make it a set to uniquify (there are exactly (p-1)/2 squares in Z/pZ
|
|
208
|
-
# when is prime).
|
|
209
|
-
square_set = {(x**2) % p for x in range(1, p) if (x**2) % p != 0}
|
|
210
|
-
|
|
211
|
-
for x in range(p):
|
|
212
|
-
for x2 in square_set:
|
|
213
|
-
G.add_edge(x, (x + x2) % p)
|
|
214
|
-
G.graph["name"] = f"paley({p})"
|
|
215
|
-
return G
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
@nx.utils.decorators.np_random_state("seed")
|
|
219
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
220
|
-
def maybe_regular_expander_graph(n, d, *, create_using=None, max_tries=100, seed=None):
|
|
221
|
-
r"""Utility for creating a random regular expander.
|
|
222
|
-
|
|
223
|
-
Returns a random $d$-regular graph on $n$ nodes which is an expander
|
|
224
|
-
graph with very good probability.
|
|
225
|
-
|
|
226
|
-
Parameters
|
|
227
|
-
----------
|
|
228
|
-
n : int
|
|
229
|
-
The number of nodes.
|
|
230
|
-
d : int
|
|
231
|
-
The degree of each node.
|
|
232
|
-
create_using : Graph Instance or Constructor
|
|
233
|
-
Indicator of type of graph to return.
|
|
234
|
-
If a Graph-type instance, then clear and use it.
|
|
235
|
-
If a constructor, call it to create an empty graph.
|
|
236
|
-
Use the Graph constructor by default.
|
|
237
|
-
max_tries : int. (default: 100)
|
|
238
|
-
The number of allowed loops when generating each independent cycle
|
|
239
|
-
seed : (default: None)
|
|
240
|
-
Seed used to set random number generation state. See :ref`Randomness<randomness>`.
|
|
241
|
-
|
|
242
|
-
Notes
|
|
243
|
-
-----
|
|
244
|
-
The nodes are numbered from $0$ to $n - 1$.
|
|
245
|
-
|
|
246
|
-
The graph is generated by taking $d / 2$ random independent cycles.
|
|
247
|
-
|
|
248
|
-
Joel Friedman proved that in this model the resulting
|
|
249
|
-
graph is an expander with probability
|
|
250
|
-
$1 - O(n^{-\tau})$ where $\tau = \lceil (\sqrt{d - 1}) / 2 \rceil - 1$. [1]_
|
|
251
|
-
|
|
252
|
-
Examples
|
|
253
|
-
--------
|
|
254
|
-
>>> G = nx.maybe_regular_expander_graph(n=200, d=6, seed=8020)
|
|
255
|
-
|
|
256
|
-
Returns
|
|
257
|
-
-------
|
|
258
|
-
G : graph
|
|
259
|
-
The constructed undirected graph.
|
|
260
|
-
|
|
261
|
-
Raises
|
|
262
|
-
------
|
|
263
|
-
NetworkXError
|
|
264
|
-
If $d % 2 != 0$ as the degree must be even.
|
|
265
|
-
If $n - 1$ is less than $ 2d $ as the graph is complete at most.
|
|
266
|
-
If max_tries is reached
|
|
267
|
-
|
|
268
|
-
See Also
|
|
269
|
-
--------
|
|
270
|
-
is_regular_expander
|
|
271
|
-
random_regular_expander_graph
|
|
272
|
-
|
|
273
|
-
References
|
|
274
|
-
----------
|
|
275
|
-
.. [1] Joel Friedman,
|
|
276
|
-
A Proof of Alon's Second Eigenvalue Conjecture and Related Problems, 2004
|
|
277
|
-
https://arxiv.org/abs/cs/0405020
|
|
278
|
-
|
|
279
|
-
"""
|
|
280
|
-
|
|
281
|
-
import numpy as np
|
|
282
|
-
|
|
283
|
-
if n < 1:
|
|
284
|
-
raise nx.NetworkXError("n must be a positive integer")
|
|
285
|
-
|
|
286
|
-
if not (d >= 2):
|
|
287
|
-
raise nx.NetworkXError("d must be greater than or equal to 2")
|
|
288
|
-
|
|
289
|
-
if not (d % 2 == 0):
|
|
290
|
-
raise nx.NetworkXError("d must be even")
|
|
291
|
-
|
|
292
|
-
if not (n - 1 >= d):
|
|
293
|
-
raise nx.NetworkXError(
|
|
294
|
-
f"Need n-1>= d to have room for {d // 2} independent cycles with {n} nodes"
|
|
295
|
-
)
|
|
296
|
-
|
|
297
|
-
G = nx.empty_graph(n, create_using)
|
|
298
|
-
|
|
299
|
-
if n < 2:
|
|
300
|
-
return G
|
|
301
|
-
|
|
302
|
-
cycles = []
|
|
303
|
-
edges = set()
|
|
304
|
-
|
|
305
|
-
# Create d / 2 cycles
|
|
306
|
-
for i in range(d // 2):
|
|
307
|
-
iterations = max_tries
|
|
308
|
-
# Make sure the cycles are independent to have a regular graph
|
|
309
|
-
while len(edges) != (i + 1) * n:
|
|
310
|
-
iterations -= 1
|
|
311
|
-
# Faster than random.permutation(n) since there are only
|
|
312
|
-
# (n-1)! distinct cycles against n! permutations of size n
|
|
313
|
-
cycle = seed.permutation(n - 1).tolist()
|
|
314
|
-
cycle.append(n - 1)
|
|
315
|
-
|
|
316
|
-
new_edges = {
|
|
317
|
-
(u, v)
|
|
318
|
-
for u, v in nx.utils.pairwise(cycle, cyclic=True)
|
|
319
|
-
if (u, v) not in edges and (v, u) not in edges
|
|
320
|
-
}
|
|
321
|
-
# If the new cycle has no edges in common with previous cycles
|
|
322
|
-
# then add it to the list otherwise try again
|
|
323
|
-
if len(new_edges) == n:
|
|
324
|
-
cycles.append(cycle)
|
|
325
|
-
edges.update(new_edges)
|
|
326
|
-
|
|
327
|
-
if iterations == 0:
|
|
328
|
-
msg = "Too many iterations in maybe_regular_expander_graph"
|
|
329
|
-
raise nx.NetworkXError(msg)
|
|
330
|
-
|
|
331
|
-
G.add_edges_from(edges)
|
|
332
|
-
|
|
333
|
-
return G
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
def maybe_regular_expander(n, d, *, create_using=None, max_tries=100, seed=None):
|
|
337
|
-
"""
|
|
338
|
-
.. deprecated:: 3.6
|
|
339
|
-
`maybe_regular_expander` is a deprecated alias
|
|
340
|
-
for `maybe_regular_expander_graph`.
|
|
341
|
-
Use `maybe_regular_expander_graph` instead.
|
|
342
|
-
"""
|
|
343
|
-
import warnings
|
|
344
|
-
|
|
345
|
-
warnings.warn(
|
|
346
|
-
"maybe_regular_expander is deprecated, "
|
|
347
|
-
"use `maybe_regular_expander_graph` instead.",
|
|
348
|
-
category=DeprecationWarning,
|
|
349
|
-
stacklevel=2,
|
|
350
|
-
)
|
|
351
|
-
return maybe_regular_expander_graph(
|
|
352
|
-
n, d, create_using=create_using, max_tries=max_tries, seed=seed
|
|
353
|
-
)
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
@nx.utils.not_implemented_for("directed")
|
|
357
|
-
@nx.utils.not_implemented_for("multigraph")
|
|
358
|
-
@nx._dispatchable(preserve_edge_attrs={"G": {"weight": 1}})
|
|
359
|
-
def is_regular_expander(G, *, epsilon=0):
|
|
360
|
-
r"""Determines whether the graph G is a regular expander. [1]_
|
|
361
|
-
|
|
362
|
-
An expander graph is a sparse graph with strong connectivity properties.
|
|
363
|
-
|
|
364
|
-
More precisely, this helper checks whether the graph is a
|
|
365
|
-
regular $(n, d, \lambda)$-expander with $\lambda$ close to
|
|
366
|
-
the Alon-Boppana bound and given by
|
|
367
|
-
$\lambda = 2 \sqrt{d - 1} + \epsilon$. [2]_
|
|
368
|
-
|
|
369
|
-
In the case where $\epsilon = 0$ then if the graph successfully passes the test
|
|
370
|
-
it is a Ramanujan graph. [3]_
|
|
371
|
-
|
|
372
|
-
A Ramanujan graph has spectral gap almost as large as possible, which makes them
|
|
373
|
-
excellent expanders.
|
|
374
|
-
|
|
375
|
-
Parameters
|
|
376
|
-
----------
|
|
377
|
-
G : NetworkX graph
|
|
378
|
-
epsilon : int, float, default=0
|
|
379
|
-
|
|
380
|
-
Returns
|
|
381
|
-
-------
|
|
382
|
-
bool
|
|
383
|
-
Whether the given graph is a regular $(n, d, \lambda)$-expander
|
|
384
|
-
where $\lambda = 2 \sqrt{d - 1} + \epsilon$.
|
|
385
|
-
|
|
386
|
-
Examples
|
|
387
|
-
--------
|
|
388
|
-
>>> G = nx.random_regular_expander_graph(20, 4)
|
|
389
|
-
>>> nx.is_regular_expander(G)
|
|
390
|
-
True
|
|
391
|
-
|
|
392
|
-
See Also
|
|
393
|
-
--------
|
|
394
|
-
maybe_regular_expander_graph
|
|
395
|
-
random_regular_expander_graph
|
|
396
|
-
|
|
397
|
-
References
|
|
398
|
-
----------
|
|
399
|
-
.. [1] Expander graph, https://en.wikipedia.org/wiki/Expander_graph
|
|
400
|
-
.. [2] Alon-Boppana bound, https://en.wikipedia.org/wiki/Alon%E2%80%93Boppana_bound
|
|
401
|
-
.. [3] Ramanujan graphs, https://en.wikipedia.org/wiki/Ramanujan_graph
|
|
402
|
-
|
|
403
|
-
"""
|
|
404
|
-
|
|
405
|
-
import numpy as np
|
|
406
|
-
import scipy as sp
|
|
407
|
-
|
|
408
|
-
if epsilon < 0:
|
|
409
|
-
raise nx.NetworkXError("epsilon must be non negative")
|
|
410
|
-
|
|
411
|
-
if not nx.is_regular(G):
|
|
412
|
-
return False
|
|
413
|
-
|
|
414
|
-
_, d = nx.utils.arbitrary_element(G.degree)
|
|
415
|
-
|
|
416
|
-
A = nx.adjacency_matrix(G, dtype=float)
|
|
417
|
-
lams = sp.sparse.linalg.eigsh(A, which="LM", k=2, return_eigenvectors=False)
|
|
418
|
-
|
|
419
|
-
# lambda2 is the second biggest eigenvalue
|
|
420
|
-
lambda2 = min(lams)
|
|
421
|
-
|
|
422
|
-
# Use bool() to convert numpy scalar to Python Boolean
|
|
423
|
-
return bool(abs(lambda2) < 2 * np.sqrt(d - 1) + epsilon)
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
@nx.utils.decorators.np_random_state("seed")
|
|
427
|
-
@nx._dispatchable(graphs=None, returns_graph=True)
|
|
428
|
-
def random_regular_expander_graph(
|
|
429
|
-
n, d, *, epsilon=0, create_using=None, max_tries=100, seed=None
|
|
430
|
-
):
|
|
431
|
-
r"""Returns a random regular expander graph on $n$ nodes with degree $d$.
|
|
432
|
-
|
|
433
|
-
An expander graph is a sparse graph with strong connectivity properties. [1]_
|
|
434
|
-
|
|
435
|
-
More precisely the returned graph is a $(n, d, \lambda)$-expander with
|
|
436
|
-
$\lambda = 2 \sqrt{d - 1} + \epsilon$, close to the Alon-Boppana bound. [2]_
|
|
437
|
-
|
|
438
|
-
In the case where $\epsilon = 0$ it returns a Ramanujan graph.
|
|
439
|
-
A Ramanujan graph has spectral gap almost as large as possible,
|
|
440
|
-
which makes them excellent expanders. [3]_
|
|
441
|
-
|
|
442
|
-
Parameters
|
|
443
|
-
----------
|
|
444
|
-
n : int
|
|
445
|
-
The number of nodes.
|
|
446
|
-
d : int
|
|
447
|
-
The degree of each node.
|
|
448
|
-
epsilon : int, float, default=0
|
|
449
|
-
max_tries : int, (default: 100)
|
|
450
|
-
The number of allowed loops,
|
|
451
|
-
also used in the `maybe_regular_expander_graph` utility
|
|
452
|
-
seed : (default: None)
|
|
453
|
-
Seed used to set random number generation state. See :ref`Randomness<randomness>`.
|
|
454
|
-
|
|
455
|
-
Raises
|
|
456
|
-
------
|
|
457
|
-
NetworkXError
|
|
458
|
-
If max_tries is reached
|
|
459
|
-
|
|
460
|
-
Examples
|
|
461
|
-
--------
|
|
462
|
-
>>> G = nx.random_regular_expander_graph(20, 4)
|
|
463
|
-
>>> nx.is_regular_expander(G)
|
|
464
|
-
True
|
|
465
|
-
|
|
466
|
-
Notes
|
|
467
|
-
-----
|
|
468
|
-
This loops over `maybe_regular_expander_graph` and can be slow when
|
|
469
|
-
$n$ is too big or $\epsilon$ too small.
|
|
470
|
-
|
|
471
|
-
See Also
|
|
472
|
-
--------
|
|
473
|
-
maybe_regular_expander_graph
|
|
474
|
-
is_regular_expander
|
|
475
|
-
|
|
476
|
-
References
|
|
477
|
-
----------
|
|
478
|
-
.. [1] Expander graph, https://en.wikipedia.org/wiki/Expander_graph
|
|
479
|
-
.. [2] Alon-Boppana bound, https://en.wikipedia.org/wiki/Alon%E2%80%93Boppana_bound
|
|
480
|
-
.. [3] Ramanujan graphs, https://en.wikipedia.org/wiki/Ramanujan_graph
|
|
481
|
-
|
|
482
|
-
"""
|
|
483
|
-
G = maybe_regular_expander_graph(
|
|
484
|
-
n, d, create_using=create_using, max_tries=max_tries, seed=seed
|
|
485
|
-
)
|
|
486
|
-
iterations = max_tries
|
|
487
|
-
|
|
488
|
-
while not is_regular_expander(G, epsilon=epsilon):
|
|
489
|
-
iterations -= 1
|
|
490
|
-
G = maybe_regular_expander_graph(
|
|
491
|
-
n=n, d=d, create_using=create_using, max_tries=max_tries, seed=seed
|
|
492
|
-
)
|
|
493
|
-
|
|
494
|
-
if iterations == 0:
|
|
495
|
-
raise nx.NetworkXError(
|
|
496
|
-
"Too many iterations in random_regular_expander_graph"
|
|
497
|
-
)
|
|
498
|
-
|
|
499
|
-
return G
|