kumi 0.0.33 → 0.0.35

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 (744) hide show
  1. checksums.yaml +4 -4
  2. data/.codex +0 -0
  3. data/CHANGELOG.md +18 -0
  4. data/README.md +38 -26
  5. data/Rakefile +2 -0
  6. data/data/functions/agg/numeric.yaml +6 -0
  7. data/data/functions/core/arithmetic.yaml +26 -0
  8. data/data/kernels/javascript/agg/numeric.yaml +8 -4
  9. data/data/kernels/javascript/agg/string.yaml +4 -1
  10. data/data/kernels/javascript/core/arithmetic.yaml +8 -0
  11. data/data/kernels/ruby/agg/numeric.yaml +6 -2
  12. data/data/kernels/ruby/agg/string.yaml +4 -1
  13. data/data/kernels/ruby/core/arithmetic.yaml +10 -0
  14. data/docs/AGENTS.md +60 -0
  15. data/docs/ARCHITECTURE.md +114 -250
  16. data/docs/DEVELOPMENT.md +13 -0
  17. data/docs/GOLDEN_TESTS.md +88 -161
  18. data/docs/RELEASING.md +52 -0
  19. data/docs/SCHEMA_IMPORTS.md +85 -205
  20. data/docs/UNSAT_DETECTION.md +2 -1
  21. data/golden/array_element/expected/dfir.txt +5 -0
  22. data/golden/array_element/expected/dfir_optimized.txt +5 -0
  23. data/golden/array_element/expected/loopir.txt +11 -0
  24. data/golden/array_element/expected/schema_javascript.mjs +13 -10
  25. data/golden/array_element/expected/schema_ruby.rb +9 -9
  26. data/golden/array_element/expected/vecir.txt +5 -0
  27. data/golden/array_index/expected/dfir.txt +25 -0
  28. data/golden/array_index/expected/dfir_optimized.txt +27 -0
  29. data/golden/array_index/expected/loopir.txt +44 -0
  30. data/golden/array_index/expected/nast.txt +6 -6
  31. data/golden/array_index/expected/schema_javascript.mjs +53 -36
  32. data/golden/array_index/expected/schema_ruby.rb +40 -30
  33. data/golden/array_index/expected/snast.txt +2 -2
  34. data/golden/array_index/expected/vecir.txt +27 -0
  35. data/golden/array_operations/expected/dfir.txt +36 -0
  36. data/golden/array_operations/expected/dfir_optimized.txt +36 -0
  37. data/golden/array_operations/expected/loopir.txt +45 -0
  38. data/golden/array_operations/expected/schema_javascript.mjs +50 -41
  39. data/golden/array_operations/expected/schema_ruby.rb +40 -36
  40. data/golden/array_operations/expected/vecir.txt +36 -0
  41. data/golden/cascade_logic/expected/dfir.txt +21 -0
  42. data/golden/cascade_logic/expected/dfir_optimized.txt +22 -0
  43. data/golden/cascade_logic/expected/loopir.txt +22 -0
  44. data/golden/cascade_logic/expected/schema_javascript.mjs +18 -11
  45. data/golden/cascade_logic/expected/schema_ruby.rb +21 -11
  46. data/golden/cascade_logic/expected/vecir.txt +22 -0
  47. data/golden/chained_fusion/expected/dfir.txt +53 -0
  48. data/golden/chained_fusion/expected/dfir_optimized.txt +75 -0
  49. data/golden/chained_fusion/expected/loopir.txt +95 -0
  50. data/golden/chained_fusion/expected/schema_javascript.mjs +105 -91
  51. data/golden/chained_fusion/expected/schema_ruby.rb +87 -83
  52. data/golden/chained_fusion/expected/vecir.txt +75 -0
  53. data/golden/decimal_explicit/expected/dfir.txt +18 -0
  54. data/golden/decimal_explicit/expected/dfir_optimized.txt +28 -0
  55. data/golden/decimal_explicit/expected/loopir.txt +28 -0
  56. data/golden/decimal_explicit/expected/schema_javascript.mjs +31 -19
  57. data/golden/decimal_explicit/expected/schema_ruby.rb +34 -19
  58. data/golden/decimal_explicit/expected/vecir.txt +28 -0
  59. data/golden/element_arrays/expected/dfir.txt +42 -0
  60. data/golden/element_arrays/expected/dfir_optimized.txt +50 -0
  61. data/golden/element_arrays/expected/loopir.txt +92 -0
  62. data/golden/element_arrays/expected/schema_javascript.mjs +107 -79
  63. data/golden/element_arrays/expected/schema_ruby.rb +77 -66
  64. data/golden/element_arrays/expected/snast.txt +6 -6
  65. data/golden/element_arrays/expected/vecir.txt +50 -0
  66. data/golden/empty_and_null_inputs/expected/dfir.txt +14 -0
  67. data/golden/empty_and_null_inputs/expected/dfir_optimized.txt +25 -0
  68. data/golden/empty_and_null_inputs/expected/loopir.txt +43 -0
  69. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +49 -38
  70. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +37 -35
  71. data/golden/empty_and_null_inputs/expected/vecir.txt +25 -0
  72. data/golden/example_xpto/expected/dfir.txt +10 -0
  73. data/golden/example_xpto/expected/dfir_optimized.txt +10 -0
  74. data/golden/example_xpto/expected/loopir.txt +10 -0
  75. data/golden/example_xpto/expected/schema_javascript.mjs +8 -5
  76. data/golden/example_xpto/expected/schema_ruby.rb +10 -5
  77. data/golden/example_xpto/expected/vecir.txt +10 -0
  78. data/golden/function_overload/expected/dfir.txt +10 -0
  79. data/golden/function_overload/expected/dfir_optimized.txt +12 -0
  80. data/golden/function_overload/expected/loopir.txt +12 -0
  81. data/golden/function_overload/expected/schema_javascript.mjs +17 -8
  82. data/golden/function_overload/expected/schema_ruby.rb +18 -9
  83. data/golden/function_overload/expected/snast.txt +1 -1
  84. data/golden/function_overload/expected/vecir.txt +12 -0
  85. data/golden/game_of_life/expected/dfir.txt +69 -0
  86. data/golden/game_of_life/expected/dfir_optimized.txt +207 -0
  87. data/golden/game_of_life/expected/loopir.txt +694 -0
  88. data/golden/game_of_life/expected/schema_javascript.mjs +841 -90
  89. data/golden/game_of_life/expected/schema_ruby.rb +799 -90
  90. data/golden/game_of_life/expected/vecir.txt +207 -0
  91. data/golden/hash_keys/expected/dfir.txt +14 -0
  92. data/golden/hash_keys/expected/dfir_optimized.txt +14 -0
  93. data/golden/hash_keys/expected/loopir.txt +14 -0
  94. data/golden/hash_keys/expected/schema_javascript.mjs +13 -24
  95. data/golden/hash_keys/expected/schema_ruby.rb +14 -25
  96. data/golden/hash_keys/expected/vecir.txt +14 -0
  97. data/golden/hash_value/expected/dfir.txt +21 -0
  98. data/golden/hash_value/expected/dfir_optimized.txt +25 -0
  99. data/golden/hash_value/expected/loopir.txt +31 -0
  100. data/golden/hash_value/expected/schema_javascript.mjs +34 -34
  101. data/golden/hash_value/expected/schema_ruby.rb +28 -31
  102. data/golden/hash_value/expected/vecir.txt +25 -0
  103. data/golden/hierarchical_complex/expected/dfir.txt +86 -0
  104. data/golden/hierarchical_complex/expected/dfir_optimized.txt +88 -0
  105. data/golden/hierarchical_complex/expected/loopir.txt +129 -0
  106. data/golden/hierarchical_complex/expected/schema_javascript.mjs +145 -100
  107. data/golden/hierarchical_complex/expected/schema_ruby.rb +114 -85
  108. data/golden/hierarchical_complex/expected/vecir.txt +88 -0
  109. data/golden/inline_rename_scope_leak/expected/dfir.txt +19 -0
  110. data/golden/inline_rename_scope_leak/expected/dfir_optimized.txt +27 -0
  111. data/golden/inline_rename_scope_leak/expected/loopir.txt +35 -0
  112. data/golden/inline_rename_scope_leak/expected/schema_javascript.mjs +39 -35
  113. data/golden/inline_rename_scope_leak/expected/schema_ruby.rb +31 -32
  114. data/golden/inline_rename_scope_leak/expected/vecir.txt +23 -0
  115. data/golden/input_reference/expected/dfir.txt +22 -0
  116. data/golden/input_reference/expected/dfir_optimized.txt +22 -0
  117. data/golden/input_reference/expected/loopir.txt +33 -0
  118. data/golden/input_reference/expected/schema_javascript.mjs +36 -30
  119. data/golden/input_reference/expected/schema_ruby.rb +30 -25
  120. data/golden/input_reference/expected/snast.txt +1 -1
  121. data/golden/input_reference/expected/vecir.txt +22 -0
  122. data/golden/interleaved_fusion/expected/dfir.txt +35 -0
  123. data/golden/interleaved_fusion/expected/dfir_optimized.txt +60 -0
  124. data/golden/interleaved_fusion/expected/loopir.txt +74 -0
  125. data/golden/interleaved_fusion/expected/schema_javascript.mjs +82 -65
  126. data/golden/interleaved_fusion/expected/schema_ruby.rb +65 -63
  127. data/golden/interleaved_fusion/expected/vecir.txt +60 -0
  128. data/golden/let_inline/expected/dfir.txt +16 -0
  129. data/golden/let_inline/expected/dfir_optimized.txt +20 -0
  130. data/golden/let_inline/expected/loopir.txt +20 -0
  131. data/golden/let_inline/expected/schema_javascript.mjs +28 -6
  132. data/golden/let_inline/expected/schema_ruby.rb +29 -6
  133. data/golden/let_inline/expected/vecir.txt +20 -0
  134. data/golden/loop_fusion/expected/dfir.txt +29 -0
  135. data/golden/loop_fusion/expected/dfir_optimized.txt +47 -0
  136. data/golden/loop_fusion/expected/loopir.txt +55 -0
  137. data/golden/loop_fusion/expected/schema_javascript.mjs +61 -49
  138. data/golden/loop_fusion/expected/schema_ruby.rb +49 -47
  139. data/golden/loop_fusion/expected/vecir.txt +47 -0
  140. data/golden/min_max_empty_arrays/expected/ast.txt +58 -0
  141. data/golden/min_max_empty_arrays/expected/dfir.txt +27 -0
  142. data/golden/min_max_empty_arrays/expected/dfir_optimized.txt +37 -0
  143. data/golden/min_max_empty_arrays/expected/input_plan.txt +15 -0
  144. data/golden/min_max_empty_arrays/expected/loopir.txt +67 -0
  145. data/golden/min_max_empty_arrays/expected/nast.txt +27 -0
  146. data/golden/min_max_empty_arrays/expected/schema_javascript.mjs +92 -0
  147. data/golden/min_max_empty_arrays/expected/schema_ruby.rb +90 -0
  148. data/golden/min_max_empty_arrays/expected/snast.txt +27 -0
  149. data/golden/min_max_empty_arrays/expected/vecir.txt +37 -0
  150. data/golden/min_max_empty_arrays/expected.json +7 -0
  151. data/golden/min_max_empty_arrays/input.json +12 -0
  152. data/golden/min_max_empty_arrays/schema.kumi +24 -0
  153. data/golden/min_reduce_scope/expected/dfir.txt +35 -0
  154. data/golden/min_reduce_scope/expected/dfir_optimized.txt +37 -0
  155. data/golden/min_reduce_scope/expected/loopir.txt +58 -0
  156. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -51
  157. data/golden/min_reduce_scope/expected/schema_ruby.rb +50 -46
  158. data/golden/min_reduce_scope/expected/vecir.txt +37 -0
  159. data/golden/mixed_dimensions/expected/dfir.txt +23 -0
  160. data/golden/mixed_dimensions/expected/dfir_optimized.txt +26 -0
  161. data/golden/mixed_dimensions/expected/loopir.txt +44 -0
  162. data/golden/mixed_dimensions/expected/schema_javascript.mjs +50 -40
  163. data/golden/mixed_dimensions/expected/schema_ruby.rb +38 -36
  164. data/golden/mixed_dimensions/expected/vecir.txt +28 -0
  165. data/golden/multi_loop_reduction/expected/ast.txt +39 -0
  166. data/golden/multi_loop_reduction/expected/dfir.txt +23 -0
  167. data/golden/multi_loop_reduction/expected/dfir_optimized.txt +25 -0
  168. data/golden/multi_loop_reduction/expected/input_plan.txt +5 -0
  169. data/golden/multi_loop_reduction/expected/loopir.txt +37 -0
  170. data/golden/multi_loop_reduction/expected/nast.txt +25 -0
  171. data/golden/multi_loop_reduction/expected/schema_javascript.mjs +50 -0
  172. data/golden/multi_loop_reduction/expected/schema_ruby.rb +48 -0
  173. data/golden/multi_loop_reduction/expected/snast.txt +25 -0
  174. data/golden/multi_loop_reduction/expected/vecir.txt +25 -0
  175. data/golden/multi_loop_reduction/expected.json +5 -0
  176. data/golden/multi_loop_reduction/input.json +7 -0
  177. data/golden/multi_loop_reduction/schema.kumi +20 -0
  178. data/golden/multirank_hoisting/expected/dfir.txt +40 -0
  179. data/golden/multirank_hoisting/expected/dfir_optimized.txt +109 -0
  180. data/golden/multirank_hoisting/expected/loopir.txt +164 -0
  181. data/golden/multirank_hoisting/expected/schema_javascript.mjs +183 -99
  182. data/golden/multirank_hoisting/expected/schema_ruby.rb +151 -90
  183. data/golden/multirank_hoisting/expected/vecir.txt +109 -0
  184. data/golden/nested_hash/expected/dfir.txt +6 -0
  185. data/golden/nested_hash/expected/dfir_optimized.txt +6 -0
  186. data/golden/nested_hash/expected/loopir.txt +6 -0
  187. data/golden/nested_hash/expected/schema_javascript.mjs +5 -4
  188. data/golden/nested_hash/expected/schema_ruby.rb +6 -4
  189. data/golden/nested_hash/expected/vecir.txt +6 -0
  190. data/golden/reduction_broadcast/expected/dfir.txt +27 -0
  191. data/golden/reduction_broadcast/expected/dfir_optimized.txt +44 -0
  192. data/golden/reduction_broadcast/expected/loopir.txt +68 -0
  193. data/golden/reduction_broadcast/expected/schema_javascript.mjs +77 -62
  194. data/golden/reduction_broadcast/expected/schema_ruby.rb +59 -59
  195. data/golden/reduction_broadcast/expected/vecir.txt +44 -0
  196. data/golden/roll/expected/dfir.txt +16 -0
  197. data/golden/roll/expected/dfir_optimized.txt +16 -0
  198. data/golden/roll/expected/loopir.txt +40 -0
  199. data/golden/roll/expected/schema_javascript.mjs +44 -46
  200. data/golden/roll/expected/schema_ruby.rb +36 -42
  201. data/golden/roll/expected/vecir.txt +16 -0
  202. data/golden/schema_imports_broadcasting_with_imports/expected/dfir.txt +8 -0
  203. data/golden/schema_imports_broadcasting_with_imports/expected/dfir_optimized.txt +13 -0
  204. data/golden/schema_imports_broadcasting_with_imports/expected/loopir.txt +19 -0
  205. data/golden/schema_imports_broadcasting_with_imports/expected/schema_javascript.mjs +21 -16
  206. data/golden/schema_imports_broadcasting_with_imports/expected/schema_ruby.rb +17 -14
  207. data/golden/schema_imports_broadcasting_with_imports/expected/vecir.txt +13 -0
  208. data/golden/schema_imports_complex_order_calc/expected/dfir.txt +41 -0
  209. data/golden/schema_imports_complex_order_calc/expected/dfir_optimized.txt +168 -0
  210. data/golden/schema_imports_complex_order_calc/expected/loopir.txt +202 -0
  211. data/golden/schema_imports_complex_order_calc/expected/schema_javascript.mjs +221 -117
  212. data/golden/schema_imports_complex_order_calc/expected/schema_ruby.rb +192 -107
  213. data/golden/schema_imports_complex_order_calc/expected/snast.txt +1 -1
  214. data/golden/schema_imports_complex_order_calc/expected/vecir.txt +168 -0
  215. data/golden/schema_imports_composed_order/expected/dfir.txt +15 -0
  216. data/golden/schema_imports_composed_order/expected/dfir_optimized.txt +29 -0
  217. data/golden/schema_imports_composed_order/expected/loopir.txt +29 -0
  218. data/golden/schema_imports_composed_order/expected/schema_javascript.mjs +28 -22
  219. data/golden/schema_imports_composed_order/expected/schema_ruby.rb +29 -19
  220. data/golden/schema_imports_composed_order/expected/vecir.txt +29 -0
  221. data/golden/schema_imports_discount_with_tax/expected/dfir.txt +18 -0
  222. data/golden/schema_imports_discount_with_tax/expected/dfir_optimized.txt +31 -0
  223. data/golden/schema_imports_discount_with_tax/expected/loopir.txt +31 -0
  224. data/golden/schema_imports_discount_with_tax/expected/schema_javascript.mjs +30 -21
  225. data/golden/schema_imports_discount_with_tax/expected/schema_ruby.rb +31 -17
  226. data/golden/schema_imports_discount_with_tax/expected/vecir.txt +31 -0
  227. data/golden/schema_imports_line_items/expected/dfir.txt +11 -0
  228. data/golden/schema_imports_line_items/expected/dfir_optimized.txt +26 -0
  229. data/golden/schema_imports_line_items/expected/loopir.txt +35 -0
  230. data/golden/schema_imports_line_items/expected/schema_javascript.mjs +36 -12
  231. data/golden/schema_imports_line_items/expected/schema_ruby.rb +35 -11
  232. data/golden/schema_imports_line_items/expected/snast.txt +1 -1
  233. data/golden/schema_imports_line_items/expected/vecir.txt +26 -0
  234. data/golden/schema_imports_multiple/expected/dfir.txt +17 -0
  235. data/golden/schema_imports_multiple/expected/dfir_optimized.txt +34 -0
  236. data/golden/schema_imports_multiple/expected/loopir.txt +34 -0
  237. data/golden/schema_imports_multiple/expected/schema_javascript.mjs +33 -24
  238. data/golden/schema_imports_multiple/expected/schema_ruby.rb +34 -20
  239. data/golden/schema_imports_multiple/expected/vecir.txt +34 -0
  240. data/golden/schema_imports_nested_expressions/expected/dfir.txt +14 -0
  241. data/golden/schema_imports_nested_expressions/expected/dfir_optimized.txt +24 -0
  242. data/golden/schema_imports_nested_expressions/expected/loopir.txt +24 -0
  243. data/golden/schema_imports_nested_expressions/expected/schema_javascript.mjs +21 -17
  244. data/golden/schema_imports_nested_expressions/expected/schema_ruby.rb +23 -16
  245. data/golden/schema_imports_nested_expressions/expected/vecir.txt +24 -0
  246. data/golden/schema_imports_nested_with_reductions/expected/dfir.txt +15 -0
  247. data/golden/schema_imports_nested_with_reductions/expected/dfir_optimized.txt +44 -0
  248. data/golden/schema_imports_nested_with_reductions/expected/loopir.txt +68 -0
  249. data/golden/schema_imports_nested_with_reductions/expected/schema_javascript.mjs +76 -37
  250. data/golden/schema_imports_nested_with_reductions/expected/schema_ruby.rb +64 -34
  251. data/golden/schema_imports_nested_with_reductions/expected/snast.txt +1 -1
  252. data/golden/schema_imports_nested_with_reductions/expected/vecir.txt +44 -0
  253. data/golden/schema_imports_with_imports/expected/dfir.txt +7 -0
  254. data/golden/schema_imports_with_imports/expected/dfir_optimized.txt +9 -0
  255. data/golden/schema_imports_with_imports/expected/loopir.txt +9 -0
  256. data/golden/schema_imports_with_imports/expected/schema_javascript.mjs +8 -6
  257. data/golden/schema_imports_with_imports/expected/schema_ruby.rb +9 -5
  258. data/golden/schema_imports_with_imports/expected/vecir.txt +9 -0
  259. data/golden/shift/expected/dfir.txt +24 -0
  260. data/golden/shift/expected/dfir_optimized.txt +24 -0
  261. data/golden/shift/expected/loopir.txt +64 -0
  262. data/golden/shift/expected/schema_javascript.mjs +72 -76
  263. data/golden/shift/expected/schema_ruby.rb +60 -70
  264. data/golden/shift/expected/vecir.txt +24 -0
  265. data/golden/shift_2d/expected/dfir.txt +60 -0
  266. data/golden/shift_2d/expected/dfir_optimized.txt +60 -0
  267. data/golden/shift_2d/expected/loopir.txt +176 -0
  268. data/golden/shift_2d/expected/schema_javascript.mjs +204 -260
  269. data/golden/shift_2d/expected/schema_ruby.rb +156 -236
  270. data/golden/shift_2d/expected/vecir.txt +60 -0
  271. data/golden/simple_math/expected/dfir.txt +21 -0
  272. data/golden/simple_math/expected/dfir_optimized.txt +21 -0
  273. data/golden/simple_math/expected/loopir.txt +21 -0
  274. data/golden/simple_math/expected/schema_javascript.mjs +17 -14
  275. data/golden/simple_math/expected/schema_ruby.rb +21 -14
  276. data/golden/simple_math/expected/vecir.txt +21 -0
  277. data/golden/streaming_basics/expected/dfir.txt +43 -0
  278. data/golden/streaming_basics/expected/dfir_optimized.txt +69 -0
  279. data/golden/streaming_basics/expected/loopir.txt +76 -0
  280. data/golden/streaming_basics/expected/schema_javascript.mjs +83 -67
  281. data/golden/streaming_basics/expected/schema_ruby.rb +69 -60
  282. data/golden/streaming_basics/expected/vecir.txt +69 -0
  283. data/golden/tuples/expected/dfir.txt +28 -0
  284. data/golden/tuples/expected/dfir_optimized.txt +42 -0
  285. data/golden/tuples/expected/loopir.txt +42 -0
  286. data/golden/tuples/expected/schema_javascript.mjs +41 -18
  287. data/golden/tuples/expected/schema_ruby.rb +42 -14
  288. data/golden/tuples/expected/vecir.txt +42 -0
  289. data/golden/tuples_and_arrays/expected/dfir.txt +26 -0
  290. data/golden/tuples_and_arrays/expected/dfir_optimized.txt +37 -0
  291. data/golden/tuples_and_arrays/expected/loopir.txt +45 -0
  292. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +49 -42
  293. data/golden/tuples_and_arrays/expected/schema_ruby.rb +41 -38
  294. data/golden/tuples_and_arrays/expected/vecir.txt +37 -0
  295. data/golden/us_tax_2024/expected/dfir.txt +189 -0
  296. data/golden/us_tax_2024/expected/dfir_optimized.txt +565 -0
  297. data/golden/us_tax_2024/expected/loopir.txt +685 -0
  298. data/golden/us_tax_2024/expected/schema_javascript.mjs +813 -119
  299. data/golden/us_tax_2024/expected/schema_ruby.rb +762 -125
  300. data/golden/us_tax_2024/expected/vecir.txt +567 -0
  301. data/golden/vector_make_object/expected/ast.txt +22 -0
  302. data/golden/vector_make_object/expected/dfir.txt +6 -0
  303. data/golden/vector_make_object/expected/dfir_optimized.txt +6 -0
  304. data/golden/vector_make_object/expected/input_plan.txt +5 -0
  305. data/golden/vector_make_object/expected/loopir.txt +9 -0
  306. data/golden/vector_make_object/expected/nast.txt +8 -0
  307. data/golden/vector_make_object/expected/schema_javascript.mjs +13 -0
  308. data/golden/vector_make_object/expected/schema_ruby.rb +14 -0
  309. data/golden/vector_make_object/expected/snast.txt +8 -0
  310. data/golden/vector_make_object/expected/vecir.txt +7 -0
  311. data/golden/vector_make_object/schema.kumi +11 -0
  312. data/golden/with_constants/expected/dfir.txt +9 -0
  313. data/golden/with_constants/expected/dfir_optimized.txt +9 -0
  314. data/golden/with_constants/expected/loopir.txt +9 -0
  315. data/golden/with_constants/expected/schema_javascript.mjs +8 -3
  316. data/golden/with_constants/expected/schema_ruby.rb +9 -3
  317. data/golden/with_constants/expected/vecir.txt +9 -0
  318. data/lib/kumi/analyzer.rb +20 -27
  319. data/lib/kumi/core/analyzer/pass_manager.rb +6 -1
  320. data/lib/kumi/core/analyzer/passes/codegen/loop/js/emitter.rb +204 -0
  321. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/emitter.rb +212 -0
  322. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/output_buffer.rb +74 -0
  323. data/lib/kumi/core/analyzer/passes/codegen/loop_js_pass.rb +24 -0
  324. data/lib/kumi/core/analyzer/passes/codegen/loop_ruby_pass.rb +24 -0
  325. data/lib/kumi/core/analyzer/passes/df_validate_pass.rb +24 -0
  326. data/lib/kumi/core/analyzer/passes/loop/lower_pass.rb +28 -0
  327. data/lib/kumi/core/analyzer/passes/loop_validate_pass.rb +21 -0
  328. data/lib/kumi/core/analyzer/passes/lower_to_dfir_pass.rb +37 -0
  329. data/lib/kumi/core/analyzer/passes/vec/lower_pass.rb +24 -0
  330. data/lib/kumi/core/analyzer/passes/vec_validate_pass.rb +21 -0
  331. data/lib/kumi/core/analyzer/plans.rb +2 -3
  332. data/lib/kumi/core/compiler/access_planner_v2.rb +33 -2
  333. data/lib/kumi/dev/golden/representation.rb +4 -7
  334. data/lib/kumi/dev/golden_v2.rb +292 -0
  335. data/lib/kumi/dev/pretty_printer.rb +42 -67
  336. data/lib/kumi/ir/README.md +163 -0
  337. data/lib/kumi/ir/base/block.rb +32 -0
  338. data/lib/kumi/ir/base/builder.rb +43 -0
  339. data/lib/kumi/ir/base/function.rb +45 -0
  340. data/lib/kumi/ir/base/instruction.rb +206 -0
  341. data/lib/kumi/ir/base/module.rb +37 -0
  342. data/lib/kumi/ir/base.rb +10 -0
  343. data/lib/kumi/ir/buf/lower.rb +28 -0
  344. data/lib/kumi/ir/buf/pipeline.rb +19 -0
  345. data/lib/kumi/ir/buf.rb +29 -0
  346. data/lib/kumi/ir/df/access_contract.rb +87 -0
  347. data/lib/kumi/ir/df/import_inliner.rb +89 -0
  348. data/lib/kumi/ir/df/import_loader.rb +63 -0
  349. data/lib/kumi/ir/df/lower.rb +397 -0
  350. data/lib/kumi/ir/df/ops/array_build.rb +23 -0
  351. data/lib/kumi/ir/df/ops/array_get.rb +29 -0
  352. data/lib/kumi/ir/df/ops/array_len.rb +23 -0
  353. data/lib/kumi/ir/df/ops/axis_broadcast.rb +28 -0
  354. data/lib/kumi/ir/df/ops/axis_index.rb +23 -0
  355. data/lib/kumi/ir/df/ops/axis_shift.rb +35 -0
  356. data/lib/kumi/ir/df/ops/constant.rb +21 -0
  357. data/lib/kumi/ir/df/ops/decl_ref.rb +23 -0
  358. data/lib/kumi/ir/df/ops/fold.rb +25 -0
  359. data/lib/kumi/ir/df/ops/import_call.rb +25 -0
  360. data/lib/kumi/ir/df/ops/load_field.rb +33 -0
  361. data/lib/kumi/ir/df/ops/load_input.rb +31 -0
  362. data/lib/kumi/ir/df/ops/make_object.rb +23 -0
  363. data/lib/kumi/ir/df/ops/map.rb +21 -0
  364. data/lib/kumi/ir/df/ops/node.rb +46 -0
  365. data/lib/kumi/ir/df/ops/reduce.rb +27 -0
  366. data/lib/kumi/ir/df/ops/select.rb +25 -0
  367. data/lib/kumi/ir/df/ops.rb +10 -0
  368. data/lib/kumi/ir/df/passes/broadcast_simplify.rb +74 -0
  369. data/lib/kumi/ir/df/passes/cse.rb +51 -0
  370. data/lib/kumi/ir/df/passes/decl_inlining.rb +131 -0
  371. data/lib/kumi/ir/df/passes/import_inlining.rb +272 -0
  372. data/lib/kumi/ir/df/passes/load_dedup.rb +93 -0
  373. data/lib/kumi/ir/df/passes/stencil_cse.rb +71 -0
  374. data/lib/kumi/ir/df/passes/support/instruction_cloner.rb +82 -0
  375. data/lib/kumi/ir/df/passes/tuple_fold_canonicalization.rb +181 -0
  376. data/lib/kumi/ir/df/passes/tuple_to_object.rb +58 -0
  377. data/lib/kumi/ir/df/passes.rb +11 -0
  378. data/lib/kumi/ir/df/pipeline.rb +32 -0
  379. data/lib/kumi/ir/df/validator.rb +120 -0
  380. data/lib/kumi/ir/df.rb +95 -0
  381. data/lib/kumi/ir/loop/builder.rb +84 -0
  382. data/lib/kumi/ir/loop/lower.rb +679 -0
  383. data/lib/kumi/ir/loop/ops/core_ops.rb +194 -0
  384. data/lib/kumi/ir/loop/ops/node.rb +45 -0
  385. data/lib/kumi/ir/loop/ops.rb +4 -0
  386. data/lib/kumi/ir/loop/pipeline.rb +19 -0
  387. data/lib/kumi/ir/loop/validator.rb +101 -0
  388. data/lib/kumi/ir/loop.rb +28 -0
  389. data/lib/kumi/ir/loop_definition.md +93 -0
  390. data/lib/kumi/ir/passes.rb +32 -0
  391. data/lib/kumi/ir/printer.rb +54 -0
  392. data/lib/kumi/ir/testing/snast_factory.rb +146 -0
  393. data/lib/kumi/ir/testing.rb +9 -0
  394. data/lib/kumi/ir/vec/lower.rb +131 -0
  395. data/lib/kumi/ir/vec/ops/core_ops.rb +126 -0
  396. data/lib/kumi/ir/vec/ops/node.rb +45 -0
  397. data/lib/kumi/ir/vec/ops.rb +13 -0
  398. data/lib/kumi/ir/vec/passes/axis_canonicalization.rb +57 -0
  399. data/lib/kumi/ir/vec/passes/constant_propagation.rb +110 -0
  400. data/lib/kumi/ir/vec/passes/dce.rb +52 -0
  401. data/lib/kumi/ir/vec/passes/gvn.rb +64 -0
  402. data/lib/kumi/ir/vec/passes/peephole_simplify.rb +67 -0
  403. data/lib/kumi/ir/vec/passes/stencil_detection.rb +60 -0
  404. data/lib/kumi/ir/vec/passes/support/instruction_cloner.rb +48 -0
  405. data/lib/kumi/ir/vec/passes.rb +16 -0
  406. data/lib/kumi/ir/vec/pipeline.rb +30 -0
  407. data/lib/kumi/ir/vec/validator.rb +68 -0
  408. data/lib/kumi/ir/vec.rb +66 -0
  409. data/lib/kumi/ir/vec_definition.md +102 -0
  410. data/lib/kumi/ir.rb +14 -0
  411. data/lib/kumi/support/nast_printer.rb +3 -0
  412. data/lib/kumi/version.rb +1 -1
  413. data/lib/kumi.rb +38 -37
  414. data/tasks/release.rake +129 -0
  415. metadata +298 -331
  416. data/CLAUDE.md +0 -45
  417. data/docs/COMPOSED_SCHEMAS.md +0 -137
  418. data/docs/GOLDEN_QUICK_START.md +0 -141
  419. data/golden/array_element/expected/lir_00_unoptimized.txt +0 -13
  420. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +0 -13
  421. data/golden/array_element/expected/lir_02_inlined.txt +0 -13
  422. data/golden/array_element/expected/lir_03_cse.txt +0 -13
  423. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +0 -13
  424. data/golden/array_element/expected/lir_04_loop_invcm.txt +0 -13
  425. data/golden/array_element/expected/lir_06_const_prop.txt +0 -13
  426. data/golden/array_index/expected/lir_00_unoptimized.txt +0 -41
  427. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +0 -41
  428. data/golden/array_index/expected/lir_02_inlined.txt +0 -42
  429. data/golden/array_index/expected/lir_03_cse.txt +0 -40
  430. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +0 -40
  431. data/golden/array_index/expected/lir_04_loop_invcm.txt +0 -40
  432. data/golden/array_index/expected/lir_06_const_prop.txt +0 -40
  433. data/golden/array_operations/expected/lir_00_unoptimized.txt +0 -47
  434. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +0 -47
  435. data/golden/array_operations/expected/lir_02_inlined.txt +0 -47
  436. data/golden/array_operations/expected/lir_03_cse.txt +0 -47
  437. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +0 -47
  438. data/golden/array_operations/expected/lir_04_loop_invcm.txt +0 -47
  439. data/golden/array_operations/expected/lir_06_const_prop.txt +0 -43
  440. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +0 -29
  441. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +0 -29
  442. data/golden/cascade_logic/expected/lir_02_inlined.txt +0 -37
  443. data/golden/cascade_logic/expected/lir_03_cse.txt +0 -30
  444. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +0 -30
  445. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +0 -30
  446. data/golden/cascade_logic/expected/lir_06_const_prop.txt +0 -23
  447. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +0 -76
  448. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +0 -76
  449. data/golden/chained_fusion/expected/lir_02_inlined.txt +0 -114
  450. data/golden/chained_fusion/expected/lir_03_cse.txt +0 -97
  451. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +0 -99
  452. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +0 -97
  453. data/golden/chained_fusion/expected/lir_06_const_prop.txt +0 -87
  454. data/golden/decimal_explicit/expected/lir_00_unoptimized.txt +0 -30
  455. data/golden/decimal_explicit/expected/lir_01_hoist_scalar_references.txt +0 -30
  456. data/golden/decimal_explicit/expected/lir_02_inlined.txt +0 -44
  457. data/golden/decimal_explicit/expected/lir_03_cse.txt +0 -40
  458. data/golden/decimal_explicit/expected/lir_04_1_loop_fusion.txt +0 -40
  459. data/golden/decimal_explicit/expected/lir_04_loop_invcm.txt +0 -40
  460. data/golden/decimal_explicit/expected/lir_06_const_prop.txt +0 -40
  461. data/golden/element_arrays/expected/lir_00_unoptimized.txt +0 -81
  462. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +0 -81
  463. data/golden/element_arrays/expected/lir_02_inlined.txt +0 -85
  464. data/golden/element_arrays/expected/lir_03_cse.txt +0 -83
  465. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +0 -83
  466. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +0 -83
  467. data/golden/element_arrays/expected/lir_06_const_prop.txt +0 -77
  468. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +0 -31
  469. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +0 -31
  470. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +0 -51
  471. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +0 -49
  472. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +0 -49
  473. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +0 -49
  474. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +0 -49
  475. data/golden/example_xpto/expected/lir_00_unoptimized.txt +0 -16
  476. data/golden/example_xpto/expected/lir_01_hoist_scalar_references.txt +0 -16
  477. data/golden/example_xpto/expected/lir_02_inlined.txt +0 -16
  478. data/golden/example_xpto/expected/lir_03_cse.txt +0 -16
  479. data/golden/example_xpto/expected/lir_04_1_loop_fusion.txt +0 -16
  480. data/golden/example_xpto/expected/lir_04_loop_invcm.txt +0 -16
  481. data/golden/example_xpto/expected/lir_06_const_prop.txt +0 -13
  482. data/golden/function_overload/expected/lir_00_unoptimized.txt +0 -18
  483. data/golden/function_overload/expected/lir_01_hoist_scalar_references.txt +0 -18
  484. data/golden/function_overload/expected/lir_02_inlined.txt +0 -20
  485. data/golden/function_overload/expected/lir_03_cse.txt +0 -20
  486. data/golden/function_overload/expected/lir_04_1_loop_fusion.txt +0 -20
  487. data/golden/function_overload/expected/lir_04_loop_invcm.txt +0 -20
  488. data/golden/function_overload/expected/lir_06_const_prop.txt +0 -20
  489. data/golden/game_of_life/expected/lir_00_unoptimized.txt +0 -343
  490. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +0 -343
  491. data/golden/game_of_life/expected/lir_02_inlined.txt +0 -1918
  492. data/golden/game_of_life/expected/lir_03_cse.txt +0 -770
  493. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +0 -770
  494. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +0 -770
  495. data/golden/game_of_life/expected/lir_06_const_prop.txt +0 -719
  496. data/golden/hash_keys/expected/lir_00_unoptimized.txt +0 -18
  497. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +0 -18
  498. data/golden/hash_keys/expected/lir_02_inlined.txt +0 -18
  499. data/golden/hash_keys/expected/lir_03_cse.txt +0 -18
  500. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +0 -18
  501. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +0 -18
  502. data/golden/hash_keys/expected/lir_06_const_prop.txt +0 -12
  503. data/golden/hash_value/expected/lir_00_unoptimized.txt +0 -30
  504. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +0 -30
  505. data/golden/hash_value/expected/lir_02_inlined.txt +0 -36
  506. data/golden/hash_value/expected/lir_03_cse.txt +0 -33
  507. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +0 -33
  508. data/golden/hash_value/expected/lir_04_loop_invcm.txt +0 -33
  509. data/golden/hash_value/expected/lir_06_const_prop.txt +0 -30
  510. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +0 -87
  511. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +0 -87
  512. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +0 -115
  513. data/golden/hierarchical_complex/expected/lir_03_cse.txt +0 -89
  514. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +0 -89
  515. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +0 -89
  516. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +0 -80
  517. data/golden/inline_rename_scope_leak/expected/lir_00_unoptimized.txt +0 -35
  518. data/golden/inline_rename_scope_leak/expected/lir_01_hoist_scalar_references.txt +0 -35
  519. data/golden/inline_rename_scope_leak/expected/lir_02_inlined.txt +0 -49
  520. data/golden/inline_rename_scope_leak/expected/lir_03_cse.txt +0 -49
  521. data/golden/inline_rename_scope_leak/expected/lir_04_1_loop_fusion.txt +0 -49
  522. data/golden/inline_rename_scope_leak/expected/lir_04_loop_invcm.txt +0 -49
  523. data/golden/inline_rename_scope_leak/expected/lir_06_const_prop.txt +0 -45
  524. data/golden/input_reference/expected/lir_00_unoptimized.txt +0 -39
  525. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +0 -39
  526. data/golden/input_reference/expected/lir_02_inlined.txt +0 -39
  527. data/golden/input_reference/expected/lir_03_cse.txt +0 -39
  528. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +0 -39
  529. data/golden/input_reference/expected/lir_04_loop_invcm.txt +0 -39
  530. data/golden/input_reference/expected/lir_06_const_prop.txt +0 -39
  531. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +0 -53
  532. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +0 -53
  533. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +0 -89
  534. data/golden/interleaved_fusion/expected/lir_03_cse.txt +0 -77
  535. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +0 -78
  536. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +0 -77
  537. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +0 -69
  538. data/golden/let_inline/expected/lir_00_unoptimized.txt +0 -26
  539. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +0 -26
  540. data/golden/let_inline/expected/lir_02_inlined.txt +0 -36
  541. data/golden/let_inline/expected/lir_03_cse.txt +0 -30
  542. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +0 -30
  543. data/golden/let_inline/expected/lir_04_loop_invcm.txt +0 -30
  544. data/golden/let_inline/expected/lir_06_const_prop.txt +0 -29
  545. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +0 -43
  546. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +0 -43
  547. data/golden/loop_fusion/expected/lir_02_inlined.txt +0 -62
  548. data/golden/loop_fusion/expected/lir_03_cse.txt +0 -57
  549. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +0 -57
  550. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +0 -57
  551. data/golden/loop_fusion/expected/lir_06_const_prop.txt +0 -51
  552. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +0 -59
  553. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +0 -59
  554. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +0 -63
  555. data/golden/min_reduce_scope/expected/lir_03_cse.txt +0 -60
  556. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +0 -60
  557. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +0 -60
  558. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +0 -57
  559. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +0 -42
  560. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +0 -42
  561. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +0 -48
  562. data/golden/mixed_dimensions/expected/lir_03_cse.txt +0 -48
  563. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +0 -48
  564. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +0 -48
  565. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +0 -47
  566. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +0 -75
  567. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +0 -75
  568. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +0 -126
  569. data/golden/multirank_hoisting/expected/lir_03_cse.txt +0 -109
  570. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +0 -109
  571. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +0 -109
  572. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +0 -100
  573. data/golden/nested_hash/expected/lir_00_unoptimized.txt +0 -10
  574. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +0 -10
  575. data/golden/nested_hash/expected/lir_02_inlined.txt +0 -10
  576. data/golden/nested_hash/expected/lir_03_cse.txt +0 -10
  577. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +0 -10
  578. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +0 -10
  579. data/golden/nested_hash/expected/lir_06_const_prop.txt +0 -9
  580. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +0 -49
  581. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +0 -49
  582. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +0 -80
  583. data/golden/reduction_broadcast/expected/lir_03_cse.txt +0 -68
  584. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +0 -68
  585. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +0 -68
  586. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +0 -68
  587. data/golden/roll/expected/lir_00_unoptimized.txt +0 -56
  588. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +0 -56
  589. data/golden/roll/expected/lir_02_inlined.txt +0 -56
  590. data/golden/roll/expected/lir_03_cse.txt +0 -55
  591. data/golden/roll/expected/lir_04_1_loop_fusion.txt +0 -55
  592. data/golden/roll/expected/lir_04_loop_invcm.txt +0 -55
  593. data/golden/roll/expected/lir_06_const_prop.txt +0 -48
  594. data/golden/schema_imports_broadcasting_with_imports/expected/lir_00_unoptimized.txt +0 -20
  595. data/golden/schema_imports_broadcasting_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -20
  596. data/golden/schema_imports_broadcasting_with_imports/expected/lir_02_inlined.txt +0 -22
  597. data/golden/schema_imports_broadcasting_with_imports/expected/lir_03_cse.txt +0 -21
  598. data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_1_loop_fusion.txt +0 -21
  599. data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_loop_invcm.txt +0 -21
  600. data/golden/schema_imports_broadcasting_with_imports/expected/lir_06_const_prop.txt +0 -21
  601. data/golden/schema_imports_complex_order_calc/expected/lir_00_unoptimized.txt +0 -94
  602. data/golden/schema_imports_complex_order_calc/expected/lir_01_hoist_scalar_references.txt +0 -94
  603. data/golden/schema_imports_complex_order_calc/expected/lir_02_inlined.txt +0 -187
  604. data/golden/schema_imports_complex_order_calc/expected/lir_03_cse.txt +0 -131
  605. data/golden/schema_imports_complex_order_calc/expected/lir_04_1_loop_fusion.txt +0 -131
  606. data/golden/schema_imports_complex_order_calc/expected/lir_04_loop_invcm.txt +0 -131
  607. data/golden/schema_imports_complex_order_calc/expected/lir_06_const_prop.txt +0 -131
  608. data/golden/schema_imports_composed_order/expected/lir_00_unoptimized.txt +0 -25
  609. data/golden/schema_imports_composed_order/expected/lir_01_hoist_scalar_references.txt +0 -25
  610. data/golden/schema_imports_composed_order/expected/lir_02_inlined.txt +0 -33
  611. data/golden/schema_imports_composed_order/expected/lir_03_cse.txt +0 -33
  612. data/golden/schema_imports_composed_order/expected/lir_04_1_loop_fusion.txt +0 -33
  613. data/golden/schema_imports_composed_order/expected/lir_04_loop_invcm.txt +0 -33
  614. data/golden/schema_imports_composed_order/expected/lir_06_const_prop.txt +0 -33
  615. data/golden/schema_imports_discount_with_tax/expected/lir_00_unoptimized.txt +0 -30
  616. data/golden/schema_imports_discount_with_tax/expected/lir_01_hoist_scalar_references.txt +0 -30
  617. data/golden/schema_imports_discount_with_tax/expected/lir_02_inlined.txt +0 -37
  618. data/golden/schema_imports_discount_with_tax/expected/lir_03_cse.txt +0 -34
  619. data/golden/schema_imports_discount_with_tax/expected/lir_04_1_loop_fusion.txt +0 -34
  620. data/golden/schema_imports_discount_with_tax/expected/lir_04_loop_invcm.txt +0 -34
  621. data/golden/schema_imports_discount_with_tax/expected/lir_06_const_prop.txt +0 -34
  622. data/golden/schema_imports_line_items/expected/lir_00_unoptimized.txt +0 -19
  623. data/golden/schema_imports_line_items/expected/lir_01_hoist_scalar_references.txt +0 -19
  624. data/golden/schema_imports_line_items/expected/lir_02_inlined.txt +0 -24
  625. data/golden/schema_imports_line_items/expected/lir_03_cse.txt +0 -22
  626. data/golden/schema_imports_line_items/expected/lir_04_1_loop_fusion.txt +0 -22
  627. data/golden/schema_imports_line_items/expected/lir_04_loop_invcm.txt +0 -22
  628. data/golden/schema_imports_line_items/expected/lir_06_const_prop.txt +0 -22
  629. data/golden/schema_imports_multiple/expected/lir_00_unoptimized.txt +0 -29
  630. data/golden/schema_imports_multiple/expected/lir_01_hoist_scalar_references.txt +0 -29
  631. data/golden/schema_imports_multiple/expected/lir_02_inlined.txt +0 -41
  632. data/golden/schema_imports_multiple/expected/lir_03_cse.txt +0 -37
  633. data/golden/schema_imports_multiple/expected/lir_04_1_loop_fusion.txt +0 -37
  634. data/golden/schema_imports_multiple/expected/lir_04_loop_invcm.txt +0 -37
  635. data/golden/schema_imports_multiple/expected/lir_06_const_prop.txt +0 -37
  636. data/golden/schema_imports_nested_expressions/expected/lir_00_unoptimized.txt +0 -22
  637. data/golden/schema_imports_nested_expressions/expected/lir_01_hoist_scalar_references.txt +0 -22
  638. data/golden/schema_imports_nested_expressions/expected/lir_02_inlined.txt +0 -32
  639. data/golden/schema_imports_nested_expressions/expected/lir_03_cse.txt +0 -32
  640. data/golden/schema_imports_nested_expressions/expected/lir_04_1_loop_fusion.txt +0 -32
  641. data/golden/schema_imports_nested_expressions/expected/lir_04_loop_invcm.txt +0 -32
  642. data/golden/schema_imports_nested_expressions/expected/lir_06_const_prop.txt +0 -28
  643. data/golden/schema_imports_nested_with_reductions/expected/lir_00_unoptimized.txt +0 -31
  644. data/golden/schema_imports_nested_with_reductions/expected/lir_01_hoist_scalar_references.txt +0 -31
  645. data/golden/schema_imports_nested_with_reductions/expected/lir_02_inlined.txt +0 -58
  646. data/golden/schema_imports_nested_with_reductions/expected/lir_03_cse.txt +0 -49
  647. data/golden/schema_imports_nested_with_reductions/expected/lir_04_1_loop_fusion.txt +0 -51
  648. data/golden/schema_imports_nested_with_reductions/expected/lir_04_loop_invcm.txt +0 -49
  649. data/golden/schema_imports_nested_with_reductions/expected/lir_06_const_prop.txt +0 -49
  650. data/golden/schema_imports_with_imports/expected/lir_00_unoptimized.txt +0 -13
  651. data/golden/schema_imports_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -13
  652. data/golden/schema_imports_with_imports/expected/lir_02_inlined.txt +0 -14
  653. data/golden/schema_imports_with_imports/expected/lir_03_cse.txt +0 -13
  654. data/golden/schema_imports_with_imports/expected/lir_04_1_loop_fusion.txt +0 -13
  655. data/golden/schema_imports_with_imports/expected/lir_04_loop_invcm.txt +0 -13
  656. data/golden/schema_imports_with_imports/expected/lir_06_const_prop.txt +0 -13
  657. data/golden/shift/expected/lir_00_unoptimized.txt +0 -96
  658. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +0 -96
  659. data/golden/shift/expected/lir_02_inlined.txt +0 -96
  660. data/golden/shift/expected/lir_03_cse.txt +0 -90
  661. data/golden/shift/expected/lir_04_1_loop_fusion.txt +0 -90
  662. data/golden/shift/expected/lir_04_loop_invcm.txt +0 -90
  663. data/golden/shift/expected/lir_06_const_prop.txt +0 -78
  664. data/golden/shift_2d/expected/lir_00_unoptimized.txt +0 -274
  665. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +0 -274
  666. data/golden/shift_2d/expected/lir_02_inlined.txt +0 -274
  667. data/golden/shift_2d/expected/lir_03_cse.txt +0 -262
  668. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +0 -262
  669. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +0 -262
  670. data/golden/shift_2d/expected/lir_06_const_prop.txt +0 -238
  671. data/golden/simple_math/expected/lir_00_unoptimized.txt +0 -31
  672. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +0 -31
  673. data/golden/simple_math/expected/lir_02_inlined.txt +0 -31
  674. data/golden/simple_math/expected/lir_03_cse.txt +0 -31
  675. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +0 -31
  676. data/golden/simple_math/expected/lir_04_loop_invcm.txt +0 -31
  677. data/golden/simple_math/expected/lir_06_const_prop.txt +0 -28
  678. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +0 -73
  679. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +0 -73
  680. data/golden/streaming_basics/expected/lir_02_inlined.txt +0 -100
  681. data/golden/streaming_basics/expected/lir_03_cse.txt +0 -84
  682. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +0 -84
  683. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +0 -84
  684. data/golden/streaming_basics/expected/lir_06_const_prop.txt +0 -78
  685. data/golden/tuples/expected/lir_00_unoptimized.txt +0 -40
  686. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +0 -40
  687. data/golden/tuples/expected/lir_02_inlined.txt +0 -48
  688. data/golden/tuples/expected/lir_03_cse.txt +0 -48
  689. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +0 -48
  690. data/golden/tuples/expected/lir_04_loop_invcm.txt +0 -48
  691. data/golden/tuples/expected/lir_06_const_prop.txt +0 -31
  692. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +0 -41
  693. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +0 -41
  694. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +0 -62
  695. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +0 -51
  696. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +0 -51
  697. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +0 -51
  698. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +0 -47
  699. data/golden/us_tax_2024/expected/lir_00_unoptimized.txt +0 -291
  700. data/golden/us_tax_2024/expected/lir_01_hoist_scalar_references.txt +0 -291
  701. data/golden/us_tax_2024/expected/lir_02_inlined.txt +0 -1254
  702. data/golden/us_tax_2024/expected/lir_03_cse.txt +0 -626
  703. data/golden/us_tax_2024/expected/lir_04_1_loop_fusion.txt +0 -671
  704. data/golden/us_tax_2024/expected/lir_04_loop_invcm.txt +0 -626
  705. data/golden/us_tax_2024/expected/lir_06_const_prop.txt +0 -549
  706. data/golden/with_constants/expected/lir_00_unoptimized.txt +0 -17
  707. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +0 -17
  708. data/golden/with_constants/expected/lir_02_inlined.txt +0 -17
  709. data/golden/with_constants/expected/lir_03_cse.txt +0 -17
  710. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +0 -17
  711. data/golden/with_constants/expected/lir_04_loop_invcm.txt +0 -17
  712. data/golden/with_constants/expected/lir_06_const_prop.txt +0 -12
  713. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +0 -337
  714. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +0 -75
  715. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +0 -103
  716. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +0 -27
  717. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +0 -330
  718. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +0 -85
  719. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +0 -79
  720. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +0 -32
  721. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +0 -125
  722. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +0 -93
  723. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +0 -115
  724. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +0 -394
  725. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +0 -198
  726. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +0 -30
  727. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +0 -121
  728. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +0 -156
  729. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +0 -148
  730. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +0 -422
  731. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +0 -241
  732. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +0 -83
  733. data/lib/kumi/core/lir/analyze.rb +0 -64
  734. data/lib/kumi/core/lir/build.rb +0 -390
  735. data/lib/kumi/core/lir/emit.rb +0 -62
  736. data/lib/kumi/core/lir/peephole.rb +0 -164
  737. data/lib/kumi/core/lir/structs/instruction.rb +0 -44
  738. data/lib/kumi/core/lir/structs/literal.rb +0 -14
  739. data/lib/kumi/core/lir/structs/stamp.rb +0 -13
  740. data/lib/kumi/core/lir/support/error.rb +0 -9
  741. data/lib/kumi/core/lir/support/ids.rb +0 -34
  742. data/lib/kumi/core/lir/validate.rb +0 -74
  743. data/lib/kumi/core/lir.rb +0 -34
  744. data/lib/kumi/support/lir_printer.rb +0 -159
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7b98e39a72b87991ec1e2055ca1ad9ca996a1e95924ca5d4e201043f679564ed
4
- data.tar.gz: ac6b469fd9cb3aa8d01bc4907c4f40ba5dbbc900e95e8309a9c68595b57d9c30
3
+ metadata.gz: 74f061f34a9936380a89aff28563594be891ac849f233613edf5ad9b52acce64
4
+ data.tar.gz: 8c7ee4b31d80293c18d8ea5914ae51ec80a489f6950352dd47044aa1b1aecba1
5
5
  SHA512:
