| 20253 | } |
| 20254 | |
| 20255 | static void gguf_write_to_buf(const struct gguf_context * ctx, struct gguf_buf * buf, bool only_meta) { |
| 20256 | // write header |
| 20257 | gguf_bwrite_el(buf, &ctx->header.magic, sizeof(ctx->header.magic)); |
| 20258 | gguf_bwrite_el(buf, &ctx->header.version, sizeof(ctx->header.version)); |
| 20259 | gguf_bwrite_el(buf, &ctx->header.n_tensors, sizeof(ctx->header.n_tensors)); |
| 20260 | gguf_bwrite_el(buf, &ctx->header.n_kv, sizeof(ctx->header.n_kv)); |
| 20261 | |
| 20262 | // write key-value pairs |
| 20263 | for (uint32_t i = 0; i < ctx->header.n_kv; ++i) { |
| 20264 | struct gguf_kv * kv = &ctx->kv[i]; |
| 20265 | |
| 20266 | gguf_bwrite_str(buf, &kv->key); |
| 20267 | gguf_bwrite_el (buf, &kv->type, sizeof(kv->type)); |
| 20268 | |
| 20269 | switch (kv->type) { |
| 20270 | case GGUF_TYPE_UINT8: gguf_bwrite_el( buf, &kv->value.uint8, sizeof(kv->value.uint8) ); break; |
| 20271 | case GGUF_TYPE_INT8: gguf_bwrite_el (buf, &kv->value.int8, sizeof(kv->value.int8) ); break; |
| 20272 | case GGUF_TYPE_UINT16: gguf_bwrite_el (buf, &kv->value.uint16, sizeof(kv->value.uint16) ); break; |
| 20273 | case GGUF_TYPE_INT16: gguf_bwrite_el (buf, &kv->value.int16, sizeof(kv->value.int16) ); break; |
| 20274 | case GGUF_TYPE_UINT32: gguf_bwrite_el (buf, &kv->value.uint32, sizeof(kv->value.uint32) ); break; |
| 20275 | case GGUF_TYPE_INT32: gguf_bwrite_el (buf, &kv->value.int32, sizeof(kv->value.int32) ); break; |
| 20276 | case GGUF_TYPE_FLOAT32: gguf_bwrite_el (buf, &kv->value.float32, sizeof(kv->value.float32)); break; |
| 20277 | case GGUF_TYPE_UINT64: gguf_bwrite_el (buf, &kv->value.uint64, sizeof(kv->value.uint64) ); break; |
| 20278 | case GGUF_TYPE_INT64: gguf_bwrite_el (buf, &kv->value.int64, sizeof(kv->value.int64) ); break; |
| 20279 | case GGUF_TYPE_FLOAT64: gguf_bwrite_el (buf, &kv->value.float64, sizeof(kv->value.float64)); break; |
| 20280 | case GGUF_TYPE_BOOL: gguf_bwrite_el (buf, &kv->value.bool_, sizeof(kv->value.bool_) ); break; |
| 20281 | case GGUF_TYPE_STRING: gguf_bwrite_str(buf, &kv->value.str ); break; |
| 20282 | case GGUF_TYPE_ARRAY: |
| 20283 | { |
| 20284 | gguf_bwrite_el(buf, &kv->value.arr.type, sizeof(kv->value.arr.type)); |
| 20285 | gguf_bwrite_el(buf, &kv->value.arr.n, sizeof(kv->value.arr.n) ); |
| 20286 | |
| 20287 | switch (kv->value.arr.type) { |
| 20288 | case GGUF_TYPE_UINT8: |
| 20289 | case GGUF_TYPE_INT8: |
| 20290 | case GGUF_TYPE_UINT16: |
| 20291 | case GGUF_TYPE_INT16: |
| 20292 | case GGUF_TYPE_UINT32: |
| 20293 | case GGUF_TYPE_INT32: |
| 20294 | case GGUF_TYPE_FLOAT32: |
| 20295 | case GGUF_TYPE_UINT64: |
| 20296 | case GGUF_TYPE_INT64: |
| 20297 | case GGUF_TYPE_FLOAT64: |
| 20298 | case GGUF_TYPE_BOOL: |
| 20299 | { |
| 20300 | gguf_bwrite_el(buf, kv->value.arr.data, kv->value.arr.n * GGUF_TYPE_SIZE[kv->value.arr.type]); |
| 20301 | } break; |
| 20302 | case GGUF_TYPE_STRING: |
| 20303 | { |
| 20304 | for (uint32_t j = 0; j < kv->value.arr.n; ++j) { |
| 20305 | gguf_bwrite_str(buf, &((struct gguf_str *) kv->value.arr.data)[j]); |
| 20306 | } |
| 20307 | } break; |
| 20308 | case GGUF_TYPE_ARRAY: |
| 20309 | case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); break; |
| 20310 | } |
| 20311 | } break; |
| 20312 | case GGUF_TYPE_COUNT: GGML_ASSERT(false && "invalid type"); |
no test coverage detected