From ff8f492853313e9d4b0fa7cb2690a6122b0bd17a Mon Sep 17 00:00:00 2001 From: Rohank3 Date: Sun, 12 Apr 2026 13:56:17 +0530 Subject: [PATCH 1/5] Added docs file for relational_fusion --- docs/usage/relational_fusion.md | 192 ++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 docs/usage/relational_fusion.md diff --git a/docs/usage/relational_fusion.md b/docs/usage/relational_fusion.md new file mode 100644 index 0000000..61fecc2 --- /dev/null +++ b/docs/usage/relational_fusion.md @@ -0,0 +1,192 @@ +# relational_fusion — Usage Guide + +`relational_fusion` performs a hash-join on two relations (left and right) and +computes aggregated summary values over the joined rows. It mirrors a common +database execution strategy: build a hash index on one side, stream the other, +and aggregate on the fly. + +--- + +## Quick CLI usage + +```bash +# benchmark all tasks (relational_fusion included) +python -m chuck bench + +# benchmark only relational_fusion +python -m chuck bench --task relational_fusion + +# run regression checks (validates relational_fusion against stored baselines) +python -m chuck regress +``` + +--- + +## Using the Python API directly + +### Generate input data + +`generate(row_count, seed)` creates a synthetic workload of two relations. + +```python +from chuck.tasks.relational_fusion import generate + +payload = generate(row_count=128, seed=42) +print(type(payload)) +# +print(payload.keys()) +# dict_keys(['left', 'right']) +``` + +#### Example input (truncated) + +```python +{ + "left": [ + ("k007", 26), + ("k017", 251), + ("k014", 143), + # ... 128 rows total + ], + "right": [ + ("k028", 144), + ("k027", 188), + ("k017", 474), + # ... 64 rows total (max(4, row_count // 2)) + ], +} +``` + +Each row is a `(key, value)` tuple. Keys are strings like `"k005"`, and values +are random integers in `[1, 999]`. + +--- + +### Solve + +`solve(payload)` performs the join + aggregation and returns summary statistics. + +```python +from chuck.tasks.relational_fusion import generate, solve + +payload = generate(row_count=128, seed=42) +result = solve(payload) +print(result) +``` + +#### Example output + +```python +{ + "left_rows": 128, + "right_rows": 64, + "join_rows": 269, + "aggregate": 273329, +} +``` + +| Field | Description | +|---|---| +| `left_rows` | Number of rows in the left relation | +| `right_rows` | Number of rows in the right relation | +| `join_rows` | Total number of rows produced by the inner join | +| `aggregate` | Sum of `(left_value + right_value)` across all joined row pairs | + +--- + +## End-to-end example script + +```python +"""relational_fusion end-to-end demo.""" + +from chuck.tasks.relational_fusion import generate, solve + +# 1. Generate a workload +payload = generate(row_count=128, seed=10) +print(f"Left rows : {len(payload['left'])}") +print(f"Right rows : {len(payload['right'])}") + +# 2. Solve +result = solve(payload) +print(f"Join rows : {result['join_rows']}") +print(f"Aggregate : {result['aggregate']}") + +# 3. Verify against the known regression baseline (seed=10, size=128) +assert result == { + "left_rows": 128, + "right_rows": 64, + "join_rows": 269, + "aggregate": 276559, +} +print("✓ Output matches regression baseline") +``` + +**Expected terminal output:** + +``` +Left rows : 128 +Right rows : 64 +Join rows : 269 +Aggregate : 276559 +✓ Output matches regression baseline +``` + +--- + +## Benchmarking + +```python +from chuck.benchmarks.relational_fusion import run + +result = run() +print(f"Task : {result['task']}") +print(f"Size : {result['size']}") +print(f"Seconds : {result['seconds']}") +print(f"Output : {result['output']}") +``` + +The benchmark uses `row_count=40_000` (the task's `benchmark_size`) by default, +giving a realistic workload for performance measurement. + +--- + +## How the algorithm works + +1. **Index the right relation** — build a `dict[str, list[int]]` mapping each + key to the list of values on the right side. +2. **Stream the left relation** — for every `(key, left_value)` in the left + table, look up matching right-side values via the hash index. +3. **Aggregate** — for each matched pair, increment `join_rows` and accumulate + `left_value + right_value` into `aggregate`. + +This is a classic hash-join followed by an inline aggregation, equivalent to: + +```sql +SELECT COUNT(*) AS join_rows, + SUM(l.val + r.val) AS aggregate +FROM left_table l +JOIN right_table r ON l.key = r.key; +``` + +--- + +## Native C++ backend + +If the C++ native module is built, `chuck` will automatically use it for faster +execution. The algorithm is identical; only the runtime differs. + +```bash +# build native modules (Linux / macOS / WSL2) +python scripts/setup_native.py + +# benchmark with explicit backend selection +python -m chuck snapshot --label cpp_run --backend cpp +python -m chuck snapshot --label py_run --backend python + +# compare +python -m chuck compare \ + --old data/reports/snapshots/py_run.json \ + --new data/reports/snapshots/cpp_run.json +``` + +See [NATIVE_BINDINGS.md](../NATIVE_BINDINGS.md) for build details. From 1b00d6ba7bf13c4d9d33be63e627a48431a71920 Mon Sep 17 00:00:00 2001 From: Rohank3 Date: Sun, 12 Apr 2026 15:48:58 +0530 Subject: [PATCH 2/5] fix: address moderator review comments on relational_fusion usage doc --- docs/usage/image.png | Bin 0 -> 15885 bytes docs/usage/relational_fusion.md | 108 +++----------------------------- 2 files changed, 10 insertions(+), 98 deletions(-) create mode 100644 docs/usage/image.png diff --git a/docs/usage/image.png b/docs/usage/image.png new file mode 100644 index 0000000000000000000000000000000000000000..caa8fcea9bb5c75f72f5d23f69844b011fce95f0 GIT binary patch literal 15885 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 z -print(payload.keys()) -# dict_keys(['left', 'right']) -``` - -#### Example input (truncated) - -```python -{ - "left": [ - ("k007", 26), - ("k017", 251), - ("k014", 143), - # ... 128 rows total - ], - "right": [ - ("k028", 144), - ("k027", 188), - ("k017", 474), - # ... 64 rows total (max(4, row_count // 2)) - ], -} -``` - -Each row is a `(key, value)` tuple. Keys are strings like `"k005"`, and values -are random integers in `[1, 999]`. - ---- - -### Solve - -`solve(payload)` performs the join + aggregation and returns summary statistics. - -```python -from chuck.tasks.relational_fusion import generate, solve - -payload = generate(row_count=128, seed=42) -result = solve(payload) -print(result) -``` - -#### Example output +Each row in the input is a `(key, value)` tuple — keys are strings like `"k002"`, values are integers in `[1, 999]`. -```python -{ - "left_rows": 128, - "right_rows": 64, - "join_rows": 269, - "aggregate": 273329, -} -``` - -| Field | Description | +| Output field | Description | |---|---| | `left_rows` | Number of rows in the left relation | | `right_rows` | Number of rows in the right relation | -| `join_rows` | Total number of rows produced by the inner join | -| `aggregate` | Sum of `(left_value + right_value)` across all joined row pairs | +| `join_rows` | Total rows produced by the inner join | +| `aggregate` | Sum of `(left_value + right_value)` across all joined pairs | --- @@ -123,7 +67,7 @@ print("✓ Output matches regression baseline") **Expected terminal output:** -``` +```text Left rows : 128 Right rows : 64 Join rows : 269 @@ -131,6 +75,8 @@ Aggregate : 276559 ✓ Output matches regression baseline ``` +![Demo script output](image.png) + --- ## Benchmarking @@ -150,43 +96,9 @@ giving a realistic workload for performance measurement. --- -## How the algorithm works - -1. **Index the right relation** — build a `dict[str, list[int]]` mapping each - key to the list of values on the right side. -2. **Stream the left relation** — for every `(key, left_value)` in the left - table, look up matching right-side values via the hash index. -3. **Aggregate** — for each matched pair, increment `join_rows` and accumulate - `left_value + right_value` into `aggregate`. - -This is a classic hash-join followed by an inline aggregation, equivalent to: - -```sql -SELECT COUNT(*) AS join_rows, - SUM(l.val + r.val) AS aggregate -FROM left_table l -JOIN right_table r ON l.key = r.key; -``` - ---- - ## Native C++ backend If the C++ native module is built, `chuck` will automatically use it for faster -execution. The algorithm is identical; only the runtime differs. - -```bash -# build native modules (Linux / macOS / WSL2) -python scripts/setup_native.py - -# benchmark with explicit backend selection -python -m chuck snapshot --label cpp_run --backend cpp -python -m chuck snapshot --label py_run --backend python - -# compare -python -m chuck compare \ - --old data/reports/snapshots/py_run.json \ - --new data/reports/snapshots/cpp_run.json -``` +execution with no code changes required — the Python fallback is used otherwise. -See [NATIVE_BINDINGS.md](../NATIVE_BINDINGS.md) for build details. +See [NATIVE_BINDINGS.md](../NATIVE_BINDINGS.md) for build and comparison details. From 3f88449b61de9b572e4ecf4cef104ad6fb57632e Mon Sep 17 00:00:00 2001 From: Rohank3 Date: Sun, 12 Apr 2026 19:25:08 +0530 Subject: [PATCH 3/5] Did the mentioned changes --- docs/usage/relational_fusion.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/usage/relational_fusion.md b/docs/usage/relational_fusion.md index 7bbccd7..3c628fe 100644 --- a/docs/usage/relational_fusion.md +++ b/docs/usage/relational_fusion.md @@ -55,14 +55,6 @@ result = solve(payload) print(f"Join rows : {result['join_rows']}") print(f"Aggregate : {result['aggregate']}") -# 3. Verify against the known regression baseline (seed=10, size=128) -assert result == { - "left_rows": 128, - "right_rows": 64, - "join_rows": 269, - "aggregate": 276559, -} -print("✓ Output matches regression baseline") ``` **Expected terminal output:** From 60eb9b35e298a67005542d38d0616c8be0c413a4 Mon Sep 17 00:00:00 2001 From: Aaryan Dadu Date: Sun, 12 Apr 2026 19:35:56 +0530 Subject: [PATCH 4/5] Delete docs/usage/image.png --- docs/usage/image.png | Bin 15885 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/usage/image.png diff --git a/docs/usage/image.png b/docs/usage/image.png deleted file mode 100644 index caa8fcea9bb5c75f72f5d23f69844b011fce95f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15885 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 z Date: Sun, 12 Apr 2026 19:36:19 +0530 Subject: [PATCH 5/5] Remove demo script output image Removed demo script output image from documentation. --- docs/usage/relational_fusion.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/docs/usage/relational_fusion.md b/docs/usage/relational_fusion.md index 3c628fe..e13ddc5 100644 --- a/docs/usage/relational_fusion.md +++ b/docs/usage/relational_fusion.md @@ -67,8 +67,6 @@ Aggregate : 276559 ✓ Output matches regression baseline ``` -![Demo script output](image.png) - --- ## Benchmarking