6
- metadata.gz: 3e8b32dbcb228a886a4089992ddaa2cabbe977477226561d09be2d6a3583ebf9d3276f338e99e9612e4c1dbfe6e911801b70747aa4dbc47b820949b2425661f0
7
- data.tar.gz: 6537e18270ed92b04a80f14c24758cda316a5658a2d92d7940b2f7770ef51518eabd2f421e85516484f0c49b2c699f4bc2bac63e07b08b8108f8cd500654282f
6
+ metadata.gz: 70164a71693f388d25f2b2c8fc3c7d938860bb6e0f06344f06f7be96d1edb25a1e88686339fb81e919f6fde6d11510d14174cea22c3acc9f200bcc5c6fbf8724
7
+ data.tar.gz: 02df5faaef97f3d951a5fb022d7621daf1cec37ee482d0aa8db366c0ff7e0f44f6dc301302745249de1901c63c6e40dc52cff3e8d0019712ddae364196a4f642
data/.codex ADDED
File without changes
data/CHANGELOG.md CHANGED
@@ -1,5 +1,23 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.0.35] – 2026-06-11
4
+ ### Added
5
+ - **Dataflow IR Pipeline:** New DF IR graph, typed operations, validation, import inlining, broadcast simplification, CSE, load deduplication, tuple/object canonicalization, and golden artifact coverage.
6
+ - **Vector IR Pipeline:** New VecIR builder, lowerer, validator, axis canonicalization, constant propagation, GVN, DCE, peephole simplification, stencil detection, and focused specs.
7
+ - **Loop IR Pipeline:** New LoopIR builder/lowerer/validator and Ruby/JavaScript loop codegen path replacing the legacy LIR codegen pipeline.
8
+ - **IR Tooling:** Shared IR base types, pass pipeline infrastructure, pretty printers, SNAST factory helpers, and expanded golden v2 output artifacts for DF/Vec/Loop stages.
9
+ - **Regression Coverage:** External installed-gem loading spec that builds and installs the gem in an isolated `GEM_HOME` so runtime packaging issues are caught.
10
+
11
+ ### Changed
12
+ - Removed the legacy LIR pipeline and refreshed golden outputs to the DF/Vec/Loop representation stack.
13
+ - Updated generated Ruby and JavaScript output to use the LoopIR-backed codegen path.
14
+ - Hardened kernel definitions and docs around numeric reductions, string aggregations, arithmetic helpers, and min/max empty-array behavior.
15
+ - Revised architecture, schema import, golden test, and development documentation around the new IR pipeline.
16
+
17
+ ### Fixed
18
+ - Runtime `require "kumi"` no longer loads golden-test support files or leaks the Zeitwerk loader as a top-level `AUTOLOADER` constant.
19
+ - Golden shared schemas are loaded only through `Kumi.load_shared_schemas!`, preserving test support behavior without coupling it to normal gem loading.
20
+
3
21
  ## [0.0.33] – 2025-11-05
