kumi 0.0.31 → 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 (771) hide show
  1. checksums.yaml +4 -4
  2. data/.codex +0 -0
  3. data/CHANGELOG.md +39 -1
  4. data/README.md +50 -106
  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 +12 -2
  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 +155 -0
  20. data/docs/SYNTAX.md +48 -0
  21. data/docs/UNSAT_DETECTION.md +2 -1
  22. data/golden/array_element/expected/dfir.txt +5 -0
  23. data/golden/array_element/expected/dfir_optimized.txt +5 -0
  24. data/golden/array_element/expected/loopir.txt +11 -0
  25. data/golden/array_element/expected/schema_javascript.mjs +13 -10
  26. data/golden/array_element/expected/schema_ruby.rb +11 -36
  27. data/golden/array_element/expected/vecir.txt +5 -0
  28. data/golden/array_index/expected/dfir.txt +25 -0
  29. data/golden/array_index/expected/dfir_optimized.txt +27 -0
  30. data/golden/array_index/expected/loopir.txt +44 -0
  31. data/golden/array_index/expected/nast.txt +6 -6
  32. data/golden/array_index/expected/schema_javascript.mjs +53 -36
  33. data/golden/array_index/expected/schema_ruby.rb +41 -58
  34. data/golden/array_index/expected/snast.txt +2 -2
  35. data/golden/array_index/expected/vecir.txt +27 -0
  36. data/golden/array_operations/expected/dfir.txt +36 -0
  37. data/golden/array_operations/expected/dfir_optimized.txt +36 -0
  38. data/golden/array_operations/expected/loopir.txt +45 -0
  39. data/golden/array_operations/expected/schema_javascript.mjs +50 -45
  40. data/golden/array_operations/expected/schema_ruby.rb +46 -75
  41. data/golden/array_operations/expected/vecir.txt +36 -0
  42. data/golden/cascade_logic/expected/dfir.txt +21 -0
  43. data/golden/cascade_logic/expected/dfir_optimized.txt +22 -0
  44. data/golden/cascade_logic/expected/loopir.txt +22 -0
  45. data/golden/cascade_logic/expected/schema_javascript.mjs +18 -18
  46. data/golden/cascade_logic/expected/schema_ruby.rb +25 -49
  47. data/golden/cascade_logic/expected/vecir.txt +22 -0
  48. data/golden/chained_fusion/expected/dfir.txt +53 -0
  49. data/golden/chained_fusion/expected/dfir_optimized.txt +75 -0
  50. data/golden/chained_fusion/expected/loopir.txt +95 -0
  51. data/golden/chained_fusion/expected/schema_javascript.mjs +105 -101
  52. data/golden/chained_fusion/expected/schema_ruby.rb +93 -128
  53. data/golden/chained_fusion/expected/vecir.txt +75 -0
  54. data/golden/decimal_explicit/expected/dfir.txt +18 -0
  55. data/golden/decimal_explicit/expected/dfir_optimized.txt +28 -0
  56. data/golden/decimal_explicit/expected/loopir.txt +28 -0
  57. data/golden/decimal_explicit/expected/schema_javascript.mjs +31 -19
  58. data/golden/decimal_explicit/expected/schema_ruby.rb +34 -46
  59. data/golden/decimal_explicit/expected/vecir.txt +28 -0
  60. data/golden/element_arrays/expected/dfir.txt +42 -0
  61. data/golden/element_arrays/expected/dfir_optimized.txt +50 -0
  62. data/golden/element_arrays/expected/loopir.txt +92 -0
  63. data/golden/element_arrays/expected/schema_javascript.mjs +107 -85
  64. data/golden/element_arrays/expected/schema_ruby.rb +85 -111
  65. data/golden/element_arrays/expected/snast.txt +6 -6
  66. data/golden/element_arrays/expected/vecir.txt +50 -0
  67. data/golden/empty_and_null_inputs/expected/dfir.txt +14 -0
  68. data/golden/empty_and_null_inputs/expected/dfir_optimized.txt +25 -0
  69. data/golden/empty_and_null_inputs/expected/loopir.txt +43 -0
  70. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +49 -38
  71. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +41 -66
  72. data/golden/empty_and_null_inputs/expected/vecir.txt +25 -0
  73. data/golden/example_xpto/expected/ast.txt +23 -0
  74. data/golden/example_xpto/expected/dfir.txt +10 -0
  75. data/golden/example_xpto/expected/dfir_optimized.txt +10 -0
  76. data/golden/example_xpto/expected/input_plan.txt +1 -0
  77. data/golden/example_xpto/expected/loopir.txt +10 -0
  78. data/golden/example_xpto/expected/nast.txt +17 -0
  79. data/golden/example_xpto/expected/schema_javascript.mjs +16 -0
  80. data/golden/example_xpto/expected/schema_ruby.rb +18 -0
  81. data/golden/example_xpto/expected/snast.txt +17 -0
  82. data/golden/example_xpto/expected/vecir.txt +10 -0
  83. data/golden/example_xpto/expected.json +4 -0
  84. data/golden/example_xpto/input.json +3 -0
  85. data/golden/example_xpto/schema.kumi +8 -0
  86. data/golden/function_overload/expected/dfir.txt +10 -0
  87. data/golden/function_overload/expected/dfir_optimized.txt +12 -0
  88. data/golden/function_overload/expected/loopir.txt +12 -0
  89. data/golden/function_overload/expected/schema_javascript.mjs +17 -8
  90. data/golden/function_overload/expected/schema_ruby.rb +16 -32
  91. data/golden/function_overload/expected/snast.txt +1 -1
  92. data/golden/function_overload/expected/vecir.txt +12 -0
  93. data/golden/game_of_life/expected/dfir.txt +69 -0
  94. data/golden/game_of_life/expected/dfir_optimized.txt +207 -0
  95. data/golden/game_of_life/expected/loopir.txt +694 -0
  96. data/golden/game_of_life/expected/schema_javascript.mjs +841 -97
  97. data/golden/game_of_life/expected/schema_ruby.rb +792 -115
  98. data/golden/game_of_life/expected/vecir.txt +207 -0
  99. data/golden/hash_keys/expected/dfir.txt +14 -0
  100. data/golden/hash_keys/expected/dfir_optimized.txt +14 -0
  101. data/golden/hash_keys/expected/loopir.txt +14 -0
  102. data/golden/hash_keys/expected/schema_javascript.mjs +13 -30
  103. data/golden/hash_keys/expected/schema_ruby.rb +16 -58
  104. data/golden/hash_keys/expected/vecir.txt +14 -0
  105. data/golden/hash_value/expected/dfir.txt +21 -0
  106. data/golden/hash_value/expected/dfir_optimized.txt +25 -0
  107. data/golden/hash_value/expected/loopir.txt +31 -0
  108. data/golden/hash_value/expected/schema_javascript.mjs +34 -37
  109. data/golden/hash_value/expected/schema_ruby.rb +32 -65
  110. data/golden/hash_value/expected/vecir.txt +25 -0
  111. data/golden/hierarchical_complex/expected/dfir.txt +86 -0
  112. data/golden/hierarchical_complex/expected/dfir_optimized.txt +88 -0
  113. data/golden/hierarchical_complex/expected/loopir.txt +129 -0
  114. data/golden/hierarchical_complex/expected/schema_javascript.mjs +145 -109
  115. data/golden/hierarchical_complex/expected/schema_ruby.rb +119 -127
  116. data/golden/hierarchical_complex/expected/vecir.txt +88 -0
  117. data/golden/inline_rename_scope_leak/expected/dfir.txt +19 -0
  118. data/golden/inline_rename_scope_leak/expected/dfir_optimized.txt +27 -0
  119. data/golden/inline_rename_scope_leak/expected/loopir.txt +35 -0
  120. data/golden/inline_rename_scope_leak/expected/schema_javascript.mjs +39 -39
  121. data/golden/inline_rename_scope_leak/expected/schema_ruby.rb +36 -69
  122. data/golden/inline_rename_scope_leak/expected/vecir.txt +23 -0
  123. data/golden/input_reference/expected/dfir.txt +22 -0
  124. data/golden/input_reference/expected/dfir_optimized.txt +22 -0
  125. data/golden/input_reference/expected/loopir.txt +33 -0
  126. data/golden/input_reference/expected/schema_javascript.mjs +36 -30
  127. data/golden/input_reference/expected/schema_ruby.rb +36 -60
  128. data/golden/input_reference/expected/snast.txt +1 -1
  129. data/golden/input_reference/expected/vecir.txt +22 -0
  130. data/golden/interleaved_fusion/expected/dfir.txt +35 -0
  131. data/golden/interleaved_fusion/expected/dfir_optimized.txt +60 -0
  132. data/golden/interleaved_fusion/expected/loopir.txt +74 -0
  133. data/golden/interleaved_fusion/expected/schema_javascript.mjs +82 -73
  134. data/golden/interleaved_fusion/expected/schema_ruby.rb +70 -104
  135. data/golden/interleaved_fusion/expected/vecir.txt +60 -0
  136. data/golden/let_inline/expected/dfir.txt +16 -0
  137. data/golden/let_inline/expected/dfir_optimized.txt +20 -0
  138. data/golden/let_inline/expected/loopir.txt +20 -0
  139. data/golden/let_inline/expected/schema_javascript.mjs +28 -7
  140. data/golden/let_inline/expected/schema_ruby.rb +25 -28
  141. data/golden/let_inline/expected/vecir.txt +20 -0
  142. data/golden/loop_fusion/expected/dfir.txt +29 -0
  143. data/golden/loop_fusion/expected/dfir_optimized.txt +47 -0
  144. data/golden/loop_fusion/expected/loopir.txt +55 -0
  145. data/golden/loop_fusion/expected/schema_javascript.mjs +61 -55
  146. data/golden/loop_fusion/expected/schema_ruby.rb +53 -84
  147. data/golden/loop_fusion/expected/vecir.txt +47 -0
  148. data/golden/min_max_empty_arrays/expected/ast.txt +58 -0
  149. data/golden/min_max_empty_arrays/expected/dfir.txt +27 -0
  150. data/golden/min_max_empty_arrays/expected/dfir_optimized.txt +37 -0
  151. data/golden/min_max_empty_arrays/expected/input_plan.txt +15 -0
  152. data/golden/min_max_empty_arrays/expected/loopir.txt +67 -0
  153. data/golden/min_max_empty_arrays/expected/nast.txt +27 -0
  154. data/golden/min_max_empty_arrays/expected/schema_javascript.mjs +92 -0
  155. data/golden/min_max_empty_arrays/expected/schema_ruby.rb +90 -0
  156. data/golden/min_max_empty_arrays/expected/snast.txt +27 -0
  157. data/golden/min_max_empty_arrays/expected/vecir.txt +37 -0
  158. data/golden/min_max_empty_arrays/expected.json +7 -0
  159. data/golden/min_max_empty_arrays/input.json +12 -0
  160. data/golden/min_max_empty_arrays/schema.kumi +24 -0
  161. data/golden/min_reduce_scope/expected/dfir.txt +35 -0
  162. data/golden/min_reduce_scope/expected/dfir_optimized.txt +37 -0
  163. data/golden/min_reduce_scope/expected/loopir.txt +58 -0
  164. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -54
  165. data/golden/min_reduce_scope/expected/schema_ruby.rb +55 -82
  166. data/golden/min_reduce_scope/expected/vecir.txt +37 -0
  167. data/golden/mixed_dimensions/expected/dfir.txt +23 -0
  168. data/golden/mixed_dimensions/expected/dfir_optimized.txt +26 -0
  169. data/golden/mixed_dimensions/expected/loopir.txt +44 -0
  170. data/golden/mixed_dimensions/expected/schema_javascript.mjs +50 -41
  171. data/golden/mixed_dimensions/expected/schema_ruby.rb +43 -69
  172. data/golden/mixed_dimensions/expected/vecir.txt +28 -0
  173. data/golden/multi_loop_reduction/expected/ast.txt +39 -0
  174. data/golden/multi_loop_reduction/expected/dfir.txt +23 -0
  175. data/golden/multi_loop_reduction/expected/dfir_optimized.txt +25 -0
  176. data/golden/multi_loop_reduction/expected/input_plan.txt +5 -0
  177. data/golden/multi_loop_reduction/expected/loopir.txt +37 -0
  178. data/golden/multi_loop_reduction/expected/nast.txt +25 -0
  179. data/golden/multi_loop_reduction/expected/schema_javascript.mjs +50 -0
  180. data/golden/multi_loop_reduction/expected/schema_ruby.rb +48 -0
  181. data/golden/multi_loop_reduction/expected/snast.txt +25 -0
  182. data/golden/multi_loop_reduction/expected/vecir.txt +25 -0
  183. data/golden/multi_loop_reduction/expected.json +5 -0
  184. data/golden/multi_loop_reduction/input.json +7 -0
  185. data/golden/multi_loop_reduction/schema.kumi +20 -0
  186. data/golden/multirank_hoisting/expected/dfir.txt +40 -0
  187. data/golden/multirank_hoisting/expected/dfir_optimized.txt +109 -0
  188. data/golden/multirank_hoisting/expected/loopir.txt +164 -0
  189. data/golden/multirank_hoisting/expected/schema_javascript.mjs +183 -108
  190. data/golden/multirank_hoisting/expected/schema_ruby.rb +157 -135
  191. data/golden/multirank_hoisting/expected/vecir.txt +109 -0
  192. data/golden/nested_hash/expected/dfir.txt +6 -0
  193. data/golden/nested_hash/expected/dfir_optimized.txt +6 -0
  194. data/golden/nested_hash/expected/loopir.txt +6 -0
  195. data/golden/nested_hash/expected/schema_javascript.mjs +5 -5
  196. data/golden/nested_hash/expected/schema_ruby.rb +8 -32
  197. data/golden/nested_hash/expected/vecir.txt +6 -0
  198. data/golden/reduction_broadcast/expected/dfir.txt +27 -0
  199. data/golden/reduction_broadcast/expected/dfir_optimized.txt +44 -0
  200. data/golden/reduction_broadcast/expected/loopir.txt +68 -0
  201. data/golden/reduction_broadcast/expected/schema_javascript.mjs +77 -62
  202. data/golden/reduction_broadcast/expected/schema_ruby.rb +64 -92
  203. data/golden/reduction_broadcast/expected/vecir.txt +44 -0
  204. data/golden/roll/expected/dfir.txt +16 -0
  205. data/golden/roll/expected/dfir_optimized.txt +16 -0
  206. data/golden/roll/expected/loopir.txt +40 -0
  207. data/golden/roll/expected/schema_javascript.mjs +44 -53
  208. data/golden/roll/expected/schema_ruby.rb +41 -82
  209. data/golden/roll/expected/vecir.txt +16 -0
  210. data/golden/schema_imports_broadcasting_with_imports/expected/ast.txt +26 -0
  211. data/golden/schema_imports_broadcasting_with_imports/expected/dfir.txt +8 -0
  212. data/golden/schema_imports_broadcasting_with_imports/expected/dfir_optimized.txt +13 -0
  213. data/golden/schema_imports_broadcasting_with_imports/expected/input_plan.txt +5 -0
  214. data/golden/schema_imports_broadcasting_with_imports/expected/loopir.txt +19 -0
  215. data/golden/schema_imports_broadcasting_with_imports/expected/nast.txt +12 -0
  216. data/golden/schema_imports_broadcasting_with_imports/expected/schema_javascript.mjs +27 -0
  217. data/golden/schema_imports_broadcasting_with_imports/expected/schema_ruby.rb +27 -0
  218. data/golden/schema_imports_broadcasting_with_imports/expected/snast.txt +12 -0
  219. data/golden/schema_imports_broadcasting_with_imports/expected/vecir.txt +13 -0
  220. data/golden/schema_imports_broadcasting_with_imports/expected.json +4 -0
  221. data/golden/schema_imports_broadcasting_with_imports/input.json +7 -0
  222. data/golden/schema_imports_broadcasting_with_imports/schema.kumi +14 -0
  223. data/golden/schema_imports_complex_order_calc/expected/ast.txt +82 -0
  224. data/golden/schema_imports_complex_order_calc/expected/dfir.txt +41 -0
  225. data/golden/schema_imports_complex_order_calc/expected/dfir_optimized.txt +168 -0
  226. data/golden/schema_imports_complex_order_calc/expected/input_plan.txt +16 -0
  227. data/golden/schema_imports_complex_order_calc/expected/loopir.txt +202 -0
  228. data/golden/schema_imports_complex_order_calc/expected/nast.txt +56 -0
  229. data/golden/schema_imports_complex_order_calc/expected/schema_javascript.mjs +251 -0
  230. data/golden/schema_imports_complex_order_calc/expected/schema_ruby.rb +234 -0
  231. data/golden/schema_imports_complex_order_calc/expected/snast.txt +56 -0
  232. data/golden/schema_imports_complex_order_calc/expected/vecir.txt +168 -0
  233. data/golden/schema_imports_complex_order_calc/expected.json +12 -0
  234. data/golden/schema_imports_complex_order_calc/input.json +20 -0
  235. data/golden/schema_imports_complex_order_calc/schema.kumi +33 -0
  236. data/golden/schema_imports_composed_order/expected/ast.txt +33 -0
  237. data/golden/schema_imports_composed_order/expected/dfir.txt +15 -0
  238. data/golden/schema_imports_composed_order/expected/dfir_optimized.txt +29 -0
  239. data/golden/schema_imports_composed_order/expected/input_plan.txt +3 -0
  240. data/golden/schema_imports_composed_order/expected/loopir.txt +29 -0
  241. data/golden/schema_imports_composed_order/expected/nast.txt +25 -0
  242. data/golden/schema_imports_composed_order/expected/schema_javascript.mjs +41 -0
  243. data/golden/schema_imports_composed_order/expected/schema_ruby.rb +43 -0
  244. data/golden/schema_imports_composed_order/expected/snast.txt +25 -0
  245. data/golden/schema_imports_composed_order/expected/vecir.txt +29 -0
  246. data/golden/schema_imports_composed_order/expected.json +6 -0
  247. data/golden/schema_imports_composed_order/input.json +5 -0
  248. data/golden/schema_imports_composed_order/schema.kumi +15 -0
  249. data/golden/schema_imports_discount_with_tax/expected/ast.txt +37 -0
  250. data/golden/schema_imports_discount_with_tax/expected/dfir.txt +18 -0
  251. data/golden/schema_imports_discount_with_tax/expected/dfir_optimized.txt +31 -0
  252. data/golden/schema_imports_discount_with_tax/expected/input_plan.txt +2 -0
  253. data/golden/schema_imports_discount_with_tax/expected/loopir.txt +31 -0
  254. data/golden/schema_imports_discount_with_tax/expected/nast.txt +30 -0
  255. data/golden/schema_imports_discount_with_tax/expected/schema_javascript.mjs +46 -0
  256. data/golden/schema_imports_discount_with_tax/expected/schema_ruby.rb +48 -0
  257. data/golden/schema_imports_discount_with_tax/expected/snast.txt +30 -0
  258. data/golden/schema_imports_discount_with_tax/expected/vecir.txt +31 -0
  259. data/golden/schema_imports_discount_with_tax/expected.json +7 -0
  260. data/golden/schema_imports_discount_with_tax/input.json +4 -0
  261. data/golden/schema_imports_discount_with_tax/schema.kumi +15 -0
  262. data/golden/schema_imports_line_items/expected/ast.txt +35 -0
  263. data/golden/schema_imports_line_items/expected/dfir.txt +11 -0
  264. data/golden/schema_imports_line_items/expected/dfir_optimized.txt +26 -0
  265. data/golden/schema_imports_line_items/expected/input_plan.txt +8 -0
  266. data/golden/schema_imports_line_items/expected/loopir.txt +35 -0
  267. data/golden/schema_imports_line_items/expected/nast.txt +19 -0
  268. data/golden/schema_imports_line_items/expected/schema_javascript.mjs +47 -0
  269. data/golden/schema_imports_line_items/expected/schema_ruby.rb +46 -0
  270. data/golden/schema_imports_line_items/expected/snast.txt +19 -0
  271. data/golden/schema_imports_line_items/expected/vecir.txt +26 -0
  272. data/golden/schema_imports_line_items/expected.json +5 -0
  273. data/golden/schema_imports_line_items/input.json +13 -0
  274. data/golden/schema_imports_line_items/schema.kumi +17 -0
  275. data/golden/schema_imports_multiple/expected/ast.txt +35 -0
  276. data/golden/schema_imports_multiple/expected/dfir.txt +17 -0
  277. data/golden/schema_imports_multiple/expected/dfir_optimized.txt +34 -0
  278. data/golden/schema_imports_multiple/expected/input_plan.txt +2 -0
  279. data/golden/schema_imports_multiple/expected/loopir.txt +34 -0
  280. data/golden/schema_imports_multiple/expected/nast.txt +28 -0
  281. data/golden/schema_imports_multiple/expected/schema_javascript.mjs +49 -0
  282. data/golden/schema_imports_multiple/expected/schema_ruby.rb +51 -0
  283. data/golden/schema_imports_multiple/expected/snast.txt +28 -0
  284. data/golden/schema_imports_multiple/expected/vecir.txt +34 -0
  285. data/golden/schema_imports_multiple/expected.json +7 -0
  286. data/golden/schema_imports_multiple/input.json +4 -0
  287. data/golden/schema_imports_multiple/schema.kumi +15 -0
  288. data/golden/schema_imports_nested_expressions/expected/ast.txt +31 -0
  289. data/golden/schema_imports_nested_expressions/expected/dfir.txt +14 -0
  290. data/golden/schema_imports_nested_expressions/expected/dfir_optimized.txt +24 -0
  291. data/golden/schema_imports_nested_expressions/expected/input_plan.txt +3 -0
  292. data/golden/schema_imports_nested_expressions/expected/loopir.txt +24 -0
  293. data/golden/schema_imports_nested_expressions/expected/nast.txt +23 -0
  294. data/golden/schema_imports_nested_expressions/expected/schema_javascript.mjs +33 -0
  295. data/golden/schema_imports_nested_expressions/expected/schema_ruby.rb +35 -0
  296. data/golden/schema_imports_nested_expressions/expected/snast.txt +23 -0
  297. data/golden/schema_imports_nested_expressions/expected/vecir.txt +24 -0
  298. data/golden/schema_imports_nested_expressions/expected.json +5 -0
  299. data/golden/schema_imports_nested_expressions/input.json +5 -0
  300. data/golden/schema_imports_nested_expressions/schema.kumi +13 -0
  301. data/golden/schema_imports_nested_with_reductions/expected/ast.txt +47 -0
  302. data/golden/schema_imports_nested_with_reductions/expected/dfir.txt +15 -0
  303. data/golden/schema_imports_nested_with_reductions/expected/dfir_optimized.txt +44 -0
  304. data/golden/schema_imports_nested_with_reductions/expected/input_plan.txt +12 -0
  305. data/golden/schema_imports_nested_with_reductions/expected/loopir.txt +68 -0
  306. data/golden/schema_imports_nested_with_reductions/expected/nast.txt +23 -0
  307. data/golden/schema_imports_nested_with_reductions/expected/schema_javascript.mjs +88 -0
  308. data/golden/schema_imports_nested_with_reductions/expected/schema_ruby.rb +82 -0
  309. data/golden/schema_imports_nested_with_reductions/expected/snast.txt +23 -0
  310. data/golden/schema_imports_nested_with_reductions/expected/vecir.txt +44 -0
  311. data/golden/schema_imports_nested_with_reductions/expected.json +6 -0
  312. data/golden/schema_imports_nested_with_reductions/input.json +16 -0
  313. data/golden/schema_imports_nested_with_reductions/schema.kumi +23 -0
  314. data/golden/schema_imports_with_imports/expected/ast.txt +19 -0
  315. data/golden/schema_imports_with_imports/expected/dfir.txt +7 -0
  316. data/golden/schema_imports_with_imports/expected/dfir_optimized.txt +9 -0
  317. data/golden/schema_imports_with_imports/expected/input_plan.txt +1 -0
  318. data/golden/schema_imports_with_imports/expected/loopir.txt +9 -0
  319. data/golden/schema_imports_with_imports/expected/nast.txt +13 -0
  320. data/golden/schema_imports_with_imports/expected/schema_javascript.mjs +15 -0
  321. data/golden/schema_imports_with_imports/expected/schema_ruby.rb +17 -0
  322. data/golden/schema_imports_with_imports/expected/snast.txt +13 -0
  323. data/golden/schema_imports_with_imports/expected/vecir.txt +9 -0
  324. data/golden/schema_imports_with_imports/expected.json +4 -0
  325. data/golden/schema_imports_with_imports/input.json +3 -0
  326. data/golden/schema_imports_with_imports/schema.kumi +10 -0
  327. data/golden/shift/expected/dfir.txt +24 -0
  328. data/golden/shift/expected/dfir_optimized.txt +24 -0
  329. data/golden/shift/expected/loopir.txt +64 -0
  330. data/golden/shift/expected/schema_javascript.mjs +72 -88
  331. data/golden/shift/expected/schema_ruby.rb +67 -119
  332. data/golden/shift/expected/vecir.txt +24 -0
  333. data/golden/shift_2d/expected/dfir.txt +60 -0
  334. data/golden/shift_2d/expected/dfir_optimized.txt +60 -0
  335. data/golden/shift_2d/expected/loopir.txt +176 -0
  336. data/golden/shift_2d/expected/schema_javascript.mjs +204 -284
  337. data/golden/shift_2d/expected/schema_ruby.rb +169 -309
  338. data/golden/shift_2d/expected/vecir.txt +60 -0
  339. data/golden/simple_math/expected/dfir.txt +21 -0
  340. data/golden/simple_math/expected/dfir_optimized.txt +21 -0
  341. data/golden/simple_math/expected/loopir.txt +21 -0
  342. data/golden/simple_math/expected/schema_javascript.mjs +17 -17
  343. data/golden/simple_math/expected/schema_ruby.rb +24 -48
  344. data/golden/simple_math/expected/vecir.txt +21 -0
  345. data/golden/streaming_basics/expected/dfir.txt +43 -0
  346. data/golden/streaming_basics/expected/dfir_optimized.txt +69 -0
  347. data/golden/streaming_basics/expected/loopir.txt +76 -0
  348. data/golden/streaming_basics/expected/schema_javascript.mjs +83 -73
  349. data/golden/streaming_basics/expected/schema_ruby.rb +77 -105
  350. data/golden/streaming_basics/expected/vecir.txt +69 -0
  351. data/golden/tuples/expected/dfir.txt +28 -0
  352. data/golden/tuples/expected/dfir_optimized.txt +42 -0
  353. data/golden/tuples/expected/loopir.txt +42 -0
  354. data/golden/tuples/expected/schema_javascript.mjs +41 -35
  355. data/golden/tuples/expected/schema_ruby.rb +56 -74
  356. data/golden/tuples/expected/vecir.txt +42 -0
  357. data/golden/tuples_and_arrays/expected/dfir.txt +26 -0
  358. data/golden/tuples_and_arrays/expected/dfir_optimized.txt +37 -0
  359. data/golden/tuples_and_arrays/expected/loopir.txt +45 -0
  360. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +49 -46
  361. data/golden/tuples_and_arrays/expected/schema_ruby.rb +46 -75
  362. data/golden/tuples_and_arrays/expected/vecir.txt +37 -0
  363. data/golden/us_tax_2024/expected/dfir.txt +189 -0
  364. data/golden/us_tax_2024/expected/dfir_optimized.txt +565 -0
  365. data/golden/us_tax_2024/expected/loopir.txt +685 -0
  366. data/golden/us_tax_2024/expected/schema_javascript.mjs +813 -127
  367. data/golden/us_tax_2024/expected/schema_ruby.rb +763 -159
  368. data/golden/us_tax_2024/expected/vecir.txt +567 -0
  369. data/golden/vector_make_object/expected/ast.txt +22 -0
  370. data/golden/vector_make_object/expected/dfir.txt +6 -0
  371. data/golden/vector_make_object/expected/dfir_optimized.txt +6 -0
  372. data/golden/vector_make_object/expected/input_plan.txt +5 -0
  373. data/golden/vector_make_object/expected/loopir.txt +9 -0
  374. data/golden/vector_make_object/expected/nast.txt +8 -0
  375. data/golden/vector_make_object/expected/schema_javascript.mjs +13 -0
  376. data/golden/vector_make_object/expected/schema_ruby.rb +14 -0
  377. data/golden/vector_make_object/expected/snast.txt +8 -0
  378. data/golden/vector_make_object/expected/vecir.txt +7 -0
  379. data/golden/vector_make_object/schema.kumi +11 -0
  380. data/golden/with_constants/expected/dfir.txt +9 -0
  381. data/golden/with_constants/expected/dfir_optimized.txt +9 -0
  382. data/golden/with_constants/expected/loopir.txt +9 -0
  383. data/golden/with_constants/expected/schema_javascript.mjs +8 -8
  384. data/golden/with_constants/expected/schema_ruby.rb +13 -37
  385. data/golden/with_constants/expected/vecir.txt +9 -0
  386. data/lib/kumi/analyzer.rb +28 -34
  387. data/lib/kumi/configuration.rb +7 -6
  388. data/lib/kumi/core/analyzer/pass_manager.rb +6 -1
  389. data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +1 -1
  390. data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +1 -1
  391. data/lib/kumi/core/analyzer/passes/codegen/loop/js/emitter.rb +204 -0
  392. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/emitter.rb +212 -0
  393. data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/output_buffer.rb +74 -0
  394. data/lib/kumi/core/analyzer/passes/codegen/loop_js_pass.rb +24 -0
  395. data/lib/kumi/core/analyzer/passes/codegen/loop_ruby_pass.rb +24 -0
  396. data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +6 -0
  397. data/lib/kumi/core/analyzer/passes/df_validate_pass.rb +24 -0
  398. data/lib/kumi/core/analyzer/passes/import_analysis_pass.rb +90 -0
  399. data/lib/kumi/core/analyzer/passes/loop/lower_pass.rb +28 -0
  400. data/lib/kumi/core/analyzer/passes/loop_validate_pass.rb +21 -0
  401. data/lib/kumi/core/analyzer/passes/lower_to_dfir_pass.rb +37 -0
  402. data/lib/kumi/core/analyzer/passes/name_indexer.rb +20 -2
  403. data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +44 -0
  404. data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +30 -0
  405. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -1
  406. data/lib/kumi/core/analyzer/passes/snast_pass.rb +15 -0
  407. data/lib/kumi/core/analyzer/passes/vec/lower_pass.rb +24 -0
  408. data/lib/kumi/core/analyzer/passes/vec_validate_pass.rb +21 -0
  409. data/lib/kumi/core/analyzer/plans.rb +2 -3
  410. data/lib/kumi/core/compiler/access_planner_v2.rb +33 -2
  411. data/lib/kumi/core/nast.rb +16 -0
  412. data/lib/kumi/core/ruby_parser/build_context.rb +3 -1
  413. data/lib/kumi/core/ruby_parser/parser.rb +1 -1
  414. data/lib/kumi/core/ruby_parser/schema_builder.rb +33 -3
  415. data/lib/kumi/dev/golden/representation.rb +4 -7
  416. data/lib/kumi/dev/golden/result.rb +9 -3
  417. data/lib/kumi/dev/golden/runtime_test.rb +16 -1
  418. data/lib/kumi/dev/golden.rb +18 -20
  419. data/lib/kumi/dev/golden_schema_modules.rb +8 -0
  420. data/lib/kumi/dev/golden_schema_wrapper.rb +116 -0
  421. data/lib/kumi/dev/golden_v2.rb +292 -0
  422. data/lib/kumi/dev/pretty_printer.rb +42 -67
  423. data/lib/kumi/dev/support/kumi_runner.mjs +18 -0
  424. data/lib/kumi/ir/README.md +163 -0
  425. data/lib/kumi/ir/base/block.rb +32 -0
  426. data/lib/kumi/ir/base/builder.rb +43 -0
  427. data/lib/kumi/ir/base/function.rb +45 -0
  428. data/lib/kumi/ir/base/instruction.rb +206 -0
  429. data/lib/kumi/ir/base/module.rb +37 -0
  430. data/lib/kumi/ir/base.rb +10 -0
  431. data/lib/kumi/ir/buf/lower.rb +28 -0
  432. data/lib/kumi/ir/buf/pipeline.rb +19 -0
  433. data/lib/kumi/ir/buf.rb +29 -0
  434. data/lib/kumi/ir/df/access_contract.rb +87 -0
  435. data/lib/kumi/ir/df/import_inliner.rb +89 -0
  436. data/lib/kumi/ir/df/import_loader.rb +63 -0
  437. data/lib/kumi/ir/df/lower.rb +397 -0
  438. data/lib/kumi/ir/df/ops/array_build.rb +23 -0
  439. data/lib/kumi/ir/df/ops/array_get.rb +29 -0
  440. data/lib/kumi/ir/df/ops/array_len.rb +23 -0
  441. data/lib/kumi/ir/df/ops/axis_broadcast.rb +28 -0
  442. data/lib/kumi/ir/df/ops/axis_index.rb +23 -0
  443. data/lib/kumi/ir/df/ops/axis_shift.rb +35 -0
  444. data/lib/kumi/ir/df/ops/constant.rb +21 -0
  445. data/lib/kumi/ir/df/ops/decl_ref.rb +23 -0
  446. data/lib/kumi/ir/df/ops/fold.rb +25 -0
  447. data/lib/kumi/ir/df/ops/import_call.rb +25 -0
  448. data/lib/kumi/ir/df/ops/load_field.rb +33 -0
  449. data/lib/kumi/ir/df/ops/load_input.rb +31 -0
  450. data/lib/kumi/ir/df/ops/make_object.rb +23 -0
  451. data/lib/kumi/ir/df/ops/map.rb +21 -0
  452. data/lib/kumi/ir/df/ops/node.rb +46 -0
  453. data/lib/kumi/ir/df/ops/reduce.rb +27 -0
  454. data/lib/kumi/ir/df/ops/select.rb +25 -0
  455. data/lib/kumi/ir/df/ops.rb +10 -0
  456. data/lib/kumi/ir/df/passes/broadcast_simplify.rb +74 -0
  457. data/lib/kumi/ir/df/passes/cse.rb +51 -0
  458. data/lib/kumi/ir/df/passes/decl_inlining.rb +131 -0
  459. data/lib/kumi/ir/df/passes/import_inlining.rb +272 -0
  460. data/lib/kumi/ir/df/passes/load_dedup.rb +93 -0
  461. data/lib/kumi/ir/df/passes/stencil_cse.rb +71 -0
  462. data/lib/kumi/ir/df/passes/support/instruction_cloner.rb +82 -0
  463. data/lib/kumi/ir/df/passes/tuple_fold_canonicalization.rb +181 -0
  464. data/lib/kumi/ir/df/passes/tuple_to_object.rb +58 -0
  465. data/lib/kumi/ir/df/passes.rb +11 -0
  466. data/lib/kumi/ir/df/pipeline.rb +32 -0
  467. data/lib/kumi/ir/df/validator.rb +120 -0
  468. data/lib/kumi/ir/df.rb +95 -0
  469. data/lib/kumi/ir/loop/builder.rb +84 -0
  470. data/lib/kumi/ir/loop/lower.rb +679 -0
  471. data/lib/kumi/ir/loop/ops/core_ops.rb +194 -0
  472. data/lib/kumi/ir/loop/ops/node.rb +45 -0
  473. data/lib/kumi/ir/loop/ops.rb +4 -0
  474. data/lib/kumi/ir/loop/pipeline.rb +19 -0
  475. data/lib/kumi/ir/loop/validator.rb +101 -0
  476. data/lib/kumi/ir/loop.rb +28 -0
  477. data/lib/kumi/ir/loop_definition.md +93 -0
  478. data/lib/kumi/ir/passes.rb +32 -0
  479. data/lib/kumi/ir/printer.rb +54 -0
  480. data/lib/kumi/ir/testing/snast_factory.rb +146 -0
  481. data/lib/kumi/ir/testing.rb +9 -0
  482. data/lib/kumi/ir/vec/lower.rb +131 -0
  483. data/lib/kumi/ir/vec/ops/core_ops.rb +126 -0
  484. data/lib/kumi/ir/vec/ops/node.rb +45 -0
  485. data/lib/kumi/ir/vec/ops.rb +13 -0
  486. data/lib/kumi/ir/vec/passes/axis_canonicalization.rb +57 -0
  487. data/lib/kumi/ir/vec/passes/constant_propagation.rb +110 -0
  488. data/lib/kumi/ir/vec/passes/dce.rb +52 -0
  489. data/lib/kumi/ir/vec/passes/gvn.rb +64 -0
  490. data/lib/kumi/ir/vec/passes/peephole_simplify.rb +67 -0
  491. data/lib/kumi/ir/vec/passes/stencil_detection.rb +60 -0
  492. data/lib/kumi/ir/vec/passes/support/instruction_cloner.rb +48 -0
  493. data/lib/kumi/ir/vec/passes.rb +16 -0
  494. data/lib/kumi/ir/vec/pipeline.rb +30 -0
  495. data/lib/kumi/ir/vec/validator.rb +68 -0
  496. data/lib/kumi/ir/vec.rb +66 -0
  497. data/lib/kumi/ir/vec_definition.md +102 -0
  498. data/lib/kumi/ir.rb +14 -0
  499. data/lib/kumi/schema.rb +44 -2
  500. data/lib/kumi/support/nast_printer.rb +14 -0
  501. data/lib/kumi/support/s_expression_printer.rb +9 -0
  502. data/lib/kumi/support/snast_printer.rb +6 -0
  503. data/lib/kumi/syntax/import_call.rb +11 -0
  504. data/lib/kumi/syntax/import_declaration.rb +11 -0
  505. data/lib/kumi/syntax/root.rb +2 -2
  506. data/lib/kumi/test_shared_schemas/compound.rb +21 -0
  507. data/lib/kumi/test_shared_schemas/discount.rb +19 -0
  508. data/lib/kumi/test_shared_schemas/price.rb +19 -0
  509. data/lib/kumi/test_shared_schemas/subtotal.rb +22 -0
  510. data/lib/kumi/test_shared_schemas/tax.rb +18 -0
  511. data/lib/kumi/version.rb +1 -1
  512. data/lib/kumi.rb +50 -34
  513. data/tasks/release.rake +129 -0
  514. metadata +401 -261
  515. data/CLAUDE.md +0 -45
  516. data/docs/GOLDEN_QUICK_START.md +0 -141
  517. data/golden/array_element/expected/lir_00_unoptimized.txt +0 -13
  518. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +0 -13
  519. data/golden/array_element/expected/lir_02_inlined.txt +0 -13
  520. data/golden/array_element/expected/lir_03_cse.txt +0 -13
  521. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +0 -13
  522. data/golden/array_element/expected/lir_04_loop_invcm.txt +0 -13
  523. data/golden/array_element/expected/lir_06_const_prop.txt +0 -13
  524. data/golden/array_index/expected/lir_00_unoptimized.txt +0 -41
  525. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +0 -41
  526. data/golden/array_index/expected/lir_02_inlined.txt +0 -42
  527. data/golden/array_index/expected/lir_03_cse.txt +0 -40
  528. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +0 -40
  529. data/golden/array_index/expected/lir_04_loop_invcm.txt +0 -40
  530. data/golden/array_index/expected/lir_06_const_prop.txt +0 -40
  531. data/golden/array_operations/expected/lir_00_unoptimized.txt +0 -47
  532. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +0 -47
  533. data/golden/array_operations/expected/lir_02_inlined.txt +0 -47
  534. data/golden/array_operations/expected/lir_03_cse.txt +0 -47
  535. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +0 -47
  536. data/golden/array_operations/expected/lir_04_loop_invcm.txt +0 -47
  537. data/golden/array_operations/expected/lir_06_const_prop.txt +0 -47
  538. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +0 -29
  539. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +0 -29
  540. data/golden/cascade_logic/expected/lir_02_inlined.txt +0 -37
  541. data/golden/cascade_logic/expected/lir_03_cse.txt +0 -30
  542. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +0 -30
  543. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +0 -30
  544. data/golden/cascade_logic/expected/lir_06_const_prop.txt +0 -30
  545. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +0 -76
  546. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +0 -76
  547. data/golden/chained_fusion/expected/lir_02_inlined.txt +0 -114
  548. data/golden/chained_fusion/expected/lir_03_cse.txt +0 -97
  549. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +0 -99
  550. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +0 -97
  551. data/golden/chained_fusion/expected/lir_06_const_prop.txt +0 -97
  552. data/golden/decimal_explicit/expected/lir_00_unoptimized.txt +0 -30
  553. data/golden/decimal_explicit/expected/lir_01_hoist_scalar_references.txt +0 -30
  554. data/golden/decimal_explicit/expected/lir_02_inlined.txt +0 -44
  555. data/golden/decimal_explicit/expected/lir_03_cse.txt +0 -40
  556. data/golden/decimal_explicit/expected/lir_04_1_loop_fusion.txt +0 -40
  557. data/golden/decimal_explicit/expected/lir_04_loop_invcm.txt +0 -40
  558. data/golden/decimal_explicit/expected/lir_06_const_prop.txt +0 -40
  559. data/golden/element_arrays/expected/lir_00_unoptimized.txt +0 -81
  560. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +0 -81
  561. data/golden/element_arrays/expected/lir_02_inlined.txt +0 -85
  562. data/golden/element_arrays/expected/lir_03_cse.txt +0 -83
  563. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +0 -83
  564. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +0 -83
  565. data/golden/element_arrays/expected/lir_06_const_prop.txt +0 -83
  566. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +0 -31
  567. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +0 -31
  568. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +0 -51
  569. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +0 -49
  570. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +0 -49
  571. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +0 -49
  572. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +0 -49
  573. data/golden/function_overload/expected/lir_00_unoptimized.txt +0 -18
  574. data/golden/function_overload/expected/lir_01_hoist_scalar_references.txt +0 -18
  575. data/golden/function_overload/expected/lir_02_inlined.txt +0 -20
  576. data/golden/function_overload/expected/lir_03_cse.txt +0 -20
  577. data/golden/function_overload/expected/lir_04_1_loop_fusion.txt +0 -20
  578. data/golden/function_overload/expected/lir_04_loop_invcm.txt +0 -20
  579. data/golden/function_overload/expected/lir_06_const_prop.txt +0 -20
  580. data/golden/game_of_life/expected/lir_00_unoptimized.txt +0 -343
  581. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +0 -343
  582. data/golden/game_of_life/expected/lir_02_inlined.txt +0 -1918
  583. data/golden/game_of_life/expected/lir_03_cse.txt +0 -770
  584. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +0 -770
  585. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +0 -770
  586. data/golden/game_of_life/expected/lir_06_const_prop.txt +0 -770
  587. data/golden/hash_keys/expected/lir_00_unoptimized.txt +0 -18
  588. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +0 -18
  589. data/golden/hash_keys/expected/lir_02_inlined.txt +0 -18
  590. data/golden/hash_keys/expected/lir_03_cse.txt +0 -18
  591. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +0 -18
  592. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +0 -18
  593. data/golden/hash_keys/expected/lir_06_const_prop.txt +0 -18
  594. data/golden/hash_value/expected/lir_00_unoptimized.txt +0 -30
  595. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +0 -30
  596. data/golden/hash_value/expected/lir_02_inlined.txt +0 -36
  597. data/golden/hash_value/expected/lir_03_cse.txt +0 -33
  598. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +0 -33
  599. data/golden/hash_value/expected/lir_04_loop_invcm.txt +0 -33
  600. data/golden/hash_value/expected/lir_06_const_prop.txt +0 -33
  601. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +0 -87
  602. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +0 -87
  603. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +0 -115
  604. data/golden/hierarchical_complex/expected/lir_03_cse.txt +0 -89
  605. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +0 -89
  606. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +0 -89
  607. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +0 -89
  608. data/golden/inline_rename_scope_leak/expected/lir_00_unoptimized.txt +0 -35
  609. data/golden/inline_rename_scope_leak/expected/lir_01_hoist_scalar_references.txt +0 -35
  610. data/golden/inline_rename_scope_leak/expected/lir_02_inlined.txt +0 -49
  611. data/golden/inline_rename_scope_leak/expected/lir_03_cse.txt +0 -49
  612. data/golden/inline_rename_scope_leak/expected/lir_04_1_loop_fusion.txt +0 -49
  613. data/golden/inline_rename_scope_leak/expected/lir_04_loop_invcm.txt +0 -49
  614. data/golden/inline_rename_scope_leak/expected/lir_06_const_prop.txt +0 -49
  615. data/golden/input_reference/expected/lir_00_unoptimized.txt +0 -39
  616. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +0 -39
  617. data/golden/input_reference/expected/lir_02_inlined.txt +0 -39
  618. data/golden/input_reference/expected/lir_03_cse.txt +0 -39
  619. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +0 -39
  620. data/golden/input_reference/expected/lir_04_loop_invcm.txt +0 -39
  621. data/golden/input_reference/expected/lir_06_const_prop.txt +0 -39
  622. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +0 -53
  623. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +0 -53
  624. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +0 -89
  625. data/golden/interleaved_fusion/expected/lir_03_cse.txt +0 -77
  626. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +0 -78
  627. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +0 -77
  628. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +0 -77
  629. data/golden/let_inline/expected/lir_00_unoptimized.txt +0 -26
  630. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +0 -26
  631. data/golden/let_inline/expected/lir_02_inlined.txt +0 -36
  632. data/golden/let_inline/expected/lir_03_cse.txt +0 -30
  633. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +0 -30
  634. data/golden/let_inline/expected/lir_04_loop_invcm.txt +0 -30
  635. data/golden/let_inline/expected/lir_06_const_prop.txt +0 -30
  636. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +0 -43
  637. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +0 -43
  638. data/golden/loop_fusion/expected/lir_02_inlined.txt +0 -62
  639. data/golden/loop_fusion/expected/lir_03_cse.txt +0 -57
  640. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +0 -57
  641. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +0 -57
  642. data/golden/loop_fusion/expected/lir_06_const_prop.txt +0 -57
  643. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +0 -59
  644. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +0 -59
  645. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +0 -63
  646. data/golden/min_reduce_scope/expected/lir_03_cse.txt +0 -60
  647. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +0 -60
  648. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +0 -60
  649. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +0 -60
  650. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +0 -42
  651. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +0 -42
  652. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +0 -48
  653. data/golden/mixed_dimensions/expected/lir_03_cse.txt +0 -48
  654. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +0 -48
  655. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +0 -48
  656. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +0 -48
  657. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +0 -75
  658. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +0 -75
  659. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +0 -126
  660. data/golden/multirank_hoisting/expected/lir_03_cse.txt +0 -109
  661. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +0 -109
  662. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +0 -109
  663. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +0 -109
  664. data/golden/nested_hash/expected/lir_00_unoptimized.txt +0 -10
  665. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +0 -10
  666. data/golden/nested_hash/expected/lir_02_inlined.txt +0 -10
  667. data/golden/nested_hash/expected/lir_03_cse.txt +0 -10
  668. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +0 -10
  669. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +0 -10
  670. data/golden/nested_hash/expected/lir_06_const_prop.txt +0 -10
  671. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +0 -49
  672. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +0 -49
  673. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +0 -80
  674. data/golden/reduction_broadcast/expected/lir_03_cse.txt +0 -68
  675. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +0 -68
  676. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +0 -68
  677. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +0 -68
  678. data/golden/roll/expected/lir_00_unoptimized.txt +0 -56
  679. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +0 -56
  680. data/golden/roll/expected/lir_02_inlined.txt +0 -56
  681. data/golden/roll/expected/lir_03_cse.txt +0 -55
  682. data/golden/roll/expected/lir_04_1_loop_fusion.txt +0 -55
  683. data/golden/roll/expected/lir_04_loop_invcm.txt +0 -55
  684. data/golden/roll/expected/lir_06_const_prop.txt +0 -55
  685. data/golden/shift/expected/lir_00_unoptimized.txt +0 -96
  686. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +0 -96
  687. data/golden/shift/expected/lir_02_inlined.txt +0 -96
  688. data/golden/shift/expected/lir_03_cse.txt +0 -90
  689. data/golden/shift/expected/lir_04_1_loop_fusion.txt +0 -90
  690. data/golden/shift/expected/lir_04_loop_invcm.txt +0 -90
  691. data/golden/shift/expected/lir_06_const_prop.txt +0 -90
  692. data/golden/shift_2d/expected/lir_00_unoptimized.txt +0 -274
  693. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +0 -274
  694. data/golden/shift_2d/expected/lir_02_inlined.txt +0 -274
  695. data/golden/shift_2d/expected/lir_03_cse.txt +0 -262
  696. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +0 -262
  697. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +0 -262
  698. data/golden/shift_2d/expected/lir_06_const_prop.txt +0 -262
  699. data/golden/simple_math/expected/lir_00_unoptimized.txt +0 -31
  700. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +0 -31
  701. data/golden/simple_math/expected/lir_02_inlined.txt +0 -31
  702. data/golden/simple_math/expected/lir_03_cse.txt +0 -31
  703. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +0 -31
  704. data/golden/simple_math/expected/lir_04_loop_invcm.txt +0 -31
  705. data/golden/simple_math/expected/lir_06_const_prop.txt +0 -31
  706. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +0 -73
  707. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +0 -73
  708. data/golden/streaming_basics/expected/lir_02_inlined.txt +0 -100
  709. data/golden/streaming_basics/expected/lir_03_cse.txt +0 -84
  710. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +0 -84
  711. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +0 -84
  712. data/golden/streaming_basics/expected/lir_06_const_prop.txt +0 -84
  713. data/golden/tuples/expected/lir_00_unoptimized.txt +0 -40
  714. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +0 -40
  715. data/golden/tuples/expected/lir_02_inlined.txt +0 -48
  716. data/golden/tuples/expected/lir_03_cse.txt +0 -48
  717. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +0 -48
  718. data/golden/tuples/expected/lir_04_loop_invcm.txt +0 -48
  719. data/golden/tuples/expected/lir_06_const_prop.txt +0 -48
  720. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +0 -41
  721. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +0 -41
  722. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +0 -62
  723. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +0 -51
  724. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +0 -51
  725. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +0 -51
  726. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +0 -51
  727. data/golden/us_tax_2024/expected/lir_00_unoptimized.txt +0 -291
  728. data/golden/us_tax_2024/expected/lir_01_hoist_scalar_references.txt +0 -291
  729. data/golden/us_tax_2024/expected/lir_02_inlined.txt +0 -1254
  730. data/golden/us_tax_2024/expected/lir_03_cse.txt +0 -626
  731. data/golden/us_tax_2024/expected/lir_04_1_loop_fusion.txt +0 -671
  732. data/golden/us_tax_2024/expected/lir_04_loop_invcm.txt +0 -626
  733. data/golden/us_tax_2024/expected/lir_06_const_prop.txt +0 -626
  734. data/golden/with_constants/expected/lir_00_unoptimized.txt +0 -17
  735. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +0 -17
  736. data/golden/with_constants/expected/lir_02_inlined.txt +0 -17
  737. data/golden/with_constants/expected/lir_03_cse.txt +0 -17
  738. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +0 -17
  739. data/golden/with_constants/expected/lir_04_loop_invcm.txt +0 -17
  740. data/golden/with_constants/expected/lir_06_const_prop.txt +0 -17
  741. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +0 -317
  742. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +0 -75
  743. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +0 -103
  744. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +0 -27
  745. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +0 -321
  746. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +0 -85
  747. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +0 -111
  748. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +0 -32
  749. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +0 -84
  750. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +0 -93
  751. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +0 -115
  752. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +0 -394
  753. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +0 -198
  754. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +0 -30
  755. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +0 -121
  756. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +0 -156
  757. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +0 -148
  758. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +0 -407
  759. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +0 -241
  760. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +0 -83
  761. data/lib/kumi/core/lir/analyze.rb +0 -64
  762. data/lib/kumi/core/lir/build.rb +0 -363
  763. data/lib/kumi/core/lir/emit.rb +0 -62
  764. data/lib/kumi/core/lir/structs/instruction.rb +0 -44
  765. data/lib/kumi/core/lir/structs/literal.rb +0 -14
  766. data/lib/kumi/core/lir/structs/stamp.rb +0 -13
  767. data/lib/kumi/core/lir/support/error.rb +0 -9
  768. data/lib/kumi/core/lir/support/ids.rb +0 -34
  769. data/lib/kumi/core/lir/validate.rb +0 -74
  770. data/lib/kumi/core/lir.rb +0 -34
  771. data/lib/kumi/support/lir_printer.rb +0 -143
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4b228964d7834bd37eb2b5f969fb288edbb4dab6e27ef72d45a04fa9fb87a2d0
4
- data.tar.gz: 79e0b9db5acedb69e61eb6799844fa6a849fca4ed604e79522af03147e3e0436
3
+ metadata.gz: 74f061f34a9936380a89aff28563594be891ac849f233613edf5ad9b52acce64
4
+ data.tar.gz: 8c7ee4b31d80293c18d8ea5914ae51ec80a489f6950352dd47044aa1b1aecba1
5
5
  SHA512:
