| 2538 | } |
| 2539 | |
| 2540 | static int token_rank_in_top(ds4_session *session, int token, int max_rank) { |
| 2541 | if (token < 0 || max_rank <= 0) return 0; |
| 2542 | ds4_token_score *top = malloc((size_t)max_rank * sizeof(*top)); |
| 2543 | if (!top) return 0; |
| 2544 | int n = ds4_session_top_logprobs(session, top, max_rank); |
| 2545 | int rank = 0; |
| 2546 | for (int i = 0; i < n; i++) { |
| 2547 | if (top[i].id == token) { |
| 2548 | rank = i + 1; |
| 2549 | break; |
| 2550 | } |
| 2551 | } |
| 2552 | free(top); |
| 2553 | return rank; |
| 2554 | } |
| 2555 | |
| 2556 | static void trace_write_header(FILE *trace, const eval_config *cfg, |
| 2557 | const char *model_name, |
| 2558 | int ncases, |
| 2559 | int max_prompt_tokens) { |
| 2560 | if (!trace) return; |
| 2561 | fprintf(trace, |
| 2562 | "# ds4-eval trace\n" |
| 2563 | "started_unix: %lld\n" |
| 2564 | "model: %s\n" |
| 2565 | "model_shape: %s\n" |
| 2566 | "backend: %s\n" |
| 2567 | "ctx: %d\n" |
| 2568 | "max_tokens: %d\n" |
| 2569 | "max_prompt_tokens: %d\n" |
| 2570 | "questions: %d\n" |
| 2571 | "temperature: %.6g\n" |
| 2572 | "top_p: %.6g\n" |
| 2573 | "min_p: %.6g\n" |
| 2574 | "seed: %llu\n" |
| 2575 | "think_mode_requested: %s\n" |
| 2576 | "soft_limit_reply_budget: %d\n" |
| 2577 | "hard_limit_reply_budget: %d\n" |
| 2578 | "soft_limit_think_close_rank: %d\n" |
| 2579 | "\n", |
| 2580 | (long long)time(NULL), |
| 2581 | cfg->model_path, |
| 2582 | model_name ? model_name : "unknown", |
| 2583 | ds4_backend_name(cfg->backend), |
| 2584 | cfg->ctx_size, |
no test coverage detected