kumi 0.0.18 → 0.0.20

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 (676) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +27 -0
  5. data/CLAUDE.md +26 -139
  6. data/README.md +143 -372
  7. data/data/functions/agg/boolean.yaml +14 -0
  8. data/data/functions/agg/numeric.yaml +80 -0
  9. data/data/functions/agg/string.yaml +8 -0
  10. data/data/functions/core/arithmetic.yaml +50 -0
  11. data/data/functions/core/boolean.yaml +18 -0
  12. data/data/functions/core/comparison.yaml +42 -0
  13. data/data/functions/core/constructor.yaml +32 -0
  14. data/data/functions/core/select.yaml +7 -0
  15. data/data/functions/core/stencil.yaml +21 -0
  16. data/data/functions/core/string.yaml +19 -0
  17. data/data/kernels/javascript/agg/boolean.yaml +12 -0
  18. data/data/kernels/javascript/agg/numeric.yaml +27 -0
  19. data/data/kernels/javascript/agg/string.yaml +5 -0
  20. data/data/kernels/javascript/core/arithmetic.yaml +32 -0
  21. data/data/kernels/javascript/core/boolean.yaml +12 -0
  22. data/data/kernels/javascript/core/comparison.yaml +24 -0
  23. data/data/kernels/javascript/core/constructor.yaml +15 -0
  24. data/data/kernels/javascript/core/select.yaml +7 -0
  25. data/data/kernels/javascript/core/string.yaml +12 -0
  26. data/data/kernels/ruby/agg/boolean.yaml +18 -0
  27. data/data/kernels/ruby/agg/numeric.yaml +29 -0
  28. data/data/kernels/ruby/agg/string.yaml +5 -0
  29. data/data/kernels/ruby/core/arithmetic.yaml +38 -0
  30. data/data/kernels/ruby/core/boolean.yaml +15 -0
  31. data/data/kernels/ruby/core/comparison.yaml +30 -0
  32. data/data/kernels/ruby/core/constructor.yaml +17 -0
  33. data/data/kernels/ruby/core/select.yaml +4 -0
  34. data/data/kernels/ruby/core/string.yaml +15 -0
  35. data/debug_ordering.rb +52 -0
  36. data/docs/FORM_SCHEMA.md +85 -0
  37. data/docs/OUTPUT_SCHEMA.md +69 -0
  38. data/docs/SYNTAX.md +626 -373
  39. data/golden/array_element/expected/ast.txt +21 -0
  40. data/golden/array_element/expected/input_plan.txt +5 -0
  41. data/golden/array_element/expected/lir_00_unoptimized.txt +13 -0
  42. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +13 -0
  43. data/golden/array_element/expected/lir_02_inlined.txt +13 -0
  44. data/golden/array_element/expected/lir_03_cse.txt +13 -0
  45. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +13 -0
  46. data/golden/array_element/expected/lir_04_loop_invcm.txt +13 -0
  47. data/golden/array_element/expected/lir_06_const_prop.txt +13 -0
  48. data/golden/array_element/expected/nast.txt +7 -0
  49. data/golden/array_element/expected/schema_javascript.mjs +13 -0
  50. data/golden/array_element/expected/schema_ruby.rb +41 -0
  51. data/golden/array_element/expected/snast.txt +7 -0
  52. data/golden/array_element/expected.json +5 -0
  53. data/golden/array_element/input.json +9 -0
  54. data/golden/array_element/schema.kumi +11 -0
  55. data/golden/array_index/expected/ast.txt +59 -0
  56. data/golden/array_index/expected/input_plan.txt +5 -0
  57. data/golden/array_index/expected/lir_00_unoptimized.txt +41 -0
  58. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +41 -0
  59. data/golden/array_index/expected/lir_02_inlined.txt +42 -0
  60. data/golden/array_index/expected/lir_03_cse.txt +40 -0
  61. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +40 -0
  62. data/golden/array_index/expected/lir_04_loop_invcm.txt +40 -0
  63. data/golden/array_index/expected/lir_06_const_prop.txt +40 -0
  64. data/golden/array_index/expected/nast.txt +33 -0
  65. data/golden/array_index/expected/schema_javascript.mjs +46 -0
  66. data/golden/array_index/expected/schema_ruby.rb +75 -0
  67. data/golden/array_index/expected/snast.txt +33 -0
  68. data/golden/array_index/expected.json +5 -0
  69. data/golden/array_index/input.json +1 -0
  70. data/golden/array_index/schema.kumi +19 -0
  71. data/golden/array_operations/expected/ast.txt +50 -0
  72. data/golden/array_operations/expected/input_plan.txt +10 -0
  73. data/golden/array_operations/expected/lir_00_unoptimized.txt +47 -0
  74. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +47 -0
  75. data/golden/array_operations/expected/lir_02_inlined.txt +47 -0
  76. data/golden/array_operations/expected/lir_03_cse.txt +47 -0
  77. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +47 -0
  78. data/golden/array_operations/expected/lir_04_loop_invcm.txt +47 -0
  79. data/golden/array_operations/expected/lir_06_const_prop.txt +47 -0
  80. data/golden/array_operations/expected/nast.txt +32 -0
  81. data/golden/array_operations/expected/schema_javascript.mjs +60 -0
  82. data/golden/array_operations/expected/schema_ruby.rb +91 -0
  83. data/golden/array_operations/expected/snast.txt +32 -0
  84. data/golden/array_operations/expected.json +27 -0
  85. data/golden/array_operations/input.json +8 -0
  86. data/golden/array_operations/schema.kumi +12 -10
  87. data/golden/cascade_logic/expected/ast.txt +37 -0
  88. data/golden/cascade_logic/expected/input_plan.txt +2 -0
  89. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +29 -0
  90. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +29 -0
  91. data/golden/cascade_logic/expected/lir_02_inlined.txt +37 -0
  92. data/golden/cascade_logic/expected/lir_03_cse.txt +30 -0
  93. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +30 -0
  94. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +30 -0
  95. data/golden/cascade_logic/expected/lir_06_const_prop.txt +30 -0
  96. data/golden/cascade_logic/expected/nast.txt +32 -0
  97. data/golden/cascade_logic/expected/schema_javascript.mjs +31 -0
  98. data/golden/cascade_logic/expected/schema_ruby.rb +57 -0
  99. data/golden/cascade_logic/expected/snast.txt +32 -0
  100. data/golden/cascade_logic/expected.json +5 -0
  101. data/golden/cascade_logic/input.json +4 -0
  102. data/golden/cascade_logic/schema.kumi +1 -3
  103. data/golden/chained_fusion/expected/ast.txt +57 -0
  104. data/golden/chained_fusion/expected/input_plan.txt +13 -0
  105. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +76 -0
  106. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +76 -0
  107. data/golden/chained_fusion/expected/lir_02_inlined.txt +114 -0
  108. data/golden/chained_fusion/expected/lir_03_cse.txt +97 -0
  109. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +99 -0
  110. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +97 -0
  111. data/golden/chained_fusion/expected/lir_06_const_prop.txt +97 -0
  112. data/golden/chained_fusion/expected/nast.txt +55 -0
  113. data/golden/chained_fusion/expected/schema_javascript.mjs +116 -0
  114. data/golden/chained_fusion/expected/schema_ruby.rb +149 -0
  115. data/golden/chained_fusion/expected/snast.txt +55 -0
  116. data/golden/chained_fusion/expected.json +45 -0
  117. data/golden/chained_fusion/input.json +51 -0
  118. data/golden/chained_fusion/schema.kumi +52 -0
  119. data/golden/element_arrays/expected/ast.txt +55 -0
  120. data/golden/element_arrays/expected/input_plan.txt +7 -0
  121. data/golden/element_arrays/expected/lir_00_unoptimized.txt +81 -0
  122. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +81 -0
  123. data/golden/element_arrays/expected/lir_02_inlined.txt +85 -0
  124. data/golden/element_arrays/expected/lir_03_cse.txt +83 -0
  125. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +83 -0
  126. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +83 -0
  127. data/golden/element_arrays/expected/lir_06_const_prop.txt +83 -0
  128. data/golden/element_arrays/expected/nast.txt +42 -0
  129. data/golden/element_arrays/expected/schema_javascript.mjs +106 -0
  130. data/golden/element_arrays/expected/schema_ruby.rb +141 -0
  131. data/golden/element_arrays/expected/snast.txt +42 -0
  132. data/golden/element_arrays/expected.json +55 -0
  133. data/golden/element_arrays/input.json +12 -0
  134. data/golden/element_arrays/schema.kumi +21 -0
  135. data/golden/empty_and_null_inputs/expected/ast.txt +42 -0
  136. data/golden/empty_and_null_inputs/expected/input_plan.txt +12 -0
  137. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +31 -0
  138. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +31 -0
  139. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +51 -0
  140. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +49 -0
  141. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +49 -0
  142. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +49 -0
  143. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +49 -0
  144. data/golden/empty_and_null_inputs/expected/nast.txt +18 -0
  145. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +47 -0
  146. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +79 -0
  147. data/golden/empty_and_null_inputs/expected/snast.txt +18 -0
  148. data/golden/empty_and_null_inputs/expected.json +8 -0
  149. data/golden/empty_and_null_inputs/input.json +16 -0
  150. data/golden/empty_and_null_inputs/schema.kumi +30 -0
  151. data/golden/game_of_life/expected/ast.txt +118 -0
  152. data/golden/game_of_life/expected/input_plan.txt +5 -0
  153. data/golden/game_of_life/expected/lir_00_unoptimized.txt +343 -0
  154. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +343 -0
  155. data/golden/game_of_life/expected/lir_02_inlined.txt +1918 -0
  156. data/golden/game_of_life/expected/lir_03_cse.txt +766 -0
  157. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +766 -0
  158. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +766 -0
  159. data/golden/game_of_life/expected/lir_06_const_prop.txt +766 -0
  160. data/golden/game_of_life/expected/nast.txt +104 -0
  161. data/golden/game_of_life/expected/schema_javascript.mjs +98 -0
  162. data/golden/game_of_life/expected/schema_ruby.rb +125 -0
  163. data/golden/game_of_life/expected/snast.txt +104 -0
  164. data/golden/game_of_life/expected.json +3 -0
  165. data/golden/game_of_life/input.json +8 -0
  166. data/golden/game_of_life/schema.kumi +33 -0
  167. data/golden/hash_keys/expected/ast.txt +29 -0
  168. data/golden/hash_keys/expected/input_plan.txt +2 -0
  169. data/golden/hash_keys/expected/lir_00_unoptimized.txt +18 -0
  170. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +18 -0
  171. data/golden/hash_keys/expected/lir_02_inlined.txt +18 -0
  172. data/golden/hash_keys/expected/lir_03_cse.txt +18 -0
  173. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +18 -0
  174. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +18 -0
  175. data/golden/hash_keys/expected/lir_06_const_prop.txt +18 -0
  176. data/golden/hash_keys/expected/nast.txt +46 -0
  177. data/golden/hash_keys/expected/schema_javascript.mjs +34 -0
  178. data/golden/hash_keys/expected/schema_ruby.rb +61 -0
  179. data/golden/hash_keys/expected/snast.txt +46 -0
  180. data/golden/hash_keys/expected.json +20 -0
  181. data/golden/hash_keys/input.json +4 -0
  182. data/golden/hash_keys/schema.kumi +14 -0
  183. data/golden/hash_value/expected/ast.txt +37 -0
  184. data/golden/hash_value/expected/input_plan.txt +7 -0
  185. data/golden/hash_value/expected/lir_00_unoptimized.txt +30 -0
  186. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +30 -0
  187. data/golden/hash_value/expected/lir_02_inlined.txt +36 -0
  188. data/golden/hash_value/expected/lir_03_cse.txt +33 -0
  189. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +33 -0
  190. data/golden/hash_value/expected/lir_04_loop_invcm.txt +33 -0
  191. data/golden/hash_value/expected/lir_06_const_prop.txt +33 -0
  192. data/golden/hash_value/expected/nast.txt +25 -0
  193. data/golden/hash_value/expected/schema_javascript.mjs +46 -0
  194. data/golden/hash_value/expected/schema_ruby.rb +75 -0
  195. data/golden/hash_value/expected/snast.txt +25 -0
  196. data/golden/hash_value/expected.json +19 -0
  197. data/golden/hash_value/input.json +12 -0
  198. data/golden/hash_value/schema.kumi +19 -0
  199. data/golden/hierarchical_complex/expected/ast.txt +85 -0
  200. data/golden/hierarchical_complex/expected/input_plan.txt +23 -0
  201. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +87 -0
  202. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +87 -0
  203. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +115 -0
  204. data/golden/hierarchical_complex/expected/lir_03_cse.txt +89 -0
  205. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +89 -0
  206. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +89 -0
  207. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +89 -0
  208. data/golden/hierarchical_complex/expected/nast.txt +49 -0
  209. data/golden/hierarchical_complex/expected/schema_javascript.mjs +121 -0
  210. data/golden/hierarchical_complex/expected/schema_ruby.rb +151 -0
  211. data/golden/hierarchical_complex/expected/snast.txt +49 -0
  212. data/golden/hierarchical_complex/expected.json +34 -0
  213. data/golden/hierarchical_complex/input.json +26 -0
  214. data/golden/hierarchical_complex/schema.kumi +38 -0
  215. data/golden/input_reference/expected/ast.txt +46 -0
  216. data/golden/input_reference/expected/input_plan.txt +15 -0
  217. data/golden/input_reference/expected/lir_00_unoptimized.txt +39 -0
  218. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +39 -0
  219. data/golden/input_reference/expected/lir_02_inlined.txt +39 -0
  220. data/golden/input_reference/expected/lir_03_cse.txt +39 -0
  221. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +39 -0
  222. data/golden/input_reference/expected/lir_04_loop_invcm.txt +39 -0
  223. data/golden/input_reference/expected/lir_06_const_prop.txt +39 -0
  224. data/golden/input_reference/expected/nast.txt +21 -0
  225. data/golden/input_reference/expected/schema_javascript.mjs +45 -0
  226. data/golden/input_reference/expected/schema_ruby.rb +74 -0
  227. data/golden/input_reference/expected/snast.txt +21 -0
  228. data/golden/input_reference/expected.json +7 -0
  229. data/golden/input_reference/input.json +11 -0
  230. data/golden/input_reference/schema.kumi +22 -0
  231. data/golden/interleaved_fusion/expected/ast.txt +51 -0
  232. data/golden/interleaved_fusion/expected/input_plan.txt +13 -0
  233. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +53 -0
  234. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +53 -0
  235. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +89 -0
  236. data/golden/interleaved_fusion/expected/lir_03_cse.txt +77 -0
  237. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +77 -0
  238. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +77 -0
  239. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +77 -0
  240. data/golden/interleaved_fusion/expected/nast.txt +41 -0
  241. data/golden/interleaved_fusion/expected/schema_javascript.mjs +86 -0
  242. data/golden/interleaved_fusion/expected/schema_ruby.rb +122 -0
  243. data/golden/interleaved_fusion/expected/snast.txt +41 -0
  244. data/golden/interleaved_fusion/expected.json +37 -0
  245. data/golden/interleaved_fusion/input.json +26 -0
  246. data/golden/interleaved_fusion/schema.kumi +57 -0
  247. data/golden/let_inline/expected/ast.txt +33 -0
  248. data/golden/let_inline/expected/input_plan.txt +2 -0
  249. data/golden/let_inline/expected/lir_00_unoptimized.txt +26 -0
  250. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +26 -0
  251. data/golden/let_inline/expected/lir_02_inlined.txt +36 -0
  252. data/golden/let_inline/expected/lir_03_cse.txt +30 -0
  253. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +30 -0
  254. data/golden/let_inline/expected/lir_04_loop_invcm.txt +30 -0
  255. data/golden/let_inline/expected/lir_06_const_prop.txt +30 -0
  256. data/golden/let_inline/expected/nast.txt +26 -0
  257. data/golden/let_inline/expected/schema_javascript.mjs +11 -0
  258. data/golden/let_inline/expected/schema_ruby.rb +37 -0
  259. data/golden/let_inline/expected/snast.txt +26 -0
  260. data/golden/let_inline/expected.json +1 -0
  261. data/golden/let_inline/input.json +1 -0
  262. data/golden/let_inline/schema.kumi +11 -0
  263. data/golden/loop_fusion/expected/ast.txt +44 -0
  264. data/golden/loop_fusion/expected/input_plan.txt +13 -0
  265. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +43 -0
  266. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +43 -0
  267. data/golden/loop_fusion/expected/lir_02_inlined.txt +62 -0
  268. data/golden/loop_fusion/expected/lir_03_cse.txt +57 -0
  269. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +57 -0
  270. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +57 -0
  271. data/golden/loop_fusion/expected/lir_06_const_prop.txt +57 -0
  272. data/golden/loop_fusion/expected/nast.txt +32 -0
  273. data/golden/loop_fusion/expected/schema_javascript.mjs +64 -0
  274. data/golden/loop_fusion/expected/schema_ruby.rb +97 -0
  275. data/golden/loop_fusion/expected/snast.txt +32 -0
  276. data/golden/loop_fusion/expected.json +30 -0
  277. data/golden/loop_fusion/input.json +28 -0
  278. data/golden/loop_fusion/schema.kumi +32 -0
  279. data/golden/min_reduce_scope/expected/ast.txt +49 -0
  280. data/golden/min_reduce_scope/expected/input_plan.txt +9 -0
  281. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +59 -0
  282. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +59 -0
  283. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +63 -0
  284. data/golden/min_reduce_scope/expected/lir_03_cse.txt +60 -0
  285. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +60 -0
  286. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +60 -0
  287. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +60 -0
  288. data/golden/min_reduce_scope/expected/nast.txt +29 -0
  289. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -0
  290. data/golden/min_reduce_scope/expected/schema_ruby.rb +99 -0
  291. data/golden/min_reduce_scope/expected/snast.txt +29 -0
  292. data/golden/min_reduce_scope/expected.json +9 -0
  293. data/golden/min_reduce_scope/input.json +18 -0
  294. data/golden/min_reduce_scope/schema.kumi +25 -0
  295. data/golden/mixed_dimensions/expected/ast.txt +54 -0
  296. data/golden/mixed_dimensions/expected/input_plan.txt +15 -0
  297. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +42 -0
  298. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +42 -0
  299. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +48 -0
  300. data/golden/mixed_dimensions/expected/lir_03_cse.txt +48 -0
  301. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +48 -0
  302. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +48 -0
  303. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +48 -0
  304. data/golden/mixed_dimensions/expected/nast.txt +22 -0
  305. data/golden/mixed_dimensions/expected/schema_javascript.mjs +53 -0
  306. data/golden/mixed_dimensions/expected/schema_ruby.rb +84 -0
  307. data/golden/mixed_dimensions/expected/snast.txt +22 -0
  308. data/golden/mixed_dimensions/expected.json +6 -0
  309. data/golden/mixed_dimensions/input.json +22 -0
  310. data/golden/mixed_dimensions/schema.kumi +35 -0
  311. data/golden/multirank_hoisting/expected/ast.txt +72 -0
  312. data/golden/multirank_hoisting/expected/input_plan.txt +18 -0
  313. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +75 -0
  314. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +75 -0
  315. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +126 -0
  316. data/golden/multirank_hoisting/expected/lir_03_cse.txt +109 -0
  317. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +109 -0
  318. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +109 -0
  319. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +109 -0
  320. data/golden/multirank_hoisting/expected/nast.txt +39 -0
  321. data/golden/multirank_hoisting/expected/schema_javascript.mjs +128 -0
  322. data/golden/multirank_hoisting/expected/schema_ruby.rb +162 -0
  323. data/golden/multirank_hoisting/expected/snast.txt +39 -0
  324. data/golden/multirank_hoisting/expected.json +15 -0
  325. data/golden/multirank_hoisting/input.json +19 -0
  326. data/golden/multirank_hoisting/schema.kumi +38 -0
  327. data/golden/nested_hash/expected/ast.txt +22 -0
  328. data/golden/nested_hash/expected/input_plan.txt +5 -0
  329. data/golden/nested_hash/expected/lir_00_unoptimized.txt +10 -0
  330. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +10 -0
  331. data/golden/nested_hash/expected/lir_02_inlined.txt +10 -0
  332. data/golden/nested_hash/expected/lir_03_cse.txt +10 -0
  333. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +10 -0
  334. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +10 -0
  335. data/golden/nested_hash/expected/lir_06_const_prop.txt +10 -0
  336. data/golden/nested_hash/expected/nast.txt +8 -0
  337. data/golden/nested_hash/expected/schema_javascript.mjs +9 -0
  338. data/golden/nested_hash/expected/schema_ruby.rb +35 -0
  339. data/golden/nested_hash/expected/snast.txt +8 -0
  340. data/golden/nested_hash/expected.json +3 -0
  341. data/golden/nested_hash/input.json +7 -0
  342. data/golden/nested_hash/schema.kumi +11 -0
  343. data/golden/reduction_broadcast/expected/ast.txt +49 -0
  344. data/golden/reduction_broadcast/expected/input_plan.txt +13 -0
  345. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +49 -0
  346. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +49 -0
  347. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +80 -0
  348. data/golden/reduction_broadcast/expected/lir_03_cse.txt +68 -0
  349. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +68 -0
  350. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +68 -0
  351. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +68 -0
  352. data/golden/reduction_broadcast/expected/nast.txt +24 -0
  353. data/golden/reduction_broadcast/expected/schema_javascript.mjs +74 -0
  354. data/golden/reduction_broadcast/expected/schema_ruby.rb +110 -0
  355. data/golden/reduction_broadcast/expected/snast.txt +24 -0
  356. data/golden/reduction_broadcast/expected.json +25 -0
  357. data/golden/reduction_broadcast/input.json +19 -0
  358. data/golden/reduction_broadcast/schema.kumi +34 -0
  359. data/golden/roll/expected/ast.txt +36 -0
  360. data/golden/roll/expected/input_plan.txt +3 -0
  361. data/golden/roll/expected/lir_00_unoptimized.txt +56 -0
  362. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +56 -0
  363. data/golden/roll/expected/lir_02_inlined.txt +56 -0
  364. data/golden/roll/expected/lir_03_cse.txt +55 -0
  365. data/golden/roll/expected/lir_04_1_loop_fusion.txt +55 -0
  366. data/golden/roll/expected/lir_04_loop_invcm.txt +55 -0
  367. data/golden/roll/expected/lir_06_const_prop.txt +55 -0
  368. data/golden/roll/expected/nast.txt +26 -0
  369. data/golden/roll/expected/schema_javascript.mjs +65 -0
  370. data/golden/roll/expected/schema_ruby.rb +95 -0
  371. data/golden/roll/expected/snast.txt +26 -0
  372. data/golden/roll/expected.json +6 -0
  373. data/golden/roll/input.json +1 -0
  374. data/golden/roll/schema.kumi +13 -0
  375. data/golden/shift/expected/ast.txt +48 -0
  376. data/golden/shift/expected/input_plan.txt +3 -0
  377. data/golden/shift/expected/lir_00_unoptimized.txt +96 -0
  378. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +96 -0
  379. data/golden/shift/expected/lir_02_inlined.txt +96 -0
  380. data/golden/shift/expected/lir_03_cse.txt +90 -0
  381. data/golden/shift/expected/lir_04_1_loop_fusion.txt +90 -0
  382. data/golden/shift/expected/lir_04_loop_invcm.txt +90 -0
  383. data/golden/shift/expected/lir_06_const_prop.txt +90 -0
  384. data/golden/shift/expected/nast.txt +38 -0
  385. data/golden/shift/expected/schema_javascript.mjs +106 -0
  386. data/golden/shift/expected/schema_ruby.rb +138 -0
  387. data/golden/shift/expected/snast.txt +38 -0
  388. data/golden/shift/expected.json +8 -0
  389. data/golden/shift/input.json +1 -0
  390. data/golden/shift/schema.kumi +15 -0
  391. data/golden/shift_2d/expected/ast.txt +88 -0
  392. data/golden/shift_2d/expected/input_plan.txt +5 -0
  393. data/golden/shift_2d/expected/lir_00_unoptimized.txt +274 -0
  394. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +274 -0
  395. data/golden/shift_2d/expected/lir_02_inlined.txt +274 -0
  396. data/golden/shift_2d/expected/lir_03_cse.txt +262 -0
  397. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +262 -0
  398. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +262 -0
  399. data/golden/shift_2d/expected/lir_06_const_prop.txt +262 -0
  400. data/golden/shift_2d/expected/nast.txt +74 -0
  401. data/golden/shift_2d/expected/schema_javascript.mjs +320 -0
  402. data/golden/shift_2d/expected/schema_ruby.rb +358 -0
  403. data/golden/shift_2d/expected/snast.txt +74 -0
  404. data/golden/shift_2d/expected.json +15 -0
  405. data/golden/shift_2d/input.json +14 -0
  406. data/golden/shift_2d/schema.kumi +25 -0
  407. data/golden/simple_math/expected/ast.txt +40 -0
  408. data/golden/simple_math/expected/input_plan.txt +2 -0
  409. data/golden/simple_math/expected/lir_00_unoptimized.txt +31 -0
  410. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +31 -0
  411. data/golden/simple_math/expected/lir_02_inlined.txt +31 -0
  412. data/golden/simple_math/expected/lir_03_cse.txt +31 -0
  413. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +31 -0
  414. data/golden/simple_math/expected/lir_04_loop_invcm.txt +31 -0
  415. data/golden/simple_math/expected/lir_06_const_prop.txt +31 -0
  416. data/golden/simple_math/expected/nast.txt +33 -0
  417. data/golden/simple_math/expected/schema_javascript.mjs +33 -0
  418. data/golden/simple_math/expected/schema_ruby.rb +59 -0
  419. data/golden/simple_math/expected/snast.txt +33 -0
  420. data/golden/simple_math/expected.json +1 -0
  421. data/golden/simple_math/input.json +4 -0
  422. data/golden/simple_math/schema.kumi +2 -1
  423. data/golden/streaming_basics/expected/ast.txt +64 -0
  424. data/golden/streaming_basics/expected/input_plan.txt +8 -0
  425. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +73 -0
  426. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +73 -0
  427. data/golden/streaming_basics/expected/lir_02_inlined.txt +100 -0
  428. data/golden/streaming_basics/expected/lir_03_cse.txt +84 -0
  429. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +84 -0
  430. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +84 -0
  431. data/golden/streaming_basics/expected/lir_06_const_prop.txt +84 -0
  432. data/golden/streaming_basics/expected/nast.txt +48 -0
  433. data/golden/streaming_basics/expected/schema_javascript.mjs +94 -0
  434. data/golden/streaming_basics/expected/schema_ruby.rb +127 -0
  435. data/golden/streaming_basics/expected/snast.txt +48 -0
  436. data/golden/streaming_basics/expected.json +10 -0
  437. data/golden/streaming_basics/input.json +8 -0
  438. data/golden/streaming_basics/schema.kumi +24 -0
  439. data/golden/tuples/expected/ast.txt +48 -0
  440. data/golden/tuples/expected/input_plan.txt +1 -0
  441. data/golden/tuples/expected/lir_00_unoptimized.txt +40 -0
  442. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +40 -0
  443. data/golden/tuples/expected/lir_02_inlined.txt +48 -0
  444. data/golden/tuples/expected/lir_03_cse.txt +48 -0
  445. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +48 -0
  446. data/golden/tuples/expected/lir_04_loop_invcm.txt +48 -0
  447. data/golden/tuples/expected/lir_06_const_prop.txt +48 -0
  448. data/golden/tuples/expected/nast.txt +42 -0
  449. data/golden/tuples/expected/schema_javascript.mjs +51 -0
  450. data/golden/tuples/expected/schema_ruby.rb +77 -0
  451. data/golden/tuples/expected/snast.txt +42 -0
  452. data/golden/tuples/expected.json +7 -0
  453. data/golden/tuples/input.json +3 -0
  454. data/golden/tuples/schema.kumi +11 -0
  455. data/golden/tuples_and_arrays/expected/ast.txt +44 -0
  456. data/golden/tuples_and_arrays/expected/input_plan.txt +7 -0
  457. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +41 -0
  458. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +41 -0
  459. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +62 -0
  460. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +51 -0
  461. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +51 -0
  462. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +51 -0
  463. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +51 -0
  464. data/golden/tuples_and_arrays/expected/nast.txt +28 -0
  465. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +58 -0
  466. data/golden/tuples_and_arrays/expected/schema_ruby.rb +88 -0
  467. data/golden/tuples_and_arrays/expected/snast.txt +28 -0
  468. data/golden/tuples_and_arrays/expected.json +18 -0
  469. data/golden/tuples_and_arrays/input.json +7 -0
  470. data/golden/tuples_and_arrays/schema.kumi +38 -0
  471. data/golden/with_constants/expected/ast.txt +28 -0
  472. data/golden/with_constants/expected/input_plan.txt +2 -0
  473. data/golden/with_constants/expected/lir_00_unoptimized.txt +17 -0
  474. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +17 -0
  475. data/golden/with_constants/expected/lir_02_inlined.txt +17 -0
  476. data/golden/with_constants/expected/lir_03_cse.txt +17 -0
  477. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +17 -0
  478. data/golden/with_constants/expected/lir_04_loop_invcm.txt +17 -0
  479. data/golden/with_constants/expected/lir_06_const_prop.txt +17 -0
  480. data/golden/with_constants/expected/nast.txt +21 -0
  481. data/golden/with_constants/expected/schema_javascript.mjs +18 -0
  482. data/golden/with_constants/expected/schema_ruby.rb +44 -0
  483. data/golden/with_constants/expected/snast.txt +15 -0
  484. data/golden/with_constants/schema.kumi +10 -0
  485. data/lib/kumi/analyzer.rb +76 -24
  486. data/lib/kumi/configuration.rb +60 -0
  487. data/lib/kumi/core/analyzer/binder.rb +121 -0
  488. data/lib/kumi/core/analyzer/checkpoint.rb +15 -9
  489. data/lib/kumi/core/analyzer/constant_evaluator.rb +32 -37
  490. data/lib/kumi/core/analyzer/constant_folding_helpers.rb +55 -0
  491. data/lib/kumi/core/analyzer/debug.rb +14 -16
  492. data/lib/kumi/core/analyzer/fn_aliases.rb +46 -0
  493. data/lib/kumi/core/analyzer/folder.rb +94 -0
  494. data/lib/kumi/core/analyzer/macro_expander.rb +69 -0
  495. data/lib/kumi/core/analyzer/passes/assemble_irv2_pass.rb +130 -0
  496. data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +71 -0
  497. data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +181 -0
  498. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +317 -0
  499. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +75 -0
  500. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +103 -0
  501. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +27 -0
  502. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +321 -0
  503. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +85 -0
  504. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +111 -0
  505. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +32 -0
  506. data/lib/kumi/core/analyzer/passes/constant_folding_pass.rb +33 -0
  507. data/lib/kumi/core/analyzer/passes/contract_checker_pass.rb +220 -0
  508. data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +5 -6
  509. data/lib/kumi/core/analyzer/passes/input_access_planner_pass.rb +7 -3
  510. data/lib/kumi/core/analyzer/passes/input_collector.rb +74 -122
  511. data/lib/kumi/core/analyzer/passes/input_form_schema_pass.rb +43 -0
  512. data/lib/kumi/core/analyzer/passes/ir_dependency_pass.rb +1 -1
  513. data/lib/kumi/core/analyzer/passes/ir_execution_schedule_pass.rb +1 -1
  514. data/lib/kumi/core/analyzer/passes/join_reduce_planning_pass.rb +21 -23
  515. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +84 -0
  516. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +93 -0
  517. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +115 -0
  518. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +274 -0
  519. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +198 -0
  520. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +30 -0
  521. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +121 -0
  522. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +156 -0
  523. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +148 -0
  524. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +407 -0
  525. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +243 -0
  526. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +83 -0
  527. data/lib/kumi/core/analyzer/passes/load_input_cse.rb +17 -16
  528. data/lib/kumi/core/analyzer/passes/lower_to_ir_pass.rb +4 -2
  529. data/lib/kumi/core/analyzer/passes/lower_to_irv2_pass.rb +197 -0
  530. data/lib/kumi/core/analyzer/passes/name_indexer.rb +4 -1
  531. data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +237 -0
  532. data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +156 -0
  533. data/lib/kumi/core/analyzer/passes/output_schema_pass.rb +38 -0
  534. data/lib/kumi/core/analyzer/passes/pass_base.rb +30 -4
  535. data/lib/kumi/core/analyzer/passes/precompute_access_paths_pass.rb +93 -0
  536. data/lib/kumi/core/analyzer/passes/scope_resolution_pass.rb +33 -30
  537. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -26
  538. data/lib/kumi/core/analyzer/passes/snast_pass.rb +229 -0
  539. data/lib/kumi/core/analyzer/passes/toposorter.rb +1 -0
  540. data/lib/kumi/core/analyzer/passes/type_checker.rb +13 -0
  541. data/lib/kumi/core/analyzer/passes/type_inferencer_pass.rb +14 -16
  542. data/lib/kumi/core/analyzer/passes/unsat_detector.rb +2 -1
  543. data/lib/kumi/core/analyzer/plans.rb +12 -0
  544. data/lib/kumi/core/analyzer/state_serde.rb +4 -4
  545. data/lib/kumi/core/analyzer/structs/access_plan.rb +2 -2
  546. data/lib/kumi/core/analyzer/unsat_constant_evaluator.rb +59 -0
  547. data/lib/kumi/core/compiler/access_codegen.rb +1 -1
  548. data/lib/kumi/core/compiler/access_emit/base.rb +9 -5
  549. data/lib/kumi/core/compiler/access_emit/each_indexed.rb +10 -3
  550. data/lib/kumi/core/compiler/access_emit/materialize.rb +12 -5
  551. data/lib/kumi/core/compiler/access_emit/ravel.rb +10 -3
  552. data/lib/kumi/core/compiler/access_emit/read.rb +4 -1
  553. data/lib/kumi/core/compiler/access_planner.rb +42 -4
  554. data/lib/kumi/core/compiler/access_planner_v2.rb +164 -0
  555. data/lib/kumi/core/explain.rb +18 -11
  556. data/lib/kumi/core/functions/loader.rb +47 -0
  557. data/lib/kumi/core/functions/model.rb +10 -0
  558. data/lib/kumi/core/functions/type_rules.rb +108 -0
  559. data/lib/kumi/core/ir/execution_engine/interpreter.rb +1 -1
  560. data/lib/kumi/core/ir/execution_engine/profiler.rb +107 -97
  561. data/lib/kumi/core/ir.rb +6 -2
  562. data/lib/kumi/core/irv2/builder.rb +48 -0
  563. data/lib/kumi/core/irv2/declaration.rb +28 -0
  564. data/lib/kumi/core/irv2/module.rb +108 -0
  565. data/lib/kumi/core/irv2/value.rb +28 -0
  566. data/lib/kumi/core/lir/analyze.rb +64 -0
  567. data/lib/kumi/core/lir/build.rb +363 -0
  568. data/lib/kumi/core/lir/emit.rb +62 -0
  569. data/lib/kumi/core/lir/structs/instruction.rb +44 -0
  570. data/lib/kumi/core/lir/structs/literal.rb +14 -0
  571. data/lib/kumi/core/lir/structs/stamp.rb +13 -0
  572. data/lib/kumi/core/lir/support/error.rb +9 -0
  573. data/lib/kumi/core/lir/support/ids.rb +34 -0
  574. data/lib/kumi/core/lir/validate.rb +74 -0
  575. data/lib/kumi/core/lir.rb +34 -0
  576. data/lib/kumi/core/nast.rb +216 -0
  577. data/lib/kumi/core/ruby_parser/dsl.rb +2 -2
  578. data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +1 -1
  579. data/lib/kumi/core/ruby_parser/expression_converter.rb +10 -0
  580. data/lib/kumi/core/ruby_parser/input_builder.rb +16 -17
  581. data/lib/kumi/core/ruby_parser/schema_builder.rb +36 -10
  582. data/lib/kumi/core/ruby_parser/sugar.rb +64 -0
  583. data/lib/kumi/core/types/builder.rb +2 -2
  584. data/lib/kumi/core/types/normalizer.rb +2 -0
  585. data/lib/kumi/core/types/validator.rb +10 -3
  586. data/lib/kumi/core/types.rb +7 -0
  587. data/lib/kumi/dev/codegen.rb +194 -0
  588. data/lib/kumi/dev/golden/generator.rb +105 -0
  589. data/lib/kumi/dev/golden/reporter.rb +160 -0
  590. data/lib/kumi/dev/golden/representation.rb +45 -0
  591. data/lib/kumi/dev/golden/result.rb +98 -0
  592. data/lib/kumi/dev/golden/runtime_test.rb +93 -0
  593. data/lib/kumi/dev/golden/suite.rb +131 -0
  594. data/lib/kumi/dev/golden/verifier.rb +76 -0
  595. data/lib/kumi/dev/golden.rb +75 -0
  596. data/lib/kumi/dev/ir.rb +4 -4
  597. data/lib/kumi/dev/parse.rb +1 -1
  598. data/lib/kumi/dev/pretty_printer.rb +229 -0
  599. data/lib/kumi/dev/printer/irv2_formatter.rb +163 -0
  600. data/lib/kumi/dev/printer/width_aware_json.rb +44 -0
  601. data/lib/kumi/dev/profile_aggregator.rb +36 -38
  602. data/lib/kumi/dev/profile_runner.rb +19 -23
  603. data/lib/kumi/dev/runner.rb +12 -22
  604. data/lib/kumi/dev/support/kumi_runner.mjs +39 -0
  605. data/lib/kumi/dev.rb +3 -3
  606. data/lib/kumi/frontends/ruby.rb +12 -12
  607. data/lib/kumi/frontends/text.rb +26 -21
  608. data/lib/kumi/frontends.rb +6 -8
  609. data/lib/kumi/kernel_registry.rb +59 -0
  610. data/lib/kumi/pack/builder.rb +229 -0
  611. data/lib/kumi/pack.rb +15 -0
  612. data/lib/kumi/registry_v2/loader.rb +81 -0
  613. data/lib/kumi/registry_v2.rb +118 -0
  614. data/lib/kumi/schema.rb +83 -43
  615. data/lib/kumi/support/diff.rb +3 -2
  616. data/lib/kumi/support/ir_render.rb +1 -1
  617. data/lib/kumi/support/lir_printer.rb +143 -0
  618. data/lib/kumi/support/nast_printer.rb +93 -0
  619. data/lib/kumi/support/s_expression_printer.rb +5 -4
  620. data/lib/kumi/support/snast_printer.rb +111 -0
  621. data/lib/kumi/syntax/call_expression.rb +1 -1
  622. data/lib/kumi/syntax/input_declaration.rb +2 -2
  623. data/lib/kumi/syntax/node.rb +4 -12
  624. data/lib/kumi/syntax/root.rb +10 -0
  625. data/lib/kumi/syntax/trait_declaration.rb +1 -0
  626. data/lib/kumi/syntax/value_declaration.rb +1 -0
  627. data/lib/kumi/version.rb +1 -1
  628. data/lib/kumi.rb +46 -4
  629. metadata +571 -54
  630. data/docs/AST.md +0 -133
  631. data/docs/DSL.md +0 -154
  632. data/docs/FUNCTIONS.md +0 -176
  633. data/docs/VECTOR_SEMANTICS.md +0 -286
  634. data/docs/compiler_design_principles.md +0 -86
  635. data/docs/dev/analyzer-debug.md +0 -52
  636. data/docs/dev/parse-command.md +0 -64
  637. data/docs/dev/vm-profiling.md +0 -95
  638. data/docs/development/README.md +0 -120
  639. data/docs/development/error-reporting.md +0 -361
  640. data/docs/features/README.md +0 -58
  641. data/docs/features/analysis-type-inference.md +0 -42
  642. data/docs/features/analysis-unsat-detection.md +0 -71
  643. data/docs/features/hierarchical-broadcasting.md +0 -415
  644. data/docs/features/input-declaration-system.md +0 -58
  645. data/docs/features/performance.md +0 -14
  646. data/docs/features/s-expression-printer.md +0 -77
  647. data/docs/schema_metadata/broadcasts.md +0 -53
  648. data/docs/schema_metadata/cascades.md +0 -45
  649. data/docs/schema_metadata/declarations.md +0 -54
  650. data/docs/schema_metadata/dependencies.md +0 -57
  651. data/docs/schema_metadata/evaluation_order.md +0 -29
  652. data/docs/schema_metadata/examples.md +0 -95
  653. data/docs/schema_metadata/inferred_types.md +0 -46
  654. data/docs/schema_metadata/inputs.md +0 -86
  655. data/docs/schema_metadata.md +0 -108
  656. data/golden/mixed_nesting/schema.kumi +0 -42
  657. data/lib/kumi/core/function_registry/collection_functions.rb +0 -298
  658. data/lib/kumi/core/function_registry/comparison_functions.rb +0 -33
  659. data/lib/kumi/core/function_registry/conditional_functions.rb +0 -48
  660. data/lib/kumi/core/function_registry/function_builder.rb +0 -184
  661. data/lib/kumi/core/function_registry/logical_functions.rb +0 -214
  662. data/lib/kumi/core/function_registry/math_functions.rb +0 -74
  663. data/lib/kumi/core/function_registry/stat_functions.rb +0 -156
  664. data/lib/kumi/core/function_registry/string_functions.rb +0 -57
  665. data/lib/kumi/core/function_registry/type_functions.rb +0 -53
  666. data/lib/kumi/core/function_registry.rb +0 -176
  667. data/lib/kumi/registry.rb +0 -32
  668. data/lib/kumi/runtime/executable.rb +0 -135
  669. data/lib/kumi/runtime/run.rb +0 -105
  670. data/performance_results.txt +0 -63
  671. data/scripts/analyze_broadcast_methods.rb +0 -68
  672. data/scripts/analyze_cascade_methods.rb +0 -74
  673. data/scripts/check_broadcasting_coverage.rb +0 -51
  674. data/scripts/find_dead_code.rb +0 -114
  675. data/scripts/generate_function_docs.rb +0 -71
  676. data/scripts/test_mixed_nesting_performance.rb +0 -206
