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,633 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Graph products.
|
|
3
|
-
"""
|
|
4
|
-
|
|
5
|
-
from itertools import product
|
|
6
|
-
|
|
7
|
-
import networkx as nx
|
|
8
|
-
from networkx.utils import not_implemented_for
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"tensor_product",
|
|
12
|
-
"cartesian_product",
|
|
13
|
-
"lexicographic_product",
|
|
14
|
-
"strong_product",
|
|
15
|
-
"power",
|
|
16
|
-
"rooted_product",
|
|
17
|
-
"corona_product",
|
|
18
|
-
"modular_product",
|
|
19
|
-
]
|
|
20
|
-
_G_H = {"G": 0, "H": 1}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def _dict_product(d1, d2):
|
|
24
|
-
return {k: (d1.get(k), d2.get(k)) for k in set(d1) | set(d2)}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
# Generators for producing graph products
|
|
28
|
-
def _node_product(G, H):
|
|
29
|
-
for u, v in product(G, H):
|
|
30
|
-
yield ((u, v), _dict_product(G.nodes[u], H.nodes[v]))
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
def _directed_edges_cross_edges(G, H):
|
|
34
|
-
if not G.is_multigraph() and not H.is_multigraph():
|
|
35
|
-
for u, v, c in G.edges(data=True):
|
|
36
|
-
for x, y, d in H.edges(data=True):
|
|
37
|
-
yield (u, x), (v, y), _dict_product(c, d)
|
|
38
|
-
if not G.is_multigraph() and H.is_multigraph():
|
|
39
|
-
for u, v, c in G.edges(data=True):
|
|
40
|
-
for x, y, k, d in H.edges(data=True, keys=True):
|
|
41
|
-
yield (u, x), (v, y), k, _dict_product(c, d)
|
|
42
|
-
if G.is_multigraph() and not H.is_multigraph():
|
|
43
|
-
for u, v, k, c in G.edges(data=True, keys=True):
|
|
44
|
-
for x, y, d in H.edges(data=True):
|
|
45
|
-
yield (u, x), (v, y), k, _dict_product(c, d)
|
|
46
|
-
if G.is_multigraph() and H.is_multigraph():
|
|
47
|
-
for u, v, j, c in G.edges(data=True, keys=True):
|
|
48
|
-
for x, y, k, d in H.edges(data=True, keys=True):
|
|
49
|
-
yield (u, x), (v, y), (j, k), _dict_product(c, d)
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
def _undirected_edges_cross_edges(G, H):
|
|
53
|
-
if not G.is_multigraph() and not H.is_multigraph():
|
|
54
|
-
for u, v, c in G.edges(data=True):
|
|
55
|
-
for x, y, d in H.edges(data=True):
|
|
56
|
-
yield (v, x), (u, y), _dict_product(c, d)
|
|
57
|
-
if not G.is_multigraph() and H.is_multigraph():
|
|
58
|
-
for u, v, c in G.edges(data=True):
|
|
59
|
-
for x, y, k, d in H.edges(data=True, keys=True):
|
|
60
|
-
yield (v, x), (u, y), k, _dict_product(c, d)
|
|
61
|
-
if G.is_multigraph() and not H.is_multigraph():
|
|
62
|
-
for u, v, k, c in G.edges(data=True, keys=True):
|
|
63
|
-
for x, y, d in H.edges(data=True):
|
|
64
|
-
yield (v, x), (u, y), k, _dict_product(c, d)
|
|
65
|
-
if G.is_multigraph() and H.is_multigraph():
|
|
66
|
-
for u, v, j, c in G.edges(data=True, keys=True):
|
|
67
|
-
for x, y, k, d in H.edges(data=True, keys=True):
|
|
68
|
-
yield (v, x), (u, y), (j, k), _dict_product(c, d)
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
def _edges_cross_nodes(G, H):
|
|
72
|
-
if G.is_multigraph():
|
|
73
|
-
for u, v, k, d in G.edges(data=True, keys=True):
|
|
74
|
-
for x in H:
|
|
75
|
-
yield (u, x), (v, x), k, d
|
|
76
|
-
else:
|
|
77
|
-
for u, v, d in G.edges(data=True):
|
|
78
|
-
for x in H:
|
|
79
|
-
if H.is_multigraph():
|
|
80
|
-
yield (u, x), (v, x), None, d
|
|
81
|
-
else:
|
|
82
|
-
yield (u, x), (v, x), d
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
def _nodes_cross_edges(G, H):
|
|
86
|
-
if H.is_multigraph():
|
|
87
|
-
for x in G:
|
|
88
|
-
for u, v, k, d in H.edges(data=True, keys=True):
|
|
89
|
-
yield (x, u), (x, v), k, d
|
|
90
|
-
else:
|
|
91
|
-
for x in G:
|
|
92
|
-
for u, v, d in H.edges(data=True):
|
|
93
|
-
if G.is_multigraph():
|
|
94
|
-
yield (x, u), (x, v), None, d
|
|
95
|
-
else:
|
|
96
|
-
yield (x, u), (x, v), d
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
def _edges_cross_nodes_and_nodes(G, H):
|
|
100
|
-
if G.is_multigraph():
|
|
101
|
-
for u, v, k, d in G.edges(data=True, keys=True):
|
|
102
|
-
for x in H:
|
|
103
|
-
for y in H:
|
|
104
|
-
yield (u, x), (v, y), k, d
|
|
105
|
-
else:
|
|
106
|
-
for u, v, d in G.edges(data=True):
|
|
107
|
-
for x in H:
|
|
108
|
-
for y in H:
|
|
109
|
-
if H.is_multigraph():
|
|
110
|
-
yield (u, x), (v, y), None, d
|
|
111
|
-
else:
|
|
112
|
-
yield (u, x), (v, y), d
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
def _init_product_graph(G, H):
|
|
116
|
-
if G.is_directed() != H.is_directed():
|
|
117
|
-
msg = "G and H must be both directed or both undirected"
|
|
118
|
-
raise nx.NetworkXError(msg)
|
|
119
|
-
if G.is_multigraph() or H.is_multigraph():
|
|
120
|
-
GH = nx.MultiGraph()
|
|
121
|
-
else:
|
|
122
|
-
GH = nx.Graph()
|
|
123
|
-
if G.is_directed():
|
|
124
|
-
GH = GH.to_directed()
|
|
125
|
-
return GH
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
@nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
|
|
129
|
-
def tensor_product(G, H):
|
|
130
|
-
r"""Returns the tensor product of G and H.
|
|
131
|
-
|
|
132
|
-
The tensor product $P$ of the graphs $G$ and $H$ has a node set that
|
|
133
|
-
is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
|
|
134
|
-
$P$ has an edge $((u,v), (x,y))$ if and only if $(u,x)$ is an edge in $G$
|
|
135
|
-
and $(v,y)$ is an edge in $H$.
|
|
136
|
-
|
|
137
|
-
Tensor product is sometimes also referred to as the categorical product,
|
|
138
|
-
direct product, cardinal product or conjunction.
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
Parameters
|
|
142
|
-
----------
|
|
143
|
-
G, H: graphs
|
|
144
|
-
Networkx graphs.
|
|
145
|
-
|
|
146
|
-
Returns
|
|
147
|
-
-------
|
|
148
|
-
P: NetworkX graph
|
|
149
|
-
The tensor product of G and H. P will be a multi-graph if either G
|
|
150
|
-
or H is a multi-graph, will be a directed if G and H are directed,
|
|
151
|
-
and undirected if G and H are undirected.
|
|
152
|
-
|
|
153
|
-
Raises
|
|
154
|
-
------
|
|
155
|
-
NetworkXError
|
|
156
|
-
If G and H are not both directed or both undirected.
|
|
157
|
-
|
|
158
|
-
Notes
|
|
159
|
-
-----
|
|
160
|
-
Node attributes in P are two-tuple of the G and H node attributes.
|
|
161
|
-
Missing attributes are assigned None.
|
|
162
|
-
|
|
163
|
-
Examples
|
|
164
|
-
--------
|
|
165
|
-
>>> G = nx.Graph()
|
|
166
|
-
>>> H = nx.Graph()
|
|
167
|
-
>>> G.add_node(0, a1=True)
|
|
168
|
-
>>> H.add_node("a", a2="Spam")
|
|
169
|
-
>>> P = nx.tensor_product(G, H)
|
|
170
|
-
>>> list(P)
|
|
171
|
-
[(0, 'a')]
|
|
172
|
-
|
|
173
|
-
Edge attributes and edge keys (for multigraphs) are also copied to the
|
|
174
|
-
new product graph
|
|
175
|
-
"""
|
|
176
|
-
GH = _init_product_graph(G, H)
|
|
177
|
-
GH.add_nodes_from(_node_product(G, H))
|
|
178
|
-
GH.add_edges_from(_directed_edges_cross_edges(G, H))
|
|
179
|
-
if not GH.is_directed():
|
|
180
|
-
GH.add_edges_from(_undirected_edges_cross_edges(G, H))
|
|
181
|
-
return GH
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
@nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
|
|
185
|
-
def cartesian_product(G, H):
|
|
186
|
-
r"""Returns the Cartesian product of G and H.
|
|
187
|
-
|
|
188
|
-
The Cartesian product $P$ of the graphs $G$ and $H$ has a node set that
|
|
189
|
-
is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
|
|
190
|
-
$P$ has an edge $((u,v),(x,y))$ if and only if either $u$ is equal to $x$
|
|
191
|
-
and both $v$ and $y$ are adjacent in $H$ or if $v$ is equal to $y$ and
|
|
192
|
-
both $u$ and $x$ are adjacent in $G$.
|
|
193
|
-
|
|
194
|
-
Parameters
|
|
195
|
-
----------
|
|
196
|
-
G, H: graphs
|
|
197
|
-
Networkx graphs.
|
|
198
|
-
|
|
199
|
-
Returns
|
|
200
|
-
-------
|
|
201
|
-
P: NetworkX graph
|
|
202
|
-
The Cartesian product of G and H. P will be a multi-graph if either G
|
|
203
|
-
or H is a multi-graph. Will be a directed if G and H are directed,
|
|
204
|
-
and undirected if G and H are undirected.
|
|
205
|
-
|
|
206
|
-
Raises
|
|
207
|
-
------
|
|
208
|
-
NetworkXError
|
|
209
|
-
If G and H are not both directed or both undirected.
|
|
210
|
-
|
|
211
|
-
Notes
|
|
212
|
-
-----
|
|
213
|
-
Node attributes in P are two-tuple of the G and H node attributes.
|
|
214
|
-
Missing attributes are assigned None.
|
|
215
|
-
|
|
216
|
-
Examples
|
|
217
|
-
--------
|
|
218
|
-
>>> G = nx.Graph()
|
|
219
|
-
>>> H = nx.Graph()
|
|
220
|
-
>>> G.add_node(0, a1=True)
|
|
221
|
-
>>> H.add_node("a", a2="Spam")
|
|
222
|
-
>>> P = nx.cartesian_product(G, H)
|
|
223
|
-
>>> list(P)
|
|
224
|
-
[(0, 'a')]
|
|
225
|
-
|
|
226
|
-
Edge attributes and edge keys (for multigraphs) are also copied to the
|
|
227
|
-
new product graph
|
|
228
|
-
"""
|
|
229
|
-
GH = _init_product_graph(G, H)
|
|
230
|
-
GH.add_nodes_from(_node_product(G, H))
|
|
231
|
-
GH.add_edges_from(_edges_cross_nodes(G, H))
|
|
232
|
-
GH.add_edges_from(_nodes_cross_edges(G, H))
|
|
233
|
-
return GH
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
@nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
|
|
237
|
-
def lexicographic_product(G, H):
|
|
238
|
-
r"""Returns the lexicographic product of G and H.
|
|
239
|
-
|
|
240
|
-
The lexicographical product $P$ of the graphs $G$ and $H$ has a node set
|
|
241
|
-
that is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
|
|
242
|
-
$P$ has an edge $((u,v), (x,y))$ if and only if $(u,v)$ is an edge in $G$
|
|
243
|
-
or $u==v$ and $(x,y)$ is an edge in $H$.
|
|
244
|
-
|
|
245
|
-
Parameters
|
|
246
|
-
----------
|
|
247
|
-
G, H: graphs
|
|
248
|
-
Networkx graphs.
|
|
249
|
-
|
|
250
|
-
Returns
|
|
251
|
-
-------
|
|
252
|
-
P: NetworkX graph
|
|
253
|
-
The Cartesian product of G and H. P will be a multi-graph if either G
|
|
254
|
-
or H is a multi-graph. Will be a directed if G and H are directed,
|
|
255
|
-
and undirected if G and H are undirected.
|
|
256
|
-
|
|
257
|
-
Raises
|
|
258
|
-
------
|
|
259
|
-
NetworkXError
|
|
260
|
-
If G and H are not both directed or both undirected.
|
|
261
|
-
|
|
262
|
-
Notes
|
|
263
|
-
-----
|
|
264
|
-
Node attributes in P are two-tuple of the G and H node attributes.
|
|
265
|
-
Missing attributes are assigned None.
|
|
266
|
-
|
|
267
|
-
Examples
|
|
268
|
-
--------
|
|
269
|
-
>>> G = nx.Graph()
|
|
270
|
-
>>> H = nx.Graph()
|
|
271
|
-
>>> G.add_node(0, a1=True)
|
|
272
|
-
>>> H.add_node("a", a2="Spam")
|
|
273
|
-
>>> P = nx.lexicographic_product(G, H)
|
|
274
|
-
>>> list(P)
|
|
275
|
-
[(0, 'a')]
|
|
276
|
-
|
|
277
|
-
Edge attributes and edge keys (for multigraphs) are also copied to the
|
|
278
|
-
new product graph
|
|
279
|
-
"""
|
|
280
|
-
GH = _init_product_graph(G, H)
|
|
281
|
-
GH.add_nodes_from(_node_product(G, H))
|
|
282
|
-
# Edges in G regardless of H designation
|
|
283
|
-
GH.add_edges_from(_edges_cross_nodes_and_nodes(G, H))
|
|
284
|
-
# For each x in G, only if there is an edge in H
|
|
285
|
-
GH.add_edges_from(_nodes_cross_edges(G, H))
|
|
286
|
-
return GH
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
@nx._dispatchable(graphs=_G_H, preserve_node_attrs=True, returns_graph=True)
|
|
290
|
-
def strong_product(G, H):
|
|
291
|
-
r"""Returns the strong product of G and H.
|
|
292
|
-
|
|
293
|
-
The strong product $P$ of the graphs $G$ and $H$ has a node set that
|
|
294
|
-
is the Cartesian product of the node sets, $V(P)=V(G) \times V(H)$.
|
|
295
|
-
$P$ has an edge $((u,x), (v,y))$ if any of the following conditions
|
|
296
|
-
are met:
|
|
297
|
-
|
|
298
|
-
- $u=v$ and $(x,y)$ is an edge in $H$
|
|
299
|
-
- $x=y$ and $(u,v)$ is an edge in $G$
|
|
300
|
-
- $(u,v)$ is an edge in $G$ and $(x,y)$ is an edge in $H$
|
|
301
|
-
|
|
302
|
-
Parameters
|
|
303
|
-
----------
|
|
304
|
-
G, H: graphs
|
|
305
|
-
Networkx graphs.
|
|
306
|
-
|
|
307
|
-
Returns
|
|
308
|
-
-------
|
|
309
|
-
P: NetworkX graph
|
|
310
|
-
The Cartesian product of G and H. P will be a multi-graph if either G
|
|
311
|
-
or H is a multi-graph. Will be a directed if G and H are directed,
|
|
312
|
-
and undirected if G and H are undirected.
|
|
313
|
-
|
|
314
|
-
Raises
|
|
315
|
-
------
|
|
316
|
-
NetworkXError
|
|
317
|
-
If G and H are not both directed or both undirected.
|
|
318
|
-
|
|
319
|
-
Notes
|
|
320
|
-
-----
|
|
321
|
-
Node attributes in P are two-tuple of the G and H node attributes.
|
|
322
|
-
Missing attributes are assigned None.
|
|
323
|
-
|
|
324
|
-
Examples
|
|
325
|
-
--------
|
|
326
|
-
>>> G = nx.Graph()
|
|
327
|
-
>>> H = nx.Graph()
|
|
328
|
-
>>> G.add_node(0, a1=True)
|
|
329
|
-
>>> H.add_node("a", a2="Spam")
|
|
330
|
-
>>> P = nx.strong_product(G, H)
|
|
331
|
-
>>> list(P)
|
|
332
|
-
[(0, 'a')]
|
|
333
|
-
|
|
334
|
-
Edge attributes and edge keys (for multigraphs) are also copied to the
|
|
335
|
-
new product graph
|
|
336
|
-
"""
|
|
337
|
-
GH = _init_product_graph(G, H)
|
|
338
|
-
GH.add_nodes_from(_node_product(G, H))
|
|
339
|
-
GH.add_edges_from(_nodes_cross_edges(G, H))
|
|
340
|
-
GH.add_edges_from(_edges_cross_nodes(G, H))
|
|
341
|
-
GH.add_edges_from(_directed_edges_cross_edges(G, H))
|
|
342
|
-
if not GH.is_directed():
|
|
343
|
-
GH.add_edges_from(_undirected_edges_cross_edges(G, H))
|
|
344
|
-
return GH
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
@not_implemented_for("directed")
|
|
348
|
-
@not_implemented_for("multigraph")
|
|
349
|
-
@nx._dispatchable(returns_graph=True)
|
|
350
|
-
def power(G, k):
|
|
351
|
-
"""Returns the specified power of a graph.
|
|
352
|
-
|
|
353
|
-
The $k$th power of a simple graph $G$, denoted $G^k$, is a
|
|
354
|
-
graph on the same set of nodes in which two distinct nodes $u$ and
|
|
355
|
-
$v$ are adjacent in $G^k$ if and only if the shortest path
|
|
356
|
-
distance between $u$ and $v$ in $G$ is at most $k$.
|
|
357
|
-
|
|
358
|
-
Parameters
|
|
359
|
-
----------
|
|
360
|
-
G : graph
|
|
361
|
-
A NetworkX simple graph object.
|
|
362
|
-
|
|
363
|
-
k : positive integer
|
|
364
|
-
The power to which to raise the graph `G`.
|
|
365
|
-
|
|
366
|
-
Returns
|
|
367
|
-
-------
|
|
368
|
-
NetworkX simple graph
|
|
369
|
-
`G` to the power `k`.
|
|
370
|
-
|
|
371
|
-
Raises
|
|
372
|
-
------
|
|
373
|
-
ValueError
|
|
374
|
-
If the exponent `k` is not positive.
|
|
375
|
-
|
|
376
|
-
NetworkXNotImplemented
|
|
377
|
-
If `G` is not a simple graph.
|
|
378
|
-
|
|
379
|
-
Examples
|
|
380
|
-
--------
|
|
381
|
-
The number of edges will never decrease when taking successive
|
|
382
|
-
powers:
|
|
383
|
-
|
|
384
|
-
>>> G = nx.path_graph(4)
|
|
385
|
-
>>> list(nx.power(G, 2).edges)
|
|
386
|
-
[(0, 1), (0, 2), (1, 2), (1, 3), (2, 3)]
|
|
387
|
-
>>> list(nx.power(G, 3).edges)
|
|
388
|
-
[(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
|
|
389
|
-
|
|
390
|
-
The `k` th power of a cycle graph on *n* nodes is the complete graph
|
|
391
|
-
on *n* nodes, if `k` is at least ``n // 2``:
|
|
392
|
-
|
|
393
|
-
>>> G = nx.cycle_graph(5)
|
|
394
|
-
>>> H = nx.complete_graph(5)
|
|
395
|
-
>>> nx.is_isomorphic(nx.power(G, 2), H)
|
|
396
|
-
True
|
|
397
|
-
>>> G = nx.cycle_graph(8)
|
|
398
|
-
>>> H = nx.complete_graph(8)
|
|
399
|
-
>>> nx.is_isomorphic(nx.power(G, 4), H)
|
|
400
|
-
True
|
|
401
|
-
|
|
402
|
-
References
|
|
403
|
-
----------
|
|
404
|
-
.. [1] J. A. Bondy, U. S. R. Murty, *Graph Theory*. Springer, 2008.
|
|
405
|
-
|
|
406
|
-
Notes
|
|
407
|
-
-----
|
|
408
|
-
This definition of "power graph" comes from Exercise 3.1.6 of
|
|
409
|
-
*Graph Theory* by Bondy and Murty [1]_.
|
|
410
|
-
|
|
411
|
-
"""
|
|
412
|
-
if k <= 0:
|
|
413
|
-
raise ValueError("k must be a positive integer")
|
|
414
|
-
H = nx.Graph()
|
|
415
|
-
H.add_nodes_from(G)
|
|
416
|
-
# update BFS code to ignore self loops.
|
|
417
|
-
for n in G:
|
|
418
|
-
seen = {} # level (number of hops) when seen in BFS
|
|
419
|
-
level = 1 # the current level
|
|
420
|
-
nextlevel = G[n]
|
|
421
|
-
while nextlevel:
|
|
422
|
-
thislevel = nextlevel # advance to next level
|
|
423
|
-
nextlevel = {} # and start a new list (fringe)
|
|
424
|
-
for v in thislevel:
|
|
425
|
-
if v == n: # avoid self loop
|
|
426
|
-
continue
|
|
427
|
-
if v not in seen:
|
|
428
|
-
seen[v] = level # set the level of vertex v
|
|
429
|
-
nextlevel.update(G[v]) # add neighbors of v
|
|
430
|
-
if k <= level:
|
|
431
|
-
break
|
|
432
|
-
level += 1
|
|
433
|
-
H.add_edges_from((n, nbr) for nbr in seen)
|
|
434
|
-
return H
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
@not_implemented_for("multigraph")
|
|
438
|
-
@nx._dispatchable(graphs=_G_H, returns_graph=True)
|
|
439
|
-
def rooted_product(G, H, root):
|
|
440
|
-
"""Return the rooted product of graphs G and H rooted at root in H.
|
|
441
|
-
|
|
442
|
-
A new graph is constructed representing the rooted product of
|
|
443
|
-
the inputted graphs, G and H, with a root in H.
|
|
444
|
-
A rooted product duplicates H for each nodes in G with the root
|
|
445
|
-
of H corresponding to the node in G. Nodes are renamed as the direct
|
|
446
|
-
product of G and H. The result is a subgraph of the cartesian product.
|
|
447
|
-
|
|
448
|
-
Parameters
|
|
449
|
-
----------
|
|
450
|
-
G,H : graph
|
|
451
|
-
A NetworkX graph
|
|
452
|
-
root : node
|
|
453
|
-
A node in H
|
|
454
|
-
|
|
455
|
-
Returns
|
|
456
|
-
-------
|
|
457
|
-
R : The rooted product of G and H with a specified root in H
|
|
458
|
-
|
|
459
|
-
Notes
|
|
460
|
-
-----
|
|
461
|
-
The nodes of R are the Cartesian Product of the nodes of G and H.
|
|
462
|
-
The nodes of G and H are not relabeled.
|
|
463
|
-
"""
|
|
464
|
-
if root not in H:
|
|
465
|
-
raise nx.NodeNotFound("root must be a vertex in H")
|
|
466
|
-
|
|
467
|
-
R = nx.Graph()
|
|
468
|
-
R.add_nodes_from(product(G, H))
|
|
469
|
-
|
|
470
|
-
R.add_edges_from(((e[0], root), (e[1], root)) for e in G.edges())
|
|
471
|
-
R.add_edges_from(((g, e[0]), (g, e[1])) for g in G for e in H.edges())
|
|
472
|
-
|
|
473
|
-
return R
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
@not_implemented_for("directed")
|
|
477
|
-
@not_implemented_for("multigraph")
|
|
478
|
-
@nx._dispatchable(graphs=_G_H, returns_graph=True)
|
|
479
|
-
def corona_product(G, H):
|
|
480
|
-
r"""Returns the Corona product of G and H.
|
|
481
|
-
|
|
482
|
-
The corona product of $G$ and $H$ is the graph $C = G \circ H$ obtained by
|
|
483
|
-
taking one copy of $G$, called the center graph, $|V(G)|$ copies of $H$,
|
|
484
|
-
called the outer graph, and making the $i$-th vertex of $G$ adjacent to
|
|
485
|
-
every vertex of the $i$-th copy of $H$, where $1 ≤ i ≤ |V(G)|$.
|
|
486
|
-
|
|
487
|
-
Parameters
|
|
488
|
-
----------
|
|
489
|
-
G, H: NetworkX graphs
|
|
490
|
-
The graphs to take the carona product of.
|
|
491
|
-
`G` is the center graph and `H` is the outer graph
|
|
492
|
-
|
|
493
|
-
Returns
|
|
494
|
-
-------
|
|
495
|
-
C: NetworkX graph
|
|
496
|
-
The Corona product of G and H.
|
|
497
|
-
|
|
498
|
-
Raises
|
|
499
|
-
------
|
|
500
|
-
NetworkXError
|
|
501
|
-
If G and H are not both directed or both undirected.
|
|
502
|
-
|
|
503
|
-
Examples
|
|
504
|
-
--------
|
|
505
|
-
>>> G = nx.cycle_graph(4)
|
|
506
|
-
>>> H = nx.path_graph(2)
|
|
507
|
-
>>> C = nx.corona_product(G, H)
|
|
508
|
-
>>> list(C)
|
|
509
|
-
[0, 1, 2, 3, (0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
|
|
510
|
-
>>> print(C)
|
|
511
|
-
Graph with 12 nodes and 16 edges
|
|
512
|
-
|
|
513
|
-
References
|
|
514
|
-
----------
|
|
515
|
-
[1] M. Tavakoli, F. Rahbarnia, and A. R. Ashrafi,
|
|
516
|
-
"Studying the corona product of graphs under some graph invariants,"
|
|
517
|
-
Transactions on Combinatorics, vol. 3, no. 3, pp. 43–49, Sep. 2014,
|
|
518
|
-
doi: 10.22108/toc.2014.5542.
|
|
519
|
-
[2] A. Faraji, "Corona Product in Graph Theory," Ali Faraji, May 11, 2021.
|
|
520
|
-
https://blog.alifaraji.ir/math/graph-theory/corona-product.html (accessed Dec. 07, 2021).
|
|
521
|
-
"""
|
|
522
|
-
GH = _init_product_graph(G, H)
|
|
523
|
-
GH.add_nodes_from(G)
|
|
524
|
-
GH.add_edges_from(G.edges)
|
|
525
|
-
|
|
526
|
-
for G_node in G:
|
|
527
|
-
# copy nodes of H in GH, call it H_i
|
|
528
|
-
GH.add_nodes_from((G_node, v) for v in H)
|
|
529
|
-
|
|
530
|
-
# copy edges of H_i based on H
|
|
531
|
-
GH.add_edges_from(
|
|
532
|
-
((G_node, e0), (G_node, e1), d) for e0, e1, d in H.edges.data()
|
|
533
|
-
)
|
|
534
|
-
|
|
535
|
-
# creating new edges between H_i and a G's node
|
|
536
|
-
GH.add_edges_from((G_node, (G_node, H_node)) for H_node in H)
|
|
537
|
-
|
|
538
|
-
return GH
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
@nx._dispatchable(
|
|
542
|
-
graphs=_G_H, preserve_edge_attrs=True, preserve_node_attrs=True, returns_graph=True
|
|
543
|
-
)
|
|
544
|
-
def modular_product(G, H):
|
|
545
|
-
r"""Returns the Modular product of G and H.
|
|
546
|
-
|
|
547
|
-
The modular product of `G` and `H` is the graph $M = G \nabla H$,
|
|
548
|
-
consisting of the node set $V(M) = V(G) \times V(H)$ that is the Cartesian
|
|
549
|
-
product of the node sets of `G` and `H`. Further, M contains an edge ((u, v), (x, y)):
|
|
550
|
-
|
|
551
|
-
- if u is adjacent to x in `G` and v is adjacent to y in `H`, or
|
|
552
|
-
- if u is not adjacent to x in `G` and v is not adjacent to y in `H`.
|
|
553
|
-
|
|
554
|
-
More formally::
|
|
555
|
-
|
|
556
|
-
E(M) = {((u, v), (x, y)) | ((u, x) in E(G) and (v, y) in E(H)) or
|
|
557
|
-
((u, x) not in E(G) and (v, y) not in E(H))}
|
|
558
|
-
|
|
559
|
-
Parameters
|
|
560
|
-
----------
|
|
561
|
-
G, H: NetworkX graphs
|
|
562
|
-
The graphs to take the modular product of.
|
|
563
|
-
|
|
564
|
-
Returns
|
|
565
|
-
-------
|
|
566
|
-
M: NetworkX graph
|
|
567
|
-
The Modular product of `G` and `H`.
|
|
568
|
-
|
|
569
|
-
Raises
|
|
570
|
-
------
|
|
571
|
-
NetworkXNotImplemented
|
|
572
|
-
If `G` is not a simple graph.
|
|
573
|
-
|
|
574
|
-
Examples
|
|
575
|
-
--------
|
|
576
|
-
>>> G = nx.cycle_graph(4)
|
|
577
|
-
>>> H = nx.path_graph(2)
|
|
578
|
-
>>> M = nx.modular_product(G, H)
|
|
579
|
-
>>> list(M)
|
|
580
|
-
[(0, 0), (0, 1), (1, 0), (1, 1), (2, 0), (2, 1), (3, 0), (3, 1)]
|
|
581
|
-
>>> print(M)
|
|
582
|
-
Graph with 8 nodes and 8 edges
|
|
583
|
-
|
|
584
|
-
Notes
|
|
585
|
-
-----
|
|
586
|
-
The *modular product* is defined in [1]_ and was first
|
|
587
|
-
introduced as the *weak modular product*.
|
|
588
|
-
|
|
589
|
-
The modular product reduces the problem of counting isomorphic subgraphs
|
|
590
|
-
in `G` and `H` to the problem of counting cliques in M. The subgraphs of
|
|
591
|
-
`G` and `H` that are induced by the nodes of a clique in M are
|
|
592
|
-
isomorphic [2]_ [3]_.
|
|
593
|
-
|
|
594
|
-
References
|
|
595
|
-
----------
|
|
596
|
-
.. [1] R. Hammack, W. Imrich, and S. Klavžar,
|
|
597
|
-
"Handbook of Product Graphs", CRC Press, 2011.
|
|
598
|
-
|
|
599
|
-
.. [2] H. G. Barrow and R. M. Burstall,
|
|
600
|
-
"Subgraph isomorphism, matching relational structures and maximal
|
|
601
|
-
cliques", Information Processing Letters, vol. 4, issue 4, pp. 83-84,
|
|
602
|
-
1976, https://doi.org/10.1016/0020-0190(76)90049-1.
|
|
603
|
-
|
|
604
|
-
.. [3] V. G. Vizing, "Reduction of the problem of isomorphism and isomorphic
|
|
605
|
-
entrance to the task of finding the nondensity of a graph." Proc. Third
|
|
606
|
-
All-Union Conference on Problems of Theoretical Cybernetics. 1974.
|
|
607
|
-
"""
|
|
608
|
-
if G.is_directed() or H.is_directed():
|
|
609
|
-
raise nx.NetworkXNotImplemented(
|
|
610
|
-
"Modular product not implemented for directed graphs"
|
|
611
|
-
)
|
|
612
|
-
if G.is_multigraph() or H.is_multigraph():
|
|
613
|
-
raise nx.NetworkXNotImplemented(
|
|
614
|
-
"Modular product not implemented for multigraphs"
|
|
615
|
-
)
|
|
616
|
-
|
|
617
|
-
GH = _init_product_graph(G, H)
|
|
618
|
-
GH.add_nodes_from(_node_product(G, H))
|
|
619
|
-
|
|
620
|
-
for u, v, c in G.edges(data=True):
|
|
621
|
-
for x, y, d in H.edges(data=True):
|
|
622
|
-
GH.add_edge((u, x), (v, y), **_dict_product(c, d))
|
|
623
|
-
GH.add_edge((v, x), (u, y), **_dict_product(c, d))
|
|
624
|
-
|
|
625
|
-
G = nx.complement(G)
|
|
626
|
-
H = nx.complement(H)
|
|
627
|
-
|
|
628
|
-
for u, v, c in G.edges(data=True):
|
|
629
|
-
for x, y, d in H.edges(data=True):
|
|
630
|
-
GH.add_edge((u, x), (v, y), **_dict_product(c, d))
|
|
631
|
-
GH.add_edge((v, x), (u, y), **_dict_product(c, d))
|
|
632
|
-
|
|
633
|
-
return GH
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
"""Unary operations on graphs"""
|
|
2
|
-
|
|
3
|
-
import networkx as nx
|
|
4
|
-
|
|
5
|
-
__all__ = ["complement", "reverse"]
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@nx._dispatchable(returns_graph=True)
|
|
9
|
-
def complement(G):
|
|
10
|
-
"""Returns the graph complement of G.
|
|
11
|
-
|
|
12
|
-
Parameters
|
|
13
|
-
----------
|
|
14
|
-
G : graph
|
|
15
|
-
A NetworkX graph
|
|
16
|
-
|
|
17
|
-
Returns
|
|
18
|
-
-------
|
|
19
|
-
GC : A new graph.
|
|
20
|
-
|
|
21
|
-
Notes
|
|
22
|
-
-----
|
|
23
|
-
Note that `complement` does not create self-loops and also
|
|
24
|
-
does not produce parallel edges for MultiGraphs.
|
|
25
|
-
|
|
26
|
-
Graph, node, and edge data are not propagated to the new graph.
|
|
27
|
-
|
|
28
|
-
Examples
|
|
29
|
-
--------
|
|
30
|
-
>>> G = nx.Graph([(1, 2), (1, 3), (2, 3), (3, 4), (3, 5)])
|
|
31
|
-
>>> G_complement = nx.complement(G)
|
|
32
|
-
>>> G_complement.edges() # This shows the edges of the complemented graph
|
|
33
|
-
EdgeView([(1, 4), (1, 5), (2, 4), (2, 5), (4, 5)])
|
|
34
|
-
|
|
35
|
-
"""
|
|
36
|
-
R = G.__class__()
|
|
37
|
-
R.add_nodes_from(G)
|
|
38
|
-
R.add_edges_from(
|
|
39
|
-
((n, n2) for n, nbrs in G.adjacency() for n2 in G if n2 not in nbrs if n != n2)
|
|
40
|
-
)
|
|
41
|
-
return R
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@nx._dispatchable(returns_graph=True)
|
|
45
|
-
def reverse(G, copy=True):
|
|
46
|
-
"""Returns the reverse directed graph of G.
|
|
47
|
-
|
|
48
|
-
Parameters
|
|
49
|
-
----------
|
|
50
|
-
G : directed graph
|
|
51
|
-
A NetworkX directed graph
|
|
52
|
-
copy : bool
|
|
53
|
-
If True, then a new graph is returned. If False, then the graph is
|
|
54
|
-
reversed in place.
|
|
55
|
-
|
|
56
|
-
Returns
|
|
57
|
-
-------
|
|
58
|
-
H : directed graph
|
|
59
|
-
The reversed G.
|
|
60
|
-
|
|
61
|
-
Raises
|
|
62
|
-
------
|
|
63
|
-
NetworkXError
|
|
64
|
-
If graph is undirected.
|
|
65
|
-
|
|
66
|
-
Examples
|
|
67
|
-
--------
|
|
68
|
-
>>> G = nx.DiGraph([(1, 2), (1, 3), (2, 3), (3, 4), (3, 5)])
|
|
69
|
-
>>> G_reversed = nx.reverse(G)
|
|
70
|
-
>>> G_reversed.edges()
|
|
71
|
-
OutEdgeView([(2, 1), (3, 1), (3, 2), (4, 3), (5, 3)])
|
|
72
|
-
|
|
73
|
-
"""
|
|
74
|
-
if not G.is_directed():
|
|
75
|
-
raise nx.NetworkXError("Cannot reverse an undirected graph.")
|
|
76
|
-
else:
|
|
77
|
-
return G.reverse(copy=copy)
|