Commit 310edfc
Drop odd-length flat dead byte; make --analyze score consistent
InnerLayer.split() padded self.data in place to make pairing work, but the
flat (unsplit) solution emits self.data directly, so odd-length flat tables
carried one unreachable trailing padding byte (and the reported cost, computed
from the un-padded length, was one element short of the emission). Pad a local
copy instead; self.data stays the original array, so the flat solution emits
exactly len(data) elements. Split solutions are unchanged (pairing still uses
the optimally-padded copy), so solution costs — and pick_solution's choices —
are identical; only the flat array for odd-length tables loses its dead byte.
Separately, `--analyze` computed the displayed Score with floor(log2)
(bit_length()-1) while pick_solution uses exact log2, so the highlighted "Best
solution" could disagree with the minimum-score row. Use exact log2 and show
two decimals so the ranking is visibly consistent.
Verified: 236 tests pass; a C+Rust round-trip fuzz over all Pareto solutions
reports zero failures; regenerating HarfBuzz's tables yields byte-identical
output in ~10s (the fix is a no-op for multi-level tables).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>1 parent da4bf94 commit 310edfc
3 files changed
Lines changed: 78 additions & 8 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1155 | 1155 | | |
1156 | 1156 | | |
1157 | 1157 | | |
1158 | | - | |
| 1158 | + | |
| 1159 | + | |
| 1160 | + | |
| 1161 | + | |
1159 | 1162 | | |
1160 | | - | |
| 1163 | + | |
| 1164 | + | |
1161 | 1165 | | |
1162 | 1166 | | |
1163 | | - | |
| 1167 | + | |
1164 | 1168 | | |
1165 | | - | |
| 1169 | + | |
1166 | 1170 | | |
1167 | 1171 | | |
1168 | 1172 | | |
1169 | | - | |
| 1173 | + | |
1170 | 1174 | | |
1171 | 1175 | | |
1172 | 1176 | | |
| |||
1184 | 1188 | | |
1185 | 1189 | | |
1186 | 1190 | | |
1187 | | - | |
| 1191 | + | |
1188 | 1192 | | |
1189 | 1193 | | |
1190 | 1194 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
| 18 | + | |
18 | 19 | | |
19 | 20 | | |
20 | 21 | | |
| |||
205 | 206 | | |
206 | 207 | | |
207 | 208 | | |
208 | | - | |
| 209 | + | |
| 210 | + | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
209 | 215 | | |
210 | | - | |
| 216 | + | |
211 | 217 | | |
212 | 218 | | |
213 | 219 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1005 | 1005 | | |
1006 | 1006 | | |
1007 | 1007 | | |
| 1008 | + | |
| 1009 | + | |
| 1010 | + | |
| 1011 | + | |
| 1012 | + | |
| 1013 | + | |
| 1014 | + | |
| 1015 | + | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
| 1051 | + | |
| 1052 | + | |
| 1053 | + | |
| 1054 | + | |
| 1055 | + | |
| 1056 | + | |
| 1057 | + | |
| 1058 | + | |
| 1059 | + | |
| 1060 | + | |
| 1061 | + | |
| 1062 | + | |
| 1063 | + | |
| 1064 | + | |
| 1065 | + | |
| 1066 | + | |
| 1067 | + | |
1008 | 1068 | | |
1009 | 1069 | | |
1010 | 1070 | | |
| |||
0 commit comments