6
- metadata.gz: b28eb238da8e21b0ec51dd1f5c3e2ac769fd07bef7461787a456fded7dba4a5d7603e2d3eff110e23bbe69af8d28e303834d0aa12b2a06fe6ee7d8c441eae289
7
- data.tar.gz: 98fa5a9f34f3ab1c8d9aea17ce888025713d73665de5a85608a4108fdcd697d587986ba24d404f505b35cabffadb8880765ec7f9cd803a232d2295bd4b6b36fc
6
+ metadata.gz: 70164a71693f388d25f2b2c8fc3c7d938860bb6e0f06344f06f7be96d1edb25a1e88686339fb81e919f6fde6d11510d14174cea22c3acc9f200bcc5c6fbf8724
7
+ data.tar.gz: 02df5faaef97f3d951a5fb022d7621daf1cec37ee482d0aa8db366c0ff7e0f44f6dc301302745249de1901c63c6e40dc52cff3e8d0019712ddae364196a4f642
data/.codex ADDED
File without changes
data/CHANGELOG.md CHANGED
@@ -1,4 +1,42 @@
1
1
  ## [Unreleased]
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
+
21
+ ## [0.0.33] – 2025-11-05
22
+ ### Added
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
24
+ - **Import Diagnostics:** Clearer errors with available declaration hints when imports fail
25
+
26
+ ### Changed
27
+ - Default `Kumi.configure.compilation_mode` now `:jit`; override via config or `KUMI_COMPILATION_MODE`
28
+ - Improved constant propagation output formatting for Ruby/JS codegen
29
+
30
+ ## [0.0.32] – 2025-10-23
31
+ ### Added
32
+ - **Schema Imports:** Reuse declarations from other schemas with `import :name, from: Module` syntax
33
+ - **Improved Import Errors:** Clearer messages with available declaration hints when imports fail
34
+ - Documentation: `docs/COMPOSED_SCHEMAS.md` and `docs/SCHEMA_IMPORTS.md`
35
+
36
+ ## [0.0.31] – 2025-10-22
37
+ ### Changed
38
+ - Documentation for schema imports in README and SYNTAX
39
+
2
40
  ## [0.0.30] – 2025-10-21