4
22
  ### Added
5
23
  - **Peephole Optimization Helper:** `Kumi::Core::LIR::Peephole` plus specs for safer peephole transforms, inline Ruby clamp kernel, richer LIR dumps, and refreshed golden files
data/README.md CHANGED
@@ -10,36 +10,44 @@
10
10
 
11
11
  ## What is Kumi?
12
12
 
13
- Kumi is a **declarative DSL for building calculation systems**.
13
+ Kumi is a **declarative DSL for calculation logic** — tax rules, pricing, scoring, financial projections — that compiles to plain Ruby and JavaScript.
14
14
 
15
- Schemas define:
16
- - Input shape (scalars, arrays, nested structures)
17
- - Declarations (computed values and boolean conditions)
18
- - Dependencies between declarations
15
+ You declare the shape of your input data and the values you want computed. The compiler determines evaluation order, checks types, detects impossible conditions, and emits dependency-free code for each target.
19
16
 
20
- The compiler:
21
- - Performs type checking
22
- - Detects unsatisfiable constraints
23
- - Determines evaluation order
24
- - Generates code for Ruby or JavaScript
17
+ ```ruby
18
+ schema do
19
+ input do
20
+ array :items do
21
+ hash :item do
22
+ integer :quantity
23
+ decimal :unit_price
24
+ end
25
+ end
26
+ end
25
27
 
26
- ## Use Cases
28
+ value :line_totals, input.items.item.quantity * input.items.item.unit_price
29
+ value :subtotal, fn(:sum, line_totals)
30
+ end
31
+ ```
27
32
 
