| 1087 | } |
| 1088 | |
| 1089 | struct llama_grammar * llama_grammar_clone_impl(const struct llama_grammar & grammar) { |
| 1090 | auto * result = new llama_grammar { |
| 1091 | grammar.vocab, |
| 1092 | grammar.rules, |
| 1093 | grammar.stacks, |
| 1094 | grammar.partial_utf8, |
| 1095 | grammar.lazy, |
| 1096 | grammar.awaiting_trigger, |
| 1097 | grammar.trigger_buffer, |
| 1098 | grammar.trigger_tokens, |
| 1099 | grammar.trigger_patterns, |
| 1100 | }; |
| 1101 | |
| 1102 | // redirect elements in stacks to point to new rules |
| 1103 | for (size_t is = 0; is < result->stacks.size(); is++) { |
| 1104 | for (size_t ie = 0; ie < result->stacks[is].size(); ie++) { |
| 1105 | for (size_t ir0 = 0; ir0 < grammar.rules.size(); ir0++) { |
| 1106 | for (size_t ir1 = 0; ir1 < grammar.rules[ir0].size(); ir1++) { |
| 1107 | if (grammar.stacks[is][ie] == &grammar.rules[ir0][ir1]) { |
| 1108 | result->stacks[is][ie] = &result->rules[ir0][ir1]; |
| 1109 | } |
| 1110 | } |
| 1111 | } |
| 1112 | } |
| 1113 | } |
| 1114 | |
| 1115 | return result; |
| 1116 | } |
| 1117 | |
| 1118 | void llama_grammar_apply_impl(const struct llama_grammar & grammar, llama_token_data_array * cur_p) { |
| 1119 | GGML_ASSERT(grammar.vocab != nullptr); |
no test coverage detected