kumi 0.0.18 → 0.0.19

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 +25 -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 +47 -5
  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,89 @@
1
+ (LIR
2
+ (Declaration high_performer
3
+ %t1 = load_input "regions" :: array
4
+ %t14 = const 4.5 :: float
5
+ loop regions id=L1 in %t1 as el=%regions_el_2, idx=%regions_i_3
6
+ %t4 = load_field regions_el_2["offices"] :: any
7
+ loop offices id=L2 in %t4 as el=%offices_el_5, idx=%offices_i_6
8
+ %t7 = load_field offices_el_5["teams"] :: any
9
+ loop teams id=L3 in %t7 as el=%teams_el_8, idx=%teams_i_9
10
+ %t10 = load_field teams_el_8["employees"] :: any
11
+ loop employees id=L4 in %t10 as el=%employees_el_11, idx=%employees_i_12
12
+ %t13 = load_field employees_el_11["rating"] :: float
13
+ %t15 = call core.gte(%t13, %t14) :: boolean
14
+ yield %t15
15
+ end_loop
16
+ end_loop
17
+ end_loop
18
+ end_loop
19
+ )
20
+ (Declaration senior_level
21
+ %t16 = load_input "regions" :: array
22
+ %t29 = const "senior" :: string
23
+ loop regions id=L5 in %t16 as el=%regions_el_17, idx=%regions_i_18
24
+ %t19 = load_field regions_el_17["offices"] :: any
25
+ loop offices id=L6 in %t19 as el=%offices_el_20, idx=%offices_i_21
26
+ %t22 = load_field offices_el_20["teams"] :: any
27
+ loop teams id=L7 in %t22 as el=%teams_el_23, idx=%teams_i_24
28
+ %t25 = load_field teams_el_23["employees"] :: any
29
+ loop employees id=L8 in %t25 as el=%employees_el_26, idx=%employees_i_27
30
+ %t28 = load_field employees_el_26["level"] :: string
31
+ %t30 = call core.eq(%t28, %t29) :: boolean
32
+ yield %t30
33
+ end_loop
34
+ end_loop
35
+ end_loop
36
+ end_loop
37
+ )
38
+ (Declaration top_team
39
+ %t31 = load_input "regions" :: array
40
+ %t41 = const 0.9 :: float
41
+ loop regions id=L9 in %t31 as el=%regions_el_32, idx=%regions_i_33
42
+ %t34 = load_field regions_el_32["offices"] :: any
43
+ loop offices id=L10 in %t34 as el=%offices_el_35, idx=%offices_i_36
44
+ %t37 = load_field offices_el_35["teams"] :: any
45
+ loop teams id=L11 in %t37 as el=%teams_el_38, idx=%teams_i_39
46
+ %t40 = load_field teams_el_38["performance_score"] :: float
47
+ %t42 = call core.gte(%t40, %t41) :: boolean
48
+ yield %t42
49
+ end_loop
50
+ end_loop
51
+ end_loop
52
+ )
53
+ (Declaration employee_bonus
54
+ %t43 = load_input "regions" :: array
55
+ %t92 = const 0.9 :: float
56
+ %t79 = const 4.5 :: float
57
+ %t86 = const "senior" :: string
58
+ %t61 = const 0.3 :: float
59
+ %t67 = const 0.2 :: float
60
+ %t70 = const 0.05 :: float
61
+ loop regions id=L12 in %t43 as el=%regions_el_44, idx=%regions_i_45
62
+ %t46 = load_field regions_el_44["offices"] :: any
63
+ loop offices id=L13 in %t46 as el=%offices_el_47, idx=%offices_i_48
64
+ %t49 = load_field offices_el_47["teams"] :: any
65
+ loop teams id=L14 in %t49 as el=%teams_el_50, idx=%teams_i_51
66
+ %t52 = load_field teams_el_50["employees"] :: any
67
+ %t91 = load_field teams_el_50["performance_score"] :: float
68
+ %t93 = call core.gte(%t91, %t92) :: boolean
69
+ loop employees id=L15 in %t52 as el=%employees_el_53, idx=%employees_i_54
70
+ %t78 = load_field employees_el_53["rating"] :: float
71
+ %t80 = call core.gte(%t78, %t79) :: boolean
72
+ %t85 = load_field employees_el_53["level"] :: string
73
+ %t87 = call core.eq(%t85, %t86) :: boolean
74
+ %t58 = call core.and(%t87, %t93) :: boolean
75
+ %t59 = call core.and(%t80, %t58) :: boolean
76
+ %t60 = load_field employees_el_53["salary"] :: float
77
+ %t62 = call core.mul(%t60, %t61) :: float
78
+ %t65 = call core.and(%t80, %t93) :: boolean
79
+ %t68 = call core.mul(%t60, %t67) :: float
80
+ %t71 = call core.mul(%t60, %t70) :: float
81
+ %t72 = select %t65, %t68, %t71 :: float
82
+ %t73 = select %t59, %t62, %t72 :: float
83
+ yield %t73
84
+ end_loop
85
+ end_loop
86
+ end_loop
87
+ end_loop
88
+ )
89
+ )
@@ -0,0 +1,89 @@
1
+ (LIR
2
+ (Declaration high_performer
3
+ %t1 = load_input "regions" :: array
4
+ %t14 = const 4.5 :: float
5
+ loop regions id=L1 in %t1 as el=%regions_el_2, idx=%regions_i_3
6
+ %t4 = load_field regions_el_2["offices"] :: any
7
+ loop offices id=L2 in %t4 as el=%offices_el_5, idx=%offices_i_6
8
+ %t7 = load_field offices_el_5["teams"] :: any
9
+ loop teams id=L3 in %t7 as el=%teams_el_8, idx=%teams_i_9
10
+ %t10 = load_field teams_el_8["employees"] :: any
11
+ loop employees id=L4 in %t10 as el=%employees_el_11, idx=%employees_i_12
12
+ %t13 = load_field employees_el_11["rating"] :: float
13
+ %t15 = call core.gte(%t13, %t14) :: boolean
14
+ yield %t15
15
+ end_loop
16
+ end_loop
17
+ end_loop
18
+ end_loop
19
+ )
20
+ (Declaration senior_level
21
+ %t16 = load_input "regions" :: array
22
+ %t29 = const "senior" :: string
23
+ loop regions id=L5 in %t16 as el=%regions_el_17, idx=%regions_i_18
24
+ %t19 = load_field regions_el_17["offices"] :: any
25
+ loop offices id=L6 in %t19 as el=%offices_el_20, idx=%offices_i_21
26
+ %t22 = load_field offices_el_20["teams"] :: any
27
+ loop teams id=L7 in %t22 as el=%teams_el_23, idx=%teams_i_24
28
+ %t25 = load_field teams_el_23["employees"] :: any
29
+ loop employees id=L8 in %t25 as el=%employees_el_26, idx=%employees_i_27
30
+ %t28 = load_field employees_el_26["level"] :: string
31
+ %t30 = call core.eq(%t28, %t29) :: boolean
32
+ yield %t30
33
+ end_loop
34
+ end_loop
35
+ end_loop
36
+ end_loop
37
+ )
38
+ (Declaration top_team
39
+ %t31 = load_input "regions" :: array
40
+ %t41 = const 0.9 :: float
41
+ loop regions id=L9 in %t31 as el=%regions_el_32, idx=%regions_i_33
42
+ %t34 = load_field regions_el_32["offices"] :: any
43
+ loop offices id=L10 in %t34 as el=%offices_el_35, idx=%offices_i_36
44
+ %t37 = load_field offices_el_35["teams"] :: any
45
+ loop teams id=L11 in %t37 as el=%teams_el_38, idx=%teams_i_39
46
+ %t40 = load_field teams_el_38["performance_score"] :: float
47
+ %t42 = call core.gte(%t40, %t41) :: boolean
48
+ yield %t42
49
+ end_loop
50
+ end_loop
51
+ end_loop
52
+ )
53
+ (Declaration employee_bonus
54
+ %t43 = load_input "regions" :: array
55
+ %t92 = const 0.9 :: float
56
+ %t79 = const 4.5 :: float
57
+ %t86 = const "senior" :: string
58
+ %t61 = const 0.3 :: float
59
+ %t67 = const 0.2 :: float
60
+ %t70 = const 0.05 :: float
61
+ loop regions id=L12 in %t43 as el=%regions_el_44, idx=%regions_i_45
62
+ %t46 = load_field regions_el_44["offices"] :: any
63
+ loop offices id=L13 in %t46 as el=%offices_el_47, idx=%offices_i_48
64
+ %t49 = load_field offices_el_47["teams"] :: any
65
+ loop teams id=L14 in %t49 as el=%teams_el_50, idx=%teams_i_51
66
+ %t52 = load_field teams_el_50["employees"] :: any
67
+ %t91 = load_field teams_el_50["performance_score"] :: float
68
+ %t93 = call core.gte(%t91, %t92) :: boolean
69
+ loop employees id=L15 in %t52 as el=%employees_el_53, idx=%employees_i_54
70
+ %t78 = load_field employees_el_53["rating"] :: float
71
+ %t80 = call core.gte(%t78, %t79) :: boolean
72
+ %t85 = load_field employees_el_53["level"] :: string
73
+ %t87 = call core.eq(%t85, %t86) :: boolean
74
+ %t58 = call core.and(%t87, %t93) :: boolean
75
+ %t59 = call core.and(%t80, %t58) :: boolean
76
+ %t60 = load_field employees_el_53["salary"] :: float
77
+ %t62 = call core.mul(%t60, %t61) :: float
78
+ %t65 = call core.and(%t80, %t93) :: boolean
79
+ %t68 = call core.mul(%t60, %t67) :: float
80
+ %t71 = call core.mul(%t60, %t70) :: float
81
+ %t72 = select %t65, %t68, %t71 :: float
82
+ %t73 = select %t59, %t62, %t72 :: float
83
+ yield %t73
84
+ end_loop
85
+ end_loop
86
+ end_loop
87
+ end_loop
88
+ )
89
+ )
@@ -0,0 +1,49 @@
1
+ (NAST
2
+ (TRAIT high_performer
3
+ (Call :"core.gte"
4
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :employees, :employee, :rating])
5
+ (Const 4.5)
6
+ )
7
+ )
8
+ (TRAIT senior_level
9
+ (Call :"core.eq"
10
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :employees, :employee, :level])
11
+ (Const "senior")
12
+ )
13
+ )
14
+ (TRAIT top_team
15
+ (Call :"core.gte"
16
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :performance_score])
17
+ (Const 0.9)
18
+ )
19
+ )
20
+ (VALUE employee_bonus
21
+ (Call :__select__
22
+ (Call :"core.and"
23
+ (Ref high_performer)
24
+ (Call :"core.and"
25
+ (Ref senior_level)
26
+ (Ref top_team)
27
+ )
28
+ )
29
+ (Call :"core.mul"
30
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :employees, :employee, :salary])
31
+ (Const 0.3)
32
+ )
33
+ (Call :__select__
34
+ (Call :"core.and"
35
+ (Ref high_performer)
36
+ (Ref top_team)
37
+ )
38
+ (Call :"core.mul"
39
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :employees, :employee, :salary])
40
+ (Const 0.2)
41
+ )
42
+ (Call :"core.mul"
43
+ (InputRef [:regions, :region, :offices, :office, :teams, :team, :employees, :employee, :salary])
44
+ (Const 0.05)
45
+ )
46
+ )
47
+ )
48
+ )
49
+ )
@@ -0,0 +1,121 @@
1
+ export function _high_performer(input) {
2
+ let out = [];
3
+ let t1 = input["regions"];
4
+ const t14 = 4.5;
5
+ t1.forEach((regions_el_2, regions_i_3) => {
6
+ let out_1 = [];
7
+ let t4 = regions_el_2["offices"];
8
+ t4.forEach((offices_el_5, offices_i_6) => {
9
+ let out_2 = [];
10
+ let t7 = offices_el_5["teams"];
11
+ t7.forEach((teams_el_8, teams_i_9) => {
12
+ let out_3 = [];
13
+ let t10 = teams_el_8["employees"];
14
+ t10.forEach((employees_el_11, employees_i_12) => {
15
+ let t13 = employees_el_11["rating"];
16
+ let t15 = t13 >= t14;
17
+ out_3.push(t15);
18
+ });
19
+ out_2.push(out_3);
20
+ });
21
+ out_1.push(out_2);
22
+ });
23
+ out.push(out_1);
24
+ });
25
+ return out;
26
+ }
27
+
28
+ export function _senior_level(input) {
29
+ let out = [];
30
+ let t16 = input["regions"];
31
+ const t29 = "senior";
32
+ t16.forEach((regions_el_17, regions_i_18) => {
33
+ let out_1 = [];
34
+ let t19 = regions_el_17["offices"];
35
+ t19.forEach((offices_el_20, offices_i_21) => {
36
+ let out_2 = [];
37
+ let t22 = offices_el_20["teams"];
38
+ t22.forEach((teams_el_23, teams_i_24) => {
39
+ let out_3 = [];
40
+ let t25 = teams_el_23["employees"];
41
+ t25.forEach((employees_el_26, employees_i_27) => {
42
+ let t28 = employees_el_26["level"];
43
+ let t30 = t28 == t29;
44
+ out_3.push(t30);
45
+ });
46
+ out_2.push(out_3);
47
+ });
48
+ out_1.push(out_2);
49
+ });
50
+ out.push(out_1);
51
+ });
52
+ return out;
53
+ }
54
+
55
+ export function _top_team(input) {
56
+ let out = [];
57
+ let t31 = input["regions"];
58
+ const t41 = 0.9;
59
+ t31.forEach((regions_el_32, regions_i_33) => {
60
+ let out_1 = [];
61
+ let t34 = regions_el_32["offices"];
62
+ t34.forEach((offices_el_35, offices_i_36) => {
63
+ let out_2 = [];
64
+ let t37 = offices_el_35["teams"];
65
+ t37.forEach((teams_el_38, teams_i_39) => {
66
+ let t40 = teams_el_38["performance_score"];
67
+ let t42 = t40 >= t41;
68
+ out_2.push(t42);
69
+ });
70
+ out_1.push(out_2);
71
+ });
72
+ out.push(out_1);
73
+ });
74
+ return out;
75
+ }
76
+
77
+ export function _employee_bonus(input) {
78
+ let out = [];
79
+ let t43 = input["regions"];
80
+ const t92 = 0.9;
81
+ const t79 = 4.5;
82
+ const t86 = "senior";
83
+ const t61 = 0.3;
84
+ const t67 = 0.2;
85
+ const t70 = 0.05;
86
+ t43.forEach((regions_el_44, regions_i_45) => {
87
+ let out_1 = [];
88
+ let t46 = regions_el_44["offices"];
89
+ t46.forEach((offices_el_47, offices_i_48) => {
90
+ let out_2 = [];
91
+ let t49 = offices_el_47["teams"];
92
+ t49.forEach((teams_el_50, teams_i_51) => {
93
+ let out_3 = [];
94
+ let t52 = teams_el_50["employees"];
95
+ let t91 = teams_el_50["performance_score"];
96
+ let t93 = t91 >= t92;
97
+ t52.forEach((employees_el_53, employees_i_54) => {
98
+ let t78 = employees_el_53["rating"];
99
+ let t80 = t78 >= t79;
100
+ let t85 = employees_el_53["level"];
101
+ let t87 = t85 == t86;
102
+ let t58 = t87 && t93;
103
+ let t59 = t80 && t58;
104
+ let t60 = employees_el_53["salary"];
105
+ let t62 = t60 * t61;
106
+ let t65 = t80 && t93;
107
+ let t68 = t60 * t67;
108
+ let t71 = t60 * t70;
109
+ let t72 = t65 ? t68 : t71;
110
+ let t73 = t59 ? t62 : t72;
111
+ out_3.push(t73);
112
+ });
113
+ out_2.push(out_3);
114
+ });
115
+ out_1.push(out_2);
116
+ });
117
+ out.push(out_1);
118
+ });
119
+ return out;
120
+ }
121
+
@@ -0,0 +1,151 @@
1
+ # Autogenerated by Kumi Codegen
2
+ module Kumi::Compiled::KUMI_c564c8cb0e8f3b1664084790b1d9c36eaf7d0cbbee56b7211f752b8a2bfa8a8d
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 :high_performer then _high_performer
24
+ when :senior_level then _senior_level
25
+ when :top_team then _top_team
26
+ when :employee_bonus then _employee_bonus
27
+ else raise KeyError, "Unknown declaration"
28
+ end
29
+ end
30
+
31
+ def _high_performer(input = @input)
32
+ out = []
33
+ t1 = input["regions"] || input[:regions]
34
+ t14 = 4.5
35
+ t1.each_with_index do |regions_el_2, regions_i_3|
36
+ out_1 = []
37
+ t4 = regions_el_2["offices"] || regions_el_2[:offices]
38
+ t4.each_with_index do |offices_el_5, offices_i_6|
39
+ out_2 = []
40
+ t7 = offices_el_5["teams"] || offices_el_5[:teams]
41
+ t7.each_with_index do |teams_el_8, teams_i_9|
42
+ out_3 = []
43
+ t10 = teams_el_8["employees"] || teams_el_8[:employees]
44
+ t10.each_with_index do |employees_el_11, employees_i_12|
45
+ t13 = employees_el_11["rating"] || employees_el_11[:rating]
46
+ t15 = t13 >= t14
47
+ out_3 << t15
48
+ end
49
+ out_2 << out_3
50
+ end
51
+ out_1 << out_2
52
+ end
53
+ out << out_1
54
+ end
55
+ out
56
+ end
57
+
58
+ def _senior_level(input = @input)
59
+ out = []
60
+ t16 = input["regions"] || input[:regions]
61
+ t29 = "senior"
62
+ t16.each_with_index do |regions_el_17, regions_i_18|
63
+ out_1 = []
64
+ t19 = regions_el_17["offices"] || regions_el_17[:offices]
65
+ t19.each_with_index do |offices_el_20, offices_i_21|
66
+ out_2 = []
67
+ t22 = offices_el_20["teams"] || offices_el_20[:teams]
68
+ t22.each_with_index do |teams_el_23, teams_i_24|
69
+ out_3 = []
70
+ t25 = teams_el_23["employees"] || teams_el_23[:employees]
71
+ t25.each_with_index do |employees_el_26, employees_i_27|
72
+ t28 = employees_el_26["level"] || employees_el_26[:level]
73
+ t30 = t28 == t29
74
+ out_3 << t30
75
+ end
76
+ out_2 << out_3
77
+ end
78
+ out_1 << out_2
79
+ end
80
+ out << out_1
81
+ end
82
+ out
83
+ end
84
+
85
+ def _top_team(input = @input)
86
+ out = []
87
+ t31 = input["regions"] || input[:regions]
88
+ t41 = 0.9
89
+ t31.each_with_index do |regions_el_32, regions_i_33|
90
+ out_1 = []
91
+ t34 = regions_el_32["offices"] || regions_el_32[:offices]
92
+ t34.each_with_index do |offices_el_35, offices_i_36|
93
+ out_2 = []
94
+ t37 = offices_el_35["teams"] || offices_el_35[:teams]
95
+ t37.each_with_index do |teams_el_38, teams_i_39|
96
+ t40 = teams_el_38["performance_score"] || teams_el_38[:performance_score]
97
+ t42 = t40 >= t41
98
+ out_2 << t42
99
+ end
100
+ out_1 << out_2
101
+ end
102
+ out << out_1
103
+ end
104
+ out
105
+ end
106
+
107
+ def _employee_bonus(input = @input)
108
+ out = []
109
+ t43 = input["regions"] || input[:regions]
110
+ t92 = 0.9
111
+ t79 = 4.5
112
+ t86 = "senior"
113
+ t61 = 0.3
114
+ t67 = 0.2
115
+ t70 = 0.05
116
+ t43.each_with_index do |regions_el_44, regions_i_45|
117
+ out_1 = []
118
+ t46 = regions_el_44["offices"] || regions_el_44[:offices]
119
+ t46.each_with_index do |offices_el_47, offices_i_48|
120
+ out_2 = []
121
+ t49 = offices_el_47["teams"] || offices_el_47[:teams]
122
+ t49.each_with_index do |teams_el_50, teams_i_51|
123
+ out_3 = []
124
+ t52 = teams_el_50["employees"] || teams_el_50[:employees]
125
+ t91 = teams_el_50["performance_score"] || teams_el_50[:performance_score]
126
+ t93 = t91 >= t92
127
+ t52.each_with_index do |employees_el_53, employees_i_54|
128
+ t78 = employees_el_53["rating"] || employees_el_53[:rating]
129
+ t80 = t78 >= t79
130
+ t85 = employees_el_53["level"] || employees_el_53[:level]
131
+ t87 = t85 == t86
132
+ t58 = t87 && t93
133
+ t59 = t80 && t58
134
+ t60 = employees_el_53["salary"] || employees_el_53[:salary]
135
+ t62 = t60 * t61
136
+ t65 = t80 && t93
137
+ t68 = t60 * t67
138
+ t71 = t60 * t70
139
+ t72 = t65 ? t68 : t71
140
+ t73 = t59 ? t62 : t72
141
+ out_3 << t73
142
+ end
143
+ out_2 << out_3
144
+ end
145
+ out_1 << out_2
146
+ end
147
+ out << out_1
148
+ end
149
+ out
150
+ end
151
+ end
@@ -0,0 +1,49 @@
1
+ (SNAST
2
+ (TRAIT high_performer
3
+ (Call :core.gte
4
+ (InputRef regions.region.offices.office.teams.team.employees.employee.rating key_chain=[]) :: [regions, offices, teams, employees] -> float
5
+ (Const 4.5) :: [] -> float
6
+ ) :: [regions, offices, teams, employees] -> boolean
7
+ ) :: [regions, offices, teams, employees] -> boolean
8
+ (TRAIT senior_level
9
+ (Call :core.eq
10
+ (InputRef regions.region.offices.office.teams.team.employees.employee.level key_chain=[]) :: [regions, offices, teams, employees] -> string
11
+ (Const "senior") :: [] -> string
12
+ ) :: [regions, offices, teams, employees] -> boolean
13
+ ) :: [regions, offices, teams, employees] -> boolean
14
+ (TRAIT top_team
15
+ (Call :core.gte
16
+ (InputRef regions.region.offices.office.teams.team.performance_score key_chain=[]) :: [regions, offices, teams] -> float
17
+ (Const 0.9) :: [] -> float
18
+ ) :: [regions, offices, teams] -> boolean
19
+ ) :: [regions, offices, teams] -> boolean
20
+ (VALUE employee_bonus
21
+ (Select
22
+ (Call :core.and
23
+ (Ref high_performer) :: [regions, offices, teams, employees] -> boolean
24
+ (Call :core.and
25
+ (Ref senior_level) :: [regions, offices, teams, employees] -> boolean
26
+ (Ref top_team) :: [regions, offices, teams] -> boolean
27
+ ) :: [regions, offices, teams, employees] -> boolean
28
+ ) :: [regions, offices, teams, employees] -> boolean
29
+ (Call :core.mul
30
+ (InputRef regions.region.offices.office.teams.team.employees.employee.salary key_chain=[]) :: [regions, offices, teams, employees] -> float
31
+ (Const 0.3) :: [] -> float
32
+ ) :: [regions, offices, teams, employees] -> float
33
+ (Select
34
+ (Call :core.and
35
+ (Ref high_performer) :: [regions, offices, teams, employees] -> boolean
36
+ (Ref top_team) :: [regions, offices, teams] -> boolean
37
+ ) :: [regions, offices, teams, employees] -> boolean
38
+ (Call :core.mul
39
+ (InputRef regions.region.offices.office.teams.team.employees.employee.salary key_chain=[]) :: [regions, offices, teams, employees] -> float
40
+ (Const 0.2) :: [] -> float
41
+ ) :: [regions, offices, teams, employees] -> float
42
+ (Call :core.mul
43
+ (InputRef regions.region.offices.office.teams.team.employees.employee.salary key_chain=[]) :: [regions, offices, teams, employees] -> float
44
+ (Const 0.05) :: [] -> float
45
+ ) :: [regions, offices, teams, employees] -> float
46
+ ) :: [regions, offices, teams, employees] -> float
47
+ ) :: [regions, offices, teams, employees] -> float
48
+ ) :: [regions, offices, teams, employees] -> float
49
+ )
@@ -0,0 +1,34 @@
1
+ {
2
+ "high_performer": [
3
+ [
4
+ [
5
+ [true, false],
6
+ [true, false]
7
+ ]
8
+ ]
9
+ ],
10
+ "senior_level": [
11
+ [
12
+ [
13
+ [true, false],
14
+ [true, false]
15
+ ]
16
+ ]
17
+ ],
18
+ "top_team": [
19
+ [
20
+ [
21
+ true,
22
+ false
23
+ ]
24
+ ]
25
+ ],
26
+ "employee_bonus": [
27
+ [
28
+ [
29
+ [36000.0, 4250.0],
30
+ [4750.0, 3500.0]
31
+ ]
32
+ ]
33
+ ]
34
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "regions": [
3
+ {
4
+ "offices": [
5
+ {
6
+ "teams": [
7
+ {
8
+ "performance_score": 0.95,
9
+ "employees": [
10
+ {"salary": 120000.0, "rating": 4.8, "level": "senior"},
11
+ {"salary": 85000.0, "rating": 4.2, "level": "mid"}
12
+ ]
13
+ },
14
+ {
15
+ "performance_score": 0.75,
16
+ "employees": [
17
+ {"salary": 95000.0, "rating": 4.6, "level": "senior"},
18
+ {"salary": 70000.0, "rating": 3.9, "level": "junior"}
19
+ ]
20
+ }
21
+ ]
22
+ }
23
+ ]
24
+ }
25
+ ]
26
+ }
@@ -0,0 +1,38 @@
1
+ schema do
2
+ input do
3
+ array :regions do
4
+ hash :region do
5
+ array :offices do
6
+ hash :office do
7
+ array :teams do
8
+ hash :team do
9
+ float :performance_score
10
+ array :employees do
11
+ hash :employee do
12
+ float :salary
13
+ float :rating
14
+ string :level
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ # Employee-level traits
26
+ trait :high_performer, input.regions.region.offices.office.teams.team.employees.employee.rating >= 4.5
27
+ trait :senior_level, input.regions.region.offices.office.teams.team.employees.employee.level == "senior"
28
+
29
+ # Team-level trait (parent dimension)
30
+ trait :top_team, input.regions.region.offices.office.teams.team.performance_score >= 0.9
31
+
32
+ # This should work: team-level condition broadcasts to employee-level
33
+ value :employee_bonus do
34
+ on high_performer, senior_level, top_team, input.regions.region.offices.office.teams.team.employees.employee.salary * 0.30
35
+ on high_performer, top_team, input.regions.region.offices.office.teams.team.employees.employee.salary * 0.20
36
+ base input.regions.region.offices.office.teams.team.employees.employee.salary * 0.05
37
+ end
38
+ end
@@ -0,0 +1,46 @@
1
+ (Root
2
+ inputs: [
3
+ (InputDeclaration :config :hash
4
+ [
5
+ (InputDeclaration :app_name :string)
6
+ (InputDeclaration :feature_flags :array
7
+ [
8
+ (InputDeclaration :flag_name :string)
9
+ ]
10
+ )
11
+ (InputDeclaration :servers :array
12
+ [
13
+ (InputDeclaration :server :hash
14
+ [
15
+ (InputDeclaration :hostname :string)
16
+ (InputDeclaration :port :integer)
17
+ ]
18
+ )
19
+ ]
20
+ )
21
+ ]
22
+ )
23
+ ]
24
+ values: [
25
+ (ValueDeclaration :app_name
26
+ (InputElementReference config.app_name)
27
+ )
28
+ (ValueDeclaration :all_flags
29
+ (InputElementReference config.feature_flags.flag_name)
30
+ )
31
+ (ValueDeclaration :server_hostnames
32
+ (InputElementReference config.servers.server.hostname)
33
+ )
34
+ (ValueDeclaration :server_count
35
+ (CallExpression :array_size
36
+ (InputElementReference config.servers)
37
+ )
38
+ )
39
+ (ValueDeclaration :total_ports
40
+ (CallExpression :sum
41
+ (InputElementReference config.servers.server.port)
42
+ )
43
+ )
44
+ ]
45
+ traits: []
46
+ )