kumi 0.0.31 → 0.0.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.codex +0 -0
- data/CHANGELOG.md +39 -1
- data/README.md +50 -106
- data/Rakefile +2 -0
- data/data/functions/agg/numeric.yaml +6 -0
- data/data/functions/core/arithmetic.yaml +26 -0
- data/data/kernels/javascript/agg/numeric.yaml +8 -4
- data/data/kernels/javascript/agg/string.yaml +4 -1
- data/data/kernels/javascript/core/arithmetic.yaml +8 -0
- data/data/kernels/ruby/agg/numeric.yaml +6 -2
- data/data/kernels/ruby/agg/string.yaml +4 -1
- data/data/kernels/ruby/core/arithmetic.yaml +12 -2
- data/docs/AGENTS.md +60 -0
- data/docs/ARCHITECTURE.md +114 -250
- data/docs/DEVELOPMENT.md +13 -0
- data/docs/GOLDEN_TESTS.md +88 -161
- data/docs/RELEASING.md +52 -0
- data/docs/SCHEMA_IMPORTS.md +155 -0
- data/docs/SYNTAX.md +48 -0
- data/docs/UNSAT_DETECTION.md +2 -1
- data/golden/array_element/expected/dfir.txt +5 -0
- data/golden/array_element/expected/dfir_optimized.txt +5 -0
- data/golden/array_element/expected/loopir.txt +11 -0
- data/golden/array_element/expected/schema_javascript.mjs +13 -10
- data/golden/array_element/expected/schema_ruby.rb +11 -36
- data/golden/array_element/expected/vecir.txt +5 -0
- data/golden/array_index/expected/dfir.txt +25 -0
- data/golden/array_index/expected/dfir_optimized.txt +27 -0
- data/golden/array_index/expected/loopir.txt +44 -0
- data/golden/array_index/expected/nast.txt +6 -6
- data/golden/array_index/expected/schema_javascript.mjs +53 -36
- data/golden/array_index/expected/schema_ruby.rb +41 -58
- data/golden/array_index/expected/snast.txt +2 -2
- data/golden/array_index/expected/vecir.txt +27 -0
- data/golden/array_operations/expected/dfir.txt +36 -0
- data/golden/array_operations/expected/dfir_optimized.txt +36 -0
- data/golden/array_operations/expected/loopir.txt +45 -0
- data/golden/array_operations/expected/schema_javascript.mjs +50 -45
- data/golden/array_operations/expected/schema_ruby.rb +46 -75
- data/golden/array_operations/expected/vecir.txt +36 -0
- data/golden/cascade_logic/expected/dfir.txt +21 -0
- data/golden/cascade_logic/expected/dfir_optimized.txt +22 -0
- data/golden/cascade_logic/expected/loopir.txt +22 -0
- data/golden/cascade_logic/expected/schema_javascript.mjs +18 -18
- data/golden/cascade_logic/expected/schema_ruby.rb +25 -49
- data/golden/cascade_logic/expected/vecir.txt +22 -0
- data/golden/chained_fusion/expected/dfir.txt +53 -0
- data/golden/chained_fusion/expected/dfir_optimized.txt +75 -0
- data/golden/chained_fusion/expected/loopir.txt +95 -0
- data/golden/chained_fusion/expected/schema_javascript.mjs +105 -101
- data/golden/chained_fusion/expected/schema_ruby.rb +93 -128
- data/golden/chained_fusion/expected/vecir.txt +75 -0
- data/golden/decimal_explicit/expected/dfir.txt +18 -0
- data/golden/decimal_explicit/expected/dfir_optimized.txt +28 -0
- data/golden/decimal_explicit/expected/loopir.txt +28 -0
- data/golden/decimal_explicit/expected/schema_javascript.mjs +31 -19
- data/golden/decimal_explicit/expected/schema_ruby.rb +34 -46
- data/golden/decimal_explicit/expected/vecir.txt +28 -0
- data/golden/element_arrays/expected/dfir.txt +42 -0
- data/golden/element_arrays/expected/dfir_optimized.txt +50 -0
- data/golden/element_arrays/expected/loopir.txt +92 -0
- data/golden/element_arrays/expected/schema_javascript.mjs +107 -85
- data/golden/element_arrays/expected/schema_ruby.rb +85 -111
- data/golden/element_arrays/expected/snast.txt +6 -6
- data/golden/element_arrays/expected/vecir.txt +50 -0
- data/golden/empty_and_null_inputs/expected/dfir.txt +14 -0
- data/golden/empty_and_null_inputs/expected/dfir_optimized.txt +25 -0
- data/golden/empty_and_null_inputs/expected/loopir.txt +43 -0
- data/golden/empty_and_null_inputs/expected/schema_javascript.mjs +49 -38
- data/golden/empty_and_null_inputs/expected/schema_ruby.rb +41 -66
- data/golden/empty_and_null_inputs/expected/vecir.txt +25 -0
- data/golden/example_xpto/expected/ast.txt +23 -0
- data/golden/example_xpto/expected/dfir.txt +10 -0
- data/golden/example_xpto/expected/dfir_optimized.txt +10 -0
- data/golden/example_xpto/expected/input_plan.txt +1 -0
- data/golden/example_xpto/expected/loopir.txt +10 -0
- data/golden/example_xpto/expected/nast.txt +17 -0
- data/golden/example_xpto/expected/schema_javascript.mjs +16 -0
- data/golden/example_xpto/expected/schema_ruby.rb +18 -0
- data/golden/example_xpto/expected/snast.txt +17 -0
- data/golden/example_xpto/expected/vecir.txt +10 -0
- data/golden/example_xpto/expected.json +4 -0
- data/golden/example_xpto/input.json +3 -0
- data/golden/example_xpto/schema.kumi +8 -0
- data/golden/function_overload/expected/dfir.txt +10 -0
- data/golden/function_overload/expected/dfir_optimized.txt +12 -0
- data/golden/function_overload/expected/loopir.txt +12 -0
- data/golden/function_overload/expected/schema_javascript.mjs +17 -8
- data/golden/function_overload/expected/schema_ruby.rb +16 -32
- data/golden/function_overload/expected/snast.txt +1 -1
- data/golden/function_overload/expected/vecir.txt +12 -0
- data/golden/game_of_life/expected/dfir.txt +69 -0
- data/golden/game_of_life/expected/dfir_optimized.txt +207 -0
- data/golden/game_of_life/expected/loopir.txt +694 -0
- data/golden/game_of_life/expected/schema_javascript.mjs +841 -97
- data/golden/game_of_life/expected/schema_ruby.rb +792 -115
- data/golden/game_of_life/expected/vecir.txt +207 -0
- data/golden/hash_keys/expected/dfir.txt +14 -0
- data/golden/hash_keys/expected/dfir_optimized.txt +14 -0
- data/golden/hash_keys/expected/loopir.txt +14 -0
- data/golden/hash_keys/expected/schema_javascript.mjs +13 -30
- data/golden/hash_keys/expected/schema_ruby.rb +16 -58
- data/golden/hash_keys/expected/vecir.txt +14 -0
- data/golden/hash_value/expected/dfir.txt +21 -0
- data/golden/hash_value/expected/dfir_optimized.txt +25 -0
- data/golden/hash_value/expected/loopir.txt +31 -0
- data/golden/hash_value/expected/schema_javascript.mjs +34 -37
- data/golden/hash_value/expected/schema_ruby.rb +32 -65
- data/golden/hash_value/expected/vecir.txt +25 -0
- data/golden/hierarchical_complex/expected/dfir.txt +86 -0
- data/golden/hierarchical_complex/expected/dfir_optimized.txt +88 -0
- data/golden/hierarchical_complex/expected/loopir.txt +129 -0
- data/golden/hierarchical_complex/expected/schema_javascript.mjs +145 -109
- data/golden/hierarchical_complex/expected/schema_ruby.rb +119 -127
- data/golden/hierarchical_complex/expected/vecir.txt +88 -0
- data/golden/inline_rename_scope_leak/expected/dfir.txt +19 -0
- data/golden/inline_rename_scope_leak/expected/dfir_optimized.txt +27 -0
- data/golden/inline_rename_scope_leak/expected/loopir.txt +35 -0
- data/golden/inline_rename_scope_leak/expected/schema_javascript.mjs +39 -39
- data/golden/inline_rename_scope_leak/expected/schema_ruby.rb +36 -69
- data/golden/inline_rename_scope_leak/expected/vecir.txt +23 -0
- data/golden/input_reference/expected/dfir.txt +22 -0
- data/golden/input_reference/expected/dfir_optimized.txt +22 -0
- data/golden/input_reference/expected/loopir.txt +33 -0
- data/golden/input_reference/expected/schema_javascript.mjs +36 -30
- data/golden/input_reference/expected/schema_ruby.rb +36 -60
- data/golden/input_reference/expected/snast.txt +1 -1
- data/golden/input_reference/expected/vecir.txt +22 -0
- data/golden/interleaved_fusion/expected/dfir.txt +35 -0
- data/golden/interleaved_fusion/expected/dfir_optimized.txt +60 -0
- data/golden/interleaved_fusion/expected/loopir.txt +74 -0
- data/golden/interleaved_fusion/expected/schema_javascript.mjs +82 -73
- data/golden/interleaved_fusion/expected/schema_ruby.rb +70 -104
- data/golden/interleaved_fusion/expected/vecir.txt +60 -0
- data/golden/let_inline/expected/dfir.txt +16 -0
- data/golden/let_inline/expected/dfir_optimized.txt +20 -0
- data/golden/let_inline/expected/loopir.txt +20 -0
- data/golden/let_inline/expected/schema_javascript.mjs +28 -7
- data/golden/let_inline/expected/schema_ruby.rb +25 -28
- data/golden/let_inline/expected/vecir.txt +20 -0
- data/golden/loop_fusion/expected/dfir.txt +29 -0
- data/golden/loop_fusion/expected/dfir_optimized.txt +47 -0
- data/golden/loop_fusion/expected/loopir.txt +55 -0
- data/golden/loop_fusion/expected/schema_javascript.mjs +61 -55
- data/golden/loop_fusion/expected/schema_ruby.rb +53 -84
- data/golden/loop_fusion/expected/vecir.txt +47 -0
- data/golden/min_max_empty_arrays/expected/ast.txt +58 -0
- data/golden/min_max_empty_arrays/expected/dfir.txt +27 -0
- data/golden/min_max_empty_arrays/expected/dfir_optimized.txt +37 -0
- data/golden/min_max_empty_arrays/expected/input_plan.txt +15 -0
- data/golden/min_max_empty_arrays/expected/loopir.txt +67 -0
- data/golden/min_max_empty_arrays/expected/nast.txt +27 -0
- data/golden/min_max_empty_arrays/expected/schema_javascript.mjs +92 -0
- data/golden/min_max_empty_arrays/expected/schema_ruby.rb +90 -0
- data/golden/min_max_empty_arrays/expected/snast.txt +27 -0
- data/golden/min_max_empty_arrays/expected/vecir.txt +37 -0
- data/golden/min_max_empty_arrays/expected.json +7 -0
- data/golden/min_max_empty_arrays/input.json +12 -0
- data/golden/min_max_empty_arrays/schema.kumi +24 -0
- data/golden/min_reduce_scope/expected/dfir.txt +35 -0
- data/golden/min_reduce_scope/expected/dfir_optimized.txt +37 -0
- data/golden/min_reduce_scope/expected/loopir.txt +58 -0
- data/golden/min_reduce_scope/expected/schema_javascript.mjs +66 -54
- data/golden/min_reduce_scope/expected/schema_ruby.rb +55 -82
- data/golden/min_reduce_scope/expected/vecir.txt +37 -0
- data/golden/mixed_dimensions/expected/dfir.txt +23 -0
- data/golden/mixed_dimensions/expected/dfir_optimized.txt +26 -0
- data/golden/mixed_dimensions/expected/loopir.txt +44 -0
- data/golden/mixed_dimensions/expected/schema_javascript.mjs +50 -41
- data/golden/mixed_dimensions/expected/schema_ruby.rb +43 -69
- data/golden/mixed_dimensions/expected/vecir.txt +28 -0
- data/golden/multi_loop_reduction/expected/ast.txt +39 -0
- data/golden/multi_loop_reduction/expected/dfir.txt +23 -0
- data/golden/multi_loop_reduction/expected/dfir_optimized.txt +25 -0
- data/golden/multi_loop_reduction/expected/input_plan.txt +5 -0
- data/golden/multi_loop_reduction/expected/loopir.txt +37 -0
- data/golden/multi_loop_reduction/expected/nast.txt +25 -0
- data/golden/multi_loop_reduction/expected/schema_javascript.mjs +50 -0
- data/golden/multi_loop_reduction/expected/schema_ruby.rb +48 -0
- data/golden/multi_loop_reduction/expected/snast.txt +25 -0
- data/golden/multi_loop_reduction/expected/vecir.txt +25 -0
- data/golden/multi_loop_reduction/expected.json +5 -0
- data/golden/multi_loop_reduction/input.json +7 -0
- data/golden/multi_loop_reduction/schema.kumi +20 -0
- data/golden/multirank_hoisting/expected/dfir.txt +40 -0
- data/golden/multirank_hoisting/expected/dfir_optimized.txt +109 -0
- data/golden/multirank_hoisting/expected/loopir.txt +164 -0
- data/golden/multirank_hoisting/expected/schema_javascript.mjs +183 -108
- data/golden/multirank_hoisting/expected/schema_ruby.rb +157 -135
- data/golden/multirank_hoisting/expected/vecir.txt +109 -0
- data/golden/nested_hash/expected/dfir.txt +6 -0
- data/golden/nested_hash/expected/dfir_optimized.txt +6 -0
- data/golden/nested_hash/expected/loopir.txt +6 -0
- data/golden/nested_hash/expected/schema_javascript.mjs +5 -5
- data/golden/nested_hash/expected/schema_ruby.rb +8 -32
- data/golden/nested_hash/expected/vecir.txt +6 -0
- data/golden/reduction_broadcast/expected/dfir.txt +27 -0
- data/golden/reduction_broadcast/expected/dfir_optimized.txt +44 -0
- data/golden/reduction_broadcast/expected/loopir.txt +68 -0
- data/golden/reduction_broadcast/expected/schema_javascript.mjs +77 -62
- data/golden/reduction_broadcast/expected/schema_ruby.rb +64 -92
- data/golden/reduction_broadcast/expected/vecir.txt +44 -0
- data/golden/roll/expected/dfir.txt +16 -0
- data/golden/roll/expected/dfir_optimized.txt +16 -0
- data/golden/roll/expected/loopir.txt +40 -0
- data/golden/roll/expected/schema_javascript.mjs +44 -53
- data/golden/roll/expected/schema_ruby.rb +41 -82
- data/golden/roll/expected/vecir.txt +16 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/ast.txt +26 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/dfir.txt +8 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/dfir_optimized.txt +13 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/input_plan.txt +5 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/loopir.txt +19 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/nast.txt +12 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/schema_javascript.mjs +27 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/schema_ruby.rb +27 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/snast.txt +12 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/vecir.txt +13 -0
- data/golden/schema_imports_broadcasting_with_imports/expected.json +4 -0
- data/golden/schema_imports_broadcasting_with_imports/input.json +7 -0
- data/golden/schema_imports_broadcasting_with_imports/schema.kumi +14 -0
- data/golden/schema_imports_complex_order_calc/expected/ast.txt +82 -0
- data/golden/schema_imports_complex_order_calc/expected/dfir.txt +41 -0
- data/golden/schema_imports_complex_order_calc/expected/dfir_optimized.txt +168 -0
- data/golden/schema_imports_complex_order_calc/expected/input_plan.txt +16 -0
- data/golden/schema_imports_complex_order_calc/expected/loopir.txt +202 -0
- data/golden/schema_imports_complex_order_calc/expected/nast.txt +56 -0
- data/golden/schema_imports_complex_order_calc/expected/schema_javascript.mjs +251 -0
- data/golden/schema_imports_complex_order_calc/expected/schema_ruby.rb +234 -0
- data/golden/schema_imports_complex_order_calc/expected/snast.txt +56 -0
- data/golden/schema_imports_complex_order_calc/expected/vecir.txt +168 -0
- data/golden/schema_imports_complex_order_calc/expected.json +12 -0
- data/golden/schema_imports_complex_order_calc/input.json +20 -0
- data/golden/schema_imports_complex_order_calc/schema.kumi +33 -0
- data/golden/schema_imports_composed_order/expected/ast.txt +33 -0
- data/golden/schema_imports_composed_order/expected/dfir.txt +15 -0
- data/golden/schema_imports_composed_order/expected/dfir_optimized.txt +29 -0
- data/golden/schema_imports_composed_order/expected/input_plan.txt +3 -0
- data/golden/schema_imports_composed_order/expected/loopir.txt +29 -0
- data/golden/schema_imports_composed_order/expected/nast.txt +25 -0
- data/golden/schema_imports_composed_order/expected/schema_javascript.mjs +41 -0
- data/golden/schema_imports_composed_order/expected/schema_ruby.rb +43 -0
- data/golden/schema_imports_composed_order/expected/snast.txt +25 -0
- data/golden/schema_imports_composed_order/expected/vecir.txt +29 -0
- data/golden/schema_imports_composed_order/expected.json +6 -0
- data/golden/schema_imports_composed_order/input.json +5 -0
- data/golden/schema_imports_composed_order/schema.kumi +15 -0
- data/golden/schema_imports_discount_with_tax/expected/ast.txt +37 -0
- data/golden/schema_imports_discount_with_tax/expected/dfir.txt +18 -0
- data/golden/schema_imports_discount_with_tax/expected/dfir_optimized.txt +31 -0
- data/golden/schema_imports_discount_with_tax/expected/input_plan.txt +2 -0
- data/golden/schema_imports_discount_with_tax/expected/loopir.txt +31 -0
- data/golden/schema_imports_discount_with_tax/expected/nast.txt +30 -0
- data/golden/schema_imports_discount_with_tax/expected/schema_javascript.mjs +46 -0
- data/golden/schema_imports_discount_with_tax/expected/schema_ruby.rb +48 -0
- data/golden/schema_imports_discount_with_tax/expected/snast.txt +30 -0
- data/golden/schema_imports_discount_with_tax/expected/vecir.txt +31 -0
- data/golden/schema_imports_discount_with_tax/expected.json +7 -0
- data/golden/schema_imports_discount_with_tax/input.json +4 -0
- data/golden/schema_imports_discount_with_tax/schema.kumi +15 -0
- data/golden/schema_imports_line_items/expected/ast.txt +35 -0
- data/golden/schema_imports_line_items/expected/dfir.txt +11 -0
- data/golden/schema_imports_line_items/expected/dfir_optimized.txt +26 -0
- data/golden/schema_imports_line_items/expected/input_plan.txt +8 -0
- data/golden/schema_imports_line_items/expected/loopir.txt +35 -0
- data/golden/schema_imports_line_items/expected/nast.txt +19 -0
- data/golden/schema_imports_line_items/expected/schema_javascript.mjs +47 -0
- data/golden/schema_imports_line_items/expected/schema_ruby.rb +46 -0
- data/golden/schema_imports_line_items/expected/snast.txt +19 -0
- data/golden/schema_imports_line_items/expected/vecir.txt +26 -0
- data/golden/schema_imports_line_items/expected.json +5 -0
- data/golden/schema_imports_line_items/input.json +13 -0
- data/golden/schema_imports_line_items/schema.kumi +17 -0
- data/golden/schema_imports_multiple/expected/ast.txt +35 -0
- data/golden/schema_imports_multiple/expected/dfir.txt +17 -0
- data/golden/schema_imports_multiple/expected/dfir_optimized.txt +34 -0
- data/golden/schema_imports_multiple/expected/input_plan.txt +2 -0
- data/golden/schema_imports_multiple/expected/loopir.txt +34 -0
- data/golden/schema_imports_multiple/expected/nast.txt +28 -0
- data/golden/schema_imports_multiple/expected/schema_javascript.mjs +49 -0
- data/golden/schema_imports_multiple/expected/schema_ruby.rb +51 -0
- data/golden/schema_imports_multiple/expected/snast.txt +28 -0
- data/golden/schema_imports_multiple/expected/vecir.txt +34 -0
- data/golden/schema_imports_multiple/expected.json +7 -0
- data/golden/schema_imports_multiple/input.json +4 -0
- data/golden/schema_imports_multiple/schema.kumi +15 -0
- data/golden/schema_imports_nested_expressions/expected/ast.txt +31 -0
- data/golden/schema_imports_nested_expressions/expected/dfir.txt +14 -0
- data/golden/schema_imports_nested_expressions/expected/dfir_optimized.txt +24 -0
- data/golden/schema_imports_nested_expressions/expected/input_plan.txt +3 -0
- data/golden/schema_imports_nested_expressions/expected/loopir.txt +24 -0
- data/golden/schema_imports_nested_expressions/expected/nast.txt +23 -0
- data/golden/schema_imports_nested_expressions/expected/schema_javascript.mjs +33 -0
- data/golden/schema_imports_nested_expressions/expected/schema_ruby.rb +35 -0
- data/golden/schema_imports_nested_expressions/expected/snast.txt +23 -0
- data/golden/schema_imports_nested_expressions/expected/vecir.txt +24 -0
- data/golden/schema_imports_nested_expressions/expected.json +5 -0
- data/golden/schema_imports_nested_expressions/input.json +5 -0
- data/golden/schema_imports_nested_expressions/schema.kumi +13 -0
- data/golden/schema_imports_nested_with_reductions/expected/ast.txt +47 -0
- data/golden/schema_imports_nested_with_reductions/expected/dfir.txt +15 -0
- data/golden/schema_imports_nested_with_reductions/expected/dfir_optimized.txt +44 -0
- data/golden/schema_imports_nested_with_reductions/expected/input_plan.txt +12 -0
- data/golden/schema_imports_nested_with_reductions/expected/loopir.txt +68 -0
- data/golden/schema_imports_nested_with_reductions/expected/nast.txt +23 -0
- data/golden/schema_imports_nested_with_reductions/expected/schema_javascript.mjs +88 -0
- data/golden/schema_imports_nested_with_reductions/expected/schema_ruby.rb +82 -0
- data/golden/schema_imports_nested_with_reductions/expected/snast.txt +23 -0
- data/golden/schema_imports_nested_with_reductions/expected/vecir.txt +44 -0
- data/golden/schema_imports_nested_with_reductions/expected.json +6 -0
- data/golden/schema_imports_nested_with_reductions/input.json +16 -0
- data/golden/schema_imports_nested_with_reductions/schema.kumi +23 -0
- data/golden/schema_imports_with_imports/expected/ast.txt +19 -0
- data/golden/schema_imports_with_imports/expected/dfir.txt +7 -0
- data/golden/schema_imports_with_imports/expected/dfir_optimized.txt +9 -0
- data/golden/schema_imports_with_imports/expected/input_plan.txt +1 -0
- data/golden/schema_imports_with_imports/expected/loopir.txt +9 -0
- data/golden/schema_imports_with_imports/expected/nast.txt +13 -0
- data/golden/schema_imports_with_imports/expected/schema_javascript.mjs +15 -0
- data/golden/schema_imports_with_imports/expected/schema_ruby.rb +17 -0
- data/golden/schema_imports_with_imports/expected/snast.txt +13 -0
- data/golden/schema_imports_with_imports/expected/vecir.txt +9 -0
- data/golden/schema_imports_with_imports/expected.json +4 -0
- data/golden/schema_imports_with_imports/input.json +3 -0
- data/golden/schema_imports_with_imports/schema.kumi +10 -0
- data/golden/shift/expected/dfir.txt +24 -0
- data/golden/shift/expected/dfir_optimized.txt +24 -0
- data/golden/shift/expected/loopir.txt +64 -0
- data/golden/shift/expected/schema_javascript.mjs +72 -88
- data/golden/shift/expected/schema_ruby.rb +67 -119
- data/golden/shift/expected/vecir.txt +24 -0
- data/golden/shift_2d/expected/dfir.txt +60 -0
- data/golden/shift_2d/expected/dfir_optimized.txt +60 -0
- data/golden/shift_2d/expected/loopir.txt +176 -0
- data/golden/shift_2d/expected/schema_javascript.mjs +204 -284
- data/golden/shift_2d/expected/schema_ruby.rb +169 -309
- data/golden/shift_2d/expected/vecir.txt +60 -0
- data/golden/simple_math/expected/dfir.txt +21 -0
- data/golden/simple_math/expected/dfir_optimized.txt +21 -0
- data/golden/simple_math/expected/loopir.txt +21 -0
- data/golden/simple_math/expected/schema_javascript.mjs +17 -17
- data/golden/simple_math/expected/schema_ruby.rb +24 -48
- data/golden/simple_math/expected/vecir.txt +21 -0
- data/golden/streaming_basics/expected/dfir.txt +43 -0
- data/golden/streaming_basics/expected/dfir_optimized.txt +69 -0
- data/golden/streaming_basics/expected/loopir.txt +76 -0
- data/golden/streaming_basics/expected/schema_javascript.mjs +83 -73
- data/golden/streaming_basics/expected/schema_ruby.rb +77 -105
- data/golden/streaming_basics/expected/vecir.txt +69 -0
- data/golden/tuples/expected/dfir.txt +28 -0
- data/golden/tuples/expected/dfir_optimized.txt +42 -0
- data/golden/tuples/expected/loopir.txt +42 -0
- data/golden/tuples/expected/schema_javascript.mjs +41 -35
- data/golden/tuples/expected/schema_ruby.rb +56 -74
- data/golden/tuples/expected/vecir.txt +42 -0
- data/golden/tuples_and_arrays/expected/dfir.txt +26 -0
- data/golden/tuples_and_arrays/expected/dfir_optimized.txt +37 -0
- data/golden/tuples_and_arrays/expected/loopir.txt +45 -0
- data/golden/tuples_and_arrays/expected/schema_javascript.mjs +49 -46
- data/golden/tuples_and_arrays/expected/schema_ruby.rb +46 -75
- data/golden/tuples_and_arrays/expected/vecir.txt +37 -0
- data/golden/us_tax_2024/expected/dfir.txt +189 -0
- data/golden/us_tax_2024/expected/dfir_optimized.txt +565 -0
- data/golden/us_tax_2024/expected/loopir.txt +685 -0
- data/golden/us_tax_2024/expected/schema_javascript.mjs +813 -127
- data/golden/us_tax_2024/expected/schema_ruby.rb +763 -159
- data/golden/us_tax_2024/expected/vecir.txt +567 -0
- data/golden/vector_make_object/expected/ast.txt +22 -0
- data/golden/vector_make_object/expected/dfir.txt +6 -0
- data/golden/vector_make_object/expected/dfir_optimized.txt +6 -0
- data/golden/vector_make_object/expected/input_plan.txt +5 -0
- data/golden/vector_make_object/expected/loopir.txt +9 -0
- data/golden/vector_make_object/expected/nast.txt +8 -0
- data/golden/vector_make_object/expected/schema_javascript.mjs +13 -0
- data/golden/vector_make_object/expected/schema_ruby.rb +14 -0
- data/golden/vector_make_object/expected/snast.txt +8 -0
- data/golden/vector_make_object/expected/vecir.txt +7 -0
- data/golden/vector_make_object/schema.kumi +11 -0
- data/golden/with_constants/expected/dfir.txt +9 -0
- data/golden/with_constants/expected/dfir_optimized.txt +9 -0
- data/golden/with_constants/expected/loopir.txt +9 -0
- data/golden/with_constants/expected/schema_javascript.mjs +8 -8
- data/golden/with_constants/expected/schema_ruby.rb +13 -37
- data/golden/with_constants/expected/vecir.txt +9 -0
- data/lib/kumi/analyzer.rb +28 -34
- data/lib/kumi/configuration.rb +7 -6
- data/lib/kumi/core/analyzer/pass_manager.rb +6 -1
- data/lib/kumi/core/analyzer/passes/attach_anchors_pass.rb +1 -1
- data/lib/kumi/core/analyzer/passes/attach_terminal_info_pass.rb +1 -1
- data/lib/kumi/core/analyzer/passes/codegen/loop/js/emitter.rb +204 -0
- data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/emitter.rb +212 -0
- data/lib/kumi/core/analyzer/passes/codegen/loop/ruby/output_buffer.rb +74 -0
- data/lib/kumi/core/analyzer/passes/codegen/loop_js_pass.rb +24 -0
- data/lib/kumi/core/analyzer/passes/codegen/loop_ruby_pass.rb +24 -0
- data/lib/kumi/core/analyzer/passes/dependency_resolver.rb +6 -0
- data/lib/kumi/core/analyzer/passes/df_validate_pass.rb +24 -0
- data/lib/kumi/core/analyzer/passes/import_analysis_pass.rb +90 -0
- data/lib/kumi/core/analyzer/passes/loop/lower_pass.rb +28 -0
- data/lib/kumi/core/analyzer/passes/loop_validate_pass.rb +21 -0
- data/lib/kumi/core/analyzer/passes/lower_to_dfir_pass.rb +37 -0
- data/lib/kumi/core/analyzer/passes/name_indexer.rb +20 -2
- data/lib/kumi/core/analyzer/passes/nast_dimensional_analyzer_pass.rb +44 -0
- data/lib/kumi/core/analyzer/passes/normalize_to_nast_pass.rb +30 -0
- data/lib/kumi/core/analyzer/passes/semantic_constraint_validator.rb +5 -1
- data/lib/kumi/core/analyzer/passes/snast_pass.rb +15 -0
- data/lib/kumi/core/analyzer/passes/vec/lower_pass.rb +24 -0
- data/lib/kumi/core/analyzer/passes/vec_validate_pass.rb +21 -0
- data/lib/kumi/core/analyzer/plans.rb +2 -3
- data/lib/kumi/core/compiler/access_planner_v2.rb +33 -2
- data/lib/kumi/core/nast.rb +16 -0
- data/lib/kumi/core/ruby_parser/build_context.rb +3 -1
- data/lib/kumi/core/ruby_parser/parser.rb +1 -1
- data/lib/kumi/core/ruby_parser/schema_builder.rb +33 -3
- data/lib/kumi/dev/golden/representation.rb +4 -7
- data/lib/kumi/dev/golden/result.rb +9 -3
- data/lib/kumi/dev/golden/runtime_test.rb +16 -1
- data/lib/kumi/dev/golden.rb +18 -20
- data/lib/kumi/dev/golden_schema_modules.rb +8 -0
- data/lib/kumi/dev/golden_schema_wrapper.rb +116 -0
- data/lib/kumi/dev/golden_v2.rb +292 -0
- data/lib/kumi/dev/pretty_printer.rb +42 -67
- data/lib/kumi/dev/support/kumi_runner.mjs +18 -0
- data/lib/kumi/ir/README.md +163 -0
- data/lib/kumi/ir/base/block.rb +32 -0
- data/lib/kumi/ir/base/builder.rb +43 -0
- data/lib/kumi/ir/base/function.rb +45 -0
- data/lib/kumi/ir/base/instruction.rb +206 -0
- data/lib/kumi/ir/base/module.rb +37 -0
- data/lib/kumi/ir/base.rb +10 -0
- data/lib/kumi/ir/buf/lower.rb +28 -0
- data/lib/kumi/ir/buf/pipeline.rb +19 -0
- data/lib/kumi/ir/buf.rb +29 -0
- data/lib/kumi/ir/df/access_contract.rb +87 -0
- data/lib/kumi/ir/df/import_inliner.rb +89 -0
- data/lib/kumi/ir/df/import_loader.rb +63 -0
- data/lib/kumi/ir/df/lower.rb +397 -0
- data/lib/kumi/ir/df/ops/array_build.rb +23 -0
- data/lib/kumi/ir/df/ops/array_get.rb +29 -0
- data/lib/kumi/ir/df/ops/array_len.rb +23 -0
- data/lib/kumi/ir/df/ops/axis_broadcast.rb +28 -0
- data/lib/kumi/ir/df/ops/axis_index.rb +23 -0
- data/lib/kumi/ir/df/ops/axis_shift.rb +35 -0
- data/lib/kumi/ir/df/ops/constant.rb +21 -0
- data/lib/kumi/ir/df/ops/decl_ref.rb +23 -0
- data/lib/kumi/ir/df/ops/fold.rb +25 -0
- data/lib/kumi/ir/df/ops/import_call.rb +25 -0
- data/lib/kumi/ir/df/ops/load_field.rb +33 -0
- data/lib/kumi/ir/df/ops/load_input.rb +31 -0
- data/lib/kumi/ir/df/ops/make_object.rb +23 -0
- data/lib/kumi/ir/df/ops/map.rb +21 -0
- data/lib/kumi/ir/df/ops/node.rb +46 -0
- data/lib/kumi/ir/df/ops/reduce.rb +27 -0
- data/lib/kumi/ir/df/ops/select.rb +25 -0
- data/lib/kumi/ir/df/ops.rb +10 -0
- data/lib/kumi/ir/df/passes/broadcast_simplify.rb +74 -0
- data/lib/kumi/ir/df/passes/cse.rb +51 -0
- data/lib/kumi/ir/df/passes/decl_inlining.rb +131 -0
- data/lib/kumi/ir/df/passes/import_inlining.rb +272 -0
- data/lib/kumi/ir/df/passes/load_dedup.rb +93 -0
- data/lib/kumi/ir/df/passes/stencil_cse.rb +71 -0
- data/lib/kumi/ir/df/passes/support/instruction_cloner.rb +82 -0
- data/lib/kumi/ir/df/passes/tuple_fold_canonicalization.rb +181 -0
- data/lib/kumi/ir/df/passes/tuple_to_object.rb +58 -0
- data/lib/kumi/ir/df/passes.rb +11 -0
- data/lib/kumi/ir/df/pipeline.rb +32 -0
- data/lib/kumi/ir/df/validator.rb +120 -0
- data/lib/kumi/ir/df.rb +95 -0
- data/lib/kumi/ir/loop/builder.rb +84 -0
- data/lib/kumi/ir/loop/lower.rb +679 -0
- data/lib/kumi/ir/loop/ops/core_ops.rb +194 -0
- data/lib/kumi/ir/loop/ops/node.rb +45 -0
- data/lib/kumi/ir/loop/ops.rb +4 -0
- data/lib/kumi/ir/loop/pipeline.rb +19 -0
- data/lib/kumi/ir/loop/validator.rb +101 -0
- data/lib/kumi/ir/loop.rb +28 -0
- data/lib/kumi/ir/loop_definition.md +93 -0
- data/lib/kumi/ir/passes.rb +32 -0
- data/lib/kumi/ir/printer.rb +54 -0
- data/lib/kumi/ir/testing/snast_factory.rb +146 -0
- data/lib/kumi/ir/testing.rb +9 -0
- data/lib/kumi/ir/vec/lower.rb +131 -0
- data/lib/kumi/ir/vec/ops/core_ops.rb +126 -0
- data/lib/kumi/ir/vec/ops/node.rb +45 -0
- data/lib/kumi/ir/vec/ops.rb +13 -0
- data/lib/kumi/ir/vec/passes/axis_canonicalization.rb +57 -0
- data/lib/kumi/ir/vec/passes/constant_propagation.rb +110 -0
- data/lib/kumi/ir/vec/passes/dce.rb +52 -0
- data/lib/kumi/ir/vec/passes/gvn.rb +64 -0
- data/lib/kumi/ir/vec/passes/peephole_simplify.rb +67 -0
- data/lib/kumi/ir/vec/passes/stencil_detection.rb +60 -0
- data/lib/kumi/ir/vec/passes/support/instruction_cloner.rb +48 -0
- data/lib/kumi/ir/vec/passes.rb +16 -0
- data/lib/kumi/ir/vec/pipeline.rb +30 -0
- data/lib/kumi/ir/vec/validator.rb +68 -0
- data/lib/kumi/ir/vec.rb +66 -0
- data/lib/kumi/ir/vec_definition.md +102 -0
- data/lib/kumi/ir.rb +14 -0
- data/lib/kumi/schema.rb +44 -2
- data/lib/kumi/support/nast_printer.rb +14 -0
- data/lib/kumi/support/s_expression_printer.rb +9 -0
- data/lib/kumi/support/snast_printer.rb +6 -0
- data/lib/kumi/syntax/import_call.rb +11 -0
- data/lib/kumi/syntax/import_declaration.rb +11 -0
- data/lib/kumi/syntax/root.rb +2 -2
- data/lib/kumi/test_shared_schemas/compound.rb +21 -0
- data/lib/kumi/test_shared_schemas/discount.rb +19 -0
- data/lib/kumi/test_shared_schemas/price.rb +19 -0
- data/lib/kumi/test_shared_schemas/subtotal.rb +22 -0
- data/lib/kumi/test_shared_schemas/tax.rb +18 -0
- data/lib/kumi/version.rb +1 -1
- data/lib/kumi.rb +50 -34
- data/tasks/release.rake +129 -0
- metadata +401 -261
- data/CLAUDE.md +0 -45
- data/docs/GOLDEN_QUICK_START.md +0 -141
- data/golden/array_element/expected/lir_00_unoptimized.txt +0 -13
- data/golden/array_element/expected/lir_01_hoist_scalar_references.txt +0 -13
- data/golden/array_element/expected/lir_02_inlined.txt +0 -13
- data/golden/array_element/expected/lir_03_cse.txt +0 -13
- data/golden/array_element/expected/lir_04_1_loop_fusion.txt +0 -13
- data/golden/array_element/expected/lir_04_loop_invcm.txt +0 -13
- data/golden/array_element/expected/lir_06_const_prop.txt +0 -13
- data/golden/array_index/expected/lir_00_unoptimized.txt +0 -41
- data/golden/array_index/expected/lir_01_hoist_scalar_references.txt +0 -41
- data/golden/array_index/expected/lir_02_inlined.txt +0 -42
- data/golden/array_index/expected/lir_03_cse.txt +0 -40
- data/golden/array_index/expected/lir_04_1_loop_fusion.txt +0 -40
- data/golden/array_index/expected/lir_04_loop_invcm.txt +0 -40
- data/golden/array_index/expected/lir_06_const_prop.txt +0 -40
- data/golden/array_operations/expected/lir_00_unoptimized.txt +0 -47
- data/golden/array_operations/expected/lir_01_hoist_scalar_references.txt +0 -47
- data/golden/array_operations/expected/lir_02_inlined.txt +0 -47
- data/golden/array_operations/expected/lir_03_cse.txt +0 -47
- data/golden/array_operations/expected/lir_04_1_loop_fusion.txt +0 -47
- data/golden/array_operations/expected/lir_04_loop_invcm.txt +0 -47
- data/golden/array_operations/expected/lir_06_const_prop.txt +0 -47
- data/golden/cascade_logic/expected/lir_00_unoptimized.txt +0 -29
- data/golden/cascade_logic/expected/lir_01_hoist_scalar_references.txt +0 -29
- data/golden/cascade_logic/expected/lir_02_inlined.txt +0 -37
- data/golden/cascade_logic/expected/lir_03_cse.txt +0 -30
- data/golden/cascade_logic/expected/lir_04_1_loop_fusion.txt +0 -30
- data/golden/cascade_logic/expected/lir_04_loop_invcm.txt +0 -30
- data/golden/cascade_logic/expected/lir_06_const_prop.txt +0 -30
- data/golden/chained_fusion/expected/lir_00_unoptimized.txt +0 -76
- data/golden/chained_fusion/expected/lir_01_hoist_scalar_references.txt +0 -76
- data/golden/chained_fusion/expected/lir_02_inlined.txt +0 -114
- data/golden/chained_fusion/expected/lir_03_cse.txt +0 -97
- data/golden/chained_fusion/expected/lir_04_1_loop_fusion.txt +0 -99
- data/golden/chained_fusion/expected/lir_04_loop_invcm.txt +0 -97
- data/golden/chained_fusion/expected/lir_06_const_prop.txt +0 -97
- data/golden/decimal_explicit/expected/lir_00_unoptimized.txt +0 -30
- data/golden/decimal_explicit/expected/lir_01_hoist_scalar_references.txt +0 -30
- data/golden/decimal_explicit/expected/lir_02_inlined.txt +0 -44
- data/golden/decimal_explicit/expected/lir_03_cse.txt +0 -40
- data/golden/decimal_explicit/expected/lir_04_1_loop_fusion.txt +0 -40
- data/golden/decimal_explicit/expected/lir_04_loop_invcm.txt +0 -40
- data/golden/decimal_explicit/expected/lir_06_const_prop.txt +0 -40
- data/golden/element_arrays/expected/lir_00_unoptimized.txt +0 -81
- data/golden/element_arrays/expected/lir_01_hoist_scalar_references.txt +0 -81
- data/golden/element_arrays/expected/lir_02_inlined.txt +0 -85
- data/golden/element_arrays/expected/lir_03_cse.txt +0 -83
- data/golden/element_arrays/expected/lir_04_1_loop_fusion.txt +0 -83
- data/golden/element_arrays/expected/lir_04_loop_invcm.txt +0 -83
- data/golden/element_arrays/expected/lir_06_const_prop.txt +0 -83
- data/golden/empty_and_null_inputs/expected/lir_00_unoptimized.txt +0 -31
- data/golden/empty_and_null_inputs/expected/lir_01_hoist_scalar_references.txt +0 -31
- data/golden/empty_and_null_inputs/expected/lir_02_inlined.txt +0 -51
- data/golden/empty_and_null_inputs/expected/lir_03_cse.txt +0 -49
- data/golden/empty_and_null_inputs/expected/lir_04_1_loop_fusion.txt +0 -49
- data/golden/empty_and_null_inputs/expected/lir_04_loop_invcm.txt +0 -49
- data/golden/empty_and_null_inputs/expected/lir_06_const_prop.txt +0 -49
- data/golden/function_overload/expected/lir_00_unoptimized.txt +0 -18
- data/golden/function_overload/expected/lir_01_hoist_scalar_references.txt +0 -18
- data/golden/function_overload/expected/lir_02_inlined.txt +0 -20
- data/golden/function_overload/expected/lir_03_cse.txt +0 -20
- data/golden/function_overload/expected/lir_04_1_loop_fusion.txt +0 -20
- data/golden/function_overload/expected/lir_04_loop_invcm.txt +0 -20
- data/golden/function_overload/expected/lir_06_const_prop.txt +0 -20
- data/golden/game_of_life/expected/lir_00_unoptimized.txt +0 -343
- data/golden/game_of_life/expected/lir_01_hoist_scalar_references.txt +0 -343
- data/golden/game_of_life/expected/lir_02_inlined.txt +0 -1918
- data/golden/game_of_life/expected/lir_03_cse.txt +0 -770
- data/golden/game_of_life/expected/lir_04_1_loop_fusion.txt +0 -770
- data/golden/game_of_life/expected/lir_04_loop_invcm.txt +0 -770
- data/golden/game_of_life/expected/lir_06_const_prop.txt +0 -770
- data/golden/hash_keys/expected/lir_00_unoptimized.txt +0 -18
- data/golden/hash_keys/expected/lir_01_hoist_scalar_references.txt +0 -18
- data/golden/hash_keys/expected/lir_02_inlined.txt +0 -18
- data/golden/hash_keys/expected/lir_03_cse.txt +0 -18
- data/golden/hash_keys/expected/lir_04_1_loop_fusion.txt +0 -18
- data/golden/hash_keys/expected/lir_04_loop_invcm.txt +0 -18
- data/golden/hash_keys/expected/lir_06_const_prop.txt +0 -18
- data/golden/hash_value/expected/lir_00_unoptimized.txt +0 -30
- data/golden/hash_value/expected/lir_01_hoist_scalar_references.txt +0 -30
- data/golden/hash_value/expected/lir_02_inlined.txt +0 -36
- data/golden/hash_value/expected/lir_03_cse.txt +0 -33
- data/golden/hash_value/expected/lir_04_1_loop_fusion.txt +0 -33
- data/golden/hash_value/expected/lir_04_loop_invcm.txt +0 -33
- data/golden/hash_value/expected/lir_06_const_prop.txt +0 -33
- data/golden/hierarchical_complex/expected/lir_00_unoptimized.txt +0 -87
- data/golden/hierarchical_complex/expected/lir_01_hoist_scalar_references.txt +0 -87
- data/golden/hierarchical_complex/expected/lir_02_inlined.txt +0 -115
- data/golden/hierarchical_complex/expected/lir_03_cse.txt +0 -89
- data/golden/hierarchical_complex/expected/lir_04_1_loop_fusion.txt +0 -89
- data/golden/hierarchical_complex/expected/lir_04_loop_invcm.txt +0 -89
- data/golden/hierarchical_complex/expected/lir_06_const_prop.txt +0 -89
- data/golden/inline_rename_scope_leak/expected/lir_00_unoptimized.txt +0 -35
- data/golden/inline_rename_scope_leak/expected/lir_01_hoist_scalar_references.txt +0 -35
- data/golden/inline_rename_scope_leak/expected/lir_02_inlined.txt +0 -49
- data/golden/inline_rename_scope_leak/expected/lir_03_cse.txt +0 -49
- data/golden/inline_rename_scope_leak/expected/lir_04_1_loop_fusion.txt +0 -49
- data/golden/inline_rename_scope_leak/expected/lir_04_loop_invcm.txt +0 -49
- data/golden/inline_rename_scope_leak/expected/lir_06_const_prop.txt +0 -49
- data/golden/input_reference/expected/lir_00_unoptimized.txt +0 -39
- data/golden/input_reference/expected/lir_01_hoist_scalar_references.txt +0 -39
- data/golden/input_reference/expected/lir_02_inlined.txt +0 -39
- data/golden/input_reference/expected/lir_03_cse.txt +0 -39
- data/golden/input_reference/expected/lir_04_1_loop_fusion.txt +0 -39
- data/golden/input_reference/expected/lir_04_loop_invcm.txt +0 -39
- data/golden/input_reference/expected/lir_06_const_prop.txt +0 -39
- data/golden/interleaved_fusion/expected/lir_00_unoptimized.txt +0 -53
- data/golden/interleaved_fusion/expected/lir_01_hoist_scalar_references.txt +0 -53
- data/golden/interleaved_fusion/expected/lir_02_inlined.txt +0 -89
- data/golden/interleaved_fusion/expected/lir_03_cse.txt +0 -77
- data/golden/interleaved_fusion/expected/lir_04_1_loop_fusion.txt +0 -78
- data/golden/interleaved_fusion/expected/lir_04_loop_invcm.txt +0 -77
- data/golden/interleaved_fusion/expected/lir_06_const_prop.txt +0 -77
- data/golden/let_inline/expected/lir_00_unoptimized.txt +0 -26
- data/golden/let_inline/expected/lir_01_hoist_scalar_references.txt +0 -26
- data/golden/let_inline/expected/lir_02_inlined.txt +0 -36
- data/golden/let_inline/expected/lir_03_cse.txt +0 -30
- data/golden/let_inline/expected/lir_04_1_loop_fusion.txt +0 -30
- data/golden/let_inline/expected/lir_04_loop_invcm.txt +0 -30
- data/golden/let_inline/expected/lir_06_const_prop.txt +0 -30
- data/golden/loop_fusion/expected/lir_00_unoptimized.txt +0 -43
- data/golden/loop_fusion/expected/lir_01_hoist_scalar_references.txt +0 -43
- data/golden/loop_fusion/expected/lir_02_inlined.txt +0 -62
- data/golden/loop_fusion/expected/lir_03_cse.txt +0 -57
- data/golden/loop_fusion/expected/lir_04_1_loop_fusion.txt +0 -57
- data/golden/loop_fusion/expected/lir_04_loop_invcm.txt +0 -57
- data/golden/loop_fusion/expected/lir_06_const_prop.txt +0 -57
- data/golden/min_reduce_scope/expected/lir_00_unoptimized.txt +0 -59
- data/golden/min_reduce_scope/expected/lir_01_hoist_scalar_references.txt +0 -59
- data/golden/min_reduce_scope/expected/lir_02_inlined.txt +0 -63
- data/golden/min_reduce_scope/expected/lir_03_cse.txt +0 -60
- data/golden/min_reduce_scope/expected/lir_04_1_loop_fusion.txt +0 -60
- data/golden/min_reduce_scope/expected/lir_04_loop_invcm.txt +0 -60
- data/golden/min_reduce_scope/expected/lir_06_const_prop.txt +0 -60
- data/golden/mixed_dimensions/expected/lir_00_unoptimized.txt +0 -42
- data/golden/mixed_dimensions/expected/lir_01_hoist_scalar_references.txt +0 -42
- data/golden/mixed_dimensions/expected/lir_02_inlined.txt +0 -48
- data/golden/mixed_dimensions/expected/lir_03_cse.txt +0 -48
- data/golden/mixed_dimensions/expected/lir_04_1_loop_fusion.txt +0 -48
- data/golden/mixed_dimensions/expected/lir_04_loop_invcm.txt +0 -48
- data/golden/mixed_dimensions/expected/lir_06_const_prop.txt +0 -48
- data/golden/multirank_hoisting/expected/lir_00_unoptimized.txt +0 -75
- data/golden/multirank_hoisting/expected/lir_01_hoist_scalar_references.txt +0 -75
- data/golden/multirank_hoisting/expected/lir_02_inlined.txt +0 -126
- data/golden/multirank_hoisting/expected/lir_03_cse.txt +0 -109
- data/golden/multirank_hoisting/expected/lir_04_1_loop_fusion.txt +0 -109
- data/golden/multirank_hoisting/expected/lir_04_loop_invcm.txt +0 -109
- data/golden/multirank_hoisting/expected/lir_06_const_prop.txt +0 -109
- data/golden/nested_hash/expected/lir_00_unoptimized.txt +0 -10
- data/golden/nested_hash/expected/lir_01_hoist_scalar_references.txt +0 -10
- data/golden/nested_hash/expected/lir_02_inlined.txt +0 -10
- data/golden/nested_hash/expected/lir_03_cse.txt +0 -10
- data/golden/nested_hash/expected/lir_04_1_loop_fusion.txt +0 -10
- data/golden/nested_hash/expected/lir_04_loop_invcm.txt +0 -10
- data/golden/nested_hash/expected/lir_06_const_prop.txt +0 -10
- data/golden/reduction_broadcast/expected/lir_00_unoptimized.txt +0 -49
- data/golden/reduction_broadcast/expected/lir_01_hoist_scalar_references.txt +0 -49
- data/golden/reduction_broadcast/expected/lir_02_inlined.txt +0 -80
- data/golden/reduction_broadcast/expected/lir_03_cse.txt +0 -68
- data/golden/reduction_broadcast/expected/lir_04_1_loop_fusion.txt +0 -68
- data/golden/reduction_broadcast/expected/lir_04_loop_invcm.txt +0 -68
- data/golden/reduction_broadcast/expected/lir_06_const_prop.txt +0 -68
- data/golden/roll/expected/lir_00_unoptimized.txt +0 -56
- data/golden/roll/expected/lir_01_hoist_scalar_references.txt +0 -56
- data/golden/roll/expected/lir_02_inlined.txt +0 -56
- data/golden/roll/expected/lir_03_cse.txt +0 -55
- data/golden/roll/expected/lir_04_1_loop_fusion.txt +0 -55
- data/golden/roll/expected/lir_04_loop_invcm.txt +0 -55
- data/golden/roll/expected/lir_06_const_prop.txt +0 -55
- data/golden/shift/expected/lir_00_unoptimized.txt +0 -96
- data/golden/shift/expected/lir_01_hoist_scalar_references.txt +0 -96
- data/golden/shift/expected/lir_02_inlined.txt +0 -96
- data/golden/shift/expected/lir_03_cse.txt +0 -90
- data/golden/shift/expected/lir_04_1_loop_fusion.txt +0 -90
- data/golden/shift/expected/lir_04_loop_invcm.txt +0 -90
- data/golden/shift/expected/lir_06_const_prop.txt +0 -90
- data/golden/shift_2d/expected/lir_00_unoptimized.txt +0 -274
- data/golden/shift_2d/expected/lir_01_hoist_scalar_references.txt +0 -274
- data/golden/shift_2d/expected/lir_02_inlined.txt +0 -274
- data/golden/shift_2d/expected/lir_03_cse.txt +0 -262
- data/golden/shift_2d/expected/lir_04_1_loop_fusion.txt +0 -262
- data/golden/shift_2d/expected/lir_04_loop_invcm.txt +0 -262
- data/golden/shift_2d/expected/lir_06_const_prop.txt +0 -262
- data/golden/simple_math/expected/lir_00_unoptimized.txt +0 -31
- data/golden/simple_math/expected/lir_01_hoist_scalar_references.txt +0 -31
- data/golden/simple_math/expected/lir_02_inlined.txt +0 -31
- data/golden/simple_math/expected/lir_03_cse.txt +0 -31
- data/golden/simple_math/expected/lir_04_1_loop_fusion.txt +0 -31
- data/golden/simple_math/expected/lir_04_loop_invcm.txt +0 -31
- data/golden/simple_math/expected/lir_06_const_prop.txt +0 -31
- data/golden/streaming_basics/expected/lir_00_unoptimized.txt +0 -73
- data/golden/streaming_basics/expected/lir_01_hoist_scalar_references.txt +0 -73
- data/golden/streaming_basics/expected/lir_02_inlined.txt +0 -100
- data/golden/streaming_basics/expected/lir_03_cse.txt +0 -84
- data/golden/streaming_basics/expected/lir_04_1_loop_fusion.txt +0 -84
- data/golden/streaming_basics/expected/lir_04_loop_invcm.txt +0 -84
- data/golden/streaming_basics/expected/lir_06_const_prop.txt +0 -84
- data/golden/tuples/expected/lir_00_unoptimized.txt +0 -40
- data/golden/tuples/expected/lir_01_hoist_scalar_references.txt +0 -40
- data/golden/tuples/expected/lir_02_inlined.txt +0 -48
- data/golden/tuples/expected/lir_03_cse.txt +0 -48
- data/golden/tuples/expected/lir_04_1_loop_fusion.txt +0 -48
- data/golden/tuples/expected/lir_04_loop_invcm.txt +0 -48
- data/golden/tuples/expected/lir_06_const_prop.txt +0 -48
- data/golden/tuples_and_arrays/expected/lir_00_unoptimized.txt +0 -41
- data/golden/tuples_and_arrays/expected/lir_01_hoist_scalar_references.txt +0 -41
- data/golden/tuples_and_arrays/expected/lir_02_inlined.txt +0 -62
- data/golden/tuples_and_arrays/expected/lir_03_cse.txt +0 -51
- data/golden/tuples_and_arrays/expected/lir_04_1_loop_fusion.txt +0 -51
- data/golden/tuples_and_arrays/expected/lir_04_loop_invcm.txt +0 -51
- data/golden/tuples_and_arrays/expected/lir_06_const_prop.txt +0 -51
- data/golden/us_tax_2024/expected/lir_00_unoptimized.txt +0 -291
- data/golden/us_tax_2024/expected/lir_01_hoist_scalar_references.txt +0 -291
- data/golden/us_tax_2024/expected/lir_02_inlined.txt +0 -1254
- data/golden/us_tax_2024/expected/lir_03_cse.txt +0 -626
- data/golden/us_tax_2024/expected/lir_04_1_loop_fusion.txt +0 -671
- data/golden/us_tax_2024/expected/lir_04_loop_invcm.txt +0 -626
- data/golden/us_tax_2024/expected/lir_06_const_prop.txt +0 -626
- data/golden/with_constants/expected/lir_00_unoptimized.txt +0 -17
- data/golden/with_constants/expected/lir_01_hoist_scalar_references.txt +0 -17
- data/golden/with_constants/expected/lir_02_inlined.txt +0 -17
- data/golden/with_constants/expected/lir_03_cse.txt +0 -17
- data/golden/with_constants/expected/lir_04_1_loop_fusion.txt +0 -17
- data/golden/with_constants/expected/lir_04_loop_invcm.txt +0 -17
- data/golden/with_constants/expected/lir_06_const_prop.txt +0 -17
- data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +0 -317
- data/lib/kumi/core/analyzer/passes/codegen/js/emitter.rb +0 -75
- data/lib/kumi/core/analyzer/passes/codegen/js/output_buffer.rb +0 -103
- data/lib/kumi/core/analyzer/passes/codegen/js_pass.rb +0 -27
- data/lib/kumi/core/analyzer/passes/codegen/ruby/declaration_emitter.rb +0 -321
- data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +0 -85
- data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +0 -111
- data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +0 -32
- data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +0 -84
- data/lib/kumi/core/analyzer/passes/lir/dead_code_elimination_pass.rb +0 -93
- data/lib/kumi/core/analyzer/passes/lir/hoist_scalar_references_pass.rb +0 -115
- data/lib/kumi/core/analyzer/passes/lir/inline_declarations_pass.rb +0 -394
- data/lib/kumi/core/analyzer/passes/lir/instruction_scheduling_pass.rb +0 -198
- data/lib/kumi/core/analyzer/passes/lir/kernel_binding_pass.rb +0 -30
- data/lib/kumi/core/analyzer/passes/lir/local_cse_pass.rb +0 -121
- data/lib/kumi/core/analyzer/passes/lir/loop_fusion_pass.rb +0 -156
- data/lib/kumi/core/analyzer/passes/lir/loop_invariant_code_motion_pass.rb +0 -148
- data/lib/kumi/core/analyzer/passes/lir/lower_pass.rb +0 -407
- data/lib/kumi/core/analyzer/passes/lir/stencil_emitter.rb +0 -241
- data/lib/kumi/core/analyzer/passes/lir/validation_pass.rb +0 -83
- data/lib/kumi/core/lir/analyze.rb +0 -64
- data/lib/kumi/core/lir/build.rb +0 -363
- data/lib/kumi/core/lir/emit.rb +0 -62
- data/lib/kumi/core/lir/structs/instruction.rb +0 -44
- data/lib/kumi/core/lir/structs/literal.rb +0 -14
- data/lib/kumi/core/lir/structs/stamp.rb +0 -13
- data/lib/kumi/core/lir/support/error.rb +0 -9
- data/lib/kumi/core/lir/support/ids.rb +0 -34
- data/lib/kumi/core/lir/validate.rb +0 -74
- data/lib/kumi/core/lir.rb +0 -34
- data/lib/kumi/support/lir_printer.rb +0 -143
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 74f061f34a9936380a89aff28563594be891ac849f233613edf5ad9b52acce64
|
|
4
|
+
data.tar.gz: 8c7ee4b31d80293c18d8ea5914ae51ec80a489f6950352dd47044aa1b1aecba1
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 70164a71693f388d25f2b2c8fc3c7d938860bb6e0f06344f06f7be96d1edb25a1e88686339fb81e919f6fde6d11510d14174cea22c3acc9f200bcc5c6fbf8724
|
|
7
|
+
data.tar.gz: 02df5faaef97f3d951a5fb022d7621daf1cec37ee482d0aa8db366c0ff7e0f44f6dc301302745249de1901c63c6e40dc52cff3e8d0019712ddae364196a4f642
|
data/.codex
ADDED
|
File without changes
|
data/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,42 @@
|
|
|
1
1
|
## [Unreleased]
|
|
2
|
+
|
|
3
|
+
## [0.0.35] – 2026-06-11
|
|
4
|
+
### Added
|
|
5
|
+
- **Dataflow IR Pipeline:** New DF IR graph, typed operations, validation, import inlining, broadcast simplification, CSE, load deduplication, tuple/object canonicalization, and golden artifact coverage.
|
|
6
|
+
- **Vector IR Pipeline:** New VecIR builder, lowerer, validator, axis canonicalization, constant propagation, GVN, DCE, peephole simplification, stencil detection, and focused specs.
|
|
7
|
+
- **Loop IR Pipeline:** New LoopIR builder/lowerer/validator and Ruby/JavaScript loop codegen path replacing the legacy LIR codegen pipeline.
|
|
8
|
+
- **IR Tooling:** Shared IR base types, pass pipeline infrastructure, pretty printers, SNAST factory helpers, and expanded golden v2 output artifacts for DF/Vec/Loop stages.
|
|
9
|
+
- **Regression Coverage:** External installed-gem loading spec that builds and installs the gem in an isolated `GEM_HOME` so runtime packaging issues are caught.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
- Removed the legacy LIR pipeline and refreshed golden outputs to the DF/Vec/Loop representation stack.
|
|
13
|
+
- Updated generated Ruby and JavaScript output to use the LoopIR-backed codegen path.
|
|
14
|
+
- Hardened kernel definitions and docs around numeric reductions, string aggregations, arithmetic helpers, and min/max empty-array behavior.
|
|
15
|
+
- Revised architecture, schema import, golden test, and development documentation around the new IR pipeline.
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
- Runtime `require "kumi"` no longer loads golden-test support files or leaks the Zeitwerk loader as a top-level `AUTOLOADER` constant.
|
|
19
|
+
- Golden shared schemas are loaded only through `Kumi.load_shared_schemas!`, preserving test support behavior without coupling it to normal gem loading.
|
|
20
|
+
|
|
21
|
+
## [0.0.33] – 2025-11-05
|
|
22
|
+
### Added
|
|
23
|
+
- **Peephole Optimization Helper:** `Kumi::Core::LIR::Peephole` plus specs for safer peephole transforms, inline Ruby clamp kernel, richer LIR dumps, and refreshed golden files
|
|
24
|
+
- **Import Diagnostics:** Clearer errors with available declaration hints when imports fail
|
|
25
|
+
|
|
26
|
+
### Changed
|
|
27
|
+
- Default `Kumi.configure.compilation_mode` now `:jit`; override via config or `KUMI_COMPILATION_MODE`
|
|
28
|
+
- Improved constant propagation output formatting for Ruby/JS codegen
|
|
29
|
+
|
|
30
|
+
## [0.0.32] – 2025-10-23
|
|
31
|
+
### Added
|
|
32
|
+
- **Schema Imports:** Reuse declarations from other schemas with `import :name, from: Module` syntax
|
|
33
|
+
- **Improved Import Errors:** Clearer messages with available declaration hints when imports fail
|
|
34
|
+
- Documentation: `docs/COMPOSED_SCHEMAS.md` and `docs/SCHEMA_IMPORTS.md`
|
|
35
|
+
|
|
36
|
+
## [0.0.31] – 2025-10-22
|
|
37
|
+
### Changed
|
|
38
|
+
- Documentation for schema imports in README and SYNTAX
|
|
39
|
+
|
|
2
40
|
## [0.0.30] – 2025-10-21
|
|
3
41
|
### Changed
|
|
4
42
|
- **Analyzer Refactoring:** PassManager now centralizes pass orchestration, replacing manual orchestration in Analyzer.run_analysis_passes
|
|
@@ -174,4 +212,4 @@ Fix - Remove require of pry gem on runtime.
|
|
|
174
212
|
- Ruby >= 3.1 (Was >= 3.0)
|
|
175
213
|
|
|
176
214
|
### Notes
|
|
177
|
-
- No expected DSL changes for typical schemas; report regressions.
|
|
215
|
+
- No expected DSL changes for typical schemas; report regressions.
|
data/README.md
CHANGED
|
@@ -10,116 +10,44 @@
|
|
|
10
10
|
|
|
11
11
|
## What is Kumi?
|
|
12
12
|
|
|
13
|
-
Kumi is a **declarative DSL for
|
|
14
|
-
- **Typed & verifiable at compile time** (catch errors before they hit production)
|
|
15
|
-
- **Vectorized** (arrays and nested data structures work naturally)
|
|
16
|
-
- **Transparent** (inspect generated code and execution order)
|
|
17
|
-
- **Portable** (compile the same schema to Ruby or JavaScript)
|
|
13
|
+
Kumi is a **declarative DSL for calculation logic** — tax rules, pricing, scoring, financial projections — that compiles to plain Ruby and JavaScript.
|
|
18
14
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
## Why Kumi Exists
|
|
22
|
-
|
|
23
|
-
Calculation systems are everywhere: tax engines, pricing models, financial projections, compliance checks. They're usually:
|
|
24
|
-
- Hard to verify (logic spread across multiple files)
|
|
25
|
-
- Fragile (changing one formula breaks hidden dependencies)
|
|
26
|
-
- Duplicated (same logic needed in backend and frontend)
|
|
27
|
-
- Opaque (hard to audit which rules applied to which data)
|
|
28
|
-
|
|
29
|
-
Kumi makes them explicit, testable, and portable.
|
|
30
|
-
|
|
31
|
-
---
|
|
32
|
-
|
|
33
|
-
**Status**: experimental. Public API may change. Typing and some static checks are still evolving.
|
|
34
|
-
|
|
35
|
-
**Feedback**: have a use case or hit a rough edge? Open an issue or reach out.
|
|
36
|
-
|
|
37
|
-
---
|
|
38
|
-
|
|
39
|
-
## Example: US Tax Calculator (2024)
|
|
40
|
-
|
|
41
|
-
A single schema computes federal, state, FICA taxes across multiple filing statuses—all types verified at compile time. Try it in the [interactive demo](https://kumi-play-web.fly.dev/) or inspect the [full schema, input, output, and generated code](golden/us_tax_2024/).
|
|
42
|
-
|
|
43
|
-
<details>
|
|
44
|
-
<summary><strong>Schema</strong></summary>
|
|
15
|
+
You declare the shape of your input data and the values you want computed. The compiler determines evaluation order, checks types, detects impossible conditions, and emits dependency-free code for each target.
|
|
45
16
|
|
|
46
17
|
```ruby
|
|
47
18
|
schema do
|
|
48
19
|
input do
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
string :filing_status
|
|
54
|
-
|
|
55
|
-
array :statuses do
|
|
56
|
-
hash :status do
|
|
57
|
-
string :name
|
|
58
|
-
float :std
|
|
59
|
-
float :addl_threshold
|
|
60
|
-
array :rates do
|
|
61
|
-
hash :bracket do
|
|
62
|
-
float :lo
|
|
63
|
-
float :hi # -1 = open-ended
|
|
64
|
-
float :rate
|
|
65
|
-
end
|
|
66
|
-
end
|
|
20
|
+
array :items do
|
|
21
|
+
hash :item do
|
|
22
|
+
integer :quantity
|
|
23
|
+
decimal :unit_price
|
|
67
24
|
end
|
|
68
25
|
end
|
|
69
26
|
end
|
|
70
27
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
let :state_tax, input.income * input.state_rate
|
|
74
|
-
let :local_tax, input.income * input.local_rate
|
|
75
|
-
|
|
76
|
-
# FICA constants
|
|
77
|
-
let :ss_wage_base, 168_600.0
|
|
78
|
-
let :ss_rate, 0.062
|
|
79
|
-
let :med_base_rate, 0.0145
|
|
80
|
-
let :addl_med_rate, 0.009
|
|
81
|
-
|
|
82
|
-
# per-status federal
|
|
83
|
-
let :taxable, fn(:max, [input.income - input.statuses.status.std, 0])
|
|
84
|
-
let :lo, input.statuses.status.rates.bracket.lo
|
|
85
|
-
let :hi, input.statuses.status.rates.bracket.hi
|
|
86
|
-
let :rate, input.statuses.status.rates.bracket.rate
|
|
87
|
-
let :hi_eff, select(hi == -1, big_hi, hi)
|
|
88
|
-
let :amt, fn(:clamp, taxable - lo, 0, hi_eff - lo)
|
|
89
|
-
let :fed_tax, fn(:sum, amt * rate)
|
|
90
|
-
let :in_br, (taxable >= lo) & (taxable < hi_eff)
|
|
91
|
-
let :fed_marg, fn(:sum_if, rate, in_br)
|
|
92
|
-
let :fed_eff, fed_tax / fn(:max, [input.income, 1.0])
|
|
93
|
-
|
|
94
|
-
# per-status FICA
|
|
95
|
-
let :ss_tax, fn(:min, [input.income, ss_wage_base]) * ss_rate
|
|
96
|
-
let :med_tax, input.income * med_base_rate
|
|
97
|
-
let :addl_med_tax, fn(:max, [input.income - input.statuses.status.addl_threshold, 0]) * addl_med_rate
|
|
98
|
-
let :fica_tax, ss_tax + med_tax + addl_med_tax
|
|
99
|
-
let :fica_eff, fica_tax / fn(:max, [input.income, 1.0])
|
|
100
|
-
|
|
101
|
-
# totals per status
|
|
102
|
-
let :total_tax, fed_tax + fica_tax + state_tax + local_tax
|
|
103
|
-
let :total_eff, total_tax / fn(:max, [input.income, 1.0])
|
|
104
|
-
let :after_tax, input.income - total_tax
|
|
105
|
-
let :take_home, after_tax - input.retirement_contrib
|
|
106
|
-
|
|
107
|
-
# array of result objects, one per status
|
|
108
|
-
value :summary, {
|
|
109
|
-
filing_status: input.statuses.status.name,
|
|
110
|
-
federal: { marginal: fed_marg, effective: fed_eff, tax: fed_tax },
|
|
111
|
-
fica: { effective: fica_eff, tax: fica_tax },
|
|
112
|
-
state: { marginal: input.state_rate, effective: input.state_rate, tax: state_tax },
|
|
113
|
-
local: { marginal: input.local_rate, effective: input.local_rate, tax: local_tax },
|
|
114
|
-
total: { effective: total_eff, tax: total_tax },
|
|
115
|
-
after_tax: after_tax,
|
|
116
|
-
retirement_contrib: input.retirement_contrib,
|
|
117
|
-
take_home: take_home
|
|
118
|
-
}
|
|
28
|
+
value :line_totals, input.items.item.quantity * input.items.item.unit_price
|
|
29
|
+
value :subtotal, fn(:sum, line_totals)
|
|
119
30
|
end
|
|
120
31
|
```
|
|
121
32
|
|
|
122
|
-
|
|
33
|
+
No loops, no iteration plumbing: `line_totals` is computed per item because that's where the data lives, and `fn(:sum, ...)` collapses it back to a scalar. This works through arbitrarily nested arrays.
|
|
34
|
+
|
|
35
|
+
## Why
|
|
36
|
+
|
|
37
|
+
- **One source of truth, two targets.** The same schema compiles to Ruby and JavaScript with identical semantics — write pricing logic once, run it in your backend and in the browser preview.
|
|
38
|
+
- **Broadcasting from data shape.** Operations align over arrays automatically based on the declared input structure, including nested and ragged data.
|
|
39
|
+
- **Static checks at compile time.** Type checking, dependency cycle detection, and unsatisfiable-constraint detection happen when the schema is defined, not in production.
|
|
40
|
+
- **Boring generated code.** Output is deterministic, dependency-free, straight-line code with explicit loops. What you read is what runs.
|
|
41
|
+
|
|
42
|
+
## Use Cases
|
|
43
|
+
|
|
44
|
+
Tax engines, pricing models, financial projections, compliance rules, insurance underwriting, shipping rate calculators — anywhere calculation logic must be correct, auditable, and consistent across platforms.
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
**Status**: experimental. Public API may change. Typing and some static checks are still evolving.
|
|
49
|
+
|
|
50
|
+
**Feedback**: have a use case or hit a rough edge? Open an issue or reach out (andremuta+kumi@gmail.com).
|
|
123
51
|
|
|
124
52
|
---
|
|
125
53
|
|
|
@@ -129,7 +57,7 @@ end
|
|
|
129
57
|
gem install kumi
|
|
130
58
|
```
|
|
131
59
|
|
|
132
|
-
Requires Ruby 3.1+.
|
|
60
|
+
Requires Ruby 3.1+. Runtime dependencies: `mutex_m` and `zeitwerk` (bundled via Rubygems).
|
|
133
61
|
|
|
134
62
|
## Quick Start
|
|
135
63
|
|
|
@@ -149,22 +77,38 @@ end
|
|
|
149
77
|
result = Double.from(x: 5)
|
|
150
78
|
result[:doubled] # => 10
|
|
151
79
|
|
|
80
|
+
# or just call the method directly
|
|
81
|
+
Double._doubled(x: 5) # => 10
|
|
82
|
+
|
|
152
83
|
# Export to JavaScript (same logic)
|
|
153
84
|
Double.write_source("output.mjs", platform: :javascript)
|
|
85
|
+
# ./output.mjs
|
|
86
|
+
# export function _doubled(input) {
|
|
87
|
+
# let t1 = input["x"];
|
|
88
|
+
# let t3 = t1 * 2;
|
|
89
|
+
# return t3;
|
|
90
|
+
# }
|
|
154
91
|
```
|
|
155
92
|
|
|
156
|
-
|
|
93
|
+
You can also override the compilation strategy without touching code by setting
|
|
94
|
+
`KUMI_COMPILATION_MODE` to `jit` or `aot` (e.g. `export KUMI_COMPILATION_MODE=aot`).
|
|
95
|
+
|
|
96
|
+
## Examples
|
|
97
|
+
|
|
98
|
+
- **US Tax Calculator (2024)** — a single schema computes federal, state, and FICA taxes across multiple filing statuses. [Open in the demo](https://kumi-play-web.fly.dev/?example=us-federal-tax-2024).
|
|
99
|
+
- **Monte Carlo Portfolio** — probabilistic simulations and table visualizations. [Open in the demo](https://kumi-play-web.fly.dev/?example=monte-carlo-simulation).
|
|
100
|
+
- **Conway's Game of Life** — array operations powering a grid-based simulation. [Open in the demo](https://kumi-play-web.fly.dev/?example=game-of-life).
|
|
157
101
|
|
|
158
102
|
---
|
|
159
103
|
|
|
160
104
|
## Documentation
|
|
161
105
|
|
|
162
|
-
- **[Syntax Reference](docs/SYNTAX.md)**
|
|
163
|
-
- **[Functions Reference](docs/FUNCTIONS.md)**
|
|
164
|
-
- **[
|
|
165
|
-
- **[
|
|
166
|
-
|
|
167
|
-
|
|
106
|
+
- **[Syntax Reference](docs/SYNTAX.md)** — DSL syntax, types, operators, functions
|
|
107
|
+
- **[Functions Reference](docs/FUNCTIONS.md)** — auto-generated docs for all functions and kernels ([machine-readable JSON](docs/functions-reference.json))
|
|
108
|
+
- **[Schema Imports](docs/SCHEMA_IMPORTS.md)** — composing and reusing schemas
|
|
109
|
+
- **[Architecture](docs/ARCHITECTURE.md)** — the compiler pipeline and IR stack
|
|
110
|
+
- **[Golden Tests](docs/GOLDEN_TESTS.md)** — the end-to-end test harness
|
|
111
|
+
- **[Development Guide](docs/DEVELOPMENT.md)** — tooling, docs generation, IDE integration
|
|
168
112
|
|
|
169
113
|
---
|
|
170
114
|
|
data/Rakefile
CHANGED
|
@@ -7,6 +7,8 @@ functions:
|
|
|
7
7
|
param: source_value
|
|
8
8
|
reduction_strategy: identity # This function has a true identity value.
|
|
9
9
|
aliases: ["sum"]
|
|
10
|
+
options:
|
|
11
|
+
tuple_fold_combiner: core.add
|
|
10
12
|
|
|
11
13
|
- id: agg.count
|
|
12
14
|
kind: reduce
|
|
@@ -25,6 +27,8 @@ functions:
|
|
|
25
27
|
param: source_value
|
|
26
28
|
reduction_strategy: first_element
|
|
27
29
|
aliases: ["min"]
|
|
30
|
+
options:
|
|
31
|
+
tuple_fold_combiner: core.min
|
|
28
32
|
|
|
29
33
|
- id: agg.max
|
|
30
34
|
kind: reduce
|
|
@@ -34,6 +38,8 @@ functions:
|
|
|
34
38
|
param: source_value
|
|
35
39
|
reduction_strategy: first_element
|
|
36
40
|
aliases: ["max"]
|
|
41
|
+
options:
|
|
42
|
+
tuple_fold_combiner: core.max
|
|
37
43
|
|
|
38
44
|
- id: agg.mean
|
|
39
45
|
kind: reduce
|
|
@@ -7,6 +7,32 @@ functions:
|
|
|
7
7
|
param: number
|
|
8
8
|
aliases: ["abs"]
|
|
9
9
|
|
|
10
|
+
- id: core.max
|
|
11
|
+
kind: elementwise
|
|
12
|
+
params:
|
|
13
|
+
- { name: left_operand, dtype: numeric }
|
|
14
|
+
- { name: right_operand, dtype: numeric }
|
|
15
|
+
dtype:
|
|
16
|
+
rule: promote
|
|
17
|
+
params: [left_operand, right_operand]
|
|
18
|
+
constraint_semantics:
|
|
19
|
+
pure_combiner: true
|
|
20
|
+
commutativity: true
|
|
21
|
+
associativity: true
|
|
22
|
+
|
|
23
|
+
- id: core.min
|
|
24
|
+
kind: elementwise
|
|
25
|
+
params:
|
|
26
|
+
- { name: left_operand, dtype: numeric }
|
|
27
|
+
- { name: right_operand, dtype: numeric }
|
|
28
|
+
dtype:
|
|
29
|
+
rule: promote
|
|
30
|
+
params: [left_operand, right_operand]
|
|
31
|
+
constraint_semantics:
|
|
32
|
+
pure_combiner: true
|
|
33
|
+
commutativity: true
|
|
34
|
+
associativity: true
|
|
35
|
+
|
|
10
36
|
- id: core.add
|
|
11
37
|
kind: elementwise
|
|
12
38
|
params:
|
|
@@ -16,12 +16,16 @@ kernels:
|
|
|
16
16
|
|
|
17
17
|
- id: agg.min:javascript:v1
|
|
18
18
|
fn: agg.min
|
|
19
|
-
#
|
|
20
|
-
|
|
19
|
+
# Skips null values (an inner reduction over an empty array yields null);
|
|
20
|
+
# the $1 !== null guard is required because null coerces to 0 in
|
|
21
|
+
# relational comparisons (null < 5 is true).
|
|
22
|
+
inline: "= ($1 !== null && ($0 === null || $1 < $0)) ? $1 : $0"
|
|
21
23
|
fold_inline: "= Math.min(...$0)"
|
|
22
24
|
|
|
23
25
|
- id: agg.max:javascript:v1
|
|
24
26
|
fn: agg.max
|
|
25
|
-
#
|
|
26
|
-
|
|
27
|
+
# Skips null values (an inner reduction over an empty array yields null);
|
|
28
|
+
# the $1 !== null guard is required because null coerces to 0 in
|
|
29
|
+
# relational comparisons (null > -5 is true).
|
|
30
|
+
inline: "= ($1 !== null && ($0 === null || $1 > $0)) ? $1 : $0"
|
|
27
31
|
fold_inline: "= Math.max(...$0)"
|
|
@@ -7,6 +7,14 @@ kernels:
|
|
|
7
7
|
fn: core.mod
|
|
8
8
|
inline: "= (($0 % $1) + $1) % $1"
|
|
9
9
|
|
|
10
|
+
- id: max:javascript:v1
|
|
11
|
+
fn: core.max
|
|
12
|
+
inline: "= Math.max($0, $1)"
|
|
13
|
+
|
|
14
|
+
- id: min:javascript:v1
|
|
15
|
+
fn: core.min
|
|
16
|
+
inline: "= Math.min($0, $1)"
|
|
17
|
+
|
|
10
18
|
- id: add:javascript:v1
|
|
11
19
|
fn: core.add
|
|
12
20
|
inline: "= $0 + $1"
|
|
@@ -18,12 +18,16 @@ kernels:
|
|
|
18
18
|
|
|
19
19
|
- id: agg.min:ruby:v1
|
|
20
20
|
fn: agg.min
|
|
21
|
-
|
|
21
|
+
# Skips nil values (an inner reduction over an empty array yields nil),
|
|
22
|
+
# matching the javascript kernel's null handling.
|
|
23
|
+
inline: "= $1 if !$1.nil? && $1 < $0"
|
|
22
24
|
impl: "(a, b)\n a < b ? a : b"
|
|
23
25
|
fold_inline: "= $0.min"
|
|
24
26
|
|
|
25
27
|
- id: agg.max:ruby:v1
|
|
26
28
|
fn: agg.max
|
|
27
|
-
|
|
29
|
+
# Skips nil values (an inner reduction over an empty array yields nil),
|
|
30
|
+
# matching the javascript kernel's null handling.
|
|
31
|
+
inline: "= $1 if !$1.nil? && $1 > $0"
|
|
28
32
|
impl: "(a, b)\n a > b ? a : b"
|
|
29
33
|
fold_inline: "= $0.max"
|
|
@@ -7,6 +7,16 @@ kernels:
|
|
|
7
7
|
fn: core.mod
|
|
8
8
|
inline: "= $0 % $1"
|
|
9
9
|
|
|
10
|
+
- id: max:ruby:v1
|
|
11
|
+
fn: core.max
|
|
12
|
+
inline: "= $0 > $1 ? $0 : $1"
|
|
13
|
+
impl: "(a, b)\n a > b ? a : b"
|
|
14
|
+
|
|
15
|
+
- id: min:ruby:v1
|
|
16
|
+
fn: core.min
|
|
17
|
+
inline: "= $0 < $1 ? $0 : $1"
|
|
18
|
+
impl: "(a, b)\n a < b ? a : b"
|
|
19
|
+
|
|
10
20
|
- id: add:ruby:v1
|
|
11
21
|
fn: core.add
|
|
12
22
|
inline: "= $0 + $1"
|
|
@@ -39,5 +49,5 @@ kernels:
|
|
|
39
49
|
|
|
40
50
|
- id: clamp:ruby:v1
|
|
41
51
|
fn: core.clamp
|
|
42
|
-
inline: "=
|
|
43
|
-
impl: "(x, lo, hi)\n
|
|
52
|
+
inline: "= $0.clamp($1, $2)"
|
|
53
|
+
impl: "(x, lo, hi)\n x.clamp(lo, hi)"
|
data/docs/AGENTS.md
ADDED
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Agent Reference
|
|
2
|
+
|
|
3
|
+
A toolbox for inspecting and debugging the compiler pipeline. The pipeline is
|
|
4
|
+
SNAST → DFIR → VecIR → LoopIR → Ruby/JS emitters; see
|
|
5
|
+
[ARCHITECTURE.md](ARCHITECTURE.md).
|
|
6
|
+
|
|
7
|
+
## Inspect One Layer for One Schema
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
bundle exec bin/kumi pp <repr> <schema.kumi>
|
|
11
|
+
# reprs: ast, input_plan, nast, snast, dfir, dfir_optimized, vecir, loopir,
|
|
12
|
+
# schema_ruby, schema_javascript
|
|
13
|
+
bundle exec bin/kumi pp loopir golden/multi_loop_reduction/schema.kumi
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
This is the fastest way to surface a lowering crash in a specific layer.
|
|
17
|
+
|
|
18
|
+
## Sweep for Crashes
|
|
19
|
+
|
|
20
|
+
```bash
|
|
21
|
+
for d in golden/*/; do
|
|
22
|
+
bundle exec bin/kumi pp loopir "$d/schema.kumi" >/dev/null || echo "$d"
|
|
23
|
+
done
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
## Phase-Scoped Golden Checks
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
bundle exec bin/kumi golden_v2 verify --repr loop # one layer, all schemas
|
|
30
|
+
bundle exec bin/kumi golden_v2 diff --repr df <schema> # unified diff
|
|
31
|
+
bundle exec bin/kumi golden_v2 update --repr vec,loop # regenerate layers
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Groups: `frontend`, `df`, `vec`, `loop`, `codegen`, `all`.
|
|
35
|
+
|
|
36
|
+
## Runtime Ground Truth
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
bundle exec bin/kumi golden test # regenerate + execute Ruby and JS
|
|
40
|
+
bundle exec bin/kumi golden test <schema>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Search Goldens Instead of Reading Them
|
|
44
|
+
|
|
45
|
+
Some golden artifacts are large (`game_of_life`, `us_tax_2024`) — grep them:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
rg -n "reduce" golden -g"dfir*.txt"
|
|
49
|
+
rg -n "axis_shift" golden -g"vecir.txt"
|
|
50
|
+
rg -n "function" golden/<schema>/expected/loopir.txt
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Other Useful Commands
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
bundle exec bin/kumi analyze <schema> --dump <state_key> # inspect analyzer state
|
|
57
|
+
bundle exec rspec # full test suite
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
`tmp/` is gitignored and a good place for debug scripts.
|