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