relationalai 0.13.0.dev0__py3-none-any.whl → 0.13.1__py3-none-any.whl

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 (837) hide show
  1. frontend/debugger/dist/.gitignore +2 -0
  2. frontend/debugger/dist/assets/favicon-Dy0ZgA6N.png +0 -0
  3. frontend/debugger/dist/assets/index-Cssla-O7.js +208 -0
  4. frontend/debugger/dist/assets/index-DlHsYx1V.css +9 -0
  5. frontend/debugger/dist/index.html +17 -0
  6. relationalai/__init__.py +256 -1
  7. relationalai/clients/__init__.py +18 -0
  8. relationalai/clients/client.py +912 -0
  9. relationalai/clients/config.py +673 -0
  10. relationalai/clients/direct_access_client.py +118 -0
  11. relationalai/clients/exec_txn_poller.py +91 -0
  12. relationalai/clients/hash_util.py +31 -0
  13. relationalai/clients/local.py +571 -0
  14. relationalai/clients/profile_polling.py +73 -0
  15. relationalai/clients/resources/__init__.py +8 -0
  16. relationalai/clients/resources/azure/azure.py +477 -0
  17. relationalai/clients/resources/snowflake/__init__.py +20 -0
  18. relationalai/clients/resources/snowflake/cli_resources.py +87 -0
  19. relationalai/clients/resources/snowflake/direct_access_resources.py +694 -0
  20. relationalai/clients/resources/snowflake/engine_state_handlers.py +309 -0
  21. relationalai/clients/resources/snowflake/error_handlers.py +199 -0
  22. relationalai/clients/resources/snowflake/export_procedure.py.jinja +249 -0
  23. relationalai/clients/resources/snowflake/resources_factory.py +99 -0
  24. relationalai/clients/resources/snowflake/snowflake.py +3190 -0
  25. relationalai/clients/resources/snowflake/use_index_poller.py +1019 -0
  26. relationalai/clients/resources/snowflake/use_index_resources.py +188 -0
  27. relationalai/clients/resources/snowflake/util.py +387 -0
  28. relationalai/clients/result_helpers.py +420 -0
  29. relationalai/clients/types.py +113 -0
  30. relationalai/clients/util.py +356 -0
  31. relationalai/debugging.py +389 -0
  32. relationalai/dsl.py +1749 -0
  33. relationalai/early_access/builder/__init__.py +30 -0
  34. relationalai/early_access/builder/builder/__init__.py +35 -0
  35. relationalai/early_access/builder/snowflake/__init__.py +12 -0
  36. relationalai/early_access/builder/std/__init__.py +25 -0
  37. relationalai/early_access/builder/std/decimals/__init__.py +12 -0
  38. relationalai/early_access/builder/std/integers/__init__.py +12 -0
  39. relationalai/early_access/builder/std/math/__init__.py +12 -0
  40. relationalai/early_access/builder/std/strings/__init__.py +14 -0
  41. relationalai/early_access/devtools/__init__.py +12 -0
  42. relationalai/early_access/devtools/benchmark_lqp/__init__.py +12 -0
  43. relationalai/early_access/devtools/extract_lqp/__init__.py +12 -0
  44. relationalai/early_access/dsl/adapters/orm/adapter_qb.py +427 -0
  45. relationalai/early_access/dsl/adapters/orm/parser.py +636 -0
  46. relationalai/early_access/dsl/adapters/owl/adapter.py +176 -0
  47. relationalai/early_access/dsl/adapters/owl/parser.py +160 -0
  48. relationalai/early_access/dsl/bindings/common.py +402 -0
  49. relationalai/early_access/dsl/bindings/csv.py +170 -0
  50. relationalai/early_access/dsl/bindings/legacy/binding_models.py +143 -0
  51. relationalai/early_access/dsl/bindings/snowflake.py +64 -0
  52. relationalai/early_access/dsl/codegen/binder.py +411 -0
  53. relationalai/early_access/dsl/codegen/common.py +79 -0
  54. relationalai/early_access/dsl/codegen/helpers.py +23 -0
  55. relationalai/early_access/dsl/codegen/relations.py +700 -0
  56. relationalai/early_access/dsl/codegen/weaver.py +417 -0
  57. relationalai/early_access/dsl/core/builders/__init__.py +47 -0
  58. relationalai/early_access/dsl/core/builders/logic.py +19 -0
  59. relationalai/early_access/dsl/core/builders/scalar_constraint.py +11 -0
  60. relationalai/early_access/dsl/core/constraints/predicate/atomic.py +455 -0
  61. relationalai/early_access/dsl/core/constraints/predicate/universal.py +73 -0
  62. relationalai/early_access/dsl/core/constraints/scalar.py +310 -0
  63. relationalai/early_access/dsl/core/context.py +13 -0
  64. relationalai/early_access/dsl/core/cset.py +132 -0
  65. relationalai/early_access/dsl/core/exprs/__init__.py +116 -0
  66. relationalai/early_access/dsl/core/exprs/relational.py +18 -0
  67. relationalai/early_access/dsl/core/exprs/scalar.py +412 -0
  68. relationalai/early_access/dsl/core/instances.py +44 -0
  69. relationalai/early_access/dsl/core/logic/__init__.py +193 -0
  70. relationalai/early_access/dsl/core/logic/aggregation.py +98 -0
  71. relationalai/early_access/dsl/core/logic/exists.py +223 -0
  72. relationalai/early_access/dsl/core/logic/helper.py +163 -0
  73. relationalai/early_access/dsl/core/namespaces.py +32 -0
  74. relationalai/early_access/dsl/core/relations.py +276 -0
  75. relationalai/early_access/dsl/core/rules.py +112 -0
  76. relationalai/early_access/dsl/core/std/__init__.py +45 -0
  77. relationalai/early_access/dsl/core/temporal/recall.py +6 -0
  78. relationalai/early_access/dsl/core/types/__init__.py +270 -0
  79. relationalai/early_access/dsl/core/types/concepts.py +128 -0
  80. relationalai/early_access/dsl/core/types/constrained/__init__.py +267 -0
  81. relationalai/early_access/dsl/core/types/constrained/nominal.py +143 -0
  82. relationalai/early_access/dsl/core/types/constrained/subtype.py +124 -0
  83. relationalai/early_access/dsl/core/types/standard.py +92 -0
  84. relationalai/early_access/dsl/core/types/unconstrained.py +50 -0
  85. relationalai/early_access/dsl/core/types/variables.py +203 -0
  86. relationalai/early_access/dsl/ir/compiler.py +318 -0
  87. relationalai/early_access/dsl/ir/executor.py +260 -0
  88. relationalai/early_access/dsl/ontologies/constraints.py +88 -0
  89. relationalai/early_access/dsl/ontologies/export.py +30 -0
  90. relationalai/early_access/dsl/ontologies/models.py +453 -0
  91. relationalai/early_access/dsl/ontologies/python_printer.py +303 -0
  92. relationalai/early_access/dsl/ontologies/readings.py +60 -0
  93. relationalai/early_access/dsl/ontologies/relationships.py +322 -0
  94. relationalai/early_access/dsl/ontologies/roles.py +87 -0
  95. relationalai/early_access/dsl/ontologies/subtyping.py +55 -0
  96. relationalai/early_access/dsl/orm/constraints.py +438 -0
  97. relationalai/early_access/dsl/orm/measures/dimensions.py +200 -0
  98. relationalai/early_access/dsl/orm/measures/initializer.py +16 -0
  99. relationalai/early_access/dsl/orm/measures/measure_rules.py +275 -0
  100. relationalai/early_access/dsl/orm/measures/measures.py +299 -0
  101. relationalai/early_access/dsl/orm/measures/role_exprs.py +268 -0
  102. relationalai/early_access/dsl/orm/models.py +256 -0
  103. relationalai/early_access/dsl/orm/object_oriented_printer.py +344 -0
  104. relationalai/early_access/dsl/orm/printer.py +469 -0
  105. relationalai/early_access/dsl/orm/reasoners.py +480 -0
  106. relationalai/early_access/dsl/orm/relations.py +19 -0
  107. relationalai/early_access/dsl/orm/relationships.py +251 -0
  108. relationalai/early_access/dsl/orm/types.py +42 -0
  109. relationalai/early_access/dsl/orm/utils.py +79 -0
  110. relationalai/early_access/dsl/orm/verb.py +204 -0
  111. relationalai/early_access/dsl/physical_metadata/tables.py +133 -0
  112. relationalai/early_access/dsl/relations.py +170 -0
  113. relationalai/early_access/dsl/rulesets.py +69 -0
  114. relationalai/early_access/dsl/schemas/__init__.py +450 -0
  115. relationalai/early_access/dsl/schemas/builder.py +48 -0
  116. relationalai/early_access/dsl/schemas/comp_names.py +51 -0
  117. relationalai/early_access/dsl/schemas/components.py +203 -0
  118. relationalai/early_access/dsl/schemas/contexts.py +156 -0
  119. relationalai/early_access/dsl/schemas/exprs.py +89 -0
  120. relationalai/early_access/dsl/schemas/fragments.py +464 -0
  121. relationalai/early_access/dsl/serialization.py +79 -0
  122. relationalai/early_access/dsl/serialize/exporter.py +163 -0
  123. relationalai/early_access/dsl/snow/api.py +105 -0
  124. relationalai/early_access/dsl/snow/common.py +76 -0
  125. relationalai/early_access/dsl/state_mgmt/__init__.py +129 -0
  126. relationalai/early_access/dsl/state_mgmt/state_charts.py +125 -0
  127. relationalai/early_access/dsl/state_mgmt/transitions.py +130 -0
  128. relationalai/early_access/dsl/types/__init__.py +40 -0
  129. relationalai/early_access/dsl/types/concepts.py +12 -0
  130. relationalai/early_access/dsl/types/entities.py +135 -0
  131. relationalai/early_access/dsl/types/values.py +17 -0
  132. relationalai/early_access/dsl/utils.py +102 -0
  133. relationalai/early_access/graphs/__init__.py +13 -0
  134. relationalai/early_access/lqp/__init__.py +12 -0
  135. relationalai/early_access/lqp/compiler/__init__.py +12 -0
  136. relationalai/early_access/lqp/constructors/__init__.py +18 -0
  137. relationalai/early_access/lqp/executor/__init__.py +12 -0
  138. relationalai/early_access/lqp/ir/__init__.py +12 -0
  139. relationalai/early_access/lqp/passes/__init__.py +12 -0
  140. relationalai/early_access/lqp/pragmas/__init__.py +12 -0
  141. relationalai/early_access/lqp/primitives/__init__.py +12 -0
  142. relationalai/early_access/lqp/types/__init__.py +12 -0
  143. relationalai/early_access/lqp/utils/__init__.py +12 -0
  144. relationalai/early_access/lqp/validators/__init__.py +12 -0
  145. relationalai/early_access/metamodel/__init__.py +58 -0
  146. relationalai/early_access/metamodel/builtins/__init__.py +12 -0
  147. relationalai/early_access/metamodel/compiler/__init__.py +12 -0
  148. relationalai/early_access/metamodel/dependency/__init__.py +12 -0
  149. relationalai/early_access/metamodel/factory/__init__.py +17 -0
  150. relationalai/early_access/metamodel/helpers/__init__.py +12 -0
  151. relationalai/early_access/metamodel/ir/__init__.py +14 -0
  152. relationalai/early_access/metamodel/rewrite/__init__.py +7 -0
  153. relationalai/early_access/metamodel/typer/__init__.py +3 -0
  154. relationalai/early_access/metamodel/typer/typer/__init__.py +12 -0
  155. relationalai/early_access/metamodel/types/__init__.py +15 -0
  156. relationalai/early_access/metamodel/util/__init__.py +15 -0
  157. relationalai/early_access/metamodel/visitor/__init__.py +12 -0
  158. relationalai/early_access/rel/__init__.py +12 -0
  159. relationalai/early_access/rel/executor/__init__.py +12 -0
  160. relationalai/early_access/rel/rel_utils/__init__.py +12 -0
  161. relationalai/early_access/rel/rewrite/__init__.py +7 -0
  162. relationalai/early_access/solvers/__init__.py +19 -0
  163. relationalai/early_access/sql/__init__.py +11 -0
  164. relationalai/early_access/sql/executor/__init__.py +3 -0
  165. relationalai/early_access/sql/rewrite/__init__.py +3 -0
  166. relationalai/early_access/tests/logging/__init__.py +12 -0
  167. relationalai/early_access/tests/test_snapshot_base/__init__.py +12 -0
  168. relationalai/early_access/tests/utils/__init__.py +12 -0
  169. relationalai/environments/__init__.py +35 -0
  170. relationalai/environments/base.py +381 -0
  171. relationalai/environments/colab.py +14 -0
  172. relationalai/environments/generic.py +71 -0
  173. relationalai/environments/ipython.py +68 -0
  174. relationalai/environments/jupyter.py +9 -0
  175. relationalai/environments/snowbook.py +169 -0
  176. relationalai/errors.py +2496 -0
  177. relationalai/experimental/SF.py +38 -0
  178. relationalai/experimental/inspect.py +47 -0
  179. relationalai/experimental/pathfinder/__init__.py +158 -0
  180. relationalai/experimental/pathfinder/api.py +160 -0
  181. relationalai/experimental/pathfinder/automaton.py +584 -0
  182. relationalai/experimental/pathfinder/bridge.py +226 -0
  183. relationalai/experimental/pathfinder/compiler.py +416 -0
  184. relationalai/experimental/pathfinder/datalog.py +214 -0
  185. relationalai/experimental/pathfinder/diagnostics.py +56 -0
  186. relationalai/experimental/pathfinder/filter.py +236 -0
  187. relationalai/experimental/pathfinder/glushkov.py +439 -0
  188. relationalai/experimental/pathfinder/options.py +265 -0
  189. relationalai/experimental/pathfinder/pathfinder-v0.7.0.rel +1951 -0
  190. relationalai/experimental/pathfinder/rpq.py +344 -0
  191. relationalai/experimental/pathfinder/transition.py +200 -0
  192. relationalai/experimental/pathfinder/utils.py +26 -0
  193. relationalai/experimental/paths/README.md +107 -0
  194. relationalai/experimental/paths/api.py +143 -0
  195. relationalai/experimental/paths/benchmarks/grid_graph.py +37 -0
  196. relationalai/experimental/paths/code_organization.md +2 -0
  197. relationalai/experimental/paths/examples/Movies.ipynb +16328 -0
  198. relationalai/experimental/paths/examples/basic_example.py +40 -0
  199. relationalai/experimental/paths/examples/minimal_engine_warmup.py +3 -0
  200. relationalai/experimental/paths/examples/movie_example.py +77 -0
  201. relationalai/experimental/paths/examples/movies_data/actedin.csv +193 -0
  202. relationalai/experimental/paths/examples/movies_data/directed.csv +45 -0
  203. relationalai/experimental/paths/examples/movies_data/follows.csv +7 -0
  204. relationalai/experimental/paths/examples/movies_data/movies.csv +39 -0
  205. relationalai/experimental/paths/examples/movies_data/person.csv +134 -0
  206. relationalai/experimental/paths/examples/movies_data/produced.csv +16 -0
  207. relationalai/experimental/paths/examples/movies_data/ratings.csv +10 -0
  208. relationalai/experimental/paths/examples/movies_data/wrote.csv +11 -0
  209. relationalai/experimental/paths/examples/paths_benchmark.py +115 -0
  210. relationalai/experimental/paths/examples/paths_example.py +116 -0
  211. relationalai/experimental/paths/examples/pattern_to_automaton.py +28 -0
  212. relationalai/experimental/paths/find_paths_via_automaton.py +85 -0
  213. relationalai/experimental/paths/graph.py +185 -0
  214. relationalai/experimental/paths/path_algorithms/find_paths.py +280 -0
  215. relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +26 -0
  216. relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +111 -0
  217. relationalai/experimental/paths/path_algorithms/single.py +59 -0
  218. relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +39 -0
  219. relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +103 -0
  220. relationalai/experimental/paths/path_algorithms/usp-old.py +130 -0
  221. relationalai/experimental/paths/path_algorithms/usp-tuple.py +183 -0
  222. relationalai/experimental/paths/path_algorithms/usp.py +150 -0
  223. relationalai/experimental/paths/product_graph.py +93 -0
  224. relationalai/experimental/paths/rpq/automaton.py +584 -0
  225. relationalai/experimental/paths/rpq/diagnostics.py +56 -0
  226. relationalai/experimental/paths/rpq/rpq.py +378 -0
  227. relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +90 -0
  228. relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +119 -0
  229. relationalai/experimental/paths/tests/tests_limit_sp_single.py +104 -0
  230. relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +113 -0
  231. relationalai/experimental/paths/tests/tests_limit_walks_single.py +149 -0
  232. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +70 -0
  233. relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +64 -0
  234. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +115 -0
  235. relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +75 -0
  236. relationalai/experimental/paths/tests/tests_single_paths.py +152 -0
  237. relationalai/experimental/paths/tests/tests_single_walks.py +208 -0
  238. relationalai/experimental/paths/tests/tests_single_walks_undirected.py +297 -0
  239. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +107 -0
  240. relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +76 -0
  241. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +76 -0
  242. relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +110 -0
  243. relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +229 -0
  244. relationalai/experimental/paths/tests/tests_usp_nsp_single.py +108 -0
  245. relationalai/experimental/paths/tree_agg.py +168 -0
  246. relationalai/experimental/paths/utilities/iterators.py +27 -0
  247. relationalai/experimental/paths/utilities/prefix_sum.py +91 -0
  248. relationalai/experimental/solvers.py +1087 -0
  249. relationalai/loaders/csv.py +195 -0
  250. relationalai/loaders/loader.py +177 -0
  251. relationalai/loaders/types.py +23 -0
  252. relationalai/rel_emitter.py +373 -0
  253. relationalai/rel_utils.py +185 -0
  254. relationalai/semantics/__init__.py +22 -146
  255. relationalai/semantics/designs/query_builder/identify_by.md +106 -0
  256. relationalai/semantics/devtools/benchmark_lqp.py +535 -0
  257. relationalai/semantics/devtools/compilation_manager.py +294 -0
  258. relationalai/semantics/devtools/extract_lqp.py +110 -0
  259. relationalai/semantics/internal/internal.py +3785 -0
  260. relationalai/semantics/internal/snowflake.py +325 -0
  261. relationalai/semantics/lqp/README.md +34 -0
  262. relationalai/semantics/lqp/builtins.py +16 -0
  263. relationalai/semantics/lqp/compiler.py +22 -0
  264. relationalai/semantics/lqp/constructors.py +68 -0
  265. relationalai/semantics/lqp/executor.py +469 -0
  266. relationalai/semantics/lqp/intrinsics.py +24 -0
  267. relationalai/semantics/lqp/model2lqp.py +877 -0
  268. relationalai/semantics/lqp/passes.py +680 -0
  269. relationalai/semantics/lqp/primitives.py +252 -0
  270. relationalai/semantics/lqp/result_helpers.py +202 -0
  271. relationalai/semantics/lqp/rewrite/annotate_constraints.py +57 -0
  272. relationalai/semantics/lqp/rewrite/cdc.py +216 -0
  273. relationalai/semantics/lqp/rewrite/extract_common.py +338 -0
  274. relationalai/semantics/lqp/rewrite/extract_keys.py +512 -0
  275. relationalai/semantics/lqp/rewrite/function_annotations.py +114 -0
  276. relationalai/semantics/lqp/rewrite/functional_dependencies.py +314 -0
  277. relationalai/semantics/lqp/rewrite/quantify_vars.py +296 -0
  278. relationalai/semantics/lqp/rewrite/splinter.py +76 -0
  279. relationalai/semantics/lqp/types.py +101 -0
  280. relationalai/semantics/lqp/utils.py +160 -0
  281. relationalai/semantics/lqp/validators.py +57 -0
  282. relationalai/semantics/metamodel/__init__.py +40 -6
  283. relationalai/semantics/metamodel/builtins.py +771 -205
  284. relationalai/semantics/metamodel/compiler.py +133 -0
  285. relationalai/semantics/metamodel/dependency.py +862 -0
  286. relationalai/semantics/metamodel/executor.py +61 -0
  287. relationalai/semantics/metamodel/factory.py +287 -0
  288. relationalai/semantics/metamodel/helpers.py +361 -0
  289. relationalai/semantics/metamodel/rewrite/discharge_constraints.py +39 -0
  290. relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +210 -0
  291. relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +78 -0
  292. relationalai/semantics/metamodel/rewrite/flatten.py +554 -0
  293. relationalai/semantics/metamodel/rewrite/format_outputs.py +165 -0
  294. relationalai/semantics/metamodel/typer/checker.py +353 -0
  295. relationalai/semantics/metamodel/typer/typer.py +1395 -0
  296. relationalai/semantics/metamodel/util.py +506 -0
  297. relationalai/semantics/reasoners/__init__.py +10 -0
  298. relationalai/semantics/reasoners/graph/README.md +620 -0
  299. relationalai/semantics/reasoners/graph/__init__.py +37 -0
  300. relationalai/semantics/reasoners/graph/core.py +9019 -0
  301. relationalai/semantics/reasoners/graph/design/beyond_demand_transform.md +797 -0
  302. relationalai/semantics/reasoners/graph/tests/README.md +21 -0
  303. relationalai/semantics/reasoners/optimization/__init__.py +68 -0
  304. relationalai/semantics/reasoners/optimization/common.py +88 -0
  305. relationalai/semantics/reasoners/optimization/solvers_dev.py +568 -0
  306. relationalai/semantics/reasoners/optimization/solvers_pb.py +1414 -0
  307. relationalai/semantics/rel/builtins.py +40 -0
  308. relationalai/semantics/rel/compiler.py +989 -0
  309. relationalai/semantics/rel/executor.py +362 -0
  310. relationalai/semantics/rel/rel.py +482 -0
  311. relationalai/semantics/rel/rel_utils.py +276 -0
  312. relationalai/semantics/snowflake/__init__.py +3 -0
  313. relationalai/semantics/sql/compiler.py +2503 -0
  314. relationalai/semantics/sql/executor/duck_db.py +52 -0
  315. relationalai/semantics/sql/executor/result_helpers.py +64 -0
  316. relationalai/semantics/sql/executor/snowflake.py +149 -0
  317. relationalai/semantics/sql/rewrite/denormalize.py +222 -0
  318. relationalai/semantics/sql/rewrite/double_negation.py +49 -0
  319. relationalai/semantics/sql/rewrite/recursive_union.py +127 -0
  320. relationalai/semantics/sql/rewrite/sort_output_query.py +246 -0
  321. relationalai/semantics/sql/sql.py +504 -0
  322. relationalai/semantics/std/__init__.py +40 -60
  323. relationalai/semantics/std/constraints.py +43 -37
  324. relationalai/semantics/std/datetime.py +135 -246
  325. relationalai/semantics/std/decimals.py +52 -45
  326. relationalai/semantics/std/floats.py +5 -13
  327. relationalai/semantics/std/integers.py +11 -26
  328. relationalai/semantics/std/math.py +112 -183
  329. relationalai/semantics/std/pragmas.py +11 -0
  330. relationalai/semantics/std/re.py +62 -80
  331. relationalai/semantics/std/std.py +14 -0
  332. relationalai/semantics/std/strings.py +60 -117
  333. relationalai/semantics/tests/test_snapshot_abstract.py +143 -0
  334. relationalai/semantics/tests/test_snapshot_base.py +9 -0
  335. relationalai/semantics/tests/utils.py +46 -0
  336. relationalai/std/__init__.py +70 -0
  337. relationalai/tools/cli.py +1936 -0
  338. relationalai/tools/cli_controls.py +1826 -0
  339. relationalai/tools/cli_helpers.py +398 -0
  340. relationalai/tools/debugger.py +183 -289
  341. relationalai/tools/debugger_client.py +109 -0
  342. relationalai/tools/debugger_server.py +302 -0
  343. relationalai/tools/dev.py +685 -0
  344. relationalai/tools/notes +7 -0
  345. relationalai/tools/qb_debugger.py +425 -0
  346. relationalai/util/clean_up_databases.py +95 -0
  347. relationalai/util/format.py +106 -48
  348. relationalai/util/list_databases.py +9 -0
  349. relationalai/util/otel_configuration.py +26 -0
  350. relationalai/util/otel_handler.py +484 -0
  351. relationalai/util/snowflake_handler.py +88 -0
  352. relationalai/util/span_format_test.py +43 -0
  353. relationalai/util/span_tracker.py +207 -0
  354. relationalai/util/spans_file_handler.py +72 -0
  355. relationalai/util/tracing_handler.py +34 -0
  356. relationalai-0.13.1.dist-info/METADATA +74 -0
  357. relationalai-0.13.1.dist-info/RECORD +459 -0
  358. relationalai-0.13.1.dist-info/WHEEL +4 -0
  359. relationalai-0.13.1.dist-info/entry_points.txt +3 -0
  360. relationalai-0.13.1.dist-info/licenses/LICENSE +202 -0
  361. relationalai_test_util/__init__.py +4 -0
  362. relationalai_test_util/fixtures.py +233 -0
  363. relationalai_test_util/snapshot.py +252 -0
  364. relationalai_test_util/traceback.py +118 -0
  365. relationalai/config/__init__.py +0 -56
  366. relationalai/config/config.py +0 -289
  367. relationalai/config/config_fields.py +0 -86
  368. relationalai/config/connections/__init__.py +0 -46
  369. relationalai/config/connections/base.py +0 -23
  370. relationalai/config/connections/duckdb.py +0 -29
  371. relationalai/config/connections/snowflake.py +0 -243
  372. relationalai/config/external/__init__.py +0 -17
  373. relationalai/config/external/dbt_converter.py +0 -101
  374. relationalai/config/external/dbt_models.py +0 -93
  375. relationalai/config/external/snowflake_converter.py +0 -41
  376. relationalai/config/external/snowflake_models.py +0 -85
  377. relationalai/config/external/utils.py +0 -19
  378. relationalai/semantics/backends/lqp/annotations.py +0 -11
  379. relationalai/semantics/backends/sql/sql_compiler.py +0 -327
  380. relationalai/semantics/frontend/base.py +0 -1707
  381. relationalai/semantics/frontend/core.py +0 -179
  382. relationalai/semantics/frontend/front_compiler.py +0 -1313
  383. relationalai/semantics/frontend/pprint.py +0 -408
  384. relationalai/semantics/metamodel/metamodel.py +0 -437
  385. relationalai/semantics/metamodel/metamodel_analyzer.py +0 -519
  386. relationalai/semantics/metamodel/metamodel_compiler.py +0 -0
  387. relationalai/semantics/metamodel/pprint.py +0 -412
  388. relationalai/semantics/metamodel/rewriter.py +0 -266
  389. relationalai/semantics/metamodel/typer.py +0 -1378
  390. relationalai/semantics/std/aggregates.py +0 -149
  391. relationalai/semantics/std/common.py +0 -44
  392. relationalai/semantics/std/numbers.py +0 -86
  393. relationalai/shims/executor.py +0 -147
  394. relationalai/shims/helpers.py +0 -126
  395. relationalai/shims/hoister.py +0 -221
  396. relationalai/shims/mm2v0.py +0 -1290
  397. relationalai/tools/cli/__init__.py +0 -6
  398. relationalai/tools/cli/cli.py +0 -90
  399. relationalai/tools/cli/components/__init__.py +0 -5
  400. relationalai/tools/cli/components/progress_reader.py +0 -1524
  401. relationalai/tools/cli/components/utils.py +0 -58
  402. relationalai/tools/cli/config_template.py +0 -45
  403. relationalai/tools/cli/dev.py +0 -19
  404. relationalai/tools/typer_debugger.py +0 -93
  405. relationalai/util/dataclasses.py +0 -43
  406. relationalai/util/docutils.py +0 -40
  407. relationalai/util/error.py +0 -199
  408. relationalai/util/naming.py +0 -145
  409. relationalai/util/python.py +0 -35
  410. relationalai/util/runtime.py +0 -156
  411. relationalai/util/schema.py +0 -197
  412. relationalai/util/source.py +0 -185
  413. relationalai/util/structures.py +0 -163
  414. relationalai/util/tracing.py +0 -261
  415. relationalai-0.13.0.dev0.dist-info/METADATA +0 -46
  416. relationalai-0.13.0.dev0.dist-info/RECORD +0 -488
  417. relationalai-0.13.0.dev0.dist-info/WHEEL +0 -5
  418. relationalai-0.13.0.dev0.dist-info/entry_points.txt +0 -3
  419. relationalai-0.13.0.dev0.dist-info/top_level.txt +0 -2
  420. v0/relationalai/__init__.py +0 -216
  421. v0/relationalai/clients/__init__.py +0 -5
  422. v0/relationalai/clients/azure.py +0 -477
  423. v0/relationalai/clients/client.py +0 -912
  424. v0/relationalai/clients/config.py +0 -673
  425. v0/relationalai/clients/direct_access_client.py +0 -118
  426. v0/relationalai/clients/hash_util.py +0 -31
  427. v0/relationalai/clients/local.py +0 -571
  428. v0/relationalai/clients/profile_polling.py +0 -73
  429. v0/relationalai/clients/result_helpers.py +0 -420
  430. v0/relationalai/clients/snowflake.py +0 -3869
  431. v0/relationalai/clients/types.py +0 -113
  432. v0/relationalai/clients/use_index_poller.py +0 -980
  433. v0/relationalai/clients/util.py +0 -356
  434. v0/relationalai/debugging.py +0 -389
  435. v0/relationalai/dsl.py +0 -1749
  436. v0/relationalai/early_access/builder/__init__.py +0 -30
  437. v0/relationalai/early_access/builder/builder/__init__.py +0 -35
  438. v0/relationalai/early_access/builder/snowflake/__init__.py +0 -12
  439. v0/relationalai/early_access/builder/std/__init__.py +0 -25
  440. v0/relationalai/early_access/builder/std/decimals/__init__.py +0 -12
  441. v0/relationalai/early_access/builder/std/integers/__init__.py +0 -12
  442. v0/relationalai/early_access/builder/std/math/__init__.py +0 -12
  443. v0/relationalai/early_access/builder/std/strings/__init__.py +0 -14
  444. v0/relationalai/early_access/devtools/__init__.py +0 -12
  445. v0/relationalai/early_access/devtools/benchmark_lqp/__init__.py +0 -12
  446. v0/relationalai/early_access/devtools/extract_lqp/__init__.py +0 -12
  447. v0/relationalai/early_access/dsl/adapters/orm/adapter_qb.py +0 -427
  448. v0/relationalai/early_access/dsl/adapters/orm/parser.py +0 -636
  449. v0/relationalai/early_access/dsl/adapters/owl/adapter.py +0 -176
  450. v0/relationalai/early_access/dsl/adapters/owl/parser.py +0 -160
  451. v0/relationalai/early_access/dsl/bindings/common.py +0 -402
  452. v0/relationalai/early_access/dsl/bindings/csv.py +0 -170
  453. v0/relationalai/early_access/dsl/bindings/legacy/binding_models.py +0 -143
  454. v0/relationalai/early_access/dsl/bindings/snowflake.py +0 -64
  455. v0/relationalai/early_access/dsl/codegen/binder.py +0 -411
  456. v0/relationalai/early_access/dsl/codegen/common.py +0 -79
  457. v0/relationalai/early_access/dsl/codegen/helpers.py +0 -23
  458. v0/relationalai/early_access/dsl/codegen/relations.py +0 -700
  459. v0/relationalai/early_access/dsl/codegen/weaver.py +0 -417
  460. v0/relationalai/early_access/dsl/core/builders/__init__.py +0 -47
  461. v0/relationalai/early_access/dsl/core/builders/logic.py +0 -19
  462. v0/relationalai/early_access/dsl/core/builders/scalar_constraint.py +0 -11
  463. v0/relationalai/early_access/dsl/core/constraints/predicate/atomic.py +0 -455
  464. v0/relationalai/early_access/dsl/core/constraints/predicate/universal.py +0 -73
  465. v0/relationalai/early_access/dsl/core/constraints/scalar.py +0 -310
  466. v0/relationalai/early_access/dsl/core/context.py +0 -13
  467. v0/relationalai/early_access/dsl/core/cset.py +0 -132
  468. v0/relationalai/early_access/dsl/core/exprs/__init__.py +0 -116
  469. v0/relationalai/early_access/dsl/core/exprs/relational.py +0 -18
  470. v0/relationalai/early_access/dsl/core/exprs/scalar.py +0 -412
  471. v0/relationalai/early_access/dsl/core/instances.py +0 -44
  472. v0/relationalai/early_access/dsl/core/logic/__init__.py +0 -193
  473. v0/relationalai/early_access/dsl/core/logic/aggregation.py +0 -98
  474. v0/relationalai/early_access/dsl/core/logic/exists.py +0 -223
  475. v0/relationalai/early_access/dsl/core/logic/helper.py +0 -163
  476. v0/relationalai/early_access/dsl/core/namespaces.py +0 -32
  477. v0/relationalai/early_access/dsl/core/relations.py +0 -276
  478. v0/relationalai/early_access/dsl/core/rules.py +0 -112
  479. v0/relationalai/early_access/dsl/core/std/__init__.py +0 -45
  480. v0/relationalai/early_access/dsl/core/temporal/recall.py +0 -6
  481. v0/relationalai/early_access/dsl/core/types/__init__.py +0 -270
  482. v0/relationalai/early_access/dsl/core/types/concepts.py +0 -128
  483. v0/relationalai/early_access/dsl/core/types/constrained/__init__.py +0 -267
  484. v0/relationalai/early_access/dsl/core/types/constrained/nominal.py +0 -143
  485. v0/relationalai/early_access/dsl/core/types/constrained/subtype.py +0 -124
  486. v0/relationalai/early_access/dsl/core/types/standard.py +0 -92
  487. v0/relationalai/early_access/dsl/core/types/unconstrained.py +0 -50
  488. v0/relationalai/early_access/dsl/core/types/variables.py +0 -203
  489. v0/relationalai/early_access/dsl/ir/compiler.py +0 -318
  490. v0/relationalai/early_access/dsl/ir/executor.py +0 -260
  491. v0/relationalai/early_access/dsl/ontologies/constraints.py +0 -88
  492. v0/relationalai/early_access/dsl/ontologies/export.py +0 -30
  493. v0/relationalai/early_access/dsl/ontologies/models.py +0 -453
  494. v0/relationalai/early_access/dsl/ontologies/python_printer.py +0 -303
  495. v0/relationalai/early_access/dsl/ontologies/readings.py +0 -60
  496. v0/relationalai/early_access/dsl/ontologies/relationships.py +0 -322
  497. v0/relationalai/early_access/dsl/ontologies/roles.py +0 -87
  498. v0/relationalai/early_access/dsl/ontologies/subtyping.py +0 -55
  499. v0/relationalai/early_access/dsl/orm/constraints.py +0 -438
  500. v0/relationalai/early_access/dsl/orm/measures/dimensions.py +0 -200
  501. v0/relationalai/early_access/dsl/orm/measures/initializer.py +0 -16
  502. v0/relationalai/early_access/dsl/orm/measures/measure_rules.py +0 -275
  503. v0/relationalai/early_access/dsl/orm/measures/measures.py +0 -299
  504. v0/relationalai/early_access/dsl/orm/measures/role_exprs.py +0 -268
  505. v0/relationalai/early_access/dsl/orm/models.py +0 -256
  506. v0/relationalai/early_access/dsl/orm/object_oriented_printer.py +0 -344
  507. v0/relationalai/early_access/dsl/orm/printer.py +0 -469
  508. v0/relationalai/early_access/dsl/orm/reasoners.py +0 -480
  509. v0/relationalai/early_access/dsl/orm/relations.py +0 -19
  510. v0/relationalai/early_access/dsl/orm/relationships.py +0 -251
  511. v0/relationalai/early_access/dsl/orm/types.py +0 -42
  512. v0/relationalai/early_access/dsl/orm/utils.py +0 -79
  513. v0/relationalai/early_access/dsl/orm/verb.py +0 -204
  514. v0/relationalai/early_access/dsl/physical_metadata/tables.py +0 -133
  515. v0/relationalai/early_access/dsl/relations.py +0 -170
  516. v0/relationalai/early_access/dsl/rulesets.py +0 -69
  517. v0/relationalai/early_access/dsl/schemas/__init__.py +0 -450
  518. v0/relationalai/early_access/dsl/schemas/builder.py +0 -48
  519. v0/relationalai/early_access/dsl/schemas/comp_names.py +0 -51
  520. v0/relationalai/early_access/dsl/schemas/components.py +0 -203
  521. v0/relationalai/early_access/dsl/schemas/contexts.py +0 -156
  522. v0/relationalai/early_access/dsl/schemas/exprs.py +0 -89
  523. v0/relationalai/early_access/dsl/schemas/fragments.py +0 -464
  524. v0/relationalai/early_access/dsl/serialization.py +0 -79
  525. v0/relationalai/early_access/dsl/serialize/exporter.py +0 -163
  526. v0/relationalai/early_access/dsl/snow/api.py +0 -104
  527. v0/relationalai/early_access/dsl/snow/common.py +0 -76
  528. v0/relationalai/early_access/dsl/state_mgmt/__init__.py +0 -129
  529. v0/relationalai/early_access/dsl/state_mgmt/state_charts.py +0 -125
  530. v0/relationalai/early_access/dsl/state_mgmt/transitions.py +0 -130
  531. v0/relationalai/early_access/dsl/types/__init__.py +0 -40
  532. v0/relationalai/early_access/dsl/types/concepts.py +0 -12
  533. v0/relationalai/early_access/dsl/types/entities.py +0 -135
  534. v0/relationalai/early_access/dsl/types/values.py +0 -17
  535. v0/relationalai/early_access/dsl/utils.py +0 -102
  536. v0/relationalai/early_access/graphs/__init__.py +0 -13
  537. v0/relationalai/early_access/lqp/__init__.py +0 -12
  538. v0/relationalai/early_access/lqp/compiler/__init__.py +0 -12
  539. v0/relationalai/early_access/lqp/constructors/__init__.py +0 -18
  540. v0/relationalai/early_access/lqp/executor/__init__.py +0 -12
  541. v0/relationalai/early_access/lqp/ir/__init__.py +0 -12
  542. v0/relationalai/early_access/lqp/passes/__init__.py +0 -12
  543. v0/relationalai/early_access/lqp/pragmas/__init__.py +0 -12
  544. v0/relationalai/early_access/lqp/primitives/__init__.py +0 -12
  545. v0/relationalai/early_access/lqp/types/__init__.py +0 -12
  546. v0/relationalai/early_access/lqp/utils/__init__.py +0 -12
  547. v0/relationalai/early_access/lqp/validators/__init__.py +0 -12
  548. v0/relationalai/early_access/metamodel/__init__.py +0 -58
  549. v0/relationalai/early_access/metamodel/builtins/__init__.py +0 -12
  550. v0/relationalai/early_access/metamodel/compiler/__init__.py +0 -12
  551. v0/relationalai/early_access/metamodel/dependency/__init__.py +0 -12
  552. v0/relationalai/early_access/metamodel/factory/__init__.py +0 -17
  553. v0/relationalai/early_access/metamodel/helpers/__init__.py +0 -12
  554. v0/relationalai/early_access/metamodel/ir/__init__.py +0 -14
  555. v0/relationalai/early_access/metamodel/rewrite/__init__.py +0 -7
  556. v0/relationalai/early_access/metamodel/typer/__init__.py +0 -3
  557. v0/relationalai/early_access/metamodel/typer/typer/__init__.py +0 -12
  558. v0/relationalai/early_access/metamodel/types/__init__.py +0 -15
  559. v0/relationalai/early_access/metamodel/util/__init__.py +0 -15
  560. v0/relationalai/early_access/metamodel/visitor/__init__.py +0 -12
  561. v0/relationalai/early_access/rel/__init__.py +0 -12
  562. v0/relationalai/early_access/rel/executor/__init__.py +0 -12
  563. v0/relationalai/early_access/rel/rel_utils/__init__.py +0 -12
  564. v0/relationalai/early_access/rel/rewrite/__init__.py +0 -7
  565. v0/relationalai/early_access/solvers/__init__.py +0 -19
  566. v0/relationalai/early_access/sql/__init__.py +0 -11
  567. v0/relationalai/early_access/sql/executor/__init__.py +0 -3
  568. v0/relationalai/early_access/sql/rewrite/__init__.py +0 -3
  569. v0/relationalai/early_access/tests/logging/__init__.py +0 -12
  570. v0/relationalai/early_access/tests/test_snapshot_base/__init__.py +0 -12
  571. v0/relationalai/early_access/tests/utils/__init__.py +0 -12
  572. v0/relationalai/environments/__init__.py +0 -35
  573. v0/relationalai/environments/base.py +0 -381
  574. v0/relationalai/environments/colab.py +0 -14
  575. v0/relationalai/environments/generic.py +0 -71
  576. v0/relationalai/environments/ipython.py +0 -68
  577. v0/relationalai/environments/jupyter.py +0 -9
  578. v0/relationalai/environments/snowbook.py +0 -169
  579. v0/relationalai/errors.py +0 -2455
  580. v0/relationalai/experimental/SF.py +0 -38
  581. v0/relationalai/experimental/inspect.py +0 -47
  582. v0/relationalai/experimental/pathfinder/__init__.py +0 -158
  583. v0/relationalai/experimental/pathfinder/api.py +0 -160
  584. v0/relationalai/experimental/pathfinder/automaton.py +0 -584
  585. v0/relationalai/experimental/pathfinder/bridge.py +0 -226
  586. v0/relationalai/experimental/pathfinder/compiler.py +0 -416
  587. v0/relationalai/experimental/pathfinder/datalog.py +0 -214
  588. v0/relationalai/experimental/pathfinder/diagnostics.py +0 -56
  589. v0/relationalai/experimental/pathfinder/filter.py +0 -236
  590. v0/relationalai/experimental/pathfinder/glushkov.py +0 -439
  591. v0/relationalai/experimental/pathfinder/options.py +0 -265
  592. v0/relationalai/experimental/pathfinder/rpq.py +0 -344
  593. v0/relationalai/experimental/pathfinder/transition.py +0 -200
  594. v0/relationalai/experimental/pathfinder/utils.py +0 -26
  595. v0/relationalai/experimental/paths/api.py +0 -143
  596. v0/relationalai/experimental/paths/benchmarks/grid_graph.py +0 -37
  597. v0/relationalai/experimental/paths/examples/basic_example.py +0 -40
  598. v0/relationalai/experimental/paths/examples/minimal_engine_warmup.py +0 -3
  599. v0/relationalai/experimental/paths/examples/movie_example.py +0 -77
  600. v0/relationalai/experimental/paths/examples/paths_benchmark.py +0 -115
  601. v0/relationalai/experimental/paths/examples/paths_example.py +0 -116
  602. v0/relationalai/experimental/paths/examples/pattern_to_automaton.py +0 -28
  603. v0/relationalai/experimental/paths/find_paths_via_automaton.py +0 -85
  604. v0/relationalai/experimental/paths/graph.py +0 -185
  605. v0/relationalai/experimental/paths/path_algorithms/find_paths.py +0 -280
  606. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_repetition.py +0 -26
  607. v0/relationalai/experimental/paths/path_algorithms/one_sided_ball_upto.py +0 -111
  608. v0/relationalai/experimental/paths/path_algorithms/single.py +0 -59
  609. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_repetition.py +0 -39
  610. v0/relationalai/experimental/paths/path_algorithms/two_sided_balls_upto.py +0 -103
  611. v0/relationalai/experimental/paths/path_algorithms/usp-old.py +0 -130
  612. v0/relationalai/experimental/paths/path_algorithms/usp-tuple.py +0 -183
  613. v0/relationalai/experimental/paths/path_algorithms/usp.py +0 -150
  614. v0/relationalai/experimental/paths/product_graph.py +0 -93
  615. v0/relationalai/experimental/paths/rpq/automaton.py +0 -584
  616. v0/relationalai/experimental/paths/rpq/diagnostics.py +0 -56
  617. v0/relationalai/experimental/paths/rpq/rpq.py +0 -378
  618. v0/relationalai/experimental/paths/tests/tests_limit_sp_max_length.py +0 -90
  619. v0/relationalai/experimental/paths/tests/tests_limit_sp_multiple.py +0 -119
  620. v0/relationalai/experimental/paths/tests/tests_limit_sp_single.py +0 -104
  621. v0/relationalai/experimental/paths/tests/tests_limit_walks_multiple.py +0 -113
  622. v0/relationalai/experimental/paths/tests/tests_limit_walks_single.py +0 -149
  623. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_multiple.py +0 -70
  624. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_repetition_single.py +0 -64
  625. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_multiple.py +0 -115
  626. v0/relationalai/experimental/paths/tests/tests_one_sided_ball_upto_single.py +0 -75
  627. v0/relationalai/experimental/paths/tests/tests_single_paths.py +0 -152
  628. v0/relationalai/experimental/paths/tests/tests_single_walks.py +0 -208
  629. v0/relationalai/experimental/paths/tests/tests_single_walks_undirected.py +0 -297
  630. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_multiple.py +0 -107
  631. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_repetition_single.py +0 -76
  632. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_multiple.py +0 -76
  633. v0/relationalai/experimental/paths/tests/tests_two_sided_balls_upto_single.py +0 -110
  634. v0/relationalai/experimental/paths/tests/tests_usp_nsp_multiple.py +0 -229
  635. v0/relationalai/experimental/paths/tests/tests_usp_nsp_single.py +0 -108
  636. v0/relationalai/experimental/paths/tree_agg.py +0 -168
  637. v0/relationalai/experimental/paths/utilities/iterators.py +0 -27
  638. v0/relationalai/experimental/paths/utilities/prefix_sum.py +0 -91
  639. v0/relationalai/experimental/solvers.py +0 -1087
  640. v0/relationalai/loaders/csv.py +0 -195
  641. v0/relationalai/loaders/loader.py +0 -177
  642. v0/relationalai/loaders/types.py +0 -23
  643. v0/relationalai/rel_emitter.py +0 -373
  644. v0/relationalai/rel_utils.py +0 -185
  645. v0/relationalai/semantics/__init__.py +0 -29
  646. v0/relationalai/semantics/devtools/benchmark_lqp.py +0 -536
  647. v0/relationalai/semantics/devtools/compilation_manager.py +0 -294
  648. v0/relationalai/semantics/devtools/extract_lqp.py +0 -110
  649. v0/relationalai/semantics/internal/internal.py +0 -3785
  650. v0/relationalai/semantics/internal/snowflake.py +0 -324
  651. v0/relationalai/semantics/lqp/builtins.py +0 -16
  652. v0/relationalai/semantics/lqp/compiler.py +0 -22
  653. v0/relationalai/semantics/lqp/constructors.py +0 -68
  654. v0/relationalai/semantics/lqp/executor.py +0 -469
  655. v0/relationalai/semantics/lqp/intrinsics.py +0 -24
  656. v0/relationalai/semantics/lqp/model2lqp.py +0 -839
  657. v0/relationalai/semantics/lqp/passes.py +0 -680
  658. v0/relationalai/semantics/lqp/primitives.py +0 -252
  659. v0/relationalai/semantics/lqp/result_helpers.py +0 -202
  660. v0/relationalai/semantics/lqp/rewrite/annotate_constraints.py +0 -57
  661. v0/relationalai/semantics/lqp/rewrite/cdc.py +0 -216
  662. v0/relationalai/semantics/lqp/rewrite/extract_common.py +0 -338
  663. v0/relationalai/semantics/lqp/rewrite/extract_keys.py +0 -449
  664. v0/relationalai/semantics/lqp/rewrite/function_annotations.py +0 -114
  665. v0/relationalai/semantics/lqp/rewrite/functional_dependencies.py +0 -314
  666. v0/relationalai/semantics/lqp/rewrite/quantify_vars.py +0 -296
  667. v0/relationalai/semantics/lqp/rewrite/splinter.py +0 -76
  668. v0/relationalai/semantics/lqp/types.py +0 -101
  669. v0/relationalai/semantics/lqp/utils.py +0 -160
  670. v0/relationalai/semantics/lqp/validators.py +0 -57
  671. v0/relationalai/semantics/metamodel/__init__.py +0 -40
  672. v0/relationalai/semantics/metamodel/builtins.py +0 -774
  673. v0/relationalai/semantics/metamodel/compiler.py +0 -133
  674. v0/relationalai/semantics/metamodel/dependency.py +0 -862
  675. v0/relationalai/semantics/metamodel/executor.py +0 -61
  676. v0/relationalai/semantics/metamodel/factory.py +0 -287
  677. v0/relationalai/semantics/metamodel/helpers.py +0 -361
  678. v0/relationalai/semantics/metamodel/rewrite/discharge_constraints.py +0 -39
  679. v0/relationalai/semantics/metamodel/rewrite/dnf_union_splitter.py +0 -210
  680. v0/relationalai/semantics/metamodel/rewrite/extract_nested_logicals.py +0 -78
  681. v0/relationalai/semantics/metamodel/rewrite/flatten.py +0 -549
  682. v0/relationalai/semantics/metamodel/rewrite/format_outputs.py +0 -165
  683. v0/relationalai/semantics/metamodel/typer/checker.py +0 -353
  684. v0/relationalai/semantics/metamodel/typer/typer.py +0 -1395
  685. v0/relationalai/semantics/metamodel/util.py +0 -505
  686. v0/relationalai/semantics/reasoners/__init__.py +0 -10
  687. v0/relationalai/semantics/reasoners/graph/__init__.py +0 -37
  688. v0/relationalai/semantics/reasoners/graph/core.py +0 -9020
  689. v0/relationalai/semantics/reasoners/optimization/__init__.py +0 -68
  690. v0/relationalai/semantics/reasoners/optimization/common.py +0 -88
  691. v0/relationalai/semantics/reasoners/optimization/solvers_dev.py +0 -568
  692. v0/relationalai/semantics/reasoners/optimization/solvers_pb.py +0 -1163
  693. v0/relationalai/semantics/rel/builtins.py +0 -40
  694. v0/relationalai/semantics/rel/compiler.py +0 -989
  695. v0/relationalai/semantics/rel/executor.py +0 -359
  696. v0/relationalai/semantics/rel/rel.py +0 -482
  697. v0/relationalai/semantics/rel/rel_utils.py +0 -276
  698. v0/relationalai/semantics/snowflake/__init__.py +0 -3
  699. v0/relationalai/semantics/sql/compiler.py +0 -2503
  700. v0/relationalai/semantics/sql/executor/duck_db.py +0 -52
  701. v0/relationalai/semantics/sql/executor/result_helpers.py +0 -64
  702. v0/relationalai/semantics/sql/executor/snowflake.py +0 -145
  703. v0/relationalai/semantics/sql/rewrite/denormalize.py +0 -222
  704. v0/relationalai/semantics/sql/rewrite/double_negation.py +0 -49
  705. v0/relationalai/semantics/sql/rewrite/recursive_union.py +0 -127
  706. v0/relationalai/semantics/sql/rewrite/sort_output_query.py +0 -246
  707. v0/relationalai/semantics/sql/sql.py +0 -504
  708. v0/relationalai/semantics/std/__init__.py +0 -54
  709. v0/relationalai/semantics/std/constraints.py +0 -43
  710. v0/relationalai/semantics/std/datetime.py +0 -363
  711. v0/relationalai/semantics/std/decimals.py +0 -62
  712. v0/relationalai/semantics/std/floats.py +0 -7
  713. v0/relationalai/semantics/std/integers.py +0 -22
  714. v0/relationalai/semantics/std/math.py +0 -141
  715. v0/relationalai/semantics/std/pragmas.py +0 -11
  716. v0/relationalai/semantics/std/re.py +0 -83
  717. v0/relationalai/semantics/std/std.py +0 -14
  718. v0/relationalai/semantics/std/strings.py +0 -63
  719. v0/relationalai/semantics/tests/__init__.py +0 -0
  720. v0/relationalai/semantics/tests/test_snapshot_abstract.py +0 -143
  721. v0/relationalai/semantics/tests/test_snapshot_base.py +0 -9
  722. v0/relationalai/semantics/tests/utils.py +0 -46
  723. v0/relationalai/std/__init__.py +0 -70
  724. v0/relationalai/tools/__init__.py +0 -0
  725. v0/relationalai/tools/cli.py +0 -1940
  726. v0/relationalai/tools/cli_controls.py +0 -1826
  727. v0/relationalai/tools/cli_helpers.py +0 -390
  728. v0/relationalai/tools/debugger.py +0 -183
  729. v0/relationalai/tools/debugger_client.py +0 -109
  730. v0/relationalai/tools/debugger_server.py +0 -302
  731. v0/relationalai/tools/dev.py +0 -685
  732. v0/relationalai/tools/qb_debugger.py +0 -425
  733. v0/relationalai/util/clean_up_databases.py +0 -95
  734. v0/relationalai/util/format.py +0 -123
  735. v0/relationalai/util/list_databases.py +0 -9
  736. v0/relationalai/util/otel_configuration.py +0 -25
  737. v0/relationalai/util/otel_handler.py +0 -484
  738. v0/relationalai/util/snowflake_handler.py +0 -88
  739. v0/relationalai/util/span_format_test.py +0 -43
  740. v0/relationalai/util/span_tracker.py +0 -207
  741. v0/relationalai/util/spans_file_handler.py +0 -72
  742. v0/relationalai/util/tracing_handler.py +0 -34
  743. /relationalai/{semantics/frontend → analysis}/__init__.py +0 -0
  744. {v0/relationalai → relationalai}/analysis/mechanistic.py +0 -0
  745. {v0/relationalai → relationalai}/analysis/whynot.py +0 -0
  746. /relationalai/{shims → auth}/__init__.py +0 -0
  747. {v0/relationalai → relationalai}/auth/jwt_generator.py +0 -0
  748. {v0/relationalai → relationalai}/auth/oauth_callback_server.py +0 -0
  749. {v0/relationalai → relationalai}/auth/token_handler.py +0 -0
  750. {v0/relationalai → relationalai}/auth/util.py +0 -0
  751. {v0/relationalai/clients → relationalai/clients/resources/snowflake}/cache_store.py +0 -0
  752. {v0/relationalai → relationalai}/compiler.py +0 -0
  753. {v0/relationalai → relationalai}/dependencies.py +0 -0
  754. {v0/relationalai → relationalai}/docutils.py +0 -0
  755. {v0/relationalai/analysis → relationalai/early_access}/__init__.py +0 -0
  756. {v0/relationalai → relationalai}/early_access/dsl/__init__.py +0 -0
  757. {v0/relationalai/auth → relationalai/early_access/dsl/adapters}/__init__.py +0 -0
  758. {v0/relationalai/early_access → relationalai/early_access/dsl/adapters/orm}/__init__.py +0 -0
  759. {v0/relationalai → relationalai}/early_access/dsl/adapters/orm/model.py +0 -0
  760. {v0/relationalai/early_access/dsl/adapters → relationalai/early_access/dsl/adapters/owl}/__init__.py +0 -0
  761. {v0/relationalai → relationalai}/early_access/dsl/adapters/owl/model.py +0 -0
  762. {v0/relationalai/early_access/dsl/adapters/orm → relationalai/early_access/dsl/bindings}/__init__.py +0 -0
  763. {v0/relationalai/early_access/dsl/adapters/owl → relationalai/early_access/dsl/bindings/legacy}/__init__.py +0 -0
  764. {v0/relationalai/early_access/dsl/bindings → relationalai/early_access/dsl/codegen}/__init__.py +0 -0
  765. {v0/relationalai → relationalai}/early_access/dsl/constants.py +0 -0
  766. {v0/relationalai → relationalai}/early_access/dsl/core/__init__.py +0 -0
  767. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/__init__.py +0 -0
  768. {v0/relationalai → relationalai}/early_access/dsl/core/constraints/predicate/__init__.py +0 -0
  769. {v0/relationalai → relationalai}/early_access/dsl/core/stack.py +0 -0
  770. {v0/relationalai/early_access/dsl/bindings/legacy → relationalai/early_access/dsl/core/temporal}/__init__.py +0 -0
  771. {v0/relationalai → relationalai}/early_access/dsl/core/utils.py +0 -0
  772. {v0/relationalai/early_access/dsl/codegen → relationalai/early_access/dsl/ir}/__init__.py +0 -0
  773. {v0/relationalai/early_access/dsl/core/temporal → relationalai/early_access/dsl/ontologies}/__init__.py +0 -0
  774. {v0/relationalai → relationalai}/early_access/dsl/ontologies/raw_source.py +0 -0
  775. {v0/relationalai/early_access/dsl/ir → relationalai/early_access/dsl/orm}/__init__.py +0 -0
  776. {v0/relationalai/early_access/dsl/ontologies → relationalai/early_access/dsl/orm/measures}/__init__.py +0 -0
  777. {v0/relationalai → relationalai}/early_access/dsl/orm/reasoner_errors.py +0 -0
  778. {v0/relationalai/early_access/dsl/orm → relationalai/early_access/dsl/physical_metadata}/__init__.py +0 -0
  779. {v0/relationalai/early_access/dsl/orm/measures → relationalai/early_access/dsl/serialize}/__init__.py +0 -0
  780. {v0/relationalai → relationalai}/early_access/dsl/serialize/binding_model.py +0 -0
  781. {v0/relationalai → relationalai}/early_access/dsl/serialize/model.py +0 -0
  782. {v0/relationalai/early_access/dsl/physical_metadata → relationalai/early_access/dsl/snow}/__init__.py +0 -0
  783. {v0/relationalai → relationalai}/early_access/tests/__init__.py +0 -0
  784. {v0/relationalai → relationalai}/environments/ci.py +0 -0
  785. {v0/relationalai → relationalai}/environments/hex.py +0 -0
  786. {v0/relationalai → relationalai}/environments/terminal.py +0 -0
  787. {v0/relationalai → relationalai}/experimental/__init__.py +0 -0
  788. {v0/relationalai → relationalai}/experimental/graphs.py +0 -0
  789. {v0/relationalai → relationalai}/experimental/paths/__init__.py +0 -0
  790. {v0/relationalai → relationalai}/experimental/paths/benchmarks/__init__.py +0 -0
  791. {v0/relationalai → relationalai}/experimental/paths/path_algorithms/__init__.py +0 -0
  792. {v0/relationalai → relationalai}/experimental/paths/rpq/__init__.py +0 -0
  793. {v0/relationalai → relationalai}/experimental/paths/rpq/filter.py +0 -0
  794. {v0/relationalai → relationalai}/experimental/paths/rpq/glushkov.py +0 -0
  795. {v0/relationalai → relationalai}/experimental/paths/rpq/transition.py +0 -0
  796. {v0/relationalai → relationalai}/experimental/paths/utilities/__init__.py +0 -0
  797. {v0/relationalai → relationalai}/experimental/paths/utilities/utilities.py +0 -0
  798. {v0/relationalai/early_access/dsl/serialize → relationalai/loaders}/__init__.py +0 -0
  799. {v0/relationalai → relationalai}/metagen.py +0 -0
  800. {v0/relationalai → relationalai}/metamodel.py +0 -0
  801. {v0/relationalai → relationalai}/rel.py +0 -0
  802. {v0/relationalai → relationalai}/semantics/devtools/__init__.py +0 -0
  803. {v0/relationalai → relationalai}/semantics/internal/__init__.py +0 -0
  804. {v0/relationalai → relationalai}/semantics/internal/annotations.py +0 -0
  805. {v0/relationalai → relationalai}/semantics/lqp/__init__.py +0 -0
  806. {v0/relationalai → relationalai}/semantics/lqp/ir.py +0 -0
  807. {v0/relationalai → relationalai}/semantics/lqp/pragmas.py +0 -0
  808. {v0/relationalai → relationalai}/semantics/lqp/rewrite/__init__.py +0 -0
  809. {v0/relationalai → relationalai}/semantics/metamodel/dataflow.py +0 -0
  810. {v0/relationalai → relationalai}/semantics/metamodel/ir.py +0 -0
  811. {v0/relationalai → relationalai}/semantics/metamodel/rewrite/__init__.py +0 -0
  812. {v0/relationalai → relationalai}/semantics/metamodel/typer/__init__.py +0 -0
  813. {v0/relationalai → relationalai}/semantics/metamodel/types.py +0 -0
  814. {v0/relationalai → relationalai}/semantics/metamodel/visitor.py +0 -0
  815. {v0/relationalai → relationalai}/semantics/reasoners/experimental/__init__.py +0 -0
  816. {v0/relationalai → relationalai}/semantics/rel/__init__.py +0 -0
  817. {v0/relationalai → relationalai}/semantics/sql/__init__.py +0 -0
  818. {v0/relationalai → relationalai}/semantics/sql/executor/__init__.py +0 -0
  819. {v0/relationalai → relationalai}/semantics/sql/rewrite/__init__.py +0 -0
  820. {v0/relationalai/early_access/dsl/snow → relationalai/semantics/tests}/__init__.py +0 -0
  821. {v0/relationalai → relationalai}/semantics/tests/logging.py +0 -0
  822. {v0/relationalai → relationalai}/std/aggregates.py +0 -0
  823. {v0/relationalai → relationalai}/std/dates.py +0 -0
  824. {v0/relationalai → relationalai}/std/graphs.py +0 -0
  825. {v0/relationalai → relationalai}/std/inspect.py +0 -0
  826. {v0/relationalai → relationalai}/std/math.py +0 -0
  827. {v0/relationalai → relationalai}/std/re.py +0 -0
  828. {v0/relationalai → relationalai}/std/strings.py +0 -0
  829. {v0/relationalai/loaders → relationalai/tools}/__init__.py +0 -0
  830. {v0/relationalai → relationalai}/tools/cleanup_snapshots.py +0 -0
  831. {v0/relationalai → relationalai}/tools/constants.py +0 -0
  832. {v0/relationalai → relationalai}/tools/query_utils.py +0 -0
  833. {v0/relationalai → relationalai}/tools/snapshot_viewer.py +0 -0
  834. {v0/relationalai → relationalai}/util/__init__.py +0 -0
  835. {v0/relationalai → relationalai}/util/constants.py +0 -0
  836. {v0/relationalai → relationalai}/util/graph.py +0 -0
  837. {v0/relationalai → relationalai}/util/timeout.py +0 -0
