okstra 0.108.0 → 0.109.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (642) hide show
  1. package/package.json +1 -1
  2. package/runtime/BUILD.json +2 -2
  3. package/runtime/prompts/profiles/_common-contract.md +1 -1
  4. package/runtime/python/okstra_ctl/graphify_cmd.py +225 -0
  5. package/runtime/python/okstra_ctl/resolve_task_key.py +15 -9
  6. package/runtime/python/okstra_project/__init__.py +2 -0
  7. package/runtime/python/okstra_project/state.py +36 -0
  8. package/runtime/python/okstra_vendor/__init__.py +41 -0
  9. package/runtime/python/okstra_vendor/graphify/.vendored-version +1 -0
  10. package/runtime/python/okstra_vendor/graphify/__init__.py +28 -0
  11. package/runtime/python/okstra_vendor/graphify/__main__.py +1371 -0
  12. package/runtime/python/okstra_vendor/graphify/analyze.py +540 -0
  13. package/runtime/python/okstra_vendor/graphify/benchmark.py +129 -0
  14. package/runtime/python/okstra_vendor/graphify/build.py +107 -0
  15. package/runtime/python/okstra_vendor/graphify/cache.py +169 -0
  16. package/runtime/python/okstra_vendor/graphify/cluster.py +137 -0
  17. package/runtime/python/okstra_vendor/graphify/detect.py +510 -0
  18. package/runtime/python/okstra_vendor/graphify/export.py +1014 -0
  19. package/runtime/python/okstra_vendor/graphify/extract.py +3277 -0
  20. package/runtime/python/okstra_vendor/graphify/hooks.py +220 -0
  21. package/runtime/python/okstra_vendor/graphify/ingest.py +297 -0
  22. package/runtime/python/okstra_vendor/graphify/manifest.py +4 -0
  23. package/runtime/python/okstra_vendor/graphify/report.py +175 -0
  24. package/runtime/python/okstra_vendor/graphify/security.py +203 -0
  25. package/runtime/python/okstra_vendor/graphify/serve.py +373 -0
  26. package/runtime/python/okstra_vendor/graphify/skill-aider.md +1184 -0
  27. package/runtime/python/okstra_vendor/graphify/skill-claw.md +1184 -0
  28. package/runtime/python/okstra_vendor/graphify/skill-codex.md +1242 -0
  29. package/runtime/python/okstra_vendor/graphify/skill-copilot.md +1268 -0
  30. package/runtime/python/okstra_vendor/graphify/skill-droid.md +1239 -0
  31. package/runtime/python/okstra_vendor/graphify/skill-kiro.md +1183 -0
  32. package/runtime/python/okstra_vendor/graphify/skill-opencode.md +1238 -0
  33. package/runtime/python/okstra_vendor/graphify/skill-trae.md +1208 -0
  34. package/runtime/python/okstra_vendor/graphify/skill-vscode.md +253 -0
  35. package/runtime/python/okstra_vendor/graphify/skill-windows.md +1245 -0
  36. package/runtime/python/okstra_vendor/graphify/skill.md +1319 -0
  37. package/runtime/python/okstra_vendor/graphify/transcribe.py +182 -0
  38. package/runtime/python/okstra_vendor/graphify/validate.py +72 -0
  39. package/runtime/python/okstra_vendor/graphify/watch.py +188 -0
  40. package/runtime/python/okstra_vendor/graphify/wiki.py +214 -0
  41. package/runtime/python/okstra_vendor/networkx/__init__.py +62 -0
  42. package/runtime/python/okstra_vendor/networkx/algorithms/__init__.py +134 -0
  43. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/__init__.py +26 -0
  44. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clique.py +259 -0
  45. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/clustering_coefficient.py +71 -0
  46. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/connectivity.py +412 -0
  47. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/density.py +396 -0
  48. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/distance_measures.py +150 -0
  49. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/dominating_set.py +149 -0
  50. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/kcomponents.py +369 -0
  51. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/matching.py +44 -0
  52. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/maxcut.py +143 -0
  53. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/ramsey.py +53 -0
  54. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/steinertree.py +265 -0
  55. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/__init__.py +0 -0
  56. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_approx_clust_coeff.py +41 -0
  57. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_clique.py +112 -0
  58. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_connectivity.py +199 -0
  59. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_density.py +146 -0
  60. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_distance_measures.py +59 -0
  61. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_dominating_set.py +78 -0
  62. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_kcomponents.py +303 -0
  63. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_matching.py +8 -0
  64. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_maxcut.py +94 -0
  65. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_ramsey.py +31 -0
  66. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_steinertree.py +306 -0
  67. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_traveling_salesman.py +1014 -0
  68. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_treewidth.py +274 -0
  69. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/tests/test_vertex_cover.py +68 -0
  70. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/traveling_salesman.py +1508 -0
  71. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/treewidth.py +255 -0
  72. package/runtime/python/okstra_vendor/networkx/algorithms/approximation/vertex_cover.py +83 -0
  73. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/__init__.py +5 -0
  74. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/connectivity.py +122 -0
  75. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/correlation.py +302 -0
  76. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/mixing.py +255 -0
  77. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/neighbor_degree.py +160 -0
  78. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/pairs.py +127 -0
  79. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/__init__.py +0 -0
  80. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/base_test.py +81 -0
  81. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_connectivity.py +143 -0
  82. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_correlation.py +122 -0
  83. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_mixing.py +174 -0
  84. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_neighbor_degree.py +107 -0
  85. package/runtime/python/okstra_vendor/networkx/algorithms/assortativity/tests/test_pairs.py +87 -0
  86. package/runtime/python/okstra_vendor/networkx/algorithms/asteroidal.py +164 -0
  87. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/__init__.py +88 -0
  88. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/basic.py +322 -0
  89. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/centrality.py +290 -0
  90. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/cluster.py +289 -0
  91. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/covering.py +57 -0
  92. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/edgelist.py +360 -0
  93. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/extendability.py +105 -0
  94. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/generators.py +603 -0
  95. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/link_analysis.py +316 -0
  96. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matching.py +590 -0
  97. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/matrix.py +232 -0
  98. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/projection.py +526 -0
  99. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/redundancy.py +112 -0
  100. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/spectral.py +69 -0
  101. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/__init__.py +0 -0
  102. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_basic.py +125 -0
  103. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_centrality.py +192 -0
  104. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_cluster.py +84 -0
  105. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_covering.py +33 -0
  106. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_edgelist.py +240 -0
  107. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_extendability.py +334 -0
  108. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_generators.py +407 -0
  109. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_link_analysis.py +218 -0
  110. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matching.py +327 -0
  111. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_matrix.py +138 -0
  112. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_project.py +409 -0
  113. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_redundancy.py +35 -0
  114. package/runtime/python/okstra_vendor/networkx/algorithms/bipartite/tests/test_spectral_bipartivity.py +80 -0
  115. package/runtime/python/okstra_vendor/networkx/algorithms/boundary.py +168 -0
  116. package/runtime/python/okstra_vendor/networkx/algorithms/bridges.py +205 -0
  117. package/runtime/python/okstra_vendor/networkx/algorithms/broadcasting.py +164 -0
  118. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/__init__.py +20 -0
  119. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness.py +591 -0
  120. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/betweenness_subset.py +236 -0
  121. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/closeness.py +282 -0
  122. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness.py +364 -0
  123. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_betweenness_subset.py +227 -0
  124. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/current_flow_closeness.py +96 -0
  125. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/degree_alg.py +150 -0
  126. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/dispersion.py +107 -0
  127. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/eigenvector.py +357 -0
  128. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/flow_matrix.py +130 -0
  129. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/group.py +787 -0
  130. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/harmonic.py +88 -0
  131. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/katz.py +331 -0
  132. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/laplacian.py +150 -0
  133. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/load.py +200 -0
  134. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/percolation.py +128 -0
  135. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/reaching.py +209 -0
  136. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/second_order.py +141 -0
  137. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/subgraph_alg.py +361 -0
  138. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/__init__.py +0 -0
  139. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality.py +923 -0
  140. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_betweenness_centrality_subset.py +354 -0
  141. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_closeness_centrality.py +274 -0
  142. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality.py +259 -0
  143. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_betweenness_centrality_subset.py +147 -0
  144. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_current_flow_closeness.py +43 -0
  145. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_degree_centrality.py +144 -0
  146. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_dispersion.py +73 -0
  147. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_eigenvector_centrality.py +186 -0
  148. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_group.py +277 -0
  149. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_harmonic_centrality.py +122 -0
  150. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_katz_centrality.py +345 -0
  151. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_laplacian_centrality.py +220 -0
  152. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_load_centrality.py +344 -0
  153. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_percolation_centrality.py +87 -0
  154. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_reaching.py +140 -0
  155. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_second_order_centrality.py +82 -0
  156. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_subgraph.py +110 -0
  157. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_trophic.py +302 -0
  158. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/tests/test_voterank.py +64 -0
  159. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/trophic.py +181 -0
  160. package/runtime/python/okstra_vendor/networkx/algorithms/centrality/voterank_alg.py +95 -0
  161. package/runtime/python/okstra_vendor/networkx/algorithms/chains.py +172 -0
  162. package/runtime/python/okstra_vendor/networkx/algorithms/chordal.py +443 -0
  163. package/runtime/python/okstra_vendor/networkx/algorithms/clique.py +818 -0
  164. package/runtime/python/okstra_vendor/networkx/algorithms/cluster.py +732 -0
  165. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/__init__.py +4 -0
  166. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/equitable_coloring.py +505 -0
  167. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/greedy_coloring.py +565 -0
  168. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/__init__.py +0 -0
  169. package/runtime/python/okstra_vendor/networkx/algorithms/coloring/tests/test_coloring.py +863 -0
  170. package/runtime/python/okstra_vendor/networkx/algorithms/communicability_alg.py +163 -0
  171. package/runtime/python/okstra_vendor/networkx/algorithms/community/__init__.py +28 -0
  172. package/runtime/python/okstra_vendor/networkx/algorithms/community/asyn_fluid.py +153 -0
  173. package/runtime/python/okstra_vendor/networkx/algorithms/community/bipartitions.py +354 -0
  174. package/runtime/python/okstra_vendor/networkx/algorithms/community/centrality.py +171 -0
  175. package/runtime/python/okstra_vendor/networkx/algorithms/community/community_utils.py +30 -0
  176. package/runtime/python/okstra_vendor/networkx/algorithms/community/divisive.py +216 -0
  177. package/runtime/python/okstra_vendor/networkx/algorithms/community/kclique.py +79 -0
  178. package/runtime/python/okstra_vendor/networkx/algorithms/community/label_propagation.py +338 -0
  179. package/runtime/python/okstra_vendor/networkx/algorithms/community/leiden.py +162 -0
  180. package/runtime/python/okstra_vendor/networkx/algorithms/community/local.py +220 -0
  181. package/runtime/python/okstra_vendor/networkx/algorithms/community/louvain.py +384 -0
  182. package/runtime/python/okstra_vendor/networkx/algorithms/community/lukes.py +227 -0
  183. package/runtime/python/okstra_vendor/networkx/algorithms/community/modularity_max.py +452 -0
  184. package/runtime/python/okstra_vendor/networkx/algorithms/community/quality.py +347 -0
  185. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/__init__.py +0 -0
  186. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_asyn_fluid.py +147 -0
  187. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_bipartitions.py +157 -0
  188. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_centrality.py +85 -0
  189. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_divisive.py +106 -0
  190. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_kclique.py +91 -0
  191. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_label_propagation.py +241 -0
  192. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_leiden.py +138 -0
  193. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_local.py +76 -0
  194. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_louvain.py +264 -0
  195. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_lukes.py +152 -0
  196. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_modularity_max.py +340 -0
  197. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_quality.py +139 -0
  198. package/runtime/python/okstra_vendor/networkx/algorithms/community/tests/test_utils.py +26 -0
  199. package/runtime/python/okstra_vendor/networkx/algorithms/components/__init__.py +6 -0
  200. package/runtime/python/okstra_vendor/networkx/algorithms/components/attracting.py +115 -0
  201. package/runtime/python/okstra_vendor/networkx/algorithms/components/biconnected.py +394 -0
  202. package/runtime/python/okstra_vendor/networkx/algorithms/components/connected.py +282 -0
  203. package/runtime/python/okstra_vendor/networkx/algorithms/components/semiconnected.py +71 -0
  204. package/runtime/python/okstra_vendor/networkx/algorithms/components/strongly_connected.py +359 -0
  205. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/__init__.py +0 -0
  206. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_attracting.py +70 -0
  207. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_biconnected.py +248 -0
  208. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_connected.py +138 -0
  209. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_semiconnected.py +55 -0
  210. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_strongly_connected.py +193 -0
  211. package/runtime/python/okstra_vendor/networkx/algorithms/components/tests/test_weakly_connected.py +96 -0
  212. package/runtime/python/okstra_vendor/networkx/algorithms/components/weakly_connected.py +196 -0
  213. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/__init__.py +11 -0
  214. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/connectivity.py +811 -0
  215. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/cuts.py +616 -0
  216. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/disjoint_paths.py +408 -0
  217. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_augmentation.py +1270 -0
  218. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/edge_kcomponents.py +592 -0
  219. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcomponents.py +220 -0
  220. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/kcutsets.py +235 -0
  221. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/stoerwagner.py +152 -0
  222. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/__init__.py +0 -0
  223. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_connectivity.py +421 -0
  224. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_cuts.py +309 -0
  225. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_disjoint_paths.py +249 -0
  226. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_augmentation.py +502 -0
  227. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_edge_kcomponents.py +488 -0
  228. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcomponents.py +323 -0
  229. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_kcutsets.py +280 -0
  230. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/tests/test_stoer_wagner.py +102 -0
  231. package/runtime/python/okstra_vendor/networkx/algorithms/connectivity/utils.py +88 -0
  232. package/runtime/python/okstra_vendor/networkx/algorithms/core.py +588 -0
  233. package/runtime/python/okstra_vendor/networkx/algorithms/covering.py +142 -0
  234. package/runtime/python/okstra_vendor/networkx/algorithms/cuts.py +416 -0
  235. package/runtime/python/okstra_vendor/networkx/algorithms/cycles.py +1234 -0
  236. package/runtime/python/okstra_vendor/networkx/algorithms/d_separation.py +677 -0
  237. package/runtime/python/okstra_vendor/networkx/algorithms/dag.py +1392 -0
  238. package/runtime/python/okstra_vendor/networkx/algorithms/distance_measures.py +1095 -0
  239. package/runtime/python/okstra_vendor/networkx/algorithms/distance_regular.py +272 -0
  240. package/runtime/python/okstra_vendor/networkx/algorithms/dominance.py +142 -0
  241. package/runtime/python/okstra_vendor/networkx/algorithms/dominating.py +268 -0
  242. package/runtime/python/okstra_vendor/networkx/algorithms/efficiency_measures.py +167 -0
  243. package/runtime/python/okstra_vendor/networkx/algorithms/euler.py +470 -0
  244. package/runtime/python/okstra_vendor/networkx/algorithms/flow/__init__.py +11 -0
  245. package/runtime/python/okstra_vendor/networkx/algorithms/flow/boykovkolmogorov.py +370 -0
  246. package/runtime/python/okstra_vendor/networkx/algorithms/flow/capacityscaling.py +407 -0
  247. package/runtime/python/okstra_vendor/networkx/algorithms/flow/dinitz_alg.py +238 -0
  248. package/runtime/python/okstra_vendor/networkx/algorithms/flow/edmondskarp.py +241 -0
  249. package/runtime/python/okstra_vendor/networkx/algorithms/flow/gomory_hu.py +178 -0
  250. package/runtime/python/okstra_vendor/networkx/algorithms/flow/maxflow.py +611 -0
  251. package/runtime/python/okstra_vendor/networkx/algorithms/flow/mincost.py +356 -0
  252. package/runtime/python/okstra_vendor/networkx/algorithms/flow/networksimplex.py +662 -0
  253. package/runtime/python/okstra_vendor/networkx/algorithms/flow/preflowpush.py +425 -0
  254. package/runtime/python/okstra_vendor/networkx/algorithms/flow/shortestaugmentingpath.py +300 -0
  255. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/__init__.py +0 -0
  256. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gl1.gpickle.bz2 +0 -0
  257. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/gw1.gpickle.bz2 +0 -0
  258. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/netgen-2.gpickle.bz2 +0 -0
  259. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_gomory_hu.py +128 -0
  260. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow.py +573 -0
  261. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_maxflow_large_graph.py +155 -0
  262. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_mincost.py +475 -0
  263. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/test_networksimplex.py +481 -0
  264. package/runtime/python/okstra_vendor/networkx/algorithms/flow/tests/wlm3.gpickle.bz2 +0 -0
  265. package/runtime/python/okstra_vendor/networkx/algorithms/flow/utils.py +194 -0
  266. package/runtime/python/okstra_vendor/networkx/algorithms/graph_hashing.py +435 -0
  267. package/runtime/python/okstra_vendor/networkx/algorithms/graphical.py +483 -0
  268. package/runtime/python/okstra_vendor/networkx/algorithms/hierarchy.py +57 -0
  269. package/runtime/python/okstra_vendor/networkx/algorithms/hybrid.py +196 -0
  270. package/runtime/python/okstra_vendor/networkx/algorithms/isolate.py +107 -0
  271. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/__init__.py +7 -0
  272. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/ismags.py +1306 -0
  273. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorph.py +336 -0
  274. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/isomorphvf2.py +1262 -0
  275. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/matchhelpers.py +352 -0
  276. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/temporalisomorphvf2.py +308 -0
  277. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/__init__.py +0 -0
  278. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.A99 +0 -0
  279. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/iso_r01_s80.B99 +0 -0
  280. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.A99 +0 -0
  281. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/si2_b06_m200.B99 +0 -0
  282. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_ismags.py +719 -0
  283. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphism.py +103 -0
  284. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_isomorphvf2.py +490 -0
  285. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_match_helpers.py +64 -0
  286. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_temporalisomorphvf2.py +212 -0
  287. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_tree_isomorphism.py +202 -0
  288. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp.py +1655 -0
  289. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2pp_helpers.py +3118 -0
  290. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tests/test_vf2userfunc.py +196 -0
  291. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/tree_isomorphism.py +264 -0
  292. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2pp.py +1102 -0
  293. package/runtime/python/okstra_vendor/networkx/algorithms/isomorphism/vf2userfunc.py +192 -0
  294. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/__init__.py +2 -0
  295. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/hits_alg.py +337 -0
  296. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/pagerank_alg.py +498 -0
  297. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/__init__.py +0 -0
  298. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_hits.py +77 -0
  299. package/runtime/python/okstra_vendor/networkx/algorithms/link_analysis/tests/test_pagerank.py +213 -0
  300. package/runtime/python/okstra_vendor/networkx/algorithms/link_prediction.py +687 -0
  301. package/runtime/python/okstra_vendor/networkx/algorithms/lowest_common_ancestors.py +280 -0
  302. package/runtime/python/okstra_vendor/networkx/algorithms/matching.py +1148 -0
  303. package/runtime/python/okstra_vendor/networkx/algorithms/minors/__init__.py +27 -0
  304. package/runtime/python/okstra_vendor/networkx/algorithms/minors/contraction.py +738 -0
  305. package/runtime/python/okstra_vendor/networkx/algorithms/minors/tests/test_contraction.py +544 -0
  306. package/runtime/python/okstra_vendor/networkx/algorithms/mis.py +78 -0
  307. package/runtime/python/okstra_vendor/networkx/algorithms/moral.py +59 -0
  308. package/runtime/python/okstra_vendor/networkx/algorithms/node_classification.py +219 -0
  309. package/runtime/python/okstra_vendor/networkx/algorithms/non_randomness.py +155 -0
  310. package/runtime/python/okstra_vendor/networkx/algorithms/operators/__init__.py +4 -0
  311. package/runtime/python/okstra_vendor/networkx/algorithms/operators/all.py +324 -0
  312. package/runtime/python/okstra_vendor/networkx/algorithms/operators/binary.py +468 -0
  313. package/runtime/python/okstra_vendor/networkx/algorithms/operators/product.py +633 -0
  314. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/__init__.py +0 -0
  315. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_all.py +328 -0
  316. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_binary.py +451 -0
  317. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_product.py +491 -0
  318. package/runtime/python/okstra_vendor/networkx/algorithms/operators/tests/test_unary.py +55 -0
  319. package/runtime/python/okstra_vendor/networkx/algorithms/operators/unary.py +77 -0
  320. package/runtime/python/okstra_vendor/networkx/algorithms/perfect_graph.py +73 -0
  321. package/runtime/python/okstra_vendor/networkx/algorithms/planar_drawing.py +464 -0
  322. package/runtime/python/okstra_vendor/networkx/algorithms/planarity.py +1463 -0
  323. package/runtime/python/okstra_vendor/networkx/algorithms/polynomials.py +306 -0
  324. package/runtime/python/okstra_vendor/networkx/algorithms/reciprocity.py +98 -0
  325. package/runtime/python/okstra_vendor/networkx/algorithms/regular.py +167 -0
  326. package/runtime/python/okstra_vendor/networkx/algorithms/richclub.py +138 -0
  327. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/__init__.py +5 -0
  328. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/astar.py +239 -0
  329. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/dense.py +264 -0
  330. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/generic.py +716 -0
  331. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/__init__.py +0 -0
  332. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_astar.py +254 -0
  333. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense.py +212 -0
  334. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_dense_numpy.py +88 -0
  335. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_generic.py +511 -0
  336. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_unweighted.py +149 -0
  337. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/tests/test_weighted.py +983 -0
  338. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/unweighted.py +625 -0
  339. package/runtime/python/okstra_vendor/networkx/algorithms/shortest_paths/weighted.py +2542 -0
  340. package/runtime/python/okstra_vendor/networkx/algorithms/similarity.py +2107 -0
  341. package/runtime/python/okstra_vendor/networkx/algorithms/simple_paths.py +966 -0
  342. package/runtime/python/okstra_vendor/networkx/algorithms/smallworld.py +404 -0
  343. package/runtime/python/okstra_vendor/networkx/algorithms/smetric.py +30 -0
  344. package/runtime/python/okstra_vendor/networkx/algorithms/sparsifiers.py +296 -0
  345. package/runtime/python/okstra_vendor/networkx/algorithms/structuralholes.py +374 -0
  346. package/runtime/python/okstra_vendor/networkx/algorithms/summarization.py +564 -0
  347. package/runtime/python/okstra_vendor/networkx/algorithms/swap.py +406 -0
  348. package/runtime/python/okstra_vendor/networkx/algorithms/tests/__init__.py +0 -0
  349. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_asteroidal.py +23 -0
  350. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_boundary.py +154 -0
  351. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_bridges.py +144 -0
  352. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_broadcasting.py +109 -0
  353. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chains.py +136 -0
  354. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_chordal.py +129 -0
  355. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_clique.py +300 -0
  356. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cluster.py +678 -0
  357. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_communicability.py +80 -0
  358. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_core.py +266 -0
  359. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_covering.py +85 -0
  360. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cuts.py +171 -0
  361. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_cycles.py +984 -0
  362. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_d_separation.py +340 -0
  363. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dag.py +835 -0
  364. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_measures.py +831 -0
  365. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_distance_regular.py +85 -0
  366. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominance.py +299 -0
  367. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_dominating.py +115 -0
  368. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_efficiency.py +58 -0
  369. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_euler.py +314 -0
  370. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graph_hashing.py +872 -0
  371. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_graphical.py +163 -0
  372. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hierarchy.py +46 -0
  373. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_hybrid.py +24 -0
  374. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_isolate.py +26 -0
  375. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_link_prediction.py +615 -0
  376. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_lowest_common_ancestors.py +459 -0
  377. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_matching.py +556 -0
  378. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_max_weight_clique.py +179 -0
  379. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_mis.py +62 -0
  380. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_moral.py +15 -0
  381. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_node_classification.py +140 -0
  382. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_non_randomness.py +60 -0
  383. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_perfect_graph.py +27 -0
  384. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planar_drawing.py +274 -0
  385. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_planarity.py +556 -0
  386. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_polynomials.py +57 -0
  387. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_reciprocity.py +37 -0
  388. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_regular.py +88 -0
  389. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_richclub.py +149 -0
  390. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_similarity.py +1158 -0
  391. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_simple_paths.py +803 -0
  392. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smallworld.py +76 -0
  393. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_smetric.py +8 -0
  394. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_sparsifiers.py +138 -0
  395. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_structuralholes.py +191 -0
  396. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_summarization.py +642 -0
  397. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_swap.py +179 -0
  398. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_threshold.py +270 -0
  399. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_time_dependent.py +431 -0
  400. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_tournament.py +161 -0
  401. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_triads.py +248 -0
  402. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_vitality.py +41 -0
  403. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_voronoi.py +103 -0
  404. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_walks.py +54 -0
  405. package/runtime/python/okstra_vendor/networkx/algorithms/tests/test_wiener.py +157 -0
  406. package/runtime/python/okstra_vendor/networkx/algorithms/threshold.py +981 -0
  407. package/runtime/python/okstra_vendor/networkx/algorithms/time_dependent.py +142 -0
  408. package/runtime/python/okstra_vendor/networkx/algorithms/tournament.py +406 -0
  409. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/__init__.py +5 -0
  410. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/beamsearch.py +90 -0
  411. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/breadth_first_search.py +576 -0
  412. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/depth_first_search.py +529 -0
  413. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgebfs.py +185 -0
  414. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/edgedfs.py +182 -0
  415. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/__init__.py +0 -0
  416. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_beamsearch.py +25 -0
  417. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_bfs.py +203 -0
  418. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_dfs.py +307 -0
  419. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgebfs.py +147 -0
  420. package/runtime/python/okstra_vendor/networkx/algorithms/traversal/tests/test_edgedfs.py +131 -0
  421. package/runtime/python/okstra_vendor/networkx/algorithms/tree/__init__.py +7 -0
  422. package/runtime/python/okstra_vendor/networkx/algorithms/tree/branchings.py +1042 -0
  423. package/runtime/python/okstra_vendor/networkx/algorithms/tree/coding.py +413 -0
  424. package/runtime/python/okstra_vendor/networkx/algorithms/tree/decomposition.py +88 -0
  425. package/runtime/python/okstra_vendor/networkx/algorithms/tree/distance_measures.py +219 -0
  426. package/runtime/python/okstra_vendor/networkx/algorithms/tree/mst.py +1281 -0
  427. package/runtime/python/okstra_vendor/networkx/algorithms/tree/operations.py +106 -0
  428. package/runtime/python/okstra_vendor/networkx/algorithms/tree/recognition.py +273 -0
  429. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/__init__.py +0 -0
  430. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_branchings.py +624 -0
  431. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_coding.py +114 -0
  432. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_decomposition.py +79 -0
  433. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_distance_measures.py +99 -0
  434. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_mst.py +934 -0
  435. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_operations.py +53 -0
  436. package/runtime/python/okstra_vendor/networkx/algorithms/tree/tests/test_recognition.py +174 -0
  437. package/runtime/python/okstra_vendor/networkx/algorithms/triads.py +500 -0
  438. package/runtime/python/okstra_vendor/networkx/algorithms/vitality.py +76 -0
  439. package/runtime/python/okstra_vendor/networkx/algorithms/voronoi.py +86 -0
  440. package/runtime/python/okstra_vendor/networkx/algorithms/walks.py +77 -0
  441. package/runtime/python/okstra_vendor/networkx/algorithms/wiener.py +278 -0
  442. package/runtime/python/okstra_vendor/networkx/classes/__init__.py +13 -0
  443. package/runtime/python/okstra_vendor/networkx/classes/coreviews.py +435 -0
  444. package/runtime/python/okstra_vendor/networkx/classes/digraph.py +1363 -0
  445. package/runtime/python/okstra_vendor/networkx/classes/filters.py +95 -0
  446. package/runtime/python/okstra_vendor/networkx/classes/function.py +1549 -0
  447. package/runtime/python/okstra_vendor/networkx/classes/graph.py +2082 -0
  448. package/runtime/python/okstra_vendor/networkx/classes/graphviews.py +269 -0
  449. package/runtime/python/okstra_vendor/networkx/classes/multidigraph.py +977 -0
  450. package/runtime/python/okstra_vendor/networkx/classes/multigraph.py +1294 -0
  451. package/runtime/python/okstra_vendor/networkx/classes/reportviews.py +1447 -0
  452. package/runtime/python/okstra_vendor/networkx/classes/tests/__init__.py +0 -0
  453. package/runtime/python/okstra_vendor/networkx/classes/tests/dispatch_interface.py +192 -0
  454. package/runtime/python/okstra_vendor/networkx/classes/tests/historical_tests.py +476 -0
  455. package/runtime/python/okstra_vendor/networkx/classes/tests/test_coreviews.py +362 -0
  456. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph.py +331 -0
  457. package/runtime/python/okstra_vendor/networkx/classes/tests/test_digraph_historical.py +110 -0
  458. package/runtime/python/okstra_vendor/networkx/classes/tests/test_filters.py +177 -0
  459. package/runtime/python/okstra_vendor/networkx/classes/tests/test_function.py +1045 -0
  460. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph.py +950 -0
  461. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graph_historical.py +12 -0
  462. package/runtime/python/okstra_vendor/networkx/classes/tests/test_graphviews.py +349 -0
  463. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multidigraph.py +459 -0
  464. package/runtime/python/okstra_vendor/networkx/classes/tests/test_multigraph.py +528 -0
  465. package/runtime/python/okstra_vendor/networkx/classes/tests/test_reportviews.py +1421 -0
  466. package/runtime/python/okstra_vendor/networkx/classes/tests/test_special.py +131 -0
  467. package/runtime/python/okstra_vendor/networkx/classes/tests/test_subgraphviews.py +371 -0
  468. package/runtime/python/okstra_vendor/networkx/conftest.py +261 -0
  469. package/runtime/python/okstra_vendor/networkx/convert.py +502 -0
  470. package/runtime/python/okstra_vendor/networkx/convert_matrix.py +1314 -0
  471. package/runtime/python/okstra_vendor/networkx/drawing/__init__.py +7 -0
  472. package/runtime/python/okstra_vendor/networkx/drawing/layout.py +2036 -0
  473. package/runtime/python/okstra_vendor/networkx/drawing/nx_agraph.py +470 -0
  474. package/runtime/python/okstra_vendor/networkx/drawing/nx_latex.py +570 -0
  475. package/runtime/python/okstra_vendor/networkx/drawing/nx_pydot.py +361 -0
  476. package/runtime/python/okstra_vendor/networkx/drawing/nx_pylab.py +2978 -0
  477. package/runtime/python/okstra_vendor/networkx/drawing/tests/__init__.py +0 -0
  478. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_complex.png +0 -0
  479. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_empty_graph.png +0 -0
  480. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_house_with_colors.png +0 -0
  481. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_labels_and_colors.png +0 -0
  482. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_display_shortest_path.png +0 -0
  483. package/runtime/python/okstra_vendor/networkx/drawing/tests/baseline/test_house_with_colors.png +0 -0
  484. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_agraph.py +237 -0
  485. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_image_comparison_pylab_mpl.py +229 -0
  486. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_latex.py +285 -0
  487. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_layout.py +631 -0
  488. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pydot.py +146 -0
  489. package/runtime/python/okstra_vendor/networkx/drawing/tests/test_pylab.py +1582 -0
  490. package/runtime/python/okstra_vendor/networkx/exception.py +131 -0
  491. package/runtime/python/okstra_vendor/networkx/generators/__init__.py +34 -0
  492. package/runtime/python/okstra_vendor/networkx/generators/atlas.dat.gz +0 -0
  493. package/runtime/python/okstra_vendor/networkx/generators/atlas.py +227 -0
  494. package/runtime/python/okstra_vendor/networkx/generators/classic.py +1091 -0
  495. package/runtime/python/okstra_vendor/networkx/generators/cographs.py +68 -0
  496. package/runtime/python/okstra_vendor/networkx/generators/community.py +1070 -0
  497. package/runtime/python/okstra_vendor/networkx/generators/degree_seq.py +886 -0
  498. package/runtime/python/okstra_vendor/networkx/generators/directed.py +572 -0
  499. package/runtime/python/okstra_vendor/networkx/generators/duplication.py +174 -0
  500. package/runtime/python/okstra_vendor/networkx/generators/ego.py +66 -0
  501. package/runtime/python/okstra_vendor/networkx/generators/expanders.py +499 -0
  502. package/runtime/python/okstra_vendor/networkx/generators/geometric.py +1037 -0
  503. package/runtime/python/okstra_vendor/networkx/generators/harary_graph.py +163 -0
  504. package/runtime/python/okstra_vendor/networkx/generators/internet_as_graphs.py +443 -0
  505. package/runtime/python/okstra_vendor/networkx/generators/intersection.py +125 -0
  506. package/runtime/python/okstra_vendor/networkx/generators/interval_graph.py +70 -0
  507. package/runtime/python/okstra_vendor/networkx/generators/joint_degree_seq.py +664 -0
  508. package/runtime/python/okstra_vendor/networkx/generators/lattice.py +405 -0
  509. package/runtime/python/okstra_vendor/networkx/generators/line.py +501 -0
  510. package/runtime/python/okstra_vendor/networkx/generators/mycielski.py +110 -0
  511. package/runtime/python/okstra_vendor/networkx/generators/nonisomorphic_trees.py +259 -0
  512. package/runtime/python/okstra_vendor/networkx/generators/random_clustered.py +117 -0
  513. package/runtime/python/okstra_vendor/networkx/generators/random_graphs.py +1416 -0
  514. package/runtime/python/okstra_vendor/networkx/generators/small.py +1070 -0
  515. package/runtime/python/okstra_vendor/networkx/generators/social.py +554 -0
  516. package/runtime/python/okstra_vendor/networkx/generators/spectral_graph_forge.py +120 -0
  517. package/runtime/python/okstra_vendor/networkx/generators/stochastic.py +54 -0
  518. package/runtime/python/okstra_vendor/networkx/generators/sudoku.py +131 -0
  519. package/runtime/python/okstra_vendor/networkx/generators/tests/__init__.py +0 -0
  520. package/runtime/python/okstra_vendor/networkx/generators/tests/test_atlas.py +75 -0
  521. package/runtime/python/okstra_vendor/networkx/generators/tests/test_classic.py +642 -0
  522. package/runtime/python/okstra_vendor/networkx/generators/tests/test_cographs.py +20 -0
  523. package/runtime/python/okstra_vendor/networkx/generators/tests/test_community.py +362 -0
  524. package/runtime/python/okstra_vendor/networkx/generators/tests/test_degree_seq.py +224 -0
  525. package/runtime/python/okstra_vendor/networkx/generators/tests/test_directed.py +189 -0
  526. package/runtime/python/okstra_vendor/networkx/generators/tests/test_duplication.py +103 -0
  527. package/runtime/python/okstra_vendor/networkx/generators/tests/test_ego.py +39 -0
  528. package/runtime/python/okstra_vendor/networkx/generators/tests/test_expanders.py +182 -0
  529. package/runtime/python/okstra_vendor/networkx/generators/tests/test_geometric.py +488 -0
  530. package/runtime/python/okstra_vendor/networkx/generators/tests/test_harary_graph.py +133 -0
  531. package/runtime/python/okstra_vendor/networkx/generators/tests/test_internet_as_graphs.py +221 -0
  532. package/runtime/python/okstra_vendor/networkx/generators/tests/test_intersection.py +28 -0
  533. package/runtime/python/okstra_vendor/networkx/generators/tests/test_interval_graph.py +144 -0
  534. package/runtime/python/okstra_vendor/networkx/generators/tests/test_joint_degree_seq.py +125 -0
  535. package/runtime/python/okstra_vendor/networkx/generators/tests/test_lattice.py +264 -0
  536. package/runtime/python/okstra_vendor/networkx/generators/tests/test_line.py +316 -0
  537. package/runtime/python/okstra_vendor/networkx/generators/tests/test_mycielski.py +30 -0
  538. package/runtime/python/okstra_vendor/networkx/generators/tests/test_nonisomorphic_trees.py +82 -0
  539. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_clustered.py +33 -0
  540. package/runtime/python/okstra_vendor/networkx/generators/tests/test_random_graphs.py +495 -0
  541. package/runtime/python/okstra_vendor/networkx/generators/tests/test_small.py +220 -0
  542. package/runtime/python/okstra_vendor/networkx/generators/tests/test_spectral_graph_forge.py +49 -0
  543. package/runtime/python/okstra_vendor/networkx/generators/tests/test_stochastic.py +72 -0
  544. package/runtime/python/okstra_vendor/networkx/generators/tests/test_sudoku.py +92 -0
  545. package/runtime/python/okstra_vendor/networkx/generators/tests/test_time_series.py +64 -0
  546. package/runtime/python/okstra_vendor/networkx/generators/tests/test_trees.py +195 -0
  547. package/runtime/python/okstra_vendor/networkx/generators/tests/test_triads.py +15 -0
  548. package/runtime/python/okstra_vendor/networkx/generators/time_series.py +74 -0
  549. package/runtime/python/okstra_vendor/networkx/generators/trees.py +1070 -0
  550. package/runtime/python/okstra_vendor/networkx/generators/triads.py +94 -0
  551. package/runtime/python/okstra_vendor/networkx/lazy_imports.py +188 -0
  552. package/runtime/python/okstra_vendor/networkx/linalg/__init__.py +13 -0
  553. package/runtime/python/okstra_vendor/networkx/linalg/algebraicconnectivity.py +650 -0
  554. package/runtime/python/okstra_vendor/networkx/linalg/attrmatrix.py +466 -0
  555. package/runtime/python/okstra_vendor/networkx/linalg/bethehessianmatrix.py +77 -0
  556. package/runtime/python/okstra_vendor/networkx/linalg/graphmatrix.py +168 -0
  557. package/runtime/python/okstra_vendor/networkx/linalg/laplacianmatrix.py +512 -0
  558. package/runtime/python/okstra_vendor/networkx/linalg/modularitymatrix.py +166 -0
  559. package/runtime/python/okstra_vendor/networkx/linalg/spectrum.py +186 -0
  560. package/runtime/python/okstra_vendor/networkx/linalg/tests/__init__.py +0 -0
  561. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_algebraic_connectivity.py +400 -0
  562. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_attrmatrix.py +108 -0
  563. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_bethehessian.py +40 -0
  564. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_graphmatrix.py +275 -0
  565. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_laplacian.py +334 -0
  566. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_modularity.py +86 -0
  567. package/runtime/python/okstra_vendor/networkx/linalg/tests/test_spectrum.py +70 -0
  568. package/runtime/python/okstra_vendor/networkx/readwrite/__init__.py +17 -0
  569. package/runtime/python/okstra_vendor/networkx/readwrite/adjlist.py +330 -0
  570. package/runtime/python/okstra_vendor/networkx/readwrite/edgelist.py +489 -0
  571. package/runtime/python/okstra_vendor/networkx/readwrite/gexf.py +1084 -0
  572. package/runtime/python/okstra_vendor/networkx/readwrite/gml.py +879 -0
  573. package/runtime/python/okstra_vendor/networkx/readwrite/graph6.py +427 -0
  574. package/runtime/python/okstra_vendor/networkx/readwrite/graphml.py +1053 -0
  575. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/__init__.py +19 -0
  576. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/adjacency.py +156 -0
  577. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/cytoscape.py +190 -0
  578. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/node_link.py +261 -0
  579. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/__init__.py +0 -0
  580. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_adjacency.py +78 -0
  581. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_cytoscape.py +78 -0
  582. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_node_link.py +109 -0
  583. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tests/test_tree.py +48 -0
  584. package/runtime/python/okstra_vendor/networkx/readwrite/json_graph/tree.py +137 -0
  585. package/runtime/python/okstra_vendor/networkx/readwrite/leda.py +108 -0
  586. package/runtime/python/okstra_vendor/networkx/readwrite/multiline_adjlist.py +393 -0
  587. package/runtime/python/okstra_vendor/networkx/readwrite/p2g.py +113 -0
  588. package/runtime/python/okstra_vendor/networkx/readwrite/pajek.py +286 -0
  589. package/runtime/python/okstra_vendor/networkx/readwrite/sparse6.py +379 -0
  590. package/runtime/python/okstra_vendor/networkx/readwrite/tests/__init__.py +0 -0
  591. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_adjlist.py +354 -0
  592. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_edgelist.py +318 -0
  593. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gexf.py +612 -0
  594. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_gml.py +744 -0
  595. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graph6.py +181 -0
  596. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_graphml.py +1531 -0
  597. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_leda.py +30 -0
  598. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_p2g.py +63 -0
  599. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_pajek.py +128 -0
  600. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_sparse6.py +166 -0
  601. package/runtime/python/okstra_vendor/networkx/readwrite/tests/test_text.py +1742 -0
  602. package/runtime/python/okstra_vendor/networkx/readwrite/text.py +851 -0
  603. package/runtime/python/okstra_vendor/networkx/relabel.py +285 -0
  604. package/runtime/python/okstra_vendor/networkx/tests/__init__.py +0 -0
  605. package/runtime/python/okstra_vendor/networkx/tests/test_all_random_functions.py +248 -0
  606. package/runtime/python/okstra_vendor/networkx/tests/test_convert.py +321 -0
  607. package/runtime/python/okstra_vendor/networkx/tests/test_convert_numpy.py +531 -0
  608. package/runtime/python/okstra_vendor/networkx/tests/test_convert_pandas.py +349 -0
  609. package/runtime/python/okstra_vendor/networkx/tests/test_convert_scipy.py +281 -0
  610. package/runtime/python/okstra_vendor/networkx/tests/test_exceptions.py +40 -0
  611. package/runtime/python/okstra_vendor/networkx/tests/test_import.py +11 -0
  612. package/runtime/python/okstra_vendor/networkx/tests/test_lazy_imports.py +96 -0
  613. package/runtime/python/okstra_vendor/networkx/tests/test_relabel.py +349 -0
  614. package/runtime/python/okstra_vendor/networkx/tests/test_removed_functions_exception_messages.py +8 -0
  615. package/runtime/python/okstra_vendor/networkx/utils/__init__.py +8 -0
  616. package/runtime/python/okstra_vendor/networkx/utils/backends.py +2171 -0
  617. package/runtime/python/okstra_vendor/networkx/utils/configs.py +396 -0
  618. package/runtime/python/okstra_vendor/networkx/utils/decorators.py +1233 -0
  619. package/runtime/python/okstra_vendor/networkx/utils/heaps.py +338 -0
  620. package/runtime/python/okstra_vendor/networkx/utils/mapped_queue.py +297 -0
  621. package/runtime/python/okstra_vendor/networkx/utils/misc.py +703 -0
  622. package/runtime/python/okstra_vendor/networkx/utils/random_sequence.py +198 -0
  623. package/runtime/python/okstra_vendor/networkx/utils/rcm.py +159 -0
  624. package/runtime/python/okstra_vendor/networkx/utils/tests/__init__.py +0 -0
  625. package/runtime/python/okstra_vendor/networkx/utils/tests/test__init.py +11 -0
  626. package/runtime/python/okstra_vendor/networkx/utils/tests/test_backends.py +225 -0
  627. package/runtime/python/okstra_vendor/networkx/utils/tests/test_config.py +263 -0
  628. package/runtime/python/okstra_vendor/networkx/utils/tests/test_decorators.py +510 -0
  629. package/runtime/python/okstra_vendor/networkx/utils/tests/test_heaps.py +131 -0
  630. package/runtime/python/okstra_vendor/networkx/utils/tests/test_mapped_queue.py +268 -0
  631. package/runtime/python/okstra_vendor/networkx/utils/tests/test_misc.py +393 -0
  632. package/runtime/python/okstra_vendor/networkx/utils/tests/test_random_sequence.py +53 -0
  633. package/runtime/python/okstra_vendor/networkx/utils/tests/test_rcm.py +63 -0
  634. package/runtime/python/okstra_vendor/networkx/utils/tests/test_unionfind.py +55 -0
  635. package/runtime/python/okstra_vendor/networkx/utils/union_find.py +106 -0
  636. package/runtime/skills/okstra-graphify/SKILL.md +161 -0
  637. package/runtime/skills/okstra-inspect/SKILL.md +17 -9
  638. package/runtime/templates/reports/settings.template.json +4 -0
  639. package/src/cli-registry.mjs +7 -0
  640. package/src/commands/graphify.mjs +32 -0
  641. package/src/commands/lifecycle/doctor.mjs +9 -0
  642. package/src/lib/skill-catalog.mjs +1 -0
