40 if (!json || !key || !out_value) {
44 size_t key_len = strlen(key);
45 const char *
end = json + len;
46 for (
const char *p = json; p + key_len <=
end; ++p) {
47 if (memcmp(p, key, key_len) != 0) {
51 const char *colon = memchr(p + key_len,
':', (
size_t)(
end - (p + key_len)));
55 const char *v = colon + 1;
56 while (v <
end && (*v ==
' ' || *v ==
'\t' || *v ==
'\n' || *v ==
'\r')) {
61 if (v <
end && sscanf(v,
"%d", &value) == 1) {
92 if (!json || !key || !out_value) {
96 size_t key_len = strlen(key);
97 const char *
end = json + len;
98 for (
const char *p = json; p + key_len <=
end; ++p) {
99 if (memcmp(p, key, key_len) != 0) {
103 const char *colon = memchr(p + key_len,
':', (
size_t)(
end - (p + key_len)));
107 const char *v = colon + 1;
108 while (v <
end && (*v ==
' ' || *v ==
'\t' || *v ==
'\n' || *v ==
'\r')) {
113 if (v <
end && sscanf(v,
"%f", &value) == 1) {
215 FILE *f = fopen(path,
"rb");
217 perror(
"ck_model_config_from_hf_json: fopen");
221 if (fseek(f, 0, SEEK_END) != 0) {
230 if (fseek(f, 0, SEEK_SET) != 0) {
235 char *buf = (
char *)malloc((
size_t)len + 1);
240 size_t nread = fread(buf, 1, (
size_t)len, f);
245 memset(&tmp, 0,
sizeof(tmp));
249 const char *scope = buf;
250 size_t scope_len = nread;
256 const char *num_layers_keys[] = {
"\"num_hidden_layers\"",
"\"n_layer\"", NULL };
257 const char *hidden_size_keys[] = {
"\"hidden_size\"",
"\"n_embd\"",
"\"d_model\"", NULL };
258 const char *intermediate_keys[] = {
"\"intermediate_size\"",
"\"n_inner\"",
"\"ffn_dim\"",
"\"mlp_dim\"", NULL };
259 const char *num_heads_keys[] = {
"\"num_attention_heads\"",
"\"n_head\"",
"\"num_heads\"", NULL };
260 const char *num_kv_heads_keys[] = {
"\"num_key_value_heads\"",
"\"num_kv_heads\"", NULL };
261 const char *vocab_keys[] = {
"\"vocab_size\"",
"\"n_vocab\"", NULL };
262 const char *context_keys[] = {
"\"max_position_embeddings\"",
"\"n_positions\"",
"\"context_length\"",
"\"seq_len\"", NULL };
263 const char *rms_eps_keys[] = {
"\"rms_norm_eps\"",
"\"layer_norm_eps\"", NULL };
264 const char *rope_theta_keys[] = {
"\"rope_theta\"",
"\"rope_base\"", NULL };
267 fprintf(stderr,
"Warning: num_hidden_layers not found in %s\n", path);
270 fprintf(stderr,
"Warning: hidden_size not found in %s\n", path);
273 fprintf(stderr,
"Warning: intermediate_size not found in %s\n", path);
276 fprintf(stderr,
"Warning: num_attention_heads not found in %s\n", path);
667 if (!path || !graph) {
671 FILE *f = fopen(path,
"rb");
673 perror(
"ck_ir_parse_json: fopen");
677 if (fseek(f, 0, SEEK_END) != 0) {
686 if (fseek(f, 0, SEEK_SET) != 0) {
691 char *buf = (
char *)malloc((
size_t)len + 1);
696 size_t nread = fread(buf, 1, (
size_t)len, f);
701 memset(&tmp, 0,
sizeof(tmp));
705 fprintf(stderr,
"ck_ir_parse_json: missing num_layers\n");
708 fprintf(stderr,
"ck_ir_parse_json: missing hidden_size\n");
711 fprintf(stderr,
"ck_ir_parse_json: missing intermediate_size\n");
714 fprintf(stderr,
"ck_ir_parse_json: missing num_attention_heads\n");
735 char *nodes_begin = strstr(buf,
"\"nodes\"");
740 char *p = nodes_begin;
742 while ((p = strstr(p,
"\"layer\"")) != NULL) {
759 for (
int i = 0; i < count; ++i) {
761 char *pl = strstr(p,
"\"layer\"");
762 if (!pl) { free(nodes); free(buf);
return -1; }
764 if (sscanf(strchr(pl,
':'),
" : %d", &layer) != 1) {
765 free(nodes); free(buf);
return -1;
769 char *pn = strstr(pl,
"\"node\"");
770 if (!pn) { free(nodes); free(buf);
return -1; }
772 if (sscanf(strchr(pn,
':'),
" : %d", &node) != 1) {
773 free(nodes); free(buf);
return -1;
777 char *po = strstr(pn,
"\"op\"");
778 if (!po) { free(nodes); free(buf);
return -1; }
779 char op_str[64] = {0};
780 if (sscanf(strchr(po,
':'),
" : \"%63[^\"]\"", op_str) != 1) {
781 free(nodes); free(buf);
return -1;
786 n->
id.
node = (uint16_t)node;
790 char *pout = strstr(po,
"\"outputs\"");
791 if (!pout) { free(nodes); free(buf);
return -1; }
792 char *bo = strchr(pout,
'[');
793 char *eo = strchr(pout,
']');
795 if (bo && eo && eo > bo) {
797 while ((q = strchr(q,
'"')) && q < eo) {
799 q = strchr(q + 1,
'"');
800 if (!q || q >= eo)
break;
808 char *pin = strstr(po,
"\"inputs\"");
809 if (!pin) { free(nodes); free(buf);
return -1; }
810 char *bi = strchr(pin,
'[');
811 char *ei = strchr(pin,
']');
813 if (bi && ei && ei > bi) {
816 while ((q = strchr(q,
'"')) && q < ei) {
818 if (sscanf(q,
"\"%63[^\"]\"", tok) != 1) {
821 if (strcmp(tok,
"IN") == 0) {
826 unsigned plh = 0, pnn = 0, slot = 0;
827 if (sscanf(tok,
"L%u:N%u:%u", &plh, &pnn, &slot) == 3) {
835 q = strchr(q + 1,
'"');
836 if (!q || q >= ei)
break;
849 graph->
nodes = nodes;