| 62 | } |
| 63 | |
| 64 | static void test_tfs(const std::vector<float> & probs, const std::vector<float> & expected_probs, float z) { |
| 65 | size_t n_vocab = probs.size(); |
| 66 | std::vector<llama_token_data> candidates; |
| 67 | candidates.reserve(n_vocab); |
| 68 | for (llama_token token_id = 0; token_id < (llama_token)n_vocab; token_id++) { |
| 69 | float logit = log(probs[token_id]); |
| 70 | candidates.emplace_back(llama_token_data{token_id, logit, 0.0f}); |
| 71 | } |
| 72 | |
| 73 | llama_token_data_array candidates_p = { candidates.data(), candidates.size(), false }; |
| 74 | DUMP(&candidates_p); |
| 75 | llama_sample_tail_free(nullptr, &candidates_p, z, 1); |
| 76 | DUMP(&candidates_p); |
| 77 | |
| 78 | GGML_ASSERT(candidates_p.size == expected_probs.size()); |
| 79 | for (size_t i = 0; i < candidates_p.size; i++) { |
| 80 | GGML_ASSERT(fabs(candidates_p.data[i].p - expected_probs[i]) < 1e-3); |
| 81 | } |
| 82 | } |
| 83 | |
| 84 | static void test_typical(const std::vector<float> & probs, const std::vector<float> & expected_probs, float p) { |
| 85 | size_t n_vocab = probs.size(); |