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,435 +0,0 @@
|
|
|
1
|
-
"""Views of core data structures such as nested Mappings (e.g. dict-of-dicts).
|
|
2
|
-
These ``Views`` often restrict element access, with either the entire view or
|
|
3
|
-
layers of nested mappings being read-only.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
from collections.abc import Mapping
|
|
7
|
-
|
|
8
|
-
__all__ = [
|
|
9
|
-
"AtlasView",
|
|
10
|
-
"AdjacencyView",
|
|
11
|
-
"MultiAdjacencyView",
|
|
12
|
-
"UnionAtlas",
|
|
13
|
-
"UnionAdjacency",
|
|
14
|
-
"UnionMultiInner",
|
|
15
|
-
"UnionMultiAdjacency",
|
|
16
|
-
"FilterAtlas",
|
|
17
|
-
"FilterAdjacency",
|
|
18
|
-
"FilterMultiInner",
|
|
19
|
-
"FilterMultiAdjacency",
|
|
20
|
-
]
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
class AtlasView(Mapping):
|
|
24
|
-
"""An AtlasView is a Read-only Mapping of Mappings.
|
|
25
|
-
|
|
26
|
-
It is a View into a dict-of-dict data structure.
|
|
27
|
-
The inner level of dict is read-write. But the
|
|
28
|
-
outer level is read-only.
|
|
29
|
-
|
|
30
|
-
See Also
|
|
31
|
-
========
|
|
32
|
-
AdjacencyView: View into dict-of-dict-of-dict
|
|
33
|
-
MultiAdjacencyView: View into dict-of-dict-of-dict-of-dict
|
|
34
|
-
"""
|
|
35
|
-
|
|
36
|
-
__slots__ = ("_atlas",)
|
|
37
|
-
|
|
38
|
-
def __getstate__(self):
|
|
39
|
-
return {"_atlas": self._atlas}
|
|
40
|
-
|
|
41
|
-
def __setstate__(self, state):
|
|
42
|
-
self._atlas = state["_atlas"]
|
|
43
|
-
|
|
44
|
-
def __init__(self, d):
|
|
45
|
-
self._atlas = d
|
|
46
|
-
|
|
47
|
-
def __len__(self):
|
|
48
|
-
return len(self._atlas)
|
|
49
|
-
|
|
50
|
-
def __iter__(self):
|
|
51
|
-
return iter(self._atlas)
|
|
52
|
-
|
|
53
|
-
def __getitem__(self, key):
|
|
54
|
-
return self._atlas[key]
|
|
55
|
-
|
|
56
|
-
def copy(self):
|
|
57
|
-
return {n: self[n].copy() for n in self._atlas}
|
|
58
|
-
|
|
59
|
-
def __str__(self):
|
|
60
|
-
return str(self._atlas) # {nbr: self[nbr] for nbr in self})
|
|
61
|
-
|
|
62
|
-
def __repr__(self):
|
|
63
|
-
return f"{self.__class__.__name__}({self._atlas!r})"
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class AdjacencyView(AtlasView):
|
|
67
|
-
"""An AdjacencyView is a Read-only Map of Maps of Maps.
|
|
68
|
-
|
|
69
|
-
It is a View into a dict-of-dict-of-dict data structure.
|
|
70
|
-
The inner level of dict is read-write. But the
|
|
71
|
-
outer levels are read-only.
|
|
72
|
-
|
|
73
|
-
See Also
|
|
74
|
-
========
|
|
75
|
-
AtlasView: View into dict-of-dict
|
|
76
|
-
MultiAdjacencyView: View into dict-of-dict-of-dict-of-dict
|
|
77
|
-
"""
|
|
78
|
-
|
|
79
|
-
__slots__ = () # Still uses AtlasView slots names _atlas
|
|
80
|
-
|
|
81
|
-
def __getitem__(self, name):
|
|
82
|
-
return AtlasView(self._atlas[name])
|
|
83
|
-
|
|
84
|
-
def copy(self):
|
|
85
|
-
return {n: self[n].copy() for n in self._atlas}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
class MultiAdjacencyView(AdjacencyView):
|
|
89
|
-
"""An MultiAdjacencyView is a Read-only Map of Maps of Maps of Maps.
|
|
90
|
-
|
|
91
|
-
It is a View into a dict-of-dict-of-dict-of-dict data structure.
|
|
92
|
-
The inner level of dict is read-write. But the
|
|
93
|
-
outer levels are read-only.
|
|
94
|
-
|
|
95
|
-
See Also
|
|
96
|
-
========
|
|
97
|
-
AtlasView: View into dict-of-dict
|
|
98
|
-
AdjacencyView: View into dict-of-dict-of-dict
|
|
99
|
-
"""
|
|
100
|
-
|
|
101
|
-
__slots__ = () # Still uses AtlasView slots names _atlas
|
|
102
|
-
|
|
103
|
-
def __getitem__(self, name):
|
|
104
|
-
return AdjacencyView(self._atlas[name])
|
|
105
|
-
|
|
106
|
-
def copy(self):
|
|
107
|
-
return {n: self[n].copy() for n in self._atlas}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
class UnionAtlas(Mapping):
|
|
111
|
-
"""A read-only union of two atlases (dict-of-dict).
|
|
112
|
-
|
|
113
|
-
The two dict-of-dicts represent the inner dict of
|
|
114
|
-
an Adjacency: `G.succ[node]` and `G.pred[node]`.
|
|
115
|
-
The inner level of dict of both hold attribute key:value
|
|
116
|
-
pairs and is read-write. But the outer level is read-only.
|
|
117
|
-
|
|
118
|
-
See Also
|
|
119
|
-
========
|
|
120
|
-
UnionAdjacency: View into dict-of-dict-of-dict
|
|
121
|
-
UnionMultiAdjacency: View into dict-of-dict-of-dict-of-dict
|
|
122
|
-
"""
|
|
123
|
-
|
|
124
|
-
__slots__ = ("_succ", "_pred")
|
|
125
|
-
|
|
126
|
-
def __getstate__(self):
|
|
127
|
-
return {"_succ": self._succ, "_pred": self._pred}
|
|
128
|
-
|
|
129
|
-
def __setstate__(self, state):
|
|
130
|
-
self._succ = state["_succ"]
|
|
131
|
-
self._pred = state["_pred"]
|
|
132
|
-
|
|
133
|
-
def __init__(self, succ, pred):
|
|
134
|
-
self._succ = succ
|
|
135
|
-
self._pred = pred
|
|
136
|
-
|
|
137
|
-
def __len__(self):
|
|
138
|
-
return len(self._succ.keys() | self._pred.keys())
|
|
139
|
-
|
|
140
|
-
def __iter__(self):
|
|
141
|
-
return iter(set(self._succ.keys()) | set(self._pred.keys()))
|
|
142
|
-
|
|
143
|
-
def __getitem__(self, key):
|
|
144
|
-
try:
|
|
145
|
-
return self._succ[key]
|
|
146
|
-
except KeyError:
|
|
147
|
-
return self._pred[key]
|
|
148
|
-
|
|
149
|
-
def copy(self):
|
|
150
|
-
result = {nbr: dd.copy() for nbr, dd in self._succ.items()}
|
|
151
|
-
for nbr, dd in self._pred.items():
|
|
152
|
-
if nbr in result:
|
|
153
|
-
result[nbr].update(dd)
|
|
154
|
-
else:
|
|
155
|
-
result[nbr] = dd.copy()
|
|
156
|
-
return result
|
|
157
|
-
|
|
158
|
-
def __str__(self):
|
|
159
|
-
return str({nbr: self[nbr] for nbr in self})
|
|
160
|
-
|
|
161
|
-
def __repr__(self):
|
|
162
|
-
return f"{self.__class__.__name__}({self._succ!r}, {self._pred!r})"
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
class UnionAdjacency(Mapping):
|
|
166
|
-
"""A read-only union of dict Adjacencies as a Map of Maps of Maps.
|
|
167
|
-
|
|
168
|
-
The two input dict-of-dict-of-dicts represent the union of
|
|
169
|
-
`G.succ` and `G.pred`. Return values are UnionAtlas
|
|
170
|
-
The inner level of dict is read-write. But the
|
|
171
|
-
middle and outer levels are read-only.
|
|
172
|
-
|
|
173
|
-
succ : a dict-of-dict-of-dict {node: nbrdict}
|
|
174
|
-
pred : a dict-of-dict-of-dict {node: nbrdict}
|
|
175
|
-
The keys for the two dicts should be the same
|
|
176
|
-
|
|
177
|
-
See Also
|
|
178
|
-
========
|
|
179
|
-
UnionAtlas: View into dict-of-dict
|
|
180
|
-
UnionMultiAdjacency: View into dict-of-dict-of-dict-of-dict
|
|
181
|
-
"""
|
|
182
|
-
|
|
183
|
-
__slots__ = ("_succ", "_pred")
|
|
184
|
-
|
|
185
|
-
def __getstate__(self):
|
|
186
|
-
return {"_succ": self._succ, "_pred": self._pred}
|
|
187
|
-
|
|
188
|
-
def __setstate__(self, state):
|
|
189
|
-
self._succ = state["_succ"]
|
|
190
|
-
self._pred = state["_pred"]
|
|
191
|
-
|
|
192
|
-
def __init__(self, succ, pred):
|
|
193
|
-
# keys must be the same for two input dicts
|
|
194
|
-
assert len(set(succ.keys()) ^ set(pred.keys())) == 0
|
|
195
|
-
self._succ = succ
|
|
196
|
-
self._pred = pred
|
|
197
|
-
|
|
198
|
-
def __len__(self):
|
|
199
|
-
return len(self._succ) # length of each dict should be the same
|
|
200
|
-
|
|
201
|
-
def __iter__(self):
|
|
202
|
-
return iter(self._succ)
|
|
203
|
-
|
|
204
|
-
def __getitem__(self, nbr):
|
|
205
|
-
return UnionAtlas(self._succ[nbr], self._pred[nbr])
|
|
206
|
-
|
|
207
|
-
def copy(self):
|
|
208
|
-
return {n: self[n].copy() for n in self._succ}
|
|
209
|
-
|
|
210
|
-
def __str__(self):
|
|
211
|
-
return str({nbr: self[nbr] for nbr in self})
|
|
212
|
-
|
|
213
|
-
def __repr__(self):
|
|
214
|
-
return f"{self.__class__.__name__}({self._succ!r}, {self._pred!r})"
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
class UnionMultiInner(UnionAtlas):
|
|
218
|
-
"""A read-only union of two inner dicts of MultiAdjacencies.
|
|
219
|
-
|
|
220
|
-
The two input dict-of-dict-of-dicts represent the union of
|
|
221
|
-
`G.succ[node]` and `G.pred[node]` for MultiDiGraphs.
|
|
222
|
-
Return values are UnionAtlas.
|
|
223
|
-
The inner level of dict is read-write. But the outer levels are read-only.
|
|
224
|
-
|
|
225
|
-
See Also
|
|
226
|
-
========
|
|
227
|
-
UnionAtlas: View into dict-of-dict
|
|
228
|
-
UnionAdjacency: View into dict-of-dict-of-dict
|
|
229
|
-
UnionMultiAdjacency: View into dict-of-dict-of-dict-of-dict
|
|
230
|
-
"""
|
|
231
|
-
|
|
232
|
-
__slots__ = () # Still uses UnionAtlas slots names _succ, _pred
|
|
233
|
-
|
|
234
|
-
def __getitem__(self, node):
|
|
235
|
-
in_succ = node in self._succ
|
|
236
|
-
in_pred = node in self._pred
|
|
237
|
-
if in_succ:
|
|
238
|
-
if in_pred:
|
|
239
|
-
return UnionAtlas(self._succ[node], self._pred[node])
|
|
240
|
-
return UnionAtlas(self._succ[node], {})
|
|
241
|
-
return UnionAtlas({}, self._pred[node])
|
|
242
|
-
|
|
243
|
-
def copy(self):
|
|
244
|
-
nodes = set(self._succ.keys()) | set(self._pred.keys())
|
|
245
|
-
return {n: self[n].copy() for n in nodes}
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
class UnionMultiAdjacency(UnionAdjacency):
|
|
249
|
-
"""A read-only union of two dict MultiAdjacencies.
|
|
250
|
-
|
|
251
|
-
The two input dict-of-dict-of-dict-of-dicts represent the union of
|
|
252
|
-
`G.succ` and `G.pred` for MultiDiGraphs. Return values are UnionAdjacency.
|
|
253
|
-
The inner level of dict is read-write. But the outer levels are read-only.
|
|
254
|
-
|
|
255
|
-
See Also
|
|
256
|
-
========
|
|
257
|
-
UnionAtlas: View into dict-of-dict
|
|
258
|
-
UnionMultiInner: View into dict-of-dict-of-dict
|
|
259
|
-
"""
|
|
260
|
-
|
|
261
|
-
__slots__ = () # Still uses UnionAdjacency slots names _succ, _pred
|
|
262
|
-
|
|
263
|
-
def __getitem__(self, node):
|
|
264
|
-
return UnionMultiInner(self._succ[node], self._pred[node])
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
class FilterAtlas(Mapping): # nodedict, nbrdict, keydict
|
|
268
|
-
"""A read-only Mapping of Mappings with filtering criteria for nodes.
|
|
269
|
-
|
|
270
|
-
It is a view into a dict-of-dict data structure, and it selects only
|
|
271
|
-
nodes that meet the criteria defined by ``NODE_OK``.
|
|
272
|
-
|
|
273
|
-
See Also
|
|
274
|
-
========
|
|
275
|
-
FilterAdjacency
|
|
276
|
-
FilterMultiInner
|
|
277
|
-
FilterMultiAdjacency
|
|
278
|
-
"""
|
|
279
|
-
|
|
280
|
-
def __init__(self, d, NODE_OK):
|
|
281
|
-
self._atlas = d
|
|
282
|
-
self.NODE_OK = NODE_OK
|
|
283
|
-
|
|
284
|
-
def __len__(self):
|
|
285
|
-
# check whether NODE_OK stores the number of nodes as `length`
|
|
286
|
-
# or the nodes themselves as a set `nodes`. If not, count the nodes.
|
|
287
|
-
if hasattr(self.NODE_OK, "length"):
|
|
288
|
-
return self.NODE_OK.length
|
|
289
|
-
if hasattr(self.NODE_OK, "nodes"):
|
|
290
|
-
return len(self.NODE_OK.nodes & self._atlas.keys())
|
|
291
|
-
return sum(1 for n in self._atlas if self.NODE_OK(n))
|
|
292
|
-
|
|
293
|
-
def __iter__(self):
|
|
294
|
-
try: # check that NODE_OK has attr 'nodes'
|
|
295
|
-
node_ok_shorter = 2 * len(self.NODE_OK.nodes) < len(self._atlas)
|
|
296
|
-
except AttributeError:
|
|
297
|
-
node_ok_shorter = False
|
|
298
|
-
if node_ok_shorter:
|
|
299
|
-
return (n for n in self.NODE_OK.nodes if n in self._atlas)
|
|
300
|
-
return (n for n in self._atlas if self.NODE_OK(n))
|
|
301
|
-
|
|
302
|
-
def __getitem__(self, key):
|
|
303
|
-
if key in self._atlas and self.NODE_OK(key):
|
|
304
|
-
return self._atlas[key]
|
|
305
|
-
raise KeyError(f"Key {key} not found")
|
|
306
|
-
|
|
307
|
-
def __str__(self):
|
|
308
|
-
return str({nbr: self[nbr] for nbr in self})
|
|
309
|
-
|
|
310
|
-
def __repr__(self):
|
|
311
|
-
return f"{self.__class__.__name__}({self._atlas!r}, {self.NODE_OK!r})"
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
class FilterAdjacency(Mapping): # edgedict
|
|
315
|
-
"""A read-only Mapping of Mappings with filtering criteria for nodes and edges.
|
|
316
|
-
|
|
317
|
-
It is a view into a dict-of-dict-of-dict data structure, and it selects nodes
|
|
318
|
-
and edges that satisfy specific criteria defined by ``NODE_OK`` and ``EDGE_OK``,
|
|
319
|
-
respectively.
|
|
320
|
-
|
|
321
|
-
See Also
|
|
322
|
-
========
|
|
323
|
-
FilterAtlas
|
|
324
|
-
FilterMultiInner
|
|
325
|
-
FilterMultiAdjacency
|
|
326
|
-
"""
|
|
327
|
-
|
|
328
|
-
def __init__(self, d, NODE_OK, EDGE_OK):
|
|
329
|
-
self._atlas = d
|
|
330
|
-
self.NODE_OK = NODE_OK
|
|
331
|
-
self.EDGE_OK = EDGE_OK
|
|
332
|
-
|
|
333
|
-
def __len__(self):
|
|
334
|
-
# check whether NODE_OK stores the number of nodes as `length`
|
|
335
|
-
# or the nodes themselves as a set `nodes`. If not, count the nodes.
|
|
336
|
-
if hasattr(self.NODE_OK, "length"):
|
|
337
|
-
return self.NODE_OK.length
|
|
338
|
-
if hasattr(self.NODE_OK, "nodes"):
|
|
339
|
-
return len(self.NODE_OK.nodes & self._atlas.keys())
|
|
340
|
-
return sum(1 for n in self._atlas if self.NODE_OK(n))
|
|
341
|
-
|
|
342
|
-
def __iter__(self):
|
|
343
|
-
try: # check that NODE_OK has attr 'nodes'
|
|
344
|
-
node_ok_shorter = 2 * len(self.NODE_OK.nodes) < len(self._atlas)
|
|
345
|
-
except AttributeError:
|
|
346
|
-
node_ok_shorter = False
|
|
347
|
-
if node_ok_shorter:
|
|
348
|
-
return (n for n in self.NODE_OK.nodes if n in self._atlas)
|
|
349
|
-
return (n for n in self._atlas if self.NODE_OK(n))
|
|
350
|
-
|
|
351
|
-
def __getitem__(self, node):
|
|
352
|
-
if node in self._atlas and self.NODE_OK(node):
|
|
353
|
-
|
|
354
|
-
def new_node_ok(nbr):
|
|
355
|
-
return self.NODE_OK(nbr) and self.EDGE_OK(node, nbr)
|
|
356
|
-
|
|
357
|
-
return FilterAtlas(self._atlas[node], new_node_ok)
|
|
358
|
-
raise KeyError(f"Key {node} not found")
|
|
359
|
-
|
|
360
|
-
def __str__(self):
|
|
361
|
-
return str({nbr: self[nbr] for nbr in self})
|
|
362
|
-
|
|
363
|
-
def __repr__(self):
|
|
364
|
-
name = self.__class__.__name__
|
|
365
|
-
return f"{name}({self._atlas!r}, {self.NODE_OK!r}, {self.EDGE_OK!r})"
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
class FilterMultiInner(FilterAdjacency): # muliedge_seconddict
|
|
369
|
-
"""A read-only Mapping of Mappings with filtering criteria for nodes and edges.
|
|
370
|
-
|
|
371
|
-
It is a view into a dict-of-dict-of-dict-of-dict data structure, and it selects nodes
|
|
372
|
-
and edges that meet specific criteria defined by ``NODE_OK`` and ``EDGE_OK``.
|
|
373
|
-
|
|
374
|
-
See Also
|
|
375
|
-
========
|
|
376
|
-
FilterAtlas
|
|
377
|
-
FilterAdjacency
|
|
378
|
-
FilterMultiAdjacency
|
|
379
|
-
"""
|
|
380
|
-
|
|
381
|
-
def __iter__(self):
|
|
382
|
-
try: # check that NODE_OK has attr 'nodes'
|
|
383
|
-
node_ok_shorter = 2 * len(self.NODE_OK.nodes) < len(self._atlas)
|
|
384
|
-
except AttributeError:
|
|
385
|
-
node_ok_shorter = False
|
|
386
|
-
if node_ok_shorter:
|
|
387
|
-
my_nodes = (n for n in self.NODE_OK.nodes if n in self._atlas)
|
|
388
|
-
else:
|
|
389
|
-
my_nodes = (n for n in self._atlas if self.NODE_OK(n))
|
|
390
|
-
for n in my_nodes:
|
|
391
|
-
some_keys_ok = False
|
|
392
|
-
for key in self._atlas[n]:
|
|
393
|
-
if self.EDGE_OK(n, key):
|
|
394
|
-
some_keys_ok = True
|
|
395
|
-
break
|
|
396
|
-
if some_keys_ok is True:
|
|
397
|
-
yield n
|
|
398
|
-
|
|
399
|
-
def __getitem__(self, nbr):
|
|
400
|
-
if (
|
|
401
|
-
nbr in self._atlas
|
|
402
|
-
and self.NODE_OK(nbr)
|
|
403
|
-
and any(self.EDGE_OK(nbr, key) for key in self._atlas[nbr])
|
|
404
|
-
):
|
|
405
|
-
|
|
406
|
-
def new_node_ok(key):
|
|
407
|
-
return self.EDGE_OK(nbr, key)
|
|
408
|
-
|
|
409
|
-
return FilterAtlas(self._atlas[nbr], new_node_ok)
|
|
410
|
-
raise KeyError(f"Key {nbr} not found")
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
class FilterMultiAdjacency(FilterAdjacency): # multiedgedict
|
|
414
|
-
"""A read-only Mapping of Mappings with filtering criteria
|
|
415
|
-
for nodes and edges.
|
|
416
|
-
|
|
417
|
-
It is a view into a dict-of-dict-of-dict-of-dict data structure,
|
|
418
|
-
and it selects nodes and edges that satisfy specific criteria
|
|
419
|
-
defined by ``NODE_OK`` and ``EDGE_OK``, respectively.
|
|
420
|
-
|
|
421
|
-
See Also
|
|
422
|
-
========
|
|
423
|
-
FilterAtlas
|
|
424
|
-
FilterAdjacency
|
|
425
|
-
FilterMultiInner
|
|
426
|
-
"""
|
|
427
|
-
|
|
428
|
-
def __getitem__(self, node):
|
|
429
|
-
if node in self._atlas and self.NODE_OK(node):
|
|
430
|
-
|
|
431
|
-
def edge_ok(nbr, key):
|
|
432
|
-
return self.NODE_OK(nbr) and self.EDGE_OK(node, nbr, key)
|
|
433
|
-
|
|
434
|
-
return FilterMultiInner(self._atlas[node], self.NODE_OK, edge_ok)
|
|
435
|
-
raise KeyError(f"Key {node} not found")
|