| 20136 | } |
| 20137 | |
| 20138 | void gguf_add_tensor( |
| 20139 | struct gguf_context * ctx, |
| 20140 | const struct ggml_tensor * tensor) { |
| 20141 | const int idx = ctx->header.n_tensors; |
| 20142 | ctx->infos = realloc(ctx->infos, (idx + 1)*sizeof(struct gguf_tensor_info)); |
| 20143 | |
| 20144 | ctx->infos[idx].name.n = strlen(tensor->name); |
| 20145 | ctx->infos[idx].name.data = strdup(tensor->name); |
| 20146 | |
| 20147 | for (int i = 0; i < GGML_MAX_DIMS; ++i) { |
| 20148 | ctx->infos[idx].ne[i] = 1; |
| 20149 | } |
| 20150 | |
| 20151 | ctx->infos[idx].n_dims = tensor->n_dims; |
| 20152 | for (int i = 0; i < tensor->n_dims; i++) { |
| 20153 | ctx->infos[idx].ne[i] = tensor->ne[i]; |
| 20154 | } |
| 20155 | |
| 20156 | ctx->infos[idx].type = tensor->type; |
| 20157 | ctx->infos[idx].offset = 0; |
| 20158 | ctx->infos[idx].data = tensor->data; |
| 20159 | ctx->infos[idx].size = ggml_nbytes(tensor); |
| 20160 | |
| 20161 | if (ctx->header.n_tensors > 0) { |
| 20162 | ctx->infos[idx].offset = ctx->infos[idx - 1].offset + GGML_PAD(ctx->infos[idx - 1].size, ctx->alignment); |
| 20163 | } |
| 20164 | |
| 20165 | ctx->header.n_tensors++; |
| 20166 | } |
| 20167 | |
| 20168 | void gguf_set_tensor_type(struct gguf_context * ctx, const char * name, enum ggml_type type) { |
| 20169 | const int idx = gguf_find_tensor(ctx, name); |
no test coverage detected