@@ -1,862 +0,0 @@
1
- """
2
- Support for dependency analysis of metamodel IRs.
3
- """
4
- from __future__ import annotations
5
- from dataclasses import dataclass, field
6
- from typing import Iterable, Optional
7
- from itertools import count
8
- from more_itertools import peekable
9
- from v0.relationalai.semantics.metamodel import builtins, ir, helpers, visitor
10
- from v0.relationalai.semantics.metamodel.util import OrderedSet, ordered_set
11
-
12
-
13
- #--------------------------------------------------
14
- # Public API
15
- #--------------------------------------------------
16
-
17
- @dataclass
18
- class DependencyInfo():
19
- """
20
- Represents the result of performing binding and dependency analysis on a metamodel tree.
21
-
22
- All dicts are keyed by task ids.
23
- """
24
- # input vars for a task
25
- input_bindings: dict[int, OrderedSet[ir.Var]] = field(default_factory=dict)
26
- # output vars for a task
27
- output_bindings: dict[int, OrderedSet[ir.Var]] = field(default_factory=dict)
28
- # clusters of dependency that each task participates on
29
- dependency_clusters: dict[int, Cluster] = field(default_factory=dict)
30
- # keep track of the parents of each task
31
- parent: dict[int, ir.Task] = field(default_factory=dict)
32
- # keep track of replacements that were made during a rewrite
33
- replacements: dict[int, ir.Task] = field(default_factory=dict)
34
-
35
- def task_inputs(self, node: ir.Task) -> Optional[OrderedSet[ir.Var]]:
36
- """ The input variables for this task, if any. """
37
- if node.id in self.input_bindings:
38
- return self.input_bindings[node.id]
39
- return None
40
-
41
- def has_inputs(self, node: ir.Task):
42
- return node.id in self.input_bindings
43
-
44
- def task_outputs(self, node: ir.Task) -> Optional[OrderedSet[ir.Var]]:
45
- """ The output variables for this task, if any. """
46
- if node.id in self.output_bindings:
47
- return self.output_bindings[node.id]
48
- return None
49
-
50
- def has_outputs(self, node: ir.Task):
51
- return node.id in self.output_bindings
52
-
53
- def task_dependencies(self, task: ir.Task) -> OrderedSet[ir.Task]:
54
- """
55
- All dependencies for this task, if any. This includes tasks in outer contexts,
56
- not only siblings.
57
- """
58
-
59
- deps = ordered_set()
60
- cluster = self.dependency_clusters.get(task.id, None)
61
- parent = self.parent.get(task.id)
62
-
63
- if cluster:
64
- self._collect_deps(cluster, deps)
65
- while parent:
66
- cluster = self.dependency_clusters.get(parent.id, None)
67
- if cluster:
68
- self._collect_deps(cluster, deps)
69
- parent = self.parent[cluster.content[0].id]
70
- else:
71
- parent = None
72
- return self._with_replacements(deps)
73
-
74
- def local_dependencies(self, task: ir.Task) -> Optional[OrderedSet[ir.Task]]:
75
- """ Similar to task_dependencies but returns only dependencies that are siblings. """
76
-
77
- if task.id in self.dependency_clusters:
78
- deps = ordered_set()
79
- self._collect_deps(self.dependency_clusters[task.id], deps)
80
- return self._with_replacements(deps)
81
- return None
82
-
83
- def replaced(self, original: ir.Task, replacement: ir.Task):
84
- """
85
- Inform that, during some pass, this original task was replaced with this replacement
86
- task. This affects the info of .task_dependencies(...) since it will answer with
87
- the replacement when the original is in the set of dependencies.
88
- """
89
- self.replacements[original.id] = replacement
90
-
91
- #
92
- # Implementation details
93
- #
94
- def _collect_deps(self, cluster: Cluster, deps: OrderedSet[ir.Task]):
95
- queue = []
96
- # start with the cluster dependencies, because cluster represents the task we
97
- # care about
98
- queue.extend(cluster.dependencies)
99
- seen = set()
100
- while queue:
101
- cluster = queue.pop()
102
- if cluster.id in seen:
103
- continue
104
- seen.add(cluster.id)
105
- deps.update(cluster.content)
106
- queue.extend(cluster.dependencies)
107
-
108
- def _with_replacements(self, deps):
109
- # Return deps with all tasks that need replacements (because they are in the
110
- # replacements dict) replaced.
111
- if any([dep.id in self.replacements for dep in deps]):
112
- # Only allocate and compute replacements if there's a dep that was replaced
113
- info = ordered_set()
114
- for dep in deps:
115
- info.add(self.replacements.get(dep.id, dep))
116
- return info
117
- return deps
118
-
119
-
120
- def analyze_bindings(task: ir.Task) -> DependencyInfo:
121
- """
122
- Perform just the binding analysis, skipping the dependency analysis. This is useful
123
- for passes that only require knowing the input/output sets for nodes, but do not need
124
- the more expensive dependency information.
125
-
126
- The returned DependencyInfo object will only have input and output bindings filled.
127
- """
128
- binding = BindingAnalysis()
129
- task.accept(binding)
130
- return binding.info
131
-
132
- def analyze(task: ir.Task) -> DependencyInfo:
133
- """
134
- Perform binding and dependency analysis on this task.
135
-
136
- The returned DependencyInfo object will have all dictionaries filled.
137
- """
138
- # first perform binding analysis to get inputs and outputs
139
- info = analyze_bindings(task)
140
-
141
- # TODO - if the toplevel task needs inputs, that's a groundness error
142
-
143
- # now perform the dependency analysis
144
- dependency = DependencyAnalysis(info)
145
- task.accept(dependency)
146
- return info
147
-
148
- #--------------------------------------------------
149
- # Dependency Analysis
150
- #--------------------------------------------------
151
-
152
- # id generator for Clusters
153
- _global_id = peekable(count(0))
154
- def next_id():
155
- return next(_global_id)
156
-
157
- class Cluster():
158
- def __init__(self, info: DependencyInfo, task: ir.Task):
159
- """ Create a cluster starting with only this task. """
160
- self.id = next_id()
161
- self.info = info
162
- # exists and lookups for nullary relations are always required (i.e. everything
163
- # should depend on them)
164
- self.required = isinstance(task, ir.Exists) or (isinstance(task, ir.Lookup) and not task.args)
165
- # this is a binders cluster, which is a candidate to being merged
166
- self.mergeable = not self.required and isinstance(task, helpers.BINDERS)
167
- # this is a cluster that will only hold an effect
168
- self.effectful = isinstance(task, helpers.EFFECTS)
169
- # this is a cluster that will only hold a composite
170
- self.composite = isinstance(task, helpers.COMPOSITES)
171
- # content is either a single task or a set of tasks
172
- self.content: OrderedSet[ir.Task] = ordered_set(task)
173
- # combined inputs and outputs for all tasks in the cluster
174
- self.inputs: OrderedSet[ir.Var] = OrderedSet.from_iterable(info.input_bindings.get(task.id))
175
- self.outputs: OrderedSet[ir.Var] = OrderedSet.from_iterable(info.output_bindings.get(task.id))
176
- # eventually we will compute dependencies between clusters
177
- self.dependencies: OrderedSet[Cluster] = ordered_set()
178
-
179
- def __str__(self) -> str:
180
- if isinstance(self.content, ir.Task):
181
- return str(self.content.id)
182
- else:
183
- return ', '.join(str(node.id) for node in self.content)
184
-
185
- def __eq__(self, other):
186
- return isinstance(other, Cluster) and other.id == self.id
187
-
188
- def __hash__(self):
189
- return hash(self.id)
190
-
191
- def depends_on(self, other: Cluster):
192
- """ Assert that this cluster depends on the other cluster. """
193
- if self in other.dependencies:
194
- # prevent cycles caused by bugs, like the union hoisting pets in the
195
- # relationship7 test
196
- print("Warning: there is a cycle in the dependency graph. This is likely a bug.")
197
- # k = ','.join(str(x.id) for x in self.content)
198
- # v = ','.join(str(x.id) for x in other.content)
199
- # print(f"{k} --> {v}")
200
- else:
201
- self.dependencies.add(other)
202
-
203
- def shares_variable(self, other: Cluster):
204
- """ Returns True iff this cluster and the other cluster have at least one var in common. """
205
- return (
206
- any(i in other.inputs or i in other.outputs for i in self.inputs) or
207
- any(o in other.inputs or o in other.outputs for o in self.outputs)
208
- )
209
-
210
- def try_merge(self, other: Cluster, hoisted_vars: OrderedSet[ir.Var]):
211
- """
212
- Verify that this cluster and the other cluster can be merged. If so, merge the
213
- other cluster into this cluster and return True. Otherwise, return False and the
214
- clusters are left unmodified.
215
- """
216
-
217
- # 1. only mergeable
218
- if not (self.mergeable and other.mergeable):
219
- return False
220
-
221
- # 2. share some variable
222
- if not self.shares_variable(other):
223
- return False
224
-
225
- # 3. all inputs are covered by outputs within the cluster
226
- if not all(v in self.outputs or v in other.outputs for v in self.inputs):
227
- return False
228
- if not all(v in self.outputs or v in other.outputs for v in other.inputs):
229
- return False
230
-
231
- # 4. if there are hoisted vars in context, we can only merge clusters that bind the
232
- # same hoisted vars
233
- if hoisted_vars:
234
- for v in hoisted_vars:
235
- # if self binds v and other does not bind v, they can't be merged
236
- if v in self.outputs or v in self.inputs:
237
- if v not in other.outputs or v not in other.inputs:
238
- return False
239
- # the other way around
240
- if v in other.outputs or v in other.inputs:
241
- if v not in self.outputs or v not in self.inputs:
242
- return False
243
-
244
- # ok, can merge
245
- self.merge(other)
246
- return True
247
-
248
- def try_merge_group(self, others: list[Cluster]):
249
- """
250
- Verify that this cluster and the other clusters can all be merged together. If so,
251
- merge the other clusters into this cluster and return True. Otherwise, return False
252
- and all clusters are left unmodified.
253
- """
254
- assert(len(others) > 0)
255
-
256
- # 1. only mergeable
257
- if not (self.mergeable and all(o.mergeable for o in others)):
258
- return False
259
-
260
- # 2. share some variable
261
- if not self.shares_variable(others[0]):
262
- return False
263
-
264
- # 3. all inputs are covered by outputs within the newly formed cluster
265
- if len(others) == 1:
266
- others_outputs = others[0].outputs
267
- else:
268
- others_outputs = ordered_set()
269
- [others_outputs.update(o.outputs) for o in others]
270
- if not all(v in self.outputs or v in others_outputs for v in self.inputs):
271
- return False
272
- for other in others:
273
- if not all(v in self.outputs or v in others_outputs for v in other.inputs):
274
- return False
275
-
276
- # ok, can merge
277
- self.merge(others)
278
- return True
279
-
280
- def merge(self, other: Cluster|Iterable[Cluster]):
281
- """
282
- Merge the other cluster(s) into this one. This assumes that the merge makes sense.
283
- In general, we should use try_merge or try_merge_group instead.
284
- """
285
- # merge the other cluster's content, inputs and outputs
286
- if isinstance(other, Cluster):
287
- self.content.update(other.content)
288
- self.inputs.update(other.inputs)
289
- self.outputs.update(other.outputs)
290
- # update dependencies, ensuring we remove the other from the self
291
- self.dependencies.update(other.dependencies)
292
- self.dependencies.remove(other)
293
- else:
294
- for o in other:
295
- self.content.update(o.content)
296
- self.inputs.update(o.inputs)
297
- self.outputs.update(o.outputs)
298
- self.dependencies.update(o.dependencies)
299
- self.dependencies.remove(o)
300
-
301
-
302
- class DependencyAnalysis(visitor.Visitor):
303
- """
304
- A visitor to perform dependency analysis in logicals and store the result in a
305
- DependencyInfo object.
306
-
307
- The dependency analysis is performed for Logical nodes in 3 steps:
308
-
309
- 1. form clusters of children that are mutually dependent, because they are binders (like
310
- lookups and aggregates) that have variables in common.
311
-
312
- 2. compute dependencies between the clusters based on input and outputs.
313
-
314
- 3. attempt to merge clusters that could form larger clusters.
315
-
316
- Consider the following example, where we are computing dependencies for the numbered nodes:
317
-
318
- Logical
319
- |1| Edges(edges)
320
- |2| i(edges, i)
321
- |3| Logical ⇑[v]
322
- Logical ⇑[j=None]
323
- j(edges, j)
324
- count([edges, j], [i], [v])
325
- |4| i < 10
326
- |5| i < v
327
- |6| Logical ⇑[v_2=None]
328
- max([i], [], [v, v_2])
329
- |7| → output[i](v, v_2 as 'v2')
330
-
331
- In step 1., we merge (1,2,4) because they have `edges` and `i` in common, but nothing
332
- else. In particular, (5) is not merged as it also depends on v.
333
-
334
- In step 2. we compute dependencies:
335
- (1,2,4)
336
- (3) -> (1,2,4)
337
- (5) -> (1,2,4), (3)
338
- (6) -> (1,2,4), (3), (5)
339
- (7) -> (1,2,4), (3), (5), (6)
340
-
341
- For this example, step 3. does not change anything.
342
-
343
- This result can be interpreted as, in order to compute task 6, tasks (1,2,4), (3) and (5)
344
- must hold. This means that a compiler pass that extracts the logical in task 6 into its
345
- own top-level logical must bring these dependencies together.
346
-
347
- To illustrate the need for step 3, consider this example:
348
-
349
- Logical
350
- |1| Edge(edge)
351
- |2| i(edge, i)
352
- |3| Edge(edge_2)
353
- |4| j(edge_2, j)
354
- |5| i = j
355
- |6| Logical ⇑[res=None]
356
- .....
357
- |7| → output[edge, j, i](i, res)
358
-
359
- The result of step 2 is the following:
360
- (1,2)
361
- (3,4)
362
- (5) -> (1,2), (3,4)
363
- (6) -> (1,2), (3,4), (5)
364
- (7) -> (1,2), (3,4), (5), (6)
365
-
366
- Step 3 observes that task (5) is a bridge between (1,2) and (3,4), so that merging those
367
- 3 clusters together yields a consistent cluster. So the result is:
368
-
369
- (1,2,3,4,5)
370
- (6) -> (1,2,3,4,5)
371
- (7) -> (1,2,3,4,5), (6)
372
-
373
- """
374
- def __init__(self, info: DependencyInfo):
375
- self.info = info
376
-
377
-
378
- def enter(self, node: ir.Node, parent: Optional[ir.Node]=None):
379
- # keep track of parents of all nodes
380
- if parent and isinstance(parent, ir.Task):
381
- self.info.parent[node.id] = parent
382
- return super().enter(node, parent)
383
-
384
-
385
- def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
386
- # quick check to see if it's worth it computing clusters at all
387
- some_child_has_bindings = False
388
- for child in node.body:
389
- if child.id in self.info.input_bindings or child.id in self.info.output_bindings:
390
- some_child_has_bindings = True
391
- break
392
-
393
- if some_child_has_bindings:
394
- # print(ir.node_to_string(node, print_ids=True))
395
- # compute clusters for the nodes based on inputs/outputs and shared variables
396
- clusters = self.compute_clusters(node)
397
- # compute the dependencies between those clusters
398
- self.compute_dependencies(clusters)
399
- # attempt to further merge clusters
400
- self.merge_clusters(clusters)
401
- # index the clusters by tasks participating in those clusters, and record it
402
- self.index(clusters)
403
- # self._print_debug_info(node, clusters)
404
-
405
- return super().visit_logical(node, parent)
406
-
407
-
408
- def compute_clusters(self, task: ir.Logical) -> list[Cluster]:
409
- """
410
- Cluster the children of the logical, storing together children that are mutually
411
- dependent.
412
- """
413
- # create initial clusters
414
- clusters:list[Cluster] = [Cluster(self.info, child) for child in task.body]
415
-
416
- # all hoisted vars of children, used to ensure we don't merge clusters that depend
417
- # on a variable hoisted by a composite
418
- hoisted_vars = ordered_set()
419
- for child in task.body:
420
- if isinstance(child, helpers.COMPOSITES):
421
- hoisted_vars.update(helpers.hoisted_vars(child.hoisted))
422
-
423
- # iterate clustering until nothing changes
424
- merging = True
425
- while merging:
426
- merging = False
427
- cs = list(clusters)
428
- while cs:
429
- # last c1 merged some c2s, so cs was modified, restart
430
- if merging:
431
- break
432
- c1 = cs.pop()
433
- for c2 in cs:
434
- if c1 is c2:
435
- continue
436
- if c1.try_merge(c2, hoisted_vars):
437
- clusters.remove(c2)
438
- merging = True
439
- return clusters
440
-
441
-
442
- def compute_dependencies(self, clusters: list[Cluster]):
443
- """
444
- Traverse the clusters finding dependencies between them, based on input and output
445
- variables used by tasks within the clusters.
446
- """
447
- def has_dependency(c1: Cluster, c2: Cluster):
448
- # c2 is a required cluster, everything depends no it
449
- if c2.required:
450
- return True
451
- # if c1 has an effect and c2 is mergeable (basically it contains only binders)
452
- # then c2 behaves like a filter, so c1 must depend on it, even if it does not
453
- # have variables in common (this may bring other dependencies).
454
- if c1.effectful and c2.mergeable:
455
- return True
456
- # if c1 has an effect and c2 is a composite without hoisted variables or with a
457
- # hoisted variable that does not have a default (it is a plain var), then c2
458
- # behaves like a filter and c1 depends on it.
459
- if c1.effectful and c2.composite:
460
- task = c2.content.some()
461
- assert(isinstance(task, helpers.COMPOSITES))
462
- if not task.hoisted:
463
- return True
464
- for h in task.hoisted:
465
- if isinstance(h, ir.Var): # no default
466
- return True
467
-
468
- # if c1 is a composite and c2 binds its hoisted vars, c1 can't depend on c2
469
- # (dependency is the other way around)
470
- if c1.composite and c1.outputs:
471
- for v in c1.outputs:
472
- if c2.outputs and v in c2.outputs:
473
- return False
474
- if c2.inputs and v in c2.inputs:
475
- return False
476
-
477
- # c1 does not depend on c2 if one of its output vars is an input to c2
478
- # (dependency is the other way around)
479
- if (c1.outputs and c2.inputs):
480
- # optimization for any([v in c2.inputs for v in c1_outputs])):
481
- for v in c1.outputs:
482
- if v in c2.inputs:
483
- return False
484
-
485
- # c1 depends on c2 if one of its input vars is an output of c2
486
- if (c1.inputs and c2.outputs):
487
- # optimization for any([v in c2.outputs for v in c1_inputs])):
488
- for v in c1.inputs:
489
- if v in c2.outputs:
490
- return True
491
-
492
- # c1 is a composite with hoisted variables; it depends on c2 if c2 is a
493
- # composite that does not have hoisted vars, hence behaving like a filter.
494
- if c1.composite and c2.composite:
495
- c1task = c1.content.some()
496
- assert(isinstance(c1task, helpers.COMPOSITES))
497
- if c1task.hoisted:
498
- c2task = c2.content.some()
499
- assert(isinstance(c2task, helpers.COMPOSITES))
500
- if not c2task.hoisted:
501
- return True
502
- return False
503
-
504
- cs = list(clusters)
505
- while cs:
506
- c1 = cs.pop()
507
- for c2 in cs:
508
- if c1 is c2:
509
- continue
510
-
511
- if has_dependency(c1, c2):
512
- c1.depends_on(c2)
513
- if has_dependency(c2, c1):
514
- c2.depends_on(c1)
515
-
516
-
517
- def merge_clusters(self, clusters: list[Cluster]):
518
- """
519
- Traverse clusters trying to merge multiple clusters if they together form a larger
520
- cluster.
521
- """
522
- # iterate clustering until nothing changes
523
- merging = True
524
- while merging:
525
- merging = False
526
- cs = list(clusters)
527
- while cs:
528
- if merging:
529
- break
530
- c = cs.pop()
531
- if c.dependencies and c.mergeable:
532
- deps = list(c.dependencies)
533
- if c.try_merge_group(deps):
534
- # remove the deps from clusters
535
- for d in deps:
536
- clusters.remove(d)
537
- # rewire other clusters to the new node
538
- # this is not very efficient but should not happen often
539
- for c2 in clusters:
540
- if c2 is not c:
541
- for d in deps:
542
- if d in c2.dependencies:
543
- c2.dependencies.add(c)
544
- c2.dependencies.remove(d)
545
- merging = True
546
-
547
-
548
- def index(self, clusters: list[Cluster]):
549
- """
550
- Index clusters by task, and record in the info
551
- """
552
- for dep_node in clusters:
553
- for n in dep_node.content:
554
- self.info.dependency_clusters[n.id] = dep_node
555
-
556
-
557
- def _print_debug_info(self, node, clusters: list[Cluster]):
558
- # print(ir.node_to_string(node, print_ids=True))
559
- print("dependencies")
560
- for dep_node in clusters:
561
- k = ','.join(str(x.id) for x in dep_node.content)
562
- print(f"({k}) ->")
563
- for v in dep_node.dependencies:
564
- v = ','.join(str(x.id) for x in v.content)
565
- print(f" ({v})")
566
- print()
567
- print("clusters")
568
- for c in clusters:
569
- print(f"{c}")
570
- if c.inputs:
571
- print(f" inputs: {','.join(str(v.name) for v in c.inputs)}")
572
- if c.outputs:
573
- print(f" outputs: {','.join(str(v.name) for v in c.outputs)}")
574
- print()
575
-
576
-
577
-
578
- class BindingAnalysis(visitor.Visitor):
579
- """
580
- Visitor to perform binding analysis, i.e. figure out for each task in the tree, which
581
- variables it binds as input ad output.
582
- """
583
- def __init__(self):
584
- self.info = DependencyInfo()
585
- # a stack of variables grounded by the last logical being visited
586
- self._grounded: list[OrderedSet[ir.Var]] = []
587
-
588
-
589
- def input(self, key: ir.Task, val: Optional[ir.Var|Iterable[ir.Var]]):
590
- """ Assert that this task binds this variable(s) as input. """
591
- self._register(self.info.input_bindings, key, val)
592
-
593
-
594
- def output(self, key: ir.Task, val: Optional[ir.Var|Iterable[ir.Var]]):
595
- """ Assert that this task binds this variable(s) as output. """
596
- self._register(self.info.output_bindings, key, val)
597
-
598
-
599
- def _register(self, map, key: ir.Task, val: Optional[ir.Var|Iterable[ir.Var]]):
600
- """ Register key.id -> val in this map, assuming the map holds ordered sets of vals. """
601
- if val is None or (isinstance(val, Iterable) and not val):
602
- return
603
- if key.id not in map:
604
- map[key.id] = ordered_set()
605
- if isinstance(val, Iterable):
606
- for v in val:
607
- map[key.id].add(v)
608
- else:
609
- map[key.id].add(val)
610
-
611
-
612
- #
613
- # Composite tasks
614
- #
615
- def visit_logical(self, node: ir.Logical, parent: Optional[ir.Node]):
616
- # compute variables grounded by children of this logical
617
- grounds = ordered_set()
618
- grounded_by_ancestors = None
619
- if self._grounded:
620
- # grounded variables inherited from ancestors or siblings
621
- grounded_by_ancestors = self._grounded[-1]
622
- grounds.update(grounded_by_ancestors)
623
-
624
- potentially_grounded = ordered_set()
625
- for child in node.body:
626
- # leaf constructs that ground variables
627
- if isinstance(child, ir.Lookup):
628
- # special case eq because it can be input or output
629
- # TODO: this is similar to what's done below in visit_lookup, modularize
630
- if builtins.is_eq(child.relation):
631
- x, y = child.args[0], child.args[1]
632
- # Compute input/output vars of the equality
633
- if isinstance(x, ir.Var) and not isinstance(y, ir.Var):
634
- # Variable x is potentially grounded by other expressions at
635
- # level in the Logical. If it is, then we should mark it as
636
- # input (which is done later).
637
- potentially_grounded.add((child, x, x))
638
- elif not isinstance(x, ir.Var) and isinstance(y, ir.Var):
639
- potentially_grounded.add((child, y, y))
640
- elif isinstance(x, ir.Var) and isinstance(y, ir.Var):
641
- # mark as potentially grounded, if any is grounded in other atoms then we later ground both
642
- potentially_grounded.add((child, x, y))
643
- else:
644
- # grounds only outputs
645
- for idx, f in enumerate(child.relation.fields):
646
- arg = child.args[idx]
647
- if not f.input and isinstance(arg, ir.Var):
648
- grounds.add(arg)
649
- elif isinstance(child, ir.Data):
650
- # grounds all vars
651
- grounds.update(child.vars)
652
- elif isinstance(child, ir.Aggregate):
653
- # grounds output args
654
- for idx, f in enumerate(child.aggregation.fields):
655
- arg = child.args[idx]
656
- if not f.input and isinstance(arg, ir.Var):
657
- grounds.add(arg)
658
- elif isinstance(child, ir.Rank):
659
- # grounds the info
660
- grounds.add(child.result)
661
- elif isinstance(child, ir.Construct):
662
- # grounds the output var
663
- grounds.add(child.id_var)
664
-
665
- # add child hoisted vars to grounded so that they can be picked up by the children
666
- for child in node.body:
667
- if isinstance(child, helpers.COMPOSITES):
668
- grounds.update(helpers.hoisted_vars(child.hoisted))
669
-
670
- # equalities where both sides are already grounded mean that both sides are input
671
- for child, x, y in potentially_grounded:
672
- if x in grounds and y in grounds:
673
- self.input(child, x)
674
- self.input(child, y)
675
-
676
- # deal with potentially grounded vars up to a fixpoint
677
- changed = True
678
- while changed:
679
- changed = False
680
- for child, x, y in potentially_grounded:
681
- if x in grounds and y not in grounds:
682
- self.input(child, x)
683
- self.output(child, y)
684
- grounds.add(y)
685
- changed = True
686
- elif y in grounds and x not in grounds:
687
- self.input(child, y)
688
- self.output(child, x)
689
- grounds.add(x)
690
- changed = True
691
-
692
- # now visit the children
693
- self._grounded.append(grounds)
694
- super().visit_logical(node, parent)
695
- self._grounded.pop()
696
-
697
- hoisted_vars = helpers.hoisted_vars(node.hoisted)
698
- if grounded_by_ancestors:
699
- # inputs to this logical: grounded by ancestor while being used by a child,
700
- # excluding variables hoisted by the logical
701
- vars = helpers.collect_vars(node)
702
- self.input(node, (grounded_by_ancestors & vars) - hoisted_vars)
703
-
704
- # outputs are vars declared as hoisted
705
- self.output(node, hoisted_vars)
706
-
707
-
708
- def visit_union(self, node: ir.Union, parent: Optional[ir.Node]):
709
- # visit children first
710
- super().visit_union(node, parent)
711
-
712
- # inputs taken from all children
713
- for child in node.tasks:
714
- self.input(node, self.info.task_inputs(child))
715
- # outputs are vars declared as hoisted
716
- self.output(node, helpers.hoisted_vars(node.hoisted))
717
-
718
-
719
- def visit_match(self, node: ir.Match, parent: Optional[ir.Node]):
720
- # visit children first
721
- super().visit_match(node, parent)
722
-
723
- # inputs taken from all children
724
- for child in node.tasks:
725
- self.input(node, self.info.task_inputs(child))
726
- # outputs are vars declared as hoisted
727
- self.output(node, helpers.hoisted_vars(node.hoisted))
728
-
729
-
730
- def visit_require(self, node: ir.Require, parent: Optional[ir.Node]):
731
- # visit children first
732
- super().visit_require(node, parent)
733
-
734
- # inputs taken from the domain and all check tasks
735
- self.input(node, self.info.task_inputs(node.domain))
736
- for check in node.checks:
737
- self.input(node, self.info.task_inputs(check.check))
738
-
739
-
740
- #
741
- # Logical tasks
742
- #
743
- def visit_not(self, node: ir.Not, parent: Optional[ir.Node]):
744
- # visit children first
745
- super().visit_not(node, parent)
746
-
747
- # not gets the inputs from its child
748
- self.input(node, self.info.task_inputs(node.task))
749
-
750
-
751
- def visit_exists(self, node: ir.Exists, parent: Optional[ir.Node]):
752
- # visit children first
753
- super().visit_exists(node, parent)
754
-
755
- # exists variables are local, so they are ignored
756
- self.input(node, self.info.task_inputs(node.task))
757
-
758
-
759
- #
760
- # Leaf tasks
761
- #
762
- def visit_data(self, node: ir.Data, parent: Optional[ir.Node]):
763
- # data outputs all its variables
764
- for v in helpers.vars(node.vars):
765
- self.output(node, v)
766
-
767
- return super().visit_data(node, parent)
768
-
769
-
770
- def visit_update(self, node: ir.Update, parent: Optional[ir.Node]):
771
- # register variables being used as arguments to the update, it's always considered an input
772
- for v in helpers.vars(node.args):
773
- self.input(node, v)
774
- return super().visit_update(node, parent)
775
-
776
-
777
- def visit_lookup(self, node: ir.Lookup, parent: Optional[ir.Node]):
778
- def register(node, field, arg):
779
- if isinstance(arg, ir.Var):
780
- if field.input:
781
- self.input(node, arg)
782
- else:
783
- self.output(node, arg)
784
-
785
- if builtins.is_eq(node.relation):
786
- # Most cases are covered already at the parent level if the equality is part of
787
- # a Logical. The remaining cases are when the equality is a child of a
788
- # non-Logical, or if its variables are not ground elsewhere in the Logical.
789
- if self.info.task_inputs(node) or self.info.task_outputs(node):
790
- # already covered
791
- pass
792
- else:
793
- x, y = node.args[0], node.args[1]
794
- grounds = self._grounded[-1] if self._grounded else ordered_set()
795
- if isinstance(x, ir.Var):
796
- if x in grounds:
797
- self.input(node, x)
798
- else:
799
- self.output(node, x)
800
- if isinstance(y, ir.Var):
801
- if y in grounds:
802
- self.input(node, y)
803
- else:
804
- self.output(node, y)
805
- else:
806
- # register variables depending on the input flag of the relation bound to the lookup
807
- for idx, f in enumerate(node.relation.fields):
808
- arg = node.args[idx]
809
- if isinstance(arg, Iterable):
810
- # deal with ListType fields that pack arguments in a tuple
811
- for element in arg:
812
- register(node, f, element)
813
- else:
814
- register(node, f, arg)
815
- return super().visit_lookup(node, parent)
816
-
817
-
818
- def visit_output(self, node: ir.Output, parent: Optional[ir.Node]):
819
- # register variables being output, they always considered an input to the task
820
- for v in helpers.output_vars(node.aliases):
821
- self.input(node, v)
822
- # also register keys as inputs
823
- self.input(node, node.keys)
824
- return super().visit_output(node, parent)
825
-
826
-
827
- def visit_construct(self, node: ir.Construct, parent: Optional[ir.Node]):
828
- # values are inputs, id_var is an output
829
- for v in helpers.vars(node.values):
830
- self.input(node, v)
831
- self.output(node, node.id_var)
832
-
833
-
834
- def visit_aggregate(self, node: ir.Aggregate, parent: Optional[ir.Node]):
835
- # register projection and group as inputs
836
- for v in node.projection:
837
- self.input(node, v)
838
- for v in node.group:
839
- self.input(node, v)
840
-
841
- # register variables depending on the input flag of the aggregation relation
842
- for idx, f in enumerate(node.aggregation.fields):
843
- arg = node.args[idx]
844
- if isinstance(arg, ir.Var):
845
- if f.input:
846
- self.input(node, arg)
847
- else:
848
- self.output(node, arg)
849
- return super().visit_aggregate(node, parent)
850
-
851
-
852
- def visit_rank(self, node: ir.Rank, parent: Optional[ir.Node]):
853
- # register projection and group as inputs
854
- for v in node.projection:
855
- self.input(node, v)
856
- for v in node.group:
857
- self.input(node, v)
858
- for v in node.args:
859
- self.input(node, v)
860
-
861
- self.output(node, node.result)
862
- return super().visit_rank(node, parent)