@@ -0,0 +1,58 @@
1
+ export function _x_is_large(input) {
2
+ let out = [];
3
+ let t1 = input["points"];
4
+ const t5 = 100;
5
+ t1.forEach((points_el_2, points_i_3) => {
6
+ let t4 = points_el_2["x"];
7
+ let t6 = t4 > t5;
8
+ out.push(t6);
9
+ });
10
+ return out;
11
+ }
12
+
13
+ export function _selected_value(input) {
14
+ let out = [];
15
+ let t7 = input["points"];
16
+ const t29 = 100;
17
+ t7.forEach((points_el_8, points_i_9) => {
18
+ let t28 = points_el_8["x"];
19
+ let t12 = points_el_8["y"];
20
+ let t30 = t28 > t29;
21
+ let t13 = t30 ? t28 : t12;
22
+ out.push(t13);
23
+ });
24
+ return out;
25
+ }
26
+
27
+ export function _final_value_per_point(input) {
28
+ let out = [];
29
+ let t14 = input["points"];
30
+ const t43 = 100;
31
+ t14.forEach((points_el_15, points_i_16) => {
32
+ let t42 = points_el_15["x"];
33
+ let t34 = points_el_15["y"];
34
+ let t44 = t42 > t43;
35
+ let t35 = t44 ? t42 : t34;
36
+ let t19 = [t35, t42];
37
+ let t20 = Math.max(...t19);
38
+ out.push(t20);
39
+ });
40
+ return out;
41
+ }
42
+
43
+ export function _grand_total(input) {
44
+ let acc_21 = 0;
45
+ let t22 = input["points"];
46
+ const t48 = 100;
47
+ t22.forEach((points_el_23, points_i_24) => {
48
+ let t47 = points_el_23["x"];
49
+ let t51 = points_el_23["y"];
50
+ let t49 = t47 > t48;
51
+ let t52 = t49 ? t47 : t51;
52
+ let t39 = [t52, t47];
53
+ let t40 = Math.max(...t39);
54
+ acc_21 += t40;
55
+ });
56
+ return acc_21;
57
+ }
58
+
@@ -0,0 +1,88 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_891c764845b8c48158e2ba4637dc0ee94765e885752ebff413ce6186568789f5
3
+ def self.from(input_data = nil)
4
+ instance = Object.new
5
+ instance.extend(self)
6
+ instance.instance_variable_set(:@input, input_data)
7
+ instance
8
+ end
9
+
10
+ def self.__kumi_executable__
11
+ instance = Object.new
12
+ instance.extend(self)
13
+ instance
14
+ end
15
+
16
+ def update(input_data)
17
+ @input = @input.merge(input_data)
18
+ self
19
+ end
20
+
21
+ def [](name)
22
+ case name
23
+ when :x_is_large then _x_is_large
24
+ when :selected_value then _selected_value
25
+ when :final_value_per_point then _final_value_per_point
26
+ when :grand_total then _grand_total
27
+ else raise KeyError, "Unknown declaration"
28
+ end
29
+ end
30
+
31
+ def _x_is_large(input = @input)
32
+ out = []
33
+ t1 = input["points"] || input[:points]
34
+ t5 = 100
35
+ t1.each_with_index do |points_el_2, points_i_3|
36
+ t4 = points_el_2["x"] || points_el_2[:x]
37
+ t6 = t4 > t5
38
+ out << t6
39
+ end
40
+ out
41
+ end
42
+
43
+ def _selected_value(input = @input)
44
+ out = []
45
+ t7 = input["points"] || input[:points]
46
+ t29 = 100
47
+ t7.each_with_index do |points_el_8, points_i_9|
48
+ t28 = points_el_8["x"] || points_el_8[:x]
49
+ t12 = points_el_8["y"] || points_el_8[:y]
50
+ t30 = t28 > t29
51
+ t13 = t30 ? t28 : t12
52
+ out << t13
53
+ end
54
+ out
55
+ end
56
+
57
+ def _final_value_per_point(input = @input)
58
+ out = []
59
+ t14 = input["points"] || input[:points]
60
+ t43 = 100
61
+ t14.each_with_index do |points_el_15, points_i_16|
62
+ t42 = points_el_15["x"] || points_el_15[:x]
63
+ t34 = points_el_15["y"] || points_el_15[:y]
64
+ t44 = t42 > t43
65
+ t35 = t44 ? t42 : t34
66
+ t19 = [t35, t42]
67
+ t20 = t19.max
68
+ out << t20
69
+ end
70
+ out
71
+ end
72
+
73
+ def _grand_total(input = @input)
74
+ acc_21 = 0
75
+ t22 = input["points"] || input[:points]
76
+ t48 = 100
77
+ t22.each_with_index do |points_el_23, points_i_24|
78
+ t47 = points_el_23["x"] || points_el_23[:x]
79
+ t51 = points_el_23["y"] || points_el_23[:y]
80
+ t49 = t47 > t48
81
+ t52 = t49 ? t47 : t51
82
+ t39 = [t52, t47]
83
+ t40 = t39.max
84
+ acc_21 += t40
85
+ end
86
+ acc_21
87
+ end
88
+ end
@@ -0,0 +1,28 @@
1
+ (SNAST
2
+ (TRAIT x_is_large
3
+ (Call :core.gt
4
+ (InputRef points.point.x key_chain=[]) :: [points] -> integer
5
+ (Const 100) :: [] -> integer
6
+ ) :: [points] -> boolean
7
+ ) :: [points] -> boolean
8
+ (VALUE selected_value
9
+ (Select
10
+ (Ref x_is_large) :: [points] -> boolean
11
+ (InputRef points.point.x key_chain=[]) :: [points] -> integer
12
+ (InputRef points.point.y key_chain=[]) :: [points] -> integer
13
+ ) :: [points] -> integer
14
+ ) :: [points] -> integer
15
+ (VALUE final_value_per_point
16
+ (Fold :agg.max
17
+ (Tuple
18
+ (Ref selected_value) :: [points] -> integer
19
+ (InputRef points.point.x key_chain=[]) :: [points] -> integer
20
+ ) :: [points] -> tuple<integer>
21
+ ) :: [points] -> integer
22
+ ) :: [points] -> integer
23
+ (VALUE grand_total
24
+ (Reduce :agg.sum over [points]
25
+ (Ref final_value_per_point) :: [points] -> integer
26
+ ) :: [] -> integer
27
+ ) :: [] -> integer
28
+ )
@@ -0,0 +1,18 @@
1
+ {
2
+ "x_is_large": [
3
+ true,
4
+ false,
5
+ false
6
+ ],
7
+ "selected_value": [
8
+ 120,
9
+ 90,
10
+ 10
11
+ ],
12
+ "final_value_per_point": [
13
+ 120,
14
+ 90,
15
+ 30
16
+ ],
17
+ "grand_total": 240
18
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "points": [
3
+ { "x": 120, "y": 50 },
4
+ { "x": 80, "y": 90 },
5
+ { "x": 30, "y": 10 }
6
+ ]
7
+ }
@@ -0,0 +1,38 @@
1
+ schema do
2
+ input do
3
+ # Input is an array of points, each with an x and y coordinate.
4
+ array :points do
5
+ hash :point do
6
+ integer :x
7
+ integer :y
8
+ end
9
+ end
10
+ end
11
+
12
+ # --- Part 1: Element-wise Logic ---
13
+
14
+ # First, create an element-wise boolean mask. This will be an array of booleans
15
+ # the same size as the input 'points' array.
16
+ trait :x_is_large, input.points.point.x > 100
17
+
18
+ # Next, use the mask to perform an element-wise selection.
19
+ # For each point, it will pick `x` if the condition is true, otherwise it picks `y`.
20
+ # The result, `selected_value`, is another array.
21
+ value :selected_value, select(x_is_large, input.points.point.x, input.points.point.y)
22
+
23
+ # --- Part 2: Vectorized Fold ---
24
+
25
+ # This is the most complex step. It mixes a tuple operation (a Fold)
26
+ # with element-wise processing.
27
+ # For EACH point in the array, Kumi will:
28
+ # 1. Create a temporary 2-element tuple: `[selected_value_for_point, x_for_point]`
29
+ # 2. Perform a `max` reduction on that small tuple (a Fold).
30
+ # The result, `final_value_per_point`, is a new array containing the result of each fold.
31
+ value :final_value_per_point, fn(:max, [selected_value, input.points.point.x])
32
+
33
+ # --- Part 3: Final Reduction ---
34
+
35
+ # Finally, we take the array produced by the vectorized fold and reduce it
36
+ # to a single scalar value by summing all its elements.
37
+ value :grand_total, fn(:sum, final_value_per_point)
38
+ end
@@ -0,0 +1,28 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :income :float)
4
+ (InputDeclaration :age :integer)
5
+ ]
6
+ values: [
7
+ (ValueDeclaration :scores
8
+ (ArrayExpression
9
+ (Literal 100)
10
+ (Literal 85)
11
+ (Literal 92)
12
+ )
13
+ )
14
+ (ValueDeclaration :first_score
15
+ (CallExpression :at
16
+ (DeclarationReference :scores)
17
+ (Literal 0)
18
+ )
19
+ )
20
+ (ValueDeclaration :second_score
21
+ (CallExpression :at
22
+ (DeclarationReference :scores)
23
+ (Literal 1)
24
+ )
25
+ )
26
+ ]
27
+ traits: []
28
+ )
@@ -0,0 +1,2 @@
1
+ income: float
2
+ age: integer
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,17 @@
1
+ (LIR
2
+ (Declaration scores
3
+ %t1 = const 100 :: integer
4
+ %t2 = const 85 :: integer
5
+ %t3 = const 92 :: integer
6
+ %t4 = make_tuple(%t1, %t2, %t3) :: tuple<integer>
7
+ yield %t4
8
+ )
9
+ (Declaration first_score
10
+ %t5 = const 100 :: integer
11
+ yield %t5
12
+ )
13
+ (Declaration second_score
14
+ %t6 = const 85 :: integer
15
+ yield %t6
16
+ )
17
+ )
@@ -0,0 +1,21 @@
1
+ (NAST
2
+ (VALUE scores
3
+ (Tuple
4
+ (Const 100)
5
+ (Const 85)
6
+ (Const 92)
7
+ )
8
+ )
9
+ (VALUE first_score
10
+ (Call :"core.at"
11
+ (Ref scores)
12
+ (Const 0)
13
+ )
14
+ )
15
+ (VALUE second_score
16
+ (Call :"core.at"
17
+ (Ref scores)
18
+ (Const 1)
19
+ )
20
+ )
21
+ )
@@ -0,0 +1,18 @@
1
+ export function _scores(input) {
2
+ const t1 = 100;
3
+ const t2 = 85;
4
+ const t3 = 92;
5
+ let t4 = [t1, t2, t3];
6
+ return t4;
7
+ }
8
+
9
+ export function _first_score(input) {
10
+ const t5 = 100;
11
+ return t5;
12
+ }
13
+
14
+ export function _second_score(input) {
15
+ const t6 = 85;
16
+ return t6;
17
+ }
18
+
@@ -0,0 +1,44 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_806eaa2ab0d0860b647749fdc1ca08bd8b1ce44b98e985473bcc904f6b64c271
3
+ def self.from(input_data = nil)
4
+ instance = Object.new
5
+ instance.extend(self)
6
+ instance.instance_variable_set(:@input, input_data)
7
+ instance
8
+ end
9
+
10
+ def self.__kumi_executable__
11
+ instance = Object.new
12
+ instance.extend(self)
13
+ instance
14
+ end
15
+
16
+ def update(input_data)
17
+ @input = @input.merge(input_data)
18
+ self
19
+ end
20
+
21
+ def [](name)
22
+ case name
23
+ when :scores then _scores
24
+ when :first_score then _first_score
25
+ when :second_score then _second_score
26
+ else raise KeyError, "Unknown declaration"
27
+ end
28
+ end
29
+
30
+ def _scores(input = @input)
31
+ t1 = 100
32
+ t2 = 85
33
+ t3 = 92
34
+ [t1, t2, t3]
35
+ end
36
+
37
+ def _first_score(input = @input)
38
+ 100
39
+ end
40
+
41
+ def _second_score(input = @input)
42
+ 85
43
+ end
44
+ end
@@ -0,0 +1,15 @@
1
+ (SNAST
2
+ (VALUE scores
3
+ (Tuple
4
+ (Const 100) :: [] -> integer
5
+ (Const 85) :: [] -> integer
6
+ (Const 92) :: [] -> integer
7
+ ) :: [] -> tuple<integer>
8
+ ) :: [] -> tuple<integer>
9
+ (VALUE first_score
10
+ (Const 100) :: [] -> integer
11
+ ) :: [] -> integer
12
+ (VALUE second_score
13
+ (Const 85) :: [] -> integer
14
+ ) :: [] -> integer
15
+ )
@@ -0,0 +1,10 @@
1
+ schema do
2
+ input do
3
+ float :income
4
+ integer :age
5
+ end
6
+
7
+ value :scores, [100, 85, 92]
8
+ value :first_score, scores[0]
9
+ value :second_score, scores[1]
10
+ end
data/lib/kumi/analyzer.rb CHANGED
@@ -3,33 +3,75 @@
3
3
  module Kumi
