Right-heavy dict partition: 150KB left, 500KB right

Central has more code overhead (behavior, formatter, output, undo,
BLE client) → smaller dict budget. Peripheral is lean → gets bulk
of dict. Ratio-based partition replaces fixed bytes-per-entry estimate.

Full 147K Plover dict, zero trimming target.
This commit is contained in:
afiqzudinhadi 2026-07-02 14:30:12 +08:00
parent 20218fa2ab
commit 0908dc7c85
2 changed files with 17 additions and 18 deletions

11
Kconfig
View file

@ -94,16 +94,19 @@ if STENO_SPLIT_DICT
config STENO_DICT_LEFT_MAX_SIZE config STENO_DICT_LEFT_MAX_SIZE
int "Left half dict budget (bytes)" int "Left half dict budget (bytes)"
default 430080 default 153600
help help
Flash budget for left (central) partition. Default 420KB. Flash budget for left (central) partition. Default 150KB.
Central has more code overhead (behavior, formatter, output,
undo, BLE client) so gets a smaller dict partition.
Highest-importance entries fill this first. Highest-importance entries fill this first.
config STENO_DICT_RIGHT_MAX_SIZE config STENO_DICT_RIGHT_MAX_SIZE
int "Right half dict budget (bytes)" int "Right half dict budget (bytes)"
default 545792 default 512000
help help
Flash budget for right (peripheral) partition. Default 533KB. Flash budget for right (peripheral) partition. Default 500KB.
Peripheral has less code overhead so gets the bulk of the dict.
Remaining entries after left partition is filled. Remaining entries after left partition is filled.
config STENO_SPLIT_CACHE_SIZE config STENO_SPLIT_CACHE_SIZE

View file

@ -509,21 +509,17 @@ def partition_entries(entries, left_budget, right_budget):
"""Partition dict entries by importance into left (central) and right (peripheral). """Partition dict entries by importance into left (central) and right (peripheral).
Left gets highest-importance entries first (most common single-stroke words). Left gets highest-importance entries first (most common single-stroke words).
Right gets remaining entries. Both are trimmed to their flash budgets via Right gets remaining entries. Split point is proportional to flash budgets.
compile_mphf's internal trimming. compile_mphf's internal trimming handles any overshoot.
Returns (left_entries, right_entries). Returns (left_entries, right_entries).
""" """
sorted_entries = sorted(entries, key=lambda e: score_entry(e[0], e[1])) sorted_entries = sorted(entries, key=lambda e: score_entry(e[0], e[1]))
# Rough estimate: ~15 bytes per entry average (conservative) total_budget = left_budget + right_budget
# compile_mphf will trim further if needed left_ratio = left_budget / total_budget
est_bytes_per_entry = 15 left_max = int(len(sorted_entries) * left_ratio)
left_max = left_budget // est_bytes_per_entry left_max = max(1, min(left_max, len(sorted_entries) - 1))
right_max = right_budget // est_bytes_per_entry
# Cap to actual count
left_max = min(left_max, len(sorted_entries))
left_entries = sorted_entries[:left_max] left_entries = sorted_entries[:left_max]
right_entries = sorted_entries[left_max:] right_entries = sorted_entries[left_max:]
@ -545,10 +541,10 @@ def main():
help='Verify compiled dict (default: true)') help='Verify compiled dict (default: true)')
parser.add_argument('--split-part', choices=['left', 'right'], parser.add_argument('--split-part', choices=['left', 'right'],
help='Build one partition of a split dict (left=central, right=peripheral)') help='Build one partition of a split dict (left=central, right=peripheral)')
parser.add_argument('--left-size', type=int, default=430080, parser.add_argument('--left-size', type=int, default=153600,
help='Left partition flash budget in bytes (default: 430080 = 420KB)') help='Left partition flash budget in bytes (default: 153600 = 150KB)')
parser.add_argument('--right-size', type=int, default=545792, parser.add_argument('--right-size', type=int, default=512000,
help='Right partition flash budget in bytes (default: 545792 = 533KB)') help='Right partition flash budget in bytes (default: 512000 = 500KB)')
parser.add_argument('--block-size', type=int, default=4096, parser.add_argument('--block-size', type=int, default=4096,
help='Zlib compression block size (default: 4096, try 2048/1024 for tighter packing)') help='Zlib compression block size (default: 4096, try 2048/1024 for tighter packing)')
args = parser.parse_args() args = parser.parse_args()