28
- Calculation systems appear in: tax engines, pricing models, financial projections, compliance systems, insurance underwriting, shipping rate calculators.
33
+ No loops, no iteration plumbing: `line_totals` is computed per item because that's where the data lives, and `fn(:sum, ...)` collapses it back to a scalar. This works through arbitrarily nested arrays.
29
34
 
30
- ---
35
+ ## Why
31
36
 
32
- **Status**: experimental. Public API may change. Typing and some static checks are still evolving.
37
+ - **One source of truth, two targets.** The same schema compiles to Ruby and JavaScript with identical semantics write pricing logic once, run it in your backend and in the browser preview.
38
+ - **Broadcasting from data shape.** Operations align over arrays automatically based on the declared input structure, including nested and ragged data.
39
+ - **Static checks at compile time.** Type checking, dependency cycle detection, and unsatisfiable-constraint detection happen when the schema is defined, not in production.
40
+ - **Boring generated code.** Output is deterministic, dependency-free, straight-line code with explicit loops. What you read is what runs.
33
41
 
34
- **Feedback**: have a use case or hit a rough edge? Open an issue or reach out (andremuta+kumi@gmail.com).
42
+ ## Use Cases
43
+
44
+ Tax engines, pricing models, financial projections, compliance rules, insurance underwriting, shipping rate calculators — anywhere calculation logic must be correct, auditable, and consistent across platforms.
35
45
 
