@@ -125,6 +125,16 @@ void common_ngram_map_begin(
125125 LOG_DBG (" %s: begin, idx_last_draft=%zu, new begin=%zu, #keys=%zu\n " , __func__,
126126 map.idx_last_check , size_begin, map.keys .size ());
127127
128+ size_t idx_begin_cleanup = map.size_last_begin ;
129+ if (idx_begin_cleanup > size_begin) {
130+ if (size_begin > (size_t ) map.size_key + map.size_value ) {
131+ idx_begin_cleanup = size_begin - map.size_key - map.size_value ;
132+ } else {
133+ idx_begin_cleanup = 0 ;
134+ }
135+ LOG_INF (" %s: shrink cleanup begin: %zu -> %zu\n " , __func__, map.size_last_begin , idx_begin_cleanup);
136+ }
137+
128138 size_t count_map_entries_upd = 0 ;
129139 if (!map.key_map .empty () && size_begin < map.idx_last_check ) {
130140 if (map.show_key_map_stats ) {
@@ -150,26 +160,23 @@ void common_ngram_map_begin(
150160 // Update the map from hash to key index (clear outdated entries).
151161 for (size_t i = 0 ; i < map.key_map .size (); ++i) {
152162 uint32_t key_idx = map.key_map [i];
153- if (key_idx != 0 && key_idx + map. size_key > size_begin ) {
163+ if (key_idx != 0 && key_idx >= idx_begin_cleanup ) {
154164 map.key_map [i] = 0 ;
155165 count_map_entries_upd++;
156166 }
157167 }
158- map.key_map_last_idx = (size_begin > 0 ) ? (uint32_t ) (size_begin - 1 ) : 0 ;
168+ map.key_map_last_idx = (idx_begin_cleanup > 0 ) ? (uint32_t ) (idx_begin_cleanup - 1 ) : 0 ;
159169 }
160170
161171 if (size_begin < map.idx_last_check && !map.keys .empty ()) {
162- // The next token generation will start at index size_begin.
163- // The valid token history is [0, size_begin), so remove any n-gram/m-gram
164- // that does not fit entirely inside it (idx + size > size_begin).
165172 size_t count_keys = map.keys .size ();
166173 size_t count_keys_del = 0 ;
167174 size_t count_values_del = 0 ;
168175 for (int32_t i = map.keys .size () - 1 ; i >= 0 ; --i) {
169176 common_ngram_map_key & key = map.keys [i];
170- if (key.key_idx + map. size_key > size_begin ) {
177+ if (key.key_idx >= idx_begin_cleanup ) {
171178 // Delete the key.
172- LOG_DBG (" %s: delete key %d (key_idx=%zu + size_key=%d > size_begin =%zu)\n " , __func__, i, key.key_idx , map. size_key , size_begin );
179+ LOG_DBG (" %s: delete key %d at index %zu (>= idx_begin_cleanup =%zu)\n " , __func__, i, key.key_idx , idx_begin_cleanup );
173180 map.keys .erase (map.keys .begin () + i);
174181 count_keys_del++;
175182 continue ;
@@ -181,7 +188,7 @@ void common_ngram_map_begin(
181188 // Check the indices of the values.
182189 for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1 ; j >= 0 ; --j) {
183190 common_ngram_map_value & value = key.values [j];
184- if (value.value_idx != 0 && value.value_idx + map. size_value > size_begin ) {
191+ if (value.value_idx != 0 && value.value_idx >= idx_begin_cleanup ) {
185192 // Delete the value.
186193 count_values_del++;
187194
0 commit comments