4
4
  module Analyzer
5
5
  Result = Struct.new(:definitions, :dependency_graph, :leaf_map, :topo_order, :decl_types, :state, keyword_init: true)
6
- ERROR_THRESHOLD_PASS = Core::Analyzer::Passes::LowerToIRPass
6
+ Passes = Core::Analyzer::Passes
7
+ ERROR_THRESHOLD_PASS = Passes::NormalizeToNASTPass
7
8
 
8
9
  DEFAULT_PASSES = [
9
- Core::Analyzer::Passes::NameIndexer, # 1. Finds all names and checks for duplicates.
10
- Core::Analyzer::Passes::InputCollector, # 2. Collects field metadata from input declarations.
11
- Core::Analyzer::Passes::DeclarationValidator, # 4. Checks the basic structure of each rule.
12
- Core::Analyzer::Passes::SemanticConstraintValidator, # 5. Validates DSL semantic constraints at AST level.
13
- Core::Analyzer::Passes::DependencyResolver, # 6. Builds the dependency graph with conditional dependencies.
14
- Core::Analyzer::Passes::UnsatDetector, # 7. Detects unsatisfiable constraints and analyzes cascade mutual exclusion.
15
- Core::Analyzer::Passes::Toposorter, # 8. Creates the final evaluation order, allowing safe cycles.
16
- Core::Analyzer::Passes::BroadcastDetector, # 9. Detects which operations should be broadcast over arrays.
17
- Core::Analyzer::Passes::TypeInferencerPass, # 10. Infers types for all declarations (uses vectorization metadata).
18
- Core::Analyzer::Passes::TypeChecker, # 11. Validates types using inferred information.
19
- Core::Analyzer::Passes::InputAccessPlannerPass, # 12. Plans access strategies for input fields.
20
- Core::Analyzer::Passes::ScopeResolutionPass, # 13. Plans execution scope and lifting needs for declarations.
21
- Core::Analyzer::Passes::JoinReducePlanningPass, # 14. Plans join/reduce operations (Generates IR Structs)
22
- Core::Analyzer::Passes::LowerToIRPass, # 15. Lowers the schema to IR (Generates IR Structs)
23
- Core::Analyzer::Passes::LoadInputCSE, # 16. Eliminates redundant load_input operations
24
- Core::Analyzer::Passes::IRDependencyPass, # 17. Extracts IR-level dependencies for VM execution optimization
25
- Core::Analyzer::Passes::IRExecutionSchedulePass # 18. Builds a precomputed execution schedule.
10
+ Passes::NameIndexer, # 1. Finds all names and checks for duplicates.
11
+ Passes::InputCollector, # 2. Collects field metadata from input declarations.
12
+ Passes::InputFormSchemaPass, # 3. Builds minimal form schema from input metadata.
13
+ Passes::DeclarationValidator, # 4. Checks the basic structure of each rule.
14
+ Passes::SemanticConstraintValidator, # 5. Validates DSL semantic constraints at AST level.
15
+ Passes::DependencyResolver, # 6. Builds the dependency graph with conditional dependencies.
16
+ Passes::UnsatDetector, # 7. Detects unsatisfiable constraints and analyzes cascade mutual exclusion.
17
+ Passes::Toposorter, # 8. Creates the final evaluation order, allowing safe cycles.
18
+ # Passes::BroadcastDetector, # 9. Detects which operations should be broadcast over arrays.
19
+ # Passes::TypeInferencerPass, # 10. Infers types for all declarations (uses vectorization metadata).
20
+ # Passes::TypeChecker, # 11. Validates types using inferred information.
21
+ Passes::InputAccessPlannerPass # 12. Plans access strategies for input fields.
22
+ # Passes::ScopeResolutionPass, # 13. Plans execution scope and lifting needs for declarations.
23
+ # Passes::JoinReducePlanningPass, # 14. Plans join/reduce operations (Generates IR Structs)
24
+ # Passes::LowerToIRPass, # 15. Lowers the schema to IR (Generates IR Structs)
25
+ # Passes::LoadInputCSE, # 16. Eliminates redundant load_input operations
26
+ # Passes::IRDependencyPass, # 17. Extracts IR-level dependencies for VM execution optimization
27
+ # Passes::IRExecutionSchedulePass # 18. Builds a precomputed execution schedule.
26
28
  ].freeze
