kumi 0.0.33 → 0.0.36
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 +22 -0
- data/README.md +38 -26
- 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 +10 -0
- 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 +85 -205
- 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 +9 -9
- 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 +40 -30
- 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 -41
- data/golden/array_operations/expected/schema_ruby.rb +40 -36
- 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 -11
- data/golden/cascade_logic/expected/schema_ruby.rb +21 -11
- 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 -91
- data/golden/chained_fusion/expected/schema_ruby.rb +87 -83
- 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 -19
- 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 -79
- data/golden/element_arrays/expected/schema_ruby.rb +77 -66
- 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 +37 -35
- data/golden/empty_and_null_inputs/expected/vecir.txt +25 -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/loopir.txt +10 -0
- data/golden/example_xpto/expected/schema_javascript.mjs +8 -5
- data/golden/example_xpto/expected/schema_ruby.rb +10 -5
- data/golden/example_xpto/expected/vecir.txt +10 -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 +18 -9
- 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 -90
- data/golden/game_of_life/expected/schema_ruby.rb +799 -90
- 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 -24
- data/golden/hash_keys/expected/schema_ruby.rb +14 -25
- 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 -34
- data/golden/hash_value/expected/schema_ruby.rb +28 -31
- 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 -100
- data/golden/hierarchical_complex/expected/schema_ruby.rb +114 -85
- 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 -35
- data/golden/inline_rename_scope_leak/expected/schema_ruby.rb +31 -32
- 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 +30 -25
- 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 -65
- data/golden/interleaved_fusion/expected/schema_ruby.rb +65 -63
- 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 -6
- data/golden/let_inline/expected/schema_ruby.rb +29 -6
- 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 -49
- data/golden/loop_fusion/expected/schema_ruby.rb +49 -47
- 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 -51
- data/golden/min_reduce_scope/expected/schema_ruby.rb +50 -46
- 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 -40
- data/golden/mixed_dimensions/expected/schema_ruby.rb +38 -36
- 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 -99
- data/golden/multirank_hoisting/expected/schema_ruby.rb +151 -90
- 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 -4
- data/golden/nested_hash/expected/schema_ruby.rb +6 -4
- 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 +59 -59
- 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 -46
- data/golden/roll/expected/schema_ruby.rb +36 -42
- data/golden/roll/expected/vecir.txt +16 -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/loopir.txt +19 -0
- data/golden/schema_imports_broadcasting_with_imports/expected/schema_javascript.mjs +21 -16
- data/golden/schema_imports_broadcasting_with_imports/expected/schema_ruby.rb +17 -14
- data/golden/schema_imports_broadcasting_with_imports/expected/vecir.txt +13 -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/loopir.txt +202 -0
- data/golden/schema_imports_complex_order_calc/expected/schema_javascript.mjs +221 -117
- data/golden/schema_imports_complex_order_calc/expected/schema_ruby.rb +192 -107
- data/golden/schema_imports_complex_order_calc/expected/snast.txt +1 -1
- data/golden/schema_imports_complex_order_calc/expected/vecir.txt +168 -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/loopir.txt +29 -0
- data/golden/schema_imports_composed_order/expected/schema_javascript.mjs +28 -22
- data/golden/schema_imports_composed_order/expected/schema_ruby.rb +29 -19
- data/golden/schema_imports_composed_order/expected/vecir.txt +29 -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/loopir.txt +31 -0
- data/golden/schema_imports_discount_with_tax/expected/schema_javascript.mjs +30 -21
- data/golden/schema_imports_discount_with_tax/expected/schema_ruby.rb +31 -17
- data/golden/schema_imports_discount_with_tax/expected/vecir.txt +31 -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/loopir.txt +35 -0
- data/golden/schema_imports_line_items/expected/schema_javascript.mjs +36 -12
- data/golden/schema_imports_line_items/expected/schema_ruby.rb +35 -11
- data/golden/schema_imports_line_items/expected/snast.txt +1 -1
- data/golden/schema_imports_line_items/expected/vecir.txt +26 -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/loopir.txt +34 -0
- data/golden/schema_imports_multiple/expected/schema_javascript.mjs +33 -24
- data/golden/schema_imports_multiple/expected/schema_ruby.rb +34 -20
- data/golden/schema_imports_multiple/expected/vecir.txt +34 -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/loopir.txt +24 -0
- data/golden/schema_imports_nested_expressions/expected/schema_javascript.mjs +21 -17
- data/golden/schema_imports_nested_expressions/expected/schema_ruby.rb +23 -16
- data/golden/schema_imports_nested_expressions/expected/vecir.txt +24 -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/loopir.txt +68 -0
- data/golden/schema_imports_nested_with_reductions/expected/schema_javascript.mjs +76 -37
- data/golden/schema_imports_nested_with_reductions/expected/schema_ruby.rb +64 -34
- data/golden/schema_imports_nested_with_reductions/expected/snast.txt +1 -1
- data/golden/schema_imports_nested_with_reductions/expected/vecir.txt +44 -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/loopir.txt +9 -0
- data/golden/schema_imports_with_imports/expected/schema_javascript.mjs +8 -6
- data/golden/schema_imports_with_imports/expected/schema_ruby.rb +9 -5
- data/golden/schema_imports_with_imports/expected/vecir.txt +9 -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 -76
- data/golden/shift/expected/schema_ruby.rb +60 -70
- 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 -260
- data/golden/shift_2d/expected/schema_ruby.rb +156 -236
- 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 -14
- data/golden/simple_math/expected/schema_ruby.rb +21 -14
- 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 -67
- data/golden/streaming_basics/expected/schema_ruby.rb +69 -60
- 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 -18
- data/golden/tuples/expected/schema_ruby.rb +42 -14
- 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 -42
- data/golden/tuples_and_arrays/expected/schema_ruby.rb +41 -38
- 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 -119
- data/golden/us_tax_2024/expected/schema_ruby.rb +762 -125
- 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 -3
- data/golden/with_constants/expected/schema_ruby.rb +9 -3
- data/golden/with_constants/expected/vecir.txt +9 -0
- data/lib/kumi/analyzer.rb +20 -27
- data/lib/kumi/core/analyzer/pass_manager.rb +6 -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/df_validate_pass.rb +24 -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/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/dev/golden/representation.rb +4 -7
- data/lib/kumi/dev/golden_v2.rb +292 -0
- data/lib/kumi/dev/pretty_printer.rb +42 -67
- 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/support/nast_printer.rb +3 -0
- data/lib/kumi/version.rb +1 -1
- data/lib/kumi.rb +38 -37
- data/tasks/release.rake +129 -0
- metadata +298 -331
- data/CLAUDE.md +0 -45
- data/docs/COMPOSED_SCHEMAS.md +0 -137
- 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 -43
- 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 -23
- 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 -87
- 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 -77
- 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/example_xpto/expected/lir_00_unoptimized.txt +0 -16
- data/golden/example_xpto/expected/lir_01_hoist_scalar_references.txt +0 -16
- data/golden/example_xpto/expected/lir_02_inlined.txt +0 -16
- data/golden/example_xpto/expected/lir_03_cse.txt +0 -16
- data/golden/example_xpto/expected/lir_04_1_loop_fusion.txt +0 -16
- data/golden/example_xpto/expected/lir_04_loop_invcm.txt +0 -16
- data/golden/example_xpto/expected/lir_06_const_prop.txt +0 -13
- 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 -719
- 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 -12
- 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 -30
- 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 -80
- 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 -45
- 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 -69
- 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 -29
- 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 -51
- 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 -57
- 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 -47
- 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 -100
- 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 -9
- 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 -48
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_00_unoptimized.txt +0 -20
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -20
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_02_inlined.txt +0 -22
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_03_cse.txt +0 -21
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_1_loop_fusion.txt +0 -21
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_04_loop_invcm.txt +0 -21
- data/golden/schema_imports_broadcasting_with_imports/expected/lir_06_const_prop.txt +0 -21
- data/golden/schema_imports_complex_order_calc/expected/lir_00_unoptimized.txt +0 -94
- data/golden/schema_imports_complex_order_calc/expected/lir_01_hoist_scalar_references.txt +0 -94
- data/golden/schema_imports_complex_order_calc/expected/lir_02_inlined.txt +0 -187
- data/golden/schema_imports_complex_order_calc/expected/lir_03_cse.txt +0 -131
- data/golden/schema_imports_complex_order_calc/expected/lir_04_1_loop_fusion.txt +0 -131
- data/golden/schema_imports_complex_order_calc/expected/lir_04_loop_invcm.txt +0 -131
- data/golden/schema_imports_complex_order_calc/expected/lir_06_const_prop.txt +0 -131
- data/golden/schema_imports_composed_order/expected/lir_00_unoptimized.txt +0 -25
- data/golden/schema_imports_composed_order/expected/lir_01_hoist_scalar_references.txt +0 -25
- data/golden/schema_imports_composed_order/expected/lir_02_inlined.txt +0 -33
- data/golden/schema_imports_composed_order/expected/lir_03_cse.txt +0 -33
- data/golden/schema_imports_composed_order/expected/lir_04_1_loop_fusion.txt +0 -33
- data/golden/schema_imports_composed_order/expected/lir_04_loop_invcm.txt +0 -33
- data/golden/schema_imports_composed_order/expected/lir_06_const_prop.txt +0 -33
- data/golden/schema_imports_discount_with_tax/expected/lir_00_unoptimized.txt +0 -30
- data/golden/schema_imports_discount_with_tax/expected/lir_01_hoist_scalar_references.txt +0 -30
- data/golden/schema_imports_discount_with_tax/expected/lir_02_inlined.txt +0 -37
- data/golden/schema_imports_discount_with_tax/expected/lir_03_cse.txt +0 -34
- data/golden/schema_imports_discount_with_tax/expected/lir_04_1_loop_fusion.txt +0 -34
- data/golden/schema_imports_discount_with_tax/expected/lir_04_loop_invcm.txt +0 -34
- data/golden/schema_imports_discount_with_tax/expected/lir_06_const_prop.txt +0 -34
- data/golden/schema_imports_line_items/expected/lir_00_unoptimized.txt +0 -19
- data/golden/schema_imports_line_items/expected/lir_01_hoist_scalar_references.txt +0 -19
- data/golden/schema_imports_line_items/expected/lir_02_inlined.txt +0 -24
- data/golden/schema_imports_line_items/expected/lir_03_cse.txt +0 -22
- data/golden/schema_imports_line_items/expected/lir_04_1_loop_fusion.txt +0 -22
- data/golden/schema_imports_line_items/expected/lir_04_loop_invcm.txt +0 -22
- data/golden/schema_imports_line_items/expected/lir_06_const_prop.txt +0 -22
- data/golden/schema_imports_multiple/expected/lir_00_unoptimized.txt +0 -29
- data/golden/schema_imports_multiple/expected/lir_01_hoist_scalar_references.txt +0 -29
- data/golden/schema_imports_multiple/expected/lir_02_inlined.txt +0 -41
- data/golden/schema_imports_multiple/expected/lir_03_cse.txt +0 -37
- data/golden/schema_imports_multiple/expected/lir_04_1_loop_fusion.txt +0 -37
- data/golden/schema_imports_multiple/expected/lir_04_loop_invcm.txt +0 -37
- data/golden/schema_imports_multiple/expected/lir_06_const_prop.txt +0 -37
- data/golden/schema_imports_nested_expressions/expected/lir_00_unoptimized.txt +0 -22
- data/golden/schema_imports_nested_expressions/expected/lir_01_hoist_scalar_references.txt +0 -22
- data/golden/schema_imports_nested_expressions/expected/lir_02_inlined.txt +0 -32
- data/golden/schema_imports_nested_expressions/expected/lir_03_cse.txt +0 -32
- data/golden/schema_imports_nested_expressions/expected/lir_04_1_loop_fusion.txt +0 -32
- data/golden/schema_imports_nested_expressions/expected/lir_04_loop_invcm.txt +0 -32
- data/golden/schema_imports_nested_expressions/expected/lir_06_const_prop.txt +0 -28
- data/golden/schema_imports_nested_with_reductions/expected/lir_00_unoptimized.txt +0 -31
- data/golden/schema_imports_nested_with_reductions/expected/lir_01_hoist_scalar_references.txt +0 -31
- data/golden/schema_imports_nested_with_reductions/expected/lir_02_inlined.txt +0 -58
- data/golden/schema_imports_nested_with_reductions/expected/lir_03_cse.txt +0 -49
- data/golden/schema_imports_nested_with_reductions/expected/lir_04_1_loop_fusion.txt +0 -51
- data/golden/schema_imports_nested_with_reductions/expected/lir_04_loop_invcm.txt +0 -49
- data/golden/schema_imports_nested_with_reductions/expected/lir_06_const_prop.txt +0 -49
- data/golden/schema_imports_with_imports/expected/lir_00_unoptimized.txt +0 -13
- data/golden/schema_imports_with_imports/expected/lir_01_hoist_scalar_references.txt +0 -13
- data/golden/schema_imports_with_imports/expected/lir_02_inlined.txt +0 -14
- data/golden/schema_imports_with_imports/expected/lir_03_cse.txt +0 -13
- data/golden/schema_imports_with_imports/expected/lir_04_1_loop_fusion.txt +0 -13
- data/golden/schema_imports_with_imports/expected/lir_04_loop_invcm.txt +0 -13
- data/golden/schema_imports_with_imports/expected/lir_06_const_prop.txt +0 -13
- 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 -78
- 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 -238
- 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 -28
- 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 -78
- 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 -31
- 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 -47
- 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 -549
- 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 -12
- data/lib/kumi/core/analyzer/passes/codegen/js/declaration_emitter.rb +0 -337
- 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 -330
- data/lib/kumi/core/analyzer/passes/codegen/ruby/emitter.rb +0 -85
- data/lib/kumi/core/analyzer/passes/codegen/ruby/output_buffer.rb +0 -79
- data/lib/kumi/core/analyzer/passes/codegen/ruby_pass.rb +0 -32
- data/lib/kumi/core/analyzer/passes/lir/constant_propagation_pass.rb +0 -125
- 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 -422
- 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 -390
- data/lib/kumi/core/lir/emit.rb +0 -62
- data/lib/kumi/core/lir/peephole.rb +0 -164
- 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 -159
data/docs/ARCHITECTURE.md
CHANGED
|
@@ -1,277 +1,141 @@
|
|
|
1
|
-
# Kumi
|
|
1
|
+
# Kumi Compiler Architecture
|
|
2
|
+
|
|
3
|
+
Kumi compiles schemas through a series of explicit semantic layers. Each layer
|
|
4
|
+
owns one kind of transformation, invariants are validated at layer boundaries,
|
|
5
|
+
and the backends emit syntax from fully normalized IR — never meaning from
|
|
6
|
+
partially-lowered IR.
|
|
7
|
+
|
|
8
|
+
## Pipeline
|
|
9
|
+
|
|
10
|
+
```text
|
|
11
|
+
Schema source (.kumi text or Ruby DSL)
|
|
12
|
+
-> AST parser output
|
|
13
|
+
-> NAST normalized AST
|
|
14
|
+
-> SNAST semantic AST with dimensional/type stamps
|
|
15
|
+
-> DFIR dataflow graph; access paths, imports, structural cleanup
|
|
16
|
+
-> VecIR axis-aware value semantics; every value stamped axes+dtype
|
|
17
|
+
-> LoopIR explicit execution structure: loops, accumulators, reads
|
|
18
|
+
-> Emitters Ruby / JavaScript serialization
|
|
19
|
+
```
|
|
2
20
|
|
|
3
|
-
|
|
21
|
+
The analyzer (`lib/kumi/analyzer.rb`) drives this as three pass groups:
|
|
4
22
|
|
|
5
|
-
|
|
23
|
+
- `DEFAULT_PASSES` — name indexing, imports, input collection, validation,
|
|
24
|
+
dependency resolution, topo ordering, input access planning
|
|
25
|
+
- `LOWERING_PASSES` — NAST → SNAST → DFIR → VecIR → LoopIR, with a validator
|
|
26
|
+
pass after each IR boundary
|
|
27
|
+
- `TARGET_PASSES` — `Codegen::LoopRubyPass` and `Codegen::LoopJsPass`, which
|
|
28
|
+
serialize LoopIR
|
|
6
29
|
|
|
7
|
-
##
|
|
30
|
+
## Layer Responsibilities
|
|
8
31
|
|
|
9
|
-
|
|
10
|
-
┌─────────────────────────────────────┐
|
|
11
|
-
│ Function & Kernel Definitions │
|
|
12
|
-
├─────────────────────────────────────┤
|
|
13
|
-
│ data/functions/*.yaml │
|
|
14
|
-
│ data/kernels/**/*.yaml │
|
|
15
|
-
└──────────────┬──────────────────────┘
|
|
16
|
-
│
|
|
17
|
-
┌──────▼──────┐
|
|
18
|
-
│ bin/kumi- │
|
|
19
|
-
│ doc-gen │
|
|
20
|
-
└──────┬──────┘
|
|
21
|
-
│
|
|
22
|
-
┌────────┴────────┐
|
|
23
|
-
│ │
|
|
24
|
-
┌──▼───┐ ┌─────▼──────┐
|
|
25
|
-
│ JSON │ │ Markdown │
|
|
26
|
-
│ Data │ │ Reference │
|
|
27
|
-
└──┬───┘ └─────┬──────┘
|
|
28
|
-
│ │
|
|
29
|
-
┌───▼──────────┐ ┌───▼─────────────────┐
|
|
30
|
-
│ IDE Tools │ │ Developers/Docs │
|
|
31
|
-
├──────────────┤ ├─────────────────────┤
|
|
32
|
-
│ VSCode │ │ docs/FUNCTIONS.md │
|
|
33
|
-
│ Monaco │ │ GitHub Reference │
|
|
34
|
-
│ LSP Servers │ │ API Documentation │
|
|
35
|
-
└──────────────┘ └─────────────────────┘
|
|
36
|
-
```
|
|
32
|
+
### Frontend: AST, NAST, SNAST
|
|
37
33
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
### 1. Data Sources
|
|
41
|
-
|
|
42
|
-
**Function Definitions** (`data/functions/*.yaml`)
|
|
43
|
-
```yaml
|
|
44
|
-
functions:
|
|
45
|
-
- id: agg.sum
|
|
46
|
-
kind: reduce
|
|
47
|
-
params: [{ name: source_value }]
|
|
48
|
-
dtype: { rule: same_as, param: source_value }
|
|
49
|
-
reduction_strategy: identity # KEY: Identity-based reducer
|
|
50
|
-
aliases: ["sum"]
|
|
51
|
-
|
|
52
|
-
- id: agg.min
|
|
53
|
-
kind: reduce
|
|
54
|
-
params: [{ name: source_value }]
|
|
55
|
-
dtype: { rule: element_of, param: source_value }
|
|
56
|
-
reduction_strategy: first_element # KEY: First-element reducer
|
|
57
|
-
aliases: ["min"]
|
|
58
|
-
```
|
|
34
|
+
Source-language normalization and semantic preparation.
|
|
59
35
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
- id: agg.sum:ruby:v1
|
|
64
|
-
fn: agg.sum
|
|
65
|
-
inline: "+= $1"
|
|
66
|
-
impl: "(a,b)\n a + b"
|
|
67
|
-
fold_inline: "= $0.sum"
|
|
68
|
-
identity:
|
|
69
|
-
float: 0.0
|
|
70
|
-
integer: 0
|
|
71
|
-
```
|
|
36
|
+
- **AST** — parser output, close to source shape
|
|
37
|
+
- **NAST** — normalized form, removes frontend irregularity; constant folding
|
|
38
|
+
- **SNAST** — carries dimensional and type metadata, explicit enough to lower
|
|
72
39
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
**Location:** `lib/kumi/doc_generator/`
|
|
76
|
-
|
|
77
|
-
#### Loader
|
|
78
|
-
- Parses YAML files from `data/functions/` and `data/kernels/`
|
|
79
|
-
- Returns raw function and kernel definitions
|
|
80
|
-
- No transformation or filtering
|
|
81
|
-
|
|
82
|
-
#### Merger
|
|
83
|
-
- Combines function definitions with kernel implementations
|
|
84
|
-
- Creates entries indexed by function aliases (so `sum`, `add`, `sub` all resolvable)
|
|
85
|
-
- Extracts important metadata:
|
|
86
|
-
- `reduction_strategy` - How the reducer initializes
|
|
87
|
-
- `dtype` - Type inference rules
|
|
88
|
-
- `arity` - Parameter count
|
|
89
|
-
- `kernels` - Available implementations
|
|
90
|
-
|
|
91
|
-
#### Formatters
|
|
92
|
-
|
|
93
|
-
**Json Formatter**
|
|
94
|
-
- Output: `docs/functions-reference.json`
|
|
95
|
-
- Consumer: IDE plugins (VSCode, Monaco, etc.)
|
|
96
|
-
- Data:
|
|
97
|
-
- Function ID and aliases
|
|
98
|
-
- Arity and parameter info
|
|
99
|
-
- Type information
|
|
100
|
-
- Kernel availability
|
|
101
|
-
- **Reduction strategy** (for reducer distinction)
|
|
102
|
-
|
|
103
|
-
**Markdown Formatter**
|
|
104
|
-
- Output: `docs/FUNCTIONS.md`
|
|
105
|
-
- Consumer: Developers, documentation sites
|
|
106
|
-
- Presentation:
|
|
107
|
-
- Human-readable function descriptions
|
|
108
|
-
- Inline operations (`$0 = accumulator, $1 = element`)
|
|
109
|
-
- Actual implementation code
|
|
110
|
-
- Fold strategies
|
|
111
|
-
- Identity values (when applicable)
|
|
112
|
-
- **Reduction semantics** (monoid vs first-element)
|
|
113
|
-
|
|
114
|
-
### 3. VSCode Extension
|
|
115
|
-
|
|
116
|
-
**Location:** `vscode-extension/`
|
|
117
|
-
|
|
118
|
-
**Features:**
|
|
119
|
-
- Autocomplete for functions when typing `fn(:`
|
|
120
|
-
- Hover tooltips with signatures
|
|
121
|
-
- Schema block context detection (Ruby files only)
|
|
122
|
-
- Works with `.kumi` and `.rb` files
|
|
123
|
-
|
|
124
|
-
**Components:**
|
|
125
|
-
- `FunctionCompletionProvider` - Offers suggestions
|
|
126
|
-
- `FunctionHoverProvider` - Shows detailed information
|
|
127
|
-
- `isInSchemaBlock()` - Detects if inside `schema do...end` block (Ruby files)
|
|
128
|
-
|
|
129
|
-
## Key Design Decisions
|
|
130
|
-
|
|
131
|
-
### 1. Reduction Strategy Distinction
|
|
132
|
-
|
|
133
|
-
**Problem:** Min/Max don't have identity values like Sum/Count do.
|
|
134
|
-
|
|
135
|
-
**Solution:** Capture `reduction_strategy` from YAML:
|
|
136
|
-
- `identity` → Monoid operation, can use identity element
|
|
137
|
-
- `first_element` → First array element initializes accumulator
|
|
138
|
-
|
|
139
|
-
**Display:**
|
|
140
|
-
- Markdown shows: "Monoid operation with identity element" or "First element is initial value"
|
|
141
|
-
- JSON includes: `"reduction_strategy": "identity" | "first_element"`
|
|
142
|
-
|
|
143
|
-
### 2. Kernel Implementation Visibility
|
|
144
|
-
|
|
145
|
-
**Decision:** Show actual kernel code inline in markdown.
|
|
146
|
-
|
|
147
|
-
**Benefits:**
|
|
148
|
-
- Developers see what the function actually does
|
|
149
|
-
- Inline operations (`+= $1` vs `= $1 if $1 < $0`) show the pattern
|
|
150
|
-
- Implementation code is actual Ruby/JavaScript
|
|
151
|
-
|
|
152
|
-
**Format:**
|
|
153
|
-
```markdown
|
|
154
|
-
**Inline:** `+= $1` ($0 = accumulator, $1 = element)
|
|
155
|
-
**Implementation:**
|
|
156
|
-
```ruby
|
|
157
|
-
(a,b)
|
|
158
|
-
a + b
|
|
159
|
-
```
|
|
160
|
-
**Fold:** `= $0.sum`
|
|
161
|
-
**Identity:** float: 0.0, integer: 0
|
|
162
|
-
```
|
|
40
|
+
Unsatisfiable-constraint detection and the output/input form schemas are
|
|
41
|
+
derived at this stage.
|
|
163
42
|
|
|
164
|
-
###
|
|
43
|
+
### DFIR
|
|
165
44
|
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
YAML definitions
|
|
169
|
-
↓
|
|
170
|
-
bin/kumi-doc-gen (one command)
|
|
171
|
-
↓
|
|
172
|
-
├→ docs/FUNCTIONS.md (auto-generated)
|
|
173
|
-
├→ docs/functions-reference.json (auto-generated)
|
|
174
|
-
└→ IDE/Tools consume JSON
|
|
175
|
-
```
|
|
45
|
+
The first graph-shaped semantic layer.
|
|
176
46
|
|
|
177
|
-
|
|
178
|
-
-
|
|
179
|
-
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
**Ruby files:** Only offer completions inside `schema do...end` blocks
|
|
185
|
-
- Prevents noise from unrelated `fn(:` calls
|
|
186
|
-
- Tracks brace nesting to detect context
|
|
187
|
-
|
|
188
|
-
**Kumi files:** Always available
|
|
189
|
-
- Native language file type
|
|
190
|
-
|
|
191
|
-
## Data Model
|
|
192
|
-
|
|
193
|
-
### Function Entry (After Merge)
|
|
194
|
-
```json
|
|
195
|
-
{
|
|
196
|
-
"id": "agg.sum",
|
|
197
|
-
"kind": "reduce",
|
|
198
|
-
"arity": 1,
|
|
199
|
-
"params": [{ "name": "source_value" }],
|
|
200
|
-
"dtype": { "rule": "same_as", "param": "source_value" },
|
|
201
|
-
"aliases": ["sum"],
|
|
202
|
-
"reduction_strategy": "identity",
|
|
203
|
-
"kernels": {
|
|
204
|
-
"ruby": {
|
|
205
|
-
"id": "agg.sum:ruby:v1",
|
|
206
|
-
"inline": "+= $1",
|
|
207
|
-
"impl": "(a,b)\n a + b",
|
|
208
|
-
"fold_inline": "= $0.sum",
|
|
209
|
-
"identity": { "float": 0.0, "integer": 0 }
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
```
|
|
47
|
+
- lowers SNAST into per-declaration dataflow functions
|
|
48
|
+
- normalizes input traversal and access paths against the input plans
|
|
49
|
+
- inlines declaration references and **schema imports** (callee bodies are
|
|
50
|
+
spliced in; axis names and plan references are canonicalized to the
|
|
51
|
+
caller's input plans at this boundary)
|
|
52
|
+
- canonicalizes tuples/objects, runs CSE, dedup, and broadcast cleanup
|
|
214
53
|
|
|
215
|
-
|
|
54
|
+
Bugs about input access, import behavior, or graph structure belong here.
|
|
216
55
|
|
|
217
|
-
###
|
|
56
|
+
### VecIR
|
|
218
57
|
|
|
219
|
-
|
|
220
|
-
```bash
|
|
221
|
-
# Markdown documentation
|
|
222
|
-
open docs/FUNCTIONS.md
|
|
58
|
+
Pure, declarative, axis-aware value semantics.
|
|
223
59
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
60
|
+
- every value is stamped with `axes` (named, ordered) and `dtype`
|
|
61
|
+
- broadcasts, shifts, indices, maps, selects, and reductions are explicit ops
|
|
62
|
+
- deterministic vector-level rewrites (GVN, canonicalization)
|
|
63
|
+
- no execution, storage, or target concerns
|
|
228
64
|
|
|
229
|
-
|
|
65
|
+
See [lib/kumi/ir/vec_definition.md](../lib/kumi/ir/vec_definition.md).
|
|
230
66
|
|
|
231
|
-
|
|
232
|
-
1. Update `data/functions/category/*.yaml`
|
|
233
|
-
2. Run `bin/kumi-doc-gen`
|
|
234
|
-
3. Commit both YAML and generated files
|
|
67
|
+
### LoopIR
|
|
235
68
|
|
|
236
|
-
|
|
237
|
-
```yaml
|
|
238
|
-
- id: agg.product
|
|
239
|
-
kind: reduce
|
|
240
|
-
params: [{ name: source_value }]
|
|
241
|
-
reduction_strategy: identity
|
|
242
|
-
aliases: ["product"]
|
|
243
|
-
```
|
|
244
|
-
Add kernel in `data/kernels/ruby/agg/numeric.yaml`, then regenerate docs.
|
|
69
|
+
The execution layer. Lowering from VecIR materializes:
|
|
245
70
|
|
|
246
|
-
|
|
71
|
+
- loop nests (`loop_start`/`loop_end`) over axis carrier arrays
|
|
72
|
+
- reductions as `acc_init`/`acc_step`/`acc_load`
|
|
73
|
+
- `axis_index` as loop index registers; `axis_shift` as policy-explicit
|
|
74
|
+
shifted reads
|
|
75
|
+
- materialization (`array_init`/`array_push`/`index_read`) for values that
|
|
76
|
+
cross loop boundaries
|
|
247
77
|
|
|
248
|
-
|
|
78
|
+
After LoopIR, emitters never infer axes, rediscover broadcasts, or branch on
|
|
79
|
+
rank. If a backend still needs vector semantics to emit code, LoopIR is not
|
|
80
|
+
finished.
|
|
249
81
|
|
|
250
|
-
|
|
251
|
-
2. **New generators** (TypeScript definitions, GraphQL schema)
|
|
252
|
-
3. **New IDE support** (Neovim, Emacs plugins via LSP)
|
|
253
|
-
4. **Validation** (against declared types/arity)
|
|
82
|
+
See [lib/kumi/ir/loop_definition.md](../lib/kumi/ir/loop_definition.md).
|
|
254
83
|
|
|
255
|
-
|
|
84
|
+
### BufIR
|
|
256
85
|
|
|
257
|
-
|
|
86
|
+
A reserved boundary for storage concerns (allocation, lifetimes, layout).
|
|
87
|
+
LoopIR currently stays a pure execution layer and emitters serialize it
|
|
88
|
+
directly, so BufIR remains a stub. It becomes a real phase only if LoopIR
|
|
89
|
+
starts absorbing storage policy or emitters need layout knowledge.
|
|
258
90
|
|
|
259
|
-
|
|
260
|
-
- All 944 existing Kumi tests pass
|
|
261
|
-
- No regression in core functionality
|
|
91
|
+
### Emitters
|
|
262
92
|
|
|
263
|
-
|
|
93
|
+
Mechanical serializers (`Codegen::Loop::Ruby::Emitter`,
|
|
94
|
+
`Codegen::Loop::Js::Emitter`). Every LoopIR opcode maps to a fixed syntax
|
|
95
|
+
shape; emitters own naming, literal formatting, and kernel
|
|
96
|
+
inlining/helper emission — nothing semantic.
|
|
264
97
|
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
98
|
+
The architecture is healthy when emitter code is boring.
|
|
99
|
+
|
|
100
|
+
## Boundary Validators
|
|
101
|
+
|
|
102
|
+
Each IR boundary ends with a validator pass — the executable form of the
|
|
103
|
+
layer contract, not optional diagnostics:
|
|
104
|
+
|
|
105
|
+
- **`DFValidatePass`** — legal op families, access-path rules, root-only
|
|
106
|
+
`load_input`, object/tuple sanity
|
|
107
|
+
- **`VecValidatePass`** — axes/dtype present on every value, broadcast and
|
|
108
|
+
reduction shape rules
|
|
109
|
+
- **`LoopValidatePass`** — only execution opcodes, balanced loops,
|
|
110
|
+
defs-before-use, defined returns
|
|
111
|
+
|
|
112
|
+
Validator specs include negative cases for illegal states, not only golden
|
|
113
|
+
snapshots of successful pipelines.
|
|
114
|
+
|
|
115
|
+
## Ownership Rule
|
|
116
|
+
|
|
117
|
+
When deciding where a fix belongs:
|
|
118
|
+
|
|
119
|
+
- meaning, traversal, axes, broadcast, or reduction semantics → DFIR / VecIR /
|
|
120
|
+
LoopIR
|
|
121
|
+
- materialization, layout, ownership, temporary storage → BufIR
|
|
122
|
+
- emitted target syntax only → the emitter
|
|
123
|
+
|
|
124
|
+
If a backend patch compensates for an earlier semantic bug, it is in the
|
|
125
|
+
wrong place.
|
|
126
|
+
|
|
127
|
+
## Verification
|
|
128
|
+
|
|
129
|
+
Verification is staged. Each layer can be inspected and verified without
|
|
130
|
+
running the later ones:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
bundle exec bin/kumi pp <repr> <schema.kumi> # print one layer
|
|
134
|
+
bundle exec bin/kumi golden_v2 verify --repr <group> # snapshot-check a layer
|
|
135
|
+
bundle exec bin/kumi golden test # runtime ground truth
|
|
136
|
+
```
|
|
270
137
|
|
|
271
|
-
|
|
138
|
+
Repr groups: `frontend`, `df`, `vec`, `loop`, `codegen`. Golden failures
|
|
139
|
+
identify which layer regressed, not just that "something failed later".
|
|
272
140
|
|
|
273
|
-
|
|
274
|
-
2. **Type validation**: Check function call arity at compile time
|
|
275
|
-
3. **IDE diagnostics**: Show type mismatches as you type
|
|
276
|
-
4. **Documentation linking**: Cross-reference related functions
|
|
277
|
-
5. **Kernel visualization**: Show kernel implementations side-by-side
|
|
141
|
+
See [GOLDEN_TESTS.md](GOLDEN_TESTS.md).
|
data/docs/DEVELOPMENT.md
CHANGED
|
@@ -79,6 +79,19 @@ bin/kumi golden test # Run all tests
|
|
|
79
79
|
bin/kumi golden update EXAMPLE # Regenerate expected files
|
|
80
80
|
```
|
|
81
81
|
|
|
82
|
+
## Debugging the Compiler Pipeline
|
|
83
|
+
|
|
84
|
+
The pipeline (SNAST → DFIR → VecIR → LoopIR → emitters) can be inspected one
|
|
85
|
+
layer at a time — see [ARCHITECTURE.md](ARCHITECTURE.md):
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
bin/kumi pp loopir <schema.kumi> # print one representation
|
|
89
|
+
bin/kumi golden_v2 verify --repr df # snapshot-check one layer
|
|
90
|
+
bin/kumi golden_v2 diff --repr codegen <name> # unified diff for a schema
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
[AGENTS.md](AGENTS.md) collects more inspection recipes.
|
|
94
|
+
|
|
82
95
|
---
|
|
83
96
|
|
|
84
97
|
*For more development documentation, see the other guides in this directory.*
|