@@ -150,27 +150,26 @@ void common_ngram_map_begin(
150150 // Update the map from hash to key index (clear outdated entries).
151151 for (size_t i = 0 ; i < map.key_map .size (); ++i) {
152152 uint32_t key_idx = map.key_map [i];
153- if (key_idx >= map.size_last_begin ) {
153+ if (key_idx != 0 && key_idx + map.size_key > size_begin ) {
154154 map.key_map [i] = 0 ;
155155 count_map_entries_upd++;
156156 }
157157 }
158- map.key_map_last_idx = (map. size_last_begin > 0 ) ? map. size_last_begin - 1 : 0 ;
158+ map.key_map_last_idx = (size_begin > 0 ) ? ( uint32_t ) (size_begin - 1 ) : 0 ;
159159 }
160160
161161 if (size_begin < map.idx_last_check && !map.keys .empty ()) {
162162 // The next token generation will start at index size_begin.
163- // The tokens between map.size_last_begin and size_begin are no longer valid.
164- //
165- // Refresh map: Remove all entries with index >= map.size_last_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).
166165 size_t count_keys = map.keys .size ();
167166 size_t count_keys_del = 0 ;
168167 size_t count_values_del = 0 ;
169168 for (int32_t i = map.keys .size () - 1 ; i >= 0 ; --i) {
170169 common_ngram_map_key & key = map.keys [i];
171- if (key.key_idx >= map.size_last_begin ) {
170+ if (key.key_idx + map.size_key > size_begin ) {
172171 // Delete the key.
173- LOG_DBG (" %s: delete key %d at index %zu (>= size_last_begin =%zu)\n " , __func__, i, key.key_idx , map.size_last_begin );
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 );
174173 map.keys .erase (map.keys .begin () + i);
175174 count_keys_del++;
176175 continue ;
@@ -182,7 +181,7 @@ void common_ngram_map_begin(
182181 // Check the indices of the values.
183182 for (int16_t j = COMMON_NGRAM_MAX_VALUES - 1 ; j >= 0 ; --j) {
184183 common_ngram_map_value & value = key.values [j];
185- if (value.value_idx >= map.size_last_begin ) {
184+ if (value.value_idx != 0 && value. value_idx + map.size_value > size_begin ) {
186185 // Delete the value.
187186 count_values_del++;
188187
0 commit comments