27
29
 
28
- def self.analyze!(schema, passes: DEFAULT_PASSES, **opts)
29
- state = Core::Analyzer::AnalysisState.new(opts)
30
+ # Pipeline passes for the determinisitic NAST->LIR approach
31
+ HIR_TO_LIR_PASSES = [
32
+ Passes::NormalizeToNASTPass, # Normalizes AST to uniform NAST representation
33
+ Passes::ConstantFoldingPass, # Folds constant expressions in NAST
34
+ Passes::NASTDimensionalAnalyzerPass, # Extracts dimensional and type metadata from NAST
35
+ Passes::SNASTPass, # Creates Semantic NAST with dimensional stamps and execution plans
36
+ Passes::OutputSchemaPass, # Builds minimal output schema from SNAST
37
+ Passes::AttachTerminalInfoPass, # Attaches key_chain info to InputRef nodes
38
+ Passes::AttachAnchorsPass,
39
+ Passes::PrecomputeAccessPathsPass,
40
+ Passes::LIR::LowerPass, # Lowers the schema to LIR (LIR Structs)
41
+ Passes::LIR::HoistScalarReferencesPass,
42
+ Passes::LIR::InlineDeclarationsPass, # Inlines LoadDeclaration when site axes == decl axes
43
+ Passes::LIR::LocalCSEPass, # Local CSE optimization for pure LIR operations
44
+ Passes::LIR::InstructionSchedulingPass,
45
+ Passes::LIR::LoopFusionPass,
46
+ Passes::LIR::LocalCSEPass, # Local CSE optimization for pure LIR operations
47
+ Passes::LIR::DeadCodeEliminationPass, # Removes dead code
48
+ Passes::LIR::KernelBindingPass, # Binds kernels to LIR operations
49
+ Passes::LIR::LoopInvariantCodeMotionPass
50
+ # Passes::LIR::ValidationPass # Validates LIR structural and contextual correctness
51
+ ].freeze
52
+
53
+ RUBY_TARGET_PASSES = [
54
+ Passes::LIR::ConstantPropagationPass, # Ruby uses this Intra-block constant propagation
55
+ Passes::LIR::DeadCodeEliminationPass, # Removes dead code
56
+ Passes::Codegen::RubyPass, # Generates ruby code from LIR
57
+ Passes::Codegen::JsPass
58
+ ]
59
+
60
+ def self.analyze!(schema, passes: DEFAULT_PASSES, registry: nil, **opts)
30
61
  errors = []
