kumi 0.0.18 → 0.0.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (676) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +4 -1
  3. data/.ruby-version +1 -0
  4. data/CHANGELOG.md +27 -0
  5. data/CLAUDE.md +26 -139
  6. data/README.md +143 -372
  7. data/data/functions/agg/boolean.yaml +14 -0
  8. data/data/functions/agg/numeric.yaml +80 -0
  9. data/data/functions/agg/string.yaml +8 -0
  10. data/data/functions/core/arithmetic.yaml +50 -0
  11. data/data/functions/core/boolean.yaml +18 -0
  12. data/data/functions/core/comparison.yaml +42 -0
  13. data/data/functions/core/constructor.yaml +32 -0
  14. data/data/functions/core/select.yaml +7 -0
  15. data/data/functions/core/stencil.yaml +21 -0
  16. data/data/functions/core/string.yaml +19 -0
  17. data/data/kernels/javascript/agg/boolean.yaml +12 -0
  18. data/data/kernels/javascript/agg/numeric.yaml +27 -0
  19. data/data/kernels/javascript/agg/string.yaml +5 -0
  20. data/data/kernels/javascript/core/arithmetic.yaml +32 -0
  21. data/data/kernels/javascript/core/boolean.yaml +12 -0
  22. data/data/kernels/javascript/core/comparison.yaml +24 -0
  23. data/data/kernels/javascript/core/constructor.yaml +15 -0
  24. data/data/kernels/javascript/core/select.yaml +7 -0
  25. data/data/kernels/javascript/core/string.yaml +12 -0
  26. data/data/kernels/ruby/agg/boolean.yaml +18 -0
  27. data/data/kernels/ruby/agg/numeric.yaml +29 -0
  28. data/data/kernels/ruby/agg/string.yaml +5 -0
  29. data/data/kernels/ruby/core/arithmetic.yaml +38 -0
  30. data/data/kernels/ruby/core/boolean.yaml +15 -0
  31. data/data/kernels/ruby/core/comparison.yaml +30 -0
  32. data/data/kernels/ruby/core/constructor.yaml +17 -0
  33. data/data/kernels/ruby/core/select.yaml +4 -0
  34. data/data/kernels/ruby/core/string.yaml +15 -0
  35. data/debug_ordering.rb +52 -0
  36. data/docs/FORM_SCHEMA.md +85 -0
  37. data/docs/OUTPUT_SCHEMA.md +69 -0
  38. data/docs/SYNTAX.md +626 -373
  39. data/golden/array_element/expected/ast.txt +21 -0
  40. data/golden/array_element/expected/input_plan.txt +5 -0
  41. data/golden/array_element/expected/lir_00_unoptimized.txt +13 -0
  42. data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +13 -0
  43. data/golden/array_element/expected/lir_02_inlined.txt +13 -0
  44. data/golden/array_element/expected/lir_03_cse.txt +13 -0
  45. data/golden/array_element/expected/lir_04_1_loop_fusion.txt +13 -0
  46. data/golden/array_element/expected/lir_04_loop_invcm.txt +13 -0
  47. data/golden/array_element/expected/lir_06_const_prop.txt +13 -0
  48. data/golden/array_element/expected/nast.txt +7 -0
  49. data/golden/array_element/expected/schema_javascript.mjs +13 -0
  50. data/golden/array_element/expected/schema_ruby.rb +41 -0
  51. data/golden/array_element/expected/snast.txt +7 -0
  52. data/golden/array_element/expected.json +5 -0
  53. data/golden/array_element/input.json +9 -0
  54. data/golden/array_element/schema.kumi +11 -0
  55. data/golden/array_index/expected/ast.txt +59 -0
  56. data/golden/array_index/expected/input_plan.txt +5 -0
  57. data/golden/array_index/expected/lir_00_unoptimized.txt +41 -0
  58. data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +41 -0
  59. data/golden/array_index/expected/lir_02_inlined.txt +42 -0
  60. data/golden/array_index/expected/lir_03_cse.txt +40 -0
  61. data/golden/array_index/expected/lir_04_1_loop_fusion.txt +40 -0
  62. data/golden/array_index/expected/lir_04_loop_invcm.txt +40 -0
  63. data/golden/array_index/expected/lir_06_const_prop.txt +40 -0
  64. data/golden/array_index/expected/nast.txt +33 -0
  65. data/golden/array_index/expected/schema_javascript.mjs +46 -0
  66. data/golden/array_index/expected/schema_ruby.rb +75 -0
  67. data/golden/array_index/expected/snast.txt +33 -0
  68. data/golden/array_index/expected.json +5 -0
  69. data/golden/array_index/input.json +1 -0
  70. data/golden/array_index/schema.kumi +19 -0
  71. data/golden/array_operations/expected/ast.txt +50 -0
  72. data/golden/array_operations/expected/input_plan.txt +10 -0
  73. data/golden/array_operations/expected/lir_00_unoptimized.txt +47 -0
  74. data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +47 -0
  75. data/golden/array_operations/expected/lir_02_inlined.txt +47 -0
  76. data/golden/array_operations/expected/lir_03_cse.txt +47 -0
  77. data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +47 -0
  78. data/golden/array_operations/expected/lir_04_loop_invcm.txt +47 -0
  79. data/golden/array_operations/expected/lir_06_const_prop.txt +47 -0
  80. data/golden/array_operations/expected/nast.txt +32 -0
  81. data/golden/array_operations/expected/schema_javascript.mjs +60 -0
  82. data/golden/array_operations/expected/schema_ruby.rb +91 -0
  83. data/golden/array_operations/expected/snast.txt +32 -0
  84. data/golden/array_operations/expected.json +27 -0
  85. data/golden/array_operations/input.json +8 -0
  86. data/golden/array_operations/schema.kumi +12 -10
  87. data/golden/cascade_logic/expected/ast.txt +37 -0
  88. data/golden/cascade_logic/expected/input_plan.txt +2 -0
  89. data/golden/cascade_logic/expected/lir_00_unoptimized.txt +29 -0
  90. data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +29 -0
  91. data/golden/cascade_logic/expected/lir_02_inlined.txt +37 -0
  92. data/golden/cascade_logic/expected/lir_03_cse.txt +30 -0
  93. data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +30 -0
  94. data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +30 -0
  95. data/golden/cascade_logic/expected/lir_06_const_prop.txt +30 -0
  96. data/golden/cascade_logic/expected/nast.txt +32 -0
  97. data/golden/cascade_logic/expected/schema_javascript.mjs +31 -0
  98. data/golden/cascade_logic/expected/schema_ruby.rb +57 -0
  99. data/golden/cascade_logic/expected/snast.txt +32 -0
  100. data/golden/cascade_logic/expected.json +5 -0
  101. data/golden/cascade_logic/input.json +4 -0
  102. data/golden/cascade_logic/schema.kumi +1 -3
  103. data/golden/chained_fusion/expected/ast.txt +57 -0
  104. data/golden/chained_fusion/expected/input_plan.txt +13 -0
  105. data/golden/chained_fusion/expected/lir_00_unoptimized.txt +76 -0
  106. data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +76 -0
  107. data/golden/chained_fusion/expected/lir_02_inlined.txt +114 -0
  108. data/golden/chained_fusion/expected/lir_03_cse.txt +97 -0
  109. data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +99 -0
  110. data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +97 -0
  111. data/golden/chained_fusion/expected/lir_06_const_prop.txt +97 -0
  112. data/golden/chained_fusion/expected/nast.txt +55 -0
  113. data/golden/chained_fusion/expected/schema_javascript.mjs +116 -0
  114. data/golden/chained_fusion/expected/schema_ruby.rb +149 -0
  115. data/golden/chained_fusion/expected/snast.txt +55 -0
  116. data/golden/chained_fusion/expected.json +45 -0
  117. data/golden/chained_fusion/input.json +51 -0
  118. data/golden/chained_fusion/schema.kumi +52 -0
  119. data/golden/element_arrays/expected/ast.txt +55 -0
  120. data/golden/element_arrays/expected/input_plan.txt +7 -0
  121. data/golden/element_arrays/expected/lir_00_unoptimized.txt +81 -0
  122. data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +81 -0
  123. data/golden/element_arrays/expected/lir_02_inlined.txt +85 -0
  124. data/golden/element_arrays/expected/lir_03_cse.txt +83 -0
  125. data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +83 -0
  126. data/golden/element_arrays/expected/lir_04_loop_invcm.txt +83 -0
  127. data/golden/element_arrays/expected/lir_06_const_prop.txt +83 -0
  128. data/golden/element_arrays/expected/nast.txt +42 -0
  129. data/golden/element_arrays/expected/schema_javascript.mjs +106 -0
  130. data/golden/element_arrays/expected/schema_ruby.rb +141 -0
  131. data/golden/element_arrays/expected/snast.txt +42 -0
  132. data/golden/element_arrays/expected.json +55 -0
  133. data/golden/element_arrays/input.json +12 -0
  134. data/golden/element_arrays/schema.kumi +21 -0
  135. data/golden/empty_and_null_inputs/expected/ast.txt +42 -0
  136. data/golden/empty_and_null_inputs/expected/input_plan.txt +12 -0
  137. data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +31 -0
  138. data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +31 -0
  139. data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +51 -0
  140. data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +49 -0
  141. data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +49 -0
  142. data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +49 -0
  143. data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +49 -0
  144. data/golden/empty_and_null_inputs/expected/nast.txt +18 -0
  145. data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +47 -0
  146. data/golden/empty_and_null_inputs/expected/schema_ruby.rb +79 -0
  147. data/golden/empty_and_null_inputs/expected/snast.txt +18 -0
  148. data/golden/empty_and_null_inputs/expected.json +8 -0
  149. data/golden/empty_and_null_inputs/input.json +16 -0
  150. data/golden/empty_and_null_inputs/schema.kumi +30 -0
  151. data/golden/game_of_life/expected/ast.txt +118 -0
  152. data/golden/game_of_life/expected/input_plan.txt +5 -0
  153. data/golden/game_of_life/expected/lir_00_unoptimized.txt +343 -0
  154. data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +343 -0
  155. data/golden/game_of_life/expected/lir_02_inlined.txt +1918 -0
  156. data/golden/game_of_life/expected/lir_03_cse.txt +766 -0
  157. data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +766 -0
  158. data/golden/game_of_life/expected/lir_04_loop_invcm.txt +766 -0
  159. data/golden/game_of_life/expected/lir_06_const_prop.txt +766 -0
  160. data/golden/game_of_life/expected/nast.txt +104 -0
  161. data/golden/game_of_life/expected/schema_javascript.mjs +98 -0
  162. data/golden/game_of_life/expected/schema_ruby.rb +125 -0
  163. data/golden/game_of_life/expected/snast.txt +104 -0
  164. data/golden/game_of_life/expected.json +3 -0
  165. data/golden/game_of_life/input.json +8 -0
  166. data/golden/game_of_life/schema.kumi +33 -0
  167. data/golden/hash_keys/expected/ast.txt +29 -0
  168. data/golden/hash_keys/expected/input_plan.txt +2 -0
  169. data/golden/hash_keys/expected/lir_00_unoptimized.txt +18 -0
  170. data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +18 -0
  171. data/golden/hash_keys/expected/lir_02_inlined.txt +18 -0
  172. data/golden/hash_keys/expected/lir_03_cse.txt +18 -0
  173. data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +18 -0
  174. data/golden/hash_keys/expected/lir_04_loop_invcm.txt +18 -0
  175. data/golden/hash_keys/expected/lir_06_const_prop.txt +18 -0
  176. data/golden/hash_keys/expected/nast.txt +46 -0
  177. data/golden/hash_keys/expected/schema_javascript.mjs +34 -0
  178. data/golden/hash_keys/expected/schema_ruby.rb +61 -0
  179. data/golden/hash_keys/expected/snast.txt +46 -0
  180. data/golden/hash_keys/expected.json +20 -0
  181. data/golden/hash_keys/input.json +4 -0
  182. data/golden/hash_keys/schema.kumi +14 -0
  183. data/golden/hash_value/expected/ast.txt +37 -0
  184. data/golden/hash_value/expected/input_plan.txt +7 -0
  185. data/golden/hash_value/expected/lir_00_unoptimized.txt +30 -0
  186. data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +30 -0
  187. data/golden/hash_value/expected/lir_02_inlined.txt +36 -0
  188. data/golden/hash_value/expected/lir_03_cse.txt +33 -0
  189. data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +33 -0
  190. data/golden/hash_value/expected/lir_04_loop_invcm.txt +33 -0
  191. data/golden/hash_value/expected/lir_06_const_prop.txt +33 -0
  192. data/golden/hash_value/expected/nast.txt +25 -0
  193. data/golden/hash_value/expected/schema_javascript.mjs +46 -0
  194. data/golden/hash_value/expected/schema_ruby.rb +75 -0
  195. data/golden/hash_value/expected/snast.txt +25 -0
  196. data/golden/hash_value/expected.json +19 -0
  197. data/golden/hash_value/input.json +12 -0
  198. data/golden/hash_value/schema.kumi +19 -0
  199. data/golden/hierarchical_complex/expected/ast.txt +85 -0
  200. data/golden/hierarchical_complex/expected/input_plan.txt +23 -0
  201. data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +87 -0
  202. data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +87 -0
  203. data/golden/hierarchical_complex/expected/lir_02_inlined.txt +115 -0
  204. data/golden/hierarchical_complex/expected/lir_03_cse.txt +89 -0
  205. data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +89 -0
  206. data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +89 -0
  207. data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +89 -0
  208. data/golden/hierarchical_complex/expected/nast.txt +49 -0
  209. data/golden/hierarchical_complex/expected/schema_javascript.mjs +121 -0
  210. data/golden/hierarchical_complex/expected/schema_ruby.rb +151 -0
  211. data/golden/hierarchical_complex/expected/snast.txt +49 -0
  212. data/golden/hierarchical_complex/expected.json +34 -0
  213. data/golden/hierarchical_complex/input.json +26 -0
  214. data/golden/hierarchical_complex/schema.kumi +38 -0
  215. data/golden/input_reference/expected/ast.txt +46 -0
  216. data/golden/input_reference/expected/input_plan.txt +15 -0
  217. data/golden/input_reference/expected/lir_00_unoptimized.txt +39 -0
  218. data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +39 -0
  219. data/golden/input_reference/expected/lir_02_inlined.txt +39 -0
  220. data/golden/input_reference/expected/lir_03_cse.txt +39 -0
  221. data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +39 -0
  222. data/golden/input_reference/expected/lir_04_loop_invcm.txt +39 -0
  223. data/golden/input_reference/expected/lir_06_const_prop.txt +39 -0
  224. data/golden/input_reference/expected/nast.txt +21 -0
  225. data/golden/input_reference/expected/schema_javascript.mjs +45 -0
  226. data/golden/input_reference/expected/schema_ruby.rb +74 -0
  227. data/golden/input_reference/expected/snast.txt +21 -0
  228. data/golden/input_reference/expected.json +7 -0
  229. data/golden/input_reference/input.json +11 -0
  230. data/golden/input_reference/schema.kumi +22 -0
  231. data/golden/interleaved_fusion/expected/ast.txt +51 -0
  232. data/golden/interleaved_fusion/expected/input_plan.txt +13 -0
  233. data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +53 -0
  234. data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +53 -0
  235. data/golden/interleaved_fusion/expected/lir_02_inlined.txt +89 -0
  236. data/golden/interleaved_fusion/expected/lir_03_cse.txt +77 -0
  237. data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +77 -0
  238. data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +77 -0
  239. data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +77 -0
  240. data/golden/interleaved_fusion/expected/nast.txt +41 -0
  241. data/golden/interleaved_fusion/expected/schema_javascript.mjs +86 -0
  242. data/golden/interleaved_fusion/expected/schema_ruby.rb +122 -0
  243. data/golden/interleaved_fusion/expected/snast.txt +41 -0
  244. data/golden/interleaved_fusion/expected.json +37 -0
  245. data/golden/interleaved_fusion/input.json +26 -0
  246. data/golden/interleaved_fusion/schema.kumi +57 -0
  247. data/golden/let_inline/expected/ast.txt +33 -0
  248. data/golden/let_inline/expected/input_plan.txt +2 -0
  249. data/golden/let_inline/expected/lir_00_unoptimized.txt +26 -0
  250. data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +26 -0
  251. data/golden/let_inline/expected/lir_02_inlined.txt +36 -0
  252. data/golden/let_inline/expected/lir_03_cse.txt +30 -0
  253. data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +30 -0
  254. data/golden/let_inline/expected/lir_04_loop_invcm.txt +30 -0
  255. data/golden/let_inline/expected/lir_06_const_prop.txt +30 -0
  256. data/golden/let_inline/expected/nast.txt +26 -0
  257. data/golden/let_inline/expected/schema_javascript.mjs +11 -0
  258. data/golden/let_inline/expected/schema_ruby.rb +37 -0
  259. data/golden/let_inline/expected/snast.txt +26 -0
  260. data/golden/let_inline/expected.json +1 -0
  261. data/golden/let_inline/input.json +1 -0
  262. data/golden/let_inline/schema.kumi +11 -0
  263. data/golden/loop_fusion/expected/ast.txt +44 -0
  264. data/golden/loop_fusion/expected/input_plan.txt +13 -0
  265. data/golden/loop_fusion/expected/lir_00_unoptimized.txt +43 -0
  266. data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +43 -0
  267. data/golden/loop_fusion/expected/lir_02_inlined.txt +62 -0
  268. data/golden/loop_fusion/expected/lir_03_cse.txt +57 -0
  269. data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +57 -0
  270. data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +57 -0
  271. data/golden/loop_fusion/expected/lir_06_const_prop.txt +57 -0
  272. data/golden/loop_fusion/expected/nast.txt +32 -0
  273. data/golden/loop_fusion/expected/schema_javascript.mjs +64 -0
  274. data/golden/loop_fusion/expected/schema_ruby.rb +97 -0
  275. data/golden/loop_fusion/expected/snast.txt +32 -0
  276. data/golden/loop_fusion/expected.json +30 -0
  277. data/golden/loop_fusion/input.json +28 -0
  278. data/golden/loop_fusion/schema.kumi +32 -0
  279. data/golden/min_reduce_scope/expected/ast.txt +49 -0
  280. data/golden/min_reduce_scope/expected/input_plan.txt +9 -0
  281. data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +59 -0
  282. data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +59 -0
  283. data/golden/min_reduce_scope/expected/lir_02_inlined.txt +63 -0
  284. data/golden/min_reduce_scope/expected/lir_03_cse.txt +60 -0
  285. data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +60 -0
  286. data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +60 -0
  287. data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +60 -0
  288. data/golden/min_reduce_scope/expected/nast.txt +29 -0
  289. data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -0
  290. data/golden/min_reduce_scope/expected/schema_ruby.rb +99 -0
  291. data/golden/min_reduce_scope/expected/snast.txt +29 -0
  292. data/golden/min_reduce_scope/expected.json +9 -0
  293. data/golden/min_reduce_scope/input.json +18 -0
  294. data/golden/min_reduce_scope/schema.kumi +25 -0
  295. data/golden/mixed_dimensions/expected/ast.txt +54 -0
  296. data/golden/mixed_dimensions/expected/input_plan.txt +15 -0
  297. data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +42 -0
  298. data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +42 -0
  299. data/golden/mixed_dimensions/expected/lir_02_inlined.txt +48 -0
  300. data/golden/mixed_dimensions/expected/lir_03_cse.txt +48 -0
  301. data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +48 -0
  302. data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +48 -0
  303. data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +48 -0
  304. data/golden/mixed_dimensions/expected/nast.txt +22 -0
  305. data/golden/mixed_dimensions/expected/schema_javascript.mjs +53 -0
  306. data/golden/mixed_dimensions/expected/schema_ruby.rb +84 -0
  307. data/golden/mixed_dimensions/expected/snast.txt +22 -0
  308. data/golden/mixed_dimensions/expected.json +6 -0
  309. data/golden/mixed_dimensions/input.json +22 -0
  310. data/golden/mixed_dimensions/schema.kumi +35 -0
  311. data/golden/multirank_hoisting/expected/ast.txt +72 -0
  312. data/golden/multirank_hoisting/expected/input_plan.txt +18 -0
  313. data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +75 -0
  314. data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +75 -0
  315. data/golden/multirank_hoisting/expected/lir_02_inlined.txt +126 -0
  316. data/golden/multirank_hoisting/expected/lir_03_cse.txt +109 -0
  317. data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +109 -0
  318. data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +109 -0
  319. data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +109 -0
  320. data/golden/multirank_hoisting/expected/nast.txt +39 -0
  321. data/golden/multirank_hoisting/expected/schema_javascript.mjs +128 -0
  322. data/golden/multirank_hoisting/expected/schema_ruby.rb +162 -0
  323. data/golden/multirank_hoisting/expected/snast.txt +39 -0
  324. data/golden/multirank_hoisting/expected.json +15 -0
  325. data/golden/multirank_hoisting/input.json +19 -0
  326. data/golden/multirank_hoisting/schema.kumi +38 -0
  327. data/golden/nested_hash/expected/ast.txt +22 -0
  328. data/golden/nested_hash/expected/input_plan.txt +5 -0
  329. data/golden/nested_hash/expected/lir_00_unoptimized.txt +10 -0
  330. data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +10 -0
  331. data/golden/nested_hash/expected/lir_02_inlined.txt +10 -0
  332. data/golden/nested_hash/expected/lir_03_cse.txt +10 -0
  333. data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +10 -0
  334. data/golden/nested_hash/expected/lir_04_loop_invcm.txt +10 -0
  335. data/golden/nested_hash/expected/lir_06_const_prop.txt +10 -0
  336. data/golden/nested_hash/expected/nast.txt +8 -0
  337. data/golden/nested_hash/expected/schema_javascript.mjs +9 -0
  338. data/golden/nested_hash/expected/schema_ruby.rb +35 -0
  339. data/golden/nested_hash/expected/snast.txt +8 -0
  340. data/golden/nested_hash/expected.json +3 -0
  341. data/golden/nested_hash/input.json +7 -0
  342. data/golden/nested_hash/schema.kumi +11 -0
  343. data/golden/reduction_broadcast/expected/ast.txt +49 -0
  344. data/golden/reduction_broadcast/expected/input_plan.txt +13 -0
  345. data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +49 -0
  346. data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +49 -0
  347. data/golden/reduction_broadcast/expected/lir_02_inlined.txt +80 -0
  348. data/golden/reduction_broadcast/expected/lir_03_cse.txt +68 -0
  349. data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +68 -0
  350. data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +68 -0
  351. data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +68 -0
  352. data/golden/reduction_broadcast/expected/nast.txt +24 -0
  353. data/golden/reduction_broadcast/expected/schema_javascript.mjs +74 -0
  354. data/golden/reduction_broadcast/expected/schema_ruby.rb +110 -0
  355. data/golden/reduction_broadcast/expected/snast.txt +24 -0
  356. data/golden/reduction_broadcast/expected.json +25 -0
  357. data/golden/reduction_broadcast/input.json +19 -0
  358. data/golden/reduction_broadcast/schema.kumi +34 -0
  359. data/golden/roll/expected/ast.txt +36 -0
  360. data/golden/roll/expected/input_plan.txt +3 -0
  361. data/golden/roll/expected/lir_00_unoptimized.txt +56 -0
  362. data/golden/roll/expected/lir_01_hoist_scalar_references.txt +56 -0
  363. data/golden/roll/expected/lir_02_inlined.txt +56 -0
  364. data/golden/roll/expected/lir_03_cse.txt +55 -0
  365. data/golden/roll/expected/lir_04_1_loop_fusion.txt +55 -0
  366. data/golden/roll/expected/lir_04_loop_invcm.txt +55 -0
  367. data/golden/roll/expected/lir_06_const_prop.txt +55 -0
  368. data/golden/roll/expected/nast.txt +26 -0
  369. data/golden/roll/expected/schema_javascript.mjs +65 -0
  370. data/golden/roll/expected/schema_ruby.rb +95 -0
  371. data/golden/roll/expected/snast.txt +26 -0
  372. data/golden/roll/expected.json +6 -0
  373. data/golden/roll/input.json +1 -0
  374. data/golden/roll/schema.kumi +13 -0
  375. data/golden/shift/expected/ast.txt +48 -0
  376. data/golden/shift/expected/input_plan.txt +3 -0
  377. data/golden/shift/expected/lir_00_unoptimized.txt +96 -0
  378. data/golden/shift/expected/lir_01_hoist_scalar_references.txt +96 -0
  379. data/golden/shift/expected/lir_02_inlined.txt +96 -0
  380. data/golden/shift/expected/lir_03_cse.txt +90 -0
  381. data/golden/shift/expected/lir_04_1_loop_fusion.txt +90 -0
  382. data/golden/shift/expected/lir_04_loop_invcm.txt +90 -0
  383. data/golden/shift/expected/lir_06_const_prop.txt +90 -0
  384. data/golden/shift/expected/nast.txt +38 -0
  385. data/golden/shift/expected/schema_javascript.mjs +106 -0
  386. data/golden/shift/expected/schema_ruby.rb +138 -0
  387. data/golden/shift/expected/snast.txt +38 -0
  388. data/golden/shift/expected.json +8 -0
  389. data/golden/shift/input.json +1 -0
  390. data/golden/shift/schema.kumi +15 -0
  391. data/golden/shift_2d/expected/ast.txt +88 -0
  392. data/golden/shift_2d/expected/input_plan.txt +5 -0
  393. data/golden/shift_2d/expected/lir_00_unoptimized.txt +274 -0
  394. data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +274 -0
  395. data/golden/shift_2d/expected/lir_02_inlined.txt +274 -0
  396. data/golden/shift_2d/expected/lir_03_cse.txt +262 -0
  397. data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +262 -0
  398. data/golden/shift_2d/expected/lir_04_loop_invcm.txt +262 -0
  399. data/golden/shift_2d/expected/lir_06_const_prop.txt +262 -0
  400. data/golden/shift_2d/expected/nast.txt +74 -0
  401. data/golden/shift_2d/expected/schema_javascript.mjs +320 -0
  402. data/golden/shift_2d/expected/schema_ruby.rb +358 -0
  403. data/golden/shift_2d/expected/snast.txt +74 -0
  404. data/golden/shift_2d/expected.json +15 -0
  405. data/golden/shift_2d/input.json +14 -0
  406. data/golden/shift_2d/schema.kumi +25 -0
  407. data/golden/simple_math/expected/ast.txt +40 -0
  408. data/golden/simple_math/expected/input_plan.txt +2 -0
  409. data/golden/simple_math/expected/lir_00_unoptimized.txt +31 -0
  410. data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +31 -0
  411. data/golden/simple_math/expected/lir_02_inlined.txt +31 -0
  412. data/golden/simple_math/expected/lir_03_cse.txt +31 -0
  413. data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +31 -0
  414. data/golden/simple_math/expected/lir_04_loop_invcm.txt +31 -0
  415. data/golden/simple_math/expected/lir_06_const_prop.txt +31 -0
  416. data/golden/simple_math/expected/nast.txt +33 -0
  417. data/golden/simple_math/expected/schema_javascript.mjs +33 -0
  418. data/golden/simple_math/expected/schema_ruby.rb +59 -0
  419. data/golden/simple_math/expected/snast.txt +33 -0
  420. data/golden/simple_math/expected.json +1 -0
  421. data/golden/simple_math/input.json +4 -0
  422. data/golden/simple_math/schema.kumi +2 -1
  423. data/golden/streaming_basics/expected/ast.txt +64 -0
  424. data/golden/streaming_basics/expected/input_plan.txt +8 -0
  425. data/golden/streaming_basics/expected/lir_00_unoptimized.txt +73 -0
  426. data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +73 -0
  427. data/golden/streaming_basics/expected/lir_02_inlined.txt +100 -0
  428. data/golden/streaming_basics/expected/lir_03_cse.txt +84 -0
  429. data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +84 -0
  430. data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +84 -0
  431. data/golden/streaming_basics/expected/lir_06_const_prop.txt +84 -0
  432. data/golden/streaming_basics/expected/nast.txt +48 -0
  433. data/golden/streaming_basics/expected/schema_javascript.mjs +94 -0
  434. data/golden/streaming_basics/expected/schema_ruby.rb +127 -0
  435. data/golden/streaming_basics/expected/snast.txt +48 -0
  436. data/golden/streaming_basics/expected.json +10 -0
  437. data/golden/streaming_basics/input.json +8 -0
  438. data/golden/streaming_basics/schema.kumi +24 -0
  439. data/golden/tuples/expected/ast.txt +48 -0
  440. data/golden/tuples/expected/input_plan.txt +1 -0
  441. data/golden/tuples/expected/lir_00_unoptimized.txt +40 -0
  442. data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +40 -0
  443. data/golden/tuples/expected/lir_02_inlined.txt +48 -0
  444. data/golden/tuples/expected/lir_03_cse.txt +48 -0
  445. data/golden/tuples/expected/lir_04_1_loop_fusion.txt +48 -0
  446. data/golden/tuples/expected/lir_04_loop_invcm.txt +48 -0
  447. data/golden/tuples/expected/lir_06_const_prop.txt +48 -0
  448. data/golden/tuples/expected/nast.txt +42 -0
  449. data/golden/tuples/expected/schema_javascript.mjs +51 -0
  450. data/golden/tuples/expected/schema_ruby.rb +77 -0
  451. data/golden/tuples/expected/snast.txt +42 -0
  452. data/golden/tuples/expected.json +7 -0
  453. data/golden/tuples/input.json +3 -0
  454. data/golden/tuples/schema.kumi +11 -0
  455. data/golden/tuples_and_arrays/expected/ast.txt +44 -0
  456. data/golden/tuples_and_arrays/expected/input_plan.txt +7 -0
  457. data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +41 -0
  458. data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +41 -0
  459. data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +62 -0
  460. data/golden/tuples_and_arrays/expected/lir_03_cse.txt +51 -0
  461. data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +51 -0
  462. data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +51 -0
  463. data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +51 -0
  464. data/golden/tuples_and_arrays/expected/nast.txt +28 -0
  465. data/golden/tuples_and_arrays/expected/schema_javascript.mjs +58 -0
  466. data/golden/tuples_and_arrays/expected/schema_ruby.rb +88 -0
  467. data/golden/tuples_and_arrays/expected/snast.txt +28 -0
  468. data/golden/tuples_and_arrays/expected.json +18 -0
  469. data/golden/tuples_and_arrays/input.json +7 -0
  470. data/golden/tuples_and_arrays/schema.kumi +38 -0
  471. data/golden/with_constants/expected/ast.txt +28 -0
  472. data/golden/with_constants/expected/input_plan.txt +2 -0
  473. data/golden/with_constants/expected/lir_00_unoptimized.txt +17 -0
  474. data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +17 -0
  475. data/golden/with_constants/expected/lir_02_inlined.txt +17 -0
  476. data/golden/with_constants/expected/lir_03_cse.txt +17 -0
  477. data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +17 -0
  478. data/golden/with_constants/expected/lir_04_loop_invcm.txt +17 -0
  479. data/golden/with_constants/expected/lir_06_const_prop.txt +17 -0
  480. data/golden/with_constants/expected/nast.txt +21 -0
  481. data/golden/with_constants/expected/schema_javascript.mjs +18 -0
  482. data/golden/with_constants/expected/schema_ruby.rb +44 -0
  483. data/golden/with_constants/expected/snast.txt +15 -0
  484. data/golden/with_constants/schema.kumi +10 -0
  485. data/lib/kumi/analyzer.rb +76 -24
  486. data/lib/kumi/configuration.rb +60 -0
  487. data/lib/kumi/core/analyzer/binder.rb +121 -0
  488. data/lib/kumi/core/analyzer/checkpoint.rb +15 -9
  489. data/lib/kumi/core/analyzer/constant_evaluator.rb +32 -37
  490. data/lib/kumi/core/analyzer/constant_folding_helpers.rb +55 -0
  491. data/lib/kumi/core/analyzer/debug.rb +14 -16
  492. data/lib/kumi/core/analyzer/fn_aliases.rb +46 -0
  493. data/lib/kumi/core/analyzer/folder.rb +94 -0
  494. data/lib/kumi/core/analyzer/macro_expander.rb +69 -0
  495. data/lib/kumi/core/analyzer/passes/assemble_irv2_pass.rb +130 -0
  496. data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +71 -0
  497. data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +181 -0
  498. data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +317 -0
  499. data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +75 -0
  500. data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +103 -0
  501. data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +27 -0
  502. data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +321 -0
  503. data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +85 -0
  504. data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +111 -0
  505. data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +32 -0
  506. data/lib/kumi/core/analyzer/passes/constant_folding_pass.rb +33 -0
  507. data/lib/kumi/core/analyzer/passes/contract_checker_pass.rb +220 -0
  508. data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +5 -6
  509. data/lib/kumi/core/analyzer/passes/input_access_planner_pass.rb +7 -3
  510. data/lib/kumi/core/analyzer/passes/input_collector.rb +74 -122
  511. data/lib/kumi/core/analyzer/passes/input_form_schema_pass.rb +43 -0
  512. data/lib/kumi/core/analyzer/passes/ir_dependency_pass.rb +1 -1
  513. data/lib/kumi/core/analyzer/passes/ir_execution_schedule_pass.rb +1 -1
  514. data/lib/kumi/core/analyzer/passes/join_reduce_planning_pass.rb +21 -23
  515. data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +84 -0
  516. data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +93 -0
  517. data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +115 -0
  518. data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +274 -0
  519. data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +198 -0
  520. data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +30 -0
  521. data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +121 -0
  522. data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +156 -0
  523. data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +148 -0
  524. data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +407 -0
  525. data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +243 -0
  526. data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +83 -0
  527. data/lib/kumi/core/analyzer/passes/load_input_cse.rb +17 -16
  528. data/lib/kumi/core/analyzer/passes/lower_to_ir_pass.rb +4 -2
  529. data/lib/kumi/core/analyzer/passes/lower_to_irv2_pass.rb +197 -0
  530. data/lib/kumi/core/analyzer/passes/name_indexer.rb +4 -1
  531. data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +237 -0
  532. data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +156 -0
  533. data/lib/kumi/core/analyzer/passes/output_schema_pass.rb +38 -0
  534. data/lib/kumi/core/analyzer/passes/pass_base.rb +30 -4
  535. data/lib/kumi/core/analyzer/passes/precompute_access_paths_pass.rb +93 -0
  536. data/lib/kumi/core/analyzer/passes/scope_resolution_pass.rb +33 -30
  537. data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -26
  538. data/lib/kumi/core/analyzer/passes/snast_pass.rb +229 -0
  539. data/lib/kumi/core/analyzer/passes/toposorter.rb +1 -0
  540. data/lib/kumi/core/analyzer/passes/type_checker.rb +13 -0
  541. data/lib/kumi/core/analyzer/passes/type_inferencer_pass.rb +14 -16
  542. data/lib/kumi/core/analyzer/passes/unsat_detector.rb +2 -1
  543. data/lib/kumi/core/analyzer/plans.rb +12 -0
  544. data/lib/kumi/core/analyzer/state_serde.rb +4 -4
  545. data/lib/kumi/core/analyzer/structs/access_plan.rb +2 -2
  546. data/lib/kumi/core/analyzer/unsat_constant_evaluator.rb +59 -0
  547. data/lib/kumi/core/compiler/access_codegen.rb +1 -1
  548. data/lib/kumi/core/compiler/access_emit/base.rb +9 -5
  549. data/lib/kumi/core/compiler/access_emit/each_indexed.rb +10 -3
  550. data/lib/kumi/core/compiler/access_emit/materialize.rb +12 -5
  551. data/lib/kumi/core/compiler/access_emit/ravel.rb +10 -3
  552. data/lib/kumi/core/compiler/access_emit/read.rb +4 -1
  553. data/lib/kumi/core/compiler/access_planner.rb +42 -4
  554. data/lib/kumi/core/compiler/access_planner_v2.rb +164 -0
  555. data/lib/kumi/core/explain.rb +18 -11
  556. data/lib/kumi/core/functions/loader.rb +47 -0
  557. data/lib/kumi/core/functions/model.rb +10 -0
  558. data/lib/kumi/core/functions/type_rules.rb +108 -0
  559. data/lib/kumi/core/ir/execution_engine/interpreter.rb +1 -1
  560. data/lib/kumi/core/ir/execution_engine/profiler.rb +107 -97
  561. data/lib/kumi/core/ir.rb +6 -2
  562. data/lib/kumi/core/irv2/builder.rb +48 -0
  563. data/lib/kumi/core/irv2/declaration.rb +28 -0
  564. data/lib/kumi/core/irv2/module.rb +108 -0
  565. data/lib/kumi/core/irv2/value.rb +28 -0
  566. data/lib/kumi/core/lir/analyze.rb +64 -0
  567. data/lib/kumi/core/lir/build.rb +363 -0
  568. data/lib/kumi/core/lir/emit.rb +62 -0
  569. data/lib/kumi/core/lir/structs/instruction.rb +44 -0
  570. data/lib/kumi/core/lir/structs/literal.rb +14 -0
  571. data/lib/kumi/core/lir/structs/stamp.rb +13 -0
  572. data/lib/kumi/core/lir/support/error.rb +9 -0
  573. data/lib/kumi/core/lir/support/ids.rb +34 -0
  574. data/lib/kumi/core/lir/validate.rb +74 -0
  575. data/lib/kumi/core/lir.rb +34 -0
  576. data/lib/kumi/core/nast.rb +216 -0
  577. data/lib/kumi/core/ruby_parser/dsl.rb +2 -2
  578. data/lib/kumi/core/ruby_parser/dsl_cascade_builder.rb +1 -1
  579. data/lib/kumi/core/ruby_parser/expression_converter.rb +10 -0
  580. data/lib/kumi/core/ruby_parser/input_builder.rb +16 -17
  581. data/lib/kumi/core/ruby_parser/schema_builder.rb +36 -10
  582. data/lib/kumi/core/ruby_parser/sugar.rb +64 -0
  583. data/lib/kumi/core/types/builder.rb +2 -2
  584. data/lib/kumi/core/types/normalizer.rb +2 -0
  585. data/lib/kumi/core/types/validator.rb +10 -3
  586. data/lib/kumi/core/types.rb +7 -0
  587. data/lib/kumi/dev/codegen.rb +194 -0
  588. data/lib/kumi/dev/golden/generator.rb +105 -0
  589. data/lib/kumi/dev/golden/reporter.rb +160 -0
  590. data/lib/kumi/dev/golden/representation.rb +45 -0
  591. data/lib/kumi/dev/golden/result.rb +98 -0
  592. data/lib/kumi/dev/golden/runtime_test.rb +93 -0
  593. data/lib/kumi/dev/golden/suite.rb +131 -0
  594. data/lib/kumi/dev/golden/verifier.rb +76 -0
  595. data/lib/kumi/dev/golden.rb +75 -0
  596. data/lib/kumi/dev/ir.rb +4 -4
  597. data/lib/kumi/dev/parse.rb +1 -1
  598. data/lib/kumi/dev/pretty_printer.rb +229 -0
  599. data/lib/kumi/dev/printer/irv2_formatter.rb +163 -0
  600. data/lib/kumi/dev/printer/width_aware_json.rb +44 -0
  601. data/lib/kumi/dev/profile_aggregator.rb +36 -38
  602. data/lib/kumi/dev/profile_runner.rb +19 -23
  603. data/lib/kumi/dev/runner.rb +12 -22
  604. data/lib/kumi/dev/support/kumi_runner.mjs +39 -0
  605. data/lib/kumi/dev.rb +3 -3
  606. data/lib/kumi/frontends/ruby.rb +12 -12
  607. data/lib/kumi/frontends/text.rb +26 -21
  608. data/lib/kumi/frontends.rb +6 -8
  609. data/lib/kumi/kernel_registry.rb +59 -0
  610. data/lib/kumi/pack/builder.rb +229 -0
  611. data/lib/kumi/pack.rb +15 -0
  612. data/lib/kumi/registry_v2/loader.rb +81 -0
  613. data/lib/kumi/registry_v2.rb +118 -0
  614. data/lib/kumi/schema.rb +83 -43
  615. data/lib/kumi/support/diff.rb +3 -2
  616. data/lib/kumi/support/ir_render.rb +1 -1
  617. data/lib/kumi/support/lir_printer.rb +143 -0
  618. data/lib/kumi/support/nast_printer.rb +93 -0
  619. data/lib/kumi/support/s_expression_printer.rb +5 -4
  620. data/lib/kumi/support/snast_printer.rb +111 -0
  621. data/lib/kumi/syntax/call_expression.rb +1 -1
  622. data/lib/kumi/syntax/input_declaration.rb +2 -2
  623. data/lib/kumi/syntax/node.rb +4 -12
  624. data/lib/kumi/syntax/root.rb +10 -0
  625. data/lib/kumi/syntax/trait_declaration.rb +1 -0
  626. data/lib/kumi/syntax/value_declaration.rb +1 -0
  627. data/lib/kumi/version.rb +1 -1
  628. data/lib/kumi.rb +46 -4
  629. metadata +571 -54
  630. data/docs/AST.md +0 -133
  631. data/docs/DSL.md +0 -154
  632. data/docs/FUNCTIONS.md +0 -176
  633. data/docs/VECTOR_SEMANTICS.md +0 -286
  634. data/docs/compiler_design_principles.md +0 -86
  635. data/docs/dev/analyzer-debug.md +0 -52
  636. data/docs/dev/parse-command.md +0 -64
  637. data/docs/dev/vm-profiling.md +0 -95
  638. data/docs/development/README.md +0 -120
  639. data/docs/development/error-reporting.md +0 -361
  640. data/docs/features/README.md +0 -58
  641. data/docs/features/analysis-type-inference.md +0 -42
  642. data/docs/features/analysis-unsat-detection.md +0 -71
  643. data/docs/features/hierarchical-broadcasting.md +0 -415
  644. data/docs/features/input-declaration-system.md +0 -58
  645. data/docs/features/performance.md +0 -14
  646. data/docs/features/s-expression-printer.md +0 -77
  647. data/docs/schema_metadata/broadcasts.md +0 -53
  648. data/docs/schema_metadata/cascades.md +0 -45
  649. data/docs/schema_metadata/declarations.md +0 -54
  650. data/docs/schema_metadata/dependencies.md +0 -57
  651. data/docs/schema_metadata/evaluation_order.md +0 -29
  652. data/docs/schema_metadata/examples.md +0 -95
  653. data/docs/schema_metadata/inferred_types.md +0 -46
  654. data/docs/schema_metadata/inputs.md +0 -86
  655. data/docs/schema_metadata.md +0 -108
  656. data/golden/mixed_nesting/schema.kumi +0 -42
  657. data/lib/kumi/core/function_registry/collection_functions.rb +0 -298
  658. data/lib/kumi/core/function_registry/comparison_functions.rb +0 -33
  659. data/lib/kumi/core/function_registry/conditional_functions.rb +0 -48
  660. data/lib/kumi/core/function_registry/function_builder.rb +0 -184
  661. data/lib/kumi/core/function_registry/logical_functions.rb +0 -214
  662. data/lib/kumi/core/function_registry/math_functions.rb +0 -74
  663. data/lib/kumi/core/function_registry/stat_functions.rb +0 -156
  664. data/lib/kumi/core/function_registry/string_functions.rb +0 -57
  665. data/lib/kumi/core/function_registry/type_functions.rb +0 -53
  666. data/lib/kumi/core/function_registry.rb +0 -176
  667. data/lib/kumi/registry.rb +0 -32
  668. data/lib/kumi/runtime/executable.rb +0 -135
  669. data/lib/kumi/runtime/run.rb +0 -105
  670. data/performance_results.txt +0 -63
  671. data/scripts/analyze_broadcast_methods.rb +0 -68
  672. data/scripts/analyze_cascade_methods.rb +0 -74
  673. data/scripts/check_broadcasting_coverage.rb +0 -51
  674. data/scripts/find_dead_code.rb +0 -114
  675. data/scripts/generate_function_docs.rb +0 -71
  676. data/scripts/test_mixed_nesting_performance.rb +0 -206