@@ -0,0 +1,677 @@
1
+ """
2
+ Algorithm for testing d-separation in DAGs.
3
+
4
+ *d-separation* is a test for conditional independence in probability
5
+ distributions that can be factorized using DAGs. It is a purely
6
+ graphical test that uses the underlying graph and makes no reference
7
+ to the actual distribution parameters. See [1]_ for a formal
8
+ definition.
9
+
10
+ The implementation is based on the conceptually simple linear time
11
+ algorithm presented in [2]_. Refer to [3]_, [4]_ for a couple of
12
+ alternative algorithms.
13
+
14
+ The functional interface in NetworkX consists of three functions:
15
+
16
+ - `find_minimal_d_separator` returns a minimal d-separator set ``z``.
17
+ That is, removing any node or nodes from it makes it no longer a d-separator.
18
+ - `is_d_separator` checks if a given set is a d-separator.
19
+ - `is_minimal_d_separator` checks if a given set is a minimal d-separator.
20
+
21
+ D-separators
22
+ ------------
23
+
24
+ Here, we provide a brief overview of d-separation and related concepts that
25
+ are relevant for understanding it:
26
+
27
+ The ideas of d-separation and d-connection relate to paths being open or blocked.
28
+
29
+ - A "path" is a sequence of nodes connected in order by edges. Unlike for most
30
+ graph theory analysis, the direction of the edges is ignored. Thus the path
31
+ can be thought of as a traditional path on the undirected version of the graph.
32
+ - A "candidate d-separator" ``z`` is a set of nodes being considered as
33
+ possibly blocking all paths between two prescribed sets ``x`` and ``y`` of nodes.
34
+ We refer to each node in the candidate d-separator as "known".
35
+ - A "collider" node on a path is a node that is a successor of its two neighbor
36
+ nodes on the path. That is, ``c`` is a collider if the edge directions
37
+ along the path look like ``... u -> c <- v ...``.
38
+ - If a collider node or any of its descendants are "known", the collider
39
+ is called an "open collider". Otherwise it is a "blocking collider".
40
+ - Any path can be "blocked" in two ways. If the path contains a "known" node
41
+ that is not a collider, the path is blocked. Also, if the path contains a
42
+ collider that is not a "known" node, the path is blocked.
43
+ - A path is "open" if it is not blocked. That is, it is open if every node is
44
+ either an open collider or not a "known". Said another way, every
45
+ "known" in the path is a collider and every collider is open (has a
46
+ "known" as a inclusive descendant). The concept of "open path" is meant to
47
+ demonstrate a probabilistic conditional dependence between two nodes given
48
+ prescribed knowledge ("known" nodes).
49
+ - Two sets ``x`` and ``y`` of nodes are "d-separated" by a set of nodes ``z``
50
+ if all paths between nodes in ``x`` and nodes in ``y`` are blocked. That is,
51
+ if there are no open paths from any node in ``x`` to any node in ``y``.
52
+ Such a set ``z`` is a "d-separator" of ``x`` and ``y``.
53
+ - A "minimal d-separator" is a d-separator ``z`` for which no node or subset
54
+ of nodes can be removed with it still being a d-separator.
55
+
56
+ The d-separator blocks some paths between ``x`` and ``y`` but opens others.
57
+ Nodes in the d-separator block paths if the nodes are not colliders.
58
+ But if a collider or its descendant nodes are in the d-separation set, the
59
+ colliders are open, allowing a path through that collider.
60
+
61
+ Illustration of D-separation with examples
62
+ ------------------------------------------
63
+
64
+ A pair of two nodes, ``u`` and ``v``, are d-connected if there is a path
65
+ from ``u`` to ``v`` that is not blocked. That means, there is an open
66
+ path from ``u`` to ``v``.
67
+
68
+ For example, if the d-separating set is the empty set, then the following paths are
69
+ open between ``u`` and ``v``:
70
+
71
+ - u <- n -> v
72
+ - u -> w -> ... -> n -> v
73
+
74
+ If on the other hand, ``n`` is in the d-separating set, then ``n`` blocks
75
+ those paths between ``u`` and ``v``.
76
+
77
+ Colliders block a path if they and their descendants are not included
78
+ in the d-separating set. An example of a path that is blocked when the
79
+ d-separating set is empty is:
80
+
81
+ - u -> w -> ... -> n <- v
82
+
83
+ The node ``n`` is a collider in this path and is not in the d-separating set.
84
+ So ``n`` blocks this path. However, if ``n`` or a descendant of ``n`` is
85
+ included in the d-separating set, then the path through the collider
86
+ at ``n`` (... -> n <- ...) is "open".
87
+
88
+ D-separation is concerned with blocking all paths between nodes from ``x`` to ``y``.
89
+ A d-separating set between ``x`` and ``y`` is one where all paths are blocked.
90
+
91
+ D-separation and its applications in probability
92
+ ------------------------------------------------
93
+
94
+ D-separation is commonly used in probabilistic causal-graph models. D-separation
95
+ connects the idea of probabilistic "dependence" with separation in a graph. If
96
+ one assumes the causal Markov condition [5]_, (every node is conditionally
97
+ independent of its non-descendants, given its parents) then d-separation implies
98
+ conditional independence in probability distributions.
99
+ Symmetrically, d-connection implies dependence.
100
+
101
+ The intuition is as follows. The edges on a causal graph indicate which nodes
102
+ influence the outcome of other nodes directly. An edge from u to v
103
+ implies that the outcome of event ``u`` influences the probabilities for
104
+ the outcome of event ``v``. Certainly knowing ``u`` changes predictions for ``v``.
105
+ But also knowing ``v`` changes predictions for ``u``. The outcomes are dependent.
106
+ Furthermore, an edge from ``v`` to ``w`` would mean that ``w`` and ``v`` are dependent
107
+ and thus that ``u`` could indirectly influence ``w``.
108
+
109
+ Without any knowledge about the system (candidate d-separating set is empty)
110
+ a causal graph ``u -> v -> w`` allows all three nodes to be dependent. But
111
+ if we know the outcome of ``v``, the conditional probabilities of outcomes for
112
+ ``u`` and ``w`` are independent of each other. That is, once we know the outcome
113
+ for ``v``, the probabilities for ``w`` do not depend on the outcome for ``u``.
114
+ This is the idea behind ``v`` blocking the path if it is "known" (in the candidate
115
+ d-separating set).
116
+
117
+ The same argument works whether the direction of the edges are both
118
+ left-going and when both arrows head out from the middle. Having a "known"
119
+ node on a path blocks the collider-free path because those relationships
120
+ make the conditional probabilities independent.
121
+
122
+ The direction of the causal edges does impact dependence precisely in the
123
+ case of a collider e.g. ``u -> v <- w``. In that situation, both ``u`` and ``w``
124
+ influence ``v``. But they do not directly influence each other. So without any
125
+ knowledge of any outcomes, ``u`` and ``w`` are independent. That is the idea behind
126
+ colliders blocking the path. But, if ``v`` is known, the conditional probabilities
127
+ of ``u`` and ``w`` can be dependent. This is the heart of Berkson's Paradox [6]_.
128
+ For example, suppose ``u`` and ``w`` are boolean events (they either happen or do not)
129
+ and ``v`` represents the outcome "at least one of ``u`` and ``w`` occur". Then knowing
130
+ ``v`` is true makes the conditional probabilities of ``u`` and ``w`` dependent.
131
+ Essentially, knowing that at least one of them is true raises the probability of
132
+ each. But further knowledge that ``w`` is true (or false) change the conditional
133
+ probability of ``u`` to either the original value or 1. So the conditional
134
+ probability of ``u`` depends on the outcome of ``w`` even though there is no
135
+ causal relationship between them. When a collider is known, dependence can
136
+ occur across paths through that collider. This is the reason open colliders
137
+ do not block paths.
138
+
139
+ Furthermore, even if ``v`` is not "known", if one of its descendants is "known"
140
+ we can use that information to know more about ``v`` which again makes
141
+ ``u`` and ``w`` potentially dependent. Suppose the chance of ``n`` occurring
142
+ is much higher when ``v`` occurs ("at least one of ``u`` and ``w`` occur").
143
+ Then if we know ``n`` occurred, it is more likely that ``v`` occurred and that
144
+ makes the chance of ``u`` and ``w`` dependent. This is the idea behind why
145
+ a collider does no block a path if any descendant of the collider is "known".
146
+
147
+ When two sets of nodes ``x`` and ``y`` are d-separated by a set ``z``,
148
+ it means that given the outcomes of the nodes in ``z``, the probabilities
149
+ of outcomes of the nodes in ``x`` are independent of the outcomes of the
150
+ nodes in ``y`` and vice versa.
151
+
152
+ Examples
153
+ --------
154
+ A Hidden Markov Model with 5 observed states and 5 hidden states
155
+ where the hidden states have causal relationships resulting in
156
+ a path results in the following causal network. We check that
157
+ early states along the path are separated from late state in
158
+ the path by the d-separator of the middle hidden state.
159
+ Thus if we condition on the middle hidden state, the early
160
+ state probabilities are independent of the late state outcomes.
161
+
162
+ >>> G = nx.DiGraph()
163
+ >>> G.add_edges_from(
164
+ ... [
165
+ ... ("H1", "H2"),
166
+ ... ("H2", "H3"),
167
+ ... ("H3", "H4"),
168
+ ... ("H4", "H5"),
169
+ ... ("H1", "O1"),
170
+ ... ("H2", "O2"),
171
+ ... ("H3", "O3"),
172
+ ... ("H4", "O4"),
173
+ ... ("H5", "O5"),
174
+ ... ]
175
+ ... )
176
+ >>> x, y, z = ({"H1", "O1"}, {"H5", "O5"}, {"H3"})
177
+ >>> nx.is_d_separator(G, x, y, z)
178
+ True
179
+ >>> nx.is_minimal_d_separator(G, x, y, z)
180
+ True
181
+ >>> nx.is_minimal_d_separator(G, x, y, z | {"O3"})
182
+ False
183
+ >>> z = nx.find_minimal_d_separator(G, x | y, {"O2", "O3", "O4"})
184
+ >>> z == {"H2", "H4"}
185
+ True
186
+
187
+ If no minimal_d_separator exists, `None` is returned
188
+
189
+ >>> other_z = nx.find_minimal_d_separator(G, x | y, {"H2", "H3"})
190
+ >>> other_z is None
191
+ True
192
+
193
+
194
+ References
195
+ ----------
196
+
197
+ .. [1] Pearl, J. (2009). Causality. Cambridge: Cambridge University Press.
198
+
199
+ .. [2] Darwiche, A. (2009). Modeling and reasoning with Bayesian networks.
200
+ Cambridge: Cambridge University Press.
201
+
202
+ .. [3] Shachter, Ross D. "Bayes-ball: The rational pastime (for
203
+ determining irrelevance and requisite information in belief networks
204
+ and influence diagrams)." In Proceedings of the Fourteenth Conference
205
+ on Uncertainty in Artificial Intelligence (UAI), (pp. 480–487). 1998.
206
+
207
+ .. [4] Koller, D., & Friedman, N. (2009).
208
+ Probabilistic graphical models: principles and techniques. The MIT Press.
209
+
210
+ .. [5] https://en.wikipedia.org/wiki/Causal_Markov_condition
211
+
212
+ .. [6] https://en.wikipedia.org/wiki/Berkson%27s_paradox
213
+
214
+ """
215
+
216
+ from collections import deque
217
+ from itertools import chain
218
+
219
+ import networkx as nx
220
+ from networkx.utils import UnionFind, not_implemented_for
221
+
222
+ __all__ = [
223
+ "is_d_separator",
224
+ "is_minimal_d_separator",
225
+ "find_minimal_d_separator",
226
+ ]
227
+
228
+
229
+ @not_implemented_for("undirected")
230
+ @nx._dispatchable
231
+ def is_d_separator(G, x, y, z):
232
+ """Return whether node sets `x` and `y` are d-separated by `z`.
233
+
234
+ Parameters
235
+ ----------
236
+ G : nx.DiGraph
237
+ A NetworkX DAG.
238
+
239
+ x : node or set of nodes
240
+ First node or set of nodes in `G`.
241
+
242
+ y : node or set of nodes
243
+ Second node or set of nodes in `G`.
244
+
245
+ z : node or set of nodes
246
+ Potential separator (set of conditioning nodes in `G`). Can be empty set.
247
+
248
+ Returns
249
+ -------
250
+ b : bool
251
+ A boolean that is true if `x` is d-separated from `y` given `z` in `G`.
252
+
253
+ Raises
254
+ ------
255
+ NetworkXError
256
+ The *d-separation* test is commonly used on disjoint sets of
257
+ nodes in acyclic directed graphs. Accordingly, the algorithm
258
+ raises a :exc:`NetworkXError` if the node sets are not
259
+ disjoint or if the input graph is not a DAG.
260
+
261
+ NodeNotFound
262
+ If any of the input nodes are not found in the graph,
263
+ a :exc:`NodeNotFound` exception is raised
264
+
265
+ Notes
266
+ -----
267
+ A d-separating set in a DAG is a set of nodes that
268
+ blocks all paths between the two sets. Nodes in `z`
269
+ block a path if they are part of the path and are not a collider,
270
+ or a descendant of a collider. Also colliders that are not in `z`
271
+ block a path. A collider structure along a path
272
+ is ``... -> c <- ...`` where ``c`` is the collider node.
273
+
274
+ https://en.wikipedia.org/wiki/Bayesian_network#d-separation
275
+ """
276
+ try:
277
+ x = {x} if x in G else x
278
+ y = {y} if y in G else y
279
+ z = {z} if z in G else z
280
+
281
+ intersection = x & y or x & z or y & z
282
+ if intersection:
283
+ raise nx.NetworkXError(
284
+ f"The sets are not disjoint, with intersection {intersection}"
285
+ )
286
+
287
+ set_v = x | y | z
288
+ if set_v - G.nodes:
289
+ raise nx.NodeNotFound(f"The node(s) {set_v - G.nodes} are not found in G")
290
+ except TypeError:
291
+ raise nx.NodeNotFound("One of x, y, or z is not a node or a set of nodes in G")
292
+
293
+ if not nx.is_directed_acyclic_graph(G):
294
+ raise nx.NetworkXError("graph should be directed acyclic")
295
+
296
+ # contains -> and <-> edges from starting node T
297
+ forward_deque = deque([])
298
+ forward_visited = set()
299
+
300
+ # contains <- and - edges from starting node T
301
+ backward_deque = deque(x)
302
+ backward_visited = set()
303
+
304
+ ancestors_or_z = set().union(*[nx.ancestors(G, node) for node in x]) | z | x
305
+
306
+ while forward_deque or backward_deque:
307
+ if backward_deque:
308
+ node = backward_deque.popleft()
309
+ backward_visited.add(node)
310
+ if node in y:
311
+ return False
312
+ if node in z:
313
+ continue
314
+
315
+ # add <- edges to backward deque
316
+ backward_deque.extend(G.pred[node].keys() - backward_visited)
317
+ # add -> edges to forward deque
318
+ forward_deque.extend(G.succ[node].keys() - forward_visited)
319
+
320
+ if forward_deque:
321
+ node = forward_deque.popleft()
322
+ forward_visited.add(node)
323
+ if node in y:
324
+ return False
325
+
326
+ # Consider if -> node <- is opened due to ancestor of node in z
327
+ if node in ancestors_or_z:
328
+ # add <- edges to backward deque
329
+ backward_deque.extend(G.pred[node].keys() - backward_visited)
330
+ if node not in z:
331
+ # add -> edges to forward deque
332
+ forward_deque.extend(G.succ[node].keys() - forward_visited)
333
+
334
+ return True
335
+
336
+
337
+ @not_implemented_for("undirected")
338
+ @nx._dispatchable
339
+ def find_minimal_d_separator(G, x, y, *, included=None, restricted=None):
340
+ """Returns a minimal d-separating set between `x` and `y` if possible
341
+
342
+ A d-separating set in a DAG is a set of nodes that blocks all
343
+ paths between the two sets of nodes, `x` and `y`. This function
344
+ constructs a d-separating set that is "minimal", meaning no nodes can
345
+ be removed without it losing the d-separating property for `x` and `y`.
346
+ If no d-separating sets exist for `x` and `y`, this returns `None`.
347
+
348
+ In a DAG there may be more than one minimal d-separator between two
349
+ sets of nodes. Minimal d-separators are not always unique. This function
350
+ returns one minimal d-separator, or `None` if no d-separator exists.
351
+
352
+ Uses the algorithm presented in [1]_. The complexity of the algorithm
353
+ is :math:`O(m)`, where :math:`m` stands for the number of edges in
354
+ the subgraph of G consisting of only the ancestors of `x` and `y`.
355
+ For full details, see [1]_.
356
+
357
+ Parameters
358
+ ----------
359
+ G : graph
360
+ A networkx DAG.
361
+ x : set | node
362
+ A node or set of nodes in the graph.
363
+ y : set | node
364
+ A node or set of nodes in the graph.
365
+ included : set | node | None
366
+ A node or set of nodes which must be included in the found separating set,
367
+ default is None, which means the empty set.
368
+ restricted : set | node | None
369
+ Restricted node or set of nodes to consider. Only these nodes can be in
370
+ the found separating set, default is None meaning all nodes in ``G``.
371
+
372
+ Returns
373
+ -------
374
+ z : set | None
375
+ The minimal d-separating set, if at least one d-separating set exists,
376
+ otherwise None.
377
+
378
+ Raises
379
+ ------
380
+ NetworkXError
381
+ Raises a :exc:`NetworkXError` if the input graph is not a DAG
382
+ or if node sets `x`, `y`, and `included` are not disjoint.
383
+
384
+ NodeNotFound
385
+ If any of the input nodes are not found in the graph,
386
+ a :exc:`NodeNotFound` exception is raised.
387
+
388
+ References
389
+ ----------
390
+ .. [1] van der Zander, Benito, and Maciej Liśkiewicz. "Finding
391
+ minimal d-separators in linear time and applications." In
392
+ Uncertainty in Artificial Intelligence, pp. 637-647. PMLR, 2020.
393
+ """
394
+ if not nx.is_directed_acyclic_graph(G):
395
+ raise nx.NetworkXError("graph should be directed acyclic")
396
+
397
+ try:
398
+ x = {x} if x in G else x
399
+ y = {y} if y in G else y
400
+
401
+ if included is None:
402
+ included = set()
403
+ elif included in G:
404
+ included = {included}
405
+
406
+ if restricted is None:
407
+ restricted = set(G)
408
+ elif restricted in G:
409
+ restricted = {restricted}
410
+
411
+ set_y = x | y | included | restricted
412
+ if set_y - G.nodes:
413
+ raise nx.NodeNotFound(f"The node(s) {set_y - G.nodes} are not found in G")
414
+ except TypeError:
415
+ raise nx.NodeNotFound(
416
+ "One of x, y, included or restricted is not a node or set of nodes in G"
417
+ )
418
+
419
+ if not included <= restricted:
420
+ raise nx.NetworkXError(
421
+ f"Included nodes {included} must be in restricted nodes {restricted}"
422
+ )
423
+
424
+ intersection = x & y or x & included or y & included
425
+ if intersection:
426
+ raise nx.NetworkXError(
427
+ f"The sets x, y, included are not disjoint. Overlap: {intersection}"
428
+ )
429
+
430
+ nodeset = x | y | included
431
+ ancestors_x_y_included = nodeset.union(*[nx.ancestors(G, node) for node in nodeset])
432
+
433
+ z_init = restricted & (ancestors_x_y_included - (x | y))
434
+
435
+ x_closure = _reachable(G, x, ancestors_x_y_included, z_init)
436
+ if x_closure & y:
437
+ return None
438
+
439
+ z_updated = z_init & (x_closure | included)
440
+ y_closure = _reachable(G, y, ancestors_x_y_included, z_updated)
441
+ return z_updated & (y_closure | included)
442
+
443
+
444
+ @not_implemented_for("undirected")
445
+ @nx._dispatchable
446
+ def is_minimal_d_separator(G, x, y, z, *, included=None, restricted=None):
447
+ """Determine if `z` is a minimal d-separator for `x` and `y`.
448
+
449
+ A d-separator, `z`, in a DAG is a set of nodes that blocks
450
+ all paths from nodes in set `x` to nodes in set `y`.
451
+ A minimal d-separator is a d-separator `z` such that removing
452
+ any subset of nodes makes it no longer a d-separator.
453
+
454
+ Note: This function checks whether `z` is a d-separator AND is
455
+ minimal. One can use the function `is_d_separator` to only check if
456
+ `z` is a d-separator. See examples below.
457
+
458
+ Parameters
459
+ ----------
460
+ G : nx.DiGraph
461
+ A NetworkX DAG.
462
+ x : node | set
463
+ A node or set of nodes in the graph.
464
+ y : node | set
465
+ A node or set of nodes in the graph.
466
+ z : node | set
467
+ The node or set of nodes to check if it is a minimal d-separating set.
468
+ The function :func:`is_d_separator` is called inside this function
469
+ to verify that `z` is in fact a d-separator.
470
+ included : set | node | None
471
+ A node or set of nodes which must be included in the found separating set,
472
+ default is ``None``, which means the empty set.
473
+ restricted : set | node | None
474
+ Restricted node or set of nodes to consider. Only these nodes can be in
475
+ the found separating set, default is ``None`` meaning all nodes in ``G``.
476
+
477
+ Returns
478
+ -------
479
+ bool
480
+ Whether or not the set `z` is a minimal d-separator subject to
481
+ `restricted` nodes and `included` node constraints.
482
+
483
+ Examples
484
+ --------
485
+ >>> G = nx.path_graph([0, 1, 2, 3], create_using=nx.DiGraph)
486
+ >>> G.add_node(4)
487
+ >>> nx.is_minimal_d_separator(G, 0, 2, {1})
488
+ True
489
+ >>> # since {1} is the minimal d-separator, {1, 3, 4} is not minimal
490
+ >>> nx.is_minimal_d_separator(G, 0, 2, {1, 3, 4})
491
+ False
492
+ >>> # alternatively, if we only want to check that {1, 3, 4} is a d-separator
493
+ >>> nx.is_d_separator(G, 0, 2, {1, 3, 4})
494
+ True
495
+
496
+ Raises
497
+ ------
498
+ NetworkXError
499
+ Raises a :exc:`NetworkXError` if the input graph is not a DAG.
500
+
501
+ NodeNotFound
502
+ If any of the input nodes are not found in the graph,
503
+ a :exc:`NodeNotFound` exception is raised.
504
+
505
+ References
506
+ ----------
507
+ .. [1] van der Zander, Benito, and Maciej Liśkiewicz. "Finding
508
+ minimal d-separators in linear time and applications." In
509
+ Uncertainty in Artificial Intelligence, pp. 637-647. PMLR, 2020.
510
+
511
+ Notes
512
+ -----
513
+ This function works on verifying that a set is minimal and
514
+ d-separating between two nodes. Uses criterion (a), (b), (c) on
515
+ page 4 of [1]_. a) closure(`x`) and `y` are disjoint. b) `z` contains
516
+ all nodes from `included` and is contained in the `restricted`
517
+ nodes and in the union of ancestors of `x`, `y`, and `included`.
518
+ c) the nodes in `z` not in `included` are contained in both
519
+ closure(x) and closure(y). The closure of a set is the set of nodes
520
+ connected to the set by a directed path in G.
521
+
522
+ The complexity is :math:`O(m)`, where :math:`m` stands for the
523
+ number of edges in the subgraph of G consisting of only the
524
+ ancestors of `x` and `y`.
525
+
526
+ For full details, see [1]_.
527
+ """
528
+ if not nx.is_directed_acyclic_graph(G):
529
+ raise nx.NetworkXError("graph should be directed acyclic")
530
+
531
+ try:
532
+ x = {x} if x in G else x
533
+ y = {y} if y in G else y
534
+ z = {z} if z in G else z
535
+
536
+ if included is None:
537
+ included = set()
538
+ elif included in G:
539
+ included = {included}
540
+
541
+ if restricted is None:
542
+ restricted = set(G)
543
+ elif restricted in G:
544
+ restricted = {restricted}
545
+
546
+ set_y = x | y | included | restricted
547
+ if set_y - G.nodes:
548
+ raise nx.NodeNotFound(f"The node(s) {set_y - G.nodes} are not found in G")
549
+ except TypeError:
550
+ raise nx.NodeNotFound(
551
+ "One of x, y, z, included or restricted is not a node or set of nodes in G"
552
+ )
553
+
554
+ if not included <= z:
555
+ raise nx.NetworkXError(
556
+ f"Included nodes {included} must be in proposed separating set z {x}"
557
+ )
558
+ if not z <= restricted:
559
+ raise nx.NetworkXError(
560
+ f"Separating set {z} must be contained in restricted set {restricted}"
561
+ )
562
+
563
+ intersection = x.intersection(y) or x.intersection(z) or y.intersection(z)
564
+ if intersection:
565
+ raise nx.NetworkXError(
566
+ f"The sets are not disjoint, with intersection {intersection}"
567
+ )
568
+
569
+ nodeset = x | y | included
570
+ ancestors_x_y_included = nodeset.union(*[nx.ancestors(G, n) for n in nodeset])
571
+
572
+ # criterion (a) -- check that z is actually a separator
573
+ x_closure = _reachable(G, x, ancestors_x_y_included, z)
574
+ if x_closure & y:
575
+ return False
576
+
577
+ # criterion (b) -- basic constraint; included and restricted already checked above
578
+ if not (z <= ancestors_x_y_included):
579
+ return False
580
+
581
+ # criterion (c) -- check that z is minimal
582
+ y_closure = _reachable(G, y, ancestors_x_y_included, z)
583
+ if not ((z - included) <= (x_closure & y_closure)):
584
+ return False
585
+ return True
586
+
587
+
588
+ @not_implemented_for("undirected")
589
+ def _reachable(G, x, a, z):
590
+ """Modified Bayes-Ball algorithm for finding d-connected nodes.
591
+
592
+ Find all nodes in `a` that are d-connected to those in `x` by
593
+ those in `z`. This is an implementation of the function
594
+ `REACHABLE` in [1]_ (which is itself a modification of the
595
+ Bayes-Ball algorithm [2]_) when restricted to DAGs.
596
+
597
+ Parameters
598
+ ----------
599
+ G : nx.DiGraph
600
+ A NetworkX DAG.
601
+ x : node | set
602
+ A node in the DAG, or a set of nodes.
603
+ a : node | set
604
+ A (set of) node(s) in the DAG containing the ancestors of `x`.
605
+ z : node | set
606
+ The node or set of nodes conditioned on when checking d-connectedness.
607
+
608
+ Returns
609
+ -------
610
+ w : set
611
+ The closure of `x` in `a` with respect to d-connectedness
612
+ given `z`.
613
+
614
+ References
615
+ ----------
616
+ .. [1] van der Zander, Benito, and Maciej Liśkiewicz. "Finding
617
+ minimal d-separators in linear time and applications." In
618
+ Uncertainty in Artificial Intelligence, pp. 637-647. PMLR, 2020.
619
+
620
+ .. [2] Shachter, Ross D. "Bayes-ball: The rational pastime
621
+ (for determining irrelevance and requisite information in
622
+ belief networks and influence diagrams)." In Proceedings of the
623
+ Fourteenth Conference on Uncertainty in Artificial Intelligence
624
+ (UAI), (pp. 480–487). 1998.
625
+ """
626
+
627
+ def _pass(e, v, f, n):
628
+ """Whether a ball entering node `v` along edge `e` passes to `n` along `f`.
629
+
630
+ Boolean function defined on page 6 of [1]_.
631
+
632
+ Parameters
633
+ ----------
634
+ e : bool
635
+ Directed edge by which the ball got to node `v`; `True` iff directed into `v`.
636
+ v : node
637
+ Node where the ball is.
638
+ f : bool
639
+ Directed edge connecting nodes `v` and `n`; `True` iff directed `n`.
640
+ n : node
641
+ Checking whether the ball passes to this node.
642
+
643
+ Returns
644
+ -------
645
+ b : bool
646
+ Whether the ball passes or not.
647
+
648
+ References
649
+ ----------
650
+ .. [1] van der Zander, Benito, and Maciej Liśkiewicz. "Finding
651
+ minimal d-separators in linear time and applications." In
652
+ Uncertainty in Artificial Intelligence, pp. 637-647. PMLR, 2020.
653
+ """
654
+ is_element_of_A = n in a
655
+ # almost_definite_status = True # always true for DAGs; not so for RCGs
656
+ collider_if_in_Z = v not in z or (e and not f)
657
+ return is_element_of_A and collider_if_in_Z # and almost_definite_status
658
+
659
+ queue = deque([])
660
+ for node in x:
661
+ if bool(G.pred[node]):
662
+ queue.append((True, node))
663
+ if bool(G.succ[node]):
664
+ queue.append((False, node))
665
+ processed = queue.copy()
666
+
667
+ while any(queue):
668
+ e, v = queue.popleft()
669
+ preds = ((False, n) for n in G.pred[v])
670
+ succs = ((True, n) for n in G.succ[v])
671
+ f_n_pairs = chain(preds, succs)
672
+ for f, n in f_n_pairs:
673
+ if (f, n) not in processed and _pass(e, v, f, n):
674
+ queue.append((f, n))
675
+ processed.append((f, n))
676
+
677
+ return {w for (_, w) in processed}