62
+ schema_digest = schema.digest
63
+ stop_after = Core::Analyzer::Checkpoint.stop_after
64
+
65
+ registry ||= Kumi::RegistryV2.load
66
+ state = Core::Analyzer::AnalysisState.new(opts).with(:registry, registry).with(:schema_digest, schema_digest)
67
+ state, stopped = run_analysis_passes(schema, passes, state, errors)
68
+ return create_analysis_result(state) if stopped
69
+
70
+ state, stopped = run_analysis_passes(schema, HIR_TO_LIR_PASSES, state, errors)
71
+ return create_analysis_result(state) if stopped
72
+
73
+ state, stopped = run_analysis_passes(schema, RUBY_TARGET_PASSES, state, errors)
31
74
 
32
- state = run_analysis_passes(schema, passes, state, errors)
33
75
  handle_analysis_errors(errors) unless errors.empty?
34
76
  create_analysis_result(state)
35
77
  end
@@ -42,9 +84,10 @@ module Kumi
42
84
  resume_at = Core::Analyzer::Checkpoint.resume_at
43
85
  stop_after = Core::Analyzer::Checkpoint.stop_after
44
86
  skipping = !!resume_at
87
+ stopped = false
45
88
 
46
89
  passes.each_with_index do |pass_class, idx|