@@ -0,0 +1,68 @@
1
+ (LIR
2
+ (Declaration dept_headcount
3
+ %t1 = load_input "departments" :: array
4
+ loop departments id=L1 in %t1 as el=%departments_el_2, idx=%departments_i_3
5
+ %acc_4 = decl_acc :: integer
6
+ %t5 = load_field departments_el_2["teams"] :: any
7
+ loop teams id=L2 in %t5 as el=%teams_el_6, idx=%teams_i_7
8
+ %t8 = load_field teams_el_6["headcount"] :: integer
9
+ %acc_4 = acc_add agg.sum(%acc_4, %t8) :: integer
10
+ end_loop
11
+ %t9 = acc_load %acc_4 :: integer
12
+ yield %t9
13
+ end_loop
14
+ )
15
+ (Declaration teams_per_dept
16
+ %t10 = load_input "departments" :: array
17
+ loop departments id=L3 in %t10 as el=%departments_el_11, idx=%departments_i_12
18
+ %acc_13 = decl_acc :: integer
19
+ %t14 = load_field departments_el_11["teams"] :: any
20
+ loop teams id=L4 in %t14 as el=%teams_el_15, idx=%teams_i_16
21
+ %t17 = load_field teams_el_15["team_name"] :: string
22
+ %acc_13 = acc_add agg.count(%acc_13, %t17) :: integer
23
+ end_loop
24
+ %t18 = acc_load %acc_13 :: integer
25
+ yield %t18
26
+ end_loop
27
+ )
28
+ (Declaration avg_headcount_per_dept
29
+ %t19 = load_input "departments" :: array
30
+ loop departments id=L5 in %t19 as el=%departments_el_20, idx=%departments_i_21
31
+ %acc36 = decl_acc :: integer
32
+ %t37 = load_field departments_el_20["teams"] :: any
33
+ %acc42 = decl_acc :: integer
34
+ loop teams id=L8 in %t37 as el=%teams_el_6, idx=%teams_i_7
35
+ %t38 = load_field teams_el_6["headcount"] :: integer
36
+ %acc36 = acc_add agg.sum(%acc36, %t38) :: integer
37
+ %t44 = load_field teams_el_6["team_name"] :: string
38
+ %acc42 = acc_add agg.count(%acc42, %t44) :: integer
39
+ end_loop
40
+ %t39 = acc_load %acc36 :: integer
41
+ %t45 = acc_load %acc42 :: integer
42
+ %t24 = call core.div(%t39, %t45) :: float
43
+ yield %t24
44
+ end_loop
45
+ )
46
+ (Declaration is_above_average_team
47
+ %t25 = load_input "departments" :: array
48
+ loop departments id=L6 in %t25 as el=%departments_el_26, idx=%departments_i_27
49
+ %t28 = load_field departments_el_26["teams"] :: any
50
+ %acc52 = decl_acc :: integer
51
+ %acc58 = decl_acc :: integer
52
+ loop teams id=L10 in %t28 as el=%teams_el_6, idx=%teams_i_7
53
+ %t54 = load_field teams_el_6["headcount"] :: integer
54
+ %acc52 = acc_add agg.sum(%acc52, %t54) :: integer
55
+ %t60 = load_field teams_el_6["team_name"] :: string
56
+ %acc58 = acc_add agg.count(%acc58, %t60) :: integer
57
+ end_loop
58
+ %t55 = acc_load %acc52 :: integer
59
+ %t61 = acc_load %acc58 :: integer
60
+ %t49 = call core.div(%t55, %t61) :: float
61
+ loop teams id=L7 in %t28 as el=%teams_el_29, idx=%teams_i_30
62
+ %t31 = load_field teams_el_29["headcount"] :: integer
63
+ %t33 = call core.gt(%t31, %t49) :: boolean
64
+ yield %t33
65
+ end_loop
66
+ end_loop
67
+ )
68
+ )
@@ -0,0 +1,24 @@
1
+ (NAST
2
+ (VALUE dept_headcount
3
+ (Call :"agg.sum"
4
+ (InputRef [:departments, :dept, :teams, :team, :headcount])
5
+ )
6
+ )
7
+ (VALUE teams_per_dept
8
+ (Call :"agg.count"
9
+ (InputRef [:departments, :dept, :teams, :team, :team_name])
10
+ )
11
+ )
12
+ (VALUE avg_headcount_per_dept
13
+ (Call :"core.div"
14
+ (Ref dept_headcount)
15
+ (Ref teams_per_dept)
16
+ )
17
+ )
18
+ (TRAIT is_above_average_team
19
+ (Call :"core.gt"
20
+ (InputRef [:departments, :dept, :teams, :team, :headcount])
21
+ (Ref avg_headcount_per_dept)
22
+ )
23
+ )
24
+ )
@@ -0,0 +1,74 @@
1
+ export function _dept_headcount(input) {
2
+ let out = [];
3
+ let t1 = input["departments"];
4
+ t1.forEach((departments_el_2, departments_i_3) => {
5
+ let acc_4 = 0;
6
+ let t5 = departments_el_2["teams"];
7
+ t5.forEach((teams_el_6, teams_i_7) => {
8
+ let t8 = teams_el_6["headcount"];
9
+ acc_4 += t8;
10
+ });
11
+ out.push(acc_4);
12
+ });
13
+ return out;
14
+ }
15
+
16
+ export function _teams_per_dept(input) {
17
+ let out = [];
18
+ let t10 = input["departments"];
19
+ t10.forEach((departments_el_11, departments_i_12) => {
20
+ let acc_13 = 0;
21
+ let t14 = departments_el_11["teams"];
22
+ t14.forEach((teams_el_15, teams_i_16) => {
23
+ let t17 = teams_el_15["team_name"];
24
+ acc_13 += 1;
25
+ });
26
+ out.push(acc_13);
27
+ });
28
+ return out;
29
+ }
30
+
31
+ export function _avg_headcount_per_dept(input) {
32
+ let out = [];
33
+ let t19 = input["departments"];
34
+ t19.forEach((departments_el_20, departments_i_21) => {
35
+ let acc36 = 0;
36
+ let t37 = departments_el_20["teams"];
37
+ let acc42 = 0;
38
+ t37.forEach((teams_el_6, teams_i_7) => {
39
+ let t38 = teams_el_6["headcount"];
40
+ acc36 += t38;
41
+ let t44 = teams_el_6["team_name"];
42
+ acc42 += 1;
43
+ });
44
+ let t24 = acc36 / acc42;
45
+ out.push(t24);
46
+ });
47
+ return out;
48
+ }
49
+
50
+ export function _is_above_average_team(input) {
51
+ let out = [];
52
+ let t25 = input["departments"];
53
+ t25.forEach((departments_el_26, departments_i_27) => {
54
+ let out_1 = [];
55
+ let t28 = departments_el_26["teams"];
56
+ let acc52 = 0;
57
+ let acc58 = 0;
58
+ t28.forEach((teams_el_6, teams_i_7) => {
59
+ let t54 = teams_el_6["headcount"];
60
+ acc52 += t54;
61
+ let t60 = teams_el_6["team_name"];
62
+ acc58 += 1;
63
+ });
64
+ let t49 = acc52 / acc58;
65
+ t28.forEach((teams_el_29, teams_i_30) => {
66
+ let t31 = teams_el_29["headcount"];
67
+ let t33 = t31 > t49;
68
+ out_1.push(t33);
69
+ });
70
+ out.push(out_1);
71
+ });
72
+ return out;
73
+ }
74
+
@@ -0,0 +1,110 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_621112a9f96fd9df9274375684d4aad116dd930db67521f72ec03d1f911fd1ca
3
+ def self.from(input_data = nil)
4
+ instance = Object.new
5
+ instance.extend(self)
6
+ instance.instance_variable_set(:@input, input_data)
7
+ instance
8
+ end
9
+
10
+ def self.__kumi_executable__
11
+ instance = Object.new
12
+ instance.extend(self)
13
+ instance
14
+ end
15
+
16
+ def update(input_data)
17
+ @input = @input.merge(input_data)
18
+ self
19
+ end
20
+
21
+ def [](name)
22
+ case name
23
+ when :dept_headcount then _dept_headcount
24
+ when :teams_per_dept then _teams_per_dept
25
+ when :avg_headcount_per_dept then _avg_headcount_per_dept
26
+ when :is_above_average_team then _is_above_average_team
27
+ else raise KeyError, "Unknown declaration"
28
+ end
29
+ end
30
+
31
+ def _dept_headcount(input = @input)
32
+ out = []
33
+ t1 = input["departments"] || input[:departments]
34
+ t1.each_with_index do |departments_el_2, departments_i_3|
35
+ acc_4 = 0
36
+ t5 = departments_el_2["teams"] || departments_el_2[:teams]
37
+ t5.each_with_index do |teams_el_6, teams_i_7|
38
+ t8 = teams_el_6["headcount"] || teams_el_6[:headcount]
39
+ acc_4 += t8
40
+ end
41
+ t9 = acc_4
42
+ out << t9
43
+ end
44
+ out
45
+ end
46
+
47
+ def _teams_per_dept(input = @input)
48
+ out = []
49
+ t10 = input["departments"] || input[:departments]
50
+ t10.each_with_index do |departments_el_11, departments_i_12|
51
+ acc_13 = 0
52
+ t14 = departments_el_11["teams"] || departments_el_11[:teams]
53
+ t14.each_with_index do |teams_el_15, teams_i_16|
54
+ t17 = teams_el_15["team_name"] || teams_el_15[:team_name]
55
+ acc_13 += 1
56
+ end
57
+ t18 = acc_13
58
+ out << t18
59
+ end
60
+ out
61
+ end
62
+
63
+ def _avg_headcount_per_dept(input = @input)
64
+ out = []
65
+ t19 = input["departments"] || input[:departments]
66
+ t19.each_with_index do |departments_el_20, departments_i_21|
67
+ acc36 = 0
68
+ t37 = departments_el_20["teams"] || departments_el_20[:teams]
69
+ acc42 = 0
70
+ t37.each_with_index do |teams_el_6, teams_i_7|
71
+ t38 = teams_el_6["headcount"] || teams_el_6[:headcount]
72
+ acc36 += t38
73
+ t44 = teams_el_6["team_name"] || teams_el_6[:team_name]
74
+ acc42 += 1
75
+ end
76
+ t39 = acc36
77
+ t45 = acc42
78
+ t24 = t39 / t45.to_f
79
+ out << t24
80
+ end
81
+ out
82
+ end
83
+
84
+ def _is_above_average_team(input = @input)
85
+ out = []
86
+ t25 = input["departments"] || input[:departments]
87
+ t25.each_with_index do |departments_el_26, departments_i_27|
88
+ out_1 = []
89
+ t28 = departments_el_26["teams"] || departments_el_26[:teams]
90
+ acc52 = 0
91
+ acc58 = 0
92
+ t28.each_with_index do |teams_el_6, teams_i_7|
93
+ t54 = teams_el_6["headcount"] || teams_el_6[:headcount]
94
+ acc52 += t54
95
+ t60 = teams_el_6["team_name"] || teams_el_6[:team_name]
96
+ acc58 += 1
97
+ end
98
+ t55 = acc52
99
+ t61 = acc58
100
+ t49 = t55 / t61.to_f
101
+ t28.each_with_index do |teams_el_29, teams_i_30|
102
+ t31 = teams_el_29["headcount"] || teams_el_29[:headcount]
103
+ t33 = t31 > t49
104
+ out_1 << t33
105
+ end
106
+ out << out_1
107
+ end
108
+ out
109
+ end
110
+ end
@@ -0,0 +1,24 @@
1
+ (SNAST
2
+ (VALUE dept_headcount
3
+ (Reduce :agg.sum over [teams]
4
+ (InputRef departments.dept.teams.team.headcount key_chain=[]) :: [departments, teams] -> integer
5
+ ) :: [departments] -> integer
6
+ ) :: [departments] -> integer
7
+ (VALUE teams_per_dept
8
+ (Reduce :agg.count over [teams]
9
+ (InputRef departments.dept.teams.team.team_name key_chain=[]) :: [departments, teams] -> string
10
+ ) :: [departments] -> integer
11
+ ) :: [departments] -> integer
12
+ (VALUE avg_headcount_per_dept
13
+ (Call :core.div
14
+ (Ref dept_headcount) :: [departments] -> integer
15
+ (Ref teams_per_dept) :: [departments] -> integer
16
+ ) :: [departments] -> float
17
+ ) :: [departments] -> float
18
+ (TRAIT is_above_average_team
19
+ (Call :core.gt
20
+ (InputRef departments.dept.teams.team.headcount key_chain=[]) :: [departments, teams] -> integer
21
+ (Ref avg_headcount_per_dept) :: [departments] -> float
22
+ ) :: [departments, teams] -> boolean
23
+ ) :: [departments, teams] -> boolean
24
+ )
@@ -0,0 +1,25 @@
1
+ {
2
+ "dept_headcount": [
3
+ 30,
4
+ 40
5
+ ],
6
+ "teams_per_dept": [
7
+ 3,
8
+ 2
9
+ ],
10
+ "avg_headcount_per_dept": [
11
+ 10.0,
12
+ 20.0
13
+ ],
14
+ "is_above_average_team": [
15
+ [
16
+ false,
17
+ true,
18
+ false
19
+ ],
20
+ [
21
+ true,
22
+ false
23
+ ]
24
+ ]
25
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "departments": [
3
+ {
4
+ "dept_name": "Engineering",
5
+ "teams": [
6
+ {"team_name": "Backend", "headcount": 10},
7
+ {"team_name": "Frontend", "headcount": 15},
8
+ {"team_name": "Data", "headcount": 5}
9
+ ]
10
+ },
11
+ {
12
+ "dept_name": "Sales",
13
+ "teams": [
14
+ {"team_name": "Enterprise", "headcount": 30},
15
+ {"team_name": "SMB", "headcount": 10}
16
+ ]
17
+ }
18
+ ]
19
+ }
@@ -0,0 +1,34 @@
1
+ schema do
2
+ input do
3
+ array :departments do
4
+ hash :dept do
5
+ string :dept_name
6
+ array :teams do
7
+ hash :team do
8
+ string :team_name
9
+ integer :headcount
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+
16
+ # 1. Reduce to find the total headcount per department.
17
+ # Scope: [departments] -> integer
18
+ value :dept_headcount, fn(:sum, input.departments.dept.teams.team.headcount)
19
+
20
+ # 2. Count the number of teams per department.
21
+ # Scope: [departments] -> integer
22
+ value :teams_per_dept, fn(:count, input.departments.dept.teams.team.team_name)
23
+
24
+ # 3. Calculate the average headcount for each department.
25
+ # Note: This is a scalar value *at the department level*.
26
+ # Scope: [departments] -> float
27
+ value :avg_headcount_per_dept, dept_headcount / teams_per_dept
28
+
29
+ # 4. CORNER CASE: Broadcast the department-level average back down
30
+ # to the team level for comparison. The compiler must correctly align
31
+ # `avg_headcount_per_dept` with each team within that department.
32
+ # Scope: [departments, teams] -> boolean
33
+ trait :is_above_average_team, input.departments.dept.teams.team.headcount > avg_headcount_per_dept
34
+ end
@@ -0,0 +1,36 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :cells :array
4
+ [
5
+ (InputDeclaration :value :integer)
6
+ ]
7
+ )
8
+ ]
9
+ values: [
10
+ (ValueDeclaration :roll_right
11
+ (CallExpression :roll
12
+ (InputElementReference cells.value)
13
+ (Literal 1)
14
+ )
15
+ )
16
+ (ValueDeclaration :roll_left
17
+ (CallExpression :roll
18
+ (InputElementReference cells.value)
19
+ (Literal -1)
20
+ )
21
+ )
22
+ (ValueDeclaration :roll_right_clamp
23
+ (CallExpression :roll
24
+ (InputElementReference cells.value)
25
+ (Literal 1)
26
+ )
27
+ )
28
+ (ValueDeclaration :roll_left_clamp
29
+ (CallExpression :roll
30
+ (InputElementReference cells.value)
31
+ (Literal -1)
32
+ )
33
+ )
34
+ ]
35
+ traits: []
36
+ )
@@ -0,0 +1,3 @@
1
+ cells: array (array) access_mode=element
2
+ └─> value: element_access
3
+ value: integer
@@ -0,0 +1,56 @@
1
+ (LIR
2
+ (Declaration roll_right
3
+ %t1 = load_input "cells" :: array
4
+ loop cells id=L1 in %t1 as el=%cells_el_2, idx=%cells_i_3
5
+ %t4 = Length %t1 :: integer
6
+ %t5 = const 1 :: integer
7
+ %t6 = call core.sub(%cells_i_3, %t5) :: integer
8
+ %t7 = call core.mod(%t6, %t4) :: integer
9
+ %t8 = call core.add(%t7, %t4) :: integer
10
+ %t9 = call core.mod(%t8, %t4) :: integer
11
+ %t10 = Gather %t1, %t9 :: integer
12
+ yield %t10
13
+ end_loop
14
+ )
15
+ (Declaration roll_left
16
+ %t11 = load_input "cells" :: array
17
+ loop cells id=L2 in %t11 as el=%cells_el_12, idx=%cells_i_13
18
+ %t14 = Length %t11 :: integer
19
+ %t15 = const -1 :: integer
20
+ %t16 = call core.sub(%cells_i_13, %t15) :: integer
21
+ %t17 = call core.mod(%t16, %t14) :: integer
22
+ %t18 = call core.add(%t17, %t14) :: integer
23
+ %t19 = call core.mod(%t18, %t14) :: integer
24
+ %t20 = Gather %t11, %t19 :: integer
25
+ yield %t20
26
+ end_loop
27
+ )
28
+ (Declaration roll_right_clamp
29
+ %t21 = load_input "cells" :: array
30
+ loop cells id=L3 in %t21 as el=%cells_el_22, idx=%cells_i_23
31
+ %t24 = Length %t21 :: integer
32
+ %t25 = const 1 :: integer
33
+ %t26 = call core.sub(%cells_i_23, %t25) :: integer
34
+ %t27 = const 1 :: integer
35
+ %t28 = call core.sub(%t24, %t27) :: integer
36
+ %t29 = const 0 :: integer
37
+ %t30 = call core.clamp(%t26, %t29, %t28) :: integer
38
+ %t31 = Gather %t21, %t30 :: integer
39
+ yield %t31
40
+ end_loop
41
+ )
42
+ (Declaration roll_left_clamp
43
+ %t32 = load_input "cells" :: array
44
+ loop cells id=L4 in %t32 as el=%cells_el_33, idx=%cells_i_34
45
+ %t35 = Length %t32 :: integer
46
+ %t36 = const -1 :: integer
47
+ %t37 = call core.sub(%cells_i_34, %t36) :: integer
48
+ %t38 = const 1 :: integer
49
+ %t39 = call core.sub(%t35, %t38) :: integer
50
+ %t40 = const 0 :: integer
51
+ %t41 = call core.clamp(%t37, %t40, %t39) :: integer
52
+ %t42 = Gather %t32, %t41 :: integer
53
+ yield %t42
54
+ end_loop
55
+ )
56
+ )
@@ -0,0 +1,56 @@
1
+ (LIR
2
+ (Declaration roll_right
3
+ %t1 = load_input "cells" :: array
4
+ loop cells id=L1 in %t1 as el=%cells_el_2, idx=%cells_i_3
5
+ %t4 = Length %t1 :: integer
6
+ %t5 = const 1 :: integer
7
+ %t6 = call core.sub(%cells_i_3, %t5) :: integer
8
+ %t7 = call core.mod(%t6, %t4) :: integer
9
+ %t8 = call core.add(%t7, %t4) :: integer
10
+ %t9 = call core.mod(%t8, %t4) :: integer
11
+ %t10 = Gather %t1, %t9 :: integer
12
+ yield %t10
13
+ end_loop
14
+ )
15
+ (Declaration roll_left
16
+ %t11 = load_input "cells" :: array
17
+ loop cells id=L2 in %t11 as el=%cells_el_12, idx=%cells_i_13
18
+ %t14 = Length %t11 :: integer
19
+ %t15 = const -1 :: integer
20
+ %t16 = call core.sub(%cells_i_13, %t15) :: integer
21
+ %t17 = call core.mod(%t16, %t14) :: integer
22
+ %t18 = call core.add(%t17, %t14) :: integer
23
+ %t19 = call core.mod(%t18, %t14) :: integer
24
+ %t20 = Gather %t11, %t19 :: integer
25
+ yield %t20
26
+ end_loop
27
+ )
28
+ (Declaration roll_right_clamp
29
+ %t21 = load_input "cells" :: array
30
+ loop cells id=L3 in %t21 as el=%cells_el_22, idx=%cells_i_23
31
+ %t24 = Length %t21 :: integer
32
+ %t25 = const 1 :: integer
33
+ %t26 = call core.sub(%cells_i_23, %t25) :: integer
34
+ %t27 = const 1 :: integer
35
+ %t28 = call core.sub(%t24, %t27) :: integer
36
+ %t29 = const 0 :: integer
37
+ %t30 = call core.clamp(%t26, %t29, %t28) :: integer
38
+ %t31 = Gather %t21, %t30 :: integer
39
+ yield %t31
40
+ end_loop
41
+ )
42
+ (Declaration roll_left_clamp
43
+ %t32 = load_input "cells" :: array
44
+ loop cells id=L4 in %t32 as el=%cells_el_33, idx=%cells_i_34
45
+ %t35 = Length %t32 :: integer
46
+ %t36 = const -1 :: integer
47
+ %t37 = call core.sub(%cells_i_34, %t36) :: integer
48
+ %t38 = const 1 :: integer
49
+ %t39 = call core.sub(%t35, %t38) :: integer
50
+ %t40 = const 0 :: integer
51
+ %t41 = call core.clamp(%t37, %t40, %t39) :: integer
52
+ %t42 = Gather %t32, %t41 :: integer
53
+ yield %t42
54
+ end_loop
55
+ )
56
+ )
@@ -0,0 +1,56 @@
1
+ (LIR
2
+ (Declaration roll_right
3
+ %t1 = load_input "cells" :: array
4
+ loop cells id=L1 in %t1 as el=%cells_el_2, idx=%cells_i_3
5
+ %t4 = Length %t1 :: integer
6
+ %t5 = const 1 :: integer
7
+ %t6 = call core.sub(%cells_i_3, %t5) :: integer
8
+ %t7 = call core.mod(%t6, %t4) :: integer
9
+ %t8 = call core.add(%t7, %t4) :: integer
10
+ %t9 = call core.mod(%t8, %t4) :: integer
11
+ %t10 = Gather %t1, %t9 :: integer
12
+ yield %t10
13
+ end_loop
14
+ )
15
+ (Declaration roll_left
16
+ %t11 = load_input "cells" :: array
17
+ loop cells id=L2 in %t11 as el=%cells_el_12, idx=%cells_i_13
18
+ %t14 = Length %t11 :: integer
19
+ %t15 = const -1 :: integer
20
+ %t16 = call core.sub(%cells_i_13, %t15) :: integer
21
+ %t17 = call core.mod(%t16, %t14) :: integer
22
+ %t18 = call core.add(%t17, %t14) :: integer
23
+ %t19 = call core.mod(%t18, %t14) :: integer
24
+ %t20 = Gather %t11, %t19 :: integer
25
+ yield %t20
26
+ end_loop
27
+ )
28
+ (Declaration roll_right_clamp
29
+ %t21 = load_input "cells" :: array
30
+ loop cells id=L3 in %t21 as el=%cells_el_22, idx=%cells_i_23
31
+ %t24 = Length %t21 :: integer
32
+ %t25 = const 1 :: integer
33
+ %t26 = call core.sub(%cells_i_23, %t25) :: integer
34
+ %t27 = const 1 :: integer
35
+ %t28 = call core.sub(%t24, %t27) :: integer
36
+ %t29 = const 0 :: integer
37
+ %t30 = call core.clamp(%t26, %t29, %t28) :: integer
38
+ %t31 = Gather %t21, %t30 :: integer
39
+ yield %t31
40
+ end_loop
41
+ )
42
+ (Declaration roll_left_clamp
43
+ %t32 = load_input "cells" :: array
44
+ loop cells id=L4 in %t32 as el=%cells_el_33, idx=%cells_i_34
45
+ %t35 = Length %t32 :: integer
46
+ %t36 = const -1 :: integer
47
+ %t37 = call core.sub(%cells_i_34, %t36) :: integer
48
+ %t38 = const 1 :: integer
49
+ %t39 = call core.sub(%t35, %t38) :: integer
50
+ %t40 = const 0 :: integer
51
+ %t41 = call core.clamp(%t37, %t40, %t39) :: integer
52
+ %t42 = Gather %t32, %t41 :: integer
53
+ yield %t42
54
+ end_loop
55
+ )
56
+ )
@@ -0,0 +1,55 @@
1
+ (LIR
2
+ (Declaration roll_right
3
+ %t1 = load_input "cells" :: array
4
+ loop cells id=L1 in %t1 as el=%cells_el_2, idx=%cells_i_3
5
+ %t4 = Length %t1 :: integer
6
+ %t5 = const 1 :: integer
7
+ %t6 = call core.sub(%cells_i_3, %t5) :: integer
8
+ %t7 = call core.mod(%t6, %t4) :: integer
9
+ %t8 = call core.add(%t7, %t4) :: integer
10
+ %t9 = call core.mod(%t8, %t4) :: integer
11
+ %t10 = Gather %t1, %t9 :: integer
12
+ yield %t10
13
+ end_loop
14
+ )
15
+ (Declaration roll_left
16
+ %t11 = load_input "cells" :: array
17
+ loop cells id=L2 in %t11 as el=%cells_el_12, idx=%cells_i_13
18
+ %t14 = Length %t11 :: integer
19
+ %t15 = const -1 :: integer
20
+ %t16 = call core.sub(%cells_i_13, %t15) :: integer
21
+ %t17 = call core.mod(%t16, %t14) :: integer
22
+ %t18 = call core.add(%t17, %t14) :: integer
23
+ %t19 = call core.mod(%t18, %t14) :: integer
24
+ %t20 = Gather %t11, %t19 :: integer
25
+ yield %t20
26
+ end_loop
27
+ )
28
+ (Declaration roll_right_clamp
29
+ %t21 = load_input "cells" :: array
30
+ loop cells id=L3 in %t21 as el=%cells_el_22, idx=%cells_i_23
31
+ %t24 = Length %t21 :: integer
32
+ %t25 = const 1 :: integer
33
+ %t29 = const 0 :: integer
34
+ %t26 = call core.sub(%cells_i_23, %t25) :: integer
35
+ %t28 = call core.sub(%t24, %t25) :: integer
36
+ %t30 = call core.clamp(%t26, %t29, %t28) :: integer
37
+ %t31 = Gather %t21, %t30 :: integer
38
+ yield %t31
39
+ end_loop
40
+ )
41
+ (Declaration roll_left_clamp
42
+ %t32 = load_input "cells" :: array
43
+ loop cells id=L4 in %t32 as el=%cells_el_33, idx=%cells_i_34
44
+ %t35 = Length %t32 :: integer
45
+ %t36 = const -1 :: integer
46
+ %t38 = const 1 :: integer
47
+ %t40 = const 0 :: integer
48
+ %t37 = call core.sub(%cells_i_34, %t36) :: integer
49
+ %t39 = call core.sub(%t35, %t38) :: integer
50
+ %t41 = call core.clamp(%t37, %t40, %t39) :: integer
51
+ %t42 = Gather %t32, %t41 :: integer
52
+ yield %t42
53
+ end_loop
54
+ )
55
+ )