@@ -737,11 +737,24 @@ struct gguf_file_saver {
737
737
file.write_arr <float >(key, type, data);
738
738
}
739
739
740
+ void write_kv_arr_i32 (const std::string & key, enum gguf_type type, int i, int n_arr) {
741
+ std::vector<int32_t > data (n_arr);
742
+
743
+ for (int j = 0 ; j < n_arr; ++j) {
744
+ int32_t val = gguf_get_arr_i32 (ctx, i, j);
745
+ data[j] = val;
746
+ }
747
+
748
+ file.write_arr <int32_t >(key, type, data);
749
+ }
750
+
740
751
// re-write the key-value section from the loaded file
741
752
void write_kv () {
742
753
const int32_t n_kv = gguf_get_n_kv (ctx);
743
754
for (int i = 0 ; i < n_kv; ++i) {
744
755
const char * key = gguf_get_key (ctx, i);
756
+ LLAMA_LOG_INFO (" %s: writing key '%s'\n " , __func__, key);
757
+
745
758
if (strcmp (key, " general.quantization_version" ) == 0 ) {
746
759
file.write_val <uint32_t >(" general.quantization_version" , GGUF_TYPE_UINT32, GGML_QNT_VERSION);
747
760
} else {
@@ -761,12 +774,13 @@ struct gguf_file_saver {
761
774
{
762
775
const gguf_type arr_type = gguf_get_arr_type (ctx, i);
763
776
const int n_arr = gguf_get_arr_n (ctx, i);
764
- if (arr_type == GGUF_TYPE_FLOAT32) {
765
- write_kv_arr_f32 (key, arr_type, i, n_arr);
766
- } else if (arr_type == GGUF_TYPE_STRING) {
767
- write_kv_arr_str (key, arr_type, i, n_arr);
768
- } else {
769
- throw std::runtime_error (" not implemented" );
777
+
778
+ switch (arr_type) {
779
+ case GGUF_TYPE_FLOAT32: write_kv_arr_f32 (key, arr_type, i, n_arr); break ;
780
+ case GGUF_TYPE_INT32: write_kv_arr_i32 (key, arr_type, i, n_arr); break ;
781
+ case GGUF_TYPE_STRING: write_kv_arr_str (key, arr_type, i, n_arr); break ;
782
+ default :
783
+ throw std::runtime_error (format (" cannot recognize array type for key %s\n " , key));
770
784
}
771
785
} break ;
772
786
default :
0 commit comments