47
- raise handle_analysis_errors(errors) if (ERROR_THRESHOLD_PASS == pass_class) && !errors.empty?
90
+ raise handle_analysis_errors(errors) if !errors.empty? && (ERROR_THRESHOLD_PASS == pass_class)
48
91
 
49
92
  pass_name = pass_class.name.split("::").last
50
93
 
@@ -84,6 +127,10 @@ module Kumi
84
127
 
85
128
  raise
86
129
  end
130
+ unless state.is_a? Kumi::Core::Analyzer::AnalysisState
131
+ raise "Pass #{pass_name} returned a '#{state.class}', expected 'AnalysisState'"
132
+ end
133
+
87
134
  elapsed_ms = ((Process.clock_gettime(Process::CLOCK_MONOTONIC) - t0) * 1000).round(2)
88
135
 
89
136
  if debug_on
@@ -112,12 +159,17 @@ module Kumi
112
159
 
113
160
  Core::Analyzer::Checkpoint.leaving(pass_name:, idx:, state:)
114
161
 
115
- break if stop_after && pass_name == stop_after
162
+ if stop_after && pass_name == stop_after
163
+ stopped = true
164
+ break
165
+ end
116
166
  end
117
- state
167
+ [state, stopped]
118
168
  end
119
169
 
120
170
  def self.handle_analysis_errors(errors)
171
+ raise Kumi::Errors::AnalysisError, "\n" + errors.join("\n") if errors.first.is_a? String
172
+
121
173
  type_errors = errors.select { |e| e.type == :type }
122
174
  first_error_location = errors.first.location
123
175