@@ -125,6 +125,15 @@ 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 cleanup_begin = map.size_last_begin ;
129+ if (cleanup_begin > size_begin) {
130+ cleanup_begin = (size_begin > (size_t ) map.size_key + map.size_value )
131+ ? size_begin - map.size_key - map.size_value
132+ : 0 ;
133+ LOG_INF (" %s: shrink cleanup begin: %zu -> %zu\n " , __func__,
134+ map.size_last_begin , cleanup_begin);
135+ }
136+
128137 size_t count_map_entries_upd = 0 ;
129138 if (!map.key_map .empty () && size_begin < map.idx_last_check ) {
130139 if (map.show_key_map_stats ) {
@@ -150,26 +159,23 @@ void common_ngram_map_begin(
150159 // Update the map from hash to key index (clear outdated entries).
151160 for (size_t i = 0 ; i < map.key_map .size (); ++i) {
152161 uint32_t key_idx = map.key_map [i];
153- if (key_idx != 0 && key_idx + map. size_key > size_begin ) {
162+ if (key_idx != 0 && key_idx >= cleanup_begin ) {
154163 map.key_map [i] = 0 ;
155164 count_map_entries_upd++;
156165 }
157166 }
158- map.key_map_last_idx = (size_begin > 0 ) ? (uint32_t ) (size_begin - 1 ) : 0 ;
167+ map.key_map_last_idx = (cleanup_begin > 0 ) ? (uint32_t ) (cleanup_begin - 1 ) : 0 ;
159168 }
160169
161170 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).
165171 size_t count_keys = map.keys .size ();
166172 size_t count_keys_del = 0 ;
167173 size_t count_values_del = 0 ;
168174 for (int32_t i = map.keys .size () - 1 ; i >= 0 ; --i) {
169175 common_ngram_map_key & key = map.keys [i];
170- if (key.key_idx + map. size_key > size_begin ) {
176+ if (key.key_idx >= cleanup_begin ) {
171177 // 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 );
178+ LOG_DBG (" %s: delete key %d at index %zu (>= cleanup_begin =%zu)\n " , __func__, i, key.key_idx , cleanup_begin );
173179 map.keys .erase (map.keys .begin () + i);
174180 count_keys_del++;
175181 continue ;
@@ -181,7 +187,7 @@ void common_ngram_map_begin(
181187 // Check the indices of the values.
182188 for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1 ; j >= 0 ; --j) {
183189 common_ngram_map_value & value = key.values [j];
184- if (value.value_idx != 0 && value.value_idx + map. size_value > size_begin ) {
190+ if (value.value_idx != 0 && value.value_idx >= cleanup_begin ) {
185191 // Delete the value.
186192 count_values_del++;
187193
0 commit comments