3
41
  ### Changed
4
42
  - **Analyzer Refactoring:** PassManager now centralizes pass orchestration, replacing manual orchestration in Analyzer.run_analysis_passes
@@ -174,4 +212,4 @@ Fix - Remove require of pry gem on runtime.
174
212
  - Ruby >= 3.1 (Was >= 3.0)
175
213
 
176
214
  ### Notes
177
- - No expected DSL changes for typical schemas; report regressions.
215
+ - No expected DSL changes for typical schemas; report regressions.
data/README.md CHANGED
@@ -10,116 +10,44 @@
10
10
 
11
11
  ## What is Kumi?
12
12
 
13
- Kumi is a **declarative DSL for building calculation systems** that are:
14
- - **Typed & verifiable at compile time** (catch errors before they hit production)
15
- - **Vectorized** (arrays and nested data structures work naturally)
16
- - **Transparent** (inspect generated code and execution order)
17
- - **Portable** (compile the same schema to Ruby or JavaScript)
13
+ Kumi is a **declarative DSL for calculation logic** — tax rules, pricing, scoring, financial projections — that compiles to plain Ruby and JavaScript.
18
14
 
19
- Instead of writing procedural formulas, you declare *what* values depend on *what*, and Kumi figures out the computation order, validates types, detects impossible constraints, and generates efficient code.
20
-
21
- ## Why Kumi Exists
22
-
23
- Calculation systems are everywhere: tax engines, pricing models, financial projections, compliance checks. They're usually:
24
- - Hard to verify (logic spread across multiple files)
25
- - Fragile (changing one formula breaks hidden dependencies)
26
- - Duplicated (same logic needed in backend and frontend)
27
- - Opaque (hard to audit which rules applied to which data)
28
-
29
- Kumi makes them explicit, testable, and portable.
30
-
31
- ---
32
-
33
- **Status**: experimental. Public API may change. Typing and some static checks are still evolving.
34
-
35
- **Feedback**: have a use case or hit a rough edge? Open an issue or reach out.
36
-
37
- ---
38
-
39
- ## Example: US Tax Calculator (2024)
40
-
41
- A single schema computes federal, state, FICA taxes across multiple filing statuses—all types verified at compile time. Try it in the [interactive demo](https://kumi-play-web.fly.dev/) or inspect the [full schema, input, output, and generated code](golden/us_tax_2024/).
42
-
43
- <details>
44
- <summary><strong>Schema</strong></summary>
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.
45
16
 
46
17
  ```ruby
47
18
  schema do
48
19
  input do
49
- float :income
50
- float :state_rate
51
- float :local_rate
52
- float :retirement_contrib
53
- string :filing_status
54
-
55
- array :statuses do
56
- hash :status do
57
- string :name
58
- float :std
59
- float :addl_threshold
60
- array :rates do
61
- hash :bracket do
62
- float :lo
63
- float :hi # -1 = open-ended
64
- float :rate
65
- end
66
- end
20
+ array :items do
21
+ hash :item do
22
+ integer :quantity
23
+ decimal :unit_price
67
24
  end
68
25
  end
69
26
  end
70
27
 
71
- # shared
72
- let :big_hi, 100_000_000_000.0
73
- let :state_tax, input.income * input.state_rate
74
- let :local_tax, input.income * input.local_rate
75
-
76
- # FICA constants
77
- let :ss_wage_base, 168_600.0
78
- let :ss_rate, 0.062
79
- let :med_base_rate, 0.0145
80
- let :addl_med_rate, 0.009
81
-
82
- # per-status federal
83
- let :taxable, fn(:max, [input.income - input.statuses.status.std, 0])
84
- let :lo, input.statuses.status.rates.bracket.lo
85
- let :hi, input.statuses.status.rates.bracket.hi
86
- let :rate, input.statuses.status.rates.bracket.rate
87
- let :hi_eff, select(hi == -1, big_hi, hi)
88
- let :amt, fn(:clamp, taxable - lo, 0, hi_eff - lo)
89
- let :fed_tax, fn(:sum, amt * rate)
90
- let :in_br, (taxable >= lo) & (taxable < hi_eff)
91
- let :fed_marg, fn(:sum_if, rate, in_br)
92
- let :fed_eff, fed_tax / fn(:max, [input.income, 1.0])
93
-
94
- # per-status FICA
95
- let :ss_tax, fn(:min, [input.income, ss_wage_base]) * ss_rate
96
- let :med_tax, input.income * med_base_rate
97
- let :addl_med_tax, fn(:max, [input.income - input.statuses.status.addl_threshold, 0]) * addl_med_rate
98
- let :fica_tax, ss_tax + med_tax + addl_med_tax
99
- let :fica_eff, fica_tax / fn(:max, [input.income, 1.0])
100
-
101
- # totals per status
102
- let :total_tax, fed_tax + fica_tax + state_tax + local_tax
103
- let :total_eff, total_tax / fn(:max, [input.income, 1.0])
104
- let :after_tax, input.income - total_tax
105
- let :take_home, after_tax - input.retirement_contrib
106
-
107
- # array of result objects, one per status
108
- value :summary, {
109
- filing_status: input.statuses.status.name,
110
- federal: { marginal: fed_marg, effective: fed_eff, tax: fed_tax },
111
- fica: { effective: fica_eff, tax: fica_tax },
112
- state: { marginal: input.state_rate, effective: input.state_rate, tax: state_tax },
113
- local: { marginal: input.local_rate, effective: input.local_rate, tax: local_tax },
114
- total: { effective: total_eff, tax: total_tax },
115
- after_tax: after_tax,
116
- retirement_contrib: input.retirement_contrib,
117
- take_home: take_home
118
- }
28
+ value :line_totals, input.items.item.quantity * input.items.item.unit_price
29
+ value :subtotal, fn(:sum, line_totals)
119
30
  end
120
31
  ```
121
32
 
122
- </details>
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.
34
+
35
+ ## Why
36
+
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.
41
+
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.
45
+
46
+ ---
47
+
48
+ **Status**: experimental. Public API may change. Typing and some static checks are still evolving.
49
+
50
+ **Feedback**: have a use case or hit a rough edge? Open an issue or reach out (andremuta+kumi@gmail.com).
123
51
 
124
52
  ---
125
53
 
@@ -129,7 +57,7 @@ end
129
57
  gem install kumi
130
58
  ```
131
59
 
132
- Requires Ruby 3.1+. No external dependencies.
60
+ Requires Ruby 3.1+. Runtime dependencies: `mutex_m` and `zeitwerk` (bundled via Rubygems).
133
61
 
134
62
  ## Quick Start
135
63
 
@@ -149,22 +77,38 @@ end
149
77
  result = Double.from(x: 5)
150
78
  result[:doubled] # => 10
151
79
 
80
+ # or just call the method directly
81
+ Double._doubled(x: 5) # => 10
82
+
152
83
  # Export to JavaScript (same logic)
153
84
  Double.write_source("output.mjs", platform: :javascript)
85
+ # ./output.mjs
86
+ # export function _doubled(input) {
87
+ # let t1 = input["x"];
88
+ # let t3 = t1 * 2;
89
+ # return t3;
90
+ # }
154
91
  ```
155
92
 
156
- Try the [interactive demo](https://kumi-play-web.fly.dev/) (no setup required).
93
+ You can also override the compilation strategy without touching code by setting
94
+ `KUMI_COMPILATION_MODE` to `jit` or `aot` (e.g. `export KUMI_COMPILATION_MODE=aot`).
95
+
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).
157
101
 
158
102
  ---
159
103
 
160
104
  ## Documentation
161
105
 
162
- - **[Syntax Reference](docs/SYNTAX.md)** - DSL syntax, types, operators, and functions
163
- - **[Functions Reference](docs/FUNCTIONS.md)** - Auto-generated docs for all functions and kernels
164
- - **[functions-reference.json](docs/functions-reference.json)** - Machine-readable format for IDEs (VSCode, Monaco, etc.)
165
- - **[Development Guide](docs/DEVELOPMENT.md)** - Testing, debugging, and contributing
166
-
167
- 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
168
112
 
169
113
  ---
170
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"
@@ -39,5 +49,5 @@ kernels:
39
49
 
40
50
  - id: clamp:ruby:v1
41
51
  fn: core.clamp
42
- inline: "= [[ $0, $1 ].max, $2 ].min"
43
- impl: "(x, lo, hi)\n [[x, lo].max, hi].min"
52
+ inline: "= $0.clamp($1, $2)"
53
+ impl: "(x, lo, hi)\n x.clamp(lo, hi)"
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.