36
46
  ---
37
47
 
38
- ## Examples
48
+ **Status**: experimental. Public API may change. Typing and some static checks are still evolving.
39
49
 
40
- - **US Tax Calculator (2024)** — a single schema computes federal, state, and FICA taxes across multiple filing statuses. [Open in the demo](https://kumi-play-web.fly.dev/?example=us-federal-tax-2024).
41
- - **Monte Carlo Portfolio** — demonstrates probabilistic simulations and table visualizations. [Open in the demo](https://kumi-play-web.fly.dev/?example=monte-carlo-simulation).
42
- - **Conway's Game of Life** — showcases array operations powering a grid-based simulation. [Open in the demo](https://kumi-play-web.fly.dev/?example=game-of-life).
50
+ **Feedback**: have a use case or hit a rough edge? Open an issue or reach out (andremuta+kumi@gmail.com).
43
51
 
44
52
  ---
45
53
 
@@ -85,18 +93,22 @@ Double.write_source("output.mjs", platform: :javascript)
85
93
  You can also override the compilation strategy without touching code by setting
86
94
  `KUMI_COMPILATION_MODE` to `jit` or `aot` (e.g. `export KUMI_COMPILATION_MODE=aot`).
87
95
 
88
- Try the [interactive demo](https://kumi-play-web.fly.dev/) (no setup required).
96
+ ## Examples
97
+
98
+ - **US Tax Calculator (2024)** — a single schema computes federal, state, and FICA taxes across multiple filing statuses. [Open in the demo](https://kumi-play-web.fly.dev/?example=us-federal-tax-2024).
99
+ - **Monte Carlo Portfolio** — probabilistic simulations and table visualizations. [Open in the demo](https://kumi-play-web.fly.dev/?example=monte-carlo-simulation).
100
+ - **Conway's Game of Life** — array operations powering a grid-based simulation. [Open in the demo](https://kumi-play-web.fly.dev/?example=game-of-life).
89
101
 
90
102
  ---
91
103
 
92
104
  ## Documentation
93
105
 
94
- - **[Syntax Reference](docs/SYNTAX.md)** - DSL syntax, types, operators, functions, and schema imports
95
- - **[Functions Reference](docs/FUNCTIONS.md)** - Auto-generated docs for all functions and kernels
96
- - **[functions-reference.json](docs/functions-reference.json)** - Machine-readable format for IDEs (VSCode, Monaco, etc.)
97
- - **[Development Guide](docs/DEVELOPMENT.md)** - Testing, debugging, and contributing
98
-
99
- To regenerate function docs: `bin/kumi-doc-gen`
106
+ - **[Syntax Reference](docs/SYNTAX.md)** DSL syntax, types, operators, functions
107
+ - **[Functions Reference](docs/FUNCTIONS.md)** auto-generated docs for all functions and kernels ([machine-readable JSON](docs/functions-reference.json))
108
+ - **[Schema Imports](docs/SCHEMA_IMPORTS.md)** composing and reusing schemas
109
+ - **[Architecture](docs/ARCHITECTURE.md)** the compiler pipeline and IR stack
110
+ - **[Golden Tests](docs/GOLDEN_TESTS.md)** — the end-to-end test harness
111
+ - **[Development Guide](docs/DEVELOPMENT.md)** — tooling, docs generation, IDE integration
100
112
 
101
113
  ---
102
114
 
data/Rakefile CHANGED
@@ -9,4 +9,6 @@ require "rubocop/rake_task"
9
9
 
10
10
  RuboCop::RakeTask.new
11
11
 
12
+ Dir[File.join(__dir__, "tasks/**/*.rake")].each { |task_file| import task_file }
13
+
12
14
  task default: %i[spec rubocop]
@@ -7,6 +7,8 @@ functions:
7
7
  param: source_value
8
8
  reduction_strategy: identity # This function has a true identity value.
9
9
  aliases: ["sum"]
10
+ options:
11
+ tuple_fold_combiner: core.add
10
12
 
11
13
  - id: agg.count
12
14
  kind: reduce
@@ -25,6 +27,8 @@ functions:
25
27
  param: source_value
26
28
  reduction_strategy: first_element
27
29
  aliases: ["min"]
30
+ options:
31
+ tuple_fold_combiner: core.min
28
32
 
29
33
  - id: agg.max
30
34
  kind: reduce
@@ -34,6 +38,8 @@ functions:
34
38
  param: source_value
35
39
  reduction_strategy: first_element
36
40
  aliases: ["max"]
41
+ options:
42
+ tuple_fold_combiner: core.max
37
43
 
38
44
  - id: agg.mean
39
45
  kind: reduce
@@ -7,6 +7,32 @@ functions:
7
7
  param: number
8
8
  aliases: ["abs"]
9
9
 
10
+ - id: core.max
11
+ kind: elementwise
12
+ params:
13
+ - { name: left_operand, dtype: numeric }
14
+ - { name: right_operand, dtype: numeric }
15
+ dtype:
16
+ rule: promote
17
+ params: [left_operand, right_operand]
18
+ constraint_semantics:
19
+ pure_combiner: true
20
+ commutativity: true
21
+ associativity: true
22
+
23
+ - id: core.min
24
+ kind: elementwise
25
+ params:
26
+ - { name: left_operand, dtype: numeric }
27
+ - { name: right_operand, dtype: numeric }
28
+ dtype:
29
+ rule: promote
30
+ params: [left_operand, right_operand]
31
+ constraint_semantics:
32
+ pure_combiner: true
33
+ commutativity: true
34
+ associativity: true
35
+
10
36
  - id: core.add
11
37
  kind: elementwise
12
38
  params:
@@ -16,12 +16,16 @@ kernels:
16
16
 
17
17
  - id: agg.min:javascript:v1
18
18
  fn: agg.min
19
- # Handles first element being null/undefined
20
- inline: "= ($0 === null || $1 < $0) ? $1 : $0"
19
+ # Skips null values (an inner reduction over an empty array yields null);
20
+ # the $1 !== null guard is required because null coerces to 0 in
21
+ # relational comparisons (null < 5 is true).
22
+ inline: "= ($1 !== null && ($0 === null || $1 < $0)) ? $1 : $0"
21
23
  fold_inline: "= Math.min(...$0)"
22
24
 
23
25
  - id: agg.max:javascript:v1
24
26
  fn: agg.max
25
- # Handles first element being null/undefined
26
- inline: "= ($0 === null || $1 > $0) ? $1 : $0"
27
+ # Skips null values (an inner reduction over an empty array yields null);
28
+ # the $1 !== null guard is required because null coerces to 0 in
29
+ # relational comparisons (null > -5 is true).
30
+ inline: "= ($1 !== null && ($0 === null || $1 > $0)) ? $1 : $0"
27
31
  fold_inline: "= Math.max(...$0)"
@@ -2,4 +2,7 @@ kernels:
2
2
  - id: agg.join:javascript:v1
3
3
  fn: agg.join
4
4
  inline: "+= $1"
5
- fold_inline: "= $0.join('')"
5
+ fold_inline: "= $0.join('')"
6
+ # String concatenation identity: join over an empty array is "".
7
+ identity:
8
+ string: ""
@@ -7,6 +7,14 @@ kernels:
7
7
  fn: core.mod
8
8
  inline: "= (($0 % $1) + $1) % $1"
9
9
 
10
+ - id: max:javascript:v1
11
+ fn: core.max
12
+ inline: "= Math.max($0, $1)"
13
+
14
+ - id: min:javascript:v1
15
+ fn: core.min
16
+ inline: "= Math.min($0, $1)"
17
+
10
18
  - id: add:javascript:v1
11
19
  fn: core.add
12
20
  inline: "= $0 + $1"
@@ -18,12 +18,16 @@ kernels:
18
18
 
19
19
  - id: agg.min:ruby:v1
20
20
  fn: agg.min
21
- inline: "= $1 if $1 < $0"
21
+ # Skips nil values (an inner reduction over an empty array yields nil),
22
+ # matching the javascript kernel's null handling.
23
+ inline: "= $1 if !$1.nil? && $1 < $0"
22
24
  impl: "(a, b)\n a < b ? a : b"
23
25
  fold_inline: "= $0.min"
24
26
 
25
27
  - id: agg.max:ruby:v1
26
28
  fn: agg.max
27
- inline: "= $1 if $1 > $0"
29
+ # Skips nil values (an inner reduction over an empty array yields nil),
30
+ # matching the javascript kernel's null handling.
31
+ inline: "= $1 if !$1.nil? && $1 > $0"
28
32
  impl: "(a, b)\n a > b ? a : b"
29
33
  fold_inline: "= $0.max"
@@ -2,4 +2,7 @@ kernels:
2
2
  - id: agg.join:ruby:v1
3
3
  fn: agg.join
4
4
  inline: "+= $1"
5
- fold_inline: "= $0.join"
5
+ fold_inline: "= $0.join"
6
+ # String concatenation identity: join over an empty array is "".
7
+ identity:
8
+ string: ""
@@ -7,6 +7,16 @@ kernels:
7
7
  fn: core.mod
8
8
  inline: "= $0 % $1"
9
9
 
10
+ - id: max:ruby:v1
11
+ fn: core.max
12
+ inline: "= $0 > $1 ? $0 : $1"
13
+ impl: "(a, b)\n a > b ? a : b"
14
+
15
+ - id: min:ruby:v1
16
+ fn: core.min
17
+ inline: "= $0 < $1 ? $0 : $1"
18
+ impl: "(a, b)\n a < b ? a : b"
19
+
10
20
  - id: add:ruby:v1
11
21
  fn: core.add
12
22
  inline: "= $0 + $1"
data/docs/AGENTS.md ADDED
@@ -0,0 +1,60 @@
1
+ # Agent Reference
2
+
3
+ A toolbox for inspecting and debugging the compiler pipeline. The pipeline is
4
+ SNAST → DFIR → VecIR → LoopIR → Ruby/JS emitters; see
5
+ [ARCHITECTURE.md](ARCHITECTURE.md).
6
+
7
+ ## Inspect One Layer for One Schema
8
+
9
+ ```bash
10
+ bundle exec bin/kumi pp <repr> <schema.kumi>
11
+ # reprs: ast, input_plan, nast, snast, dfir, dfir_optimized, vecir, loopir,
12
+ # schema_ruby, schema_javascript
13
+ bundle exec bin/kumi pp loopir golden/multi_loop_reduction/schema.kumi
14
+ ```
15
+
16
+ This is the fastest way to surface a lowering crash in a specific layer.
17
+
18
+ ## Sweep for Crashes
19
+
20
+ ```bash
21
+ for d in golden/*/; do
22
+ bundle exec bin/kumi pp loopir "$d/schema.kumi" >/dev/null || echo "$d"
23
+ done
24
+ ```
25
+
26
+ ## Phase-Scoped Golden Checks
27
+
28
+ ```bash
29
+ bundle exec bin/kumi golden_v2 verify --repr loop # one layer, all schemas
30
+ bundle exec bin/kumi golden_v2 diff --repr df <schema> # unified diff
31
+ bundle exec bin/kumi golden_v2 update --repr vec,loop # regenerate layers
32
+ ```
33
+
34
+ Groups: `frontend`, `df`, `vec`, `loop`, `codegen`, `all`.
35
+
36
+ ## Runtime Ground Truth
37
+
38
+ ```bash
39
+ bundle exec bin/kumi golden test # regenerate + execute Ruby and JS
40
+ bundle exec bin/kumi golden test <schema>
41
+ ```
42
+
43
+ ## Search Goldens Instead of Reading Them
44
+
45
+ Some golden artifacts are large (`game_of_life`, `us_tax_2024`) — grep them:
46
+
47
+ ```bash
48
+ rg -n "reduce" golden -g"dfir*.txt"
49
+ rg -n "axis_shift" golden -g"vecir.txt"
50
+ rg -n "function" golden/<schema>/expected/loopir.txt
51
+ ```
52
+
53
+ ## Other Useful Commands
54
+
55
+ ```bash
56
+ bundle exec bin/kumi analyze <schema> --dump <state_key> # inspect analyzer state
57
+ bundle exec rspec # full test suite
58
+ ```
59
+
60
+ `tmp/` is gitignored and a good place for debug scripts.