From a8ca18b4b815a2abdbecb958ee5f4c542d69aac7 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Tue, 28 Oct 2025 19:41:43 +0200 Subject: [PATCH 001/185] llama-bench : clarify benchmarked parts of the computation (#16823) --- tools/llama-bench/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/llama-bench/README.md b/tools/llama-bench/README.md index ead4da45e29..87d9c0a219b 100644 --- a/tools/llama-bench/README.md +++ b/tools/llama-bench/README.md @@ -82,6 +82,9 @@ Using the `-d ` option, each test can be run at a specified context depth, pr For a description of the other options, see the [main example](../main/README.md). +> [!NOTE] +> The measurements with `llama-bench` do not include the times for tokenization and for sampling. + ## Examples ### Text generation with different models @@ -131,7 +134,7 @@ $ ./llama-bench -n 0 -n 16 -p 64 -t 1,2,4,8,16,32 | llama 7B mostly Q4_0 | 3.56 GiB | 6.74 B | CPU | 16 | pp 64 | 33.52 ± 0.03 | | llama 7B mostly Q4_0 | 3.56 GiB | 6.74 B | CPU | 16 | tg 16 | 15.32 ± 0.05 | | llama 7B mostly Q4_0 | 3.56 GiB | 6.74 B | CPU | 32 | pp 64 | 59.00 ± 1.11 | -| llama 7B mostly Q4_0 | 3.56 GiB | 6.74 B | CPU | 32 | tg 16 | 16.41 ± 0.79 || +| llama 7B mostly Q4_0 | 3.56 GiB | 6.74 B | CPU | 32 | tg 16 | 16.41 ± 0.79 | ### Different numbers of layers offloaded to the GPU From 85a7d8677bf2200981e52f744a21d5267964ffcf Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Tue, 28 Oct 2025 20:19:44 +0200 Subject: [PATCH 002/185] memory : remove KV cache size padding (#16812) * memory : remove KV cache size padding * cont : restore padding for n_kv tensor shape * server : use slot context size instead of training context size * server : simplify context limit logic --- src/llama-kv-cache.cpp | 11 +++++---- src/llama-kv-cache.h | 2 -- src/llama-model.cpp | 23 ++++--------------- src/llama-model.h | 3 +-- tools/server/server.cpp | 27 +++-------------------- tools/server/tests/unit/test_ctx_shift.py | 2 +- 6 files changed, 14 insertions(+), 54 deletions(-) diff --git a/src/llama-kv-cache.cpp b/src/llama-kv-cache.cpp index add74391f0c..6d5dd6051e7 100644 --- a/src/llama-kv-cache.cpp +++ b/src/llama-kv-cache.cpp @@ -961,10 +961,14 @@ bool llama_kv_cache::get_has_shift() const { uint32_t llama_kv_cache::get_n_kv(const slot_info & sinfo) const { uint32_t result = 0; + // pad the n_kv value so that the graph remains constant across batches and can be reused + // note: this also helps some backends with performance (f.ex https://github.com/ggml-org/llama.cpp/pull/16812#issuecomment-3455112220) + const uint32_t n_pad_cur = std::max(n_pad, 256u); + for (uint32_t s = 0; s < sinfo.n_stream(); ++s) { const auto & cells = v_cells[sinfo.strm[s]]; - result = std::max(std::min(cells.size(), std::max(n_pad, GGML_PAD(cells.used_max_p1(), n_pad))), result); + result = std::max(std::min(cells.size(), std::max(n_pad_cur, GGML_PAD(cells.used_max_p1(), n_pad_cur))), result); } return result; @@ -2014,8 +2018,3 @@ void llama_kv_cache_context::set_input_kq_mask(ggml_tensor * dst, const llama_ub void llama_kv_cache_context::set_input_pos_bucket(ggml_tensor * dst, const llama_ubatch * ubatch) const { kv->set_input_pos_bucket(dst, ubatch); } - -uint32_t llama_kv_cache::get_padding(const llama_cparams & cparams) { - // the FA kernels require padding to avoid extra runtime boundary checks - return cparams.flash_attn ? 256u : 32u; -} diff --git a/src/llama-kv-cache.h b/src/llama-kv-cache.h index 150e2825962..bf7821c07ca 100644 --- a/src/llama-kv-cache.h +++ b/src/llama-kv-cache.h @@ -19,8 +19,6 @@ struct llama_context; class llama_kv_cache : public llama_memory_i { public: - static uint32_t get_padding(const llama_cparams & cparams); - struct stream_copy_info { bool empty() const { assert(ssrc.size() == sdst.size()); diff --git a/src/llama-model.cpp b/src/llama-model.cpp index bb83a04e960..ea6f59ed482 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -19641,7 +19641,7 @@ struct llm_build_apertus : public llm_graph_context { } }; -llama_memory_i * llama_model::create_memory(const llama_memory_params & params, llama_cparams & cparams) const { +llama_memory_i * llama_model::create_memory(const llama_memory_params & params, const llama_cparams & cparams) const { llama_memory_i * res; switch (arch) { @@ -19692,17 +19692,13 @@ llama_memory_i * llama_model::create_memory(const llama_memory_params & params, }; } - const auto padding = llama_kv_cache::get_padding(cparams); - - cparams.n_ctx = GGML_PAD(cparams.n_ctx, padding); - res = new llama_memory_hybrid( /* model */ *this, /* attn_type_k */ params.type_k, /* attn_type_v */ params.type_v, /* attn_v_trans */ !cparams.flash_attn, /* attn_kv_size */ cparams.n_ctx, - /* attn_n_pad */ padding, + /* attn_n_pad */ 1, /* attn_n_swa */ hparams.n_swa, /* attn_swa_type */ hparams.swa_type, /* recurrent_type_k */ GGML_TYPE_F32, @@ -19714,23 +19710,12 @@ llama_memory_i * llama_model::create_memory(const llama_memory_params & params, /* filter_attn */ std::move(filter_attn), /* filter_recr */ std::move(filter_recr)); } else { - const auto padding = llama_kv_cache::get_padding(cparams); - uint32_t n_ctx_per_stream = cparams.n_ctx; if (!cparams.kv_unified) { n_ctx_per_stream = (cparams.n_ctx + cparams.n_seq_max - 1)/cparams.n_seq_max; - n_ctx_per_stream = GGML_PAD(n_ctx_per_stream, padding); - - cparams.n_ctx = n_ctx_per_stream*cparams.n_seq_max; - } else { - n_ctx_per_stream = GGML_PAD(n_ctx_per_stream, padding); - - cparams.n_ctx = n_ctx_per_stream; } - LLAMA_LOG_DEBUG("%s: n_ctx = %u (padded)\n", __func__, cparams.n_ctx); - llama_memory_i::layer_reuse_cb reuse = nullptr; if (arch == LLM_ARCH_GEMMA3N) { @@ -19757,7 +19742,7 @@ llama_memory_i * llama_model::create_memory(const llama_memory_params & params, n_ctx_per_stream, cparams.n_seq_max, cparams.n_ubatch, - padding, + 1, nullptr, reuse); } else { @@ -19772,7 +19757,7 @@ llama_memory_i * llama_model::create_memory(const llama_memory_params & params, cparams.kv_unified, n_ctx_per_stream, cparams.n_seq_max, - padding, + 1, hparams.n_swa, hparams.swa_type, nullptr, diff --git a/src/llama-model.h b/src/llama-model.h index 248f854101c..1ab1cf7f8e9 100644 --- a/src/llama-model.h +++ b/src/llama-model.h @@ -500,9 +500,8 @@ struct llama_model { ggml_tensor * get_rope_factors(const llama_cparams & cparams, int il) const; - // note: can mutate `cparams` // TODO: move this to new llm_arch_model_i interface - llama_memory_i * create_memory(const llama_memory_params & params, llama_cparams & cparams) const; + llama_memory_i * create_memory(const llama_memory_params & params, const llama_cparams & cparams) const; // TODO: move this to new llm_arch_model_i interface ggml_cgraph * build_graph(const llm_graph_params & params) const; diff --git a/tools/server/server.cpp b/tools/server/server.cpp index 4124bffa40f..cb794ab647e 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -2866,10 +2866,12 @@ struct server_context { // if context shifting is disabled, make sure that we don't run out of context if (!params_base.ctx_shift && slot.n_past + 1 >= slot.n_ctx) { + slot.truncated = true; slot.stop = STOP_TYPE_LIMIT; slot.has_next_token = false; - SLT_DBG(slot, "stopped due to running out of context, n_past = %d, n_ctx = %d\n", slot.n_past, slot.n_ctx); + SLT_DBG(slot, "stopped due to running out of context capacity, n_past = %d, n_prompt_tokens = %d, n_decoded = %d, n_ctx = %d\n", + slot.n_decoded, slot.n_prompt_tokens(), slot.n_past, slot.n_ctx); } // check the limits @@ -2929,16 +2931,6 @@ struct server_context { } } - // if context shift is disabled, we stop when it reaches the context limit - if (slot.n_past >= slot.n_ctx) { - slot.truncated = true; - slot.stop = STOP_TYPE_LIMIT; - slot.has_next_token = false; - - SLT_DBG(slot, "stopped due to running out of context capacity, n_past = %d, n_prompt_tokens = %d, n_decoded = %d, n_ctx = %d\n", - slot.n_decoded, slot.n_prompt_tokens(), slot.n_past, slot.n_ctx); - } - if (llama_vocab_is_eog(vocab, result.tok)) { slot.stop = STOP_TYPE_EOS; slot.has_next_token = false; @@ -2946,19 +2938,6 @@ struct server_context { SLT_DBG(slot, "%s", "stopped by EOS\n"); } - const auto n_ctx_train = llama_model_n_ctx_train(model); - - if (slot.task->params.n_predict < 1 && slot.n_prompt_tokens() + slot.n_decoded >= n_ctx_train) { - slot.truncated = true; - slot.stop = STOP_TYPE_LIMIT; - slot.has_next_token = false; // stop prediction - - SLT_WRN(slot, - "n_predict (%d) is set for infinite generation. " - "Limiting generated tokens to n_ctx_train (%d) to avoid EOS-less generation infinite loop\n", - slot.task->params.n_predict, n_ctx_train); - } - SLT_DBG(slot, "n_decoded = %d, n_remaining = %d, next token: %5d '%s'\n", slot.n_decoded, slot.n_remaining, result.tok, token_str.c_str()); return slot.has_next_token; // continue diff --git a/tools/server/tests/unit/test_ctx_shift.py b/tools/server/tests/unit/test_ctx_shift.py index 4adbbde64f5..7b047b7b3b7 100644 --- a/tools/server/tests/unit/test_ctx_shift.py +++ b/tools/server/tests/unit/test_ctx_shift.py @@ -45,7 +45,7 @@ def test_ctx_shift_enabled(): @pytest.mark.parametrize("n_predict,n_token_output,truncated", [ (64, 64, False), - (-1, 120, True), + (-1, 248, True), # 8 tokens prompt + 248 tokens generated = 256 tokens total ]) def test_ctx_shift_disabled_short_prompt(n_predict: int, n_token_output: int, truncated: bool): global server From 851553ea6b24cb39fd5fd188b437d777cb411de8 Mon Sep 17 00:00:00 2001 From: YaelGitAccount <38328157276@mby.co.il> Date: Tue, 28 Oct 2025 21:10:28 +0200 Subject: [PATCH 003/185] cuda: add SET operation support (#16804) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(cuda): add GGML_OP_SET support Implement CUDA kernel for SET operation with f32 support. All tests passing (14598/14598). * cuda(set): add I32 support; keep F32 * refactor(cuda): use ggml_cuda_cpy to unify SET operator logic and remove code duplication * Update ggml/src/ggml-cuda/ggml-cuda.cu Co-authored-by: Sigbjørn Skjæret * Update ggml/src/ggml-cuda/set.cu Co-authored-by: Sigbjørn Skjæret --------- Co-authored-by: Sigbjørn Skjæret --- ggml/src/ggml-cuda/ggml-cuda.cu | 11 ++++++++++ ggml/src/ggml-cuda/set.cu | 39 +++++++++++++++++++++++++++++++++ ggml/src/ggml-cuda/set.cuh | 7 ++++++ 3 files changed, 57 insertions(+) create mode 100644 ggml/src/ggml-cuda/set.cu create mode 100644 ggml/src/ggml-cuda/set.cuh diff --git a/ggml/src/ggml-cuda/ggml-cuda.cu b/ggml/src/ggml-cuda/ggml-cuda.cu index 94ab1ec0f5a..be505748af5 100644 --- a/ggml/src/ggml-cuda/ggml-cuda.cu +++ b/ggml/src/ggml-cuda/ggml-cuda.cu @@ -50,6 +50,7 @@ #include "ggml-cuda/upscale.cuh" #include "ggml-cuda/wkv.cuh" #include "ggml-cuda/gla.cuh" +#include "ggml-cuda/set.cuh" #include "ggml-cuda/set-rows.cuh" #include "ggml-cuda/pad_reflect_1d.cuh" #include "ggml.h" @@ -2416,6 +2417,9 @@ static bool ggml_cuda_compute_forward(ggml_backend_cuda_context & ctx, struct gg case GGML_OP_SET_ROWS: ggml_cuda_op_set_rows(ctx, dst); break; + case GGML_OP_SET: + ggml_cuda_op_set(ctx, dst); + break; case GGML_OP_DUP: ggml_cuda_dup(ctx, dst); break; @@ -3842,6 +3846,13 @@ static bool ggml_backend_cuda_device_supports_op(ggml_backend_dev_t dev, const g op->src[0]->type == GGML_TYPE_F32 && (op->src[1]->type == GGML_TYPE_I64 || op->src[1]->type == GGML_TYPE_I32); } break; + case GGML_OP_SET: + { + const ggml_type t = op->type; + return (t == GGML_TYPE_F32 || t == GGML_TYPE_I32) && + t == op->src[0]->type && + t == op->src[1]->type; + } break; case GGML_OP_CPY: { ggml_type src0_type = op->src[0]->type; diff --git a/ggml/src/ggml-cuda/set.cu b/ggml/src/ggml-cuda/set.cu new file mode 100644 index 00000000000..04bfe07ba03 --- /dev/null +++ b/ggml/src/ggml-cuda/set.cu @@ -0,0 +1,39 @@ +#include "set.cuh" +#include "cpy.cuh" + +void ggml_cuda_op_set(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; + + GGML_ASSERT((src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_I32)); + GGML_ASSERT(src1->type == src0->type); + GGML_ASSERT(dst ->type == src0->type); + + GGML_ASSERT(ggml_is_contiguous(dst)); + GGML_ASSERT(ggml_is_contiguous(src0)); + GGML_ASSERT(ggml_is_contiguous(src1)); + + const size_t nb1 = ((int32_t *) dst->op_params)[0]; + const size_t nb2 = ((int32_t *) dst->op_params)[1]; + const size_t nb3 = ((int32_t *) dst->op_params)[2]; + const size_t offset = ((int32_t *) dst->op_params)[3]; + const bool inplace= (bool) ((int32_t *) dst->op_params)[4]; + + if (!inplace) { + ggml_cuda_cpy(ctx, src0, dst); + } + + ggml_tensor dst_view = *dst; + dst_view.data = (void *)((char *)dst->data + offset); + dst_view.ne[0] = src1->ne[0]; + dst_view.ne[1] = src1->ne[1]; + dst_view.ne[2] = src1->ne[2]; + dst_view.ne[3] = src1->ne[3]; + + dst_view.nb[0] = ggml_element_size(dst); + dst_view.nb[1] = nb1; + dst_view.nb[2] = nb2; + dst_view.nb[3] = nb3; + + ggml_cuda_cpy(ctx, src1, &dst_view); +} diff --git a/ggml/src/ggml-cuda/set.cuh b/ggml/src/ggml-cuda/set.cuh new file mode 100644 index 00000000000..dd09529f3e4 --- /dev/null +++ b/ggml/src/ggml-cuda/set.cuh @@ -0,0 +1,7 @@ +#pragma once + +#include "common.cuh" + +#define CUDA_SET_BLOCK_SIZE 256 + +void ggml_cuda_op_set(ggml_backend_cuda_context & ctx, ggml_tensor * dst); From 338074c383c81366320d176d83b94b0a567ee0c2 Mon Sep 17 00:00:00 2001 From: YaelLogic Date: Wed, 29 Oct 2025 08:14:39 +0200 Subject: [PATCH 004/185] sycl: add RMS_NORM_BACK operation support (#16808) * sycl: add RMS_NORM_BACK operation support * sycl: rms_norm_back: add dual reduction paths (FP64 and FP32) and savepoint before further changes * sycl: add RMS_NORM_BACK support Implement RMS_NORM_BACK for the SYCL backend using FP32 compensated parallel reduction. Minimal docs updates (ops.md / SYCL.csv). * revert: restore .gitignore and tools/run/CMakeLists.txt to upstream * revert: restore tests/CMakeLists.txt to upstream * sycl: optimize rms_norm_back * fix: restore SYCL.csv to correct state with RMS_NORM_BACK support * Update ggml/src/ggml-sycl/norm.cpp Co-authored-by: Neo Zhang Jianyu * fix: remove trailing whitespace and add missing newline (EditorConfig) --------- Co-authored-by: Neo Zhang Jianyu --- docs/ops.md | 2 +- docs/ops/SYCL.csv | 8 +- ggml/src/ggml-sycl/ggml-sycl.cpp | 11 +++ ggml/src/ggml-sycl/norm.cpp | 156 +++++++++++++++++++++++++++++++ ggml/src/ggml-sycl/norm.hpp | 2 + 5 files changed, 174 insertions(+), 5 deletions(-) diff --git a/docs/ops.md b/docs/ops.md index dfd1cfab6a8..3738a480728 100644 --- a/docs/ops.md +++ b/docs/ops.md @@ -79,7 +79,7 @@ Legend: | REPEAT | ❌ | ✅ | ✅ | 🟡 | ✅ | 🟡 | ✅ | 🟡 | ❌ | | REPEAT_BACK | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | | RMS_NORM | ❌ | ✅ | ✅ | ✅ | 🟡 | ✅ | ✅ | ✅ | ❌ | -| RMS_NORM_BACK | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ❌ | ✅ | ❌ | +| RMS_NORM_BACK | ❌ | ❌ | ✅ | ✅ | ❌ | ❌ | ✅ | ✅ | ❌ | | RMS_NORM_MUL_ADD | ❌ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | | ROLL | ❌ | ❌ | ✅ | ❌ | ❌ | ❌ | ❌ | ✅ | ❌ | | ROPE | ❌ | 🟡 | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ❌ | diff --git a/docs/ops/SYCL.csv b/docs/ops/SYCL.csv index fe6876357f3..101e80f64c6 100644 --- a/docs/ops/SYCL.csv +++ b/docs/ops/SYCL.csv @@ -5637,25 +5637,25 @@ "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000000,inplace=0","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000000","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000000,inplace=0","support","1","yes","SYCL" -"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000000","support","0","no","SYCL" +"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000000","support","1","yes","SYCL" "SYCL0","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=0","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000001","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000001,inplace=0","support","1","yes","SYCL" -"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000001","support","0","no","SYCL" +"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000001","support","1","yes","SYCL" "SYCL0","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000100","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000100,inplace=0","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000100","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.000100,inplace=0","support","1","yes","SYCL" -"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000100","support","0","no","SYCL" +"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.000100","support","1","yes","SYCL" "SYCL0","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.100000","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.100000,inplace=0","support","1","yes","SYCL" "SYCL0","NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.100000","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=1,eps=0.100000,inplace=0","support","1","yes","SYCL" -"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.100000","support","0","no","SYCL" +"SYCL0","RMS_NORM_BACK","type=f32,ne=[64,5,4,3],eps=0.100000","support","1","yes","SYCL" "SYCL0","L2_NORM","type=f32,ne=[64,5,4,3]","support","1","yes","SYCL" "SYCL0","RMS_NORM","type=f32,ne=[64,5,4,3],v=0,eps=0.000001,inplace=1","support","1","yes","SYCL" "SYCL0","RMS_NORM_MUL_ADD","type=f32,ne=[64,5,4,3],eps=0.000000,broadcast=0,multi_add=0","support","1","yes","SYCL" diff --git a/ggml/src/ggml-sycl/ggml-sycl.cpp b/ggml/src/ggml-sycl/ggml-sycl.cpp index 328d1a71b75..c97c5899435 100644 --- a/ggml/src/ggml-sycl/ggml-sycl.cpp +++ b/ggml/src/ggml-sycl/ggml-sycl.cpp @@ -42,6 +42,7 @@ #include "ggml-sycl/backend.hpp" #include "ggml-sycl/common.hpp" #include "ggml-sycl/element_wise.hpp" +#include "ggml-sycl/norm.hpp" #include "ggml-sycl/presets.hpp" #include "ggml-sycl/gemm.hpp" #include "ggml-sycl/set_rows.hpp" @@ -2637,6 +2638,11 @@ static void ggml_sycl_rms_norm(ggml_backend_sycl_context & ctx, ggml_tensor * ds ggml_sycl_op_rms_norm(ctx, dst); } +static void ggml_sycl_rms_norm_back(ggml_backend_sycl_context & ctx, ggml_tensor * dst) { + scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2); + ggml_sycl_op_rms_norm_back(ctx, dst); +} + static void ggml_sycl_l2_norm(ggml_backend_sycl_context & ctx, ggml_tensor * dst) { scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/1); ggml_sycl_op_l2_norm(ctx, dst); @@ -3827,6 +3833,9 @@ static bool ggml_sycl_compute_forward(ggml_backend_sycl_context & ctx, struct gg case GGML_OP_LEAKY_RELU: ggml_sycl_leaky_relu(ctx, dst); break; + case GGML_OP_RMS_NORM_BACK: + ggml_sycl_rms_norm_back(ctx, dst); + break; case GGML_OP_RMS_NORM: ggml_sycl_rms_norm(ctx, dst); break; @@ -4571,6 +4580,8 @@ static bool ggml_backend_sycl_device_supports_op(ggml_backend_dev_t dev, const g return ggml_is_contiguous(op->src[0]); case GGML_OP_RMS_NORM: return ((op->src[0]->ne[0] % WARP_SIZE) == 0); + case GGML_OP_RMS_NORM_BACK: + return ((op->src[0]->ne[0] % WARP_SIZE) == 0); case GGML_OP_SCALE: return true; case GGML_OP_CONT: diff --git a/ggml/src/ggml-sycl/norm.cpp b/ggml/src/ggml-sycl/norm.cpp index 4ec1416849c..823d3a4828c 100644 --- a/ggml/src/ggml-sycl/norm.cpp +++ b/ggml/src/ggml-sycl/norm.cpp @@ -480,6 +480,162 @@ void ggml_sycl_op_rms_norm(ggml_backend_sycl_context & ctx, ggml_tensor * dst) { rms_norm_f32_sycl(src0_dd, dst_dd, ne00, ne01, ne02, ne03, s01, s02, s03, eps, main_stream, ctx.device); } +void ggml_sycl_op_rms_norm_back(ggml_backend_sycl_context & ctx, ggml_tensor * dst) { + scope_op_debug_print scope_dbg_print(__func__, dst, /*num_src=*/2); + + GGML_ASSERT(dst->src[0]->type == GGML_TYPE_F32); // dz + GGML_ASSERT(dst->src[1]->type == GGML_TYPE_F32); // x + GGML_ASSERT(dst->type == GGML_TYPE_F32); + + float eps = 1e-5f; + std::memcpy(&eps, dst->op_params, sizeof(float)); + if (!(eps > 0.0f) || !std::isfinite(eps)) eps = 1e-5f; + + const float * g_base = static_cast(dst->src[0]->data); // dz + const float * x_base = static_cast(dst->src[1]->data); // x + float * dx_base = static_cast< float *>(dst->data); + + const int64_t D = dst->ne[0]; + const int64_t n1 = dst->ne[1], n2 = dst->ne[2], n3 = dst->ne[3]; (void) n3; + const int64_t N = ggml_nrows(dst); + if (D == 0 || N == 0) return; + + const ggml_tensor *G = dst->src[0]; + const ggml_tensor *X = dst->src[1]; + const int ts = (int) ggml_type_size(X->type); + GGML_ASSERT((size_t) X->nb[0] == (size_t) ts); + GGML_ASSERT((size_t) G->nb[0] == (size_t) ts); + GGML_ASSERT((size_t) dst->nb[0] == (size_t) ts); + + const int64_t xs1 = X->nb[1] / ts, xs2 = X->nb[2] / ts, xs3 = X->nb[3] / ts; + const int64_t gs1 = G->nb[1] / ts, gs2 = G->nb[2] / ts, gs3 = G->nb[3] / ts; + const int64_t ds1 = dst->nb[1] / ts, ds2 = dst->nb[2] / ts, ds3 = dst->nb[3] / ts; + + dpct::queue_ptr q = ctx.stream(); + + // work-group size: multiple of WARP_SIZE, capped by device and 256, and not larger than D + const int device_max_wg = ggml_sycl_info().max_work_group_sizes[ctx.device]; + auto roundup = [](int v, int m) { return ((v + m - 1) / m) * m; }; + int wg_cap = 256; + if (device_max_wg > 0) wg_cap = std::min(wg_cap, device_max_wg); + int WG = std::max(WARP_SIZE, std::min(roundup((int)std::min(D, wg_cap), WARP_SIZE), wg_cap)); + + // FP32 path: per-thread compensated accumulation + hierarchical reduction + q->submit([&](sycl::handler &cgh) { + const int nwarps_loc = std::max(1, WG / WARP_SIZE); + // store one partial value per warp (xx and xg) for cross-warp reduction + auto l_xx = sycl::local_accessor(sycl::range<1>(nwarps_loc), cgh); + auto l_xg = sycl::local_accessor(sycl::range<1>(nwarps_loc), cgh); + + cgh.parallel_for( + sycl::nd_range<3>(sycl::range<3>(1, 1, N) * sycl::range<3>(1, 1, WG), + sycl::range<3>(1, 1, WG)), + [=](sycl::nd_item<3> item_ct1) [[sycl::reqd_sub_group_size(WARP_SIZE)]] { + const int row = item_ct1.get_group(2); + const int tid = item_ct1.get_local_id(2); + + const int64_t i1 = row % n1; + const int64_t i2 = (row / n1) % n2; + const int64_t i3 = row / (n1 * n2); + + const float *__restrict x_row = x_base + i3 * xs3 + i2 * xs2 + i1 * xs1; + const float *__restrict g_row = g_base + i3 * gs3 + i2 * gs2 + i1 * gs1; + float *__restrict d_row = dx_base + i3 * ds3 + i2 * ds2 + i1 * ds1; + + // per-thread accumulation (compensated by default) + float sum_xx = 0.f, sum_xg = 0.f; +#ifndef GGML_SYCL_RMS_BACK_FAST + float c_xx = 0.f, c_xg = 0.f; +#endif + for (int64_t col = tid; col < D; col += WG) { + const float xv = x_row[col]; + const float gv = g_row[col]; +#ifdef GGML_SYCL_RMS_BACK_FAST + sum_xx += xv * xv; + sum_xg += xv * gv; +#else + float y1 = xv * xv - c_xx; + float t1 = sum_xx + y1; + c_xx = (t1 - sum_xx) - y1; + sum_xx = t1; + + float y2 = xv * gv - c_xg; + float t2 = sum_xg + y2; + c_xg = (t2 - sum_xg) - y2; + sum_xg = t2; +#endif + } + + // warp-level reduction + sycl::float2 xx = sycl::float2(sum_xx, +#ifndef GGML_SYCL_RMS_BACK_FAST + c_xx +#else + 0.f +#endif + ); + sycl::float2 xg = sycl::float2(sum_xg, +#ifndef GGML_SYCL_RMS_BACK_FAST + c_xg +#else + 0.f +#endif + ); + xx = warp_reduce_sum(xx, item_ct1); + xg = warp_reduce_sum(xg, item_ct1); + + // cross-warp reduction using local memory (single barrier) + const auto sub_group = item_ct1.get_sub_group(); + const auto sg_id = sub_group.get_group_linear_id(); + const auto wi_in_sg = sub_group.get_local_linear_id(); + const int nthreads = item_ct1.get_local_range(2); + const int nwarps = nthreads / WARP_SIZE; + + sycl::float2 xx_total = xx; + sycl::float2 xg_total = xg; + if (nwarps > 1) { + if (wi_in_sg == 0) { + l_xx[sg_id] = xx; + l_xg[sg_id] = xg; + } + item_ct1.barrier(sycl::access::fence_space::local_space); + + if (sg_id == 0) { + const unsigned wi_u = wi_in_sg; + sycl::float2 xx_first = (wi_u < static_cast(nwarps)) ? l_xx[wi_u] : sycl::float2(0.f, 0.f); + sycl::float2 xg_first = (wi_u < static_cast(nwarps)) ? l_xg[wi_u] : sycl::float2(0.f, 0.f); + xx_total = warp_reduce_sum(xx_first, item_ct1); + xg_total = warp_reduce_sum(xg_first, item_ct1); + } else { + // other subgroups keep their local totals; they'll be ignored + xx_total = xx; + xg_total = xg; + } + // ensure all threads see the first-subgroup result via broadcast below + } + + // compute inv_r and coeff once per row and broadcast to the whole work-group + float inv_r = 0.f; + float coeff = 0.f; + if (tid == 0) { + const float sum_xx_f = xx_total.x() + xx_total.y(); + const float sum_xdz_f = xg_total.x() + xg_total.y(); + const float mean_eps = sum_xx_f / (float) D + eps; + const float sum_eps = sum_xx_f + eps * (float) D; + inv_r = sycl::rsqrt(mean_eps); + coeff = -sum_xdz_f / sum_eps; + } + inv_r = sycl::group_broadcast(item_ct1.get_group(), inv_r); + coeff = sycl::group_broadcast(item_ct1.get_group(), coeff); + + for (int64_t col = tid; col < D; col += WG) { + d_row[col] = (g_row[col] + coeff * x_row[col]) * inv_r; + } + }); + }); + +} + void ggml_sycl_op_l2_norm(ggml_backend_sycl_context& ctx, ggml_tensor* dst) { GGML_ASSERT(dst->src[0]->type == GGML_TYPE_F32); diff --git a/ggml/src/ggml-sycl/norm.hpp b/ggml/src/ggml-sycl/norm.hpp index 612cd67cf91..8cb885eb2ee 100644 --- a/ggml/src/ggml-sycl/norm.hpp +++ b/ggml/src/ggml-sycl/norm.hpp @@ -19,6 +19,8 @@ void ggml_sycl_op_norm(ggml_backend_sycl_context& ctx, ggml_tensor* dst); void ggml_sycl_op_rms_norm(ggml_backend_sycl_context& ctx, ggml_tensor* dst); +void ggml_sycl_op_rms_norm_back(ggml_backend_sycl_context& ctx, ggml_tensor* dst); + void ggml_sycl_op_group_norm(ggml_backend_sycl_context& ctx, ggml_tensor* dst); void ggml_sycl_op_l2_norm(ggml_backend_sycl_context& ctx, ggml_tensor* dst); From 9a3ea685b937c0f0cbfda2e50004ea54bf187512 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Wed, 29 Oct 2025 15:55:06 +0800 Subject: [PATCH 005/185] CUDA: Fix bug in topk-moe for gpt-oss (#16821) * CUDA: Fix bug in topk-moe for gpt-oss When using ggml_can_fuse_subgraph, the output nodes which are passed are wrong. This causes `test-backend-ops` to still fuse ndoes (because the nodes are not used elsewhere in the graph), but it actually doesn't fuse in the actual gpt-oss * fix for qwen3 too * change ifndef to ifdef --- ggml/src/ggml-cuda/ggml-cuda.cu | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/ggml/src/ggml-cuda/ggml-cuda.cu b/ggml/src/ggml-cuda/ggml-cuda.cu index be505748af5..fcff5d7cdc1 100644 --- a/ggml/src/ggml-cuda/ggml-cuda.cu +++ b/ggml/src/ggml-cuda/ggml-cuda.cu @@ -2978,7 +2978,7 @@ static bool ggml_cuda_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, ggml_cuda_topk_moe_ops(/*with_norm=*/false, /*delayed_softmax=*/true); if (ops.size() == topk_moe_ops_with_norm.size() && - ggml_can_fuse_subgraph(cgraph, node_idx, ops, { node_idx + 3, node_idx + 8 })) { + ggml_can_fuse_subgraph(cgraph, node_idx, ops, { node_idx + 3, node_idx + 9 })) { ggml_tensor * softmax = cgraph->nodes[node_idx]; ggml_tensor * weights = cgraph->nodes[node_idx + 9]; @@ -2997,7 +2997,7 @@ static bool ggml_cuda_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, } if (ops.size() == topk_moe_ops_delayed_softmax.size() && - ggml_can_fuse_subgraph(cgraph, node_idx, ops, { node_idx + 2, node_idx + 5 })) { + ggml_can_fuse_subgraph(cgraph, node_idx, ops, { node_idx + 1, node_idx + 5 })) { ggml_tensor * softmax = cgraph->nodes[node_idx + 4]; ggml_tensor * weights = cgraph->nodes[node_idx + 5]; @@ -3118,9 +3118,20 @@ static void evaluate_and_capture_cuda_graph(ggml_backend_cuda_context * cuda_ctx // With the use of CUDA graphs, the execution will be performed by the graph launch. if (!use_cuda_graph || cuda_graph_update_required) { + [[maybe_unused]] int prev_i = 0; + for (int i = 0; i < cgraph->n_nodes; i++) { ggml_tensor * node = cgraph->nodes[i]; + +#ifdef GGML_CUDA_DEBUG + const int nodes_fused = i - prev_i - 1; + prev_i = i; + if (nodes_fused > 0) { + GGML_LOG_INFO("nodes_fused: %d\n", nodes_fused); + } +#endif + if (ggml_is_empty(node) || node->op == GGML_OP_RESHAPE || node->op == GGML_OP_TRANSPOSE || node->op == GGML_OP_VIEW || node->op == GGML_OP_PERMUTE || node->op == GGML_OP_NONE) { continue; } From f549b0007dbdd683215820f7229ce180a12b191d Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Wed, 29 Oct 2025 03:53:04 -0500 Subject: [PATCH 006/185] vulkan: Call ggml_vk_buffer_write_2d from ggml_vk_buffer_copy (#16793) This lets the copy to the destination device use the host-visible vidmem optimization. --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 173677a2637..5caf37d4030 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -5652,14 +5652,11 @@ static void ggml_vk_buffer_copy(vk_buffer& dst, size_t dst_offset, vk_buffer& sr VK_LOG_DEBUG("ggml_vk_buffer_copy(MULTI_DEVICE, " << size << ")"); // Copy device to device ggml_vk_ensure_sync_staging_buffer(src->device, size); - ggml_vk_ensure_sync_staging_buffer(dst->device, size); // Copy to src staging buffer ggml_vk_buffer_copy(src->device->sync_staging, 0, src, src_offset, size); - // memcpy to dst staging buffer - memcpy(dst->device->sync_staging->ptr, src->device->sync_staging->ptr, size); // Copy to dst buffer - ggml_vk_buffer_copy(dst, dst_offset, dst->device->sync_staging, 0, size); + ggml_vk_buffer_write_2d(dst, dst_offset, src->device->sync_staging->ptr, 0, size, 1); } } From 144a4ce824b6bd0e48d62009d10cae1daf5308db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Wed, 29 Oct 2025 14:09:50 +0100 Subject: [PATCH 007/185] vendor : sync minja (#16500) * sync minja.hpp Adds Call/EndCall support, used in MiniCPM3 and MiniCPM4-MCP. * remove spurious semicolon * sync from ochafik/minja --- vendor/minja/minja.hpp | 111 +++++++++++++++++++++++++++++++++++------ 1 file changed, 96 insertions(+), 15 deletions(-) diff --git a/vendor/minja/minja.hpp b/vendor/minja/minja.hpp index dad75efbba5..57b138add6a 100644 --- a/vendor/minja/minja.hpp +++ b/vendor/minja/minja.hpp @@ -55,7 +55,7 @@ inline std::string normalize_newlines(const std::string & s) { } /* Values that behave roughly like in Python. */ -class Value : public std::enable_shared_from_this { +class Value { public: using CallableType = std::function &, ArgumentsValue &)>; using FilterType = std::function &, ArgumentsValue &)>; @@ -158,12 +158,14 @@ class Value : public std::enable_shared_from_this { Value(const json & v) { if (v.is_object()) { auto object = std::make_shared(); + object->reserve(v.size()); for (auto it = v.begin(); it != v.end(); ++it) { - (*object)[it.key()] = it.value(); + object->emplace_back(it.key(), Value(it.value())); } object_ = std::move(object); } else if (v.is_array()) { auto array = std::make_shared(); + array->reserve(v.size()); for (const auto& item : v) { array->push_back(Value(item)); } @@ -610,7 +612,7 @@ static std::string error_location_suffix(const std::string & source, size_t pos) return out.str(); } -class Context : public std::enable_shared_from_this { +class Context { protected: Value values_; std::shared_ptr parent_; @@ -706,7 +708,7 @@ enum SpaceHandling { Keep, Strip, StripSpaces, StripNewline }; class TemplateToken { public: - enum class Type { Text, Expression, If, Else, Elif, EndIf, For, EndFor, Generation, EndGeneration, Set, EndSet, Comment, Macro, EndMacro, Filter, EndFilter, Break, Continue }; + enum class Type { Text, Expression, If, Else, Elif, EndIf, For, EndFor, Generation, EndGeneration, Set, EndSet, Comment, Macro, EndMacro, Filter, EndFilter, Break, Continue, Call, EndCall }; static std::string typeToString(Type t) { switch (t) { @@ -729,6 +731,8 @@ class TemplateToken { case Type::EndGeneration: return "endgeneration"; case Type::Break: return "break"; case Type::Continue: return "continue"; + case Type::Call: return "call"; + case Type::EndCall: return "endcall"; } return "Unknown"; } @@ -846,6 +850,17 @@ struct LoopControlTemplateToken : public TemplateToken { LoopControlTemplateToken(const Location & loc, SpaceHandling pre, SpaceHandling post, LoopControlType control_type) : TemplateToken(Type::Break, loc, pre, post), control_type(control_type) {} }; +struct CallTemplateToken : public TemplateToken { + std::shared_ptr expr; + CallTemplateToken(const Location & loc, SpaceHandling pre, SpaceHandling post, std::shared_ptr && e) + : TemplateToken(Type::Call, loc, pre, post), expr(std::move(e)) {} +}; + +struct EndCallTemplateToken : public TemplateToken { + EndCallTemplateToken(const Location & loc, SpaceHandling pre, SpaceHandling post) + : TemplateToken(Type::EndCall, loc, pre, post) {} +}; + class TemplateNode { Location location_; protected: @@ -1047,36 +1062,48 @@ class MacroNode : public TemplateNode { } } } - void do_render(std::ostringstream &, const std::shared_ptr & macro_context) const override { + void do_render(std::ostringstream &, const std::shared_ptr & context) const override { if (!name) throw std::runtime_error("MacroNode.name is null"); if (!body) throw std::runtime_error("MacroNode.body is null"); - auto callable = Value::callable([&](const std::shared_ptr & context, ArgumentsValue & args) { - auto call_context = macro_context; + + // Use init-capture to avoid dangling 'this' pointer and circular references + auto callable = Value::callable([weak_context = std::weak_ptr(context), + name = name, params = params, body = body, + named_param_positions = named_param_positions] + (const std::shared_ptr & call_context, ArgumentsValue & args) { + auto context_locked = weak_context.lock(); + if (!context_locked) throw std::runtime_error("Macro context no longer valid"); + auto execution_context = Context::make(Value::object(), context_locked); + + if (call_context->contains("caller")) { + execution_context->set("caller", call_context->get("caller")); + } + std::vector param_set(params.size(), false); for (size_t i = 0, n = args.args.size(); i < n; i++) { auto & arg = args.args[i]; if (i >= params.size()) throw std::runtime_error("Too many positional arguments for macro " + name->get_name()); param_set[i] = true; - auto & param_name = params[i].first; - call_context->set(param_name, arg); + const auto & param_name = params[i].first; + execution_context->set(param_name, arg); } for (auto & [arg_name, value] : args.kwargs) { auto it = named_param_positions.find(arg_name); if (it == named_param_positions.end()) throw std::runtime_error("Unknown parameter name for macro " + name->get_name() + ": " + arg_name); - call_context->set(arg_name, value); + execution_context->set(arg_name, value); param_set[it->second] = true; } // Set default values for parameters that were not passed for (size_t i = 0, n = params.size(); i < n; i++) { if (!param_set[i] && params[i].second != nullptr) { - auto val = params[i].second->evaluate(context); - call_context->set(params[i].first, val); + auto val = params[i].second->evaluate(call_context); + execution_context->set(params[i].first, val); } } - return body->render(call_context); + return body->render(execution_context); }); - macro_context->set(name->get_name(), callable); + context->set(name->get_name(), callable); } }; @@ -1611,6 +1638,44 @@ class CallExpr : public Expression { } }; +class CallNode : public TemplateNode { + std::shared_ptr expr; + std::shared_ptr body; + +public: + CallNode(const Location & loc, std::shared_ptr && e, std::shared_ptr && b) + : TemplateNode(loc), expr(std::move(e)), body(std::move(b)) {} + + void do_render(std::ostringstream & out, const std::shared_ptr & context) const override { + if (!expr) throw std::runtime_error("CallNode.expr is null"); + if (!body) throw std::runtime_error("CallNode.body is null"); + + // Use init-capture to avoid dangling 'this' pointer and circular references + auto caller = Value::callable([weak_context = std::weak_ptr(context), body=body] + (const std::shared_ptr &, ArgumentsValue &) -> Value { + auto context_locked = weak_context.lock(); + if (!context_locked) throw std::runtime_error("Caller context no longer valid"); + return Value(body->render(context_locked)); + }); + + context->set("caller", caller); + + auto call_expr = dynamic_cast(expr.get()); + if (!call_expr) { + throw std::runtime_error("Invalid call block syntax - expected function call"); + } + + Value function = call_expr->object->evaluate(context); + if (!function.is_callable()) { + throw std::runtime_error("Call target must be callable: " + function.dump()); + } + ArgumentsValue args = call_expr->args.evaluate(context); + + Value result = function.call(context, args); + out << result.to_str(); + } +}; + class FilterExpr : public Expression { std::vector> parts; public: @@ -2320,7 +2385,7 @@ class Parser { static std::regex comment_tok(R"(\{#([-~]?)([\s\S]*?)([-~]?)#\})"); static std::regex expr_open_regex(R"(\{\{([-~])?)"); static std::regex block_open_regex(R"(^\{%([-~])?\s*)"); - static std::regex block_keyword_tok(R"((if|else|elif|endif|for|endfor|generation|endgeneration|set|endset|block|endblock|macro|endmacro|filter|endfilter|break|continue)\b)"); + static std::regex block_keyword_tok(R"((if|else|elif|endif|for|endfor|generation|endgeneration|set|endset|block|endblock|macro|endmacro|filter|endfilter|break|continue|call|endcall)\b)"); static std::regex non_text_open_regex(R"(\{\{|\{%|\{#)"); static std::regex expr_close_regex(R"(\s*([-~])?\}\})"); static std::regex block_close_regex(R"(\s*([-~])?%\})"); @@ -2443,6 +2508,15 @@ class Parser { } else if (keyword == "endmacro") { auto post_space = parseBlockClose(); tokens.push_back(std::make_unique(location, pre_space, post_space)); + } else if (keyword == "call") { + auto expr = parseExpression(); + if (!expr) throw std::runtime_error("Expected expression in call block"); + + auto post_space = parseBlockClose(); + tokens.push_back(std::make_unique(location, pre_space, post_space, std::move(expr))); + } else if (keyword == "endcall") { + auto post_space = parseBlockClose(); + tokens.push_back(std::make_unique(location, pre_space, post_space)); } else if (keyword == "filter") { auto filter = parseExpression(); if (!filter) throw std::runtime_error("Expected expression in filter block"); @@ -2575,6 +2649,12 @@ class Parser { throw unterminated(**start); } children.emplace_back(std::make_shared(token->location, std::move(macro_token->name), std::move(macro_token->params), std::move(body))); + } else if (auto call_token = dynamic_cast(token.get())) { + auto body = parseTemplate(begin, it, end); + if (it == end || (*(it++))->type != TemplateToken::Type::EndCall) { + throw unterminated(**start); + } + children.emplace_back(std::make_shared(token->location, std::move(call_token->expr), std::move(body))); } else if (auto filter_token = dynamic_cast(token.get())) { auto body = parseTemplate(begin, it, end); if (it == end || (*(it++))->type != TemplateToken::Type::EndFilter) { @@ -2588,6 +2668,7 @@ class Parser { } else if (dynamic_cast(token.get()) || dynamic_cast(token.get()) || dynamic_cast(token.get()) + || dynamic_cast(token.get()) || dynamic_cast(token.get()) || dynamic_cast(token.get()) || dynamic_cast(token.get()) From e41bcce8f0b53032a1fed275cd253e931c041cf6 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Wed, 29 Oct 2025 21:11:53 +0800 Subject: [PATCH 008/185] CUDA: use fastdiv in set-rows (#16834) * CUDA: use fastdiv in set-rows * add assert about value fitting in u32 --- ggml/src/ggml-cuda/common.cuh | 7 +- ggml/src/ggml-cuda/set-rows.cu | 148 ++++++++++++++++++++++----------- 2 files changed, 106 insertions(+), 49 deletions(-) diff --git a/ggml/src/ggml-cuda/common.cuh b/ggml/src/ggml-cuda/common.cuh index 1af23588301..6a472be7fbb 100644 --- a/ggml/src/ggml-cuda/common.cuh +++ b/ggml/src/ggml-cuda/common.cuh @@ -625,8 +625,11 @@ static __device__ __forceinline__ float ggml_cuda_e8m0_to_fp32(uint8_t x) { // and a shift: // // n/d = (mulhi(n, mp) + n) >> L; -static const uint3 init_fastdiv_values(uint32_t d) { - GGML_ASSERT(d != 0); +static const uint3 init_fastdiv_values(uint64_t d_64) { + GGML_ASSERT(d_64 != 0); + GGML_ASSERT(d_64 <= std::numeric_limits::max()); + + uint32_t d = (uint32_t)d_64; // compute L = ceil(log2(d)); uint32_t L = 0; diff --git a/ggml/src/ggml-cuda/set-rows.cu b/ggml/src/ggml-cuda/set-rows.cu index 1525a159527..631de7e8fa5 100644 --- a/ggml/src/ggml-cuda/set-rows.cu +++ b/ggml/src/ggml-cuda/set-rows.cu @@ -4,30 +4,53 @@ typedef void (*set_rows_kernel_t)(const char * src, char * dst); // Generic quantized set_rows kernel template -template -static __global__ void k_set_rows_quant( - const float * __restrict__ src0, const idx_t * __restrict__ src1, block_type * __restrict__ dst, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t ne03, - const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t ne13, - const int64_t s01, const int64_t s02, const int64_t s03, - const int64_t s10, const int64_t s11, const int64_t s12, - const int64_t s1, const int64_t s2, const int64_t s3) { - +template +static __global__ void k_set_rows_quant(const float * __restrict__ src0, + const idx_t * __restrict__ src1, + block_type * __restrict__ dst, + const int64_t ne_total, + const int64_t ne10, + const int64_t ne11, + const int64_t ne12, + const int64_t ne13, + const int64_t s01, + const int64_t s02, + const int64_t s03, + const int64_t s10, + const int64_t s11, + const int64_t s12, + const int64_t s1, + const int64_t s2, + const int64_t s3, + const uint3 ne00, + const uint3 ne01, + const uint3 ne02, + const uint3 ne11_fd, + const uint3 ne12_fd) { const int64_t i = int64_t(blockDim.x) * blockIdx.x + threadIdx.x; - const int64_t ne_total = (ne00 * ne01 * ne02 * ne03) / qk; if (i >= ne_total) { return; } const int64_t i_base = i * qk; - const int64_t i03 = i_base / (ne00 * ne01 * ne02); - const int64_t i02 = (i_base - i03 * ne00 * ne01 * ne02) / (ne00 * ne01); - const int64_t i01 = (i_base - i03 * ne00 * ne01 * ne02 - i02 * ne00 * ne01) / ne00; - const int64_t i00 = i_base - i03 * ne00 * ne01 * ne02 - i02 * ne00 * ne01 - i01 * ne00; + uint32_t tmp = (uint32_t) i_base; + uint2 div_mod; + + div_mod = fast_div_modulo(tmp, ne00); + const int64_t i00 = div_mod.y; + tmp = div_mod.x; - const int64_t i12 = i03 % ne12; - const int64_t i11 = i02 % ne11; + div_mod = fast_div_modulo(tmp, ne01); + const int64_t i01 = div_mod.y; + tmp = div_mod.x; + + div_mod = fast_div_modulo(tmp, ne02); + const int64_t i02 = div_mod.y; + const int64_t i03 = div_mod.x; + + const int64_t i12 = fastmodulo((uint32_t) i03, ne12_fd); + const int64_t i11 = fastmodulo((uint32_t) i02, ne11_fd); const int64_t i10 = i01; const int64_t dst_row = *(src1 + i10*s10 + i11*s11 + i12*s12); @@ -41,6 +64,8 @@ static __global__ void k_set_rows_quant( quantize_func(src_block, dst_block); GGML_UNUSED(ne10); + GGML_UNUSED(ne11); + GGML_UNUSED(ne12); GGML_UNUSED(ne13); } @@ -71,40 +96,65 @@ static void set_rows_cuda_quant( const int64_t s2 = nb2; const int64_t s3 = nb3; - if (ne_total > 0) { + if (ne_total > 0 && ne00 > 0 && ne01 > 0 && ne02 > 0 && ne11 > 0 && ne12 > 0) { + const uint3 ne00_fd = init_fastdiv_values((uint32_t) ne00); + const uint3 ne01_fd = init_fastdiv_values((uint32_t) ne01); + const uint3 ne02_fd = init_fastdiv_values((uint32_t) ne02); + const uint3 ne11_fd = init_fastdiv_values((uint32_t) ne11); + const uint3 ne12_fd = init_fastdiv_values((uint32_t) ne12); + k_set_rows_quant<<>>( - src0_d, src1_d, dst_d, - ne00, ne01, ne02, ne03, - ne10, ne11, ne12, ne13, - s01, s02, s03, - s10, s11, s12, - s1, s2, s3); + src0_d, src1_d, dst_d, ne_total, ne10, ne11, ne12, ne13, s01, s02, s03, s10, s11, s12, s1, s2, s3, ne00_fd, + ne01_fd, ne02_fd, ne11_fd, ne12_fd); } } -template -static __global__ void k_set_rows( - const src_t * __restrict__ src0, const idx_t * __restrict__ src1, dst_t * __restrict__ dst, - const int64_t ne00, const int64_t ne01, const int64_t ne02, const int64_t ne03, - const int64_t ne10, const int64_t ne11, const int64_t ne12, const int64_t ne13, - const int64_t s01, const int64_t s02, const int64_t s03, - const int64_t s10, const int64_t s11, const int64_t s12, - const int64_t s1, const int64_t s2, const int64_t s3) { - +template +static __global__ void k_set_rows(const src_t * __restrict__ src0, + const idx_t * __restrict__ src1, + dst_t * __restrict__ dst, + const int64_t ne_total, + const int64_t ne10, + const int64_t ne11, + const int64_t ne12, + const int64_t ne13, + const int64_t s01, + const int64_t s02, + const int64_t s03, + const int64_t s10, + const int64_t s11, + const int64_t s12, + const int64_t s1, + const int64_t s2, + const int64_t s3, + const uint3 ne00, + const uint3 ne01, + const uint3 ne02, + const uint3 ne11_fd, + const uint3 ne12_fd) { const int64_t i = int64_t(blockDim.x) * blockIdx.x + threadIdx.x; - const int64_t ne_total = ne00 * ne01 * ne02 * ne03; if (i >= ne_total) { return; } - const int64_t i03 = i / (ne00 * ne01 * ne02); - const int64_t i02 = (i - i03 * ne00 * ne01 * ne02) / (ne00 * ne01); - const int64_t i01 = (i - i03 * ne00 * ne01 * ne02 - i02 * ne00 * ne01) / ne00; - const int64_t i00 = i - i03 * ne00 * ne01 * ne02 - i02 * ne00 * ne01 - i01 * ne00; + uint32_t tmp = (uint32_t) i; + uint2 div_mod; + + div_mod = fast_div_modulo(tmp, ne00); + const int64_t i00 = div_mod.y; + tmp = div_mod.x; - const int64_t i12 = i03 % ne12; - const int64_t i11 = i02 % ne11; + div_mod = fast_div_modulo(tmp, ne01); + const int64_t i01 = div_mod.y; + tmp = div_mod.x; + + div_mod = fast_div_modulo(tmp, ne02); + const int64_t i02 = div_mod.y; + const int64_t i03 = div_mod.x; + + const int64_t i12 = fastmodulo((uint32_t) i03, ne12_fd); + const int64_t i11 = fastmodulo((uint32_t) i02, ne11_fd); const int64_t i10 = i01; const int64_t dst_row = *(src1 + i10*s10 + i11*s11 + i12*s12); @@ -115,6 +165,8 @@ static __global__ void k_set_rows( dst_row_ptr[i00] = ggml_cuda_cast(src0_row[i00]); GGML_UNUSED(ne10); + GGML_UNUSED(ne11); + GGML_UNUSED(ne12); GGML_UNUSED(ne13); } @@ -144,14 +196,16 @@ static void set_rows_cuda( const int64_t s2 = nb2/sizeof(dst_t); const int64_t s3 = nb3/sizeof(dst_t); - if (ne_total > 0) { - k_set_rows<<>>( - src0_d, src1_d, dst_d, - ne00, ne01, ne02, ne03, - ne10, ne11, ne12, ne13, - s01, s02, s03, - s10, s11, s12, - s1, s2, s3); + if (ne_total > 0 && ne00 > 0 && ne01 > 0 && ne02 > 0 && ne11 > 0 && ne12 > 0) { + const uint3 ne00_fd = init_fastdiv_values((uint32_t) ne00); + const uint3 ne01_fd = init_fastdiv_values((uint32_t) ne01); + const uint3 ne02_fd = init_fastdiv_values((uint32_t) ne02); + const uint3 ne11_fd = init_fastdiv_values((uint32_t) ne11); + const uint3 ne12_fd = init_fastdiv_values((uint32_t) ne12); + + k_set_rows<<>>(src0_d, src1_d, dst_d, ne_total, ne10, ne11, ne12, ne13, s01, + s02, s03, s10, s11, s12, s1, s2, s3, ne00_fd, ne01_fd, ne02_fd, + ne11_fd, ne12_fd); } } From 3eb2be1ca5f37480aeb16102970d9e65f43347fe Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Wed, 29 Oct 2025 06:29:12 -0700 Subject: [PATCH 009/185] Hexagon Op queue & dispatch optimizations (#16820) * hexagon: remove dspqueue callbacks and do all read processing inplace * hexagon: there is no need to ref/deref the buffers at this point We're not going to release the buffers without flushing the session queue. So there is no need to inc/dec the refcounts for every request. We also don't need to include those bufs in the response. * hexagon: bump the thread count in the adb wrapper scripts We can use more CPU cores now that the dedicated dspqueue polling threads are not used (ie no contention). Also enable more agressive polling for now since we still map Flash Attention (and a few other kernels) to the CPU and those dspqueue threads were keeping the CPU cores are higher clock freqs. * hexagon: add lhez as the second code owner --- CODEOWNERS | 2 +- ggml/src/ggml-hexagon/ggml-hexagon.cpp | 270 ++++++++----------------- ggml/src/ggml-hexagon/htp/main.c | 216 +++++--------------- scripts/snapdragon/adb/run-bench.sh | 3 +- scripts/snapdragon/adb/run-cli.sh | 7 +- 5 files changed, 136 insertions(+), 362 deletions(-) diff --git a/CODEOWNERS b/CODEOWNERS index 53d2e1e7ed4..bacc86cbbd6 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -65,7 +65,7 @@ /ggml/src/ggml-impl.h @ggerganov @slaren /ggml/src/ggml-metal/ @ggerganov /ggml/src/ggml-opencl/ @lhez @max-krasnyansky -/ggml/src/ggml-hexagon/ @max-krasnyansky +/ggml/src/ggml-hexagon/ @max-krasnyansky @lhez /ggml/src/ggml-opt.cpp @JohannesGaessler /ggml/src/ggml-quants.* @ggerganov /ggml/src/ggml-rpc/ @rgerganov diff --git a/ggml/src/ggml-hexagon/ggml-hexagon.cpp b/ggml/src/ggml-hexagon/ggml-hexagon.cpp index 5e3dc0a3d0c..2d376a6025c 100644 --- a/ggml/src/ggml-hexagon/ggml-hexagon.cpp +++ b/ggml/src/ggml-hexagon/ggml-hexagon.cpp @@ -217,6 +217,9 @@ struct ggml_hexagon_session { void allocate(int dev_id) noexcept(false); void release() noexcept(true); + void enqueue(struct htp_general_req &req, struct dspqueue_buffer *bufs, uint32_t n_bufs, bool sync = false); + void flush(); + ggml_backend_buffer_type buffer_type; ggml_backend_buffer_type repack_buffer_type; @@ -237,15 +240,37 @@ struct ggml_hexagon_session { uint32_t prof_pkts; }; -// Packet callback -static void htp_packet_callback(dspqueue_t queue, AEEResult error, void * context) { - auto sess = static_cast(context); +void ggml_hexagon_session::enqueue(struct htp_general_req &req, struct dspqueue_buffer *bufs, uint32_t n_bufs, bool sync) { + // Bump pending flag (cleared in the session::flush once we get the responce) + this->op_pending++; // atomic inc + + int err = dspqueue_write(this->queue, + 0, // flags - the framework will autoset this + n_bufs, // number of buffers + bufs, // buffer references + sizeof(req), + (const uint8_t *) &req, // Message + 1000000 // Timeout + ); + + if (err != 0) { + GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", this->name.c_str(), (unsigned) err); + } + + if (sync) { + flush(); + } +} + +// Flush HTP response queue i.e wait for all outstanding requests to complete +void ggml_hexagon_session::flush() { + dspqueue_t q = this->queue; // Repeatedly read packets from the queue until it's empty. We don't // necessarily get a separate callback for each packet, and new packets // may arrive while we're processing the previous one. - while (1) { + while (this->op_pending) { struct htp_general_rsp rsp; uint32_t rsp_size; uint32_t flags; @@ -253,22 +278,23 @@ static void htp_packet_callback(dspqueue_t queue, AEEResult error, void * contex struct dspqueue_buffer bufs[HTP_MAX_PACKET_BUFFERS]; uint32_t n_bufs; - // Read packet from queue - int err = dspqueue_read_noblock(queue, &flags, - HTP_MAX_PACKET_BUFFERS, // Maximum number of buffer references - &n_bufs, // Number of buffer references - bufs, // Buffer references - sizeof(rsp), // Max message length - &rsp_size, // Message length - (uint8_t *) &rsp); - - if (err == AEE_EWOULDBLOCK) { - // Consumed all packets available for now - return; + // Read response packet from queue + int err = dspqueue_read(q, &flags, + HTP_MAX_PACKET_BUFFERS, // Maximum number of buffer references + &n_bufs, // Number of buffer references + bufs, // Buffer references + sizeof(rsp), // Max message length + &rsp_size, // Message length + (uint8_t *) &rsp, + 1000000); // Timeout + + if (err == AEE_EEXPIRED) { + // TODO: might need to bail out if the HTP is stuck on something + continue; } if (err != 0) { - GGML_ABORT("ggml-hex: dspqueue_read_noblock failed: 0x%08x\n", (unsigned) err); + GGML_ABORT("ggml-hex: dspqueue_read failed: 0x%08x\n", (unsigned) err); } // Basic sanity checks @@ -281,21 +307,15 @@ static void htp_packet_callback(dspqueue_t queue, AEEResult error, void * contex // TODO: handle errors } - // FIXME: update profiling implementation - sess->prof_usecs = rsp.prof_usecs; - sess->prof_cycles = rsp.prof_cycles; - sess->prof_pkts = rsp.prof_pkts; + // TODO: update profiling implementation, currently only works for opt_opsync mode + this->prof_usecs = rsp.prof_usecs; + this->prof_cycles = rsp.prof_cycles; + this->prof_pkts = rsp.prof_pkts; - sess->op_pending--; // atomic dec + this->op_pending--; // atomic dec } } -// Error callback - simply terminates with an error. Used where we don't -// expect errors. -[[noreturn]] static void htp_error_callback(dspqueue_t queue, AEEResult error, void * context) { - GGML_ABORT("ggml-hex: dspcall general error 0x%x: for queue %p\n", error, (void *) queue); -} - // ** backend buffers struct ggml_backend_hexagon_buffer_type_context { @@ -1564,7 +1584,8 @@ void ggml_hexagon_session::allocate(int dev_id) noexcept(false) { 0, // Flags 128 * 1024, // Request queue size (in bytes) 64 * 1024, // Response queue size (in bytes) - htp_packet_callback, htp_error_callback, + nullptr, // Read packet callback (we handle reads explicitly) + nullptr, // Error callback (we handle errors during reads) (void *) this, // Callback context &queue); if (err != 0) { @@ -2205,7 +2226,7 @@ static void ggml_hexagon_mul_mat(const struct ggml_tensor * op, uint32_t flags) bufs[0].ptr = src0->data; bufs[0].offset = (uint8_t *) src0->data - src0_buf->base; bufs[0].size = ggml_nbytes(src0); - bufs[0].flags = DSPQUEUE_BUFFER_FLAG_REF; + bufs[0].flags = 0; // Second buffer Input Activations. This is a buffer that the CPU // writes and the DSP reads, so we'll need to flush CPU caches and @@ -2215,8 +2236,7 @@ static void ggml_hexagon_mul_mat(const struct ggml_tensor * op, uint32_t flags) bufs[1].ptr = src1->data; bufs[1].offset = (uint8_t *) src1->data - src1_buf->base; bufs[1].size = ggml_nbytes(src1); - bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Third buffer Output Activations. We'll handle DSP @@ -2227,7 +2247,7 @@ static void ggml_hexagon_mul_mat(const struct ggml_tensor * op, uint32_t flags) bufs[2].ptr = dst->data; bufs[2].offset = (uint8_t *) dst->data - dst_buf->base; bufs[2].size = ggml_nbytes(dst); - bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); // Primary DSP session from the src0 (normally weight) tensor auto sess = src0_buf->sess; @@ -2255,27 +2275,7 @@ static void ggml_hexagon_mul_mat(const struct ggml_tensor * op, uint32_t flags) } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - 3, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000 // Timeout - ); - - if (err != 0) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, 3, opt_opsync); } t2 = ggml_time_us(); @@ -2331,7 +2331,7 @@ static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flag bufs[0].ptr = src0->data; bufs[0].offset = (uint8_t *) src0->data - src0_buf->base; bufs[0].size = ggml_nbytes(src0); - bufs[0].flags = DSPQUEUE_BUFFER_FLAG_REF; + bufs[0].flags = 0; // Second buffer Input Activations. This is a buffer that the CPU // writes and the DSP reads, so we'll need to flush CPU caches and @@ -2341,8 +2341,7 @@ static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flag bufs[1].ptr = src1->data; bufs[1].offset = (uint8_t *) src1->data - src1_buf->base; bufs[1].size = ggml_nbytes(src1); - bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Third buffer expert IDs. This is a buffer that the CPU @@ -2353,8 +2352,7 @@ static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flag bufs[2].ptr = src2->data; bufs[2].offset = (uint8_t *) src2->data - src2_buf->base; bufs[2].size = ggml_nbytes(src2); - bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Forth buffer Output Activations. We'll handle DSP @@ -2365,7 +2363,7 @@ static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flag bufs[3].ptr = dst->data; bufs[3].offset = (uint8_t *) dst->data - dst_buf->base; bufs[3].size = ggml_nbytes(dst); - bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); // Primary DSP session from the src0 (normally weight) tensor auto sess = src0_buf->sess; @@ -2394,27 +2392,7 @@ static void ggml_hexagon_mul_mat_id(const struct ggml_tensor * op, uint32_t flag } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - 4, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000 // Timeout - ); - - if (err != 0) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, 4, opt_opsync); } t2 = ggml_time_us(); @@ -2487,8 +2465,7 @@ static void ggml_hexagon_binary(const struct ggml_tensor * op, uint32_t flags) { bufs[0].ptr = src0->data; bufs[0].offset = (uint8_t *) src0->data - src0_buf->base; bufs[0].size = ggml_nbytes(src0); - bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP; // Second buffer = Second Operand of Binary op @@ -2500,8 +2477,7 @@ static void ggml_hexagon_binary(const struct ggml_tensor * op, uint32_t flags) { bufs[1].ptr = src1->data; bufs[1].offset = (uint8_t *) src1->data - src1_buf->base; bufs[1].size = ggml_nbytes(src1); - bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Third buffer = Output Activations. We'll handle DSP @@ -2512,7 +2488,7 @@ static void ggml_hexagon_binary(const struct ggml_tensor * op, uint32_t flags) { bufs[2].ptr = dst->data; bufs[2].offset = (uint8_t *) dst->data - dst_buf->base; bufs[2].size = ggml_nbytes(dst); - bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); // Primary DSP session from the src0 tensor ggml_hexagon_session * sess = src0_buf->sess; @@ -2540,26 +2516,7 @@ static void ggml_hexagon_binary(const struct ggml_tensor * op, uint32_t flags) { } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - 3, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000); // Timeout - - if (0 != err) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, 3, opt_opsync); } t2 = ggml_time_us(); @@ -2624,8 +2581,7 @@ static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { bufs[0].ptr = src0->data; bufs[0].offset = (uint8_t *) src0->data - src0_buf->base; bufs[0].size = ggml_nbytes(src0); - bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP; // Second buffer = experts bias @@ -2633,8 +2589,7 @@ static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { bufs[1].ptr = src1->data; bufs[1].offset = (uint8_t *) src1->data - src1_buf->base; bufs[1].size = ggml_nbytes(src1); - bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Third buffer = activated experts @@ -2642,8 +2597,7 @@ static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { bufs[2].ptr = src2->data; bufs[2].offset = (uint8_t *) src2->data - src2_buf->base; bufs[2].size = ggml_nbytes(src2); - bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP // Forth buffer = output activations @@ -2651,7 +2605,7 @@ static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { bufs[3].ptr = dst->data; bufs[3].offset = (uint8_t *) dst->data - dst_buf->base; bufs[3].size = ggml_nbytes(dst); - bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); // Primary DSP session from the src0 tensor ggml_hexagon_session * sess = src0_buf->sess; @@ -2681,26 +2635,7 @@ static void ggml_hexagon_add_id(const struct ggml_tensor * op, uint32_t flags) { } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - 4, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000); // Timeout - - if (0 != err) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, 4, opt_opsync); } t2 = ggml_time_us(); @@ -2798,8 +2733,7 @@ static void ggml_hexagon_unary(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = src0->data; bufs[n_bufs].offset = (uint8_t *) src0->data - src0_buf->base; bufs[n_bufs].size = ggml_nbytes(src0); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP; ++n_bufs; @@ -2814,8 +2748,7 @@ static void ggml_hexagon_unary(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = src1->data; bufs[n_bufs].offset = (uint8_t *) src1->data - src1_buf->base; bufs[n_bufs].size = ggml_nbytes(src1); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP ++n_bufs; } @@ -2830,7 +2763,7 @@ static void ggml_hexagon_unary(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = dst->data; bufs[n_bufs].offset = (uint8_t *) dst->data - dst_buf->base; bufs[n_bufs].size = ggml_nbytes(dst); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); ++n_bufs; // Primary DSP session from the src0 tensor @@ -2863,26 +2796,7 @@ static void ggml_hexagon_unary(const struct ggml_tensor * op, uint32_t flags) { } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - n_bufs, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000); // Timeout - - if (0 != err) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, n_bufs, opt_opsync); } t2 = ggml_time_us(); @@ -2956,8 +2870,7 @@ static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = src0->data; bufs[n_bufs].offset = (uint8_t *) src0->data - src0_buf->base; bufs[n_bufs].size = ggml_nbytes(src0); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP; ++n_bufs; @@ -2971,8 +2884,7 @@ static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = src1->data; bufs[n_bufs].offset = (uint8_t *) src1->data - src1_buf->base; bufs[n_bufs].size = ggml_nbytes(src1); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP ++n_bufs; @@ -2987,8 +2899,7 @@ static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = src2->data; bufs[n_bufs].offset = (uint8_t *) src2->data - src2_buf->base; bufs[n_bufs].size = ggml_nbytes(src2); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | // Take a reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush CPU DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate DSP ++n_bufs; } @@ -3003,7 +2914,7 @@ static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { bufs[n_bufs].ptr = dst->data; bufs[n_bufs].offset = (uint8_t *) dst->data - dst_buf->base; bufs[n_bufs].size = ggml_nbytes(dst); - bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_REF | DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); + bufs[n_bufs].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER); ++n_bufs; // Primary DSP session from the src0 tensor @@ -3036,26 +2947,7 @@ static void ggml_hexagon_rope(const struct ggml_tensor * op, uint32_t flags) { } if ((opt_opmask & HTP_OPMASK_QUEUE)) { - // Bump pending flag (cleared in the callback once we get the responce) - sess->op_pending++; // atomic inc - - int err = dspqueue_write(sess->queue, - 0, // flags - the framework will autoset this - n_bufs, // number of buffers - bufs, // buffer references - sizeof(req), - (const uint8_t *) &req, // Message - 1000000); // Timeout - - if (0 != err) { - GGML_ABORT("ggml-hex: %s dspqueue_write failed: 0x%08x\n", sess->name.c_str(), (unsigned) err); - } - } - - if (opt_opsync) { - while (sess->op_pending) { - ; - } + sess->enqueue(req, bufs, n_bufs, opt_opsync); } t2 = ggml_time_us(); @@ -3200,9 +3092,7 @@ static ggml_status ggml_backend_hexagon_graph_compute(ggml_backend_t backend, gg } // Wait until all pending ops complete - while (sess->op_pending) { - ; - } + sess->flush(); return GGML_STATUS_SUCCESS; } @@ -3213,9 +3103,7 @@ static void ggml_backend_hexagon_synchronize(ggml_backend_t backend) { HEX_VERBOSE("ggml-hex: %s synchronize\n", sess->name.c_str()); // Wait until all pending ops complete - while (sess->op_pending) { - ; - } + sess->flush(); } struct node_info { diff --git a/ggml/src/ggml-hexagon/htp/main.c b/ggml/src/ggml-hexagon/htp/main.c index e35ea3b0211..10e27333243 100644 --- a/ggml/src/ggml-hexagon/htp/main.c +++ b/ggml/src/ggml-hexagon/htp/main.c @@ -395,28 +395,14 @@ static void proc_matmul_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs, size_t n_bufs) { - // Prep response buffer structs (needed for error responses, etc) - struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference + struct dspqueue_buffer rsp_bufs[1]; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[2].fd = bufs[2].fd; - rsp_bufs[2].ptr = bufs[2].ptr; - rsp_bufs[2].size = bufs[2].size; - rsp_bufs[2].offset = bufs[2].offset; - rsp_bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP + rsp_bufs[0].fd = bufs[2].fd; + rsp_bufs[0].ptr = bufs[2].ptr; + rsp_bufs[0].size = bufs[2].size; + rsp_bufs[0].offset = bufs[2].offset; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context @@ -444,41 +430,21 @@ static void proc_matmul_req(struct htp_context * ctx, } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 3, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_matmul_id_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs, size_t n_bufs) { - // Prep response buffer structs (needed for error responses, etc) - struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[2].fd = bufs[2].fd; - rsp_bufs[2].ptr = bufs[2].ptr; - rsp_bufs[2].size = bufs[2].size; - rsp_bufs[2].offset = bufs[2].offset; - rsp_bufs[2].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference + struct dspqueue_buffer rsp_bufs[1]; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[3].fd = bufs[3].fd; - rsp_bufs[3].ptr = bufs[3].ptr; - rsp_bufs[3].size = bufs[3].size; - rsp_bufs[3].offset = bufs[3].offset; - rsp_bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP + rsp_bufs[0].fd = bufs[3].fd; + rsp_bufs[0].ptr = bufs[3].ptr; + rsp_bufs[0].size = bufs[3].size; + rsp_bufs[0].offset = bufs[3].offset; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context @@ -508,32 +474,18 @@ static void proc_matmul_id_req(struct htp_context * ctx, } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 4, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_binary_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { - struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference + struct dspqueue_buffer rsp_bufs[1]; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[2].fd = bufs[2].fd; - rsp_bufs[2].ptr = bufs[2].ptr; - rsp_bufs[2].offset = bufs[2].offset; - rsp_bufs[2].size = bufs[2].size; - rsp_bufs[2].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP + rsp_bufs[0].fd = bufs[2].fd; + rsp_bufs[0].ptr = bufs[2].ptr; + rsp_bufs[0].offset = bufs[2].offset; + rsp_bufs[0].size = bufs[2].size; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context @@ -561,38 +513,18 @@ static void proc_binary_req(struct htp_context * ctx, struct htp_general_req * r } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 3, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_add_id_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { - struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - rsp_bufs[2].fd = bufs[2].fd; - rsp_bufs[2].ptr = bufs[2].ptr; - rsp_bufs[2].offset = bufs[2].offset; - rsp_bufs[2].size = bufs[2].size; - rsp_bufs[2].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference + struct dspqueue_buffer rsp_bufs[1]; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[3].fd = bufs[3].fd; - rsp_bufs[3].ptr = bufs[3].ptr; - rsp_bufs[3].offset = bufs[3].offset; - rsp_bufs[3].size = bufs[3].size; - rsp_bufs[3].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP + rsp_bufs[0].fd = bufs[3].fd; + rsp_bufs[0].ptr = bufs[3].ptr; + rsp_bufs[0].offset = bufs[3].offset; + rsp_bufs[0].size = bufs[3].size; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context @@ -622,26 +554,18 @@ static void proc_add_id_req(struct htp_context * ctx, struct htp_general_req * r } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 4, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_unary_req(struct htp_context * ctx, struct htp_general_req * req, struct dspqueue_buffer * bufs) { struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference // We had written to the output buffer, we'd also need to flush it - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP + rsp_bufs[0].fd = bufs[1].fd; + rsp_bufs[0].ptr = bufs[1].ptr; + rsp_bufs[0].offset = bufs[1].offset; + rsp_bufs[0].size = bufs[1].size; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context @@ -669,7 +593,7 @@ static void proc_unary_req(struct htp_context * ctx, struct htp_general_req * re } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 2, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_activations_req(struct htp_context * ctx, @@ -677,33 +601,16 @@ static void proc_activations_req(struct htp_context * ctx, struct dspqueue_buffer * bufs, uint32_t n_bufs) { struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - int write_idx = 1; - if (3 == n_bufs) { - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - write_idx = 2; - } + int write_idx = (n_bufs == 3) ? 2 : 1; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[write_idx].fd = bufs[write_idx].fd; - rsp_bufs[write_idx].ptr = bufs[write_idx].ptr; - rsp_bufs[write_idx].offset = bufs[write_idx].offset; - rsp_bufs[write_idx].size = bufs[write_idx].size; - rsp_bufs[write_idx].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU + rsp_bufs[0].fd = bufs[write_idx].fd; + rsp_bufs[0].ptr = bufs[write_idx].ptr; + rsp_bufs[0].offset = bufs[write_idx].offset; + rsp_bufs[0].size = bufs[write_idx].size; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP + DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context struct htp_ops_context octx = { 0 }; @@ -742,7 +649,7 @@ static void proc_activations_req(struct htp_context * ctx, } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, n_bufs, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void proc_rope_req(struct htp_context * ctx, @@ -750,39 +657,16 @@ static void proc_rope_req(struct htp_context * ctx, struct dspqueue_buffer * bufs, uint32_t n_bufs) { struct dspqueue_buffer rsp_bufs[HTP_MAX_PACKET_BUFFERS]; - memset(rsp_bufs, 0, sizeof(rsp_bufs)); - - rsp_bufs[0].fd = bufs[0].fd; - rsp_bufs[0].ptr = bufs[0].ptr; - rsp_bufs[0].offset = bufs[0].offset; - rsp_bufs[0].size = bufs[0].size; - rsp_bufs[0].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - rsp_bufs[1].fd = bufs[1].fd; - rsp_bufs[1].ptr = bufs[1].ptr; - rsp_bufs[1].offset = bufs[1].offset; - rsp_bufs[1].size = bufs[1].size; - rsp_bufs[1].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - int write_idx = 2; - if (4 == n_bufs) { - rsp_bufs[write_idx].fd = bufs[write_idx].fd; - rsp_bufs[write_idx].ptr = bufs[write_idx].ptr; - rsp_bufs[write_idx].offset = bufs[write_idx].offset; - rsp_bufs[write_idx].size = bufs[write_idx].size; - rsp_bufs[write_idx].flags = DSPQUEUE_BUFFER_FLAG_DEREF; // Release reference - - write_idx++; - } + int write_idx = (n_bufs == 4) ? 3 : 2; // We had written to the output buffer, we'd also need to flush it - rsp_bufs[write_idx].fd = bufs[write_idx].fd; - rsp_bufs[write_idx].ptr = bufs[write_idx].ptr; - rsp_bufs[write_idx].offset = bufs[write_idx].offset; - rsp_bufs[write_idx].size = bufs[write_idx].size; - rsp_bufs[write_idx].flags = (DSPQUEUE_BUFFER_FLAG_DEREF | // Release reference - DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush NSP - DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU + rsp_bufs[0].fd = bufs[write_idx].fd; + rsp_bufs[0].ptr = bufs[write_idx].ptr; + rsp_bufs[0].offset = bufs[write_idx].offset; + rsp_bufs[0].size = bufs[write_idx].size; + rsp_bufs[0].flags = (DSPQUEUE_BUFFER_FLAG_FLUSH_SENDER | // Flush HTP + DSPQUEUE_BUFFER_FLAG_INVALIDATE_RECIPIENT); // Invalidate CPU // Setup Op context struct htp_ops_context octx = { 0 }; @@ -819,7 +703,7 @@ static void proc_rope_req(struct htp_context * ctx, } profile_stop(&prof); - send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, n_bufs, &prof); + send_htp_rsp(ctx, req->op, rsp_status, rsp_bufs, 1, &prof); } static void htp_packet_callback(dspqueue_t queue, int error, void * context) { diff --git a/scripts/snapdragon/adb/run-bench.sh b/scripts/snapdragon/adb/run-bench.sh index 25e0662016c..b2e651e7493 100755 --- a/scripts/snapdragon/adb/run-bench.sh +++ b/scripts/snapdragon/adb/run-bench.sh @@ -35,5 +35,6 @@ adb $adbserial shell " \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ $ndev $nhvx $opmask ./$branch/bin/llama-bench --device $device --mmap 0 -m $basedir/../gguf/$model \ - -t 4 --batch-size 128 -ngl 99 $@ \ + --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ + --batch-size 128 -ngl 99 $@ \ " diff --git a/scripts/snapdragon/adb/run-cli.sh b/scripts/snapdragon/adb/run-cli.sh index 763482e55ab..ab8d6d49a24 100755 --- a/scripts/snapdragon/adb/run-cli.sh +++ b/scripts/snapdragon/adb/run-cli.sh @@ -45,8 +45,9 @@ adb $adbserial shell " \ cd $basedir; ulimit -c unlimited; \ LD_LIBRARY_PATH=$basedir/$branch/lib \ ADSP_LIBRARY_PATH=$basedir/$branch/lib \ - $verbose $experimental $sched $opmask $profile $nhvx $ndev \ - ./$branch/bin/llama-cli --no-mmap -m $basedir/../gguf/$model \ - -t 4 --ctx-size 8192 --batch-size 128 -ctk q8_0 -ctv q8_0 -fa on \ + $verbose $experimental $sched $opmask $profile $nhvx $ndev \ + ./$branch/bin/llama-cli --no-mmap -m $basedir/../gguf/$model \ + --poll 1000 -t 6 --cpu-mask 0xfc --cpu-strict 1 \ + --ctx-size 8192 --batch-size 128 -ctk q8_0 -ctv q8_0 -fa on \ -ngl 99 --device $device $cli_opts $@ \ " From bcf5bda6f5df559565d11d7c8e8295c1159a85ec Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Wed, 29 Oct 2025 14:39:03 +0100 Subject: [PATCH 010/185] Vulkan MMQ Integer Dot Refactor and K-Quant support (#16536) * vulkan: add mmq q2_k integer dot support * Refactor mmq caching * Reduce mmq register use * Load 4 quant blocks into shared memory in one step * Pack q2_k blocks into caches of 32 * Use 32-bit accumulators for integer dot matmul * Add q4_k mmq * Add q3_k mmq * Add q5_k mmq * Add q6_k mmq * Add mxfp4 mmq, enable MMQ MUL_MAT_ID * Fix mmv dm loads --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 165 +++++- .../vulkan-shaders/dequant_funcs.glsl | 10 +- .../vulkan-shaders/dequant_funcs_cm2.glsl | 6 +- .../vulkan-shaders/dequant_mxfp4.comp | 4 +- .../vulkan-shaders/dequant_q2_k.comp | 4 +- .../vulkan-shaders/dequant_q4_k.comp | 4 +- .../vulkan-shaders/dequant_q5_k.comp | 4 +- .../vulkan-shaders/mul_mat_vec_q2_k.comp | 6 +- .../vulkan-shaders/mul_mat_vec_q4_k.comp | 6 +- .../vulkan-shaders/mul_mat_vec_q5_k.comp | 6 +- .../ggml-vulkan/vulkan-shaders/mul_mm.comp | 72 +-- .../vulkan-shaders/mul_mm_funcs.glsl | 14 +- .../vulkan-shaders/mul_mm_id_funcs.glsl | 70 +++ .../ggml-vulkan/vulkan-shaders/mul_mmq.comp | 288 +++------- .../vulkan-shaders/mul_mmq_funcs.glsl | 538 ++++++++++++++++-- .../vulkan-shaders/mul_mmq_shmem_types.glsl | 78 +++ .../src/ggml-vulkan/vulkan-shaders/types.glsl | 53 +- .../vulkan-shaders/vulkan-shaders-gen.cpp | 5 +- 18 files changed, 928 insertions(+), 405 deletions(-) create mode 100644 ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl create mode 100644 ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 5caf37d4030..3d10aa07b08 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -486,6 +486,7 @@ struct vk_device_struct { vk_matmul_pipeline2 pipeline_matmul_id_f16_f32; vk_matmul_pipeline2 pipeline_dequant_mul_mat_mat_id[GGML_TYPE_COUNT]; + vk_matmul_pipeline2 pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_COUNT]; vk_pipeline pipeline_matmul_split_k_reduce; vk_pipeline pipeline_quantize_q8_1; @@ -2448,8 +2449,11 @@ static void ggml_vk_load_shaders(vk_device& device) { l_warptile_id, m_warptile_id, s_warptile_id, l_warptile_mmq, m_warptile_mmq, s_warptile_mmq, l_warptile_mmq_int, m_warptile_mmq_int, s_warptile_mmq_int, + l_warptile_mmq_int_k, m_warptile_mmq_int_k, s_warptile_mmq_int_k, l_warptile_mmq_k, m_warptile_mmq_k, s_warptile_mmq_k, - l_warptile_mmqid, m_warptile_mmqid, s_warptile_mmqid; + l_warptile_mmqid, m_warptile_mmqid, s_warptile_mmqid, + l_warptile_mmqid_int, m_warptile_mmqid_int, s_warptile_mmqid_int, + l_warptile_mmqid_int_k, m_warptile_mmqid_int_k, s_warptile_mmqid_int_k; std::array l_wg_denoms, m_wg_denoms, s_wg_denoms, l_mmq_wg_denoms, m_mmq_wg_denoms, s_mmq_wg_denoms, l_mmq_wg_denoms_k, m_mmq_wg_denoms_k, s_mmq_wg_denoms_k, @@ -2512,10 +2516,16 @@ static void ggml_vk_load_shaders(vk_device& device) { m_warptile_mmq = { 128, 64, 64, 32, subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, subgroup_size_8 }; s_warptile_mmq = { subgroup_size_32, 32, 32, 32, 32, 32, 2, tm_s, tn_s, tk_s, subgroup_size_8 }; + // Integer MMQ has a smaller shared memory profile, but heavier register use l_warptile_mmq_int = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 2, 4, 4, 1, subgroup_size_8 }; m_warptile_mmq_int = { 128, 64, 64, 32, subgroup_size_8, 32, 2, 2, 2, 1, subgroup_size_8 }; s_warptile_mmq_int = { subgroup_size_32, 32, 32, 32, 32, 32, 2, 2, 1, 1, subgroup_size_8 }; + // K-quants use even more registers, mitigate by setting WMITER to 1 + l_warptile_mmq_int_k = { 128, 128, 128, 32, subgroup_size_8 * 2, 64, 1, 4, 4, 1, subgroup_size_8 }; + m_warptile_mmq_int_k = { 128, 64, 64, 32, subgroup_size_8, 32, 1, 2, 2, 1, subgroup_size_8 }; + s_warptile_mmq_int_k = { subgroup_size_32, 32, 32, 32, 32, 32, 1, 2, 1, 1, subgroup_size_8 }; + l_warptile_id = { 128, 128, 128, 16, mul_mat_subgroup_size_16 * 2, 64, 2, tm_l, tn_l, tk_l, mul_mat_subgroup_size_16 }; m_warptile_id = { 128, 64, 64, 16, mul_mat_subgroup_size_16, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_16 }; s_warptile_id = { mul_mat_subgroup_size_16, 32, 32, 16, 32, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_16 }; @@ -2524,10 +2534,18 @@ static void ggml_vk_load_shaders(vk_device& device) { m_warptile_mmqid = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, tm_m, tn_m, tk_m, mul_mat_subgroup_size_8 }; s_warptile_mmqid = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 2, tm_s, tn_s, tk_s, mul_mat_subgroup_size_8 }; + l_warptile_mmqid_int = { 128, 128, 128, 32, mul_mat_subgroup_size_8 * 2, 64, 2, 4, 4, 1, mul_mat_subgroup_size_8 }; + m_warptile_mmqid_int = { 128, 64, 64, 32, mul_mat_subgroup_size_8, 32, 2, 2, 2, 1, mul_mat_subgroup_size_8 }; + s_warptile_mmqid_int = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 2, 2, 1, 1, mul_mat_subgroup_size_8 }; + + l_warptile_mmqid_int_k = { 128, 128, 128, 32, mul_mat_subgroup_size_16 * 2, 64, 1, 4, 4, 1, mul_mat_subgroup_size_16 }; + m_warptile_mmqid_int_k = { 128, 64, 64, 32, mul_mat_subgroup_size_16, 32, 1, 2, 2, 1, mul_mat_subgroup_size_16 }; + s_warptile_mmqid_int_k = { mul_mat_subgroup_size_32, 32, 32, 32, 32, 32, 1, 2, 1, 1, mul_mat_subgroup_size_16 }; + // chip specific tuning if ((device->architecture == AMD_GCN) && (device->driver_id != vk::DriverId::eAmdProprietary)) { m_warptile_mmq = m_warptile_mmq_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; - m_warptile_mmqid = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; + m_warptile_mmqid = m_warptile_mmqid_int = { 256, 64, 64, 32, 16, 16, 2, 2, 2, 1, 16 }; } l_mmq_wg_denoms = l_wg_denoms = {128, 128, 1 }; @@ -2912,18 +2930,15 @@ static void ggml_vk_load_shaders(vk_device& device) { if (device->mul_mat ## ID ## _s[TYPE]) \ ggml_vk_create_pipeline(device, device-> PIPELINE_NAME ->a_s, #NAMELC #F16ACC "_aligned_s", NAMELC ## _aligned ## F16ACC ## _len, NAMELC ## _aligned ## F16ACC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, s_align, false, REQSUBGROUPSIZE > 0, REQSUBGROUPSIZE); \ -#define CREATE_MMQ(TYPE, PIPELINE_NAME, NAMELC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID) \ +#define CREATE_MMQ(TYPE, PIPELINE_NAME, NAMELC, WG_DENOMS, WARPTILE, PUSHCONST, PARAMCOUNT, ID, REQSUBGROUPSIZE) \ if (device->mul_mat ## ID ## _l[TYPE]) { \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f16acc->l, #NAMELC "_f16acc_l", NAMELC ## _f16acc_len, NAMELC ## _f16acc_data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->l, #NAMELC "_l", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->l, #NAMELC "_l", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), l_ ## WG_DENOMS, l_ ## WARPTILE, 1, false, REQSUBGROUPSIZE > 0, REQSUBGROUPSIZE); \ } \ if (device->mul_mat ## ID ## _m[TYPE]) { \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f16acc->m, #NAMELC "_f16acc_m", NAMELC ## _f16acc_len, NAMELC ## _f16acc_data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->m, #NAMELC "_m", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->m, #NAMELC "_m", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), m_ ## WG_DENOMS, m_ ## WARPTILE, 1, false, REQSUBGROUPSIZE > 0, REQSUBGROUPSIZE); \ } \ if (device->mul_mat ## ID ## _s[TYPE]) { \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f16acc->s, #NAMELC "_f16acc_s", NAMELC ## _f16acc_len, NAMELC ## _f16acc_data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1); \ - ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->s, #NAMELC "_s", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1); \ + ggml_vk_create_pipeline(device, device-> PIPELINE_NAME .f32acc->s, #NAMELC "_s", NAMELC ## _len, NAMELC ## _data, "main", PARAMCOUNT, sizeof(PUSHCONST), s_ ## WG_DENOMS, s_ ## WARPTILE, 1, false, REQSUBGROUPSIZE > 0, REQSUBGROUPSIZE); \ } \ // Create 2 variants, {f16,f32} accumulator @@ -2962,11 +2977,19 @@ static void ggml_vk_load_shaders(vk_device& device) { #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) if (device->integer_dot_product) { - CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_0], matmul_q4_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); - CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_1], matmul_q4_1_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); - CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_0], matmul_q5_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); - CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_1], matmul_q5_1_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); - CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q8_0], matmul_q8_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); + CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_0], matmul_q4_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_1], matmul_q4_1_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_0], matmul_q5_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_1], matmul_q5_1_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q8_0], matmul_q8_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + + CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_MXFP4], matmul_mxfp4_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, , 0); + + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q2_K], matmul_q2_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q3_K], matmul_q3_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_K], matmul_q4_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_K], matmul_q5_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, , 0); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q6_K], matmul_q6_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, , 0); } #endif @@ -2996,6 +3019,24 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_subgroup_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_subgroup_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + +#if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) + if (device->integer_dot_product) { + CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_subgroup_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_subgroup_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_subgroup_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_subgroup_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_subgroup_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + + CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_subgroup_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size); + + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_subgroup_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_subgroup_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_subgroup_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_subgroup_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_subgroup_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, mul_mat_subgroup_size_16); + } +#endif } else { CREATE_MM(GGML_TYPE_F32, pipeline_matmul_id_f32, matmul_id_f32_f32, , wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); CREATE_MM2(GGML_TYPE_F16, pipeline_matmul_id_f16, matmul_id_f16, wg_denoms, warptile, vk_mat_mat_push_constants, 4, _id, 0); @@ -3022,6 +3063,24 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MM2(GGML_TYPE_IQ4_XS, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_XS], matmul_id_iq4_xs_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); CREATE_MM2(GGML_TYPE_IQ4_NL, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_IQ4_NL], matmul_id_iq4_nl_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); CREATE_MM2(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id[GGML_TYPE_MXFP4], matmul_id_mxfp4_f32, mmq_wg_denoms, warptile_mmqid, vk_mat_mat_id_push_constants, 4, _id, 0); + +#if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) + if (device->integer_dot_product) { + CREATE_MMQ(GGML_TYPE_Q4_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_0], matmul_id_q4_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q4_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_1], matmul_id_q4_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_0], matmul_id_q5_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_1], matmul_id_q5_1_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q8_0], matmul_id_q8_0_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + + CREATE_MMQ(GGML_TYPE_MXFP4, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_MXFP4], matmul_id_mxfp4_q8_1, mmq_wg_denoms, warptile_mmqid_int, vk_mat_mat_id_push_constants, 4, _id, 0); + + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q2_K], matmul_id_q2_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q3_K], matmul_id_q3_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q4_K], matmul_id_q4_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q5_K], matmul_id_q5_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_id_q8_1[GGML_TYPE_Q6_K], matmul_id_q6_k_q8_1, mmq_wg_denoms, warptile_mmqid_int_k, vk_mat_mat_id_push_constants, 4, _id, 0); + } +#endif } #undef CREATE_MM2 #undef CREATE_MMQ @@ -3086,6 +3145,12 @@ static void ggml_vk_load_shaders(vk_device& device) { CREATE_MMQ(GGML_TYPE_Q5_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_0].f32acc, matmul_q5_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); CREATE_MMQ(GGML_TYPE_Q5_1, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_1].f32acc, matmul_q5_1_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); CREATE_MMQ(GGML_TYPE_Q8_0, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q8_0].f32acc, matmul_q8_0_q8_1, mmq_wg_denoms, warptile_mmq_int, vk_mat_mat_push_constants, 3, ); + + CREATE_MMQ(GGML_TYPE_Q2_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q2_K].f32acc, matmul_q2_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, ); + CREATE_MMQ(GGML_TYPE_Q3_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q3_K].f32acc, matmul_q3_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, ); + CREATE_MMQ(GGML_TYPE_Q4_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q4_K].f32acc, matmul_q4_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, ); + CREATE_MMQ(GGML_TYPE_Q5_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q5_K].f32acc, matmul_q5_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, ); + CREATE_MMQ(GGML_TYPE_Q6_K, pipeline_dequant_mul_mat_mat_q8_1[GGML_TYPE_Q6_K].f32acc, matmul_q6_k_q8_1, mmq_wg_denoms, warptile_mmq_int_k, vk_mat_mat_push_constants, 3, ); } #endif @@ -3145,7 +3210,7 @@ static void ggml_vk_load_shaders(vk_device& device) { } // reusing CREATE_MM from the fp32 path if ((device->coopmat2 || device->coopmat_support) -#if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) +#if defined(GGML_VULKAN_BFLOAT16_GLSLC_SUPPORT) && !device->coopmat_bf16_support #endif ) { @@ -4928,7 +4993,7 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_pipeline(ggml_backend_vk_conte // MMQ if (src1_type == GGML_TYPE_Q8_1) { - vk_matmul_pipeline pipelines = (ctx->device->fp16 && prec == GGML_PREC_DEFAULT) ? ctx->device->pipeline_dequant_mul_mat_mat_q8_1[src0_type].f16acc : ctx->device->pipeline_dequant_mul_mat_mat_q8_1[src0_type].f32acc; + vk_matmul_pipeline pipelines = ctx->device->pipeline_dequant_mul_mat_mat_q8_1[src0_type].f32acc; if (pipelines->s == nullptr && pipelines->m == nullptr && pipelines->l == nullptr) { return nullptr; @@ -5075,6 +5140,17 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_id_pipeline(ggml_backend_vk_co } } + // MMQ + if (src1_type == GGML_TYPE_Q8_1) { + vk_matmul_pipeline pipelines = ctx->device->pipeline_dequant_mul_mat_mat_id_q8_1[src0_type].f32acc; + + if (pipelines->s == nullptr && pipelines->m == nullptr && pipelines->l == nullptr) { + return nullptr; + } + + return pipelines; + } + GGML_ASSERT(src1_type == GGML_TYPE_F32 || (ctx->device->coopmat2 && src1_type == GGML_TYPE_F16)); switch (src0_type) { @@ -6877,10 +6953,19 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& const bool y_f32_kernel = src1->type == GGML_TYPE_F32 && !y_non_contig; - vk_matmul_pipeline mmp = ggml_vk_get_mul_mat_mat_id_pipeline(ctx, src0->type, y_non_contig ? f16_type : src1->type, (ggml_prec)dst->op_params[0]); + bool quantize_y = ctx->device->integer_dot_product && src1->type == GGML_TYPE_F32 && ggml_is_contiguous(src1) && (ne11 * ne10) % 4 == 0; + + // Check for mmq first + vk_matmul_pipeline mmp = quantize_y ? ggml_vk_get_mul_mat_mat_id_pipeline(ctx, src0->type, GGML_TYPE_Q8_1, (ggml_prec)dst->op_params[0]) : nullptr; + + if (mmp == nullptr) { + // Fall back to f16 dequant mul mat + mmp = ggml_vk_get_mul_mat_mat_id_pipeline(ctx, src0->type, y_non_contig ? f16_type : src1->type, (ggml_prec)dst->op_params[0]); + quantize_y = false; + } const bool qx_needs_dequant = mmp == nullptr || x_non_contig; - const bool qy_needs_dequant = (src1->type != f16_type && !y_f32_kernel) || y_non_contig; + const bool qy_needs_dequant = !quantize_y && ((src1->type != f16_type && !y_f32_kernel) || y_non_contig); if (qx_needs_dequant) { // Fall back to dequant + f16 mulmat @@ -6890,8 +6975,8 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& // Not implemented GGML_ASSERT(y_non_contig || !qy_needs_dequant); // NOLINT - const uint32_t kpad = ggml_vk_align_size(ne10, ggml_vk_guess_matmul_id_pipeline_align(ctx, mmp, ne01, nei1, qx_needs_dequant ? f16_type : src0->type)); - const bool aligned = ne10 == kpad && ne01 > 8 && nei1 > 8; + const uint32_t kpad = quantize_y ? 0 : ggml_vk_align_size(ne10, ggml_vk_guess_matmul_id_pipeline_align(ctx, mmp, ne01, nei1, qx_needs_dequant ? f16_type : src0->type)); + const bool aligned = !quantize_y && ne10 == kpad && ne01 > 8 && nei1 > 8; vk_pipeline pipeline = ggml_vk_guess_matmul_id_pipeline(ctx, mmp, ne01, nei1, aligned, qx_needs_dequant ? f16_type : src0->type); @@ -6904,12 +6989,13 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& const uint64_t qx_sz = ggml_type_size(src0->type) * x_ne / ggml_blck_size(src0->type); const uint64_t qy_sz = ggml_type_size(src1->type) * y_ne / ggml_blck_size(src1->type); const uint64_t x_sz = !qx_needs_dequant ? qx_sz : sizeof(ggml_fp16_t) * x_ne; - const uint64_t y_sz = y_f32_kernel ? sizeof(float) * y_ne : sizeof(ggml_fp16_t) * y_ne; + const uint64_t y_sz = quantize_y ? (y_ne * ggml_type_size(GGML_TYPE_Q8_1) / ggml_blck_size(GGML_TYPE_Q8_1)) : (y_f32_kernel ? sizeof(float) * y_ne : sizeof(ggml_fp16_t) * y_ne); const uint64_t ids_sz = nbi2; const uint64_t d_sz = sizeof(float) * d_ne; vk_pipeline to_fp16_vk_0 = nullptr; vk_pipeline to_fp16_vk_1 = nullptr; + vk_pipeline to_q8_1 = nullptr; if (x_non_contig) { to_fp16_vk_0 = ggml_vk_get_cpy_pipeline(ctx, src0, nullptr, f16_type); @@ -6924,9 +7010,16 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& GGML_ASSERT(!qx_needs_dequant || to_fp16_vk_0 != nullptr); // NOLINT GGML_ASSERT(!qy_needs_dequant || to_fp16_vk_1 != nullptr); // NOLINT + if (quantize_y) { + to_q8_1 = ggml_vk_get_quantize_pipeline(ctx, GGML_TYPE_Q8_1, true); + } + if (dryrun) { const uint64_t x_sz_upd = x_sz * ne02 * ne03; - const uint64_t y_sz_upd = y_sz * ne12 * ne13; + uint64_t y_sz_upd = y_sz * ne12 * ne13; + if (quantize_y) { + y_sz_upd = CEIL_DIV(y_sz_upd, 144) * 144; + } if ( (qx_needs_dequant && x_sz_upd > ctx->device->properties.limits.maxStorageBufferRange) || (qy_needs_dequant && y_sz_upd > ctx->device->properties.limits.maxStorageBufferRange)) { @@ -6935,7 +7028,7 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (qx_needs_dequant && ctx->prealloc_size_x < x_sz_upd) { ctx->prealloc_size_x = x_sz_upd; } - if (qy_needs_dequant && ctx->prealloc_size_y < y_sz_upd) { + if ((qy_needs_dequant || quantize_y) && ctx->prealloc_size_y < y_sz_upd) { ctx->prealloc_size_y = y_sz_upd; } @@ -6947,6 +7040,9 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (qy_needs_dequant) { ggml_pipeline_request_descriptor_sets(ctx, to_fp16_vk_1, 1); } + if (quantize_y) { + ggml_pipeline_request_descriptor_sets(ctx, to_q8_1, 1); + } return; } @@ -6983,6 +7079,9 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& if (qy_needs_dequant) { d_Y = ctx->prealloc_y; GGML_ASSERT(d_Y->size >= y_sz * ne12 * ne13); + } else if (quantize_y) { + d_Y = ctx->prealloc_y; + GGML_ASSERT(d_Y->size >= CEIL_DIV(y_sz * ne12 * ne13, 144) * 144); } else { d_Y = d_Qy; y_buf_offset = qy_buf_offset; @@ -7014,6 +7113,17 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& ctx->prealloc_y_last_tensor_used = src1; } } + if (quantize_y) { + if (ctx->prealloc_y_last_pipeline_used != to_q8_1.get() || + ctx->prealloc_y_last_tensor_used != src1) { + if (ctx->prealloc_y_need_sync) { + ggml_vk_sync_buffers(ctx, subctx); + } + ggml_vk_quantize_q8_1(ctx, subctx, ggml_vk_subbuffer(ctx, d_Qy, qy_buf_offset), ggml_vk_subbuffer(ctx, d_Y, 0), y_ne * ne12 * ne13, true); + ctx->prealloc_y_last_pipeline_used = to_q8_1.get(); + ctx->prealloc_y_last_tensor_used = src1; + } + } uint32_t stride_batch_x = ne00*ne01; uint32_t stride_batch_y = ne10*ne11; @@ -7022,14 +7132,19 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& stride_batch_x = src0->nb[0] / ggml_type_size(src0->type); } - if (!ggml_vk_dim01_contiguous(src1) && !qy_needs_dequant) { + if (!ggml_vk_dim01_contiguous(src1) && !qy_needs_dequant && !quantize_y) { stride_batch_y = src1->nb[0] / ggml_type_size(src1->type); } + uint32_t y_sz_total = y_sz * ne12 * ne13; + if (quantize_y) { + y_sz_total = CEIL_DIV(y_sz_total, 144) * 144; + } + // compute ggml_vk_matmul_id( ctx, subctx, pipeline, - { d_X, x_buf_offset, x_sz * ne02 * ne03 }, { d_Y, y_buf_offset, y_sz * ne12 * ne13 }, + { d_X, x_buf_offset, x_sz * ne02 * ne03 }, { d_Y, y_buf_offset, y_sz_total }, { d_D, d_buf_offset, d_sz * ne22 * ne23 }, { d_ids, ids_buf_offset, ids_sz }, ne01, ne21, ne10, ne10, ne10, ne01, stride_batch_x, stride_batch_y, ne20*ne21, diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl index 0d98f5a9d6b..09676a623ba 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs.glsl @@ -437,7 +437,7 @@ vec4 dequantize4(uint ib, uint iqs, uint a_offset) { #if defined(DATA_A_MXFP4) vec2 dequantize(uint ib, uint iqs, uint a_offset) { const uint vui = uint(data_a[a_offset + ib].qs[iqs]); - return vec2(kvalues_mxfp4[vui & 0xF], kvalues_mxfp4[vui >> 4]); + return vec2(kvalues_mxfp4[vui & 0xF], kvalues_mxfp4[vui >> 4]) * 0.5; } vec4 dequantize4(uint ib, uint iqs, uint a_offset) { vec2 v0 = dequantize(ib, iqs, a_offset); @@ -488,9 +488,9 @@ vec2 dequantize(uint ib, uint iqs, uint a_offset) { const uvec2 qs = uvec2(data_a[a_offset + ib].qs[qsi], data_a[a_offset + ib].qs[qsi + 1]); const uint scales = data_a[a_offset + ib].scales[scalesi]; - const vec2 d = vec2(data_a[a_offset + ib].d); + const vec2 dm = vec2(data_a[a_offset + ib].dm); - return d.x * float(scales & 0xF) * vec2((qs >> qsshift) & 3) - d.y * float(scales >> 4); + return dm.x * float(scales & 0xF) * vec2((qs >> qsshift) & 3) - dm.y * float(scales >> 4); } vec2 get_dm(uint ib, uint a_offset) { return vec2(1, 0); @@ -529,7 +529,7 @@ vec2 dequantize(uint ib, uint iqs, uint a_offset) { const uint is = 2 * n + b; // 0..7 const uint qsi = n * 32 + (iqs % 16) * 2; // 0,2,4..126 - const vec2 loadd = vec2(data_a[a_offset + ib].d); + const vec2 loadd = vec2(data_a[a_offset + ib].dm); const uint scidx0 = (is < 4) ? is : (is + 4); const uint scidx1 = (is < 4) ? is : (is - 4); @@ -567,7 +567,7 @@ vec2 dequantize(uint ib, uint iqs, uint a_offset) { const uint8_t hm = uint8_t(1 << (iqs / 16)); - const vec2 loadd = vec2(data_a[a_offset + ib].d); + const vec2 loadd = vec2(data_a[a_offset + ib].dm); const uint scidx0 = (is < 4) ? is : (is + 4); const uint scidx1 = (is < 4) ? is : (is - 4); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl index 67baedf7c61..8ac6482dc94 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_funcs_cm2.glsl @@ -120,7 +120,7 @@ layout(buffer_reference, std430, buffer_reference_align = 16) buffer decodeBufQ2 float16_t dequantFuncQ2_K(const in decodeBufQ2_K bl, const in uint blockCoords[2], const in uint coordInBlock[2]) { decodeBufQ2_K_packed16 bl16 = decodeBufQ2_K_packed16(bl); - const f16vec2 d = bl.block.d; + const f16vec2 dm = bl.block.dm; const uint idx = coordInBlock[1]; const uint scalesi = (idx & 0xF0) >> 4; // 0..15 @@ -131,7 +131,7 @@ float16_t dequantFuncQ2_K(const in decodeBufQ2_K bl, const in uint blockCoords[2 qs = unpack8(qs)[idx & 1]; const uint scales = bl.block.scales[scalesi]; - float16_t ret = d.x * float16_t(scales & 0xF) * float16_t(qs) - d.y * float16_t(scales >> 4); + float16_t ret = dm.x * float16_t(scales & 0xF) * float16_t(qs) - dm.y * float16_t(scales >> 4); return ret; } @@ -680,7 +680,7 @@ float16_t dequantFuncMXFP4(const in decodeBufMXFP4 bl, const in uint blockCoords uint32_t qs = bl.block.qs[iqs]; qs >>= shift; qs &= 0xF; - float16_t ret = float16_t(kvalues_mxfp4[qs] * d); + float16_t ret = float16_t(kvalues_mxfp4[qs] * d * 0.5); return ret; } #endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_mxfp4.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_mxfp4.comp index ffba5a77ddf..3194ba291f3 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_mxfp4.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_mxfp4.comp @@ -26,7 +26,7 @@ void main() { const float d = e8m0_to_fp32(data_a[ib].e); [[unroll]] for (uint l = 0; l < 8; ++l) { - data_b[b_idx + l + 0] = D_TYPE(d * kvalues_mxfp4[data_a[ib].qs[q_idx + l] & 0xF]); - data_b[b_idx + l + 16] = D_TYPE(d * kvalues_mxfp4[data_a[ib].qs[q_idx + l] >> 4]); + data_b[b_idx + l + 0] = D_TYPE(d * 0.5 * float(kvalues_mxfp4[data_a[ib].qs[q_idx + l] & 0xF])); + data_b[b_idx + l + 16] = D_TYPE(d * 0.5 * float(kvalues_mxfp4[data_a[ib].qs[q_idx + l] >> 4])); } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q2_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q2_k.comp index 58dc2e5dfde..dc05a783489 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q2_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q2_k.comp @@ -24,8 +24,8 @@ void main() { const uint ql_idx = 32 * ip + il; const uint8_t qs = data_a[i].qs[32 * ip + il]; - FLOAT_TYPE dall = FLOAT_TYPE(data_a[i].d.x); - FLOAT_TYPE dmin = FLOAT_TYPE(data_a[i].d.y); + FLOAT_TYPE dall = FLOAT_TYPE(data_a[i].dm.x); + FLOAT_TYPE dmin = FLOAT_TYPE(data_a[i].dm.y); data_b[y_idx + 0] = D_TYPE(dall * FLOAT_TYPE((data_a[i].scales[is+0] & 0xF) * ((qs >> 0) & 3)) - dmin * FLOAT_TYPE(data_a[i].scales[is+0] >> 4)); data_b[y_idx + 32] = D_TYPE(dall * FLOAT_TYPE((data_a[i].scales[is+2] & 0xF) * ((qs >> 2) & 3)) - dmin * FLOAT_TYPE(data_a[i].scales[is+2] >> 4)); data_b[y_idx + 64] = D_TYPE(dall * FLOAT_TYPE((data_a[i].scales[is+4] & 0xF) * ((qs >> 4) & 3)) - dmin * FLOAT_TYPE(data_a[i].scales[is+4] >> 4)); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp index 8b7be557e95..0f23dc0a349 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q4_k.comp @@ -20,8 +20,8 @@ void main() { const uint is = 2 * il; const uint n = 4; - const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].d.y); + const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].dm.x); + const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].dm.y); const uint y_idx = ib * QUANT_K + 64 * il + n * ir; const uint qs_idx = 32*il + n * ir; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp index 6bc04670fc5..970469a601c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/dequant_q5_k.comp @@ -19,8 +19,8 @@ void main() { const uint ir = tid % 16; const uint is = 2 * il; - const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].d.y); + const FLOAT_TYPE dall = FLOAT_TYPE(data_a[ib].dm.x); + const FLOAT_TYPE dmin = FLOAT_TYPE(data_a[ib].dm.y); const uint y_idx = ib * QUANT_K + 64 * il + 2 * ir; const uint qs_idx = 32*il + 2 * ir; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp index 03ed25d3bfe..14093c0de5a 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q2_k.comp @@ -41,9 +41,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, const vec4 qs_u32_4 = vec4(unpack8((qs_u32 >> 4) & 0x03030303)); const vec4 qs_u32_6 = vec4(unpack8((qs_u32 >> 6) & 0x03030303)); - vec2 d = vec2(data_a[ib0 + i].d); - const FLOAT_TYPE dall = FLOAT_TYPE(d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(d.y); + const FLOAT_TYPE_VEC2 dm = vec2(data_a[ib0 + i].dm); [[unroll]] for (uint j = 0; j < NUM_COLS; ++j) { vec2 b0 = vec2(data_b_v2[(j*p.batch_stride_b + b_offset + y_idx) / 2 + 0]); @@ -75,7 +73,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint itid, fma(FLOAT_TYPE(b96[l]), sccache2[csel][ix][6 + 8*v_im], fma(FLOAT_TYPE(b112[l]), sccache2[csel][ix][7 + 8*v_im], sum2)))))))); } - temp[j][n] = fma(dall, sum1, fma(-dmin, sum2, temp[j][n])); + temp[j][n] = fma(dm.x, sum1, fma(-dm.y, sum2, temp[j][n])); } } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp index 21d07d2e509..49d91ad5910 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q4_k.comp @@ -14,9 +14,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, [[unroll]] for (uint n = 0; n < num_rows; ++n) { const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; - vec2 d = vec2(data_a[ib0 + i].d); - const FLOAT_TYPE dall = FLOAT_TYPE(d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(d.y); + const FLOAT_TYPE_VEC2 dm = FLOAT_TYPE_VEC2(data_a[ib0 + i].dm); const uint32_t scale0_u32 = data_a_packed16[ib0 + i].scales[v_im ]; const uint32_t scale4_u32 = data_a_packed16[ib0 + i].scales[v_im + 2]; @@ -81,7 +79,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, fma(FLOAT_TYPE(by10.y), sc2, fma(FLOAT_TYPE(by132.y), sc3, fma(FLOAT_TYPE(by20.y), sc6, fma(FLOAT_TYPE(by232.y), sc7, fma(FLOAT_TYPE(by10.z), sc2, fma(FLOAT_TYPE(by132.z), sc3, fma(FLOAT_TYPE(by20.z), sc6, fma(FLOAT_TYPE(by232.z), sc7, fma(FLOAT_TYPE(by10.w), sc2, fma(FLOAT_TYPE(by132.w), sc3, fma(FLOAT_TYPE(by20.w), sc6, FLOAT_TYPE(by232.w) * sc7))))))))))))))); - temp[j][n] = fma(dall, fma(sx, sc0, fma(sy, sc1, fma(sz, sc4, sw * sc5))), fma(-dmin, smin, temp[j][n])); + temp[j][n] = fma(dm.x, fma(sx, sc0, fma(sy, sc1, fma(sz, sc4, sw * sc5))), fma(-dm.y, smin, temp[j][n])); } } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp index 9e46c89a11f..0d61b4966ec 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_q5_k.comp @@ -14,9 +14,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, [[unroll]] for (uint n = 0; n < num_rows; ++n) { const uint ib0 = a_offset / QUANT_K + (first_row+n)*num_blocks_per_row; - vec2 d = vec2(data_a[ib0 + i].d); - const FLOAT_TYPE dall = FLOAT_TYPE(d.x); - const FLOAT_TYPE dmin = FLOAT_TYPE(d.y); + const FLOAT_TYPE_VEC2 dm = FLOAT_TYPE_VEC2(data_a[ib0 + i].dm); const uint32_t scale0_u32 = data_a_packed16[ib0 + i].scales[v_im ]; const uint32_t scale4_u32 = data_a_packed16[ib0 + i].scales[v_im + 2]; @@ -113,7 +111,7 @@ void calc_superblock(const uint a_offset, const uint b_offset, const uint v_im, fma(FLOAT_TYPE(by132.x) + FLOAT_TYPE(by132.y) + FLOAT_TYPE(by148.x) + FLOAT_TYPE(by148.y), sc3, fma(FLOAT_TYPE(by20.x) + FLOAT_TYPE(by20.y) + FLOAT_TYPE(by216.x) + FLOAT_TYPE(by216.y), sc6, (FLOAT_TYPE(by232.x) + FLOAT_TYPE(by232.y) + FLOAT_TYPE(by248.x) + FLOAT_TYPE(by248.y)) * sc7))); - temp[j][n] = fma(dall, fma(sx, sc0, fma(sy, sc1, fma(sz, sc4, sw * sc5))), fma(-dmin, smin, temp[j][n])); + temp[j][n] = fma(dm.x, fma(sx, sc0, fma(sy, sc1, fma(sz, sc4, sw * sc5))), fma(-dm.y, smin, temp[j][n])); } } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp index a20788c4b51..d260969f07e 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm.comp @@ -120,81 +120,11 @@ shared FLOAT_TYPE_VEC2 buf_b[BN * SHMEM_STRIDE]; #define NUM_WARPS (BLOCK_SIZE / WARP) -#ifdef MUL_MAT_ID -shared u16vec2 row_ids[BN]; -uint _ne1; - -#ifdef MUL_MAT_ID_USE_SUBGROUPS -shared uvec4 ballots_sh[NUM_WARPS]; - -void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { - _ne1 = 0; - uint num_elements = p.nei1 * p.nei0; - uint nei0shift = findLSB(p.nei0); - - uint ids[16]; - uint iter = 0; - - for (uint j = 0; j < num_elements; j += BLOCK_SIZE) { - // prefetch up to 16 elements - if (iter == 0) { - [[unroll]] for (uint k = 0; k < 16; ++k) { - uint i = j + gl_LocalInvocationIndex + k*BLOCK_SIZE; - bool in_range = i < num_elements; - uint ii1; - if (nei0_is_pow2) { - ii1 = i >> nei0shift; - } else { - ii1 = i / p.nei0; - } - uint ii0 = i - ii1 * p.nei0; - ids[k] = in_range ? data_ids[ii1*p.nbi1 + ii0] : 0; - } - } - uint i = j + gl_LocalInvocationIndex; - bool in_range = i < num_elements; - uint ii1; - if (nei0_is_pow2) { - ii1 = i >> nei0shift; - } else { - ii1 = i / p.nei0; - } - uint ii0 = i - ii1 * p.nei0; - uint id = ids[iter++]; - uvec4 ballot = subgroupBallot(in_range && id == expert_idx); - - ballots_sh[gl_SubgroupID] = ballot; - barrier(); - - uint subgroup_base = 0; - uint total = 0; - for (uint k = 0; k < gl_NumSubgroups; ++k) { - if (k == gl_SubgroupID) { - subgroup_base = total; - } - total += subgroupBallotBitCount(ballots_sh[k]); - } - barrier(); - - uint idx = subgroup_base + subgroupBallotExclusiveBitCount(ballot); - if (in_range && id == expert_idx && _ne1 + idx >= ic * BN && _ne1 + idx < (ic + 1) * BN) { - row_ids[_ne1 + idx - ic * BN] = u16vec2(ii0, ii1); - } - _ne1 += total; - iter &= 15; - if (_ne1 >= (ic + 1) * BN) { - break; - } - } - barrier(); -} -#endif // MUL_MAT_ID_USE_SUBGROUPS -#endif // MUL_MAT_ID - #ifdef COOPMAT shared ACC_TYPE coopmat_stage[TM * TN * NUM_WARPS]; #endif +#include "mul_mm_id_funcs.glsl" #include "mul_mm_funcs.glsl" void main() { diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl index 0ebfbd6462c..ee5ded2e8d3 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_funcs.glsl @@ -134,15 +134,15 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint ib = idx / 128; // 2 values per idx const uint iqs = idx % 128; // 0..127 - const uint qsi = (iqs / 64) * 32 + (iqs % 16) * 2; // 0,2,4..30 + const uint qsi = (iqs / 64) * 16 + (iqs % 16); // 0..15 const uint scalesi = iqs / 8; // 0..15 const uint qsshift = ((iqs % 64) / 16) * 2; // 0,2,4,6 - const uvec2 qs = uvec2(data_a[ib].qs[qsi], data_a[ib].qs[qsi + 1]); + const uvec2 qs = uvec2(unpack8(data_a_packed16[ib].qs[qsi])); const uint scales = data_a[ib].scales[scalesi]; - const vec2 d = vec2(data_a[ib].d); + const vec2 dm = vec2(data_a[ib].dm); - const vec2 v = d.x * float(scales & 0xF) * vec2((qs >> qsshift) & 3) - d.y * float(scales >> 4); + const vec2 v = dm.x * float(scales & 0xF) * vec2((qs >> qsshift) & 3) - dm.y * float(scales >> 4); buf_a[buf_idx] = FLOAT_TYPE_VEC2(v.xy); #elif defined(DATA_A_Q3_K) @@ -179,7 +179,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint is = 2 * n + b; // 0..7 const uint qsi = n * 32 + (iqs % 16) * 2; // 0,2,4..126 - const vec2 loadd = vec2(data_a[ib].d); + const vec2 loadd = vec2(data_a[ib].dm); const uint scidx0 = (is < 4) ? is : (is + 4); const uint scidx1 = (is < 4) ? is : (is - 4); @@ -215,7 +215,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint8_t hm = uint8_t(1 << (iqs / 16)); - const vec2 loadd = vec2(data_a[ib].d); + const vec2 loadd = vec2(data_a[ib].dm); const uint scidx0 = (is < 4) ? is : (is + 4); const uint scidx1 = (is < 4) ? is : (is - 4); @@ -468,7 +468,7 @@ void load_a_to_shmem(const uint pos_a, const uint row, const uint col, const uin const uint ib = idx / 8; const uint iqs = (idx & 0x07) * 2; - const float d = e8m0_to_fp32(data_a[ib].e); + const float d = e8m0_to_fp32(data_a[ib].e) * 0.5; const uint vui = uint(data_a[ib].qs[iqs]); const uint vui2 = uint(data_a[ib].qs[iqs+1]); diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl new file mode 100644 index 00000000000..1d0e84ac942 --- /dev/null +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mm_id_funcs.glsl @@ -0,0 +1,70 @@ +#ifdef MUL_MAT_ID +shared u16vec2 row_ids[BN]; +uint _ne1; + +#ifdef MUL_MAT_ID_USE_SUBGROUPS +shared uvec4 ballots_sh[NUM_WARPS]; + +void load_row_ids(uint expert_idx, bool nei0_is_pow2, uint ic) { + _ne1 = 0; + uint num_elements = p.nei1 * p.nei0; + uint nei0shift = findLSB(p.nei0); + + uint ids[16]; + uint iter = 0; + + for (uint j = 0; j < num_elements; j += BLOCK_SIZE) { + // prefetch up to 16 elements + if (iter == 0) { + [[unroll]] for (uint k = 0; k < 16; ++k) { + uint i = j + gl_LocalInvocationIndex + k*BLOCK_SIZE; + bool in_range = i < num_elements; + uint ii1; + if (nei0_is_pow2) { + ii1 = i >> nei0shift; + } else { + ii1 = i / p.nei0; + } + uint ii0 = i - ii1 * p.nei0; + ids[k] = in_range ? data_ids[ii1*p.nbi1 + ii0] : 0; + } + } + uint i = j + gl_LocalInvocationIndex; + bool in_range = i < num_elements; + uint ii1; + if (nei0_is_pow2) { + ii1 = i >> nei0shift; + } else { + ii1 = i / p.nei0; + } + uint ii0 = i - ii1 * p.nei0; + uint id = ids[iter++]; + uvec4 ballot = subgroupBallot(in_range && id == expert_idx); + + ballots_sh[gl_SubgroupID] = ballot; + barrier(); + + uint subgroup_base = 0; + uint total = 0; + for (uint k = 0; k < gl_NumSubgroups; ++k) { + if (k == gl_SubgroupID) { + subgroup_base = total; + } + total += subgroupBallotBitCount(ballots_sh[k]); + } + barrier(); + + uint idx = subgroup_base + subgroupBallotExclusiveBitCount(ballot); + if (in_range && id == expert_idx && _ne1 + idx >= ic * BN && _ne1 + idx < (ic + 1) * BN) { + row_ids[_ne1 + idx - ic * BN] = u16vec2(ii0, ii1); + } + _ne1 += total; + iter &= 15; + if (_ne1 >= (ic + 1) * BN) { + break; + } + } + barrier(); +} +#endif // MUL_MAT_ID_USE_SUBGROUPS +#endif // MUL_MAT_ID diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp index b5d761c0bab..8b238ac4bc1 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp @@ -10,10 +10,9 @@ #extension GL_EXT_shader_explicit_arithmetic_types_float16 : require #endif -#ifdef COOPMAT -#extension GL_KHR_cooperative_matrix : enable -#extension GL_KHR_memory_scope_semantics : enable +#if defined(MUL_MAT_ID_USE_SUBGROUPS) #extension GL_KHR_shader_subgroup_basic : enable +#extension GL_KHR_shader_subgroup_ballot : enable #endif #ifdef MUL_MAT_ID @@ -24,7 +23,10 @@ layout(local_size_x_id = 0, local_size_y = 1, local_size_z = 1) in; -layout (binding = 0) readonly buffer A {A_TYPE_PACKED16 data_a[];}; +layout (binding = 0) readonly buffer A {A_TYPE data_a[];}; +#if defined(A_TYPE_PACKED16) +layout (binding = 0) readonly buffer A_PACKED16 {A_TYPE_PACKED16 data_a_packed16[];}; +#endif #if defined(A_TYPE_PACKED32) layout (binding = 0) readonly buffer A_PACKED32 {A_TYPE_PACKED32 data_a_packed32[];}; #endif @@ -76,40 +78,27 @@ layout (constant_id = 10) const uint WARP = 32; #define BK 32 -#ifdef COOPMAT -#define SHMEM_STRIDE (BK / 4 + 4) -#else -#define SHMEM_STRIDE (BK / 4 + 1) -#endif +#define MMQ_SHMEM -shared int32_t buf_a_qs[BM * SHMEM_STRIDE]; +#include "mul_mmq_shmem_types.glsl" -#ifndef COOPMAT -#if QUANT_AUXF == 1 -shared FLOAT_TYPE buf_a_dm[BM]; -#else -shared FLOAT_TYPE_VEC2 buf_a_dm[BM]; -#endif +#ifndef BK_STEP +#define BK_STEP 4 #endif -shared int32_t buf_b_qs[BN * SHMEM_STRIDE]; -#ifndef COOPMAT -shared FLOAT_TYPE_VEC2 buf_b_ds[BN]; -#endif +// Shared memory cache +shared block_a_cache buf_a[BM * BK_STEP]; +shared block_b_cache buf_b[BN * BK_STEP]; +// Register cache +block_a_cache cache_a[WMITER * TM]; +block_b_cache cache_b; -#define LOAD_VEC_A (4 * QUANT_R) +#define LOAD_VEC_A (4 * QUANT_R_MMQ) #define LOAD_VEC_B 16 -#ifdef MUL_MAT_ID -shared u16vec2 row_ids[4096]; -#endif // MUL_MAT_ID - #define NUM_WARPS (BLOCK_SIZE / WARP) -#ifdef COOPMAT -shared ACC_TYPE coopmat_stage[TM * TN * NUM_WARPS]; -#endif - +#include "mul_mm_id_funcs.glsl" #include "mul_mmq_funcs.glsl" void main() { @@ -139,26 +128,12 @@ void main() { const uint WNITER = (WM * WN) / (WARP * TM * TN * WMITER); const uint WSUBM = WM / WMITER; const uint WSUBN = WN / WNITER; - -#ifdef COOPMAT - const uint warp_i = gl_SubgroupID; - - const uint tiw = gl_SubgroupInvocationID; - - const uint cms_per_row = WM / TM; - const uint cms_per_col = WN / TN; - - const uint storestride = WARP / TM; - const uint store_r = tiw % TM; - const uint store_c = tiw / TM; -#else const uint warp_i = gl_LocalInvocationID.x / WARP; const uint tiw = gl_LocalInvocationID.x % WARP; const uint tiwr = tiw % (WSUBM / TM); const uint tiwc = tiw / (WSUBM / TM); -#endif const uint warp_r = warp_i % (BM / WM); const uint warp_c = warp_i / (BM / WM); @@ -172,17 +147,27 @@ void main() { const uint loadstride_b = BLOCK_SIZE * LOAD_VEC_B / BK; #ifdef MUL_MAT_ID - uint _ne1 = 0; - for (uint ii1 = 0; ii1 < p.nei1; ii1++) { - for (uint ii0 = 0; ii0 < p.nei0; ii0++) { +#ifdef MUL_MAT_ID_USE_SUBGROUPS + if (bitCount(p.nei0) == 1) { + load_row_ids(expert_idx, true, ic); + } else { + load_row_ids(expert_idx, false, ic); + } +#else + _ne1 = 0; + for (uint ii1 = 0; ii1 < p.nei1 && _ne1 < (ic + 1) * BN; ii1++) { + for (uint ii0 = 0; ii0 < p.nei0 && _ne1 < (ic + 1) * BN; ii0++) { if (data_ids[ii1*p.nbi1 + ii0] == expert_idx) { - row_ids[_ne1] = u16vec2(ii0, ii1); + if (_ne1 >= ic * BN) { + row_ids[_ne1 - ic * BN] = u16vec2(ii0, ii1); + } _ne1++; } } } barrier(); +#endif // Workgroup has no work if (ic * BN >= _ne1) return; @@ -209,159 +194,70 @@ void main() { uint pos_b_ib = (batch_idx * p.batch_stride_b + ic * BN * p.stride_b + start_k) / BK; #endif -#ifdef COOPMAT - coopmat cache_a; - coopmat cache_b; - coopmat cm_result; - - coopmat factors[cms_per_row * cms_per_col]; - - coopmat sums[cms_per_row * cms_per_col]; - - [[unroll]] for (uint i = 0; i < cms_per_row * cms_per_col; i++) { - sums[i] = coopmat(0.0f); - } -#else - int32_t cache_a_qs[WMITER * TM * BK / 4]; - - int32_t cache_b_qs[TN * BK / 4]; - ACC_TYPE sums[WMITER * TM * WNITER * TN]; [[unroll]] for (uint i = 0; i < WMITER*TM*WNITER*TN; i++) { sums[i] = ACC_TYPE(0.0f); } -#endif -#if QUANT_AUXF == 1 - FLOAT_TYPE cache_a_dm[WMITER * TM]; -#else - FLOAT_TYPE_VEC2 cache_a_dm[WMITER * TM]; -#endif - - FLOAT_TYPE_VEC2 cache_b_ds[TN]; - - for (uint block = start_k; block < end_k; block += BK) { + for (uint block = start_k; block < end_k; block += BK * BK_STEP) { [[unroll]] for (uint l = 0; loadc_a + l < BM; l += loadstride_a) { - const uint ib = pos_a_ib + (loadc_a + l) * p.stride_a / BK; - const uint iqs = loadr_a; const uint buf_ib = loadc_a + l; + const uint ib = pos_a_ib + buf_ib * p.stride_a / BK; + const uint iqs = loadr_a; - if (iqs == 0) { -#if QUANT_AUXF == 1 - buf_a_dm[buf_ib] = get_d(ib); -#else - buf_a_dm[buf_ib] = get_dm(ib); -#endif + [[unroll]] for (uint k_step = 0; k_step < BK_STEP; k_step++) { + block_a_to_shmem(k_step * BM + buf_ib, ib + k_step, iqs); } -#if QUANT_R == 1 - buf_a_qs[buf_ib * SHMEM_STRIDE + iqs] = repack(ib, iqs); -#else - const i32vec2 vals = repack(ib, iqs); - buf_a_qs[buf_ib * SHMEM_STRIDE + iqs ] = vals.x; - buf_a_qs[buf_ib * SHMEM_STRIDE + iqs + 4] = vals.y; -#endif } [[unroll]] for (uint l = 0; loadc_b + l < BN; l += loadstride_b) { + const uint buf_ib = loadc_b + l; + #ifdef MUL_MAT_ID - const u16vec2 row_idx = row_ids[ic * BN + loadc_b + l]; - const uint idx = pos_b_ib + row_idx.y * p.batch_stride_b / LOAD_VEC_B + (row_idx.x % p.ne11) * p.stride_b / LOAD_VEC_B + loadr_b; - const uint ib = idx / 8; - const uint iqs = idx & 0x7; + const u16vec2 row_idx = row_ids[buf_ib]; + const uint ib = pos_b_ib + row_idx.y * p.batch_stride_b / BK + (row_idx.x % p.ne11) * p.stride_b / BK; #else - const uint ib = pos_b_ib + (loadc_b + l) * p.stride_b / BK; - const uint ib_outer = ib / 4; - const uint ib_inner = ib % 4; - - const uint iqs = loadr_b; + const uint ib = pos_b_ib + buf_ib * p.stride_b / BK; #endif + const uint iqs = loadr_b; - const uint buf_ib = loadc_b + l; - - if (iqs == 0) { - buf_b_ds[buf_ib] = FLOAT_TYPE_VEC2(data_b[ib_outer].ds[ib_inner]); + [[unroll]] for (uint k_step = 0; k_step < BK_STEP; k_step++) { + block_b_to_shmem(k_step * BN + buf_ib, ib + k_step, iqs); } - const ivec4 values = data_b[ib_outer].qs[ib_inner * 2 + iqs]; - buf_b_qs[buf_ib * SHMEM_STRIDE + iqs * 4 ] = values.x; - buf_b_qs[buf_ib * SHMEM_STRIDE + iqs * 4 + 1] = values.y; - buf_b_qs[buf_ib * SHMEM_STRIDE + iqs * 4 + 2] = values.z; - buf_b_qs[buf_ib * SHMEM_STRIDE + iqs * 4 + 3] = values.w; } barrier(); - pos_a_ib += 1; - pos_b_ib += 1; + pos_a_ib += BK_STEP; + pos_b_ib += BK_STEP; -#ifdef COOPMAT - [[unroll]] for (uint cm_row = 0; cm_row < cms_per_row; cm_row++) { - const uint ib_a = warp_r * WM + cm_row * TM; + for (uint k_step = 0; k_step < BK_STEP; k_step++) { // Load from shared into cache - coopMatLoad(cache_a, buf_a_qs, ib_a * SHMEM_STRIDE, SHMEM_STRIDE, gl_CooperativeMatrixLayoutRowMajor); - - // TODO: only cache values that are actually needed - [[unroll]] for (uint t_idx = 0; t_idx < TM; t_idx++) { - cache_a_dm[t_idx] = buf_a_dm[ib_a + t_idx]; - } - - [[unroll]] for (uint cm_col = 0; cm_col < cms_per_col; cm_col++) { - const uint ib_b = warp_c * WN + cm_col * TN; - coopMatLoad(cache_b, buf_b_qs, ib_b * SHMEM_STRIDE, SHMEM_STRIDE, gl_CooperativeMatrixLayoutColumnMajor); - - // TODO: only cache values that are actually needed - [[unroll]] for (uint t_idx = 0; t_idx < TN; t_idx++) { - cache_b_dm[t_idx] = buf_b_d[ib_b + t_idx]; - } - - cm_result = coopmat(0); - cm_result = coopMatMulAdd(cache_a, cache_b, cm_result); - - [[unroll]] for (uint col = 0; col < TN; col += storestride) { - coopmat_stage[warp_i * TM * TN + (store_c + col) * TM + store_r] = ACC_TYPE(float(cache_a_d[store_r]) * float(cache_b_d[store_c + col])); - } - - coopMatLoad(factors, coopmat_stage, warp_i * TM * TN, TM, gl_CooperativeMatrixLayoutColumnMajor); - sums[cm_col * cms_per_row + cm_row] += factors * coopmat(cm_result); - } - } -#else - // Load from shared into cache - [[unroll]] for (uint wsir = 0; wsir < WMITER; wsir++) { - [[unroll]] for (uint cr = 0; cr < TM; cr++) { - const uint ib = warp_r * WM + wsir * WSUBM + tiwr * TM + cr; - cache_a_dm[wsir * TM + cr] = buf_a_dm[ib]; - [[unroll]] for (uint idx_k = 0; idx_k < BK / 4; idx_k++) { - cache_a_qs[(wsir * TM + cr) * (BK / 4) + idx_k] = buf_a_qs[ib * SHMEM_STRIDE + idx_k]; - } - } - } + [[unroll]] for (uint wsir = 0; wsir < WMITER; wsir++) { + [[unroll]] for (uint cr = 0; cr < TM; cr++) { + const uint reg_ib = wsir * TM + cr; + const uint buf_ib = warp_r * WM + wsir * WSUBM + tiwr * TM + cr; - [[unroll]] for (uint wsic = 0; wsic < WNITER; wsic++) { - [[unroll]] for (uint cc = 0; cc < TN; cc++) { - const uint ib = warp_c * WN + wsic * WSUBN + tiwc * TN + cc; - cache_b_ds[cc] = buf_b_ds[ib]; - [[unroll]] for (uint idx_k = 0; idx_k < BK / 4; idx_k++) { - cache_b_qs[cc * (BK / 4) + idx_k] = buf_b_qs[ib * SHMEM_STRIDE + idx_k]; + block_a_to_registers(reg_ib, k_step * BM + buf_ib); } } - [[unroll]] for (uint wsir = 0; wsir < WMITER; wsir++) { + [[unroll]] for (uint wsic = 0; wsic < WNITER; wsic++) { [[unroll]] for (uint cc = 0; cc < TN; cc++) { - [[unroll]] for (uint cr = 0; cr < TM; cr++) { - const uint cache_a_idx = wsir * TM + cr; - const uint sums_idx = (wsic * TN + cc) * (WMITER * TM) + wsir * TM + cr; - int32_t q_sum = 0; - [[unroll]] for (uint idx_k = 0; idx_k < BK / 4; idx_k++) { - q_sum += dotPacked4x8EXT(cache_a_qs[cache_a_idx * (BK / 4) + idx_k], - cache_b_qs[cc * (BK / 4) + idx_k]); - } + const uint ib = k_step * BN + warp_c * WN + wsic * WSUBN + tiwc * TN + cc; + block_b_to_registers(ib); - sums[sums_idx] += mul_q8_1(q_sum, cache_a_dm[cache_a_idx], cache_b_ds[cc], 1); + [[unroll]] for (uint wsir = 0; wsir < WMITER; wsir++) { + [[unroll]] for (uint cr = 0; cr < TM; cr++) { + const uint cache_a_idx = wsir * TM + cr; + const uint sums_idx = (wsic * TN + cc) * (WMITER * TM) + wsir * TM + cr; + + sums[sums_idx] += mmq_dot_product(cache_a_idx); + } } } } } -#endif barrier(); } @@ -373,54 +269,6 @@ void main() { const uint offsets = batch_idx * p.batch_stride_d + ik * p.batch_stride_d * gl_NumWorkGroups.z; #endif -#ifdef COOPMAT -#ifdef MUL_MAT_ID - [[unroll]] for (uint cm_row = 0; cm_row < cms_per_row; cm_row++) { - [[unroll]] for (uint cm_col = 0; cm_col < cms_per_col; cm_col++) { - coopMatStore(sums[cm_col * cms_per_row + cm_row], coopmat_stage, warp_i * TM * TN, TM, gl_CooperativeMatrixLayoutColumnMajor); - - [[unroll]] for (uint col = 0; col < BN; col += storestride) { - const uint row_i = dc + cm_col * TN + col + store_c; - if (row_i >= _ne1) break; - - const u16vec2 row_idx = row_ids[row_i]; - - data_d[row_idx.y * p.batch_stride_d + row_idx.x * p.stride_d + dr + cm_row * TM + store_r] = D_TYPE(coopmat_stage[warp_i * TM * TN + (col + store_c) * TM + store_r]); - } - } - } -#else - const bool is_aligned = p.stride_d % 4 == 0; // Assumption: D_TYPE == float - - [[unroll]] for (uint cm_row = 0; cm_row < cms_per_row; cm_row++) { - [[unroll]] for (uint cm_col = 0; cm_col < cms_per_col; cm_col++) { - const bool is_in_bounds = dr + (cm_row + 1) * TM <= p.M && dc + (cm_col + 1) * TN <= p.N; - - if (is_aligned && is_in_bounds) { - // Full coopMat is within bounds and stride_d is aligned with 16B - coopmat cm_dtype = coopmat(sums[cm_col * cms_per_row + cm_row]); - coopMatStore(cm_dtype, data_d, offsets + (dc + cm_col * TN) * p.stride_d + dr + cm_row * TM, p.stride_d, gl_CooperativeMatrixLayoutColumnMajor); - } else if (is_in_bounds) { - // Full coopMat is within bounds, but stride_d is not aligned - coopMatStore(sums[cm_col * cms_per_row + cm_row], coopmat_stage, warp_i * TM * TN, TM, gl_CooperativeMatrixLayoutColumnMajor); - - [[unroll]] for (uint col = 0; col < TN; col += storestride) { - data_d[offsets + (dc + cm_col * TN + col + store_c) * p.stride_d + dr + cm_row * TM + store_r] = D_TYPE(coopmat_stage[warp_i * TM * TN + (col + store_c) * TM + store_r]); - } - } else if (dr + cm_row * TM < p.M && dc + cm_col * TN < p.N) { - // Partial coopMat is within bounds - coopMatStore(sums[cm_col * cms_per_row + cm_row], coopmat_stage, warp_i * TM * TN, TM, gl_CooperativeMatrixLayoutColumnMajor); - - [[unroll]] for (uint col = 0; col < TN; col += storestride) { - if (dr + cm_row * TM + store_r < p.M && dc + cm_col * TN + col + store_c < p.N) { - data_d[offsets + (dc + cm_col * TN + col + store_c) * p.stride_d + dr + cm_row * TM + store_r] = D_TYPE(coopmat_stage[warp_i * TM * TN + (col + store_c) * TM + store_r]); - } - } - } - } - } -#endif // MUL_MAT_ID -#else [[unroll]] for (uint wsic = 0; wsic < WNITER; wsic++) { [[unroll]] for (uint wsir = 0; wsir < WMITER; wsir++) { @@ -431,19 +279,21 @@ void main() { const uint row_i = dc_warp + cc; if (row_i >= _ne1) break; - const u16vec2 row_idx = row_ids[row_i]; + const u16vec2 row_idx = row_ids[row_i - ic * BN]; #endif // MUL_MAT_ID [[unroll]] for (uint cr = 0; cr < TM; cr++) { + const uint sums_idx = (wsic * TN + cc) * WMITER * TM + wsir * TM + cr; #ifdef MUL_MAT_ID - data_d[row_idx.y * p.batch_stride_d + row_idx.x * p.stride_d + dr_warp + cr] = D_TYPE(sums[(wsic * TN + cc) * (WMITER * TM) + wsir * TM + cr]); + if (dr_warp + cr < p.M) { + data_d[row_idx.y * p.batch_stride_d + row_idx.x * p.stride_d + dr_warp + cr] = D_TYPE(sums[sums_idx].x); + } #else if (dr_warp + cr < p.M && dc_warp + cc < p.N) { - data_d[offsets + (dc_warp + cc) * p.stride_d + dr_warp + cr] = D_TYPE(sums[(wsic * TN + cc) * (WMITER * TM) + wsir * TM + cr]); + data_d[offsets + (dc_warp + cc) * p.stride_d + dr_warp + cr] = D_TYPE(sums[sums_idx].x); } #endif // MUL_MAT_ID } } } } -#endif // COOPMAT } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl index fe71eb131c8..c0c03fedcc2 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_funcs.glsl @@ -6,41 +6,89 @@ // Each iqs value maps to a 32-bit integer -#if defined(DATA_A_Q4_0) +#if defined(DATA_A_Q4_0) || defined(DATA_A_Q4_1) +// 2-byte loads for Q4_0 blocks (18 bytes) +// 4-byte loads for Q4_1 blocks (20 bytes) i32vec2 repack(uint ib, uint iqs) { - // Use 2-byte loads since a q4_0 block (18 bytes) is not divisible by 4 - const u16vec2 quants = u16vec2(data_a[ib].qs[iqs * 2 ], - data_a[ib].qs[iqs * 2 + 1]); +#ifdef DATA_A_Q4_0 + const u16vec2 quants = u16vec2(data_a_packed16[ib].qs[iqs * 2 ], + data_a_packed16[ib].qs[iqs * 2 + 1]); const uint32_t vui = pack32(quants); return i32vec2( vui & 0x0F0F0F0F, (vui >> 4) & 0x0F0F0F0F); +#else // DATA_A_Q4_1 + const uint32_t vui = data_a_packed32[ib].qs[iqs]; + return i32vec2( vui & 0x0F0F0F0F, + (vui >> 4) & 0x0F0F0F0F); +#endif } +#ifdef DATA_A_Q4_0 ACC_TYPE mul_q8_1(const int32_t q_sum, const float da, const vec2 dsb, const int32_t sum_divisor) { return ACC_TYPE(da * (float(q_sum) * dsb.x - (8 / sum_divisor) * dsb.y)); } +#else // DATA_A_Q4_1 +ACC_TYPE mul_q8_1(const int32_t q_sum, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { + return ACC_TYPE(float(q_sum) * dma.x * dsb.x + dma.y * dsb.y / sum_divisor); +} #endif -#if defined(DATA_A_Q4_1) -i32vec2 repack(uint ib, uint iqs) { - // Use 4-byte loads since a q4_1 block (20 bytes) is divisible by 4 - const uint32_t vui = data_a_packed32[ib].qs[iqs]; - return i32vec2( vui & 0x0F0F0F0F, - (vui >> 4) & 0x0F0F0F0F); +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { +#ifdef DATA_A_Q4_0 + buf_a[buf_ib].qs[iqs] = pack32(u16vec2(data_a_packed16[ib].qs[iqs * 2], + data_a_packed16[ib].qs[iqs * 2 + 1])); + + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE(data_a_packed16[ib].d); + } +#else // DATA_A_Q4_1 + buf_a[buf_ib].qs[iqs] = data_a_packed32[ib].qs[iqs]; + + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(data_a_packed32[ib].dm); + } +#endif } -ACC_TYPE mul_q8_1(const int32_t q_sum, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { - return ACC_TYPE(float(q_sum) * dma.x * dsb.x + dma.y * dsb.y / sum_divisor); +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].dm = buf_a[buf_ib].dm; + + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } } -#endif -#if defined(DATA_A_Q5_0) +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t q_sum = 0; + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + const uint32_t vui = cache_a[ib_a].qs[iqs]; + const i32vec2 qs_a = i32vec2( vui & 0x0F0F0F0F, + (vui >> 4) & 0x0F0F0F0F); + + const int32_t qs_b0 = cache_b.qs[iqs]; + const int32_t qs_b1 = cache_b.qs[iqs + 4]; + + q_sum += dotPacked4x8EXT(qs_a.x, qs_b0); + q_sum += dotPacked4x8EXT(qs_a.y, qs_b1); + } + + return mul_q8_1(q_sum, cache_a[ib_a].dm, cache_b.ds, 1); +} +#endif // MMQ_SHMEM + +#elif defined(DATA_A_Q5_0) || defined(DATA_A_Q5_1) +// 2-byte loads for Q5_0 blocks (22 bytes) +// 4-byte loads for Q5_1 blocks (24 bytes) i32vec2 repack(uint ib, uint iqs) { - // Use 2-byte loads since a q5_0 block (22 bytes) is not divisible by 4 - const u16vec2 quants = u16vec2(data_a[ib].qs[iqs * 2 ], - data_a[ib].qs[iqs * 2 + 1]); + const u16vec2 quants = u16vec2(data_a_packed16[ib].qs[iqs * 2 ], + data_a_packed16[ib].qs[iqs * 2 + 1]); const uint32_t vui = pack32(quants); - const int32_t qh = int32_t((uint32_t(data_a[ib].qh[1]) << 16 | data_a[ib].qh[0]) >> (4 * iqs)); +#ifdef DATA_A_Q5_0 + const int32_t qh = int32_t((uint32_t(data_a_packed16[ib].qh[1]) << 16 | data_a_packed16[ib].qh[0]) >> (4 * iqs)); +#else // DATA_A_Q5_1 + const int32_t qh = int32_t(data_a_packed32[ib].qh >> (4 * iqs)); +#endif const int32_t v0 = int32_t(vui & 0x0F0F0F0F) | ((qh & 0xF) * 0x02040810) & 0x10101010; // (0,1,2,3) -> (4,12,20,28) @@ -50,40 +98,457 @@ i32vec2 repack(uint ib, uint iqs) { return i32vec2(v0, v1); } +#ifdef DATA_A_Q5_0 ACC_TYPE mul_q8_1(const int32_t q_sum, const float da, const vec2 dsb, const int32_t sum_divisor) { return ACC_TYPE(da * (float(q_sum) * dsb.x - (16 / sum_divisor) * dsb.y)); } +#else // DATA_A_Q5_1 +ACC_TYPE mul_q8_1(const int32_t q_sum, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { + return ACC_TYPE(float(q_sum) * dma.x * dsb.x + dma.y * dsb.y / sum_divisor); +} #endif -#if defined(DATA_A_Q5_1) -i32vec2 repack(uint ib, uint iqs) { - // Use 4-byte loads since a q5_1 block (24 bytes) is divisible by 4 - const uint32_t vui = data_a_packed32[ib].qs[iqs]; - const int32_t qh = int32_t(data_a_packed32[ib].qh >> (4 * iqs)); - const int32_t v0 = int32_t(vui & 0x0F0F0F0F) - | ((qh & 0xF) * 0x02040810) & 0x10101010; // (0,1,2,3) -> (4,12,20,28) +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { +#ifdef DATA_A_Q5_0 + buf_a[buf_ib].qs[iqs] = pack32(u16vec2(data_a_packed16[ib].qs[iqs * 2], + data_a_packed16[ib].qs[iqs * 2 + 1])); - const int32_t v1 = int32_t((vui >> 4) & 0x0F0F0F0F) - | (((qh >> 16) & 0xF) * 0x02040810) & 0x10101010; // (16,17,18,19) -> (4,12,20,28) + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE(data_a_packed16[ib].d); + buf_a[buf_ib].qh = pack32(u16vec2(data_a_packed16[ib].qh[0], data_a_packed16[ib].qh[1])); + } +#else // DATA_A_Q5_1 + buf_a[buf_ib].qs[iqs] = data_a_packed32[ib].qs[iqs]; - return i32vec2(v0, v1); + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(data_a_packed32[ib].dm); + buf_a[buf_ib].qh = data_a_packed32[ib].qh; + } +#endif } -ACC_TYPE mul_q8_1(const int32_t q_sum, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { - return ACC_TYPE(float(q_sum) * dma.x * dsb.x + dma.y * dsb.y / sum_divisor); +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].dm = buf_a[buf_ib].dm; + cache_a[reg_ib].qh = buf_a[buf_ib].qh; + + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } } + +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t q_sum = 0; + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + const uint32_t vui = cache_a[ib_a].qs[iqs]; + const int32_t qh = int32_t(cache_a[ib_a].qh >> (4 * iqs)); + const int32_t qs_a0 = int32_t(vui & 0x0F0F0F0F) + | ((qh & 0xF) * 0x02040810) & 0x10101010; // (0,1,2,3) -> (4,12,20,28) + const int32_t qs_a1 = int32_t((vui >> 4) & 0x0F0F0F0F) + | (((qh >> 16) & 0xF) * 0x02040810) & 0x10101010; // (16,17,18,19) -> (4,12,20,28) + + const int32_t qs_b0 = cache_b.qs[iqs]; + const int32_t qs_b1 = cache_b.qs[iqs + 4]; + + q_sum += dotPacked4x8EXT(qs_a0, qs_b0); + q_sum += dotPacked4x8EXT(qs_a1, qs_b1); + } + + return mul_q8_1(q_sum, cache_a[ib_a].dm, cache_b.ds, 1); +} +#endif // MMQ_SHMEM #endif #if defined(DATA_A_Q8_0) +// 2-byte loads for Q8_0 blocks (34 bytes) int32_t repack(uint ib, uint iqs) { - // Use 2-byte loads since a q8_0 block (34 bytes) is not divisible by 4 - return pack32(i16vec2(data_a[ib].qs[iqs * 2 ], - data_a[ib].qs[iqs * 2 + 1])); + return pack32(i16vec2(data_a_packed16[ib].qs[iqs * 2 ], + data_a_packed16[ib].qs[iqs * 2 + 1])); } ACC_TYPE mul_q8_1(const int32_t q_sum, const float da, const vec2 dsb, const int32_t sum_divisor) { return ACC_TYPE(float(q_sum) * da * dsb.x); } + +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + buf_a[buf_ib].qs[iqs] = pack32(i16vec2(data_a_packed16[ib].qs[iqs * 2], + data_a_packed16[ib].qs[iqs * 2 + 1])); + + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE(data_a_packed16[ib].d); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].dm = buf_a[buf_ib].dm; + + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t q_sum = 0; + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + const int32_t qs_a = cache_a[ib_a].qs[iqs]; + const int32_t qs_b = cache_b.qs[iqs]; + + q_sum += dotPacked4x8EXT(qs_a, qs_b); + } + + return mul_q8_1(q_sum, cache_a[ib_a].dm, cache_b.ds, 1); +} +#endif // MMQ_SHMEM +#endif + +#if defined(DATA_A_MXFP4) +// 1-byte loads for mxfp4 blocks (17 bytes) +i32vec2 repack(uint ib, uint iqs) { + const uint32_t quants = pack32(u8vec4(data_a[ib].qs[iqs * 4 ], + data_a[ib].qs[iqs * 4 + 1], + data_a[ib].qs[iqs * 4 + 2], + data_a[ib].qs[iqs * 4 + 3])); + + return i32vec2( quants & 0x0F0F0F0F, + (quants >> 4) & 0x0F0F0F0F); +} + +ACC_TYPE mul_q8_1(const int32_t q_sum, const float da, const vec2 dsb, const int32_t sum_divisor) { + return ACC_TYPE(da * dsb.x * float(q_sum)); +} + +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint32_t qs = pack32(u8vec4(data_a[ib].qs[iqs * 4 ], + data_a[ib].qs[iqs * 4 + 1], + data_a[ib].qs[iqs * 4 + 2], + data_a[ib].qs[iqs * 4 + 3])); + + const u8vec4 i_a0 = unpack8( qs & 0x0F0F0F0F); + const u8vec4 i_a1 = unpack8((qs >> 4) & 0x0F0F0F0F); + + buf_a[buf_ib].qs[iqs ] = pack32(i8vec4(kvalues_mxfp4[i_a0.x], kvalues_mxfp4[i_a0.y], kvalues_mxfp4[i_a0.z], kvalues_mxfp4[i_a0.w])); + buf_a[buf_ib].qs[iqs + 4] = pack32(i8vec4(kvalues_mxfp4[i_a1.x], kvalues_mxfp4[i_a1.y], kvalues_mxfp4[i_a1.z], kvalues_mxfp4[i_a1.w])); + + if (iqs == 0) { + buf_a[buf_ib].d = FLOAT_TYPE(e8m0_to_fp32(data_a[ib].e) * 0.5); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].d = buf_a[buf_ib].d; + + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t q_sum = 0; + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + const int32_t qs_a = cache_a[ib_a].qs[iqs]; + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + + return mul_q8_1(q_sum, cache_a[ib_a].d, cache_b.ds, 1); +} +#endif // MMQ_SHMEM +#endif + +// For k-quants, ib and iqs still assume 32-wide blocks, but k-quants are 256-wide +// iqs still refers to a 32-bit integer, meaning 0..7 for 32-wide quants +#if defined(DATA_A_Q2_K) +// 4-byte loads for Q2_K blocks (84 bytes) +int32_t repack(uint ib, uint iqs) { + const uint ib_k = ib / 8; + const uint iqs_k = (ib % 8) * 8 + iqs; + + const uint qs_idx = (iqs_k / 32) * 8 + (iqs_k % 8); + const uint qs_shift = ((iqs_k % 32) / 8) * 2; + + return int32_t((data_a_packed32[ib_k].qs[qs_idx] >> qs_shift) & 0x03030303); +} + +uint8_t get_scale(uint ib, uint iqs) { + const uint ib_k = ib / 8; + const uint iqs_k = (ib % 8) * 8 + iqs; + + return data_a[ib_k].scales[iqs_k / 4]; +} + +ACC_TYPE mul_q8_1(const int32_t sum_d, const int32_t sum_m, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { + return ACC_TYPE(dsb.x * (dma.x * float(sum_d) - dma.y * float(sum_m))); +} + +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint ib_k = ib / 8; + const uint iqs_k = (ib % 8) * 8 + iqs * QUANT_R_MMQ; + + const uint qs_idx = (iqs_k / 32) * 8 + (iqs_k % 8); + const uint qs_shift = ((iqs_k % 32) / 8) * 2; + + // Repack 4x4 quants into one int + const uint32_t vals0 = (data_a_packed32[ib_k].qs[qs_idx ] >> qs_shift) & 0x03030303; + const uint32_t vals1 = (data_a_packed32[ib_k].qs[qs_idx + 1] >> qs_shift) & 0x03030303; + const uint32_t vals2 = (data_a_packed32[ib_k].qs[qs_idx + 2] >> qs_shift) & 0x03030303; + const uint32_t vals3 = (data_a_packed32[ib_k].qs[qs_idx + 3] >> qs_shift) & 0x03030303; + + buf_a[buf_ib].qs[iqs] = vals0 | (vals1 << 2) | (vals2 << 4) | (vals3 << 6); + + if (iqs == 0) { + buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(data_a_packed32[ib_k].dm); + buf_a[buf_ib].scales = unpack8(data_a_packed16[ib_k].scales[iqs_k / 8]); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].dm = buf_a[buf_ib].dm; + cache_a[reg_ib].scales = buf_a[buf_ib].scales; + + [[unroll]] for (uint iqs = 0; iqs < 2; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t sum_d = 0; + int32_t sum_m = 0; + + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + const uint8_t scale = cache_a[ib_a].scales[iqs / 4]; + const int32_t scale_m = int32_t(scale >> 4) * 0x01010101; // Duplicate 8-bit value across 32-bits. + const int32_t qs_a = int32_t((cache_a[ib_a].qs[iqs / 4] >> ((iqs % 4) * 2)) & 0x03030303); + + sum_d += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]) * (scale & 0xF); + sum_m += dotPacked4x8EXT(scale_m, cache_b.qs[iqs]); + } + + return mul_q8_1(sum_d, sum_m, cache_a[ib_a].dm, cache_b.ds, 1); +} +#endif // MMQ_SHMEM +#endif + +#if defined(DATA_A_Q3_K) +// 2-byte loads for Q3_K blocks (110 bytes) +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint ib_k = ib / 8; + const uint hm_idx = iqs * QUANT_R_MMQ; + const uint iqs_k = (ib % 8) * 8 + hm_idx; + + const uint qs_idx = (iqs_k / 32) * 8 + (iqs_k % 8); + const uint qs_shift = ((iqs_k % 32) / 8) * 2; + const uint hm_shift = iqs_k / 8; + + // Repack 2x4 quants into one int + // Add the 3rd bit instead of subtracting it to allow packing the quants + const i8vec2 vals00 = unpack8(int16_t((data_a_packed16[ib_k].qs[qs_idx * 2 ] >> qs_shift) & uint16_t(0x0303))) | + unpack8(int16_t(((data_a_packed16[ib_k].hmask[hm_idx * 2 ] >> hm_shift) & uint16_t(0x0101)) << 2)); + const i8vec2 vals01 = unpack8(int16_t((data_a_packed16[ib_k].qs[qs_idx * 2 + 1 ] >> qs_shift) & uint16_t(0x0303))) | + unpack8(int16_t(((data_a_packed16[ib_k].hmask[hm_idx * 2 + 1] >> hm_shift) & uint16_t(0x0101)) << 2)); + const i8vec2 vals10 = unpack8(int16_t((data_a_packed16[ib_k].qs[qs_idx * 2 + 2 ] >> qs_shift) & uint16_t(0x0303))) | + unpack8(int16_t(((data_a_packed16[ib_k].hmask[hm_idx * 2 + 2] >> hm_shift) & uint16_t(0x0101)) << 2)); + const i8vec2 vals11 = unpack8(int16_t((data_a_packed16[ib_k].qs[qs_idx * 2 + 3 ] >> qs_shift) & uint16_t(0x0303))) | + unpack8(int16_t(((data_a_packed16[ib_k].hmask[hm_idx * 2 + 3] >> hm_shift) & uint16_t(0x0101)) << 2)); + buf_a[buf_ib].qs[iqs] = pack32(u8vec4(vals00.x, vals00.y, vals01.x, vals01.y)) | + (pack32(u8vec4(vals10.x, vals10.y, vals11.x, vals11.y)) << 4); + + if (iqs == 0) { + const uint is = iqs_k / 4; + const i8vec2 scales = i8vec2(unpack8(((data_a_packed16[ib_k].scales[(is % 8 ) / 2] >> (4 * (is / 8))) & 0x0F0F) | + (((data_a_packed16[ib_k].scales[(8 + (is % 4)) / 2] >> (2 * (is / 4))) & 0x0303) << 4))); + + buf_a[buf_ib].d_scales = FLOAT_TYPE(data_a_packed16[ib_k].d) * FLOAT_TYPE_VEC2(scales - 32); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].d_scales = buf_a[buf_ib].d_scales; + + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + float result = 0.0; + int32_t q_sum = 0; + + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + // Subtract 4 from the quants to correct the 3rd bit offset + const int32_t qs_a = pack32(unpack8(int32_t((cache_a[ib_a].qs[iqs / 2] >> ((iqs % 2) * 4)) & 0x0F0F0F0F)) - int8_t(4)); + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + result += float(cache_a[ib_a].d_scales[0]) * float(q_sum); + q_sum = 0; + + [[unroll]] for (uint iqs = 4; iqs < 8; iqs++) { + const int32_t qs_a = pack32(unpack8(int32_t((cache_a[ib_a].qs[iqs / 2] >> ((iqs % 2) * 4)) & 0x0F0F0F0F)) - int8_t(4)); + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + result += float(cache_a[ib_a].d_scales[1]) * float(q_sum); + + return ACC_TYPE(cache_b.ds.x * result); +} +#endif // MMQ_SHMEM +#endif + +#if defined(DATA_A_Q4_K) || defined(DATA_A_Q5_K) +// 4-byte loads for Q4_K blocks (144 bytes) and Q5_K blocks (176 bytes) +ACC_TYPE mul_q8_1(const int32_t q_sum, const vec2 dma, const vec2 dsb, const int32_t sum_divisor) { + return ACC_TYPE(dsb.x * dma.x * float(q_sum) - dma.y * dsb.y); +} + +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint ib_k = ib / 8; + const uint iqs_k = (ib % 8) * 8 + iqs * QUANT_R_MMQ; + + const uint qs_idx = (iqs_k / 16) * 8 + (iqs_k % 8); + const uint qs_shift = ((iqs_k % 16) / 8) * 4; + + // Repack 2x4 quants into one int +#if defined(DATA_A_Q4_K) + const uint32_t vals0 = (data_a_packed32[ib_k].qs[qs_idx ] >> qs_shift) & 0x0F0F0F0F; + const uint32_t vals1 = (data_a_packed32[ib_k].qs[qs_idx + 1] >> qs_shift) & 0x0F0F0F0F; + + buf_a[buf_ib].qs[iqs] = vals0 | (vals1 << 4); +#else // defined(DATA_A_Q5_K) + const uint qh_idx = iqs * QUANT_R_MMQ; + const uint qh_shift = iqs_k / 8; + + buf_a[buf_ib].qs[iqs] = int32_t(((data_a_packed32[ib_k].qs[qs_idx] >> qs_shift) & 0x0F0F0F0F) | + (((data_a_packed32[ib_k].qh[qh_idx] >> qh_shift) & 0x01010101) << 4)); +#endif + + + if (iqs == 0) { + // Scale index + const uint is = iqs_k / 8; + u8vec2 scale_dm; + if (is < 4) { + scale_dm = u8vec2(data_a[ib_k].scales[is] & 0x3F, data_a[ib_k].scales[is + 4] & 0x3F); + } else { + scale_dm = u8vec2((data_a[ib_k].scales[is+4] & 0xF) | ((data_a[ib_k].scales[is-4] & 0xC0) >> 2), + (data_a[ib_k].scales[is+4] >> 4) | ((data_a[ib_k].scales[is ] & 0xC0) >> 2)); + } + + buf_a[buf_ib].dm = FLOAT_TYPE_VEC2(data_a_packed32[ib_k].dm) * FLOAT_TYPE_VEC2(scale_dm); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].dm = buf_a[buf_ib].dm; + + [[unroll]] for (uint iqs = 0; iqs < 8 / QUANT_R_MMQ; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + int32_t q_sum = 0; + + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { +#if defined(DATA_A_Q4_K) + const int32_t qs_a = int32_t((cache_a[ib_a].qs[iqs / 2] >> ((iqs % 2) * 4)) & 0x0F0F0F0F); +#else // defined(DATA_A_Q5_K) + const int32_t qs_a = cache_a[ib_a].qs[iqs]; +#endif + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + + return mul_q8_1(q_sum, cache_a[ib_a].dm, cache_b.ds, 1); +} +#endif // MMQ_SHMEM +#endif + +#ifdef MMQ_SHMEM +void block_b_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint ib_outer = ib / 4; + const uint ib_inner = ib % 4; + + if (iqs == 0) { + buf_b[buf_ib].ds = FLOAT_TYPE_VEC2(data_b[ib_outer].ds[ib_inner]); + } + + const ivec4 values = data_b[ib_outer].qs[ib_inner * 2 + iqs]; + buf_b[buf_ib].qs[iqs * 4 ] = values.x; + buf_b[buf_ib].qs[iqs * 4 + 1] = values.y; + buf_b[buf_ib].qs[iqs * 4 + 2] = values.z; + buf_b[buf_ib].qs[iqs * 4 + 3] = values.w; +} + +void block_b_to_registers(const uint ib) { + cache_b.ds = buf_b[ib].ds; + [[unroll]] for (uint iqs = 0; iqs < BK / 4; iqs++) { + cache_b.qs[iqs] = buf_b[ib].qs[iqs]; + } +} +#endif + +#if defined(DATA_A_Q6_K) +// 2-byte loads for Q6_K blocks (210 bytes) +#ifdef MMQ_SHMEM +void block_a_to_shmem(const uint buf_ib, const uint ib, const uint iqs) { + const uint ib_k = ib / 8; + const uint iqs_k = (ib % 8) * 8 + iqs; + + const uint ql_idx = (iqs_k / 32) * 16 + iqs_k % 16; + const uint ql_shift = ((iqs_k % 32) / 16) * 4; + + const uint qh_idx = (iqs_k / 32) * 8 + iqs; + const uint qh_shift = ((iqs_k % 32) / 8) * 2; + + const i8vec2 vals00 = (unpack8(int16_t((data_a_packed16[ib_k].ql[ql_idx * 2 ] >> ql_shift) & uint16_t(0x0F0F))) | + unpack8(int16_t(((data_a_packed16[ib_k].qh[qh_idx * 2 ] >> qh_shift) & uint16_t(0x0303)) << 4))) - int8_t(32); + const i8vec2 vals01 = (unpack8(int16_t((data_a_packed16[ib_k].ql[ql_idx * 2 + 1] >> ql_shift) & uint16_t(0x0F0F))) | + unpack8(int16_t(((data_a_packed16[ib_k].qh[qh_idx * 2 + 1] >> qh_shift) & uint16_t(0x0303)) << 4))) - int8_t(32); + buf_a[buf_ib].qs[iqs] = pack32(i8vec4(vals00.x, vals00.y, vals01.x, vals01.y)); + + if (iqs == 0) { + const uint is = iqs_k / 4; + const i8vec2 scales = unpack8(data_a_packed16[ib_k].scales[is / 2]); + + buf_a[buf_ib].d_scales = FLOAT_TYPE(data_a_packed16[ib_k].d) * FLOAT_TYPE_VEC2(scales); + } +} + +void block_a_to_registers(const uint reg_ib, const uint buf_ib) { + cache_a[reg_ib].d_scales = buf_a[buf_ib].d_scales; + + [[unroll]] for (uint iqs = 0; iqs < 8; iqs++) { + cache_a[reg_ib].qs[iqs] = buf_a[buf_ib].qs[iqs]; + } +} + +ACC_TYPE mmq_dot_product(const uint ib_a) { + float result = 0.0; + int32_t q_sum = 0; + + [[unroll]] for (uint iqs = 0; iqs < 4; iqs++) { + const int32_t qs_a = cache_a[ib_a].qs[iqs]; + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + result += float(cache_a[ib_a].d_scales[0]) * float(q_sum); + q_sum = 0; + + [[unroll]] for (uint iqs = 4; iqs < 8; iqs++) { + const int32_t qs_a = cache_a[ib_a].qs[iqs]; + + q_sum += dotPacked4x8EXT(qs_a, cache_b.qs[iqs]); + } + result += float(cache_a[ib_a].d_scales[1]) * float(q_sum); + + return ACC_TYPE(cache_b.ds.x * result); +} +#endif // MMQ_SHMEM #endif #if defined(DATA_A_Q4_0) || defined(DATA_A_Q5_0) || defined(DATA_A_Q8_0) || defined(DATA_A_IQ1_S) || defined(DATA_A_IQ2_XXS) || defined(DATA_A_IQ2_XS) || defined(DATA_A_IQ2_S) || defined(DATA_A_IQ3_XXS) || defined(DATA_A_IQ3_S) || defined(DATA_A_IQ4_XS) || defined(DATA_A_IQ4_NL) @@ -103,3 +568,10 @@ FLOAT_TYPE_VEC2 get_dm(uint ib) { return FLOAT_TYPE_VEC2(data_a_packed32[ib].dm); } #endif + +#if defined(DATA_A_Q2_K) +FLOAT_TYPE_VEC2 get_dm(uint ib) { + const uint ib_k = ib / 8; + return FLOAT_TYPE_VEC2(data_a_packed32[ib_k].dm); +} +#endif diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl new file mode 100644 index 00000000000..72fec440490 --- /dev/null +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl @@ -0,0 +1,78 @@ +#if defined(DATA_A_Q4_0) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[16/4]; + FLOAT_TYPE dm; +}; +#elif defined(DATA_A_Q4_1) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[16/4]; + FLOAT_TYPE_VEC2 dm; +}; +#elif defined(DATA_A_Q5_0) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[16/4]; + uint32_t qh; + FLOAT_TYPE dm; +}; +#elif defined(DATA_A_Q5_1) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[16/4]; + uint32_t qh; + FLOAT_TYPE_VEC2 dm; +}; +#elif defined(DATA_A_Q8_0) +#define QUANT_R_MMQ 1 +// AMD likes 4, Intel likes 1 and Nvidia likes 2 +#define BK_STEP 1 +struct block_a_cache { + int32_t qs[32/4]; + FLOAT_TYPE dm; +}; +#elif defined(DATA_A_MXFP4) +#define QUANT_R_MMQ 2 +struct block_a_cache { + int32_t qs[8]; + FLOAT_TYPE d; +}; +#elif defined(DATA_A_Q2_K) +#define QUANT_R_MMQ 4 +struct block_a_cache { + uint32_t qs[2]; + u8vec2 scales; + FLOAT_TYPE_VEC2 dm; +}; +#elif defined(DATA_A_Q3_K) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[4]; + FLOAT_TYPE_VEC2 d_scales; +}; +#elif defined(DATA_A_Q4_K) +#define QUANT_R_MMQ 2 +struct block_a_cache { + uint32_t qs[4]; + FLOAT_TYPE_VEC2 dm; +}; +#elif defined(DATA_A_Q5_K) +#define QUANT_R_MMQ 1 +struct block_a_cache { + int32_t qs[8]; + FLOAT_TYPE_VEC2 dm; +}; +#elif defined(DATA_A_Q6_K) +#define QUANT_R_MMQ 1 +struct block_a_cache { + int32_t qs[8]; + FLOAT_TYPE_VEC2 d_scales; +}; +#endif + +struct block_b_cache +{ + int32_t qs[8]; + FLOAT_TYPE_VEC2 ds; +}; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl index 2fa54ce51fc..02578c77c4f 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/types.glsl @@ -66,6 +66,7 @@ struct block_q4_0_packed16 #define QUANT_AUXF 1 #define A_TYPE block_q4_0 #define A_TYPE_PACKED16 block_q4_0_packed16 +#define DATA_A_QUANT_LEGACY #endif #define QUANT_K_Q4_1 32 @@ -98,6 +99,7 @@ struct block_q4_1_packed32 #define A_TYPE block_q4_1 #define A_TYPE_PACKED16 block_q4_1_packed16 #define A_TYPE_PACKED32 block_q4_1_packed32 +#define DATA_A_QUANT_LEGACY #endif #define QUANT_K_Q5_0 32 @@ -123,6 +125,7 @@ struct block_q5_0_packed16 #define QUANT_AUXF 1 #define A_TYPE block_q5_0 #define A_TYPE_PACKED16 block_q5_0_packed16 +#define DATA_A_QUANT_LEGACY #endif #define QUANT_K_Q5_1 32 @@ -158,6 +161,7 @@ struct block_q5_1_packed32 #define A_TYPE block_q5_1 #define A_TYPE_PACKED16 block_q5_1_packed16 #define A_TYPE_PACKED32 block_q5_1_packed32 +#define DATA_A_QUANT_LEGACY #endif #define QUANT_K_Q8_0 32 @@ -186,6 +190,7 @@ struct block_q8_0_packed32 #define A_TYPE block_q8_0 #define A_TYPE_PACKED16 block_q8_0_packed16 #define A_TYPE_PACKED32 block_q8_0_packed32 +#define DATA_A_QUANT_LEGACY #endif #define QUANT_K_Q8_1 32 @@ -226,21 +231,21 @@ struct block_q2_K { uint8_t scales[QUANT_K_Q2_K/16]; uint8_t qs[QUANT_K_Q2_K/4]; - f16vec2 d; + f16vec2 dm; }; struct block_q2_K_packed16 { uint16_t scales[QUANT_K_Q2_K/16/2]; uint16_t qs[QUANT_K_Q2_K/4/2]; - f16vec2 d; + f16vec2 dm; }; struct block_q2_K_packed32 { uint32_t scales[QUANT_K_Q2_K/16/4]; uint32_t qs[QUANT_K_Q2_K/4/4]; - f16vec2 d; + f16vec2 dm; }; #if defined(DATA_A_Q2_K) @@ -249,6 +254,8 @@ struct block_q2_K_packed32 #define A_TYPE block_q2_K #define A_TYPE_PACKED16 block_q2_K_packed16 #define A_TYPE_PACKED32 block_q2_K_packed32 +#define SCALES_PER_32 2 +#define DATA_A_QUANT_K #endif #define QUANT_K_Q3_K 256 @@ -274,27 +281,28 @@ struct block_q3_K_packed16 #define QUANT_R 1 #define A_TYPE block_q3_K #define A_TYPE_PACKED16 block_q3_K_packed16 +#define DATA_A_QUANT_K #endif #define QUANT_K_Q4_K 256 struct block_q4_K { - f16vec2 d; + f16vec2 dm; uint8_t scales[3*QUANT_K_Q4_K/64]; uint8_t qs[QUANT_K_Q4_K/2]; }; struct block_q4_K_packed16 { - f16vec2 d; + f16vec2 dm; uint16_t scales[3*QUANT_K_Q4_K/64/2]; uint16_t qs[QUANT_K_Q4_K/2/2]; }; struct block_q4_K_packed32 { - f16vec2 d; + f16vec2 dm; uint32_t scales[3*QUANT_K_Q4_K/64/4]; uint32_t qs[QUANT_K_Q4_K/2/4]; }; @@ -310,13 +318,14 @@ struct block_q4_K_packed128 #define A_TYPE block_q4_K #define A_TYPE_PACKED16 block_q4_K_packed16 #define A_TYPE_PACKED32 block_q4_K_packed32 +#define DATA_A_QUANT_K #endif #define QUANT_K_Q5_K 256 struct block_q5_K { - f16vec2 d; + f16vec2 dm; uint8_t scales[12]; uint8_t qh[QUANT_K_Q5_K/8]; uint8_t qs[QUANT_K_Q5_K/2]; @@ -324,12 +333,20 @@ struct block_q5_K struct block_q5_K_packed16 { - f16vec2 d; + f16vec2 dm; uint16_t scales[12/2]; uint16_t qh[QUANT_K_Q5_K/8/2]; uint16_t qs[QUANT_K_Q5_K/2/2]; }; +struct block_q5_K_packed32 +{ + f16vec2 dm; + uint32_t scales[12/4]; + uint32_t qh[QUANT_K_Q5_K/8/4]; + uint32_t qs[QUANT_K_Q5_K/2/4]; +}; + struct block_q5_K_packed128 { uvec4 q5k[11]; @@ -340,6 +357,8 @@ struct block_q5_K_packed128 #define QUANT_R 1 #define A_TYPE block_q5_K #define A_TYPE_PACKED16 block_q5_K_packed16 +#define A_TYPE_PACKED32 block_q5_K_packed32 +#define DATA_A_QUANT_K #endif #define QUANT_K_Q6_K 256 @@ -356,7 +375,7 @@ struct block_q6_K_packed16 { uint16_t ql[QUANT_K_Q6_K/2/2]; uint16_t qh[QUANT_K_Q6_K/4/2]; - int8_t scales[QUANT_K_Q6_K/16]; + int16_t scales[QUANT_K_Q6_K/16/2]; float16_t d; }; @@ -365,6 +384,7 @@ struct block_q6_K_packed16 #define QUANT_R 1 #define A_TYPE block_q6_K #define A_TYPE_PACKED16 block_q6_K_packed16 +#define DATA_A_QUANT_K #endif // IQuants @@ -1363,18 +1383,11 @@ struct block_mxfp4 uint8_t qs[QUANT_K_MXFP4/2]; }; -//struct block_mxfp4_packed16 -//{ -// uint8_t e; -// uint16_t qs[QUANT_K_MXFP4/2/2]; -//}; - #if defined(DATA_A_MXFP4) #define QUANT_K QUANT_K_MXFP4 #define QUANT_R QUANT_R_MXFP4 #define QUANT_AUXF 1 #define A_TYPE block_mxfp4 -//#define A_TYPE_PACKED16 block_mxfp4_packed16 #endif #if defined(DATA_A_IQ4_NL) || defined(DATA_A_IQ4_XS) @@ -1397,12 +1410,12 @@ void init_iq_shmem(uvec3 wgsize) #endif #if defined(DATA_A_MXFP4) -const FLOAT_TYPE kvalues_mxfp4_const[16] = { - FLOAT_TYPE(0.0f), FLOAT_TYPE(0.5f), FLOAT_TYPE(1.0f), FLOAT_TYPE(1.5f), FLOAT_TYPE(2.0f), FLOAT_TYPE(3.0f), FLOAT_TYPE(4.0f), FLOAT_TYPE(6.0f), - FLOAT_TYPE(-0.0f), FLOAT_TYPE(-0.5f), FLOAT_TYPE(-1.0f), FLOAT_TYPE(-1.5f), FLOAT_TYPE(-2.0f), FLOAT_TYPE(-3.0f), FLOAT_TYPE(-4.0f), FLOAT_TYPE(-6.0f) +const int8_t kvalues_mxfp4_const[16] = { + int8_t(0), int8_t(1), int8_t(2), int8_t(3), int8_t(4), int8_t(6), int8_t(8), int8_t(12), + int8_t(0), int8_t(-1), int8_t(-2), int8_t(-3), int8_t(-4), int8_t(-6), int8_t(-8), int8_t(-12), }; -shared FLOAT_TYPE kvalues_mxfp4[16]; +shared int8_t kvalues_mxfp4[16]; #define NEEDS_INIT_IQ_SHMEM void init_iq_shmem(uvec3 wgsize) diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp index 0f25ba34530..03fa016398c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp @@ -566,7 +566,8 @@ void matmul_shaders(bool fp16, MatMulIdType matmul_id_type, bool coopmat, bool c } #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) - if (!coopmat && !coopmat2 && matmul_id_type == MatMulIdType::NONE && is_legacy_quant(tname)) { + // Integer dot mmq performs better with f32 accumulators + if (!f16acc && !coopmat && !coopmat2 && (is_legacy_quant(tname) || is_k_quant(tname) || tname == "mxfp4")) { string_to_spv(shader_name + "_" + tname + "_q8_1", "mul_mmq.comp", merge_maps(merge_maps(base_dict, float_type_dict), {{data_a_key, "1"}, {"D_TYPE", "float"},}), fp16, coopmat, coopmat2, f16acc); } #endif @@ -574,7 +575,7 @@ void matmul_shaders(bool fp16, MatMulIdType matmul_id_type, bool coopmat, bool c } void process_shaders() { - std::map base_dict = {{"FLOAT_TYPE", "float"}}; + std::map base_dict = {{"FLOAT_TYPE", "float"}, {"FLOAT_TYPE_VEC2", "vec2"}}; // matmul for (const MatMulIdType& matmul_id_type : {MatMulIdType::NONE, MatMulIdType::DEFAULT, MatMulIdType::SUBGROUP}) { From 10fcc41290e233788f5a4215314156e8e023eb92 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Wed, 29 Oct 2025 08:44:29 -0500 Subject: [PATCH 011/185] vulkan: Update topk_moe fusion to handle gpt's late softmax (#16656) * vulkan: Update topk_moe fusion to handle gpt's late softmax Based on #16649. * Add ggml_check_edges * Add sync logging to show fusion effects * handle clamp added in #16655 * Update ggml/src/ggml-impl.h Co-authored-by: Diego Devesa --- ggml/src/ggml-impl.h | 16 + ggml/src/ggml-vulkan/ggml-vulkan.cpp | 304 +++++++++++------- .../ggml-vulkan/vulkan-shaders/topk_moe.comp | 90 ++++-- 3 files changed, 272 insertions(+), 138 deletions(-) diff --git a/ggml/src/ggml-impl.h b/ggml/src/ggml-impl.h index e9201cdc685..ec37a25337b 100644 --- a/ggml/src/ggml-impl.h +++ b/ggml/src/ggml-impl.h @@ -682,6 +682,7 @@ static inline bool ggml_can_fuse_subgraph(const struct ggml_cgraph * cgraph, #endif #ifdef __cplusplus +#include #include #include @@ -697,6 +698,21 @@ inline bool ggml_can_fuse_subgraph(const struct ggml_cgraph * cgraph, return ggml_can_fuse_subgraph(cgraph, start_idx, ops.size(), ops.begin(), outputs.begin(), outputs.size()); } +// Return true if the edges in the graph match expectations. +inline bool ggml_check_edges(const struct ggml_cgraph * cgraph, + int start_idx, + std::initializer_list> edges) { + for (const auto & edge : edges) { + int dst_node = edge[0]; + int src_idx = edge[1]; + int src_node = edge[2]; + if (cgraph->nodes[start_idx + dst_node]->src[src_idx] != cgraph->nodes[start_idx + src_node]) { + return false; + } + } + return true; +} + // expose GGUF internals for test code GGML_API size_t gguf_type_size(enum gguf_type type); GGML_API struct gguf_context * gguf_init_from_file_impl(FILE * file, struct gguf_init_params params); diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 3d10aa07b08..50e7922dc60 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -385,12 +385,76 @@ static constexpr uint32_t num_argsort_pipelines = 11; static constexpr uint32_t max_argsort_cols = 1 << (num_argsort_pipelines-1); static constexpr uint32_t num_topk_moe_pipelines = 10; -static constexpr std::array topk_moe_norm{ GGML_OP_SOFT_MAX, GGML_OP_RESHAPE, GGML_OP_ARGSORT, - GGML_OP_VIEW, GGML_OP_GET_ROWS, GGML_OP_RESHAPE, - GGML_OP_SUM_ROWS, GGML_OP_DIV, GGML_OP_RESHAPE }; -static constexpr std::array topk_moe { GGML_OP_SOFT_MAX, GGML_OP_RESHAPE, GGML_OP_ARGSORT, - GGML_OP_VIEW, GGML_OP_GET_ROWS }; +static constexpr std::initializer_list topk_moe_early_softmax_norm{ GGML_OP_SOFT_MAX, GGML_OP_RESHAPE, GGML_OP_ARGSORT, + GGML_OP_VIEW, GGML_OP_GET_ROWS, GGML_OP_RESHAPE, + GGML_OP_SUM_ROWS, GGML_OP_CLAMP, GGML_OP_DIV, + GGML_OP_RESHAPE }; +static constexpr std::initializer_list topk_moe_early_softmax { GGML_OP_SOFT_MAX, GGML_OP_RESHAPE, GGML_OP_ARGSORT, + GGML_OP_VIEW, GGML_OP_GET_ROWS }; +static constexpr std::initializer_list topk_moe_late_softmax { GGML_OP_ARGSORT, GGML_OP_VIEW, + GGML_OP_GET_ROWS, GGML_OP_RESHAPE, + GGML_OP_SOFT_MAX, GGML_OP_RESHAPE }; + +//node #978 ( SOFT_MAX): ffn_moe_probs-15 ( 0K) [Vulka ] use=2: ffn_moe_logits-15 ( 0K) [Vulka ] +//node #979 ( RESHAPE): ffn_moe_probs-15 (re ( 0K) [Vulka ] use=1: ffn_moe_probs-15 ( 0K) [Vulka ] +//node #980 ( ARGSORT): ffn_moe_argsort-15 ( 0K) [Vulka ] use=1: ffn_moe_probs-15 ( 0K) [Vulka ] +//node #981 ( VIEW): ffn_moe_topk-15 ( 0K) [Vulka ] use=4: ffn_moe_argsort-15 ( 0K) [Vulka ] +//node #982 ( GET_ROWS): ffn_moe_weights-15 ( 0K) [Vulka ] use=1: ffn_moe_probs-15 (re ( 0K) [Vulka ] ffn_moe_topk-15 ( 0K) [Vulka ] +//node #983 ( RESHAPE): ffn_moe_weights-15 ( ( 0K) [Vulka ] use=2: ffn_moe_weights-15 ( 0K) [Vulka ] +//node #984 ( SUM_ROWS): ffn_moe_weights_sum- ( 0K) [Vulka ] use=1: ffn_moe_weights-15 ( ( 0K) [Vulka ] +//node #985 ( CLAMP): ffn_moe_weights_sum_ ( 0K) [Vulka ] use=1: ffn_moe_weights_sum- ( 0K) [Vulka ] +//node #986 ( DIV): ffn_moe_weights_norm ( 0K) [Vulka ] use=1: ffn_moe_weights-15 ( ( 0K) [Vulka ] ffn_moe_weights_sum_ ( 0K) [Vulka ] +//node #987 ( RESHAPE): ffn_moe_weights_norm ( 0K) [Vulka ] use=1: ffn_moe_weights_norm ( 0K) [Vulka ] +static constexpr std::initializer_list> topk_moe_early_softmax_norm_edges { + { 1, 0, 0 }, // reshape->src[0] == softmax + { 2, 0, 0 }, // argsort->src[0] == softmax + { 3, 0, 2 }, // view->src[0] == argsort + { 4, 0, 1 }, // get_rows->src[0] == reshape + { 4, 1, 3 }, // get_rows->src[1] == view + { 5, 0, 4 }, // reshape->src[0] == get_rows + { 6, 0, 5 }, // sum_rows->src[0] == reshape + { 7, 0, 6 }, // clamp->src[0] == sum_rows + { 8, 0, 5 }, // div->src[0] == reshape + { 8, 1, 7 }, // div->src[1] == clamp + { 9, 0, 8 }, // reshape->src[0] == div +}; + +// same as early_softmax_norm but ending after the get_rows +static constexpr std::initializer_list> topk_moe_early_softmax_edges { + { 1, 0, 0 }, // reshape->src[0] == softmax + { 2, 0, 0 }, // argsort->src[0] == softmax + { 3, 0, 2 }, // view->src[0] == argsort + { 4, 0, 1 }, // get_rows->src[0] == reshape + { 4, 1, 3 }, // get_rows->src[1] == view +}; +//node #652 ( ARGSORT): ffn_moe_argsort-11 ( 0K) [Vulka ] use=1: ffn_moe_probs-11 ( 0K) [Vulka ] +//node #653 ( VIEW): ffn_moe_topk-11 ( 0K) [Vulka ] use=7: ffn_moe_argsort-11 ( 0K) [Vulka ] +//node #654 ( GET_ROWS): ffn_moe_weights-11 ( 0K) [Vulka ] use=1: ffn_moe_probs-11 (re ( 0K) [Vulka ] ffn_moe_topk-11 ( 0K) [Vulka ] +//node #655 ( RESHAPE): ffn_moe_weights-11 ( ( 0K) [Vulka ] use=1: ffn_moe_weights-11 ( 0K) [Vulka ] +//node #656 ( SOFT_MAX): node_656 ( 0K) [Vulka ] use=1: ffn_moe_weights-11 ( ( 0K) [Vulka ] +//node #657 ( RESHAPE): ffn_moe_weights_soft ( 0K) [Vulka ] use=1: node_656 ( 0K) [Vulka ] +static constexpr std::initializer_list> topk_moe_late_softmax_edges { + { 1, 0, 0 }, // view->src[0] == argsort + { 2, 1, 1 }, // get_rows->src[1] == view + { 3, 0, 2 }, // reshape->src[0] == get_rows + { 4, 0, 3 }, // soft_max->src[0] == reshape + { 5, 0, 4 }, // reshape->src[0] == soft_max +}; + +enum topk_moe_mode { + TOPK_MOE_EARLY_SOFTMAX, + TOPK_MOE_EARLY_SOFTMAX_NORM, + TOPK_MOE_LATE_SOFTMAX, + TOPK_MOE_COUNT, +}; + +static topk_moe_mode ggml_vk_num_additional_ops_to_topk_moe_mode(uint32_t num) { + topk_moe_mode mode = num == topk_moe_early_softmax_norm.size() - 1 ? TOPK_MOE_EARLY_SOFTMAX_NORM : + num == topk_moe_early_softmax.size() - 1 ? TOPK_MOE_EARLY_SOFTMAX : + TOPK_MOE_LATE_SOFTMAX; + return mode; +} struct vk_device_struct { std::recursive_mutex mutex; @@ -605,8 +669,7 @@ struct vk_device_struct { vk_pipeline pipeline_flash_attn_split_k_reduce; - // [2] is {!norm, norm} - vk_pipeline pipeline_topk_moe[num_topk_moe_pipelines][2]; + vk_pipeline pipeline_topk_moe[num_topk_moe_pipelines][TOPK_MOE_COUNT]; std::vector all_pipelines; @@ -954,6 +1017,8 @@ static_assert(sizeof(vk_op_multi_add_push_constants) <= 256); struct vk_op_topk_moe_push_constants { uint32_t n_rows; uint32_t n_expert_used; + float clamp_min; + float clamp_max; }; struct vk_op_add_id_push_constants { @@ -3804,8 +3869,9 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_conv2d_dw_cwhn_f16_f32, "conv2d_dw_cwhn_f16_f32", conv2d_dw_cwhn_f16_f32_len, conv2d_dw_cwhn_f16_f32_data, "main", 3, sizeof(vk_op_conv2d_dw_push_constants), {512, 1, 1}, {}, 1); for (uint32_t i = 0; i < num_topk_moe_pipelines; ++i) { - ggml_vk_create_pipeline2(device, device->pipeline_topk_moe[i][0], "topk_moe_f32_"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<pipeline_topk_moe[i][1], "topk_moe_f32_"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<pipeline_topk_moe[i][TOPK_MOE_EARLY_SOFTMAX], "topk_moe_f32_early_softmax_"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<pipeline_topk_moe[i][TOPK_MOE_EARLY_SOFTMAX_NORM], "topk_moe_f32_early_softmax_norm"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<pipeline_topk_moe[i][TOPK_MOE_LATE_SOFTMAX], "topk_moe_f32_late_softmax"+std::to_string(i), topk_moe_f32_len, topk_moe_f32_data, "main", 3, sizeof(vk_op_topk_moe_push_constants), {1, 1, 1}, {device->subgroup_size, 1u<num_additional_fused_ops) { uint32_t idx = (uint32_t)ceilf(log2f(float(dst->ne[0]))); GGML_ASSERT(idx < num_topk_moe_pipelines); - bool with_norm = ctx->num_additional_fused_ops == topk_moe_norm.size() - 1; - return ctx->device->pipeline_topk_moe[idx][with_norm]; + topk_moe_mode mode = ggml_vk_num_additional_ops_to_topk_moe_mode(ctx->num_additional_fused_ops); + return ctx->device->pipeline_topk_moe[idx][mode]; } if (src0->type == GGML_TYPE_F32 && (src1 == nullptr || src1->type == GGML_TYPE_F32) && dst->type == GGML_TYPE_F32) { @@ -8139,6 +8205,13 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const return nullptr; } case GGML_OP_ARGSORT: + if (ctx->num_additional_fused_ops) { + uint32_t idx = (uint32_t)ceilf(log2f(float(dst->ne[0]))); + GGML_ASSERT(idx < num_topk_moe_pipelines); + topk_moe_mode mode = ggml_vk_num_additional_ops_to_topk_moe_mode(ctx->num_additional_fused_ops); + return ctx->device->pipeline_topk_moe[idx][mode]; + } + if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_I32) { uint32_t idx = (uint32_t)ceilf(log2f(float(dst->ne[0]))); return ctx->device->pipeline_argsort_f32[idx]; @@ -9678,10 +9751,12 @@ static void ggml_vk_soft_max_back(ggml_backend_vk_context * ctx, vk_context& sub static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { - bool with_norm = ctx->num_additional_fused_ops == topk_moe_norm.size() - 1; + topk_moe_mode mode = ggml_vk_num_additional_ops_to_topk_moe_mode(ctx->num_additional_fused_ops); ggml_tensor * logits = cgraph->nodes[node_idx + 0]->src[0]; - ggml_tensor * weights = with_norm ? cgraph->nodes[node_idx + 8] : cgraph->nodes[node_idx + 4]; - ggml_tensor * ids = cgraph->nodes[node_idx + 3]; + ggml_tensor * weights = (mode == TOPK_MOE_EARLY_SOFTMAX_NORM) ? cgraph->nodes[node_idx + 9] : + (mode == TOPK_MOE_EARLY_SOFTMAX) ? cgraph->nodes[node_idx + 4] : + cgraph->nodes[node_idx + 5]; + ggml_tensor * ids = (mode == TOPK_MOE_LATE_SOFTMAX) ? cgraph->nodes[node_idx + 1] : cgraph->nodes[node_idx + 3]; GGML_ASSERT(logits->type == GGML_TYPE_F32); GGML_ASSERT(weights->type == GGML_TYPE_F32); @@ -9740,9 +9815,14 @@ static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, GGML_ASSERT(d_ids != nullptr); } - vk_op_topk_moe_push_constants pc; + vk_op_topk_moe_push_constants pc {}; pc.n_rows = n_rows; pc.n_expert_used = n_expert_used; + if (mode == TOPK_MOE_EARLY_SOFTMAX_NORM) { + ggml_tensor * clamp = cgraph->nodes[node_idx + 7]; + pc.clamp_min = ggml_get_op_params_f32(clamp, 0); + pc.clamp_max = ggml_get_op_params_f32(clamp, 1); + } GGML_ASSERT(n_expert_used <= n_experts); @@ -11337,7 +11417,13 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr } } } + +#define ENABLE_SYNC_LOGGING 0 + if (need_sync) { +#if ENABLE_SYNC_LOGGING + std::cerr << "sync" << std::endl; +#endif ctx->unsynced_nodes_written.clear(); ctx->unsynced_nodes_read.clear(); ggml_vk_sync_buffers(ctx, compute_ctx); @@ -11355,6 +11441,18 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr } } } +#if ENABLE_SYNC_LOGGING + if (!dryrun) { + for (int i = 0; i < ctx->num_additional_fused_ops + 1; ++i) { + auto *n = cgraph->nodes[node_idx + i]; + std::cerr << node_idx + i << " " << ggml_op_name(n->op) << " " << n->name; + if (n->op == GGML_OP_GLU) { + std::cerr << " " << ggml_glu_op_name(ggml_get_glu_op(n)) << " " << (n->src[1] ? "split" : "single") << " "; + } + std::cerr << std::endl; + } + } +#endif switch (node->op) { case GGML_OP_REPEAT: @@ -11533,7 +11631,11 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_ARGSORT: - ggml_vk_argsort(ctx, compute_ctx, src0, node, dryrun); + if (ctx->num_additional_fused_ops) { + ggml_vk_topk_moe(ctx, compute_ctx, cgraph, node_idx, dryrun); + } else { + ggml_vk_argsort(ctx, compute_ctx, src0, node, dryrun); + } break; case GGML_OP_SUM: @@ -12306,30 +12408,27 @@ static bool ggml_vk_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, st } static bool ggml_vk_can_fuse_topk_moe(ggml_backend_vk_context * ctx, const struct ggml_cgraph * cgraph, - int node_idx, bool with_norm) { + int node_idx, topk_moe_mode mode) { - if (with_norm) { - if (node_idx + (int)topk_moe_norm.size() > cgraph->n_nodes) { - return false; - } - for (size_t i = 0; i < topk_moe_norm.size(); ++i) { - if (cgraph->nodes[node_idx + i]->op != topk_moe_norm[i]) { - return false; - } - } - } else { - if (node_idx + (int)topk_moe.size() > cgraph->n_nodes) { - return false; - } - for (size_t i = 0; i < topk_moe.size(); ++i) { - if (cgraph->nodes[node_idx + i]->op != topk_moe[i]) { - return false; - } - } - } + const ggml_tensor * softmax; + const ggml_tensor * weights; - const ggml_tensor * softmax = cgraph->nodes[node_idx + 0]; - const ggml_tensor * weights = with_norm ? cgraph->nodes[node_idx + 8] : cgraph->nodes[node_idx + 4]; + switch (mode) { + case TOPK_MOE_EARLY_SOFTMAX_NORM: + softmax = cgraph->nodes[node_idx + 0]; + weights = cgraph->nodes[node_idx + 9]; + break; + case TOPK_MOE_EARLY_SOFTMAX: + softmax = cgraph->nodes[node_idx + 0]; + weights = cgraph->nodes[node_idx + 4]; + break; + case TOPK_MOE_LATE_SOFTMAX: + softmax = cgraph->nodes[node_idx + 4]; + weights = cgraph->nodes[node_idx + 5]; + break; + default: + return false; + } const float * op_params = (const float *)softmax->op_params; @@ -12355,60 +12454,6 @@ static bool ggml_vk_can_fuse_topk_moe(ggml_backend_vk_context * ctx, const struc return false; } - // Check that the nodes don't have any unexpected uses - const ggml_tensor * reshape1 = cgraph->nodes[node_idx + 1]; - const ggml_tensor * argsort = cgraph->nodes[node_idx + 2]; - const ggml_tensor * view = cgraph->nodes[node_idx + 3]; - const ggml_tensor * get_rows = cgraph->nodes[node_idx + 4]; - const ggml_tensor * reshape5 = with_norm ? cgraph->nodes[node_idx + 5] : nullptr; - const ggml_tensor * sum_rows = with_norm ? cgraph->nodes[node_idx + 6] : nullptr; - const ggml_tensor * div = with_norm ? cgraph->nodes[node_idx + 7] : nullptr; - const ggml_tensor * reshape8 = with_norm ? cgraph->nodes[node_idx + 8] : nullptr; - - // softmax is used by reshape and argsort - if (ggml_node_get_use_count(cgraph, node_idx) != 2 || - reshape1->src[0] != softmax || - argsort->src[0] != softmax) { - return false; - } - // reshape is used by get_rows - if (ggml_node_get_use_count(cgraph, node_idx + 1) != 1 || - get_rows->src[0] != reshape1) { - return false; - } - // argsort is used by view - if (ggml_node_get_use_count(cgraph, node_idx + 2) != 1 || - view->src[0] != argsort) { - return false; - } - // view is written (via argsort), we can skip checking it - - if (with_norm) { - // get_rows is used by reshape - if (ggml_node_get_use_count(cgraph, node_idx + 4) != 1 || - reshape5->src[0] != get_rows) { - return false; - } - - // reshape is used by sum_rows and div - if (ggml_node_get_use_count(cgraph, node_idx + 5) != 2 || - sum_rows->src[0] != reshape5 || - div->src[0] != reshape5) { - return false; - } - - // sum_rows is used by div - if (ggml_node_get_use_count(cgraph, node_idx + 6) != 1 || - div->src[1] != sum_rows) { - return false; - } - - // div/reshape are written - if (reshape8->src[0] != div) { - return false; - } - } - if (!ctx->device->subgroup_arithmetic || !ctx->device->subgroup_shuffle || !ctx->device->subgroup_require_full_support || @@ -12494,10 +12539,18 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = num_adds - 1; } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { ctx->num_additional_fused_ops = 1; - } else if (ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, true)) { - ctx->num_additional_fused_ops = topk_moe_norm.size() - 1; - } else if (ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, false)) { - ctx->num_additional_fused_ops = topk_moe.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax_norm, { i + 3, i + 9 }) && + ggml_check_edges(cgraph, i, topk_moe_early_softmax_norm_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX_NORM)) { + ctx->num_additional_fused_ops = topk_moe_early_softmax_norm.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax, { i + 3, i + 4 }) && + ggml_check_edges(cgraph, i, topk_moe_early_softmax_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX)) { + ctx->num_additional_fused_ops = topk_moe_early_softmax.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_late_softmax, { i + 1, i + 5 }) && + ggml_check_edges(cgraph, i, topk_moe_late_softmax_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_LATE_SOFTMAX)) { + ctx->num_additional_fused_ops = topk_moe_late_softmax.size() - 1; } } ggml_vk_build_graph(ctx, cgraph, i, nullptr, 0, true, false, false, false); @@ -12595,10 +12648,18 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = num_adds - 1; } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { ctx->num_additional_fused_ops = 1; - } else if (ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, true)) { - ctx->num_additional_fused_ops = topk_moe_norm.size() - 1; - } else if (ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, false)) { - ctx->num_additional_fused_ops = topk_moe.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax_norm, { i + 3, i + 9 }) && + ggml_check_edges(cgraph, i, topk_moe_early_softmax_norm_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX_NORM)) { + ctx->num_additional_fused_ops = topk_moe_early_softmax_norm.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax, { i + 3, i + 4 }) && + ggml_check_edges(cgraph, i, topk_moe_early_softmax_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX)) { + ctx->num_additional_fused_ops = topk_moe_early_softmax.size() - 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_late_softmax, { i + 1, i + 5 }) && + ggml_check_edges(cgraph, i, topk_moe_late_softmax_edges) && + ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_LATE_SOFTMAX)) { + ctx->num_additional_fused_ops = topk_moe_late_softmax.size() - 1; } } @@ -12730,25 +12791,44 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * while (first_unused < graph->n_nodes) { std::vector current_set; - // Avoid reordering topk_moe_norm - if (first_unused + (int)topk_moe_norm.size() <= graph->n_nodes) { - bool is_topk_moe_norm = true; - for (size_t j = 0; j < topk_moe_norm.size(); ++j) { - if (graph->nodes[first_unused + j]->op != topk_moe_norm[j] || used[first_unused + j]) { - is_topk_moe_norm = false; + // Check for fusion patterns and avoid reordering them + auto const &match_pattern = [&](const std::initializer_list &pattern, int start) -> bool { + if (start + (int)pattern.size() <= graph->n_nodes) { + bool is_pattern = true; + for (size_t j = 0; j < pattern.size(); ++j) { + if (graph->nodes[start + j]->op != pattern.begin()[j] || used[start + j]) { + is_pattern = false; + } } + return is_pattern; } - if (is_topk_moe_norm) { - for (size_t j = 0; j < topk_moe_norm.size(); ++j) { + return false; + }; + + auto const &keep_pattern = [&](const std::initializer_list &pattern) -> bool { + if (match_pattern(pattern, first_unused)) { + for (size_t j = 0; j < pattern.size(); ++j) { new_order.push_back(graph->nodes[first_unused + j]); used[first_unused + j] = true; } while (first_unused < graph->n_nodes && used[first_unused]) { first_unused++; } - continue; + return true; } + return false; + }; + + if (keep_pattern(topk_moe_early_softmax_norm)) { + continue; + } + if (keep_pattern(topk_moe_early_softmax)) { + continue; } + if (keep_pattern(topk_moe_late_softmax)) { + continue; + } + // First, grab the next unused node. current_set.push_back(first_unused); @@ -12766,6 +12846,12 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * if (is_empty(graph->nodes[j])) { continue; } + // Don't pull forward nodes from fusion patterns + if (match_pattern(topk_moe_early_softmax_norm, j) || + match_pattern(topk_moe_early_softmax, j) || + match_pattern(topk_moe_late_softmax, j)) { + continue; + } bool ok = true; for (int c = first_unused; c < j; ++c) { if (!used[c] && diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp b/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp index 9e56d5f8a3c..bc1c278bf49 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/topk_moe.comp @@ -11,6 +11,8 @@ layout (push_constant) uniform parameter { uint n_rows; uint n_expert_used; + float clamp_min; + float clamp_max; }; layout(local_size_x_id = 0, local_size_y = 4, local_size_z = 1) in; @@ -18,6 +20,7 @@ layout(local_size_x_id = 0, local_size_y = 4, local_size_z = 1) in; layout(constant_id = 0) const uint WARP_SIZE = 32; layout(constant_id = 1) const uint n_experts = 512; layout(constant_id = 2) const bool with_norm = true; +layout(constant_id = 3) const bool late_softmax = false; const uint experts_per_thread = (n_experts > WARP_SIZE) ? n_experts / WARP_SIZE : 1; @@ -25,53 +28,72 @@ layout (binding = 0, std430) readonly buffer Logits {float logits[];}; layout (binding = 1, std430) writeonly buffer Weights {float weights[];}; layout (binding = 2, std430) writeonly buffer Ids {uint ids[];}; -void main() { - const uint row = gl_WorkGroupID.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y; - if (row >= n_rows) { - return; - } +const float INFINITY = 1.0 / 0.0; - const uint logits_offset = n_experts * row; - const uint weights_offset = n_expert_used * row; - const uint ids_offset = n_experts * row; - - float logits_r[experts_per_thread]; - - const float INFINITY = 1.0 / 0.0; +// Warp-local softmax used for both the pre-top-k logits and the post-top-k delayed path. +void softmax_warp_inplace(inout float vals[experts_per_thread], const uint limit, const uint lane, const bool use_limit) { + float max_val = -INFINITY; [[unroll]] - for (uint i = 0; i < n_experts; i += WARP_SIZE) { - const uint expert = i + gl_LocalInvocationID.x; - logits_r[i / WARP_SIZE] = n_experts % WARP_SIZE == 0 || expert < n_experts ? logits[logits_offset + expert] : -INFINITY; + for (int i = 0; i < experts_per_thread; i++) { + const uint idx = lane + i * WARP_SIZE; + const bool is_active = !use_limit || (idx < limit); + if (is_active) { + max_val = max(max_val, vals[i]); + } } - float max_val = logits_r[0]; + max_val = subgroupMax(max_val); + + float sum = 0.f; [[unroll]] - for (int i = 1; i < experts_per_thread; i++) { - const float val = logits_r[i]; - max_val = max(val, max_val); + for (int i = 0; i < experts_per_thread; i++) { + const uint idx = lane + i * WARP_SIZE; + const bool is_active = !use_limit || (idx < limit); + if (is_active) { + const float val = exp(vals[i] - max_val); + vals[i] = val; + sum += val; + } else { + vals[i] = 0.f; + } } - max_val = subgroupMax(max_val); + sum = subgroupAdd(sum); - float wt[experts_per_thread]; - float tmp = 0.f; + const float inv_sum = 1.0f / sum; [[unroll]] for (int i = 0; i < experts_per_thread; i++) { - const float val = logits_r[i]; - wt[i] = exp(val - max_val); - tmp += wt[i]; + const uint idx = lane + i * WARP_SIZE; + const bool is_active = !use_limit || (idx < limit); + if (is_active) { + vals[i] *= inv_sum; + } } +} - tmp = subgroupAdd(tmp); +void main() { + const uint row = gl_WorkGroupID.x * gl_WorkGroupSize.y + gl_LocalInvocationID.y; + if (row >= n_rows) { + return; + } - const float inv_sum = 1.0f / tmp; + const uint logits_offset = n_experts * row; + const uint weights_offset = n_expert_used * row; + const uint ids_offset = n_experts * row; + + float wt[experts_per_thread]; [[unroll]] - for (int i = 0; i < experts_per_thread; i++) { - wt[i] = wt[i] * inv_sum; + for (uint i = 0; i < n_experts; i += WARP_SIZE) { + const uint expert = i + gl_LocalInvocationID.x; + wt[i / WARP_SIZE] = (n_experts % WARP_SIZE == 0 || expert < n_experts) ? logits[logits_offset + expert] : -INFINITY; + } + + if (!late_softmax) { + softmax_warp_inplace(wt, n_experts, gl_LocalInvocationID.x, false); } // at this point, each thread holds a portion of softmax, @@ -82,6 +104,11 @@ void main() { float output_weights[experts_per_thread]; + [[unroll]] + for (int i = 0; i < experts_per_thread; i++) { + output_weights[i] = 0.f; + } + for (int k = 0; k < n_expert_used; k++) { float max_val = wt[0]; uint max_expert = gl_LocalInvocationID.x; @@ -121,6 +148,7 @@ void main() { if (with_norm) { wt_sum = subgroupAdd(wt_sum); + wt_sum = clamp(wt_sum, clamp_min, clamp_max); const float inv_sum = 1.0f / wt_sum; [[unroll]] @@ -129,6 +157,10 @@ void main() { } } + if (late_softmax) { + softmax_warp_inplace(output_weights, n_expert_used, gl_LocalInvocationID.x, true); + } + [[unroll]] for (uint i = 0; i < experts_per_thread; ++i) { uint idx = i * WARP_SIZE + gl_LocalInvocationID.x; From e3af5563bd049141e036b50f843196db33d23e97 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Wed, 29 Oct 2025 18:09:18 +0100 Subject: [PATCH 012/185] llama: store mrope data in KV cell (#16825) * llama: store mrope data in KV cell * correct x,y ordering * address review comments * add consistency checks * Update src/llama-kv-cache.cpp Co-authored-by: Georgi Gerganov * add TODO * fix asan error * kv-cells : improve ext handling * cont : fix headers --------- Co-authored-by: Georgi Gerganov --- src/llama-batch.cpp | 67 ++++++++++++++++++++++++++---------------- src/llama-batch.h | 13 +++++++- src/llama-kv-cache.cpp | 32 ++++++++++++++++++++ src/llama-kv-cells.h | 46 +++++++++++++++++++++++++++-- tools/mtmd/mtmd.cpp | 13 +++++++- tools/mtmd/mtmd.h | 4 +-- 6 files changed, 143 insertions(+), 32 deletions(-) diff --git a/src/llama-batch.cpp b/src/llama-batch.cpp index 55d89eca0ad..6cb118f684e 100644 --- a/src/llama-batch.cpp +++ b/src/llama-batch.cpp @@ -215,6 +215,7 @@ bool llama_batch_allocr::init( /*.n_seq_tokens =*/ (uint32_t) 1, /*.n_seqs =*/ (uint32_t) batch.n_tokens, /*.n_seqs_unq =*/ (uint32_t) this->seq_id_unq.size(), + /*.n_pos =*/ n_pos_per_embd, /*.token =*/ batch.token, /*.embd =*/ batch.embd, /*.pos =*/ batch.pos, @@ -251,46 +252,58 @@ bool llama_batch_allocr::init( // consistency checks // - for (uint32_t s = 0; s < n_seq_max; ++s) { - if (seq_pos[s].empty()) { - continue; + if (n_pos_per_embd > 1) { + // M-RoPE case: allow position to "jump" forward only (non-continuous positions are allowed) + for (uint32_t s = 0; s < n_seq_max; ++s) { + if (seq_pos[s].empty()) { + continue; + } + + const llama_pos p0 = memory ? memory->seq_pos_max(s) : -1; + + if (p0 >= 0 && p0 >= seq_pos_min(s)) { + LLAMA_LOG_ERROR( + "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" + " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" + " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" + " for M-RoPE, it is required that the position satisfies: X < Y\n", + __func__, s, s, p0, s, seq_pos_min(s)); + + return false; + } } + } else { + for (uint32_t s = 0; s < n_seq_max; ++s) { + if (seq_pos[s].empty()) { + continue; + } - const llama_pos p0 = memory ? memory->seq_pos_max(s) : -1; + const llama_pos p0 = memory ? memory->seq_pos_max(s) : -1; - if (p0 >= 0) { - bool ok = true; + if (p0 >= 0) { + bool ok = true; - if (batch.token) { if (seq_pos_min(s) != p0 + 1) { ok = false; } - } else { - assert(batch.embd); - // for embeddings (typically used as vision input), we allow them to have repeating positions - // ref: https://github.com/ggml-org/llama.cpp/issues/13694#issuecomment-2983871762 - if (seq_pos_min(s) != p0 && seq_pos_min(s) != p0 + 1) { - ok = false; + if (!ok) { + LLAMA_LOG_ERROR( + "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" + " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" + " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" + " it is required that the sequence positions remain consecutive: Y = X + 1\n", + __func__, s, s, p0, s, seq_pos_min(s)); + + return false; } } - if (!ok) { - LLAMA_LOG_ERROR( - "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" - " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" - " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" - " it is required that the sequence positions remain consecutive: Y = X + 1\n", - __func__, s, s, p0, s, seq_pos_min(s)); - + if (seq_pos_max(s) - seq_pos_min(s) + 1 > (int) seq_pos[s].size()) { + LLAMA_LOG_ERROR("%s: sequence %d positions are not continuous\n", __func__, s); return false; } } - - if (seq_pos_max(s) - seq_pos_min(s) + 1 > (int) seq_pos[s].size()) { - LLAMA_LOG_ERROR("%s: sequence %d positions are not continuous\n", __func__, s); - return false; - } } if (memory) { @@ -389,6 +402,7 @@ llama_ubatch llama_batch_allocr::ubatch_reserve(uint32_t n_seq_tokens, uint32_t /*.n_seq_tokens =*/ n_seq_tokens, /*.n_seqs =*/ n_seqs, /*.n_seqs_unq =*/ n_seqs, + /*.n_pos =*/ n_pos_per_embd, /*.token =*/ udata->token.data(), /*.embd =*/ nullptr, @@ -710,6 +724,7 @@ llama_ubatch llama_batch_allocr::ubatch_add(const std::vector & idxs, u /*.n_seq_tokens =*/ n_tokens/n_seqs, /*.n_seqs =*/ n_seqs, /*.n_seqs_unq =*/ (uint32_t) udata->seq_id_unq.size(), + /*.n_pos =*/ n_pos_per_embd, /*.token =*/ batch.token ? udata->token.data() : nullptr, /*.embd =*/ batch.embd ? udata->embd.data() : nullptr, diff --git a/src/llama-batch.h b/src/llama-batch.h index 0dc8cebd2a7..209cf3699de 100644 --- a/src/llama-batch.h +++ b/src/llama-batch.h @@ -17,6 +17,16 @@ struct llama_ubatch { return b_equal_seqs != 0; } + // typical for M-RoPE cases: + // 0 - sequantial position of the tokens/embeddings in the sequence + // 1 - y position in the image + // 2 - x position in the image + // 3 - other + bool is_pos_2d() const { + // TODO @ngxson : we may need to check for model arch when more models use >1 positions + return n_pos >= 3; + } + uint32_t b_equal_seqs; // note: this is a boolean, but we use an int32_t for alignment // otherwise address sanitizer complains // TODO: whole_seqs for embeddings? @@ -25,6 +35,7 @@ struct llama_ubatch { uint32_t n_seq_tokens; // tokens per sequence set uint32_t n_seqs; // sequence sets in the ubatch uint32_t n_seqs_unq; // unique sequence ids in the ubatch + uint32_t n_pos; // number of position inputs for each token/embedding // seq_id_unq: unique sequence ids in the ubatch // seq_idx: indices of the unique sequence ids in the ubatch in [0, n_seqs_unq) @@ -33,7 +44,7 @@ struct llama_ubatch { // // size | idx | val llama_token * token; // [n_tokens] | i | id, token float * embd; // [n_embd, n_tokens] | i | embd - llama_pos * pos; // [n_tokens] | i | pos + llama_pos * pos; // [n_tokens*n_pos] | i | pos int32_t * n_seq_id; // [n_tokens] | i | - llama_seq_id ** seq_id; // [n_tokens] | s | s0, s1, seq_id llama_seq_id * seq_id_unq; // [n_seqs_unq] | s | seq_id diff --git a/src/llama-kv-cache.cpp b/src/llama-kv-cache.cpp index 6d5dd6051e7..17627b6ccbb 100644 --- a/src/llama-kv-cache.cpp +++ b/src/llama-kv-cache.cpp @@ -338,6 +338,8 @@ void llama_kv_cache::seq_cp(llama_seq_id seq_id_src, llama_seq_id seq_id_dst, ll llama_pos pos = v_cells[s0].pos_get(i); llama_pos shift = v_cells[s0].get_shift(i); + llama_kv_cell_ext ext = v_cells[s0].ext_get(i); + if (shift != 0) { pos -= shift; assert(pos >= 0); @@ -349,6 +351,8 @@ void llama_kv_cache::seq_cp(llama_seq_id seq_id_src, llama_seq_id seq_id_dst, ll if (shift != 0) { v_cells[s1].pos_add(i, shift); } + + v_cells[s1].ext_set(i, ext); } } @@ -383,6 +387,7 @@ void llama_kv_cache::seq_keep(llama_seq_id seq_id) { void llama_kv_cache::seq_add(llama_seq_id seq_id, llama_pos p0, llama_pos p1, llama_pos shift) { GGML_ASSERT(seq_id >= 0 && (size_t) seq_id < seq_to_stream.size()); + GGML_ASSERT(hparams.n_pos_per_embd() == 1 && "seq_add() is only supported for n_pos_per_embd() == 1"); auto & cells = v_cells[seq_to_stream[seq_id]]; auto & head = v_heads[seq_to_stream[seq_id]]; @@ -427,6 +432,7 @@ void llama_kv_cache::seq_add(llama_seq_id seq_id, llama_pos p0, llama_pos p1, ll void llama_kv_cache::seq_div(llama_seq_id seq_id, llama_pos p0, llama_pos p1, int d) { GGML_ASSERT(seq_id >= 0 && (size_t) seq_id < seq_to_stream.size()); + GGML_ASSERT(hparams.n_pos_per_embd() == 1 && "seq_div() is only supported for n_pos_per_embd() == 1"); auto & cells = v_cells[seq_to_stream[seq_id]]; @@ -900,6 +906,14 @@ void llama_kv_cache::apply_ubatch(const slot_info & sinfo, const llama_ubatch & cells.pos_set(idx, ubatch.pos[i]); + if (ubatch.is_pos_2d()) { + llama_kv_cell_ext ext { + /*.x =*/ ubatch.pos[i + ubatch.n_tokens*2], + /*.y =*/ ubatch.pos[i + ubatch.n_tokens], + }; + cells.ext_set(idx, ext); + } + for (int32_t s = 0; s < ubatch.n_seq_id[i]; s++) { cells.seq_add(idx, ubatch.seq_id[i][s]); } @@ -1247,6 +1261,11 @@ void llama_kv_cache::set_input_kq_mask(ggml_tensor * dst, const llama_ubatch * u const llama_pos p1 = ubatch->pos[i]; + // for M-RoPE + const bool is_2d = ubatch->is_pos_2d(); + const llama_pos p1_x = is_2d ? ubatch->pos[i + ubatch->n_tokens*2] : 0; + const llama_pos p1_y = is_2d ? ubatch->pos[i + ubatch->n_tokens] : 0; + const uint64_t idst = n_kv*(h*n_stream*n_tps_pad + s*n_tps_pad + ii); for (uint32_t j = 0; j < n_kv; ++j) { @@ -1266,6 +1285,14 @@ void llama_kv_cache::set_input_kq_mask(ggml_tensor * dst, const llama_ubatch * u continue; } + // M-RoPE causal mask + if (causal_attn && is_2d && p0 == p1) { + const auto & p0_ext = cells.ext_get(j); + if (p0_ext.is_2d_gt(p1_x, p1_y)) { + continue; + } + } + // apply SWA if any if (is_masked_swa(p0, p1)) { continue; @@ -1559,6 +1586,9 @@ void llama_kv_cache::state_write_meta(llama_io_write_i & io, const cell_ranges_t io.write(&pos, sizeof(pos)); io.write(&n_seq_id, sizeof(n_seq_id)); + // TODO: we also need to save llama_kv_cell_ext when apply_ubatch() support loading it + // see: https://github.com/ggml-org/llama.cpp/pull/16825#issuecomment-3460868350 + for (const auto & seq_id : seq_ids) { io.write(&seq_id, sizeof(seq_id)); } @@ -1704,6 +1734,8 @@ bool llama_kv_cache::state_read_meta(llama_io_read_i & io, uint32_t strm, uint32 return false; } + // TODO: we cannot yet restore llama_kv_cell_ext as the apply_ubatch() does not support it yet + // see: https://github.com/ggml-org/llama.cpp/pull/16825#issuecomment-3460868350 apply_ubatch(sinfo, ubatch); const auto head_cur = sinfo.head(); diff --git a/src/llama-kv-cells.h b/src/llama-kv-cells.h index 8f6bf01456c..10063bf4272 100644 --- a/src/llama-kv-cells.h +++ b/src/llama-kv-cells.h @@ -5,9 +5,27 @@ #include #include -#include -#include +#include #include +#include +#include + +struct llama_kv_cell_ext { + // 2D spatial positions, typically used for M-RoPE + llama_pos x = 0; + llama_pos y = 0; + + // return true if the current 2D spatial position is greater than other + bool is_2d_gt(llama_pos ox, llama_pos oy) const { + return (y > oy) || (y == oy && x > ox); + } + + void reset() { + static_assert(std::is_trivially_copyable_v); + + memset(this, 0, sizeof(*this)); + } +}; // meta information about KV cells that can be part of multiple sequences at the same time // TODO: add unit tests @@ -16,6 +34,7 @@ class llama_kv_cells { void reset() { for (uint32_t i = 0; i < pos.size(); ++i) { pos[i] = -1; + ext[i].reset(); shift[i] = 0; seq[i].reset(); } @@ -43,6 +62,7 @@ class llama_kv_cells { void resize(uint32_t n) { pos.resize(n); + ext.resize(n); shift.resize(n); seq.resize(n); @@ -108,6 +128,7 @@ class llama_kv_cells { const auto idx = i + j; res.pos[j] = pos[idx]; + res.ext[j] = ext[idx]; res.seq[j] = seq[idx]; assert(shift[idx] == 0); @@ -126,6 +147,7 @@ class llama_kv_cells { const auto idx = idxs[j]; res.pos[j] = pos[idx]; + res.ext[j] = ext[idx]; res.seq[j] = seq[idx]; assert(shift[idx] == 0); @@ -154,6 +176,7 @@ class llama_kv_cells { } pos[idx] = other.pos[j]; + ext[idx] = other.ext[j]; seq[idx] = other.seq[j]; if (pos[idx] != -1) { @@ -184,6 +207,7 @@ class llama_kv_cells { } pos[idx] = other.pos[j]; + ext[idx] = other.ext[j]; seq[idx] = other.seq[j]; if (pos[idx] != -1) { @@ -203,6 +227,7 @@ class llama_kv_cells { seq[i].reset(); pos[i] = -1; + ext[i].reset(); shift[i] = 0; used.erase(i); @@ -221,6 +246,7 @@ class llama_kv_cells { if (seq[i].none()) { pos[i] = -1; + ext[i].reset(); shift[i] = 0; used.erase(i); @@ -250,6 +276,7 @@ class llama_kv_cells { seq[i].reset(); pos[i] = -1; + ext[i].reset(); shift[i] = 0; used.erase(i); @@ -340,6 +367,13 @@ class llama_kv_cells { return pos[i]; } + const llama_kv_cell_ext & ext_get(uint32_t i) const { + assert(i < pos.size()); + assert(pos[i] != -1); + + return ext[i]; + } + // note: call only if the cell is not empty llama_pos get_shift(uint32_t i) const { assert(i < pos.size()); @@ -368,6 +402,11 @@ class llama_kv_cells { used.insert(i); } + void ext_set(uint32_t i, llama_kv_cell_ext p) { + assert(i < ext.size()); + ext[i] = p; + } + // pos[i] = pos[i] + d // sets "has_shift" to true // note: call only if the cell is not empty @@ -424,6 +463,9 @@ class llama_kv_cells { std::vector pos; + // stores extra info per cell + std::vector ext; + // this array accumulates any applied shifts to the pos array since the last reset_shift() call // this is used to queue multiple updates to the pos array, which in the end can be applied in one go: // diff --git a/tools/mtmd/mtmd.cpp b/tools/mtmd/mtmd.cpp index 3b901bfac82..1a48f903efa 100644 --- a/tools/mtmd/mtmd.cpp +++ b/tools/mtmd/mtmd.cpp @@ -5,6 +5,15 @@ #include "llama.h" +// fix problem with std::min and std::max +#if defined(_WIN32) +#define WIN32_LEAN_AND_MEAN +#ifndef NOMINMAX +# define NOMINMAX +#endif +#include +#endif + #include #include #include @@ -1031,7 +1040,9 @@ const char * mtmd_image_tokens_get_id(const mtmd_image_tokens * image_tokens) { llama_pos mtmd_image_tokens_get_n_pos(const mtmd_image_tokens * image_tokens) { if (image_tokens->use_mrope_pos) { - return 1; // for M-RoPE, the whole image is 1 in temporal dimension + // for M-RoPE, temporal dimension = max(t,h,w) + // t is omitted as we don't support video input + return std::max(image_tokens->nx, image_tokens->ny); } return image_tokens->n_tokens(); } diff --git a/tools/mtmd/mtmd.h b/tools/mtmd/mtmd.h index f4ea07d3ad5..0b5d2ba0c76 100644 --- a/tools/mtmd/mtmd.h +++ b/tools/mtmd/mtmd.h @@ -153,7 +153,7 @@ MTMD_API const mtmd_image_tokens * mtmd_input_chunk_get_tokens_image(const mtmd MTMD_API size_t mtmd_input_chunk_get_n_tokens (const mtmd_input_chunk * chunk); // returns nullptr for ID on text chunk MTMD_API const char * mtmd_input_chunk_get_id (const mtmd_input_chunk * chunk); -// number of temporal positions (always 1 for M-RoPE, n_tokens otherwise) +// number of temporal positions (equals to max(t,h,w) for M-RoPE; equals to n_tokens otherwise) MTMD_API llama_pos mtmd_input_chunk_get_n_pos (const mtmd_input_chunk * chunk); // in case you want to use custom logic to handle the chunk (i.e. KV cache management) @@ -171,7 +171,7 @@ MTMD_API size_t mtmd_image_tokens_get_n_tokens(const mtmd_image_tokens * i MTMD_API size_t mtmd_image_tokens_get_nx (const mtmd_image_tokens * image_tokens); MTMD_API size_t mtmd_image_tokens_get_ny (const mtmd_image_tokens * image_tokens); MTMD_API const char * mtmd_image_tokens_get_id (const mtmd_image_tokens * image_tokens); // TODO: deprecate -// number of temporal positions (always 1 for M-RoPE, n_tokens otherwise) +// number of temporal positions (equals to max(t,h,w) for M-RoPE; equals to n_tokens otherwise) MTMD_API llama_pos mtmd_image_tokens_get_n_pos (const mtmd_image_tokens * image_tokens); // TODO: deprecate // tokenize an input text prompt and a list of bitmaps (images/audio) From 3464bdac37027c5e9661621fc75ffcef3c19c6ef Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Wed, 29 Oct 2025 20:11:39 +0100 Subject: [PATCH 013/185] llama: fix ASAN error with M-RoPE (#16848) --- src/llama-batch.cpp | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/llama-batch.cpp b/src/llama-batch.cpp index 6cb118f684e..0d4939fdb01 100644 --- a/src/llama-batch.cpp +++ b/src/llama-batch.cpp @@ -669,10 +669,8 @@ llama_ubatch llama_batch_allocr::ubatch_add(const std::vector & idxs, u auto udata = std::make_shared(); - const int32_t n_pos_cur = batch.embd ? n_pos_per_embd : 1; - const int64_t n_embd_all = batch.embd ? (int64_t) n_tokens*n_embd : 0; - const int64_t n_pos_all = (int64_t) n_tokens*n_pos_cur; + const int64_t n_pos_all = (int64_t) n_tokens*n_pos_per_embd; udata->token .resize(n_tokens); udata->embd .resize(n_embd_all); @@ -694,8 +692,13 @@ llama_ubatch llama_batch_allocr::ubatch_add(const std::vector & idxs, u memcpy(udata->embd.data() + i*n_embd, batch.embd + (int64_t) idxs[i]*n_embd, n_embd*sizeof(float)); } - for (int j = 0; j < n_pos_cur; ++j) { - udata->pos[j*n_tokens + i] = batch.pos[j*batch.n_tokens + idxs[i]]; + for (size_t j = 0; j < (size_t)n_pos_per_embd; ++j) { + // if we are using M-RoPE + // if the current batch is text, we need to broadcast the same position across all RoPE sections + // otherwise, the input batch is image embeddings, we copy the positions as-is + // if we are not using M-RoPE, there is only one position per token (this loop runs only once) + size_t src_off = batch.token ? 0 : j*batch.n_tokens; + udata->pos[j*n_tokens + i] = batch.pos[src_off + idxs[i]]; } udata->n_seq_id[i] = batch.n_seq_id[idxs[i]]; From b9ce94017729465895402cbcfffb51fa926c15e3 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Wed, 29 Oct 2025 15:13:10 -0500 Subject: [PATCH 014/185] vulkan: Fuse rope+set_rows (#16769) This pattern appears in a lot of models, the rope operation is applied right before storing into the KV cache (usually on the K tensor). Add a path to some of the rope shaders that computes the destination address based on the set_rows tensor. Compile variants of the shader with D_TYPE of f16 (the usual KV cache type). Add a src3 operand to ggml_vk_op_f32 - sometimes rope uses three srcs and needs the fourth for the row indices. Add fused_ops_write_mask to indicate which intermediate tensors need to write their results to memory. Skipping writing the roped K value helps to allow more nodes to run concurrently. Add logic to ggml_vk_graph_optimize to make ROPE+VIEW+SET_ROWS consecutive. It rarely starts out that way in the graph. Add new backend tests. --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 334 +++++++++++++----- .../ggml-vulkan/vulkan-shaders/rope_head.glsl | 2 + .../ggml-vulkan/vulkan-shaders/rope_neox.comp | 13 +- .../ggml-vulkan/vulkan-shaders/rope_norm.comp | 13 +- .../vulkan-shaders/vulkan-shaders-gen.cpp | 4 + tests/test-backend-ops.cpp | 122 +++++-- 6 files changed, 371 insertions(+), 117 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 50e7922dc60..8a9f5980ea8 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -456,6 +456,11 @@ static topk_moe_mode ggml_vk_num_additional_ops_to_topk_moe_mode(uint32_t num) { return mode; } +static constexpr std::initializer_list> rope_view_set_rows_edges { + { 1, 0, 0 }, // view->src[0] == rope + { 2, 0, 1 }, // set_rows->src[0] == view +}; + struct vk_device_struct { std::recursive_mutex mutex; @@ -638,8 +643,8 @@ struct vk_device_struct { vk_pipeline pipeline_soft_max_f32, pipeline_soft_max_f32_f16; vk_pipeline pipeline_soft_max_f32_wg512, pipeline_soft_max_f32_f16_wg512; vk_pipeline pipeline_soft_max_back_f32; - vk_pipeline pipeline_rope_norm_f32, pipeline_rope_norm_f16; - vk_pipeline pipeline_rope_neox_f32, pipeline_rope_neox_f16; + vk_pipeline pipeline_rope_norm_f32, pipeline_rope_norm_f16, pipeline_rope_norm_f32_f16; + vk_pipeline pipeline_rope_neox_f32, pipeline_rope_neox_f16, pipeline_rope_neox_f32_f16; vk_pipeline pipeline_rope_multi_f32, pipeline_rope_multi_f16; vk_pipeline pipeline_rope_vision_f32, pipeline_rope_vision_f16; vk_pipeline pipeline_argsort_f32[num_argsort_pipelines]; @@ -1052,6 +1057,7 @@ struct vk_op_rope_push_constants { uint32_t s2; int32_t sections[4]; uint32_t is_back; + uint32_t set_rows_stride; }; struct vk_op_soft_max_push_constants { @@ -1562,6 +1568,10 @@ struct ggml_backend_vk_context { // number of additional consecutive nodes that are being fused with the // node currently being processed int num_additional_fused_ops {}; + // Bitmask of which fused ops need to write an intermediate value to memory. + // Bit 'i' means nodes[start_of_fusion + i] writes to memory. + // If there's no fusion, bit 0 is still set. + int fused_ops_write_mask {}; }; static void * const vk_ptr_base = (void *)(uintptr_t) 0x1000; // NOLINT @@ -3695,21 +3705,27 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_soft_max_f32_f16_wg512, "soft_max_f32_f16_wg512", soft_max_f32_f16_len, soft_max_f32_f16_data, "main", 4, sizeof(vk_op_soft_max_push_constants), {1, 1, 1}, { 512 }, 1); ggml_vk_create_pipeline(device, device->pipeline_soft_max_back_f32, "soft_max_back_f32", soft_max_back_f32_len, soft_max_back_f32_data, "main", 3, sizeof(vk_op_push_constants), {1, 1, 1}, { device->subgroup_size }, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f32, "rope_norm_f32", rope_norm_f32_len, rope_norm_f32_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f32, "rope_neox_f32", rope_neox_f32_len, rope_neox_f32_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f32, "rope_multi_f32", rope_multi_f32_len, rope_multi_f32_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f32, "rope_vision_f32", rope_vision_f32_len, rope_vision_f32_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f32, "rope_norm_f32", rope_norm_f32_len, rope_norm_f32_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f32, "rope_neox_f32", rope_neox_f32_len, rope_neox_f32_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f32, "rope_multi_f32", rope_multi_f32_len, rope_multi_f32_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f32, "rope_vision_f32", rope_vision_f32_len, rope_vision_f32_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); if (device->float_controls_rte_fp16) { - ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f16, "rope_norm_f16", rope_norm_f16_rte_len, rope_norm_f16_rte_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f16, "rope_neox_f16", rope_neox_f16_rte_len, rope_neox_f16_rte_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f16, "rope_multi_f16", rope_multi_f16_rte_len, rope_multi_f16_rte_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f16, "rope_vision_f16", rope_vision_f16_rte_len, rope_vision_f16_rte_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f16, "rope_norm_f16", rope_norm_f16_rte_len, rope_norm_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f16, "rope_neox_f16", rope_neox_f16_rte_len, rope_neox_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f16, "rope_multi_f16", rope_multi_f16_rte_len, rope_multi_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f16, "rope_vision_f16", rope_vision_f16_rte_len, rope_vision_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + + ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f32_f16, "rope_norm_f32_f16", rope_norm_f32_f16_rte_len, rope_norm_f32_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f32_f16, "rope_neox_f32_f16", rope_neox_f32_f16_rte_len, rope_neox_f32_f16_rte_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); } else { - ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f16, "rope_norm_f16", rope_norm_f16_len, rope_norm_f16_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f16, "rope_neox_f16", rope_neox_f16_len, rope_neox_f16_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f16, "rope_multi_f16", rope_multi_f16_len, rope_multi_f16_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); - ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f16, "rope_vision_f16", rope_vision_f16_len, rope_vision_f16_data, "main", 4, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f16, "rope_norm_f16", rope_norm_f16_len, rope_norm_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f16, "rope_neox_f16", rope_neox_f16_len, rope_neox_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_multi_f16, "rope_multi_f16", rope_multi_f16_len, rope_multi_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_vision_f16, "rope_vision_f16", rope_vision_f16_len, rope_vision_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + + ggml_vk_create_pipeline(device, device->pipeline_rope_norm_f32_f16, "rope_norm_f32_f16", rope_norm_f32_f16_len, rope_norm_f32_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_rope_neox_f32_f16, "rope_neox_f32_f16", rope_neox_f32_f16_len, rope_neox_f32_f16_data, "main", 5, sizeof(vk_op_rope_push_constants), {1, 512, 1}, {}, 1); } for (uint32_t i = 0; i < num_argsort_pipelines; ++i) { @@ -8168,7 +8184,8 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const case GGML_OP_ROPE: case GGML_OP_ROPE_BACK: { - const int mode = ((const int32_t *) dst->op_params)[2]; + const ggml_tensor *rope = ctx->num_additional_fused_ops == 2 ? dst->src[0]->src[0] : dst; + const int mode = ((const int32_t *) rope->op_params)[2]; const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; const bool is_vision = mode == GGML_ROPE_TYPE_VISION; @@ -8177,6 +8194,9 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) { return ctx->device->pipeline_rope_neox_f32; } + if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F16) { + return ctx->device->pipeline_rope_neox_f32_f16; + } if (src0->type == GGML_TYPE_F16 && dst->type == GGML_TYPE_F16) { return ctx->device->pipeline_rope_neox_f16; } @@ -8198,6 +8218,9 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F32) { return ctx->device->pipeline_rope_norm_f32; } + if (src0->type == GGML_TYPE_F32 && dst->type == GGML_TYPE_F16) { + return ctx->device->pipeline_rope_norm_f32_f16; + } if (src0->type == GGML_TYPE_F16 && dst->type == GGML_TYPE_F16) { return ctx->device->pipeline_rope_norm_f16; } @@ -8407,20 +8430,22 @@ static uint32_t get_misalign_bytes(ggml_backend_vk_context * ctx, const ggml_ten return ((vk_tensor_offset(t) + t->view_offs) & (ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1));; } -template void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, T &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, T &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { GGML_UNUSED(p); GGML_UNUSED(src0); GGML_UNUSED(src1); GGML_UNUSED(src2); + GGML_UNUSED(src3); GGML_UNUSED(dst); static_assert(!std::is_const::value, "unexpected type"); GGML_ASSERT(!src0 || get_misalign_bytes(ctx, src0) == 0); GGML_ASSERT(!src1 || get_misalign_bytes(ctx, src1) == 0); GGML_ASSERT(!src2 || get_misalign_bytes(ctx, src2) == 0); + GGML_ASSERT(!src3 || get_misalign_bytes(ctx, src3) == 0); GGML_ASSERT(!dst || get_misalign_bytes(ctx, dst) == 0); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_unary_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_unary_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src0) / ggml_type_size(src0->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8428,9 +8453,10 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk GGML_UNUSED(src1); GGML_UNUSED(src2); + GGML_UNUSED(src3); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_sum_rows_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_sum_rows_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src0) / ggml_type_size(src0->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8438,9 +8464,10 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk GGML_UNUSED(src1); GGML_UNUSED(src2); + GGML_UNUSED(src3); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_pad_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_pad_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src0) / ggml_type_size(src0->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8448,9 +8475,10 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk GGML_UNUSED(src1); GGML_UNUSED(src2); + GGML_UNUSED(src3); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_im2col_3d_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_im2col_3d_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src1) / ggml_type_size(src1->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8458,9 +8486,10 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk GGML_UNUSED(src0); GGML_UNUSED(src2); + GGML_UNUSED(src3); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_binary_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_binary_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src0) / ggml_type_size(src0->type); const uint32_t b_offset = get_misalign_bytes(ctx, src1) / ggml_type_size(src1->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8470,9 +8499,10 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk p.misalign_offsets = (a_offset << 16) | (b_offset << 8) | d_offset; GGML_UNUSED(src2); + GGML_UNUSED(src3); } -template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_upscale_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst) { +template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk_op_upscale_push_constants &p, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst) { const uint32_t a_offset = get_misalign_bytes(ctx, src0) / ggml_type_size(src0->type); const uint32_t d_offset = get_misalign_bytes(ctx, dst) / ggml_type_size(dst->type); @@ -8481,10 +8511,11 @@ template <> void init_pushconst_tensor_offsets(ggml_backend_vk_context * ctx, vk GGML_UNUSED(src1); GGML_UNUSED(src2); + GGML_UNUSED(src3); } template -static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst, ggml_op op, PC&& pc, bool dryrun = false) { +static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, const ggml_tensor * src3, ggml_tensor * dst, ggml_op op, PC&& pc, bool dryrun = false) { VK_LOG_DEBUG("ggml_vk_op_f32((" << src0 << ", name=" << src0->name << ", type=" << src0->type << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; if (src1 != nullptr) { std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << src1->type << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; @@ -8492,6 +8523,9 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co if (src2 != nullptr) { std::cerr << "), (" << src2 << ", name=" << src2->name << ", type=" << src2->type << ", ne0=" << src2->ne[0] << ", ne1=" << src2->ne[1] << ", ne2=" << src2->ne[2] << ", ne3=" << src2->ne[3] << ", nb0=" << src2->nb[0] << ", nb1=" << src2->nb[1] << ", nb2=" << src2->nb[2] << ", nb3=" << src2->nb[3]; } + if (src3 != nullptr) { + std::cerr << "), (" << src3 << ", name=" << src3->name << ", type=" << src3->type << ", ne0=" << src3->ne[0] << ", ne1=" << src3->ne[1] << ", ne2=" << src3->ne[2] << ", ne3=" << src3->ne[3] << ", nb0=" << src3->nb[0] << ", nb1=" << src3->nb[1] << ", nb2=" << src3->nb[2] << ", nb3=" << src3->nb[3]; + } std::cerr << "), (" << dst << ", name=" << dst->name << ", type=" << dst->type << ", ne0=" << dst->ne[0] << ", ne1=" << dst->ne[1] << ", ne2=" << dst->ne[2] << ", ne3=" << dst->ne[3] << ", nb0=" << dst->nb[0] << ", nb1=" << dst->nb[1] << ", nb2=" << dst->nb[2] << ", nb3=" << dst->nb[3]; std::cerr << "), " << ggml_op_name(op) << ", " << (dryrun ? "dryrun" : "") << ")"); GGML_ASSERT(op == GGML_OP_GET_ROWS || op == GGML_OP_CPY || (!ggml_is_quantized(src0->type) && (src1 == nullptr || !ggml_is_quantized(src1->type)))); // NOLINT @@ -8518,6 +8552,13 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co const uint64_t ne23 = use_src2 ? src2->ne[3] : 0; const uint64_t ne2 = ne20 * ne21; + const bool use_src3 = src3 != nullptr; + const uint64_t ne30 = use_src3 ? src3->ne[0] : 0; + const uint64_t ne31 = use_src3 ? src3->ne[1] : 0; + const uint64_t ne32 = use_src3 ? src3->ne[2] : 0; + const uint64_t ne33 = use_src3 ? src3->ne[3] : 0; + const uint64_t ne3 = ne30 * ne31; + const uint64_t ned0 = dst->ne[0]; const uint64_t ned1 = dst->ne[1]; const uint64_t ned2 = dst->ne[2]; @@ -8548,6 +8589,7 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co ggml_backend_vk_buffer_context * src0_buf_ctx = (ggml_backend_vk_buffer_context *)src0->buffer->context; ggml_backend_vk_buffer_context * src1_buf_ctx = use_src1 ? (ggml_backend_vk_buffer_context *)src1->buffer->context : nullptr; ggml_backend_vk_buffer_context * src2_buf_ctx = use_src2 ? (ggml_backend_vk_buffer_context *)src2->buffer->context : nullptr; + ggml_backend_vk_buffer_context * src3_buf_ctx = use_src3 ? (ggml_backend_vk_buffer_context *)src3->buffer->context : nullptr; vk_buffer d_X = nullptr; size_t x_buf_offset = 0; @@ -8555,10 +8597,13 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co size_t y_buf_offset = 0; vk_buffer d_Z = nullptr; size_t z_buf_offset = 0; + vk_buffer d_W = nullptr; + size_t w_buf_offset = 0; bool src0_uma = false; bool src1_uma = false; bool src2_uma = false; + bool src3_uma = false; if (ctx->device->uma) { ggml_vk_host_get(ctx->device, src0->data, d_X, x_buf_offset); @@ -8571,6 +8616,10 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co ggml_vk_host_get(ctx->device, src2->data, d_Z, z_buf_offset); src2_uma = d_Z != nullptr; } + if (use_src3) { + ggml_vk_host_get(ctx->device, src3->data, d_W, w_buf_offset); + src3_uma = d_W != nullptr; + } } vk_buffer d_D = dst_buf_ctx->dev_buffer; @@ -8592,11 +8641,17 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co z_buf_offset = vk_tensor_offset(src2) + src2->view_offs; GGML_ASSERT(d_Z != nullptr); } + if (use_src3 && !src3_uma) { + d_W = src3_buf_ctx->dev_buffer; + w_buf_offset = vk_tensor_offset(src3) + src3->view_offs; + GGML_ASSERT(d_W != nullptr); + } // Compute misalignment offset for descriptors and store it in in push constants, then align the descriptor offsets. - init_pushconst_tensor_offsets(ctx, pc, src0, src1, src2, dst); + init_pushconst_tensor_offsets(ctx, pc, src0, src1, src2, src3, dst); x_buf_offset &= ~(ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1); y_buf_offset &= ~(ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1); z_buf_offset &= ~(ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1); + w_buf_offset &= ~(ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1); d_buf_offset &= ~(ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1); std::array elements; @@ -8797,12 +8852,13 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co break; } - uint64_t x_sz, y_sz, z_sz, d_sz; + uint64_t x_sz, y_sz, z_sz, w_sz, d_sz; if (op_supports_incontiguous) { x_sz = ggml_nbytes(src0) + get_misalign_bytes(ctx, src0); y_sz = use_src1 ? ggml_nbytes(src1) + get_misalign_bytes(ctx, src1) : 0; z_sz = use_src2 ? ggml_nbytes(src2) + get_misalign_bytes(ctx, src2) : 0; + w_sz = use_src3 ? ggml_nbytes(src3) + get_misalign_bytes(ctx, src3) : 0; d_sz = ggml_nbytes(dst) + get_misalign_bytes(ctx, dst); if (x_buf_offset + x_sz >= d_X->size) { @@ -8814,6 +8870,9 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co if (use_src2 && z_buf_offset + z_sz >= d_Z->size) { z_sz = ggml_vk_get_max_buffer_range(ctx, d_Z, z_buf_offset); } + if (use_src3 && w_buf_offset + w_sz >= d_W->size) { + w_sz = ggml_vk_get_max_buffer_range(ctx, d_W, w_buf_offset); + } if (d_buf_offset + d_sz >= d_D->size) { d_sz = ggml_vk_get_max_buffer_range(ctx, d_D, d_buf_offset); } @@ -8821,6 +8880,7 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co x_sz = ggml_type_size(src0->type)/ggml_blck_size(src0->type) * ne0 * ne02 * ne03; y_sz = use_src1 ? ggml_type_size(src1->type) * ne1 * ne12 * ne13 : 0; z_sz = use_src2 ? ggml_type_size(src2->type) * ne2 * ne22 * ne23 : 0; + w_sz = use_src3 ? ggml_type_size(src3->type) * ne3 * ne32 * ne33 : 0; d_sz = ggml_type_size(dst->type) * ned * ned2 * ned3; } @@ -8862,14 +8922,19 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, subbuf_y, subbuf_z, vk_subbuffer{ d_D, d_buf_offset, d_sz } }, pc, elements); } else if (op == GGML_OP_ROPE || op == GGML_OP_ROPE_BACK) { // Empty src2 is possible in rope, but the shader needs a buffer - vk_subbuffer subbuf_z; + vk_subbuffer subbuf_z, subbuf_w; if (use_src2) { subbuf_z = { d_Z, z_buf_offset, z_sz }; } else { subbuf_z = { d_X, 0, x_sz }; } + if (use_src3) { + subbuf_w = { d_W, w_buf_offset, w_sz }; + } else { + subbuf_w = { d_X, 0, x_sz }; + } - ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, vk_subbuffer{ d_Y, y_buf_offset, y_sz }, subbuf_z, vk_subbuffer{ d_D, d_buf_offset, d_sz } }, pc, elements); + ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, vk_subbuffer{ d_Y, y_buf_offset, y_sz }, subbuf_z, vk_subbuffer{ d_D, d_buf_offset, d_sz }, subbuf_w }, pc, elements); } else if (op == GGML_OP_IM2COL || op == GGML_OP_IM2COL_3D) { if (ctx->device->shader_int64 && ctx->device->buffer_device_address) { // buffer device address path doesn't use dst buffer @@ -8885,6 +8950,8 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co } else if (op == GGML_OP_OPT_STEP_SGD) { // OPT_STEP_SGD works on src0, it does not need dst ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, vk_subbuffer{ d_Y, y_buf_offset, y_sz }, vk_subbuffer{ d_Z, z_buf_offset, z_sz } }, pc, elements); + } else if (use_src3) { + ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, vk_subbuffer{ d_Y, y_buf_offset, y_sz }, vk_subbuffer{ d_Z, z_buf_offset, z_sz }, vk_subbuffer{ d_W, w_buf_offset, w_sz }, vk_subbuffer{ d_D, d_buf_offset, d_sz } }, pc, elements); } else if (use_src2) { ggml_vk_dispatch_pipeline(ctx, subctx, pipeline, { vk_subbuffer{ d_X, x_buf_offset, x_sz }, vk_subbuffer{ d_Y, y_buf_offset, y_sz }, vk_subbuffer{ d_Z, z_buf_offset, z_sz }, vk_subbuffer{ d_D, d_buf_offset, d_sz } }, pc, elements); } else if (use_src1) { @@ -8899,7 +8966,7 @@ static void ggml_vk_get_rows(ggml_backend_vk_context * ctx, vk_context& subctx, const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_GET_ROWS, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_GET_ROWS, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -8919,7 +8986,7 @@ static void ggml_vk_acc(ggml_backend_vk_context * ctx, vk_context& subctx, const // int nb3 = dst->op_params[2] / 4; // 4 bytes of float32 - unused int offset = dst->op_params[3] / 4; // offset in bytes - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_ACC, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_ACC, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)nb1, (uint32_t)nb2, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9044,7 +9111,7 @@ static void ggml_vk_add(ggml_backend_vk_context * ctx, vk_context& subctx, const const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_ADD, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_ADD, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9059,7 +9126,7 @@ static void ggml_vk_sub(ggml_backend_vk_context * ctx, vk_context& subctx, const const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_SUB, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_SUB, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9074,7 +9141,7 @@ static void ggml_vk_mul(ggml_backend_vk_context * ctx, vk_context& subctx, const const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_MUL, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_MUL, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9089,7 +9156,7 @@ static void ggml_vk_div(ggml_backend_vk_context * ctx, vk_context& subctx, const const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_DIV, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_DIV, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9104,7 +9171,7 @@ static void ggml_vk_add_id(ggml_backend_vk_context * ctx, vk_context& subctx, co const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t src2_type_size = ggml_type_size(src2->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, src2, dst, GGML_OP_ADD_ID, { + ggml_vk_op_f32(ctx, subctx, src0, src1, src2, nullptr, dst, GGML_OP_ADD_ID, { (uint32_t)dst->ne[0], (uint32_t)dst->ne[1], (uint32_t)src0->nb[1] / src0_type_size, @@ -9337,7 +9404,7 @@ static void ggml_vk_ssm_conv(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0 = dst->src[0]; const ggml_tensor * src1 = dst->src[1]; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_SSM_CONV, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_SSM_CONV, { (uint32_t)src0->nb[1], (uint32_t)src0->nb[2], (uint32_t)src1->nb[1], (uint32_t)dst->nb[0], (uint32_t)dst->nb[1], (uint32_t)dst->nb[2], @@ -9455,7 +9522,7 @@ static void ggml_vk_opt_step_adamw(ggml_backend_vk_context * ctx, vk_context& su static void ggml_vk_opt_step_sgd(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst, bool dryrun = false) { const size_t n = ggml_nelements(dst->src[0]); - ggml_vk_op_f32(ctx, subctx, src0, src1, src2, dst, GGML_OP_OPT_STEP_SGD, { (uint32_t)n, 0, 0.0f, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, src2, nullptr, dst, GGML_OP_OPT_STEP_SGD, { (uint32_t)n, 0, 0.0f, 0.0f }, dryrun); } static void ggml_vk_concat(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { @@ -9465,7 +9532,7 @@ static void ggml_vk_concat(ggml_backend_vk_context * ctx, vk_context& subctx, co const uint32_t src1_type_size = ggml_type_size(src1->type); const uint32_t dst_type_size = ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_CONCAT, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_CONCAT, { (uint32_t)ggml_nelements(dst), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9493,7 +9560,7 @@ static void ggml_vk_upscale(ggml_backend_vk_context * ctx, vk_context& subctx, c pixel_offset = 0.0f; } - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_UPSCALE, { + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_UPSCALE, { (uint32_t)ggml_nelements(dst), 0, 0, (uint32_t)ne00, (uint32_t)ne01, (uint32_t)nb00 / src0_type_size, (uint32_t)nb01 / src0_type_size, (uint32_t)nb02 / src0_type_size, (uint32_t)nb03 / src0_type_size, @@ -9507,23 +9574,23 @@ static void ggml_vk_scale(ggml_backend_vk_context * ctx, vk_context& subctx, con p.param1 = ggml_get_op_params_f32(dst, 0); p.param2 = ggml_get_op_params_f32(dst, 1); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SCALE, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SCALE, std::move(p), dryrun); } static void ggml_vk_sqr(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SQR, vk_op_unary_push_constants_init(src0, dst), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SQR, vk_op_unary_push_constants_init(src0, dst), dryrun); } static void ggml_vk_sqrt(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SQRT, vk_op_unary_push_constants_init(src0, dst), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SQRT, vk_op_unary_push_constants_init(src0, dst), dryrun); } static void ggml_vk_sin(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SIN, vk_op_unary_push_constants_init(src0, dst), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SIN, vk_op_unary_push_constants_init(src0, dst), dryrun); } static void ggml_vk_cos(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_COS, vk_op_unary_push_constants_init(src0, dst), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_COS, vk_op_unary_push_constants_init(src0, dst), dryrun); } static void ggml_vk_clamp(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -9531,12 +9598,12 @@ static void ggml_vk_clamp(ggml_backend_vk_context * ctx, vk_context& subctx, con p.param1 = ggml_get_op_params_f32(dst, 0); p.param2 = ggml_get_op_params_f32(dst, 1); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_CLAMP, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_CLAMP, std::move(p), dryrun); } static void ggml_vk_pad(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_pad_push_constants p = vk_op_pad_push_constants_init(src0, dst); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_PAD, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_PAD, std::move(p), dryrun); } static void ggml_vk_roll(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -9551,17 +9618,17 @@ static void ggml_vk_roll(ggml_backend_vk_context * ctx, vk_context& subctx, cons memcpy(&p.param1, &s01_packed, sizeof(float)); memcpy(&p.param2, &s23_packed, sizeof(float)); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_ROLL, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_ROLL, std::move(p), dryrun); } static void ggml_vk_repeat(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_unary_push_constants p = vk_op_unary_push_constants_init(src0, dst, ggml_nelements(dst)); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_REPEAT, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_REPEAT, std::move(p), dryrun); } static void ggml_vk_repeat_back(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_unary_push_constants p = vk_op_unary_push_constants_init(src0, dst, ggml_nelements(dst)); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_REPEAT_BACK, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_REPEAT_BACK, std::move(p), dryrun); } static void ggml_vk_cpy(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -9577,7 +9644,7 @@ static void ggml_vk_cpy(ggml_backend_vk_context * ctx, vk_context& subctx, const } vk_op_unary_push_constants p = vk_op_unary_push_constants_init(src0, dst, ne); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_CPY, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_CPY, std::move(p), dryrun); } static void ggml_vk_set_rows(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { @@ -9592,7 +9659,7 @@ static void ggml_vk_set_rows(ggml_backend_vk_context * ctx, vk_context& subctx, return; } - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_SET_ROWS, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_SET_ROWS, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9603,13 +9670,13 @@ static void ggml_vk_set_rows(ggml_backend_vk_context * ctx, vk_context& subctx, } static void ggml_vk_silu_back(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_SILU_BACK, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_SILU_BACK, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); } static void ggml_vk_norm(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { float * op_params = (float *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_NORM, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_NORM, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); } static void ggml_vk_group_norm(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -9620,7 +9687,7 @@ static void ggml_vk_group_norm(ggml_backend_vk_context * ctx, vk_context& subctx const float eps = float_op_params[1]; const uint32_t group_size = src0->ne[0] * src0->ne[1] * ((src0->ne[2] + num_groups - 1) / num_groups); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_GROUP_NORM, { group_size, 0, eps, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_GROUP_NORM, { group_size, 0, eps, 0.0f }, dryrun); } static uint32_t ggml_vk_rms_num_partials(ggml_backend_vk_context * ctx, const ggml_tensor *node) { @@ -9643,7 +9710,7 @@ static void ggml_vk_rms_norm(ggml_backend_vk_context * ctx, vk_context& subctx, uint32_t param3 = ctx->do_add_rms_partials ? ggml_vk_rms_num_partials(ctx, dst) : 0; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_RMS_NORM, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_RMS_NORM, { (uint32_t)ggml_nelements(src0), (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2],(uint32_t)src0->ne[3], (uint32_t)src0->nb[0] / src0_type_size, (uint32_t)src0->nb[1] / src0_type_size, (uint32_t)src0->nb[2] / src0_type_size, (uint32_t)src0->nb[3] / src0_type_size, (uint32_t)src1->ne[0], (uint32_t)src1->ne[1], (uint32_t)src1->ne[2],(uint32_t)src1->ne[3], (uint32_t)src1->nb[0] / src1_type_size, (uint32_t)src1->nb[1] / src1_type_size, (uint32_t)src1->nb[2] / src1_type_size, (uint32_t)src1->nb[3] / src1_type_size, @@ -9660,16 +9727,16 @@ static void ggml_vk_rms_norm(ggml_backend_vk_context * ctx, vk_context& subctx, static void ggml_vk_rms_norm_back(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { float * op_params = (float *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_RMS_NORM_BACK, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_RMS_NORM_BACK, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); } static void ggml_vk_l2_norm(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { float * op_params = (float *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_L2_NORM, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_L2_NORM, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0], 0.0f }, dryrun); } static void ggml_vk_unary(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_UNARY, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_UNARY, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); } static void ggml_vk_glu(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { @@ -9692,7 +9759,7 @@ static void ggml_vk_glu(ggml_backend_vk_context * ctx, vk_context& subctx, const const uint32_t mode = split ? 2 : (swapped ? 1 : 0); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_GLU, + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_GLU, { (uint32_t)ggml_nelements(dst), (uint32_t)src0->ne[0], @@ -9705,7 +9772,7 @@ static void ggml_vk_glu(ggml_backend_vk_context * ctx, vk_context& subctx, const static void ggml_vk_diag_mask_inf(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { int32_t * op_params = (int32_t *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_DIAG_MASK_INF, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0] }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_DIAG_MASK_INF, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], op_params[0] }, dryrun); } static void ggml_vk_soft_max(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst, bool dryrun = false) { @@ -9730,7 +9797,7 @@ static void ggml_vk_soft_max(ggml_backend_vk_context * ctx, vk_context& subctx, const float m0 = powf(2.0f, -(max_bias ) / n_head_log2); const float m1 = powf(2.0f, -(max_bias / 2.0f) / n_head_log2); - ggml_vk_op_f32(ctx, subctx, src0, src1, src2, dst, GGML_OP_SOFT_MAX, { + ggml_vk_op_f32(ctx, subctx, src0, src1, src2, nullptr, dst, GGML_OP_SOFT_MAX, { ncols, src1 != nullptr ? nrows_y : (uint32_t)0, (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], (uint32_t)src0->ne[2], @@ -9746,7 +9813,7 @@ static void ggml_vk_soft_max(ggml_backend_vk_context * ctx, vk_context& subctx, static void ggml_vk_soft_max_back(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { float * op_params = (float *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_SOFT_MAX_BACK, { (uint32_t)src0->ne[0], (uint32_t)ggml_nrows(src0), op_params[0], op_params[1] }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_SOFT_MAX_BACK, { (uint32_t)src0->ne[0], (uint32_t)ggml_nrows(src0), op_params[0], op_params[1] }, dryrun); } static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { @@ -9837,7 +9904,12 @@ static void ggml_vk_topk_moe(ggml_backend_vk_context * ctx, vk_context& subctx, }, pc, elements); } -static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst, bool backprop, bool dryrun = false) { +static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_cgraph * cgraph, int node_idx, bool backprop, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; + const ggml_tensor * src2 = dst->src[2]; + const ggml_tensor * src3 = nullptr; const int n_dims = ((int32_t *) dst->op_params)[1]; const int mode = ((int32_t *) dst->op_params)[2]; // const int n_ctx = ((int32_t *) dst->op_params)[3]; @@ -9861,11 +9933,20 @@ static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, cons uint32_t s1 = src0->nb[1] / ggml_type_size(src0->type); uint32_t s2 = src0->nb[2] / ggml_type_size(src0->type); - ggml_vk_op_f32(ctx, subctx, src0, src1, src2, dst, GGML_OP_ROPE, { + uint32_t set_rows_stride = 0; + // Fused rope + view + set_rows passes the set_rows destination stride in set_rows_stride + // and overrides the dst and sets src3=row_indices + if (ctx->num_additional_fused_ops > 0) { + set_rows_stride = cgraph->nodes[node_idx + 2]->nb[1] / ggml_type_size(cgraph->nodes[node_idx + 2]->type); + src3 = cgraph->nodes[node_idx + 2]->src[1]; + dst = cgraph->nodes[node_idx + 2]; + } + + ggml_vk_op_f32(ctx, subctx, src0, src1, src2, src3, dst, GGML_OP_ROPE, { (uint32_t)src0->ne[0], (uint32_t)n_dims, freq_scale, (uint32_t)src0->ne[1], freq_base, ext_factor, attn_factor, {corr_dims[0], corr_dims[1]}, theta_scale, src2 != nullptr, (uint32_t)src0->ne[2], s1, s2, - { sections[0], sections[1], sections[2], sections[3] }, backprop + { sections[0], sections[1], sections[2], sections[3] }, backprop, set_rows_stride, }, dryrun); } @@ -9874,7 +9955,7 @@ static void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, c uint32_t ncols = src0->ne[0]; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_ARGSORT, { + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_ARGSORT, { ncols, op_params[0], }, dryrun); @@ -9882,26 +9963,26 @@ static void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, c static void ggml_vk_sum(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_sum_rows_push_constants p = vk_op_sum_rows_push_constants_init(src0, dst, ggml_nelements(src0)); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SUM, p, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SUM, p, dryrun); } static void ggml_vk_sum_rows(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_sum_rows_push_constants p = vk_op_sum_rows_push_constants_init(src0, dst, src0->ne[0]); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_SUM_ROWS, p, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_SUM_ROWS, p, dryrun); } static void ggml_vk_mean(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { vk_op_sum_rows_push_constants p = vk_op_sum_rows_push_constants_init(src0, dst, src0->ne[0]); p.weight = 1.0f / (float)src0->ne[0]; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_MEAN, p, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_MEAN, p, dryrun); } static void ggml_vk_argmax(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_ARGMAX, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], 0.0f, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_ARGMAX, { (uint32_t)src0->ne[0], (uint32_t)src0->ne[1], 0.0f, 0.0f }, dryrun); } static void ggml_vk_count_equal(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_COUNT_EQUAL, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_COUNT_EQUAL, { (uint32_t)ggml_nelements(src0), 0, 0.0f, 0.0f }, dryrun); } static void ggml_vk_im2col(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { @@ -9934,7 +10015,7 @@ static void ggml_vk_im2col(ggml_backend_vk_context * ctx, vk_context& subctx, co const vk::DeviceAddress dst_addr = d_buf->bda_addr + vk_tensor_offset(dst) + dst->view_offs; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_IM2COL, { + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_IM2COL, { dst_addr, batch_offset, offset_delta, IC, IW, IH, OW, OH, KW, KH, @@ -10007,7 +10088,7 @@ static void ggml_vk_im2col_3d(ggml_backend_vk_context * ctx, vk_context& subctx, pc.OH_OW_IC_KD_KH_KW = OH*OW*IC*KD*KH*KW; pc.OW_IC_KD_KH_KW = OW*IC*KD*KH*KW; - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_IM2COL_3D, std::move(pc), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_IM2COL_3D, std::move(pc), dryrun); } static void ggml_vk_timestep_embedding(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -10015,7 +10096,7 @@ static void ggml_vk_timestep_embedding(ggml_backend_vk_context * ctx, vk_context const uint32_t max_period = dst->op_params[1]; const uint32_t nb1 = dst->nb[1] / ggml_type_size(dst->type); - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_TIMESTEP_EMBEDDING, { + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_TIMESTEP_EMBEDDING, { nb1, dim, max_period, }, dryrun); } @@ -10048,7 +10129,7 @@ static void ggml_vk_conv_transpose_1d(ggml_backend_vk_context * ctx, vk_context& p.nb1 = static_cast(nb1 / nb0); p.s0 = static_cast(s0); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_CONV_TRANSPOSE_1D, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_CONV_TRANSPOSE_1D, std::move(p), dryrun); } static void ggml_vk_pool_2d(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { @@ -10071,7 +10152,7 @@ static void ggml_vk_pool_2d(ggml_backend_vk_context * ctx, vk_context& subctx, c const uint32_t parallel_elements = N * OC * OH * OW; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_POOL_2D, { + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_POOL_2D, { IW, IH, OW, OH, OC, parallel_elements, op, @@ -10125,7 +10206,7 @@ static void ggml_vk_conv_2d(ggml_backend_vk_context * ctx, vk_context & subctx, GGML_ASSERT(ne03 == ne2); GGML_ASSERT(ne02 == ne12); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_CONV_2D, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_CONV_2D, std::move(p), dryrun); } static void ggml_vk_conv_transpose_2d(ggml_backend_vk_context * ctx, vk_context & subctx, const ggml_tensor * src0, @@ -10174,7 +10255,7 @@ static void ggml_vk_conv_transpose_2d(ggml_backend_vk_context * ctx, vk_context GGML_ASSERT(ne02 == ne2); GGML_ASSERT(ne03 == ne12); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_CONV_TRANSPOSE_2D, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_CONV_TRANSPOSE_2D, std::move(p), dryrun); } static void ggml_vk_conv_2d_dw(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { @@ -10198,12 +10279,12 @@ static void ggml_vk_conv_2d_dw(ggml_backend_vk_context * ctx, vk_context& subctx GGML_ASSERT(src0->ne[3] == p.channels); GGML_ASSERT(src1->ne[3] == p.batches); - ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, dst, GGML_OP_CONV_2D_DW, std::move(p), dryrun); + ggml_vk_op_f32(ctx, subctx, src0, src1, nullptr, nullptr, dst, GGML_OP_CONV_2D_DW, std::move(p), dryrun); } static void ggml_vk_leaky_relu(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, ggml_tensor * dst, bool dryrun = false) { const float * op_params = (const float *)dst->op_params; - ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, dst, GGML_OP_LEAKY_RELU, { (uint32_t)ggml_nelements(src0), 0, op_params[0], 0.0f }, dryrun); + ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_LEAKY_RELU, { (uint32_t)ggml_nelements(src0), 0, op_params[0], 0.0f }, dryrun); } #ifdef GGML_VULKAN_RUN_TESTS @@ -11329,7 +11410,6 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr case GGML_OP_DIAG_MASK_INF: case GGML_OP_SOFT_MAX: case GGML_OP_SOFT_MAX_BACK: - case GGML_OP_ROPE: case GGML_OP_ROPE_BACK: case GGML_OP_ARGSORT: case GGML_OP_SUM: @@ -11403,9 +11483,12 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr // nodes require synchronization. for (int32_t i = 0; i < ctx->num_additional_fused_ops + 1 && !need_sync; ++i) { const ggml_tensor *cur_node = cgraph->nodes[node_idx + i]; - if (overlaps_unsynced(cur_node, ctx->unsynced_nodes_read) || overlaps_unsynced(cur_node, ctx->unsynced_nodes_written)) { - need_sync = true; - break; + // If the node actually writes to memory, then check if it needs to sync + if (ctx->fused_ops_write_mask & (1 << i)) { + if (overlaps_unsynced(cur_node, ctx->unsynced_nodes_read) || overlaps_unsynced(cur_node, ctx->unsynced_nodes_written)) { + need_sync = true; + break; + } } for (uint32_t j = 0; j < GGML_MAX_SRC; ++j) { if (!cur_node->src[j]) { @@ -11432,7 +11515,9 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr for (int32_t i = 0; i < ctx->num_additional_fused_ops + 1; ++i) { const ggml_tensor *cur_node = cgraph->nodes[node_idx + i]; // Multiple outputs could be written, e.g. in topk_moe. Add them all to the list. - ctx->unsynced_nodes_written.push_back(cur_node); + if (ctx->fused_ops_write_mask & (1 << i)) { + ctx->unsynced_nodes_written.push_back(cur_node); + } for (uint32_t j = 0; j < GGML_MAX_SRC; ++j) { if (!cur_node->src[j]) { continue; @@ -11623,11 +11708,11 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_ROPE: - ggml_vk_rope(ctx, compute_ctx, src0, src1, src2, node, false, dryrun); + ggml_vk_rope(ctx, compute_ctx, cgraph, node_idx, false, dryrun); break; case GGML_OP_ROPE_BACK: - ggml_vk_rope(ctx, compute_ctx, src0, src1, src2, node, true, dryrun); + ggml_vk_rope(ctx, compute_ctx, cgraph, node_idx, true, dryrun); break; case GGML_OP_ARGSORT: @@ -12464,6 +12549,41 @@ static bool ggml_vk_can_fuse_topk_moe(ggml_backend_vk_context * ctx, const struc return true; } +static bool ggml_vk_can_fuse_rope_set_rows(ggml_backend_vk_context * ctx, const struct ggml_cgraph * cgraph, + int node_idx) { + GGML_UNUSED(ctx); + const ggml_tensor *rope = cgraph->nodes[node_idx + 0]; + const ggml_tensor *view = cgraph->nodes[node_idx + 1]; + const ggml_tensor *set_rows = cgraph->nodes[node_idx + 2]; + + // ne3 not tested + if (rope->src[0]->ne[3] != 1) { + return false; + } + + if (set_rows->type != GGML_TYPE_F32 && set_rows->type != GGML_TYPE_F16) { + return false; + } + + if (set_rows->src[1]->type != GGML_TYPE_I64) { + return false; + } + + // The view should flatten two dims of rope into one dim + if (!ggml_is_contiguous(view) || + view->ne[0] != rope->ne[0] * rope->ne[1]) { + return false; + } + + // Only norm/neox shaders have the fusion code + const int mode = ((const int32_t *) rope->op_params)[2]; + if (mode != GGML_ROPE_TYPE_NORMAL && mode != GGML_ROPE_TYPE_NEOX) { + return false; + } + + return true; +} + static uint32_t ggml_vk_fuse_multi_add(ggml_backend_vk_context * ctx, const struct ggml_cgraph * cgraph, int node_idx) { const ggml_tensor *first_node = cgraph->nodes[node_idx]; @@ -12539,6 +12659,10 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = num_adds - 1; } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { ctx->num_additional_fused_ops = 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, { GGML_OP_ROPE, GGML_OP_VIEW, GGML_OP_SET_ROWS }, { i + 2 }) && + ggml_check_edges(cgraph, i, rope_view_set_rows_edges) && + ggml_vk_can_fuse_rope_set_rows(ctx, cgraph, i)) { + ctx->num_additional_fused_ops = 2; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax_norm, { i + 3, i + 9 }) && ggml_check_edges(cgraph, i, topk_moe_early_softmax_norm_edges) && ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX_NORM)) { @@ -12648,20 +12772,31 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg ctx->num_additional_fused_ops = num_adds - 1; } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { ctx->num_additional_fused_ops = 1; + } else if (ggml_can_fuse_subgraph(cgraph, i, { GGML_OP_ROPE, GGML_OP_VIEW, GGML_OP_SET_ROWS }, { i + 2 }) && + ggml_check_edges(cgraph, i, rope_view_set_rows_edges) && + ggml_vk_can_fuse_rope_set_rows(ctx, cgraph, i)) { + ctx->num_additional_fused_ops = 2; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax_norm, { i + 3, i + 9 }) && ggml_check_edges(cgraph, i, topk_moe_early_softmax_norm_edges) && ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX_NORM)) { ctx->num_additional_fused_ops = topk_moe_early_softmax_norm.size() - 1; + // view of argsort writes to memory + ctx->fused_ops_write_mask |= 1 << 3; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_early_softmax, { i + 3, i + 4 }) && ggml_check_edges(cgraph, i, topk_moe_early_softmax_edges) && ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_EARLY_SOFTMAX)) { ctx->num_additional_fused_ops = topk_moe_early_softmax.size() - 1; + // view of argsort writes to memory + ctx->fused_ops_write_mask |= 1 << 3; } else if (ggml_can_fuse_subgraph(cgraph, i, topk_moe_late_softmax, { i + 1, i + 5 }) && ggml_check_edges(cgraph, i, topk_moe_late_softmax_edges) && ggml_vk_can_fuse_topk_moe(ctx, cgraph, i, TOPK_MOE_LATE_SOFTMAX)) { ctx->num_additional_fused_ops = topk_moe_late_softmax.size() - 1; + // view of argsort writes to memory + ctx->fused_ops_write_mask |= 1 << 1; } } + ctx->fused_ops_write_mask |= 1 << ctx->num_additional_fused_ops; // Signal the almost_ready fence when the graph is mostly complete (< 20% remaining) bool almost_ready = (cgraph->n_nodes - i) < cgraph->n_nodes / 5; @@ -12707,6 +12842,7 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg } i += ctx->num_additional_fused_ops; ctx->num_additional_fused_ops = 0; + ctx->fused_ops_write_mask = 0; } if (vk_perf_logger_enabled) { @@ -12863,6 +12999,32 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * } if (ok) { current_set.push_back(j); + // Look for ROPE + VIEW + SET_ROWS and make them consecutive + if (graph->nodes[j]->op == GGML_OP_ROPE) { + int view_idx = -1; + int set_rows_idx = -1; + for (int k = j+1; k < std::min(j + 10, graph->n_nodes); ++k) { + if (view_idx == -1 && + graph->nodes[k]->op == GGML_OP_VIEW && + graph->nodes[k]->src[0] == graph->nodes[j]) { + view_idx = k; + continue; + } + if (view_idx != -1 && + set_rows_idx == -1 && + graph->nodes[k]->op == GGML_OP_SET_ROWS && + graph->nodes[k]->src[0] == graph->nodes[view_idx]) { + set_rows_idx = k; + break; + } + } + if (set_rows_idx != -1) { + current_set.push_back(view_idx); + current_set.push_back(set_rows_idx); + used[view_idx] = true; + used[set_rows_idx] = true; + } + } } } // Second pass grabs view nodes. diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl index 50fc1f1e2d2..0eda186c8a3 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl @@ -10,6 +10,7 @@ layout (binding = 0) readonly buffer X {A_TYPE data_a[];}; layout (binding = 1) readonly buffer Y {int data_pos[];}; layout (binding = 2) readonly buffer Z {float data_ff[];}; layout (binding = 3) writeonly buffer D {D_TYPE data_d[];}; +layout (binding = 4) readonly buffer I {uvec2 data_i[];}; // indices for set_rows layout (push_constant) uniform parameter { uint ncols; @@ -27,6 +28,7 @@ layout (push_constant) uniform parameter { uint s2; int sections[4]; uint is_back; + uint set_rows_stride; } p; float rope_yarn_ramp(const float low, const float high, const uint i0) { diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp index 06e095bef96..9f4538155a0 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_neox.comp @@ -16,12 +16,19 @@ void main() { const uint row_x = row_dst % ne1; const uint channel_x = row_dst / ne1; - const uint idst = row_dst*ne0 + i0/2; + uint idst = row_dst*ne0 + i0/2; const uint ix = channel_x*p.s2 + row_x*p.s1 + i0/2; + // Fusion optimization: ROPE + VIEW + SET_ROWS.. + // The rope output is viewed as a 1D tensor and offset based on a row index in data_i. + if (p.set_rows_stride != 0) { + idst = row_x*ne0 + i0/2; + idst += data_i[channel_x].x * p.set_rows_stride; + } + if (i0 >= p.n_dims) { - data_d[idst + i0/2 + 0] = data_a[ix + i0/2 + 0]; - data_d[idst + i0/2 + 1] = data_a[ix + i0/2 + 1]; + data_d[idst + i0/2 + 0] = D_TYPE(data_a[ix + i0/2 + 0]); + data_d[idst + i0/2 + 1] = D_TYPE(data_a[ix + i0/2 + 1]); return; } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp index 6ba95754090..f4209ed9582 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_norm.comp @@ -16,12 +16,19 @@ void main() { const uint row_x = row_dst % ne1; const uint channel_x = row_dst / ne1; - const uint idst = row_dst*ne0 + i0; + uint idst = row_dst*ne0 + i0; const uint ix = channel_x*p.s2 + row_x*p.s1 + i0; + // Fusion optimization: ROPE + VIEW + SET_ROWS.. + // The rope output is viewed as a 1D tensor and offset based on a row index in data_i. + if (p.set_rows_stride != 0) { + idst = row_x*ne0 + i0; + idst += data_i[channel_x].x * p.set_rows_stride; + } + if (i0 >= p.n_dims) { - data_d[idst + 0] = data_a[ix + 0]; - data_d[idst + 1] = data_a[ix + 1]; + data_d[idst + 0] = D_TYPE(data_a[ix + 0]); + data_d[idst + 1] = D_TYPE(data_a[ix + 1]); return; } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp index 03fa016398c..e6ec589fb84 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp @@ -842,10 +842,14 @@ void process_shaders() { string_to_spv("rope_norm_f32", "rope_norm.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}}); string_to_spv("rope_norm_f16", "rope_norm.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}}); string_to_spv("rope_norm_f16_rte", "rope_norm.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}, {"RTE16", "1"}}); + string_to_spv("rope_norm_f32_f16", "rope_norm.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float16_t"}}); + string_to_spv("rope_norm_f32_f16_rte", "rope_norm.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float16_t"}, {"RTE16", "1"}}); string_to_spv("rope_neox_f32", "rope_neox.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}}); string_to_spv("rope_neox_f16", "rope_neox.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}}); string_to_spv("rope_neox_f16_rte", "rope_neox.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}, {"RTE16", "1"}}); + string_to_spv("rope_neox_f32_f16", "rope_neox.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float16_t"}}); + string_to_spv("rope_neox_f32_f16_rte", "rope_neox.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float16_t"}, {"RTE16", "1"}}); string_to_spv("rope_multi_f32", "rope_multi.comp", {{"A_TYPE", "float"}, {"D_TYPE", "float"}}); string_to_spv("rope_multi_f16", "rope_multi.comp", {{"A_TYPE", "float16_t"}, {"D_TYPE", "float16_t"}}); diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index aee17301379..3139119af7a 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -2125,6 +2125,34 @@ struct test_get_rows_back : public test_case { } }; +static void init_set_rows_row_ids(ggml_tensor * t, int num_rows) { + std::random_device rd; + std::default_random_engine rng(rd()); + for (int i2 = 0; i2 < t->ne[2]; i2++) { + for (int i1 = 0; i1 < t->ne[1]; i1++) { + // generate a shuffled subset of row indices + std::vector data(num_rows); + for (int i = 0; i < num_rows; i++) { + data[i] = i; + } + std::shuffle(data.begin(), data.end(), rng); + data.resize(t->ne[0]); + + const size_t offs = i1*t->nb[1] + i2*t->nb[2]; + if (t->type == GGML_TYPE_I32) { + // TODO: Make a template or something + std::vector data_i32(t->ne[0]); + for (int i = 0; i < t->ne[0]; i++) { + data_i32[i] = static_cast(data[i]); + } + ggml_backend_tensor_set(t, data_i32.data(), offs, t->ne[0]*sizeof(int32_t)); + } else { + ggml_backend_tensor_set(t, data.data(), offs, t->ne[0]*sizeof(int64_t)); + } + } + } +} + // GGML_OP_SET_ROWS struct test_set_rows : public test_case { const ggml_type type; @@ -2168,37 +2196,13 @@ struct test_set_rows : public test_case { } void initialize_tensors(ggml_context * ctx) override { - std::random_device rd; - std::default_random_engine rng(rd()); for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) { if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) { if (ggml_is_view_op(t->op)) { continue; } - for (int i2 = 0; i2 < t->ne[2]; i2++) { - for (int i1 = 0; i1 < t->ne[1]; i1++) { - // generate a shuffled subset of row indices - std::vector data(ne[1]); - for (int i = 0; i < ne[1]; i++) { - data[i] = i; - } - std::shuffle(data.begin(), data.end(), rng); - data.resize(t->ne[0]); - - const size_t offs = i1*t->nb[1] + i2*t->nb[2]; - if (t->type == GGML_TYPE_I32) { - // TODO: Make a template or something - std::vector data_i32(t->ne[0]); - for (int i = 0; i < t->ne[0]; i++) { - data_i32[i] = static_cast(data[i]); - } - ggml_backend_tensor_set(t, data_i32.data(), offs, t->ne[0]*sizeof(int32_t)); - } else { - ggml_backend_tensor_set(t, data.data(), offs, t->ne[0]*sizeof(int64_t)); - } - } - } + init_set_rows_row_ids(t, ne[1]); } else { init_tensor_uniform(t); } @@ -2227,6 +2231,67 @@ struct test_set_rows : public test_case { } }; +// GGML_OP_ROPE + GGML_OP_VIEW + GGML_OP_SET_ROWS +struct test_rope_set_rows : public test_case { + const ggml_type type; + const ggml_type type_idx; + const std::array ne; + int mode; + + std::string vars() override { + return VARS_TO_STR4(type, type_idx, ne, mode); + } + + std::string op_desc(ggml_tensor * t) override { + GGML_UNUSED(t); + return "ROPE_SET_ROWS"; + } + + bool run_whole_graph() override { return true; } + + test_rope_set_rows(ggml_type type, + ggml_type type_idx, + std::array ne, + int mode) + : type(type), type_idx(type_idx), ne(ne), mode(mode) {} + + ggml_tensor * build_graph(ggml_context * ctx) override { + ggml_tensor * src = ggml_new_tensor_4d(ctx, GGML_TYPE_F32, ne[0], ne[1], ne[2], 1); + ggml_set_name(src, "src"); + + ggml_tensor * pos = ggml_new_tensor_1d(ctx, GGML_TYPE_I32, ne[2]); + + ggml_tensor * rope = ggml_rope(ctx, src, pos, ne[0], mode); + + ggml_tensor * view = ggml_view_2d(ctx, rope, ne[0] * ne[1], ne[2], rope->nb[2], 0); + + ggml_tensor * dst = ggml_new_tensor_4d(ctx, type, ne[0] * ne[1], ne[2] * ne[3], 1, 1); + ggml_set_name(dst, "dst"); + + ggml_tensor * row_idxs = ggml_new_tensor_3d(ctx, type_idx, ne[2], 1, 1); + ggml_set_name(row_idxs, "row_idxs"); + + ggml_tensor * out = ggml_set_rows(ctx, dst, view, row_idxs); + ggml_set_name(out, "out"); + + return out; + } + + void initialize_tensors(ggml_context * ctx) override { + for (ggml_tensor * t = ggml_get_first_tensor(ctx); t != NULL; t = ggml_get_next_tensor(ctx, t)) { + if (t->type == GGML_TYPE_I64 || t->type == GGML_TYPE_I32) { + if (ggml_is_view_op(t->op)) { + continue; + } + + init_set_rows_row_ids(t, ne[2]); + } else { + init_tensor_uniform(t); + } + } + } +}; + // GGML_OP_ARGMAX struct test_argmax : public test_case { const ggml_type type; @@ -6163,6 +6228,13 @@ static std::vector> make_test_cases_eval() { } } + for (int mode : { GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX }) { + for (ggml_type type : {GGML_TYPE_F16, GGML_TYPE_F32}) { + test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, 1, 100 }, mode)); + test_cases.emplace_back(new test_rope_set_rows(type, GGML_TYPE_I64, { 128, 32, 512, 1 }, mode)); + } + } + for (ggml_type type_input : {GGML_TYPE_F32}) { for (ggml_op_pool pool_type : {GGML_OP_POOL_AVG, GGML_OP_POOL_MAX}) { for (int k0 : {1, 3}) { From 8b11deea4663f29d3e042ce1056ba643264cd5f1 Mon Sep 17 00:00:00 2001 From: Oliver Simons Date: Thu, 30 Oct 2025 04:34:15 +0100 Subject: [PATCH 015/185] Hide latency of bias and gate-loading (#16847) This is realised by loading them into registers before computation of the dot-product, effectively batching them together with said dot-product. As a lot of threads are alive here, the warp scheduler has enough threads available to effectively hide the cost of additionally loading those two floats. --- ggml/src/ggml-cuda/mmvq.cu | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/ggml/src/ggml-cuda/mmvq.cu b/ggml/src/ggml-cuda/mmvq.cu index be04a85cc55..07645ad9e71 100644 --- a/ggml/src/ggml-cuda/mmvq.cu +++ b/ggml/src/ggml-cuda/mmvq.cu @@ -190,12 +190,28 @@ static __global__ void mul_mat_vec_q( const uint32_t channel_bias = ids ? channel_x : channel_dst; + float x_biases[ncols_dst][rows_per_cuda_block] = { { 0.0f } }; + float gate_biases[ncols_dst][rows_per_cuda_block] = { { 0.0f } }; if constexpr (has_fusion) { if (use_bias) { x_bias = x_bias + sample_dst*stride_sample_dst + channel_bias*stride_channel_dst + row0; + // 1. Hide latency by prefetching bias and gate here + // 2. load only on threads that won't die after partial sum calculation + if (threadIdx.x < rows_per_cuda_block && threadIdx.y == 0 && + (rows_per_cuda_block == 1 || uint32_t(row0 + threadIdx.x) < stride_col_dst)) { + for (int j = 0; j < ncols_dst; ++j) { + x_biases[j][threadIdx.x] = x_bias[j * stride_col_dst + threadIdx.x]; + } + } } if (use_gate_bias) { gate_bias = gate_bias + sample_dst*stride_sample_dst + channel_bias*stride_channel_dst + row0; + if (threadIdx.x < rows_per_cuda_block && threadIdx.y == 0 && + (rows_per_cuda_block == 1 || uint32_t(row0 + threadIdx.x) < stride_col_dst)) { + for (int j = 0; j < ncols_dst; ++j) { + gate_biases[j][threadIdx.x] = gate_bias[j * stride_col_dst + threadIdx.x]; + } + } } } @@ -283,12 +299,12 @@ static __global__ void mul_mat_vec_q( float result = tmp[j][threadIdx.x]; if constexpr (has_fusion) { if (use_bias) { - result += x_bias[j*stride_col_dst + threadIdx.x]; + result += x_biases[j][threadIdx.x]; } if (use_gate) { float gate_value = tmp_gate[j][threadIdx.x]; if (use_gate_bias) { - gate_value += gate_bias[j*stride_col_dst + threadIdx.x]; + gate_value += gate_biases[j][threadIdx.x]; } switch (active_glu) { case GGML_GLU_OP_SWIGLU: From 052df28b0e3ca0398e5928c61c7de40254317894 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Thu, 30 Oct 2025 01:27:41 -0500 Subject: [PATCH 016/185] vulkan: Handle argsort with a large number of rows (#16851) --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 4 ++++ ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp | 16 ++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 8a9f5980ea8..d0976519f26 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -1082,6 +1082,7 @@ struct vk_op_soft_max_push_constants { struct vk_op_argsort_push_constants { uint32_t ncols; + uint32_t nrows; int32_t order; }; @@ -8708,6 +8709,7 @@ static void ggml_vk_op_f32(ggml_backend_vk_context * ctx, vk_context& subctx, co break; case GGML_OP_ARGSORT: elements = { (uint32_t)ne00, (uint32_t)ggml_nrows(src0), 1 }; + elements[1] = std::min(elements[1], ctx->device->properties.limits.maxComputeWorkGroupCount[1]); break; case GGML_OP_IM2COL: { @@ -9954,9 +9956,11 @@ static void ggml_vk_argsort(ggml_backend_vk_context * ctx, vk_context& subctx, c int32_t * op_params = (int32_t *)dst->op_params; uint32_t ncols = src0->ne[0]; + uint32_t nrows = ggml_nrows(src0); ggml_vk_op_f32(ctx, subctx, src0, nullptr, nullptr, nullptr, dst, GGML_OP_ARGSORT, { ncols, + nrows, op_params[0], }, dryrun); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp b/ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp index c81b84452e7..c4e68bc0237 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/argsort.comp @@ -14,6 +14,7 @@ layout (binding = 1) buffer D {int data_d[];}; layout (push_constant) uniform parameter { uint ncols; + uint nrows; uint order; } p; @@ -26,10 +27,9 @@ void swap(uint idx0, uint idx1) { dst_row[idx1] = tmp; } -void argsort(bool needs_bounds_check) { +void argsort(bool needs_bounds_check, const uint row) { // bitonic sort const int col = int(gl_LocalInvocationID.x); - const uint row = gl_WorkGroupID.y; const uint row_offset = row * p.ncols; @@ -72,8 +72,16 @@ void argsort(bool needs_bounds_check) { void main() { if (p.ncols == BLOCK_SIZE) { - argsort(false); + uint row = gl_WorkGroupID.y; + while (row < p.nrows) { + argsort(false, row); + row += gl_WorkGroupSize.y * gl_NumWorkGroups.y; + } } else { - argsort(true); + uint row = gl_WorkGroupID.y; + while (row < p.nrows) { + argsort(true, row); + row += gl_WorkGroupSize.y * gl_NumWorkGroups.y; + } } } From d7395115baf395b75a73a17b0b796e746e468da9 Mon Sep 17 00:00:00 2001 From: Jan Boon Date: Thu, 30 Oct 2025 14:30:58 +0800 Subject: [PATCH 017/185] llama : use std::abs instead of abs (#16853) --- src/llama-graph.cpp | 2 +- src/llama-quant.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/llama-graph.cpp b/src/llama-graph.cpp index 112d195f291..f9751b31836 100644 --- a/src/llama-graph.cpp +++ b/src/llama-graph.cpp @@ -2035,7 +2035,7 @@ int32_t llama_relative_position_bucket(llama_pos x, llama_pos y, uint64_t n_buck if (bidirectional) { relative_bucket += (relative_position > 0) * n_buckets; - relative_position = abs(relative_position); + relative_position = std::abs(relative_position); } else { relative_position = -std::min(relative_position, 0); } diff --git a/src/llama-quant.cpp b/src/llama-quant.cpp index 6dd40412b48..a56b2626ae1 100644 --- a/src/llama-quant.cpp +++ b/src/llama-quant.cpp @@ -653,7 +653,7 @@ static void llama_model_quantize_impl(const std::string & fname_inp, const std:: gguf_set_val_f32(ctx_out.get(), o.key, o.val_f64); } else if (o.tag == LLAMA_KV_OVERRIDE_TYPE_INT) { // Setting type to UINT32. See https://github.com/ggml-org/llama.cpp/pull/14182 for context - gguf_set_val_u32(ctx_out.get(), o.key, (uint32_t)abs(o.val_i64)); + gguf_set_val_u32(ctx_out.get(), o.key, (uint32_t)std::abs(o.val_i64)); } else if (o.tag == LLAMA_KV_OVERRIDE_TYPE_BOOL) { gguf_set_val_bool(ctx_out.get(), o.key, o.val_bool); } else if (o.tag == LLAMA_KV_OVERRIDE_TYPE_STR) { From 229bf686287d18f82c44e89888cc662145ecfdb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Thu, 30 Oct 2025 08:56:28 +0100 Subject: [PATCH 018/185] cuda : fix argsort with 64k+ rows (#16849) --- ggml/src/ggml-cuda/argsort.cu | 4 ++-- tests/test-backend-ops.cpp | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/ggml/src/ggml-cuda/argsort.cu b/ggml/src/ggml-cuda/argsort.cu index 6e7b90d4278..3722cf3ab26 100644 --- a/ggml/src/ggml-cuda/argsort.cu +++ b/ggml/src/ggml-cuda/argsort.cu @@ -87,7 +87,7 @@ template static __global__ void k_argsort_f32_i32(const float * x, int * dst, const int ncols, int ncols_pad) { // bitonic sort int col = threadIdx.x; - int row = blockIdx.y; + int row = blockIdx.x; if (col >= ncols_pad) { return; @@ -151,7 +151,7 @@ static void argsort_f32_i32_cuda_bitonic(const float * x, const int ncols_pad = next_power_of_2(ncols); const dim3 block_dims(ncols_pad, 1, 1); - const dim3 block_nums(1, nrows, 1); + const dim3 block_nums(nrows, 1, 1); const size_t shared_mem = ncols_pad * sizeof(int); // FIXME: this limit could be raised by ~2-4x on Ampere or newer diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 3139119af7a..4b1304c2b89 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -7111,7 +7111,8 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {16, 10, 10, 10}, order)); test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {60, 10, 10, 10}, order)); // qwen test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {1024, 1, 1, 1}, order)); - test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {16384, 1, 1, 1}, order)); // bailingmoe2 (group selection) + test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {16384, 1, 1, 1}, order)); // many backends only handle up to 1024 + test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {2, 8, 8192, 1}, order)); // bailingmoe2 (group selection) } for (ggml_scale_mode mode : {GGML_SCALE_MODE_NEAREST, GGML_SCALE_MODE_BILINEAR}) { From bacddc049a00786df44e682262f6e298742bfbc3 Mon Sep 17 00:00:00 2001 From: Tianyue-Zhao Date: Thu, 30 Oct 2025 07:18:50 -0400 Subject: [PATCH 019/185] model: Add support for CogVLM model (#15002) * Added GGUF mappings for CogVLM model * Add tensor mapping for CogVLM visual encoder * Add CogVLM to conversion script, no vision part yet * Added CogVLM vision model to conversion script * Add graph for CogVLM CLIP model * Add graph for CogVLM * Fixes for CogVLM. Now compiles. * Model now runs * Fixes for cogvlm graph * Account for graph context change after rebase * Changes for whitespace * Changes in convert script according to comments * Switch CogVLM LLM graph to merged QKV tensor * Use rope_type variable instead of direct definition * Change CogVLM CLIP encoder to use SWIGLU * Switch CogVLM CLIP to use merged QKV * Apply rebase edits and remove ggml_cont call that is now unnecessary * clean up --------- Co-authored-by: Xuan Son Nguyen --- convert_hf_to_gguf.py | 33 ++++++- gguf-py/gguf/constants.py | 52 ++++++++++++ gguf-py/gguf/tensor_mapping.py | 95 +++++++++++++++++---- src/llama-arch.cpp | 26 ++++++ src/llama-arch.h | 6 ++ src/llama-model.cpp | 146 +++++++++++++++++++++++++++++++ src/llama-model.h | 7 ++ tools/mtmd/clip-impl.h | 11 +++ tools/mtmd/clip.cpp | 151 ++++++++++++++++++++++++++++++--- 9 files changed, 501 insertions(+), 26 deletions(-) diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index b7593666843..0fd8d5681d7 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -1528,7 +1528,7 @@ def set_gguf_parameters(self): self.gguf_writer.add_vision_embedding_length(self.find_vparam(["hidden_size"])) self.gguf_writer.add_vision_feed_forward_length(self.find_vparam(["intermediate_size"])) self.gguf_writer.add_vision_block_count(self.find_vparam(self.n_block_keys)) - self.gguf_writer.add_vision_head_count(self.find_vparam(["num_attention_heads"])) + self.gguf_writer.add_vision_head_count(self.find_vparam(["num_attention_heads", "num_heads"])) # preprocessor config image_mean = _MISTRAL_COMMON_DATASET_MEAN if self.is_mistral_format else self.preprocessor_config["image_mean"] @@ -9493,6 +9493,37 @@ def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iter return [] # skip other tensors + +@ModelBase.register("CogVLMForCausalLM") +class CogVLMVisionModel(MmprojModel): + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_vision_attention_layernorm_eps(self.hparams.get("layer_norm_eps", 1e-6)) + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.COGVLM) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + if not name.startswith("model.vision."): + return [] + + return [(self.map_tensor_name(name), data_torch)] + + +@ModelBase.register("CogVLMForCausalLM") +class CogVLMModel(LlamaModel): + model_arch = gguf.MODEL_ARCH.COGVLM + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + del bid # unused + + # block vision tensors + if name.startswith("model.vision."): + return [] + + return [(self.map_tensor_name(name), data_torch)] + ###### CONVERSION LOGIC ###### diff --git a/gguf-py/gguf/constants.py b/gguf-py/gguf/constants.py index 94fcfaf69cf..a0c08f69172 100644 --- a/gguf-py/gguf/constants.py +++ b/gguf-py/gguf/constants.py @@ -420,6 +420,7 @@ class MODEL_ARCH(IntEnum): SEED_OSS = auto() GROVEMOE = auto() APERTUS = auto() + COGVLM = auto() class VISION_PROJECTOR_TYPE(IntEnum): @@ -430,6 +431,7 @@ class VISION_PROJECTOR_TYPE(IntEnum): GLM_EDGE = auto() MERGER = auto() GEMMA3 = auto() + COGVLM = auto() class MODEL_TENSOR(IntEnum): @@ -600,6 +602,11 @@ class MODEL_TENSOR(IntEnum): SHORTCONV_CONV = auto() SHORTCONV_INPROJ = auto() SHORTCONV_OUTPROJ = auto() + VISEXP_ATTN_QKV = auto() + VISEXP_ATTN_OUT = auto() + VISEXP_GATE = auto() + VISEXP_DOWN = auto() + VISEXP_UP = auto() # vision V_MMPROJ = auto() V_MMPROJ_FC = auto() @@ -609,6 +616,7 @@ class MODEL_TENSOR(IntEnum): V_ENC_EMBD_PATCH = auto() V_ENC_EMBD_POS = auto() V_ENC_INPUT_NORM = auto() + V_ENC_ATTN_QKV = auto() V_ENC_ATTN_Q = auto() V_ENC_ATTN_Q_NORM = auto() V_ENC_ATTN_K = auto() @@ -640,6 +648,12 @@ class MODEL_TENSOR(IntEnum): V_RESMPL_QUERY = auto() # minicpmv V_TOK_EMBD_IMG_BREAK = auto() # pixtral V_MM_PATCH_MERGER = auto() # mistral small 3.1 + V_MM_POST_FC_NORM = auto() # cogvlm + V_MM_UP = auto() # cogvlm + V_MM_DOWN = auto() # cogvlm + V_MM_GATE = auto() # cogvlm + V_TOK_BOI = auto() # cogvlm + V_TOK_EOI = auto() # cogvlm # audio (mtmd) A_ENC_EMBD_POS = auto() A_ENC_CONV1D = auto() @@ -766,6 +780,7 @@ class MODEL_TENSOR(IntEnum): MODEL_ARCH.SEED_OSS: "seed_oss", MODEL_ARCH.GROVEMOE: "grovemoe", MODEL_ARCH.APERTUS: "apertus", + MODEL_ARCH.COGVLM: "cogvlm", } VISION_PROJECTOR_TYPE_NAMES: dict[VISION_PROJECTOR_TYPE, str] = { @@ -946,6 +961,11 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.SHORTCONV_CONV: "blk.{bid}.shortconv.conv", MODEL_TENSOR.SHORTCONV_INPROJ: "blk.{bid}.shortconv.in_proj", MODEL_TENSOR.SHORTCONV_OUTPROJ: "blk.{bid}.shortconv.out_proj", + MODEL_TENSOR.VISEXP_ATTN_QKV: "blk.{bid}.vis_attn_qkv", + MODEL_TENSOR.VISEXP_ATTN_OUT: "blk.{bid}.vis_attn_output", + MODEL_TENSOR.VISEXP_GATE: "blk.{bid}.vis_gate", + MODEL_TENSOR.VISEXP_DOWN: "blk.{bid}.vis_down", + MODEL_TENSOR.VISEXP_UP: "blk.{bid}.vis_up", # vision MODEL_TENSOR.V_MMPROJ: "mm.{bid}", MODEL_TENSOR.V_MMPROJ_FC: "mm.model.fc", @@ -954,6 +974,7 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_ENC_EMBD_CLS: "v.class_embd", MODEL_TENSOR.V_ENC_EMBD_PATCH: "v.patch_embd", MODEL_TENSOR.V_ENC_EMBD_POS: "v.position_embd", + MODEL_TENSOR.V_ENC_ATTN_QKV: "v.blk.{bid}.attn_qkv", MODEL_TENSOR.V_ENC_ATTN_Q: "v.blk.{bid}.attn_q", MODEL_TENSOR.V_ENC_ATTN_Q_NORM: "v.blk.{bid}.attn_q_norm", MODEL_TENSOR.V_ENC_ATTN_K: "v.blk.{bid}.attn_k", @@ -986,6 +1007,12 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_RESMPL_QUERY: "resampler.query", MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK: "v.token_embd.img_break", # pixtral MODEL_TENSOR.V_MM_PATCH_MERGER: "mm.patch_merger", # mistral small 3.1 + MODEL_TENSOR.V_MM_POST_FC_NORM: "mm.post_fc_norm", # cogvlm + MODEL_TENSOR.V_MM_UP: "mm.up", + MODEL_TENSOR.V_MM_DOWN: "mm.down", + MODEL_TENSOR.V_MM_GATE: "mm.gate", + MODEL_TENSOR.V_TOK_BOI: "v.boi", + MODEL_TENSOR.V_TOK_EOI: "v.eoi", # audio (mtmd) MODEL_TENSOR.A_ENC_EMBD_POS: "a.position_embd", MODEL_TENSOR.A_ENC_CONV1D: "a.conv1d.{bid}", @@ -1023,6 +1050,7 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_ENC_EMBD_PATCH, MODEL_TENSOR.V_ENC_EMBD_POS, MODEL_TENSOR.V_ENC_INPUT_NORM, + MODEL_TENSOR.V_ENC_ATTN_QKV, MODEL_TENSOR.V_ENC_ATTN_Q, MODEL_TENSOR.V_ENC_ATTN_Q_NORM, MODEL_TENSOR.V_ENC_ATTN_K, @@ -1054,6 +1082,12 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_RESMPL_QUERY, MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK, MODEL_TENSOR.V_MM_PATCH_MERGER, + MODEL_TENSOR.V_MM_POST_FC_NORM, + MODEL_TENSOR.V_MM_UP, + MODEL_TENSOR.V_MM_DOWN, + MODEL_TENSOR.V_MM_GATE, + MODEL_TENSOR.V_TOK_BOI, + MODEL_TENSOR.V_TOK_EOI, # audio MODEL_TENSOR.A_ENC_EMBD_POS, MODEL_TENSOR.A_ENC_CONV1D, @@ -2837,6 +2871,23 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.FFN_DOWN_CHEXP, MODEL_TENSOR.FFN_UP_CHEXP, ], + MODEL_ARCH.COGVLM: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_QKV, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + MODEL_TENSOR.VISEXP_ATTN_QKV, + MODEL_TENSOR.VISEXP_ATTN_OUT, + MODEL_TENSOR.VISEXP_GATE, + MODEL_TENSOR.VISEXP_UP, + MODEL_TENSOR.VISEXP_DOWN, + ], # TODO } @@ -3063,6 +3114,7 @@ class VisionProjectorType: LFM2 = "lfm2" KIMIVL = "kimivl" LIGHTONOCR = "lightonocr" + COGVLM = "cogvlm" # Items here are (block size, type size) diff --git a/gguf-py/gguf/tensor_mapping.py b/gguf-py/gguf/tensor_mapping.py index d7dcd8efb84..37e6fc85d51 100644 --- a/gguf-py/gguf/tensor_mapping.py +++ b/gguf-py/gguf/tensor_mapping.py @@ -104,6 +104,7 @@ class TensorNameMap: "backbone.final_layer_norm", # wavtokenizer "model.norm", # llama4 "model.transformer.ln_f", # llada + "model.norm", # cogvlm ), # Rope frequencies @@ -162,6 +163,7 @@ class TensorNameMap: "encoder.layer.{bid}.layer_norm_1", # jina-v2-code "rwkv.blocks.{bid}.ln2", # rwkv6 "model.layers.{bid}.ln2", # rwkv7 + "model.layers.{bid}.post_attention_layernorm", # cogvlm ), # Attention query-key-value @@ -184,6 +186,7 @@ class TensorNameMap: "encoder.layers.{bid}.self_attention.query_key_value", # chatglm "transformer.layers.{bid}.attn.qkv_proj", # openelm "transformer_encoder.{bid}.qkv", # neobert + "model.layers.{bid}.self_attn.language_expert_query_key_value", # cogvlm ), # Attention query @@ -279,6 +282,7 @@ class TensorNameMap: "model.transformer.blocks.{bid}.attn_out", # llada "layers.{bid}.self_attn.o_proj", # qwen3-embedding "backbone.layers.{bid}.mixer.o_proj", # nemotron-h + "model.layers.{bid}.self_attn.language_expert_dense", # cogvlm ), # Attention output norm @@ -418,6 +422,7 @@ class TensorNameMap: "model.transformer.blocks.{bid}.up_proj", # llada "layers.{bid}.mlp.up_proj", # qwen3-embedding "backbone.layers.{bid}.mixer.up_proj", # nemotron-h + "model.layers.{bid}.mlp.language_mlp.up_proj", # cogvlm ), MODEL_TENSOR.FFN_UP_EXP: ( @@ -450,21 +455,22 @@ class TensorNameMap: # Feed-forward gate MODEL_TENSOR.FFN_GATE: ( - "model.layers.{bid}.mlp.gate_proj", # llama-hf refact olmo2 - "layers.{bid}.mlp.gate_proj", # embeddinggemma - "layers.{bid}.feed_forward.w1", # llama-pth - "transformer.h.{bid}.mlp.w2", # qwen - "transformer.h.{bid}.mlp.c_fc2", # jais - "model.layers.layers.{bid}.mlp.gate_proj", # plamo - "model.layers.{bid}.feed_forward.w1", # internlm2 - "encoder.layers.{bid}.mlp.fc12", # nomic-bert - "encoder.layer.{bid}.mlp.gated_layers_w", # jina-bert-v2 (split up/gate, no longer used) - "transformer.h.{bid}.mlp.linear_1", # refact - "model.layers.{bid}.residual_mlp.w1", # arctic - "transformer.h.{bid}.mlp.c_fc_0", # exaone - "model.layers.{bid}.feed_forward.gate_proj", # llama4 jamba granite-hybrid - "model.transformer.blocks.{bid}.ff_proj", # llada - "layers.{bid}.mlp.gate_proj", # qwen3-embedding + "model.layers.{bid}.mlp.gate_proj", # llama-hf refact olmo2 + "layers.{bid}.mlp.gate_proj", # embeddinggemma + "layers.{bid}.feed_forward.w1", # llama-pth + "transformer.h.{bid}.mlp.w2", # qwen + "transformer.h.{bid}.mlp.c_fc2", # jais + "model.layers.layers.{bid}.mlp.gate_proj", # plamo + "model.layers.{bid}.feed_forward.w1", # internlm2 + "encoder.layers.{bid}.mlp.fc12", # nomic-bert + "encoder.layer.{bid}.mlp.gated_layers_w", # jina-bert-v2 (split up/gate, no longer used) + "transformer.h.{bid}.mlp.linear_1", # refact + "model.layers.{bid}.residual_mlp.w1", # arctic + "transformer.h.{bid}.mlp.c_fc_0", # exaone + "model.layers.{bid}.feed_forward.gate_proj", # llama4 jamba granite-hybrid + "model.transformer.blocks.{bid}.ff_proj", # llada + "layers.{bid}.mlp.gate_proj", # qwen3-embedding + "model.layers.{bid}.mlp.language_mlp.gate_proj", # cogvlm ), MODEL_TENSOR.FFN_GATE_EXP: ( @@ -522,6 +528,7 @@ class TensorNameMap: "model.transformer.blocks.{bid}.ff_out", # llada "layers.{bid}.mlp.down_proj", # qwen3-embedding "backbone.layers.{bid}.mixer.down_proj", # nemotron-h + "model.layers.{bid}.mlp.language_mlp.down_proj", # cogvlm ), MODEL_TENSOR.FFN_DOWN_EXP: ( @@ -1047,6 +1054,26 @@ class TensorNameMap: "encoder.block.{bid}.layer.1.DenseReluDense.wo", # t5 ), + MODEL_TENSOR.VISEXP_UP: ( + "model.layers.{bid}.mlp.vision_mlp.up_proj", # cogvlm + ), + + MODEL_TENSOR.VISEXP_GATE: ( + "model.layers.{bid}.mlp.vision_mlp.gate_proj", # cogvlm + ), + + MODEL_TENSOR.VISEXP_DOWN: ( + "model.layers.{bid}.mlp.vision_mlp.down_proj", # cogvlm + ), + + MODEL_TENSOR.VISEXP_ATTN_OUT: ( + "model.layers.{bid}.self_attn.vision_expert_dense", # cogvlm + ), + + MODEL_TENSOR.VISEXP_ATTN_QKV: ( + "model.layers.{bid}.self_attn.vision_expert_query_key_value", # cogvlm + ), + ############################################################################ # TODO: these do not belong to block_mappings_cfg - move them to mappings_cfg MODEL_TENSOR.ENC_OUTPUT_NORM: ( @@ -1148,6 +1175,7 @@ class TensorNameMap: MODEL_TENSOR.V_MMPROJ_FC: ( "model.connector.modality_projection.proj", # SmolVLM + "model.vision.linear_proj.linear_proj", # cogvlm ), MODEL_TENSOR.V_MMPROJ_MLP: ( @@ -1164,6 +1192,7 @@ class TensorNameMap: "vision_tower.vision_model.embeddings.class_embedding", "model.vision_tower.embeddings.cls_token", # Intern-S1 "vision_model.class_embedding", # llama 4 + "model.vision.patch_embedding.cls_embedding", # cogvlm ), MODEL_TENSOR.V_ENC_EMBD_PATCH: ( @@ -1176,6 +1205,7 @@ class TensorNameMap: "vision_model.patch_embedding.linear", # llama 4 "visual.patch_embed.proj", # qwen2vl "vision_tower.patch_embed.proj", # kimi-vl + "model.vision.patch_embedding.proj", # cogvlm ), MODEL_TENSOR.V_ENC_EMBD_POS: ( @@ -1185,6 +1215,11 @@ class TensorNameMap: "model.vision_model.embeddings.position_embedding", # SmolVLM "vision_model.positional_embedding_vlm", # llama 4 "vision_tower.patch_embed.pos_emb", # kimi-vl + "model.vision.patch_embedding.position_embedding", # cogvlm + ), + + MODEL_TENSOR.V_ENC_ATTN_QKV: ( + "model.vision.transformer.layers.{bid}.attention.query_key_value", # cogvlm ), MODEL_TENSOR.V_ENC_ATTN_Q: ( @@ -1244,6 +1279,7 @@ class TensorNameMap: "vision_model.model.layers.{bid}.input_layernorm", # llama4 "visual.blocks.{bid}.norm1", # qwen2vl "vision_tower.encoder.blocks.{bid}.norm0", # kimi-vl (norm0/norm1) + "model.vision.transformer.layers.{bid}.input_layernorm", # cogvlm ), MODEL_TENSOR.V_ENC_ATTN_O: ( @@ -1257,6 +1293,7 @@ class TensorNameMap: "vision_encoder.transformer.layers.{bid}.attention.wo", # pixtral "visual.blocks.{bid}.attn.proj", # qwen2vl "vision_tower.encoder.blocks.{bid}.wo", # kimi-vl + "model.vision.transformer.layers.{bid}.attention.dense", # cogvlm ), MODEL_TENSOR.V_ENC_POST_ATTN_NORM: ( @@ -1270,6 +1307,7 @@ class TensorNameMap: "vision_encoder.transformer.layers.{bid}.ffn_norm", # pixtral "visual.blocks.{bid}.norm2", # qwen2vl "vision_tower.encoder.blocks.{bid}.norm1", # kimi-vl (norm0/norm1) + "model.vision.transformer.layers.{bid}.post_attention_layernorm", # cogvlm ), MODEL_TENSOR.V_ENC_FFN_UP: ( @@ -1283,6 +1321,7 @@ class TensorNameMap: "visual.blocks.{bid}.mlp.fc1", # qwen2vl "visual.blocks.{bid}.mlp.up_proj", # qwen2.5vl "vision_tower.encoder.blocks.{bid}.mlp.fc0", # kimi-vl (fc0/fc1) + "model.vision.transformer.layers.{bid}.mlp.fc1", # cogvlm ), MODEL_TENSOR.V_ENC_FFN_GATE: ( @@ -1302,6 +1341,7 @@ class TensorNameMap: "visual.blocks.{bid}.mlp.fc2", # qwen2vl "visual.blocks.{bid}.mlp.down_proj", # qwen2.5vl "vision_tower.encoder.blocks.{bid}.mlp.fc1", # kimi-vl (fc0/fc1) + "model.vision.transformer.layers.{bid}.mlp.fc2", # cogvlm ), MODEL_TENSOR.V_LAYER_SCALE_1: ( @@ -1338,6 +1378,7 @@ class TensorNameMap: "multi_modal_projector.layer_norm", "multi_modal_projector.pre_norm", "pre_mm_projector_norm", + "model.vision.linear_proj.norm1", # cogvlm ), MODEL_TENSOR.V_MM_SOFT_EMB_NORM: ( @@ -1397,6 +1438,30 @@ class TensorNameMap: "patch_merger.merging_layer", # mistral ), + MODEL_TENSOR.V_MM_POST_FC_NORM: ( + "model.vision.linear_proj.norm1", # cogvlm + ), + + MODEL_TENSOR.V_MM_UP: ( + "model.vision.linear_proj.dense_h_to_4h", # cogvlm + ), + + MODEL_TENSOR.V_MM_DOWN: ( + "model.vision.linear_proj.dense_4h_to_h", # cogvlm + ), + + MODEL_TENSOR.V_MM_GATE: ( + "model.vision.linear_proj.gate_proj", # cogvlm + ), + + MODEL_TENSOR.V_TOK_BOI: ( + "model.vision.boi", # cogvlm + ), + + MODEL_TENSOR.V_TOK_EOI: ( + "model.vision.eoi", # cogvlm + ), + # audio (mtmd) MODEL_TENSOR.A_ENC_EMBD_POS: ( diff --git a/src/llama-arch.cpp b/src/llama-arch.cpp index 8ca769c5fd2..ba45e88c08e 100644 --- a/src/llama-arch.cpp +++ b/src/llama-arch.cpp @@ -103,6 +103,7 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_SEED_OSS, "seed_oss" }, { LLM_ARCH_GROVEMOE, "grovemoe" }, { LLM_ARCH_APERTUS, "apertus" }, + { LLM_ARCH_COGVLM, "cogvlm" }, { LLM_ARCH_UNKNOWN, "(unknown)" }, }; @@ -2312,6 +2313,26 @@ static const std::map> LLM_TENSOR_N { LLM_TENSOR_FFN_UP_CHEXPS, "blk.%d.ffn_up_chexps" }, }, }, + { + LLM_ARCH_COGVLM, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_QKV, "blk.%d.attn_qkv" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE, "blk.%d.ffn_gate" }, + { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" }, + { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, + { LLM_TENSOR_VISEXP_ATTN_QKV, "blk.%d.vis_attn_qkv" }, + { LLM_TENSOR_VISEXP_ATTN_OUT, "blk.%d.vis_attn_output" }, + { LLM_TENSOR_VISEXP_FFN_GATE, "blk.%d.vis_gate" }, + { LLM_TENSOR_VISEXP_FFN_DOWN, "blk.%d.vis_down" }, + { LLM_TENSOR_VISEXP_FFN_UP, "blk.%d.vis_up" }, + }, + }, { LLM_ARCH_UNKNOWN, { @@ -2488,6 +2509,11 @@ static const std::map LLM_TENSOR_INFOS = { {LLM_TENSOR_SHORTCONV_CONV, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_SSM_CONV}}, {LLM_TENSOR_SHORTCONV_INPROJ, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, {LLM_TENSOR_SHORTCONV_OUTPROJ, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, + {LLM_TENSOR_VISEXP_ATTN_QKV, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, + {LLM_TENSOR_VISEXP_ATTN_OUT, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, + {LLM_TENSOR_VISEXP_FFN_GATE, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, + {LLM_TENSOR_VISEXP_FFN_DOWN, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, + {LLM_TENSOR_VISEXP_FFN_UP, {LLM_TENSOR_LAYER_REPEATING, GGML_OP_MUL_MAT}}, // NextN/MTP tensors are currently ignored (reserved for future MTP support) // These tensors only exist in the last layer(s) and are treated as output tensors {LLM_TENSOR_NEXTN_EH_PROJ, {LLM_TENSOR_LAYER_OUTPUT, GGML_OP_MUL_MAT}}, diff --git a/src/llama-arch.h b/src/llama-arch.h index dea725c1a75..3350e8b4315 100644 --- a/src/llama-arch.h +++ b/src/llama-arch.h @@ -107,6 +107,7 @@ enum llm_arch { LLM_ARCH_SEED_OSS, LLM_ARCH_GROVEMOE, LLM_ARCH_APERTUS, + LLM_ARCH_COGVLM, LLM_ARCH_UNKNOWN, }; @@ -455,6 +456,11 @@ enum llm_tensor { LLM_TENSOR_SHORTCONV_CONV, LLM_TENSOR_SHORTCONV_INPROJ, LLM_TENSOR_SHORTCONV_OUTPROJ, + LLM_TENSOR_VISEXP_ATTN_QKV, + LLM_TENSOR_VISEXP_ATTN_OUT, + LLM_TENSOR_VISEXP_FFN_GATE, + LLM_TENSOR_VISEXP_FFN_DOWN, + LLM_TENSOR_VISEXP_FFN_UP, LLM_TENSOR_NEXTN_EH_PROJ, LLM_TENSOR_NEXTN_EMBED_TOKENS, LLM_TENSOR_NEXTN_ENORM, diff --git a/src/llama-model.cpp b/src/llama-model.cpp index ea6f59ed482..35759a00aec 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -2124,6 +2124,14 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; + case LLM_ARCH_COGVLM: + { + ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); + switch (hparams.n_layer) { + case 32: type = LLM_TYPE_13B; break; + default: type = LLM_TYPE_UNKNOWN; + } + } break; default: throw std::runtime_error("unsupported model architecture"); } @@ -6136,6 +6144,41 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.attn_k_norm_b = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "bias", i), { n_embd_head_k }, TENSOR_NOT_REQUIRED); } } break; + case LLM_ARCH_COGVLM: + { + tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); + + // output + output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); + output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, TENSOR_NOT_REQUIRED); + + // if output is NULL, init from the input tok embed + if (output == NULL) { + output = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, TENSOR_DUPLICATED); + } + + for (int i = 0; i < n_layer; ++i) { + auto & layer = layers[i]; + + layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0); + layer.wqkv = create_tensor(tn(LLM_TENSOR_ATTN_QKV, "weight", i), {n_embd, n_embd_head_k * n_head * 3}, 0); + layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), {n_embd_head_k * n_head, n_embd}, 0); + + layer.visexp_attn_wqkv = create_tensor(tn(LLM_TENSOR_VISEXP_ATTN_QKV, "weight", i), {n_embd, n_embd_head_k * n_head * 3}, 0); + layer.visexp_attn_wo = create_tensor(tn(LLM_TENSOR_VISEXP_ATTN_OUT, "weight", i), {n_embd_head_k * n_head, n_embd}, 0); + + layer.rope_freqs = create_tensor(tn(LLM_TENSOR_ROPE_FREQS, "weight", i), {n_rot/2}, TENSOR_NOT_REQUIRED | (i != 0 ? TENSOR_DUPLICATED : 0)); + + layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0); + layer.ffn_gate = create_tensor(tn(LLM_TENSOR_FFN_GATE, "weight", i), {n_embd, n_ff}, 0); + layer.ffn_down = create_tensor(tn(LLM_TENSOR_FFN_DOWN, "weight", i), { n_ff, n_embd}, 0); + layer.ffn_up = create_tensor(tn(LLM_TENSOR_FFN_UP, "weight", i), {n_embd, n_ff}, 0); + + layer.visexp_ffn_gate = create_tensor(tn(LLM_TENSOR_VISEXP_FFN_GATE, "weight", i), {n_embd, n_ff}, 0); + layer.visexp_ffn_down = create_tensor(tn(LLM_TENSOR_VISEXP_FFN_DOWN, "weight", i), { n_ff, n_embd}, 0); + layer.visexp_ffn_up = create_tensor(tn(LLM_TENSOR_VISEXP_FFN_UP, "weight", i), {n_embd, n_ff}, 0); + } + } break; default: throw std::runtime_error("unknown architecture"); } @@ -19641,6 +19684,104 @@ struct llm_build_apertus : public llm_graph_context { } }; +struct llm_build_cogvlm : public llm_graph_context { + llm_build_cogvlm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + float kq_scale = 1.0f / sqrtf(float(n_embd_head)); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * inpL, * cur; + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + // check ubatch to see if we have input tokens (text) + // or an input embedding vector (image) + bool is_text; + if (ubatch.token) { + is_text = true; + } else { + is_text = false; + } + + for (int il = 0; il < n_layer; ++il) { + // get either the text or image weight tensors + ggml_tensor * wqkv, * wo; + ggml_tensor * ffn_gate, * ffn_down, * ffn_up; + + if (is_text) { + wqkv = model.layers[il].wqkv; + wo = model.layers[il].wo; + ffn_gate = model.layers[il].ffn_gate; + ffn_down = model.layers[il].ffn_down; + ffn_up = model.layers[il].ffn_up; + } else { + wqkv = model.layers[il].visexp_attn_wqkv; + wo = model.layers[il].visexp_attn_wo; + ffn_gate = model.layers[il].visexp_ffn_gate; + ffn_down = model.layers[il].visexp_ffn_down; + ffn_up = model.layers[il].visexp_ffn_up; + } + + ggml_tensor * inpSA = inpL; + cur = build_norm(inpSA, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + + // build self attention + { + ggml_tensor * qkv = build_lora_mm(wqkv, cur); + + // split qkv into Q, K, V along the first dimension + ggml_tensor * Qcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), + qkv->nb[1], 0); + ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + qkv->nb[1], n_embd * ggml_element_size(qkv)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + qkv->nb[1], 2 * n_embd * ggml_element_size(qkv)); + + Qcur = ggml_rope(ctx0, Qcur, inp_pos, n_embd_head, rope_type); + Kcur = ggml_rope(ctx0, Kcur, inp_pos, n_embd_head, rope_type); + + cur = build_attn(inp_attn, wo, nullptr, Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + ffn_up, NULL, NULL, + ffn_gate, NULL, NULL, + ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + ggml_build_forward_expand(gf, cur); + + } +}; + llama_memory_i * llama_model::create_memory(const llama_memory_params & params, const llama_cparams & cparams) const { llama_memory_i * res; @@ -20165,6 +20306,10 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { { llm = std::make_unique(*this, params); } break; + case LLM_ARCH_COGVLM: + { + llm = std::make_unique(*this, params); + } break; default: GGML_ABORT("fatal error"); } @@ -20382,6 +20527,7 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_SEED_OSS: case LLM_ARCH_GROVEMOE: case LLM_ARCH_APERTUS: + case LLM_ARCH_COGVLM: return LLAMA_ROPE_TYPE_NEOX; case LLM_ARCH_QWEN2VL: diff --git a/src/llama-model.h b/src/llama-model.h index 1ab1cf7f8e9..a5affda1c99 100644 --- a/src/llama-model.h +++ b/src/llama-model.h @@ -384,6 +384,13 @@ struct llama_layer { // openai-moe struct ggml_tensor * attn_sinks = nullptr; + // cogvlm + struct ggml_tensor * visexp_attn_wqkv = nullptr; + struct ggml_tensor * visexp_attn_wo = nullptr; + struct ggml_tensor * visexp_ffn_gate = nullptr; + struct ggml_tensor * visexp_ffn_down = nullptr; + struct ggml_tensor * visexp_ffn_up = nullptr; + // xIELU activation parameters for Apertus struct ggml_tensor * ffn_act_alpha_n = nullptr; struct ggml_tensor * ffn_act_alpha_p = nullptr; diff --git a/tools/mtmd/clip-impl.h b/tools/mtmd/clip-impl.h index ad2108d1798..d4b88cb6980 100644 --- a/tools/mtmd/clip-impl.h +++ b/tools/mtmd/clip-impl.h @@ -63,6 +63,7 @@ #define TN_PATCH_EMBD "v.patch_embd.weight" // not rename tensor with ".0" postfix for backwrad compat #define TN_PATCH_EMBD_1 "v.patch_embd.weight.1" #define TN_PATCH_BIAS "v.patch_embd.bias" +#define TN_ATTN_QKV "%s.blk.%d.attn_qkv.%s" #define TN_ATTN_K "%s.blk.%d.attn_k.%s" #define TN_ATTN_Q "%s.blk.%d.attn_q.%s" #define TN_ATTN_V "%s.blk.%d.attn_v.%s" @@ -116,6 +117,14 @@ #define TN_MM_NORM_PRE "mm.a.norm_pre.%s" #define TN_MM_NORM_MID "mm.a.norm_mid.%s" +// cogvlm +#define TN_MM_POST_FC_NORM "mm.post_fc_norm.%s" +#define TN_MM_H_TO_4H "mm.up.%s" +#define TN_MM_GATE "mm.gate.%s" +#define TN_MM_4H_TO_H "mm.down.%s" +#define TN_TOK_BOI "v.boi" +#define TN_TOK_EOI "v.eoi" + // align x to upper multiple of n #define CLIP_ALIGN(x, n) ((((x) + (n) - 1) / (n)) * (n)) @@ -141,6 +150,7 @@ enum projector_type { PROJECTOR_TYPE_KIMIVL, PROJECTOR_TYPE_LIGHTONOCR, PROJECTOR_TYPE_UNKNOWN, + PROJECTOR_TYPE_COGVLM, }; static std::map PROJECTOR_TYPE_NAMES = { @@ -163,6 +173,7 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_LFM2, "lfm2"}, { PROJECTOR_TYPE_KIMIVL, "kimivl"}, { PROJECTOR_TYPE_LIGHTONOCR,"lightonocr"}, + { PROJECTOR_TYPE_COGVLM, "cogvlm"}, }; static projector_type clip_projector_type_from_string(const std::string & str) { diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index b44f0a3a28a..a135ba0a2b3 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -214,6 +214,8 @@ struct clip_layer { ggml_tensor * q_b = nullptr; ggml_tensor * v_w = nullptr; ggml_tensor * v_b = nullptr; + ggml_tensor * qkv_w = nullptr; + ggml_tensor * qkv_b = nullptr; ggml_tensor * o_w = nullptr; ggml_tensor * o_b = nullptr; @@ -286,8 +288,6 @@ struct clip_model { // GLMV-Edge projection ggml_tensor * mm_model_adapter_conv_w = nullptr; ggml_tensor * mm_model_adapter_conv_b = nullptr; - ggml_tensor * mm_glm_tok_boi = nullptr; - ggml_tensor * mm_glm_tok_eoi = nullptr; // MobileVLM projection ggml_tensor * mm_model_mlp_1_w = nullptr; @@ -359,6 +359,15 @@ struct clip_model { ggml_tensor * mm_norm_pre_w = nullptr; ggml_tensor * mm_norm_mid_w = nullptr; + // cogvlm + ggml_tensor * mm_post_fc_norm_w = nullptr; + ggml_tensor * mm_post_fc_norm_b = nullptr; + ggml_tensor * mm_h_to_4h_w = nullptr; + ggml_tensor * mm_gate_w = nullptr; + ggml_tensor * mm_4h_to_h_w = nullptr; + ggml_tensor * mm_boi = nullptr; + ggml_tensor * mm_eoi = nullptr; + bool audio_has_avgpool() const { return proj_type == PROJECTOR_TYPE_QWEN2A || proj_type == PROJECTOR_TYPE_VOXTRAL; @@ -1494,8 +1503,8 @@ struct clip_graph { // note: these embeddings are not present in text model, hence we cannot process them as text tokens // see: https://huggingface.co/THUDM/glm-edge-v-2b/blob/main/siglip.py#L53 { - embeddings = ggml_concat(ctx0, model.mm_glm_tok_boi, embeddings, 1); // BOI - embeddings = ggml_concat(ctx0, embeddings, model.mm_glm_tok_eoi, 1); // EOI + embeddings = ggml_concat(ctx0, model.mm_boi, embeddings, 1); // BOI + embeddings = ggml_concat(ctx0, embeddings, model.mm_eoi, 1); // EOI } } @@ -1613,6 +1622,104 @@ struct clip_graph { return gf; } + // cogvlm vision encoder + ggml_cgraph * build_cogvlm() { + GGML_ASSERT(model.class_embedding != nullptr); + GGML_ASSERT(model.position_embeddings != nullptr); + + const int n_pos = n_patches + 1; // +1 for [CLS] + + // build input and concatenate class embedding + ggml_tensor * inp = build_inp(); + inp = ggml_concat(ctx0, inp, model.class_embedding, 1); + + inp = ggml_add(ctx0, inp, model.position_embeddings); + cb(inp, "inp_pos", -1); + + ggml_tensor * inpL = inp; + + for (int il = 0; il < n_layer; il++) { + auto & layer = model.layers[il]; + ggml_tensor * cur = inpL; + + cur = ggml_mul_mat(ctx0, layer.qkv_w, cur); + + cur = ggml_add(ctx0, cur, layer.qkv_b); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], 0); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], n_embd * sizeof(float)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], 2 * n_embd * sizeof(float)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(layer.o_w, layer.o_b, + Qcur, Kcur, Vcur, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + + cur = build_norm(cur, layer.ln_1_w, layer.ln_1_b, NORM_TYPE_NORMAL, eps, il); + cb(cur, "attn_post_norm", il); + + cur = ggml_add(ctx0, cur, inpL); + inpL = cur; + + cur = build_ffn(cur, + layer.ff_up_w, layer.ff_up_b, + layer.ff_gate_w, layer.ff_gate_b, + layer.ff_down_w, layer.ff_down_b, + hparams.ffn_op, il); + + cb(cur, "ffn_out", il); + + cur = build_norm(cur, layer.ln_2_w, layer.ln_2_b, NORM_TYPE_NORMAL, eps, il); + cb(cur, "ffn_post_norm", il); + + cur = ggml_add(ctx0, cur, inpL); + cb(cur, "layer_out", il); + inpL = cur; + + } + + // remove CLS token (like build_llama4 does) + ggml_tensor * cur = ggml_view_2d(ctx0, inpL, + n_embd, n_patches, + ggml_row_size(inpL->type, n_embd), 0); + + // Multiply with mm_model_proj + cur = ggml_mul_mat(ctx0, model.mm_model_proj, cur); + + // Apply layernorm, weight, bias + cur = build_norm(cur, model.mm_post_fc_norm_w, model.mm_post_fc_norm_b, NORM_TYPE_NORMAL, 1e-5, -1); + + // Apply GELU + cur = ggml_gelu_inplace(ctx0, cur); + + // Branch 1: multiply with mm_h_to_4h_w + ggml_tensor * h_to_4h = ggml_mul_mat(ctx0, model.mm_h_to_4h_w, cur); + + // Branch 2: multiply with mm_gate_w + ggml_tensor * gate = ggml_mul_mat(ctx0, model.mm_gate_w, cur); + + // Apply silu + gate = ggml_swiglu_split(ctx0, gate, h_to_4h); + + // Apply mm_4h_to_h_w + cur = ggml_mul_mat(ctx0, model.mm_4h_to_h_w, gate); + + // Concatenate with boi and eoi + cur = ggml_concat(ctx0, model.mm_boi, cur, 1); + cur = ggml_concat(ctx0, cur, model.mm_eoi, 1); + + // build the graph + ggml_build_forward_expand(gf, cur); + + return gf; + } + private: // // utility functions @@ -2126,6 +2233,10 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 { res = graph.build_kimivl(); } break; + case PROJECTOR_TYPE_COGVLM: + { + res = graph.build_cogvlm(); + } break; default: { res = graph.build_llava(); @@ -2532,10 +2643,11 @@ struct clip_model_loader { model.layers.resize(hparams.n_layer); for (int il = 0; il < hparams.n_layer; ++il) { auto & layer = model.layers[il]; - layer.k_w = get_tensor(string_format(TN_ATTN_K, prefix, il, "weight")); - layer.q_w = get_tensor(string_format(TN_ATTN_Q, prefix, il, "weight")); - layer.v_w = get_tensor(string_format(TN_ATTN_V, prefix, il, "weight")); + layer.k_w = get_tensor(string_format(TN_ATTN_K, prefix, il, "weight"), false); + layer.q_w = get_tensor(string_format(TN_ATTN_Q, prefix, il, "weight"), false); + layer.v_w = get_tensor(string_format(TN_ATTN_V, prefix, il, "weight"), false); layer.o_w = get_tensor(string_format(TN_ATTN_OUTPUT, prefix, il, "weight")); + layer.qkv_w = get_tensor(string_format(TN_ATTN_QKV, prefix, il, "weight"), false); layer.k_norm = get_tensor(string_format(TN_ATTN_K_NORM, prefix, il, "weight"), false); layer.q_norm = get_tensor(string_format(TN_ATTN_Q_NORM, prefix, il, "weight"), false); layer.ln_1_w = get_tensor(string_format(TN_LN_1, prefix, il, "weight"), false); @@ -2547,6 +2659,7 @@ struct clip_model_loader { layer.q_b = get_tensor(string_format(TN_ATTN_Q, prefix, il, "bias"), false); layer.v_b = get_tensor(string_format(TN_ATTN_V, prefix, il, "bias"), false); layer.o_b = get_tensor(string_format(TN_ATTN_OUTPUT, prefix, il, "bias"), false); + layer.qkv_b = get_tensor(string_format(TN_ATTN_QKV, prefix, il, "bias"), false); layer.ln_1_b = get_tensor(string_format(TN_LN_1, prefix, il, "bias"), false); layer.ln_2_b = get_tensor(string_format(TN_LN_2, prefix, il, "bias"), false); @@ -2682,8 +2795,8 @@ struct clip_model_loader { model.mm_model_mlp_1_w = get_tensor(string_format(TN_GLM_ADAPTER_D_H_2_4H, "weight")); model.mm_model_mlp_2_w = get_tensor(string_format(TN_GLM_ADAPTER_GATE, "weight")); model.mm_model_mlp_3_w = get_tensor(string_format(TN_GLM_ADAPTER_D_4H_2_H, "weight")); - model.mm_glm_tok_boi = get_tensor(string_format(TN_TOK_GLM_BOI, "weight")); - model.mm_glm_tok_eoi = get_tensor(string_format(TN_TOK_GLM_EOI, "weight")); + model.mm_boi = get_tensor(string_format(TN_TOK_GLM_BOI, "weight")); + model.mm_eoi = get_tensor(string_format(TN_TOK_GLM_EOI, "weight")); } break; case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: @@ -2777,6 +2890,17 @@ struct clip_model_loader { model.mm_model_mlp_1_w = get_tensor(string_format(TN_MVLM_PROJ_MLP, 1, "weight")); model.mm_model_mlp_2_w = get_tensor(string_format(TN_MVLM_PROJ_MLP, 2, "weight")); } break; + case PROJECTOR_TYPE_COGVLM: + { + model.mm_model_proj = get_tensor(TN_MM_PROJECTOR); + model.mm_post_fc_norm_w = get_tensor(string_format(TN_MM_POST_FC_NORM, "weight")); + model.mm_post_fc_norm_b = get_tensor(string_format(TN_MM_POST_FC_NORM, "bias")); + model.mm_h_to_4h_w = get_tensor(string_format(TN_MM_H_TO_4H, "weight")); + model.mm_gate_w = get_tensor(string_format(TN_MM_GATE, "weight")); + model.mm_4h_to_h_w = get_tensor(string_format(TN_MM_4H_TO_H, "weight")); + model.mm_boi = get_tensor(TN_TOK_BOI); + model.mm_eoi = get_tensor(TN_TOK_EOI); + } break; default: GGML_ASSERT(false && "unknown projector type"); } @@ -3825,7 +3949,7 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_GLM_EDGE: { n_patches /= 4; - if (ctx->model.mm_glm_tok_boi) { + if (ctx->model.mm_boi) { n_patches += 2; // for BOI and EOI token embeddings } } break; @@ -3915,6 +4039,10 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im n_patches /= 2; } } break; + case PROJECTOR_TYPE_COGVLM: + { + n_patches += 2; // for BOI and EOI token embeddings + } break; default: GGML_ABORT("unsupported projector type"); } @@ -4323,6 +4451,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima case PROJECTOR_TYPE_ULTRAVOX: case PROJECTOR_TYPE_LFM2: case PROJECTOR_TYPE_VOXTRAL: + case PROJECTOR_TYPE_COGVLM: { // do nothing } break; @@ -4427,6 +4556,8 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) { case PROJECTOR_TYPE_LFM2: case PROJECTOR_TYPE_KIMIVL: return ctx->model.mm_2_w->ne[1]; + case PROJECTOR_TYPE_COGVLM: + return ctx->model.mm_4h_to_h_w->ne[1]; default: GGML_ABORT("Unknown projector type"); } From dcca0d3ab840ebe9b2ccd4719033d408eeb758d7 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Thu, 30 Oct 2025 05:26:05 -0700 Subject: [PATCH 020/185] cpu: introduce chunking for flash attention (#16829) Factor out the core FA loop into flash_atten_f16_one_chunk and add an outter loop on top that handles the chunks. --- ggml/src/ggml-cpu/ops.cpp | 106 ++++++++++++++++++++++++++++++++------ 1 file changed, 90 insertions(+), 16 deletions(-) diff --git a/ggml/src/ggml-cpu/ops.cpp b/ggml/src/ggml-cpu/ops.cpp index 3156bd60101..c17ab10245d 100644 --- a/ggml/src/ggml-cpu/ops.cpp +++ b/ggml/src/ggml-cpu/ops.cpp @@ -7909,10 +7909,10 @@ void ggml_compute_forward_argsort( // ggml_compute_forward_flash_attn_ext -static void ggml_compute_forward_flash_attn_ext_f16( +static void ggml_compute_forward_flash_attn_ext_f16_one_chunk( const ggml_compute_params * params, - ggml_tensor * dst) { - + ggml_tensor * dst, + int ir0, int ir1) { const ggml_tensor * q = dst->src[0]; const ggml_tensor * k = dst->src[1]; const ggml_tensor * v = dst->src[2]; @@ -7928,9 +7928,6 @@ static void ggml_compute_forward_flash_attn_ext_f16( GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) GGML_TENSOR_LOCALS(size_t, nb, dst, nb) - const int ith = params->ith; - const int nth = params->nth; - const int64_t DK = nek0; const int64_t DV = nev0; const int64_t N = neq1; @@ -7964,16 +7961,6 @@ static void ggml_compute_forward_flash_attn_ext_f16( // parallelize by q rows using ggml_vec_dot_f32 - // total rows in q - const int nr = neq1*neq2*neq3; - - // rows per thread - const int dr = (nr + nth - 1)/nth; - - // row range for this thread - const int ir0 = dr*ith; - const int ir1 = MIN(ir0 + dr, nr); - float scale = 1.0f; float max_bias = 0.0f; float logit_softcap = 0.0f; @@ -8000,6 +7987,8 @@ static void ggml_compute_forward_flash_attn_ext_f16( GGML_ASSERT(( q_to_vec_dot) && "fattn: unsupported K-type"); GGML_ASSERT((v->type == GGML_TYPE_F32 || v_to_float ) && "fattn: unsupported V-type"); + int ith = params->ith; + // loop over n_batch and n_head for (int ir = ir0; ir < ir1; ++ir) { // q indices @@ -8147,6 +8136,91 @@ static void ggml_compute_forward_flash_attn_ext_f16( } } +static void ggml_compute_forward_flash_attn_ext_f16( + const ggml_compute_params * params, + ggml_tensor * dst) { + + const ggml_tensor * q = dst->src[0]; + const ggml_tensor * k = dst->src[1]; + const ggml_tensor * v = dst->src[2]; + + GGML_TENSOR_LOCALS(int64_t, neq, q, ne) + GGML_TENSOR_LOCALS(size_t, nbq, q, nb) + GGML_TENSOR_LOCALS(int64_t, nek, k, ne) + GGML_TENSOR_LOCALS(size_t, nbk, k, nb) + GGML_TENSOR_LOCALS(int64_t, nev, v, ne) + GGML_TENSOR_LOCALS(size_t, nbv, v, nb) + GGML_TENSOR_LOCALS(int64_t, ne, dst, ne) + GGML_TENSOR_LOCALS(size_t, nb, dst, nb) + + const int64_t DK = nek0; + const int64_t DV = nev0; + const int64_t N = neq1; + + GGML_ASSERT(ne0 == DV); + GGML_ASSERT(ne2 == N); + + // input tensor rows must be contiguous + GGML_ASSERT(nbq0 == ggml_type_size(q->type)); + GGML_ASSERT(nbk0 == ggml_type_size(k->type)); + GGML_ASSERT(nbv0 == ggml_type_size(v->type)); + + GGML_ASSERT(neq0 == DK); + GGML_ASSERT(nek0 == DK); + GGML_ASSERT(nev0 == DV); + + GGML_ASSERT(neq1 == N); + + // dst cannot be transposed or permuted + GGML_ASSERT(nb0 == sizeof(float)); + GGML_ASSERT(nb0 <= nb1); + GGML_ASSERT(nb1 <= nb2); + GGML_ASSERT(nb2 <= nb3); + + // parallelize by q rows using ggml_vec_dot_f32 + + // total rows in q + const int64_t nr = neq1*neq2*neq3; + + // rows per thread + const int ith = params->ith; + const int nth = params->nth; + + // disable for NUMA + const bool disable_chunking = ggml_is_numa(); + + // 4x chunks per thread + int nth_scaled = nth * 4; + int64_t chunk_size = (nr + nth_scaled - 1) / nth_scaled; + int64_t nchunk = (nr + chunk_size - 1) / chunk_size; + + if (nth == 1 || nchunk < nth || disable_chunking) { + nchunk = nth; + } + + if (ith == 0) { + // Every thread starts at ith, so the first unprocessed chunk is nth. This save a bit of coordination right at the start. + ggml_threadpool_chunk_set(params->threadpool, nth); + } + + ggml_barrier(params->threadpool); + + // The number of elements in each chunk + const int64_t dr = (nr + nchunk - 1) / nchunk; + + // The first chunk comes from our thread_id, the rest will get auto-assigned. + int current_chunk = ith; + + while (current_chunk < nchunk) { + const int64_t ir0 = dr * current_chunk; + const int64_t ir1 = MIN(ir0 + dr, nr); + + ggml_compute_forward_flash_attn_ext_f16_one_chunk(params, dst, ir0, ir1); + + current_chunk = ggml_threadpool_chunk_add(params->threadpool, 1); + } +} + void ggml_compute_forward_flash_attn_ext( const ggml_compute_params * params, ggml_tensor * dst) { From d261223d24e97f2df50220e4a5b7f0adb69bba81 Mon Sep 17 00:00:00 2001 From: JJJYmmm <92386084+JJJYmmm@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:19:14 +0800 Subject: [PATCH 021/185] model: add support for qwen3vl series (#16780) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * support qwen3vl series. Co-authored-by: Thireus ☠ Co-authored-by: yairpatch Co-authored-by: LETS-BEE * bugfix: fix the arch check for qwen3vl-moe. * use build_ffn * optimize deepstack structure * optimize deepstack feature saving * Revert "optimize deepstack feature saving" for temporal fix This reverts commit f321b9fdf13e59527408152e73b1071e19a87e71. * code clean * use fused qkv in clip * clean up / rm is_deepstack_layers for simplification * add test model * move test model to "big" section * fix imrope check * remove trailing whitespace * fix rope fail * metal : add imrope support * add imrope support for sycl * vulkan: add imrope w/o check * fix vulkan * webgpu: add imrope w/o check * Update gguf-py/gguf/tensor_mapping.py Co-authored-by: Sigbjørn Skjæret * fix tensor mapping --------- Co-authored-by: Thireus ☠ Co-authored-by: yairpatch Co-authored-by: LETS-BEE Co-authored-by: Xuan Son Nguyen Co-authored-by: Georgi Gerganov Co-authored-by: Sigbjørn Skjæret --- convert_hf_to_gguf.py | 219 ++++++++++- ggml/include/ggml.h | 1 + ggml/src/ggml-cpu/ops.cpp | 36 +- ggml/src/ggml-cuda/rope.cu | 47 ++- ggml/src/ggml-metal/ggml-metal-device.cpp | 13 +- ggml/src/ggml-metal/ggml-metal-impl.h | 1 + ggml/src/ggml-metal/ggml-metal.metal | 28 +- ggml/src/ggml-sycl/rope.cpp | 47 ++- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 5 +- .../ggml-vulkan/vulkan-shaders/rope_head.glsl | 1 + .../vulkan-shaders/rope_multi.comp | 34 +- .../ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl | 49 ++- gguf-py/gguf/constants.py | 51 +++ gguf-py/gguf/gguf_writer.py | 6 + gguf-py/gguf/tensor_mapping.py | 16 + include/llama.h | 1 + src/llama-arch.cpp | 42 +++ src/llama-arch.h | 3 + src/llama-hparams.cpp | 2 +- src/llama-hparams.h | 3 + src/llama-kv-cache.cpp | 2 +- src/llama-model.cpp | 352 +++++++++++++++++- tests/test-backend-ops.cpp | 7 +- tests/test-rope.cpp | 4 +- tools/mtmd/clip-impl.h | 6 + tools/mtmd/clip.cpp | 243 +++++++++++- tools/mtmd/mtmd.cpp | 2 +- tools/mtmd/tests.sh | 1 + 28 files changed, 1125 insertions(+), 97 deletions(-) diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index 0fd8d5681d7..5abc1779588 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -3852,7 +3852,43 @@ def set_gguf_parameters(self): def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: # process the experts separately name = name.replace("language_model.", "") # InternVL - if name.startswith("mlp") or name.startswith("vision_model") or name.startswith("model.vision_tower") or name.startswith("model.multi_modal_projector"): + + # handle aggregated expert tensors + # GGUF stores dimensions reversed from PyTorch, so: + # PyTorch (A,B,C) -> GGUF writes [C,B,A] -> GGML reads ne={C,B,A} + # Input shapes from HF: (n_expert, n_ff_exp, n_embd) or (n_expert, n_embd, n_ff_exp) + # Expected GGML ne: {n_embd, n_ff_exp, n_expert} for gate/up, {n_ff_exp, n_embd, n_expert} for down + if name.endswith("mlp.experts.down_proj") or name.endswith("mlp.experts.down_proj.weight"): + mapped = f"{name}.weight" if not name.endswith(".weight") else name + # Input: (n_expert=128, n_ff_exp=768, n_embd=2048) + # Want GGML ne: {n_ff_exp, n_embd, n_expert} = {768, 2048, 128} + # Need PyTorch: (128, 2048, 768) [reversed of GGML] + # So: permute(0, 2, 1): (128, 768, 2048) -> (128, 2048, 768) + permuted = data_torch.permute(0, 2, 1).contiguous() + return [(self.map_tensor_name(mapped), permuted)] + + if name.endswith("mlp.experts.gate_up_proj") or name.endswith("mlp.experts.gate_up_proj.weight"): + if data_torch.ndim < 3 or data_torch.shape[-1] % 2 != 0: + raise ValueError(f"Unexpected gate_up_proj shape for {name}: {tuple(data_torch.shape)}") + split_dim = data_torch.shape[-1] // 2 + gate = data_torch[..., :split_dim].contiguous() + up = data_torch[..., split_dim:].contiguous() + # Input gate/up: (n_expert=128, n_embd=2048, n_ff_exp=768) + # Want GGML ne: {n_embd, n_ff_exp, n_expert} = {2048, 768, 128} + # Need PyTorch: (128, 768, 2048) [reversed of GGML] + # So: permute(0, 2, 1): (128, 2048, 768) -> (128, 768, 2048) + base_name = name.removesuffix(".weight") + base = base_name.rsplit('.', 1)[0] + mapped_gate = f"{base}.gate_proj.weight" + mapped_up = f"{base}.up_proj.weight" + perm_gate = gate.permute(0, 2, 1).contiguous() + perm_up = up.permute(0, 2, 1).contiguous() + return [ + (self.map_tensor_name(mapped_gate), perm_gate), + (self.map_tensor_name(mapped_up), perm_up), + ] + + if name.startswith("mlp") or name.startswith("vision_model") or name.startswith("model.vision_tower") or name.startswith("model.multi_modal_projector") or name.startswith("model.visual"): # skip visual tensors return [] if name.find("experts") != -1: @@ -4004,6 +4040,187 @@ def set_vocab(self): super().set_vocab() +@ModelBase.register("Qwen3VLForConditionalGeneration", "Qwen3VLMoeForConditionalGeneration") +class Qwen3VLVisionModel(MmprojModel): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + assert self.hparams_vision is not None + # Compute image_size if not present + if "image_size" not in self.hparams_vision: + # For Qwen3VL/Qwen3VLMoe, compute from num_position_embeddings + num_pos = self.hparams_vision.get("num_position_embeddings", 2304) + patch_size = self.hparams_vision.get("patch_size", 16) + # num_position_embeddings = (image_size / patch_size) ** 2 + # So image_size = sqrt(num_position_embeddings) * patch_size + image_size = int(num_pos**0.5 * patch_size) + self.hparams_vision["image_size"] = image_size + + # Rename config values for compatibility + self.hparams_vision["num_attention_heads"] = self.hparams_vision.get("num_heads") + self.hparams_vision["num_hidden_layers"] = self.hparams_vision.get("depth") + + self.is_deepstack_layers = [False] * int(self.hparams_vision["num_hidden_layers"] or 0) + for idx in self.hparams_vision.get("deepstack_visual_indexes", []): + self.is_deepstack_layers[idx] = True + + def set_gguf_parameters(self): + super().set_gguf_parameters() + self.gguf_writer.add_clip_projector_type(gguf.VisionProjectorType.QWEN3VL) + self.gguf_writer.add_vision_use_gelu(True) + + if self.hparams_vision is not None: + merge_size = self.hparams_vision.get("spatial_merge_size") + if merge_size is not None: + self.gguf_writer.add_vision_spatial_merge_size(int(merge_size)) + + # Use text config's rms_norm_eps for vision attention layernorm eps + rms_norm_eps = self.global_config.get("text_config", {}).get("rms_norm_eps", 1e-6) + self.gguf_writer.add_vision_attention_layernorm_eps(rms_norm_eps) + + if self.is_deepstack_layers: + self.gguf_writer.add_vision_is_deepstack_layers(self.is_deepstack_layers) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + assert self.hparams_vision is not None + # Skip text model tensors - they go in the text model file + if name.startswith("model.language_model.") or name.startswith("lm_head."): + return [] + + if name.startswith("model.visual."): + name = name.replace("model.visual.", "visual.", 1) + + if name.startswith("visual.deepstack_merger_list."): + prefix, rest = name.split(".", maxsplit=3)[2:] + # prefix is the layer index, convert to absolute clip layer index! + idx = self.hparams_vision.get("deepstack_visual_indexes", [])[int(prefix)] + target = rest + + tensor_type: gguf.MODEL_TENSOR + if target.startswith("norm."): + tensor_type = gguf.MODEL_TENSOR.V_DS_NORM + suffix = target.split(".", 1)[1] + elif target.startswith("linear_fc1."): + tensor_type = gguf.MODEL_TENSOR.V_DS_FC1 + suffix = target.split(".", 1)[1] + elif target.startswith("linear_fc2."): + tensor_type = gguf.MODEL_TENSOR.V_DS_FC2 + suffix = target.split(".", 1)[1] + else: + raise ValueError(f"Unexpected deepstack tensor: {name}") + + new_name = self.format_tensor_name(tensor_type, idx, suffix=f".{suffix}") + return [(new_name, data_torch)] + + if name.startswith("visual.merger."): + suffix = name.split(".", 2)[2] + if suffix.startswith("linear_fc"): + fc_idx_str, tail = suffix.split(".", 1) + fc_num = int(fc_idx_str.replace("linear_fc", "")) + # Qwen3VL has linear_fc1 and linear_fc2 + # Map to indices 0 and 2 (matching Qwen2VL which uses indices 0 and 2) + if fc_num == 1: + fc_idx = 0 + elif fc_num == 2: + fc_idx = 2 + else: + raise ValueError(f"unexpected fc index {fc_num} in {name}") + new_name = self.format_tensor_name(gguf.MODEL_TENSOR.V_MMPROJ, fc_idx, suffix=f".{tail}") + elif suffix.startswith("norm."): + new_name = self.format_tensor_name(gguf.MODEL_TENSOR.V_POST_NORM, suffix=f".{suffix.split('.', 1)[1]}") + else: + raise ValueError(f"Unexpected merger tensor: {name}") + return [(new_name, data_torch)] + + if name == "visual.patch_embed.proj.weight": + # split Conv3D into Conv2Ds along temporal dimension + c1, c2, kt, _, _ = data_torch.shape + del c1, c2 + if kt != 2: + raise ValueError("Current implementation only supports temporal_patch_size of 2") + return [ + (gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_ENC_EMBD_PATCH] + ".weight", data_torch[:, :, 0, ...]), + (gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_ENC_EMBD_PATCH] + ".weight.1", data_torch[:, :, 1, ...]), + ] + + if name == "visual.patch_embed.proj.bias": + # Include the bias - it's used by the C++ code + return [(gguf.TENSOR_NAMES[gguf.MODEL_TENSOR.V_ENC_EMBD_PATCH] + ".bias", data_torch)] + + if name.startswith("visual."): + return [(self.map_tensor_name(name), data_torch)] + + # Fall back to parent class for other tensors + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Qwen3VLForConditionalGeneration") +class Qwen3VLTextModel(Qwen3Model): + model_arch = gguf.MODEL_ARCH.QWEN3VL + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + # Handle MRoPE (Multi-axis Rotary Position Embedding) for Qwen3-VL + text_config = self.hparams.get("text_config", {}) + # rope_scaling is deprecated in V5, use rope_parameters instead + rope_scaling = text_config.get("rope_scaling") or text_config.get("rope_parameters") or {} + + if rope_scaling.get("mrope_section"): + # mrope_section contains [time, height, width] dimensions + mrope_section = rope_scaling["mrope_section"] + # Pad to 4 dimensions [time, height, width, extra] + while len(mrope_section) < 4: + mrope_section.append(0) + self.gguf_writer.add_rope_dimension_sections(mrope_section[:4]) + + logger.info(f"MRoPE sections: {mrope_section[:4]}") + + vision_config = self.hparams.get("vision_config", {}) + deepstack_layer_num = len(vision_config.get("deepstack_visual_indexes", [])) + self.gguf_writer.add_num_deepstack_layers(deepstack_layer_num) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # Skip vision tensors - they go in the mmproj file + if name.startswith("model.visual."): + return [] + + return super().modify_tensors(data_torch, name, bid) + + +@ModelBase.register("Qwen3VLMoeForConditionalGeneration") +class Qwen3VLMoeTextModel(Qwen3MoeModel): + model_arch = gguf.MODEL_ARCH.QWEN3VLMOE + + def set_gguf_parameters(self): + super().set_gguf_parameters() + + # Handle MRoPE (Multi-axis Rotary Position Embedding) for Qwen3-VL + text_config = self.hparams.get("text_config", {}) + # rope_scaling is deprecated in V5, use rope_parameters instead + rope_scaling = text_config.get("rope_scaling") or text_config.get("rope_parameters") or {} + + if rope_scaling.get("mrope_section"): + # mrope_section contains [time, height, width] dimensions + mrope_section = rope_scaling["mrope_section"] + # Pad to 4 dimensions [time, height, width, extra] + while len(mrope_section) < 4: + mrope_section.append(0) + self.gguf_writer.add_rope_dimension_sections(mrope_section[:4]) + + logger.info(f"MRoPE sections: {mrope_section[:4]}") + + vision_config = self.hparams.get("vision_config", {}) + deepstack_layer_num = len(vision_config.get("deepstack_visual_indexes", [])) + self.gguf_writer.add_num_deepstack_layers(deepstack_layer_num) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None) -> Iterable[tuple[str, Tensor]]: + # Skip vision tensors - they go in the mmproj file + if name.startswith("model.visual."): + return [] + + return super().modify_tensors(data_torch, name, bid) + + @ModelBase.register("GPT2LMHeadModel") class GPT2Model(TextModel): model_arch = gguf.MODEL_ARCH.GPT2 diff --git a/ggml/include/ggml.h b/ggml/include/ggml.h index d948b00cc7f..2311cdabe3b 100644 --- a/ggml/include/ggml.h +++ b/ggml/include/ggml.h @@ -242,6 +242,7 @@ #define GGML_ROPE_TYPE_NEOX 2 #define GGML_ROPE_TYPE_MROPE 8 #define GGML_ROPE_TYPE_VISION 24 +#define GGML_ROPE_TYPE_IMROPE 40 // binary: 101000 #define GGML_MROPE_SECTIONS 4 diff --git a/ggml/src/ggml-cpu/ops.cpp b/ggml/src/ggml-cpu/ops.cpp index c17ab10245d..f66d36ff62c 100644 --- a/ggml/src/ggml-cpu/ops.cpp +++ b/ggml/src/ggml-cpu/ops.cpp @@ -5474,7 +5474,7 @@ static void ggml_rope_cache_init( } static void ggml_mrope_cache_init( - float theta_base_t, float theta_base_h, float theta_base_w, float theta_base_e, int sections[4], bool indep_sects, + float theta_base_t, float theta_base_h, float theta_base_w, float theta_base_e, int sections[4], bool is_imrope, bool indep_sects, float freq_scale, const float * freq_factors, float corr_dims[2], int64_t ne0, float ext_factor, float mscale, float * cache, float sin_sign, float theta_scale) { // ref: https://github.com/jquesnelle/yarn/blob/master/scaled_rope/LlamaYaRNScaledRotaryEmbedding.py @@ -5509,14 +5509,26 @@ static void ggml_mrope_cache_init( } float theta = theta_t; - if (sector >= sections[0] && sector < sec_w) { - theta = theta_h; - } - else if (sector >= sec_w && sector < sec_w + sections[2]) { - theta = theta_w; - } - else if (sector >= sec_w + sections[2]) { - theta = theta_e; + if (is_imrope) { // qwen3vl apply interleaved mrope + if (sector % 3 == 1 && sector < 3 * sections[1]) { + theta = theta_h; + } else if (sector % 3 == 2 && sector < 3 * sections[2]) { + theta = theta_w; + } else if (sector % 3 == 0 && sector < 3 * sections[0]) { + theta = theta_t; + } else { + theta = theta_e; + } + } else { + if (sector >= sections[0] && sector < sec_w) { + theta = theta_h; + } + else if (sector >= sec_w && sector < sec_w + sections[2]) { + theta = theta_w; + } + else if (sector >= sec_w + sections[2]) { + theta = theta_e; + } } rope_yarn( @@ -5589,6 +5601,7 @@ static void ggml_compute_forward_rope_f32( const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; // ggml_rope_multi, multimodal rotary position embedding + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; // qwen3vl apply interleaved mrope const bool is_vision = mode == GGML_ROPE_TYPE_VISION; if (is_mrope) { @@ -5627,7 +5640,7 @@ static void ggml_compute_forward_rope_f32( const int64_t p_w = pos[i2 + ne2 * 2]; const int64_t p_e = pos[i2 + ne2 * 3]; ggml_mrope_cache_init( - p_t, p_h, p_w, p_e, sections, is_vision, + p_t, p_h, p_w, p_e, sections, is_imrope, is_vision, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); } @@ -5775,6 +5788,7 @@ static void ggml_compute_forward_rope_f16( const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; const bool is_vision = mode == GGML_ROPE_TYPE_VISION; if (is_mrope) { @@ -5813,7 +5827,7 @@ static void ggml_compute_forward_rope_f16( const int64_t p_w = pos[i2 + ne2 * 2]; const int64_t p_e = pos[i2 + ne2 * 3]; ggml_mrope_cache_init( - p_t, p_h, p_w, p_e, sections, is_vision, + p_t, p_h, p_w, p_e, sections, is_imrope, is_vision, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); } diff --git a/ggml/src/ggml-cuda/rope.cu b/ggml/src/ggml-cuda/rope.cu index d058504cd6c..78ed7f519ab 100644 --- a/ggml/src/ggml-cuda/rope.cu +++ b/ggml/src/ggml-cuda/rope.cu @@ -125,7 +125,7 @@ template static __global__ void rope_multi( const T * x, T * dst, const int ne0, const int ne1, const int ne2, const int s1, const int s2, const int n_dims, const int32_t * pos, const float freq_scale, const float ext_factor, const float attn_factor, - const rope_corr_dims corr_dims, const float theta_scale, const float * freq_factors, const mrope_sections sections) { + const rope_corr_dims corr_dims, const float theta_scale, const float * freq_factors, const mrope_sections sections, const bool is_imrope) { const int i0 = 2*(blockDim.y*blockIdx.y + threadIdx.y); if (i0 >= ne0) { @@ -152,17 +152,29 @@ static __global__ void rope_multi( const int sector = (i0 / 2) % sect_dims; float theta_base = 0.0; - if (sector < sections.v[0]) { - theta_base = pos[channel_x]*powf(theta_scale, i0/2.0f); - } - else if (sector >= sections.v[0] && sector < sec_w) { - theta_base = pos[channel_x + ne2 * 1]*powf(theta_scale, i0/2.0f); - } - else if (sector >= sec_w && sector < sec_w + sections.v[2]) { - theta_base = pos[channel_x + ne2 * 2]*powf(theta_scale, i0/2.0f); - } - else if (sector >= sec_w + sections.v[2]) { - theta_base = pos[channel_x + ne2 * 3]*powf(theta_scale, i0/2.0f); + if (is_imrope) { + if (sector % 3 == 1 && sector < 3 * sections.v[1]) { // h + theta_base = pos[channel_x + ne2 * 1]*powf(theta_scale, i0/2.0f); + } else if (sector % 3 == 2 && sector < 3 * sections.v[2]) { // w + theta_base = pos[channel_x + ne2 * 2]*powf(theta_scale, i0/2.0f); + } else if (sector % 3 == 0 && sector < 3 * sections.v[0]) { // t + theta_base = pos[channel_x]*powf(theta_scale, i0/2.0f); + } else { + theta_base = pos[channel_x + ne2 * 3]*powf(theta_scale, i0/2.0f); + } + } else { + if (sector < sections.v[0]) { + theta_base = pos[channel_x]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sections.v[0] && sector < sec_w) { + theta_base = pos[channel_x + ne2 * 1]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sec_w && sector < sec_w + sections.v[2]) { + theta_base = pos[channel_x + ne2 * 2]*powf(theta_scale, i0/2.0f); + } + else if (sector >= sec_w + sections.v[2]) { + theta_base = pos[channel_x + ne2 * 3]*powf(theta_scale, i0/2.0f); + } } const float freq_factor = has_ff ? freq_factors[i0/2] : 1.0f; @@ -276,7 +288,7 @@ template static void rope_multi_cuda( const T * x, T * dst, const int ne0, const int ne1, const int ne2, const int s1, const int s2, const int n_dims, const int nr, const int32_t * pos, const float freq_scale, const float freq_base, const float ext_factor, const float attn_factor, - const rope_corr_dims corr_dims, const float * freq_factors, const mrope_sections sections, cudaStream_t stream) { + const rope_corr_dims corr_dims, const float * freq_factors, const mrope_sections sections, const bool is_imrope, cudaStream_t stream) { GGML_ASSERT(ne0 % 2 == 0); const dim3 block_dims(1, CUDA_ROPE_BLOCK_SIZE, 1); const int n_blocks_x = (ne0 + 2*CUDA_ROPE_BLOCK_SIZE - 1) / (2*CUDA_ROPE_BLOCK_SIZE); @@ -287,11 +299,11 @@ static void rope_multi_cuda( if (freq_factors == nullptr) { rope_multi<<>>( x, dst, ne0, ne1, ne2, s1, s2, n_dims, pos, freq_scale, ext_factor, - attn_factor, corr_dims, theta_scale, freq_factors, sections); + attn_factor, corr_dims, theta_scale, freq_factors, sections, is_imrope); } else { rope_multi<<>>( x, dst, ne0, ne1, ne2, s1, s2, n_dims, pos, freq_scale, ext_factor, - attn_factor, corr_dims, theta_scale, freq_factors, sections); + attn_factor, corr_dims, theta_scale, freq_factors, sections, is_imrope); } } @@ -369,6 +381,7 @@ void ggml_cuda_op_rope_impl(ggml_backend_cuda_context & ctx, ggml_tensor * dst) const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; const bool is_vision = mode == GGML_ROPE_TYPE_VISION; if (is_mrope) { @@ -406,11 +419,11 @@ void ggml_cuda_op_rope_impl(ggml_backend_cuda_context & ctx, ggml_tensor * dst) if (src0->type == GGML_TYPE_F32) { rope_multi_cuda( (const float *) src0_d, (float *) dst_d, ne00, ne01, ne02, s01, s02, n_dims, nr, pos, freq_scale, - freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); + freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, is_imrope, stream); } else if (src0->type == GGML_TYPE_F16) { rope_multi_cuda( (const half *) src0_d, (half *) dst_d, ne00, ne01, ne02, s01, s02, n_dims, nr, pos, freq_scale, - freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, stream); + freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, is_imrope, stream); } else { GGML_ABORT("fatal error"); } diff --git a/ggml/src/ggml-metal/ggml-metal-device.cpp b/ggml/src/ggml-metal/ggml-metal-device.cpp index 75811634227..1a3c7873b74 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.cpp +++ b/ggml/src/ggml-metal/ggml-metal-device.cpp @@ -1332,11 +1332,12 @@ ggml_metal_pipeline_t ggml_metal_library_get_pipeline_rope(ggml_metal_library_t const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; const bool is_vision = mode == GGML_ROPE_TYPE_VISION; if (is_neox) { snprintf(base, 256, "kernel_rope_neox_%s", ggml_type_name(op->src[0]->type)); - } else if (is_mrope && !is_vision) { + } else if ((is_mrope || is_imrope) && !is_vision) { GGML_ASSERT(op->src[1]->ne[0]*4 >= op->src[0]->ne[2]); // need at least 4 pos per token snprintf(base, 256, "kernel_rope_multi_%s", ggml_type_name(op->src[0]->type)); } else if (is_vision) { @@ -1346,14 +1347,20 @@ ggml_metal_pipeline_t ggml_metal_library_get_pipeline_rope(ggml_metal_library_t snprintf(base, 256, "kernel_rope_norm_%s", ggml_type_name(op->src[0]->type)); } - snprintf(name, 256, "%s", base); + snprintf(name, 256, "%s_imrope=%d", base, is_imrope ? 1 : 0); ggml_metal_pipeline_t res = ggml_metal_library_get_pipeline(lib, name); if (res) { return res; } - res = ggml_metal_library_compile_pipeline(lib, base, name, nullptr); + ggml_metal_cv_t cv = ggml_metal_cv_init(); + + ggml_metal_cv_set_bool(cv, is_imrope, FC_ROPE + 0); + + res = ggml_metal_library_compile_pipeline(lib, base, name, cv); + + ggml_metal_cv_free(cv); return res; } diff --git a/ggml/src/ggml-metal/ggml-metal-impl.h b/ggml/src/ggml-metal/ggml-metal-impl.h index 96f43d260a3..7a878a657bc 100644 --- a/ggml/src/ggml-metal/ggml-metal-impl.h +++ b/ggml/src/ggml-metal/ggml-metal-impl.h @@ -76,6 +76,7 @@ #define FC_FLASH_ATTN_EXT_VEC_REDUCE 500 #define FC_MUL_MV 600 #define FC_MUL_MM 700 +#define FC_ROPE 800 // op-specific constants #define OP_FLASH_ATTN_EXT_NQPTG 8 diff --git a/ggml/src/ggml-metal/ggml-metal.metal b/ggml/src/ggml-metal/ggml-metal.metal index 2c2f0141514..fa839a1df6e 100644 --- a/ggml/src/ggml-metal/ggml-metal.metal +++ b/ggml/src/ggml-metal/ggml-metal.metal @@ -3709,6 +3709,8 @@ template [[host_name("kernel_mul_mv_bf16_f32_short")]] kernel mul_mv_t_t_short_ template [[host_name("kernel_mul_mv_bf16_bf16_short")]] kernel mul_mv_t_t_short_t kernel_mul_mv_t_t_short; #endif +constant bool FC_rope_is_imrope [[function_constant(FC_ROPE + 0)]]; + static float rope_yarn_ramp(const float low, const float high, const int i0) { const float y = (i0 / 2 - low) / max(0.001f, high - low); return 1.0f - min(1.0f, max(0.0f, y)); @@ -3889,14 +3891,26 @@ kernel void kernel_rope_multi( const int sector = ic % sect_dims; float theta_base; - if (sector < args.sect_0) { - theta_base = (float) pos[i2]; - } else if (sector < sec_w01) { - theta_base = (float) pos[i2 + args.ne02]; - } else if (sector < sec_w012) { - theta_base = (float) pos[i2 + args.ne02 * 2]; + if (FC_rope_is_imrope) { + if (sector % 3 == 1 && sector < 3 * args.sect_1) { // h + theta_base = (float) pos[i2 + args.ne02 * 1]; + } else if (sector % 3 == 2 && sector < 3 * args.sect_2) { // w + theta_base = (float) pos[i2 + args.ne02 * 2]; + } else if (sector % 3 == 0 && sector < 3 * args.sect_0) { // t + theta_base = (float) pos[i2 + args.ne02 * 0]; + } else { // e + theta_base = (float) pos[i2 + args.ne02 * 3]; + } } else { - theta_base = (float) pos[i2 + args.ne02 * 3]; + if (sector < args.sect_0) { + theta_base = (float) pos[i2]; + } else if (sector < sec_w01) { + theta_base = (float) pos[i2 + args.ne02 * 1]; + } else if (sector < sec_w012) { + theta_base = (float) pos[i2 + args.ne02 * 2]; + } else { + theta_base = (float) pos[i2 + args.ne02 * 3]; + } } // end of mrope diff --git a/ggml/src/ggml-sycl/rope.cpp b/ggml/src/ggml-sycl/rope.cpp index a3ab703d1f0..69140b19a4c 100644 --- a/ggml/src/ggml-sycl/rope.cpp +++ b/ggml/src/ggml-sycl/rope.cpp @@ -119,7 +119,7 @@ static void rope_multi(const T * x, T * dst, const int ne0, const int ne1, const const size_t s2, const int n_dims, const int32_t * pos, const float freq_scale, const float ext_factor, const float attn_factor, const rope_corr_dims corr_dims, const float theta_scale, const float * freq_factors, const mrope_sections sections, - const sycl::nd_item<3> & item_ct1) { + const bool is_imrope, const sycl::nd_item<3> & item_ct1) { // get index pos const int i0 = 2 * (item_ct1.get_group(1) * item_ct1.get_local_range(1) + item_ct1.get_local_id(1)); if (i0 >= ne0) { @@ -143,17 +143,29 @@ static void rope_multi(const T * x, T * dst, const int ne0, const int ne1, const float theta_base = 0.0; - if (sector < sections.v[0]) { - theta_base = pos[channel_x]*sycl::pow(theta_scale, i0/2.0f); - } - else if (sector >= sections.v[0] && sector < sec_w) { - theta_base = pos[channel_x + ne2 * 1]*sycl::pow(theta_scale, i0/2.0f); - } - else if (sector >= sec_w && sector < sec_w + sections.v[2]) { - theta_base = pos[channel_x + ne2 * 2]*sycl::pow(theta_scale, i0/2.0f); - } - else if (sector >= sec_w + sections.v[2]) { - theta_base = pos[channel_x + ne2 * 3]*sycl::pow(theta_scale, i0/2.0f); + if (is_imrope) { + if (sector % 3 == 1 && sector < 3 * sections.v[1]) { + theta_base = pos[channel_x + ne2 * 1]*sycl::pow(theta_scale, i0/2.0f); + } else if (sector % 3 == 2 && sector < 3 * sections.v[2]) { + theta_base = pos[channel_x + ne2 * 2]*sycl::pow(theta_scale, i0/2.0f); + } else if (sector % 3 == 0 && sector < 3 * sections.v[0]) { + theta_base = pos[channel_x]*sycl::pow(theta_scale, i0/2.0f); + } else { + theta_base = pos[channel_x + ne2 * 3]*sycl::pow(theta_scale, i0/2.0f); + } + } else { + if (sector < sections.v[0]) { + theta_base = pos[channel_x]*sycl::pow(theta_scale, i0/2.0f); + } + else if (sector >= sections.v[0] && sector < sec_w) { + theta_base = pos[channel_x + ne2 * 1]*sycl::pow(theta_scale, i0/2.0f); + } + else if (sector >= sec_w && sector < sec_w + sections.v[2]) { + theta_base = pos[channel_x + ne2 * 2]*sycl::pow(theta_scale, i0/2.0f); + } + else if (sector >= sec_w + sections.v[2]) { + theta_base = pos[channel_x + ne2 * 3]*sycl::pow(theta_scale, i0/2.0f); + } } const float freq_factor = has_ff ? freq_factors[i0 / 2] : 1.0f; @@ -281,7 +293,7 @@ static void rope_multi_sycl(const T * x, T * dst, const int ne0, const int ne1, const size_t s2, const int n_dims, const int nr, const int32_t * pos, const float freq_scale, const float freq_base, const float ext_factor, const float attn_factor, const rope_corr_dims corr_dims, const float * freq_factors, - const mrope_sections sections, queue_ptr stream) { + const mrope_sections sections, const bool is_imrope, queue_ptr stream) { GGML_ASSERT(ne0 % 2 == 0); const sycl::range<3> block_dims(1, SYCL_ROPE_BLOCK_SIZE, 1); const int n_blocks_y = ceil_div(ne0, (2 * SYCL_ROPE_BLOCK_SIZE)); @@ -297,12 +309,12 @@ static void rope_multi_sycl(const T * x, T * dst, const int ne0, const int ne1, if (freq_factors == nullptr) { stream->parallel_for(nd_range, [=](sycl::nd_item<3> item_ct1) { rope_multi(x, dst, ne0, ne1, ne2, s1, s2, n_dims, pos, freq_scale, ext_factor, attn_factor, - corr_dims, theta_scale, freq_factors, sections, item_ct1); + corr_dims, theta_scale, freq_factors, sections, is_imrope, item_ct1); }); } else { stream->parallel_for(nd_range, [=](sycl::nd_item<3> item_ct1) { rope_multi(x, dst, ne0, ne1, ne2, s1, s2, n_dims, pos, freq_scale, ext_factor, attn_factor, - corr_dims, theta_scale, freq_factors, sections, item_ct1); + corr_dims, theta_scale, freq_factors, sections, is_imrope, item_ct1); }); } } @@ -381,6 +393,7 @@ inline void ggml_sycl_op_rope(ggml_backend_sycl_context & ctx, ggml_tensor *dst) const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; const bool is_vision = mode == GGML_ROPE_TYPE_VISION; if (is_mrope) { @@ -422,11 +435,11 @@ inline void ggml_sycl_op_rope(ggml_backend_sycl_context & ctx, ggml_tensor *dst) if (dst->src[0]->type == GGML_TYPE_F16) { rope_multi_sycl((const sycl::half *)dst->src[0]->data, (sycl::half *)dst->data, ne00, ne01, ne02, s01, s02, n_dims, nr, pos, freq_scale, freq_base, ext_factor, attn_factor, corr_dims, - freq_factors, sections, main_stream); + freq_factors, sections, is_imrope, main_stream); } else if (dst->src[0]->type == GGML_TYPE_F32) { rope_multi_sycl((const float *) dst->src[0]->data, (float *) dst->data, ne00, ne01, ne02, s01, s02, n_dims, nr, pos, freq_scale, freq_base, ext_factor, attn_factor, corr_dims, freq_factors, sections, - main_stream); + is_imrope, main_stream); } else { GGML_ABORT("Fatal error: Tensor type unsupported!"); } diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index d0976519f26..b61879aa5d3 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -1056,6 +1056,7 @@ struct vk_op_rope_push_constants { uint32_t s1; uint32_t s2; int32_t sections[4]; + uint32_t is_imrope; uint32_t is_back; uint32_t set_rows_stride; }; @@ -9927,6 +9928,8 @@ static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, cons memcpy(sections, (int32_t *) dst->op_params + 11, sizeof(int)*4); } + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; + float corr_dims[2]; ggml_rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims); @@ -9948,7 +9951,7 @@ static void ggml_vk_rope(ggml_backend_vk_context * ctx, vk_context& subctx, cons (uint32_t)src0->ne[0], (uint32_t)n_dims, freq_scale, (uint32_t)src0->ne[1], freq_base, ext_factor, attn_factor, {corr_dims[0], corr_dims[1]}, theta_scale, src2 != nullptr, (uint32_t)src0->ne[2], s1, s2, - { sections[0], sections[1], sections[2], sections[3] }, backprop, set_rows_stride, + { sections[0], sections[1], sections[2], sections[3] }, is_imrope, backprop, set_rows_stride, }, dryrun); } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl index 0eda186c8a3..fa2bb33394c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_head.glsl @@ -27,6 +27,7 @@ layout (push_constant) uniform parameter { uint s1; uint s2; int sections[4]; + uint is_imrope; uint is_back; uint set_rows_stride; } p; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp b/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp index 111286b4988..54aabcf2228 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/rope_multi.comp @@ -32,17 +32,29 @@ void main() { const uint sector = (i0 / 2) % sect_dims; float theta_base = 0.0; - if (sector < p.sections[0]) { - theta_base = data_pos[channel_x]*pow(p.theta_scale, i0/2.0f); - } - else if (sector >= p.sections[0] && sector < sec_w) { - theta_base = data_pos[channel_x + ne2 * 1]*pow(p.theta_scale, i0/2.0f); - } - else if (sector >= sec_w && sector < sec_w + p.sections[2]) { - theta_base = data_pos[channel_x + ne2 * 2]*pow(p.theta_scale, i0/2.0f); - } - else if (sector >= sec_w + p.sections[2]) { - theta_base = data_pos[channel_x + ne2 * 3]*pow(p.theta_scale, i0/2.0f); + if (p.is_imrope != 0) { + if (sector % 3 == 1 && sector < 3 * p.sections[1]) { + theta_base = data_pos[channel_x + ne2 * 1]*pow(p.theta_scale, i0/2.0f); + } else if (sector % 3 == 2 && sector < 3 * p.sections[2]) { + theta_base = data_pos[channel_x + ne2 * 2]*pow(p.theta_scale, i0/2.0f); + } else if (sector % 3 == 0 && sector < 3 * p.sections[0]) { + theta_base = data_pos[channel_x]*pow(p.theta_scale, i0/2.0f); + } else { + theta_base = data_pos[channel_x + ne2 * 3]*pow(p.theta_scale, i0/2.0f); + } + } else { + if (sector < p.sections[0]) { + theta_base = data_pos[channel_x]*pow(p.theta_scale, i0/2.0f); + } + else if (sector >= p.sections[0] && sector < sec_w) { + theta_base = data_pos[channel_x + ne2 * 1]*pow(p.theta_scale, i0/2.0f); + } + else if (sector >= sec_w && sector < sec_w + p.sections[2]) { + theta_base = data_pos[channel_x + ne2 * 2]*pow(p.theta_scale, i0/2.0f); + } + else if (sector >= sec_w + p.sections[2]) { + theta_base = data_pos[channel_x + ne2 * 3]*pow(p.theta_scale, i0/2.0f); + } } const float freq_factor = p.has_ff != 0 ? data_ff[i0/2] : 1.0f; diff --git a/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl b/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl index 9a6ff41128b..84dc8dbff61 100644 --- a/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl +++ b/ggml/src/ggml-webgpu/wgsl-shaders/rope.tmpl.wgsl @@ -221,6 +221,7 @@ fn main(@builtin(global_invocation_id) gid: vec3) { let is_neox = bool(params.mode & 2); let is_mrope = bool(params.mode & 8); + let is_imrope = params.mode == 40; let is_vision = params.mode == 24; var i = gid.x * 2; // start index for this thread @@ -248,24 +249,36 @@ fn main(@builtin(global_invocation_id) gid: vec3) { let sec_w = params.sections1 + params.sections0; let sec_e = params.sections2 + sec_w; let sector = (i0 / 2) % sect_dims; - if (sector >= params.sections0 && sector < sec_w) { - theta_base_mult = 1; - if (is_vision) { - theta_scale_pwr = sector - params.sections0; - } - } else if (sector >= sec_w && sector < sec_e) { - theta_base_mult = 2; - if (is_vision) { - theta_scale_pwr = sector - sec_w; - } - } else if (sector >= sec_e) { - if (is_vision) { - theta_scale_pwr = sector - sec_e; - theta_scale_pwr = (i0 / 2) % sec_e; - } - theta_base_mult = 3; - } else if (is_vision) { - theta_scale_pwr = sector; + if (is_imrope) { + if (sector % 3 == 1 && sector < 3 * params.sections1) { + theta_base_mult = 1; + } else if (sector % 3 == 2 && sector < 3 * params.sections2) { + theta_base_mult = 2; + } else if (sector % 3 == 0 && sector < 3 * params.sections0) { + theta_base_mult = 0; + } else { + theta_base_mult = 3; + } + } else { + if (sector >= params.sections0 && sector < sec_w) { + theta_base_mult = 1; + if (is_vision) { + theta_scale_pwr = sector - params.sections0; + } + } else if (sector >= sec_w && sector < sec_e) { + theta_base_mult = 2; + if (is_vision) { + theta_scale_pwr = sector - sec_w; + } + } else if (sector >= sec_e) { + if (is_vision) { + theta_scale_pwr = sector - sec_e; + theta_scale_pwr = (i0 / 2) % sec_e; + } + theta_base_mult = 3; + } else if (is_vision) { + theta_scale_pwr = sector; + } } } let theta_base = f32(src1[params.offset_src1 + i2 + params.ne2 * theta_base_mult]) * pow(params.theta_scale, f32(theta_scale_pwr)); diff --git a/gguf-py/gguf/constants.py b/gguf-py/gguf/constants.py index a0c08f69172..d75ac704fed 100644 --- a/gguf-py/gguf/constants.py +++ b/gguf-py/gguf/constants.py @@ -111,6 +111,7 @@ class LLM: EXPERTS_PER_GROUP = "{arch}.experts_per_group" MOE_EVERY_N_LAYERS = "{arch}.moe_every_n_layers" NEXTN_PREDICT_LAYERS = "{arch}.nextn_predict_layers" + NUM_DEEPSTACK_LAYERS = "{arch}.n_deepstack_layers" POOLING_TYPE = "{arch}.pooling_type" LOGIT_SCALE = "{arch}.logit_scale" DECODER_START_TOKEN_ID = "{arch}.decoder_start_token_id" @@ -277,6 +278,7 @@ class ClipVision: USE_GELU = "clip.use_gelu" USE_SILU = "clip.use_silu" N_WA_PATTERN = "clip.vision.n_wa_pattern" # used by qwen2.5vl + IS_DEEPSTACK_LAYERS = "clip.vision.is_deepstack_layers" class Attention: HEAD_COUNT = "clip.vision.attention.head_count" @@ -350,6 +352,8 @@ class MODEL_ARCH(IntEnum): QWEN2VL = auto() QWEN3 = auto() QWEN3MOE = auto() + QWEN3VL = auto() + QWEN3VLMOE = auto() PHI2 = auto() PHI3 = auto() PHIMOE = auto() @@ -431,6 +435,7 @@ class VISION_PROJECTOR_TYPE(IntEnum): GLM_EDGE = auto() MERGER = auto() GEMMA3 = auto() + QWEN3VL = auto() COGVLM = auto() @@ -648,6 +653,9 @@ class MODEL_TENSOR(IntEnum): V_RESMPL_QUERY = auto() # minicpmv V_TOK_EMBD_IMG_BREAK = auto() # pixtral V_MM_PATCH_MERGER = auto() # mistral small 3.1 + V_DS_NORM = auto() # qwen3vl + V_DS_FC1 = auto() # qwen3vl + V_DS_FC2 = auto() # qwen3vl V_MM_POST_FC_NORM = auto() # cogvlm V_MM_UP = auto() # cogvlm V_MM_DOWN = auto() # cogvlm @@ -709,6 +717,8 @@ class MODEL_TENSOR(IntEnum): MODEL_ARCH.QWEN2VL: "qwen2vl", MODEL_ARCH.QWEN3: "qwen3", MODEL_ARCH.QWEN3MOE: "qwen3moe", + MODEL_ARCH.QWEN3VL: "qwen3vl", + MODEL_ARCH.QWEN3VLMOE: "qwen3vlmoe", MODEL_ARCH.PHI2: "phi2", MODEL_ARCH.PHI3: "phi3", MODEL_ARCH.PHIMOE: "phimoe", @@ -1007,6 +1017,9 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_RESMPL_QUERY: "resampler.query", MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK: "v.token_embd.img_break", # pixtral MODEL_TENSOR.V_MM_PATCH_MERGER: "mm.patch_merger", # mistral small 3.1 + MODEL_TENSOR.V_DS_NORM: "v.deepstack.{bid}.norm", + MODEL_TENSOR.V_DS_FC1: "v.deepstack.{bid}.fc1", + MODEL_TENSOR.V_DS_FC2: "v.deepstack.{bid}.fc2", MODEL_TENSOR.V_MM_POST_FC_NORM: "mm.post_fc_norm", # cogvlm MODEL_TENSOR.V_MM_UP: "mm.up", MODEL_TENSOR.V_MM_DOWN: "mm.down", @@ -1082,6 +1095,9 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.V_RESMPL_QUERY, MODEL_TENSOR.V_TOK_EMBD_IMG_BREAK, MODEL_TENSOR.V_MM_PATCH_MERGER, + MODEL_TENSOR.V_DS_NORM, + MODEL_TENSOR.V_DS_FC1, + MODEL_TENSOR.V_DS_FC2, MODEL_TENSOR.V_MM_POST_FC_NORM, MODEL_TENSOR.V_MM_UP, MODEL_TENSOR.V_MM_DOWN, @@ -1529,6 +1545,40 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.FFN_DOWN_EXP, MODEL_TENSOR.FFN_UP_EXP, ], + MODEL_ARCH.QWEN3VL: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ROPE_FREQS, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_Q_NORM, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_K_NORM, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE, + MODEL_TENSOR.FFN_DOWN, + MODEL_TENSOR.FFN_UP, + ], + MODEL_ARCH.QWEN3VLMOE: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_Q_NORM, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_K_NORM, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE_INP, + MODEL_TENSOR.FFN_GATE_EXP, + MODEL_TENSOR.FFN_DOWN_EXP, + MODEL_TENSOR.FFN_UP_EXP, + ], MODEL_ARCH.PLAMO: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.OUTPUT_NORM, @@ -3106,6 +3156,7 @@ class VisionProjectorType: LLAMA4 = "llama4" QWEN2VL = "qwen2vl_merger" QWEN25VL = "qwen2.5vl_merger" + QWEN3VL = "qwen3vl_merger" ULTRAVOX = "ultravox" INTERNVL = "internvl" QWEN2A = "qwen2a" # audio diff --git a/gguf-py/gguf/gguf_writer.py b/gguf-py/gguf/gguf_writer.py index d52d4f40f78..a051daeeb13 100644 --- a/gguf-py/gguf/gguf_writer.py +++ b/gguf-py/gguf/gguf_writer.py @@ -860,6 +860,9 @@ def add_attn_temperature_length(self, value: int) -> None: def add_pooling_type(self, value: PoolingType) -> None: self.add_uint32(Keys.LLM.POOLING_TYPE.format(arch=self.arch), value.value) + def add_num_deepstack_layers(self, count: int) -> None: + self.add_uint32(Keys.LLM.NUM_DEEPSTACK_LAYERS.format(arch=self.arch), count) + def add_rope_dimension_count(self, count: int) -> None: self.add_uint32(Keys.Rope.DIMENSION_COUNT.format(arch=self.arch), count) @@ -1071,6 +1074,9 @@ def add_vision_projector_scale_factor(self, value: int) -> None: def add_vision_n_wa_pattern(self, value: int) -> None: self.add_uint32(Keys.ClipVision.N_WA_PATTERN, value) + def add_vision_is_deepstack_layers(self, layers: Sequence[bool]) -> None: + self.add_array(Keys.ClipVision.IS_DEEPSTACK_LAYERS, layers) + # audio models def add_audio_projection_dim(self, value: int) -> None: diff --git a/gguf-py/gguf/tensor_mapping.py b/gguf-py/gguf/tensor_mapping.py index 37e6fc85d51..6fe6f22358c 100644 --- a/gguf-py/gguf/tensor_mapping.py +++ b/gguf-py/gguf/tensor_mapping.py @@ -1215,10 +1215,12 @@ class TensorNameMap: "model.vision_model.embeddings.position_embedding", # SmolVLM "vision_model.positional_embedding_vlm", # llama 4 "vision_tower.patch_embed.pos_emb", # kimi-vl + "visual.pos_embed", # qwen3vl "model.vision.patch_embedding.position_embedding", # cogvlm ), MODEL_TENSOR.V_ENC_ATTN_QKV: ( + "visual.blocks.{bid}.attn.qkv", # qwen3vl "model.vision.transformer.layers.{bid}.attention.query_key_value", # cogvlm ), @@ -1320,6 +1322,7 @@ class TensorNameMap: "vision_model.model.layers.{bid}.mlp.fc1", # llama4 "visual.blocks.{bid}.mlp.fc1", # qwen2vl "visual.blocks.{bid}.mlp.up_proj", # qwen2.5vl + "visual.blocks.{bid}.mlp.linear_fc1", # qwen3vl "vision_tower.encoder.blocks.{bid}.mlp.fc0", # kimi-vl (fc0/fc1) "model.vision.transformer.layers.{bid}.mlp.fc1", # cogvlm ), @@ -1340,6 +1343,7 @@ class TensorNameMap: "vision_model.model.layers.{bid}.mlp.fc2", # llama4 "visual.blocks.{bid}.mlp.fc2", # qwen2vl "visual.blocks.{bid}.mlp.down_proj", # qwen2.5vl + "visual.blocks.{bid}.mlp.linear_fc2", # qwen3vl "vision_tower.encoder.blocks.{bid}.mlp.fc1", # kimi-vl (fc0/fc1) "model.vision.transformer.layers.{bid}.mlp.fc2", # cogvlm ), @@ -1438,6 +1442,18 @@ class TensorNameMap: "patch_merger.merging_layer", # mistral ), + MODEL_TENSOR.V_DS_NORM: ( + "model.visual.deepstack_merger_list.{bid}.norm", # deepstack in qwen3vl + ), + + MODEL_TENSOR.V_DS_FC1: ( + "model.visual.deepstack_merger_list.{bid}.linear_fc1", # deepstack in qwen3vl + ), + + MODEL_TENSOR.V_DS_FC2: ( + "model.visual.deepstack_merger_list.{bid}.linear_fc2", # deepstack in qwen3vl + ), + MODEL_TENSOR.V_MM_POST_FC_NORM: ( "model.vision.linear_proj.norm1", # cogvlm ), diff --git a/include/llama.h b/include/llama.h index a0a660bff88..08e2ffa34c9 100644 --- a/include/llama.h +++ b/include/llama.h @@ -83,6 +83,7 @@ extern "C" { LLAMA_ROPE_TYPE_NORM = 0, LLAMA_ROPE_TYPE_NEOX = GGML_ROPE_TYPE_NEOX, LLAMA_ROPE_TYPE_MROPE = GGML_ROPE_TYPE_MROPE, + LLAMA_ROPE_TYPE_IMROPE = GGML_ROPE_TYPE_IMROPE, LLAMA_ROPE_TYPE_VISION = GGML_ROPE_TYPE_VISION, }; diff --git a/src/llama-arch.cpp b/src/llama-arch.cpp index ba45e88c08e..ad2880034c2 100644 --- a/src/llama-arch.cpp +++ b/src/llama-arch.cpp @@ -32,6 +32,8 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_QWEN2VL, "qwen2vl" }, { LLM_ARCH_QWEN3, "qwen3" }, { LLM_ARCH_QWEN3MOE, "qwen3moe" }, + { LLM_ARCH_QWEN3VL, "qwen3vl" }, + { LLM_ARCH_QWEN3VLMOE, "qwen3vlmoe" }, { LLM_ARCH_PHI2, "phi2" }, { LLM_ARCH_PHI3, "phi3" }, { LLM_ARCH_PHIMOE, "phimoe" }, @@ -146,6 +148,7 @@ static const std::map LLM_KV_NAMES = { { LLM_KV_EXPERTS_PER_GROUP, "%s.experts_per_group" }, { LLM_KV_MOE_EVERY_N_LAYERS, "%s.moe_every_n_layers" }, { LLM_KV_NEXTN_PREDICT_LAYERS, "%s.nextn_predict_layers" }, + { LLM_KV_NUM_DEEPSTACK_LAYERS, "%s.n_deepstack_layers" }, { LLM_KV_POOLING_TYPE, "%s.pooling_type" }, { LLM_KV_LOGIT_SCALE, "%s.logit_scale" }, { LLM_KV_DECODER_START_TOKEN_ID, "%s.decoder_start_token_id" }, @@ -780,6 +783,45 @@ static const std::map> LLM_TENSOR_N { LLM_TENSOR_FFN_UP_EXPS, "blk.%d.ffn_up_exps" }, }, }, + { + LLM_ARCH_QWEN3VL, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" }, + { LLM_TENSOR_ATTN_Q_NORM, "blk.%d.attn_q_norm" }, + { LLM_TENSOR_ATTN_K, "blk.%d.attn_k" }, + { LLM_TENSOR_ATTN_K_NORM, "blk.%d.attn_k_norm" }, + { LLM_TENSOR_ATTN_V, "blk.%d.attn_v" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE, "blk.%d.ffn_gate" }, + { LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" }, + { LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" }, + }, + }, + { + LLM_ARCH_QWEN3VLMOE, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" }, + { LLM_TENSOR_ATTN_Q_NORM, "blk.%d.attn_q_norm" }, + { LLM_TENSOR_ATTN_K, "blk.%d.attn_k" }, + { LLM_TENSOR_ATTN_K_NORM, "blk.%d.attn_k_norm" }, + { LLM_TENSOR_ATTN_V, "blk.%d.attn_v" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE_INP, "blk.%d.ffn_gate_inp" }, + { LLM_TENSOR_FFN_GATE_EXPS, "blk.%d.ffn_gate_exps" }, + { LLM_TENSOR_FFN_DOWN_EXPS, "blk.%d.ffn_down_exps" }, + { LLM_TENSOR_FFN_UP_EXPS, "blk.%d.ffn_up_exps" }, + }, + }, { LLM_ARCH_PHI2, { diff --git a/src/llama-arch.h b/src/llama-arch.h index 3350e8b4315..4dae35e2923 100644 --- a/src/llama-arch.h +++ b/src/llama-arch.h @@ -36,6 +36,8 @@ enum llm_arch { LLM_ARCH_QWEN2VL, LLM_ARCH_QWEN3, LLM_ARCH_QWEN3MOE, + LLM_ARCH_QWEN3VL, + LLM_ARCH_QWEN3VLMOE, LLM_ARCH_PHI2, LLM_ARCH_PHI3, LLM_ARCH_PHIMOE, @@ -150,6 +152,7 @@ enum llm_kv { LLM_KV_EXPERTS_PER_GROUP, LLM_KV_MOE_EVERY_N_LAYERS, LLM_KV_NEXTN_PREDICT_LAYERS, + LLM_KV_NUM_DEEPSTACK_LAYERS, LLM_KV_POOLING_TYPE, LLM_KV_LOGIT_SCALE, LLM_KV_DECODER_START_TOKEN_ID, diff --git a/src/llama-hparams.cpp b/src/llama-hparams.cpp index db65d69eabd..514d653844c 100644 --- a/src/llama-hparams.cpp +++ b/src/llama-hparams.cpp @@ -148,7 +148,7 @@ bool llama_hparams::is_recurrent(uint32_t il) const { } uint32_t llama_hparams::n_pos_per_embd() const { - return rope_type == LLAMA_ROPE_TYPE_MROPE ? 4 : 1; + return rope_type == LLAMA_ROPE_TYPE_MROPE || rope_type == LLAMA_ROPE_TYPE_IMROPE ? 4 : 1; } bool llama_hparams::is_swa(uint32_t il) const { diff --git a/src/llama-hparams.h b/src/llama-hparams.h index 6fcf91b7daa..539fecb3f78 100644 --- a/src/llama-hparams.h +++ b/src/llama-hparams.h @@ -183,6 +183,9 @@ struct llama_hparams { std::array xielu_beta; std::array xielu_eps; + // qwen3vl deepstack + uint32_t n_deepstack_layers = 0; + // needed by encoder-decoder models (e.g. T5, FLAN-T5) // ref: https://github.com/ggerganov/llama.cpp/pull/8141 llama_token dec_start_token_id = LLAMA_TOKEN_NULL; diff --git a/src/llama-kv-cache.cpp b/src/llama-kv-cache.cpp index 17627b6ccbb..e26385a1fea 100644 --- a/src/llama-kv-cache.cpp +++ b/src/llama-kv-cache.cpp @@ -1375,7 +1375,7 @@ ggml_tensor * llama_kv_cache::build_rope_shift( const auto & yarn_beta_slow = cparams.yarn_beta_slow; const auto & n_rot = hparams.n_rot; - const auto & rope_type = hparams.rope_type == LLAMA_ROPE_TYPE_MROPE + const auto & rope_type = hparams.rope_type == LLAMA_ROPE_TYPE_MROPE || hparams.rope_type == LLAMA_ROPE_TYPE_IMROPE // @ngxson : this is a workaround // for M-RoPE, we want to rotate the whole vector when doing KV shift // a normal RoPE should work, we just need to use the correct ordering diff --git a/src/llama-model.cpp b/src/llama-model.cpp index 35759a00aec..1e0680bee95 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -1025,6 +1025,21 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; + case LLM_ARCH_QWEN3VL: + { + ml.get_key(LLM_KV_NUM_DEEPSTACK_LAYERS, hparams.n_deepstack_layers, false); + ml.get_key_or_arr(LLM_KV_ROPE_DIMENSION_SECTIONS, hparams.rope_sections, 4, true); + ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); + switch (hparams.n_layer) { + case 28: type = LLM_TYPE_1_7B; break; + case 36: type = hparams.n_embd == 2560 ? LLM_TYPE_4B : LLM_TYPE_8B; break; + case 64: type = LLM_TYPE_32B; break; + default: type = LLM_TYPE_UNKNOWN; + } + // since vision model stacks deepstack features along feature dim + // we also create a fake "n_embd" for text model to be the main embd + deepstack embds + hparams.n_embd *= hparams.n_deepstack_layers + 1; + } break; case LLM_ARCH_QWEN3MOE: { ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp, false); @@ -1036,6 +1051,21 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; + case LLM_ARCH_QWEN3VLMOE: + { + ml.get_key(LLM_KV_NUM_DEEPSTACK_LAYERS, hparams.n_deepstack_layers, false); + ml.get_key_or_arr(LLM_KV_ROPE_DIMENSION_SECTIONS, hparams.rope_sections, 4, true); + ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp, false); + ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); + switch (hparams.n_layer) { + case 48: type = LLM_TYPE_30B_A3B; break; + case 94: type = LLM_TYPE_235B_A22B; break; + default: type = LLM_TYPE_UNKNOWN; + } + // since vision model stacks deepstack features along feature dim + // we also create a fake "n_embd" for text model to be the main embd + deepstack embds + hparams.n_embd *= hparams.n_deepstack_layers + 1; + } break; case LLM_ARCH_PHI2: { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps); @@ -3285,7 +3315,12 @@ bool llama_model::load_tensors(llama_model_loader & ml) { } } break; case LLM_ARCH_QWEN3: + case LLM_ARCH_QWEN3VL: { + // for model loading, the weights only have the main embd + // so we need to divide by the number of deepstack layers + 1 + // n_embd is const int so we declare a new variable + int64_t n_embd = hparams.n_embd / (hparams.n_deepstack_layers + 1); tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); // output @@ -3319,7 +3354,12 @@ bool llama_model::load_tensors(llama_model_loader & ml) { } } break; case LLM_ARCH_QWEN3MOE: + case LLM_ARCH_QWEN3VLMOE: { + // for model loading, the weights only have the main embd + // so we need to divide by the number of deepstack layers + 1 + // n_embd is const int so we declare a new variable + int64_t n_embd = hparams.n_embd / (hparams.n_deepstack_layers + 1); tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); // output @@ -6428,6 +6468,10 @@ void llama_model::print_info() const { LLAMA_LOG_INFO("%s: freq_scale_train = %g\n", __func__, hparams.rope_freq_scale_train); LLAMA_LOG_INFO("%s: n_ctx_orig_yarn = %u\n", __func__, hparams.n_ctx_orig_yarn); LLAMA_LOG_INFO("%s: rope_finetuned = %s\n", __func__, hparams.rope_finetuned ? "yes" : "unknown"); + // MRoPE (Multi-axis Rotary Position Embedding) sections + if (const auto & s = hparams.rope_sections; s[0] || s[1] || s[2] || s[3]) { + LLAMA_LOG_INFO("%s: mrope sections = [%d, %d, %d, %d]\n", __func__, s[0], s[1], s[2], s[3]); + } if (!classifier_labels.empty()) { LLAMA_LOG_INFO("%s: n_cls_out = %u\n", __func__, hparams.n_cls_out); @@ -6493,7 +6537,7 @@ void llama_model::print_info() const { LLAMA_LOG_INFO("%s: n_ff_shexp = %d\n", __func__, hparams.n_ff_shexp); } - if (arch == LLM_ARCH_QWEN3MOE || arch == LLM_ARCH_OPENAI_MOE) { + if (arch == LLM_ARCH_QWEN3MOE || arch == LLM_ARCH_OPENAI_MOE || arch == LLM_ARCH_QWEN3VLMOE) { LLAMA_LOG_INFO("%s: n_ff_exp = %d\n", __func__, hparams.n_ff_exp); } @@ -9655,6 +9699,301 @@ struct llm_build_qwen3moe : public llm_graph_context { } }; +struct llm_build_qwen3vl : public llm_graph_context { + llm_build_qwen3vl(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + + const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds + const size_t n_deepstack_layers = hparams.n_deepstack_layers; + const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); + const int64_t n_embd_head = hparams.n_embd_head_v; + + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + std::vector deepstack_features(n_deepstack_layers, nullptr); + + if (ubatch.embd) { + // Image input: split main embd and deepstack embds + ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); + for (size_t i = 0; i < n_deepstack_layers; i++) { + deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); + } + inpL = inpL_main; + } + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_multi( + ctx0, Qcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_multi( + ctx0, Kcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + if (ubatch.embd && (size_t)il < n_deepstack_layers) { + cur = ggml_add(ctx0, cur, deepstack_features[il]); + cb(cur, "deepstack_out", il); + } + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } +}; + +struct llm_build_qwen3vlmoe : public llm_graph_context { + llm_build_qwen3vlmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds + const size_t n_deepstack_layers = hparams.n_deepstack_layers; + const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + std::vector deepstack_features(n_deepstack_layers, nullptr); + + if (ubatch.embd) { + // Image input: split main embd and deepstack embds + ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); + for (size_t i = 0; i < n_deepstack_layers; i++) { + deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); + } + inpL = inpL_main; + } + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_multi( + ctx0, Qcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_multi( + ctx0, Kcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + cur = moe_out; + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + if (ubatch.embd && (size_t)il < n_deepstack_layers) { + cur = ggml_add(ctx0, cur, deepstack_features[il]); + cb(cur, "deepstack_out", il); + } + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } +}; + struct llm_build_phi2 : public llm_graph_context { llm_build_phi2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; @@ -20014,6 +20353,14 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { { llm = std::make_unique(*this, params); } break; + case LLM_ARCH_QWEN3VL: + { + llm = std::make_unique(*this, params); + } break; + case LLM_ARCH_QWEN3VLMOE: + { + llm = std::make_unique(*this, params); + } break; case LLM_ARCH_PHI2: { llm = std::make_unique(*this, params); @@ -20532,6 +20879,9 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_QWEN2VL: return LLAMA_ROPE_TYPE_MROPE; + case LLM_ARCH_QWEN3VL: + case LLM_ARCH_QWEN3VLMOE: + return LLAMA_ROPE_TYPE_IMROPE; // all model arches should be listed explicitly here case LLM_ARCH_UNKNOWN: diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 4b1304c2b89..92361d6f0f4 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -7076,7 +7076,12 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 128, GGML_ROPE_TYPE_MROPE, 512, fs, ef, af, ff, v, fw)); // rope_multi,m-rope (qwen2vl 7B) test_cases.emplace_back(new test_rope(type, {128, 12, 2, 1}, 20, GGML_ROPE_TYPE_MROPE, 512, fs, ef, af, ff, v, fw)); test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 32, GGML_ROPE_TYPE_MROPE, 512, fs, ef, af, ff, v, fw)); + test_cases.emplace_back(new test_rope(type, {128, 12, 2, 1}, 128, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); // rope_multi,imrope (qwen3vl 2B) + test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 128, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); // rope_multi,imrope (qwen3vl 7B) + test_cases.emplace_back(new test_rope(type, {128, 12, 2, 1}, 20, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); + test_cases.emplace_back(new test_rope(type, {128, 28, 2, 1}, 32, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); test_cases.emplace_back(new test_rope(type, { 80, 16, 2, 1}, 80, GGML_ROPE_TYPE_VISION, 512, fs, ef, af, ff, v, fw)); // rope_multi,m-rope (qwen2vl ViT) + test_cases.emplace_back(new test_rope(type, {128, 16, 2, 1}, 128, GGML_ROPE_TYPE_IMROPE, 512, fs, ef, af, ff, v, fw)); // rope_multi,m-rope (qwen3vl) } test_cases.emplace_back(new test_rope(type, { 64, 128, 2, 1}, 64, GGML_ROPE_TYPE_NEOX, 512, fs, ef, af, ff, v, fw)); // neox (falcon 40B) @@ -7092,7 +7097,7 @@ static std::vector> make_test_cases_eval() { // single inplace test per type/mode/ff for (ggml_type type : {GGML_TYPE_F32, GGML_TYPE_F16}) { - for (int mode : {GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX, GGML_ROPE_TYPE_MROPE, GGML_ROPE_TYPE_VISION}) { + for (int mode : {GGML_ROPE_TYPE_NORMAL, GGML_ROPE_TYPE_NEOX, GGML_ROPE_TYPE_MROPE, GGML_ROPE_TYPE_IMROPE, GGML_ROPE_TYPE_VISION}) { for (bool ff : {false, true}) { test_cases.emplace_back(new test_rope(type, {128, 32, 2, 1}, 128, mode, 512, 1.4245f, 0.7465f, 1.4245f, ff, 0, true, true)); } diff --git a/tests/test-rope.cpp b/tests/test-rope.cpp index 322b8bb99ec..22c51d81f60 100644 --- a/tests/test-rope.cpp +++ b/tests/test-rope.cpp @@ -138,7 +138,7 @@ int main(int /*argc*/, const char ** /*argv*/) { struct ggml_tensor * x; // rope f32 - for (int m = 0; m < 5; ++m) { + for (int m = 0; m < 6; ++m) { const int ndims = 4; const int64_t n_rot = 128; @@ -180,7 +180,7 @@ int main(int /*argc*/, const char ** /*argv*/) { struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2] * 4); int sections[4] = {16, 24, 24, 0}; - mode = (m == 3) ? GGML_ROPE_TYPE_MROPE : GGML_ROPE_TYPE_VISION; + mode = (m == 3) ? GGML_ROPE_TYPE_MROPE : (m == 4) ? GGML_ROPE_TYPE_VISION : GGML_ROPE_TYPE_IMROPE; for (int i = 0; i < ne[2]; ++i) { for (int j = 0; j < 4; ++j) { diff --git a/tools/mtmd/clip-impl.h b/tools/mtmd/clip-impl.h index d4b88cb6980..311a4c9086a 100644 --- a/tools/mtmd/clip-impl.h +++ b/tools/mtmd/clip-impl.h @@ -39,6 +39,7 @@ #define KEY_FEATURE_LAYER "clip.vision.feature_layer" #define KEY_PROJ_SCALE_FACTOR "clip.vision.projector.scale_factor" #define KEY_SPATIAL_MERGE_SIZE "clip.vision.spatial_merge_size" +#define KEY_IS_DEEPSTACK_LAYERS "clip.vision.is_deepstack_layers" #define KEY_MM_PATCH_MERGE_TYPE "clip.vision.mm_patch_merge_type" #define KEY_IMAGE_GRID_PINPOINTS "clip.vision.image_grid_pinpoints" @@ -94,6 +95,9 @@ #define TN_TOK_IMG_BREAK "v.token_embd.img_break" // pixtral #define TN_TOK_GLM_BOI "adapter.boi" // glm-edge (these embeddings are not in text model) #define TN_TOK_GLM_EOI "adapter.eoi" // glm-edge (these embeddings are not in text model) +#define TN_DEEPSTACK_NORM "v.deepstack.%d.norm.%s" // qwen3vl deepstack +#define TN_DEEPSTACK_FC1 "v.deepstack.%d.fc1.%s" // qwen3vl deepstack +#define TN_DEEPSTACK_FC2 "v.deepstack.%d.fc2.%s" // qwen3vl deepstack // mimicpmv #define TN_MINICPMV_POS_EMBD_K "resampler.pos_embed_k" @@ -136,6 +140,7 @@ enum projector_type { PROJECTOR_TYPE_MINICPMV, PROJECTOR_TYPE_GLM_EDGE, PROJECTOR_TYPE_QWEN2VL, + PROJECTOR_TYPE_QWEN3VL, PROJECTOR_TYPE_GEMMA3, PROJECTOR_TYPE_IDEFICS3, PROJECTOR_TYPE_PIXTRAL, @@ -161,6 +166,7 @@ static std::map PROJECTOR_TYPE_NAMES = { { PROJECTOR_TYPE_GLM_EDGE, "adapter"}, { PROJECTOR_TYPE_QWEN2VL, "qwen2vl_merger"}, { PROJECTOR_TYPE_QWEN25VL, "qwen2.5vl_merger"}, + { PROJECTOR_TYPE_QWEN3VL, "qwen3vl_merger"}, { PROJECTOR_TYPE_GEMMA3, "gemma3"}, { PROJECTOR_TYPE_IDEFICS3, "idefics3"}, { PROJECTOR_TYPE_PIXTRAL, "pixtral"}, diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index a135ba0a2b3..b312fda637f 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -241,6 +241,18 @@ struct clip_layer { // layer scale (no bias) ggml_tensor * ls_1_w = nullptr; ggml_tensor * ls_2_w = nullptr; + + // qwen3vl deepstack merger + ggml_tensor * deepstack_norm_w = nullptr; + ggml_tensor * deepstack_norm_b = nullptr; + ggml_tensor * deepstack_fc1_w = nullptr; + ggml_tensor * deepstack_fc1_b = nullptr; + ggml_tensor * deepstack_fc2_w = nullptr; + ggml_tensor * deepstack_fc2_b = nullptr; + + bool has_deepstack() const { + return deepstack_fc1_w != nullptr; + } }; struct clip_model { @@ -260,6 +272,8 @@ struct clip_model { std::vector layers; + int32_t n_deepstack_layers = 0; // used by Qwen3-VL, calculated from clip_layer + ggml_tensor * post_ln_w; ggml_tensor * post_ln_b; @@ -840,6 +854,189 @@ struct clip_graph { return gf; } + // Qwen3VL + ggml_cgraph * build_qwen3vl() { + GGML_ASSERT(model.patch_bias != nullptr); + GGML_ASSERT(model.position_embeddings != nullptr); + GGML_ASSERT(model.class_embedding == nullptr); + + const int batch_size = 1; + const int n_pos = n_patches; + const int num_position_ids = n_pos * 4; // m-rope requires 4 dim per position + + norm_type norm_t = NORM_TYPE_NORMAL; + + int mrope_sections[4] = {d_head/4, d_head/4, d_head/4, d_head/4}; + + ggml_tensor * inp_raw = build_inp_raw(); + ggml_tensor * inp = ggml_conv_2d(ctx0, model.patch_embeddings_0, inp_raw, patch_size, patch_size, 0, 0, 1, 1); + + GGML_ASSERT(img.nx % (patch_size * 2) == 0); + GGML_ASSERT(img.ny % (patch_size * 2) == 0); + + // second conv dimension + { + auto inp_1 = ggml_conv_2d(ctx0, model.patch_embeddings_1, inp_raw, patch_size, patch_size, 0, 0, 1, 1); + inp = ggml_add(ctx0, inp, inp_1); + + inp = ggml_permute(ctx0, inp, 1, 2, 0, 3); // [w, h, c, b] -> [c, w, h, b] + inp = ggml_cont_4d( + ctx0, inp, + n_embd * 2, n_patches_x / 2, n_patches_y, batch_size); + inp = ggml_reshape_4d( + ctx0, inp, + n_embd * 2, n_patches_x / 2, 2, batch_size * (n_patches_y / 2)); + inp = ggml_permute(ctx0, inp, 0, 2, 1, 3); + inp = ggml_cont_3d( + ctx0, inp, + n_embd, n_patches_x * n_patches_y, batch_size); + } + + // add patch bias + if (model.patch_bias != nullptr) { + inp = ggml_add(ctx0, inp, model.patch_bias); + cb(inp, "patch_bias", -1); + } + + // calculate absolute position embedding and apply + ggml_tensor * learned_pos_embd = resize_position_embeddings(); + learned_pos_embd = ggml_cont_4d( + ctx0, learned_pos_embd, + n_embd * 2, n_patches_x / 2, n_patches_y, batch_size); + learned_pos_embd = ggml_reshape_4d( + ctx0, learned_pos_embd, + n_embd * 2, n_patches_x / 2, 2, batch_size * (n_patches_y / 2)); + learned_pos_embd = ggml_permute(ctx0, learned_pos_embd, 0, 2, 1, 3); + learned_pos_embd = ggml_cont_3d( + ctx0, learned_pos_embd, + n_embd, n_patches_x * n_patches_y, batch_size); + inp = ggml_add(ctx0, inp, learned_pos_embd); + cb(inp, "inp_pos_emb", -1); + + ggml_tensor * inpL = inp; + + ggml_tensor * positions = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, num_position_ids); + ggml_set_name(positions, "positions"); + ggml_set_input(positions); + + // pre-layernorm + if (model.pre_ln_w) { + inpL = build_norm(inpL, model.pre_ln_w, model.pre_ln_b, norm_t, eps, -1); + } + + // deepstack features (stack along the feature dimension), [n_embd * len(deepstack_layers), n_patches_x * n_patches_y, batch_size] + ggml_tensor * deepstack_features = nullptr; + const int merge_factor = hparams.spatial_merge_size > 0 ? hparams.spatial_merge_size * hparams.spatial_merge_size : 4; // default 2x2=4 for qwen3vl + + // loop over layers + for (int il = 0; il < n_layer; il++) { + auto & layer = model.layers[il]; + + ggml_tensor * cur = inpL; // inpL = residual, cur = hidden_states + + // layernorm1 + cur = build_norm(cur, layer.ln_1_w, layer.ln_1_b, norm_t, eps, il); + cb(cur, "ln1", il); + + // self-attention + { + cur = ggml_mul_mat(ctx0, layer.qkv_w, cur); + cur = ggml_add(ctx0, cur, layer.qkv_b); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], 0); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], n_embd * sizeof(float)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, d_head, n_head, n_pos, d_head*sizeof(float), + cur->nb[1], 2 * n_embd * sizeof(float)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + // apply M-RoPE + Qcur = ggml_rope_multi( + ctx0, Qcur, positions, nullptr, + d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); + Kcur = ggml_rope_multi( + ctx0, Kcur, positions, nullptr, + d_head/2, mrope_sections, GGML_ROPE_TYPE_VISION, 32768, 10000, 1, 0, 1, 32, 1); + + cb(Qcur, "Qcur_rope", il); + cb(Kcur, "Kcur_rope", il); + + cur = build_attn(layer.o_w, layer.o_b, + Qcur, Kcur, Vcur, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + + // re-add the layer input, e.g., residual + cur = ggml_add(ctx0, cur, inpL); + + inpL = cur; // inpL = residual, cur = hidden_states + + cb(cur, "ffn_inp", il); + + // layernorm2 + cur = build_norm(cur, layer.ln_2_w, layer.ln_2_b, norm_t, eps, il); + cb(cur, "ffn_inp_normed", il); + + // ffn + cur = build_ffn(cur, + layer.ff_up_w, layer.ff_up_b, + layer.ff_gate_w, layer.ff_gate_b, + layer.ff_down_w, layer.ff_down_b, + hparams.ffn_op, il); + + cb(cur, "ffn_out", il); + + // residual 2 + cur = ggml_add(ctx0, inpL, cur); + cb(cur, "layer_out", il); + + if (layer.has_deepstack()) { + ggml_tensor * feat = ggml_reshape_3d(ctx0, cur, n_embd * merge_factor, n_pos / merge_factor, batch_size); + feat = build_norm(feat, layer.deepstack_norm_w, layer.deepstack_norm_b, norm_t, eps, il); + feat = build_ffn(feat, + layer.deepstack_fc1_w, layer.deepstack_fc1_b, + nullptr, nullptr, + layer.deepstack_fc2_w, layer.deepstack_fc2_b, + ffn_op_type::FFN_GELU, il); + + if(!deepstack_features) { + deepstack_features = feat; + } else { + // concat along the feature dimension + deepstack_features = ggml_concat(ctx0, deepstack_features, feat, 0); + } + } + + inpL = cur; + } + + // post-layernorm + if (model.post_ln_w) { + inpL = build_norm(inpL, model.post_ln_w, model.post_ln_b, norm_t, eps, n_layer); + } + + // multimodal projection + ggml_tensor * embeddings = inpL; + embeddings = ggml_reshape_3d(ctx0, embeddings, n_embd * 4, n_pos / 4, batch_size); + + embeddings = build_ffn(embeddings, + model.mm_0_w, model.mm_0_b, + nullptr, nullptr, + model.mm_1_w, model.mm_1_b, + ffn_op_type::FFN_GELU, -1); + + embeddings = ggml_concat(ctx0, embeddings, deepstack_features, 0); // concat along the feature dimension + + // build the graph + ggml_build_forward_expand(gf, embeddings); + + return gf; + } + ggml_cgraph * build_minicpmv() { const int batch_size = 1; @@ -2211,6 +2408,10 @@ static ggml_cgraph * clip_image_build_graph(clip_ctx * ctx, const clip_image_f32 { res = graph.build_qwen2vl(); } break; + case PROJECTOR_TYPE_QWEN3VL: + { + res = graph.build_qwen3vl(); + } break; case PROJECTOR_TYPE_MINICPMV: { res = graph.build_minicpmv(); @@ -2534,6 +2735,12 @@ struct clip_model_loader { hparams.warmup_image_size = hparams.patch_size * 8; get_u32(KEY_WIN_ATTN_PATTERN, hparams.n_wa_pattern); } break; + case PROJECTOR_TYPE_QWEN3VL: + { + hparams.image_size = 1024; // still need this? + hparams.warmup_image_size = hparams.patch_size * 8; + get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.spatial_merge_size, false); + } break; case PROJECTOR_TYPE_LLAMA4: { hparams.rope_theta = 10000.0f; @@ -2572,6 +2779,9 @@ struct clip_model_loader { LOG_INF("%s: minicpmv_version: %d\n", __func__, hparams.minicpmv_version); LOG_INF("%s: proj_scale_factor: %d\n", __func__, hparams.proj_scale_factor); LOG_INF("%s: n_wa_pattern: %d\n", __func__, hparams.n_wa_pattern); + if (hparams.spatial_merge_size > 0) { + LOG_INF("%s: spatial_merge_size: %d\n", __func__, hparams.spatial_merge_size); + } } else if (is_audio) { LOG_INF("\n--- audio hparams ---\n"); LOG_INF("%s: n_mel_bins: %d\n", __func__, hparams.n_mel_bins); @@ -2671,6 +2881,18 @@ struct clip_model_loader { layer.ff_down_w = get_tensor(string_format(TN_FFN_DOWN, prefix, il, "weight")); layer.ff_down_b = get_tensor(string_format(TN_FFN_DOWN, prefix, il, "bias"), false); + + // qwen3vl deepstack layer + layer.deepstack_norm_w = get_tensor(string_format(TN_DEEPSTACK_NORM, il, "weight"), false); + layer.deepstack_norm_b = get_tensor(string_format(TN_DEEPSTACK_NORM, il, "bias"), false); + layer.deepstack_fc1_w = get_tensor(string_format(TN_DEEPSTACK_FC1, il, "weight"), false); + layer.deepstack_fc1_b = get_tensor(string_format(TN_DEEPSTACK_FC1, il, "bias"), false); + layer.deepstack_fc2_w = get_tensor(string_format(TN_DEEPSTACK_FC2, il, "weight"), false); + layer.deepstack_fc2_b = get_tensor(string_format(TN_DEEPSTACK_FC2, il, "bias"), false); + if (layer.has_deepstack()) { + model.n_deepstack_layers++; + } + // some models already exported with legacy (incorrect) naming which is quite messy, let's fix it here // note: Qwen model converted from the old surgery script has n_ff = 0, so we cannot use n_ff to check! bool is_ffn_swapped = ( @@ -2806,6 +3028,13 @@ struct clip_model_loader { model.mm_1_w = get_tensor(string_format(TN_LLAVA_PROJ, 2, "weight")); model.mm_1_b = get_tensor(string_format(TN_LLAVA_PROJ, 2, "bias")); } break; + case PROJECTOR_TYPE_QWEN3VL: + { + model.mm_0_w = get_tensor(string_format(TN_LLAVA_PROJ, 0, "weight")); + model.mm_0_b = get_tensor(string_format(TN_LLAVA_PROJ, 0, "bias")); + model.mm_1_w = get_tensor(string_format(TN_LLAVA_PROJ, 2, "weight")); + model.mm_1_b = get_tensor(string_format(TN_LLAVA_PROJ, 2, "bias")); + } break; case PROJECTOR_TYPE_GEMMA3: { model.mm_input_proj_w = get_tensor(TN_MM_INP_PROJ); @@ -3689,7 +3918,7 @@ bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, str res_imgs->grid_y = inst.grid_size.height; return true; - } else if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL) { + } else if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { clip_image_u8 resized; auto patch_size = params.patch_size * 2; auto new_size = image_manipulation::calc_size_preserved_ratio(original_size, patch_size, params.image_size); @@ -3915,7 +4144,7 @@ const char * clip_patch_merge_type(const struct clip_ctx * ctx) { int clip_n_output_tokens_x(const struct clip_ctx * ctx, struct clip_image_f32 * img) { const auto & params = ctx->model.hparams; const int n_total = clip_n_output_tokens(ctx, img); - if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL) { + if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { return img->nx / (params.patch_size * 2) + (int)(img->nx % params.patch_size > 0); } return n_total; @@ -3923,7 +4152,7 @@ int clip_n_output_tokens_x(const struct clip_ctx * ctx, struct clip_image_f32 * int clip_n_output_tokens_y(const struct clip_ctx * ctx, struct clip_image_f32 * img) { const auto & params = ctx->model.hparams; - if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL) { + if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { return img->ny / (params.patch_size * 2) + (int)(img->ny % params.patch_size > 0); } return 1; @@ -3979,6 +4208,7 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im } break; case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: + case PROJECTOR_TYPE_QWEN3VL: { // dynamic size (2 conv, so double patch size) int patch_size = params.patch_size * 2; @@ -4292,6 +4522,7 @@ bool clip_image_batch_encode(clip_ctx * ctx, const int n_threads, const clip_ima set_input_f32("pos_embed", pos_embed); } break; case PROJECTOR_TYPE_QWEN2VL: + case PROJECTOR_TYPE_QWEN3VL: { const int merge_ratio = 2; const int pw = image_size_width / patch_size; @@ -4540,6 +4771,9 @@ int clip_n_mmproj_embd(const struct clip_ctx * ctx) { case PROJECTOR_TYPE_QWEN2VL: case PROJECTOR_TYPE_QWEN25VL: return ctx->model.mm_1_b->ne[0]; + case PROJECTOR_TYPE_QWEN3VL: + // main path + deepstack paths + return ctx->model.mm_1_b->ne[0] * (1 + ctx->model.n_deepstack_layers); case PROJECTOR_TYPE_GEMMA3: return ctx->model.mm_input_proj_w->ne[0]; case PROJECTOR_TYPE_IDEFICS3: @@ -4576,7 +4810,8 @@ bool clip_is_glm(const struct clip_ctx * ctx) { bool clip_is_qwen2vl(const struct clip_ctx * ctx) { return ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL - || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL; + || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL + || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL; } bool clip_is_llava(const struct clip_ctx * ctx) { diff --git a/tools/mtmd/mtmd.cpp b/tools/mtmd/mtmd.cpp index 1a48f903efa..196641dd95e 100644 --- a/tools/mtmd/mtmd.cpp +++ b/tools/mtmd/mtmd.cpp @@ -267,7 +267,7 @@ struct mtmd_context { // https://github.com/huggingface/transformers/blob/1cd110c6cb6a6237614130c470e9a902dbc1a4bd/docs/source/en/model_doc/pixtral.md img_end = "[IMG_END]"; - } else if (proj == PROJECTOR_TYPE_QWEN2VL || proj == PROJECTOR_TYPE_QWEN25VL) { + } else if (proj == PROJECTOR_TYPE_QWEN2VL || proj == PROJECTOR_TYPE_QWEN25VL || proj == PROJECTOR_TYPE_QWEN3VL) { // <|vision_start|> ... (image embeddings) ... <|vision_end|> img_beg = "<|vision_start|>"; img_end = "<|vision_end|>"; diff --git a/tools/mtmd/tests.sh b/tools/mtmd/tests.sh index c2270746360..472f7d821c2 100755 --- a/tools/mtmd/tests.sh +++ b/tools/mtmd/tests.sh @@ -84,6 +84,7 @@ if [ "$RUN_BIG_TESTS" = true ]; then add_test_vision "ggml-org/Qwen2-VL-7B-Instruct-GGUF:Q4_K_M" add_test_vision "ggml-org/Qwen2.5-VL-3B-Instruct-GGUF:Q4_K_M" add_test_vision "ggml-org/Qwen2.5-VL-7B-Instruct-GGUF:Q4_K_M" + add_test_vision "ggml-org/Qwen3-VL-2B-Instruct-GGUF:Q8_0" add_test_vision "ggml-org/InternVL3-8B-Instruct-GGUF:Q4_K_M" add_test_vision "ggml-org/InternVL3-14B-Instruct-GGUF:Q4_K_M" add_test_vision "ggml-org/Qwen2.5-Omni-7B-GGUF:Q4_K_M" From 835e918d8428f5119927d7150bf5a26176dedda0 Mon Sep 17 00:00:00 2001 From: Shagun Bera <141054835+notV3NOM@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:17:31 +0530 Subject: [PATCH 022/185] common: fix typo in cli help text (#16864) --- common/arg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/arg.cpp b/common/arg.cpp index a465eb36234..e8941cda41c 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -3203,7 +3203,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex ).set_examples({LLAMA_EXAMPLE_IMATRIX})); add_opt(common_arg( {"--parse-special"}, - string_format("prase special tokens (chat, tool, etc) (default: %s)", params.parse_special ? "true" : "false"), + string_format("parse special tokens (chat, tool, etc) (default: %s)", params.parse_special ? "true" : "false"), [](common_params & params) { params.parse_special = true; } From 517b7170e1a4d733583c4b07c5b7a49acc05911c Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Thu, 30 Oct 2025 09:06:13 -0700 Subject: [PATCH 023/185] cpu: introduce chunking for repack matmuls and enable matmul-id chunking on ARM64 (#16833) Very similar implementation to the flash-attention chunking, with similar benefits. --- ggml/src/ggml-cpu/ggml-cpu.c | 5 --- ggml/src/ggml-cpu/repack.cpp | 78 ++++++++++++++++++++++++++---------- 2 files changed, 57 insertions(+), 26 deletions(-) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 9ec485cfa2f..b5466dd703d 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -1613,13 +1613,8 @@ static void ggml_compute_forward_mul_mat_id( chunk_size = 64; } -#if defined(__aarch64__) - // disable for ARM - const bool disable_chunking = true; -#else // disable for NUMA const bool disable_chunking = ggml_is_numa(); -#endif // defined(__aarch64__) int64_t nchunk0 = (nr0 + chunk_size - 1) / chunk_size; int64_t nchunk1 = (nr1 + chunk_size - 1) / chunk_size; diff --git a/ggml/src/ggml-cpu/repack.cpp b/ggml/src/ggml-cpu/repack.cpp index f531d21e232..8da1e0e9245 100644 --- a/ggml/src/ggml-cpu/repack.cpp +++ b/ggml/src/ggml-cpu/repack.cpp @@ -1600,6 +1600,32 @@ template src[0]; + const ggml_tensor * src1 = op->src[1]; + ggml_tensor * dst = op; + + GGML_TENSOR_BINARY_OP_LOCALS + + const void * src1_wdata = params->wdata; + const size_t src1_col_stride = ggml_row_size(PARAM_TYPE, ne10); + + // If there are more than three rows in src1, use gemm; otherwise, use gemv. + if (ne11 > 3) { + gemm(ne00, + (float *) ((char *) dst->data) + src0_start, ne01, + (const char *) src0->data + src0_start * nb01, + (const char *) src1_wdata, ne11 - ne11 % 4, src0_end - src0_start); + } + for (int iter = ne11 - ne11 % 4; iter < ne11; iter++) { + gemv(ne00, + (float *) ((char *) dst->data + (iter * nb1)) + src0_start, ne01, + (const char *) src0->data + src0_start * nb01, + (const char *) src1_wdata + (src1_col_stride * iter), 1, + src0_end - src0_start); + } + } + void forward_mul_mat(ggml_compute_params * params, ggml_tensor * op) { const ggml_tensor * src0 = op->src[0]; const ggml_tensor * src1 = op->src[1]; @@ -1643,31 +1669,41 @@ template data + i11 * nb11), (void *) (wdata + i11 * nbw1), ne10); } - ggml_barrier(params->threadpool); + // disable for NUMA + const bool disable_chunking = ggml_is_numa(); - const void * src1_wdata = params->wdata; - const size_t src1_col_stride = ggml_row_size(PARAM_TYPE, ne10); - int64_t src0_start = (ith * ne01) / nth; - int64_t src0_end = ((ith + 1) * ne01) / nth; - src0_start = (src0_start % NB_COLS) ? src0_start + NB_COLS - (src0_start % NB_COLS) : src0_start; - src0_end = (src0_end % NB_COLS) ? src0_end + NB_COLS - (src0_end % NB_COLS) : src0_end; - if (src0_start >= src0_end) { - return; + // 4x chunks per thread + int64_t nr = ggml_nrows(op->src[0]); + int nth_scaled = nth * 4; + int64_t chunk_size = (nr + nth_scaled - 1) / nth_scaled; + int64_t nchunk = (nr + chunk_size - 1) / chunk_size; + + if (nth == 1 || nchunk < nth || disable_chunking) { + nchunk = nth; } - // If there are more than three rows in src1, use gemm; otherwise, use gemv. - if (ne11 > 3) { - gemm(ne00, - (float *) ((char *) dst->data) + src0_start, ne01, - (const char *) src0->data + src0_start * nb01, - (const char *) src1_wdata, ne11 - ne11 % 4, src0_end - src0_start); + if (ith == 0) { + // Every thread starts at ith, so the first unprocessed chunk is nth. This save a bit of coordination right at the start. + ggml_threadpool_chunk_set(params->threadpool, nth); } - for (int iter = ne11 - ne11 % 4; iter < ne11; iter++) { - gemv(ne00, - (float *) ((char *) dst->data + (iter * nb1)) + src0_start, ne01, - (const char *) src0->data + src0_start * nb01, - (const char *) src1_wdata + (src1_col_stride * iter), 1, - src0_end - src0_start); + + ggml_barrier(params->threadpool); + + // The first chunk comes from our thread_id, the rest will get auto-assigned. + int current_chunk = ith; + + while (current_chunk < nchunk) { + int64_t src0_start = (current_chunk * ne01) / nchunk; + int64_t src0_end = ((current_chunk + 1) * ne01) / nchunk; + src0_start = (src0_start % NB_COLS) ? src0_start + NB_COLS - (src0_start % NB_COLS) : src0_start; + src0_end = (src0_end % NB_COLS) ? src0_end + NB_COLS - (src0_end % NB_COLS) : src0_end; + if (src0_start >= src0_end) { + break; + } + + forward_mul_mat_one_chunk(params, dst, src0_start, src0_end); + + current_chunk = ggml_threadpool_chunk_add(params->threadpool, 1); } } From b52edd25586fabb70f0c21b274473b307cf14499 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Thu, 30 Oct 2025 18:42:57 +0200 Subject: [PATCH 024/185] server : remove n_past (#16818) * server : remove n_past * server : replace slot.n_prompt_tokens() with slot.task->n_tokens() * server : fixes + clean-up * cont : fix context shift * server : add server_tokens::pos_next() Co-authored-by: Xuan-Son Nguyen * server : fix pos_next() usage Co-authored-by: Xuan-Son Nguyen --------- Co-authored-by: Xuan-Son Nguyen --- tools/server/README.md | 4 +- tools/server/server.cpp | 220 ++++++++++++++++++++-------------------- tools/server/utils.hpp | 106 +++++++++++-------- 3 files changed, 177 insertions(+), 153 deletions(-) diff --git a/tools/server/README.md b/tools/server/README.md index f5ab9236d52..c16d0bd6dcd 100644 --- a/tools/server/README.md +++ b/tools/server/README.md @@ -587,7 +587,7 @@ These words will not be included in the completion, so make sure to add them to - `word`: Stopped due to encountering a stopping word from `stop` JSON array provided - `stopping_word`: The stopping word encountered which stopped the generation (or "" if not stopped due to a stopping word) - `timings`: Hash of timing information about the completion such as the number of tokens `predicted_per_second` -- `tokens_cached`: Number of tokens from the prompt which could be re-used from previous completion (`n_past`) +- `tokens_cached`: Number of tokens from the prompt which could be re-used from previous completion - `tokens_evaluated`: Number of tokens evaluated in total from the prompt - `truncated`: Boolean indicating if the context size was exceeded during generation, i.e. the number of tokens provided in the prompt (`tokens_evaluated`) plus tokens generated (`tokens predicted`) exceeded the context size (`n_ctx`) @@ -1045,7 +1045,7 @@ Available metrics: - `llamacpp:kv_cache_tokens`: KV-cache tokens. - `llamacpp:requests_processing`: Number of requests processing. - `llamacpp:requests_deferred`: Number of requests deferred. -- `llamacpp:n_past_max`: High watermark of the context size observed. +- `llamacpp:n_tokens_max`: High watermark of the context size observed. ### POST `/slots/{id_slot}?action=save`: Save the prompt cache of the specified slot to a file. diff --git a/tools/server/server.cpp b/tools/server/server.cpp index cb794ab647e..d56468595dd 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -292,6 +292,10 @@ struct server_task { server_task(server_task_type type) : type(type) {} + int32_t n_tokens() const { + return tokens.size(); + } + static slot_params params_from_json_cmpl( const llama_context * ctx, const common_params & params_base, @@ -1308,7 +1312,7 @@ struct server_task_result_metrics : server_task_result { uint64_t n_tokens_predicted_total = 0; uint64_t t_tokens_generation_total = 0; - uint64_t n_past_max = 0; + uint64_t n_tokens_max = 0; uint64_t n_prompt_tokens_processed = 0; uint64_t t_prompt_processing = 0; @@ -1335,7 +1339,7 @@ struct server_task_result_metrics : server_task_result { { "n_tokens_predicted_total", n_tokens_predicted_total }, { "t_prompt_processing_total", t_prompt_processing_total }, - { "n_past_max", n_past_max }, + { "n_tokens_max", n_tokens_max }, { "n_prompt_tokens_processed", n_prompt_tokens_processed }, { "t_prompt_processing", t_prompt_processing }, @@ -1636,7 +1640,6 @@ struct server_slot { // generation props int32_t n_ctx = 0; // context size per slot - int32_t n_past = 0; int32_t n_keep = 0; int32_t n_decoded = 0; int32_t n_remaining = -1; @@ -1645,10 +1648,6 @@ struct server_slot { int32_t n_prompt_tokens_cache = 0; int32_t n_prompt_tokens_processed = 0; - int32_t n_prompt_tokens() const { - return task->tokens.size(); - } - size_t last_nl_pos = 0; std::string generated_text; @@ -1733,7 +1732,6 @@ struct server_slot { truncated = false; stop = STOP_TYPE_NONE; stopping_word = ""; - n_past = 0; n_sent_text = 0; chat_format = COMMON_CHAT_FORMAT_CONTENT_ONLY; @@ -1818,7 +1816,7 @@ struct server_slot { if (is_processing()) { GGML_ASSERT(task); - SLT_INF(*this, "stop processing: n_past = %d, truncated = %d\n", n_past, truncated); + SLT_INF(*this, "stop processing: n_tokens = %d, truncated = %d\n", prompt.n_tokens(), truncated); t_last_used = ggml_time_us(); t_token_generation = (ggml_time_us() - t_start_generation) / 1e3; @@ -1970,7 +1968,7 @@ struct server_metrics { uint64_t n_tokens_predicted_total = 0; uint64_t t_tokens_generation_total = 0; - uint64_t n_past_max = 0; + uint64_t n_tokens_max = 0; uint64_t n_prompt_tokens_processed = 0; uint64_t t_prompt_processing = 0; @@ -1991,9 +1989,7 @@ struct server_metrics { t_prompt_processing += slot.t_prompt_processing; t_prompt_processing_total += slot.t_prompt_processing; - if (slot.n_past > 0) { - n_past_max = std::max(n_past_max, (uint64_t) slot.n_past); - } + n_tokens_max = std::max(n_tokens_max, (uint64_t) slot.prompt.n_tokens()); } void on_prediction(const server_slot & slot) { @@ -2009,9 +2005,7 @@ struct server_metrics { if (slot.is_processing()) { n_busy_slots_total++; } - if (slot.n_past > 0) { - n_past_max = std::max(n_past_max, (uint64_t) slot.n_past); - } + n_tokens_max = std::max(n_tokens_max, (uint64_t) slot.prompt.n_tokens()); } } @@ -2865,13 +2859,13 @@ struct server_context { } // if context shifting is disabled, make sure that we don't run out of context - if (!params_base.ctx_shift && slot.n_past + 1 >= slot.n_ctx) { + if (!params_base.ctx_shift && slot.prompt.n_tokens() + 1 >= slot.n_ctx) { slot.truncated = true; slot.stop = STOP_TYPE_LIMIT; slot.has_next_token = false; - SLT_DBG(slot, "stopped due to running out of context capacity, n_past = %d, n_prompt_tokens = %d, n_decoded = %d, n_ctx = %d\n", - slot.n_decoded, slot.n_prompt_tokens(), slot.n_past, slot.n_ctx); + SLT_DBG(slot, "stopped due to running out of context capacity, prompt.n_tokens() = %d, task.n_tokens = %d, n_decoded = %d, n_ctx = %d\n", + slot.prompt.n_tokens(), slot.task->n_tokens(), slot.n_decoded, slot.n_ctx); } // check the limits @@ -2998,7 +2992,7 @@ struct server_context { } void send_error(const server_slot & slot, const std::string & error, const enum error_type type = ERROR_TYPE_SERVER) { - send_error(slot.task->id, error, type, slot.n_prompt_tokens(), slot.n_ctx); + send_error(slot.task->id, error, type, slot.task->n_tokens(), slot.n_ctx); } void send_error(const int id_task, const std::string & error, const enum error_type type = ERROR_TYPE_SERVER, const int32_t n_prompt_tokens = 0, const int32_t n_ctx = 0) { @@ -3035,7 +3029,7 @@ struct server_context { if (is_progress) { res->is_progress = true; - res->progress.total = slot.n_prompt_tokens(); + res->progress.total = slot.task->n_tokens(); res->progress.cache = slot.n_prompt_tokens_cache; res->progress.processed = slot.prompt.tokens.size(); res->progress.time_ms = (ggml_time_us() - slot.t_start_process_prompt / 1000); @@ -3047,7 +3041,7 @@ struct server_context { } res->n_decoded = slot.n_decoded; - res->n_prompt_tokens = slot.n_prompt_tokens(); + res->n_prompt_tokens = slot.task->n_tokens(); res->post_sampling_probs = slot.task->params.post_sampling_probs; res->verbose = slot.task->params.verbose; @@ -3083,8 +3077,8 @@ struct server_context { res->truncated = slot.truncated; res->n_decoded = slot.n_decoded; - res->n_prompt_tokens = slot.n_prompt_tokens(); - res->n_tokens_cached = slot.n_past; + res->n_prompt_tokens = slot.task->n_tokens(); + res->n_tokens_cached = slot.prompt.n_tokens(); res->has_new_line = slot.has_new_line; res->stopping_word = slot.stopping_word; res->stop = slot.stop; @@ -3123,7 +3117,7 @@ struct server_context { auto res = std::make_unique(); res->id = slot.task->id; res->index = slot.task->index; - res->n_tokens = slot.n_prompt_tokens(); + res->n_tokens = slot.task->n_tokens(); res->oaicompat = slot.task->params.oaicompat; const int n_embd = llama_model_n_embd(model); @@ -3168,7 +3162,7 @@ struct server_context { auto res = std::make_unique(); res->id = slot.task->id; res->index = slot.task->index; - res->n_tokens = slot.n_prompt_tokens(); + res->n_tokens = slot.task->n_tokens(); for (int i = 0; i < batch.n_tokens; ++i) { if (!batch.logits[i] || batch.seq_id[i][0] != slot.id) { @@ -3375,7 +3369,7 @@ struct server_context { res->n_tokens_predicted_total = metrics.n_tokens_predicted_total; res->t_tokens_generation_total = metrics.t_tokens_generation_total; - res->n_past_max = metrics.n_past_max; + res->n_tokens_max = metrics.n_tokens_max; res->n_prompt_tokens_processed = metrics.n_prompt_tokens_processed; res->t_prompt_processing = metrics.t_prompt_processing; @@ -3551,7 +3545,7 @@ struct server_context { // apply context-shift if needed // TODO: simplify and improve for (server_slot & slot : slots) { - if (slot.is_processing() && slot.n_past + 1 >= slot.n_ctx) { + if (slot.is_processing() && slot.prompt.n_tokens() + 1 >= slot.n_ctx) { if (!params_base.ctx_shift) { // this check is redundant (for good) // we should never get here, because generation should already stopped in process_token() @@ -3567,7 +3561,7 @@ struct server_context { } // Shift context - int n_keep = slot.task->params.n_keep < 0 ? slot.n_prompt_tokens() : slot.task->params.n_keep; + int n_keep = slot.task->params.n_keep < 0 ? slot.task->n_tokens() : slot.task->params.n_keep; if (add_bos_token) { n_keep += 1; @@ -3575,28 +3569,30 @@ struct server_context { n_keep = std::min(slot.n_ctx - 4, n_keep); - const int n_left = slot.n_past - n_keep; + const int n_left = slot.prompt.n_tokens() - n_keep; const int n_discard = slot.task->params.n_discard ? slot.task->params.n_discard : (n_left / 2); SLT_WRN(slot, "slot context shift, n_keep = %d, n_left = %d, n_discard = %d\n", n_keep, n_left, n_discard); llama_memory_seq_rm (llama_get_memory(ctx), slot.id, n_keep , n_keep + n_discard); - llama_memory_seq_add(llama_get_memory(ctx), slot.id, n_keep + n_discard, slot.n_past, -n_discard); + llama_memory_seq_add(llama_get_memory(ctx), slot.id, n_keep + n_discard, slot.prompt.n_tokens(), -n_discard); // add generated tokens to cache + // ref: https://github.com/ggml-org/llama.cpp/pull/16818#discussion_r2473269481 { + GGML_ASSERT(!slot.prompt.tokens.has_mtmd); + llama_tokens new_tokens = slot.prompt.tokens.get_text_tokens(); // copy for (size_t i = n_keep + n_discard; i < new_tokens.size(); i++) { new_tokens[i - n_discard] = new_tokens[i]; } new_tokens.resize(slot.prompt.tokens.size() - n_discard); + slot.prompt.tokens.clear(); slot.prompt.tokens.insert(new_tokens); } - slot.n_past -= n_discard; - slot.truncated = true; } } @@ -3627,13 +3623,12 @@ struct server_context { slot.i_batch = batch.n_tokens; - common_batch_add(batch, slot.sampled, slot.n_past, { slot.id }, true); + common_batch_add(batch, slot.sampled, slot.prompt.tokens.pos_next(), { slot.id }, true); - slot.n_past += 1; slot.prompt.tokens.push_back(slot.sampled); - SLT_DBG(slot, "slot decode token, n_ctx = %d, n_past = %d, n_cache_tokens = %d, truncated = %d\n", - slot.n_ctx, slot.n_past, (int) slot.prompt.tokens.size(), slot.truncated); + SLT_DBG(slot, "slot decode token, n_ctx = %d, n_tokens = %d, truncated = %d\n", + slot.n_ctx, slot.prompt.n_tokens(), slot.truncated); } // process in chunks of params.n_batch @@ -3663,11 +3658,10 @@ struct server_context { slot.t_start_process_prompt = ggml_time_us(); slot.t_start_generation = 0; - slot.n_past = 0; slot.state = SLOT_STATE_PROCESSING_PROMPT; - SLT_INF(slot, "new prompt, n_ctx_slot = %d, n_keep = %d, n_prompt_tokens = %d\n", - slot.n_ctx, slot.task->params.n_keep, slot.n_prompt_tokens()); + SLT_INF(slot, "new prompt, n_ctx_slot = %d, n_keep = %d, task.n_tokens = %d\n", + slot.n_ctx, slot.task->params.n_keep, slot.task->n_tokens()); // print prompt tokens (for debugging) /*if (1) { @@ -3682,6 +3676,9 @@ struct server_context { } }*/ + // keep track how many tokens we can reuse from the previous state + int n_past = 0; + // empty prompt passed -> release the slot and send empty response if (input_tokens.empty()) { SLT_WRN(slot, "%s", "empty prompt - releasing slot\n"); @@ -3701,19 +3698,19 @@ struct server_context { } if (!slot.can_split()) { - if (slot.n_prompt_tokens() > n_ubatch) { + if (slot.task->n_tokens() > n_ubatch) { send_error(slot, "input is too large to process. increase the physical batch size", ERROR_TYPE_SERVER); slot.release(); continue; } - if (slot.n_prompt_tokens() > slot.n_ctx) { + if (slot.task->n_tokens() > slot.n_ctx) { send_error(slot, "input is larger than the max context size. skipping", ERROR_TYPE_EXCEED_CONTEXT_SIZE); slot.release(); continue; } } else { - if (slot.n_prompt_tokens() >= slot.n_ctx) { + if (slot.task->n_tokens() >= slot.n_ctx) { send_error(slot, "the request exceeds the available context size, try increasing it", ERROR_TYPE_EXCEED_CONTEXT_SIZE); slot.release(); continue; @@ -3721,32 +3718,34 @@ struct server_context { if (slot.task->params.cache_prompt) { // reuse any previously computed tokens that are common with the new prompt - slot.n_past = slot.prompt.tokens.get_common_prefix(input_tokens); + n_past = slot.prompt.tokens.get_common_prefix(input_tokens); // if there is an alora invoked, don't cache after the invocation start - if (slot.alora_invocation_start >= 0) { - SLT_DBG(slot, "only caching to alora invocation start (n_past=%d, alora_invocation_start=%d)\n", slot.n_past, slot.alora_invocation_start); - slot.n_past = std::min(slot.n_past, slot.alora_invocation_start - 1); + if (slot.alora_invocation_start > 0) { + SLT_DBG(slot, "only caching to alora invocation start (n_past = %d, alora_invocation_start = %d)\n", n_past, slot.alora_invocation_start); + n_past = std::min(n_past, slot.alora_invocation_start - 1); } // reuse chunks from the cached prompt by shifting their KV cache in the new position if (params_base.n_cache_reuse > 0) { - size_t head_c = slot.n_past; // cache - size_t head_p = slot.n_past; // current prompt + GGML_ASSERT(!slot.prompt.tokens.has_mtmd); + + size_t head_c = n_past; // cache + size_t head_p = n_past; // current prompt if (mctx) { // we should never reach this GGML_ABORT("not supported by multimodal"); } - SLT_DBG(slot, "trying to reuse chunks with size > %d, slot.n_past = %d\n", params_base.n_cache_reuse, slot.n_past); + SLT_DBG(slot, "trying to reuse chunks with size > %d, n_past = %d\n", params_base.n_cache_reuse, n_past); while (head_c < slot.prompt.tokens.size() && head_p < input_tokens.size()) { size_t n_match = 0; while (head_c + n_match < slot.prompt.tokens.size() && - head_p + n_match < input_tokens.size() && + head_p + n_match < input_tokens.size() && slot.prompt.tokens[head_c + n_match] == input_tokens[head_p + n_match]) { n_match++; @@ -3765,7 +3764,7 @@ struct server_context { for (size_t i = 0; i < n_match; i++) { slot.prompt.tokens.set_token(head_p + i, slot.prompt.tokens[head_c + i]); - slot.n_past++; + n_past++; } head_c += n_match; @@ -3775,31 +3774,31 @@ struct server_context { } } - SLT_DBG(slot, "after context reuse, new slot.n_past = %d\n", slot.n_past); + SLT_DBG(slot, "after context reuse, new n_past = %d\n", n_past); } } else { - // if we don't cache the prompt, we have to remove the entire KV cache - slot.n_past = 0; + // if we don't cache the prompt, we have to remove all previous tokens + n_past = 0; } // note: when n_swa == 0, the model does not use SWA, which is equivalent to a window of 1 const auto n_swa = std::max(1, llama_model_n_swa(model)); // the largest pos_min required for a checkpoint to be useful - const auto pos_min_thold = std::max(0, slot.n_past - n_swa); + const auto pos_min_thold = std::max(0, n_past - n_swa); - if (slot.n_past > 0 && slot.n_past < (int) slot.prompt.tokens.size()) { + if (n_past > 0 && n_past < slot.prompt.n_tokens()) { const auto pos_min = llama_memory_seq_pos_min(llama_get_memory(ctx), slot.id); if (pos_min == -1) { - SLT_ERR(slot, "n_past = %d, slot.prompt.tokens.size() = %d, seq_id = %d, pos_min = %d\n", slot.n_past, (int) slot.prompt.tokens.size(), slot.id, pos_min); + SLT_ERR(slot, "n_past = %d, slot.prompt.tokens.size() = %d, seq_id = %d, pos_min = %d\n", n_past, (int) slot.prompt.tokens.size(), slot.id, pos_min); GGML_ABORT("pos_min == -1, but n_past > 0 - should not happen: https://github.com/ggml-org/llama.cpp/pull/13833#discussion_r2116181237"); } // when the prompt prefix does not match, print the tokens around the mismatch // this is useful for debugging prompt caching { - const int np0 = std::max(slot.n_past - 4, 0); - const int np1 = std::min(slot.n_past + 6, std::min(slot.prompt.tokens.size(), slot.task->tokens.size())); + const int np0 = std::max(n_past - 4, 0); + const int np1 = std::min(n_past + 6, std::min(slot.prompt.tokens.size(), slot.task->tokens.size())); std::stringstream ss0; std::stringstream ss1; @@ -3811,7 +3810,7 @@ struct server_context { ss1 << "new: ... "; for (int i = np0; i < np1; i++) { - if (i == slot.n_past) { + if (i == n_past) { ss0 << " | "; ss1 << " | "; } @@ -3839,7 +3838,10 @@ struct server_context { } if (pos_min > pos_min_thold) { - SLT_WRN(slot, "n_past = %d, slot.prompt.tokens.size() = %d, seq_id = %d, pos_min = %d, n_swa = %d\n", slot.n_past, (int) slot.prompt.tokens.size(), slot.id, pos_min, n_swa); + // TODO: support can be added in the future when corresponding vision models get released + GGML_ASSERT(!slot.prompt.tokens.has_mtmd); + + SLT_WRN(slot, "n_past = %d, slot.prompt.tokens.size() = %d, seq_id = %d, pos_min = %d, n_swa = %d\n", n_past, (int) slot.prompt.tokens.size(), slot.id, pos_min, n_swa); // search for a context checkpoint const auto it = std::find_if( @@ -3863,7 +3865,7 @@ struct server_context { do_reset = true; //printf("[DEBUG] `do_reset` was set to `true` after failing to restore a checkpoint"); } else { - slot.n_past = std::min(slot.n_past, std::max(it->pos_min + 1, it->pos_max)); + n_past = std::min(n_past, std::max(it->pos_min + 1, it->pos_max)); SLT_WRN(slot, "restored context checkpoint (pos_min = %d, pos_max = %d, size = %.3f MiB)\n", it->pos_min, it->pos_max, (float) checkpoint_size / 1024 / 1024); } } @@ -3871,7 +3873,7 @@ struct server_context { if (do_reset) { SLT_WRN(slot, "forcing full prompt re-processing due to lack of cache data (likely due to SWA or hybrid/recurrent memory, see %s)\n", "https://github.com/ggml-org/llama.cpp/pull/13194#issuecomment-2868343055"); - slot.n_past = 0; + n_past = 0; } } } @@ -3891,43 +3893,44 @@ struct server_context { } // [TAG_PROMPT_LOGITS] - if (slot.n_past == slot.n_prompt_tokens() && slot.n_past > 0) { - SLT_WRN(slot, "need to evaluate at least 1 token for each active slot (n_past = %d, n_prompt_tokens = %d)\n", slot.n_past, slot.n_prompt_tokens()); - slot.n_past--; - SLT_WRN(slot, "n_past was set to %d\n", slot.n_past); + if (n_past == slot.task->n_tokens() && n_past > 0) { + SLT_WRN(slot, "need to evaluate at least 1 token for each active slot (n_past = %d, task.n_tokens() = %d)\n", n_past, slot.task->n_tokens()); + n_past--; + SLT_WRN(slot, "n_past was set to %d\n", n_past); } - slot.n_prompt_tokens_cache = slot.n_past; + slot.n_prompt_tokens_cache = n_past; slot.n_prompt_tokens_processed = 0; + + slot.prompt.tokens.keep_first(n_past); } if (!slot.can_split()) { // cannot fit the prompt in the current batch - will try next iter - if (batch.n_tokens + slot.n_prompt_tokens() > n_batch) { + if (batch.n_tokens + slot.task->n_tokens() > n_batch) { continue; } } // truncate any tokens that are beyond n_past for this slot - if (!llama_memory_seq_rm(llama_get_memory(ctx), slot.id, slot.n_past, -1)) { - SLT_WRN(slot, "failed to truncate tokens beyond n_past = %d\n", slot.n_past); + const llama_pos p0 = slot.prompt.tokens.pos_next(); + if (!llama_memory_seq_rm(llama_get_memory(ctx), slot.id, p0, -1)) { + SLT_WRN(slot, "failed to truncate tokens with position >= %d\n", p0); llama_memory_seq_rm(llama_get_memory(ctx), slot.id, -1, -1); // there is no common part left - slot.n_past = 0; slot.n_prompt_tokens_cache = 0; - } - SLT_INF(slot, "n_past = %d, memory_seq_rm [%d, end)\n", slot.n_past, slot.n_past); + slot.prompt.tokens.clear(); + } - // remove the non-common part from the cache - slot.prompt.tokens.keep_first(slot.n_past); + SLT_INF(slot, "n_tokens = %d, memory_seq_rm [%d, end)\n", slot.prompt.n_tokens(), p0); // check if we should process the image - if (slot.n_past < slot.n_prompt_tokens() && input_tokens[slot.n_past] == LLAMA_TOKEN_NULL) { + if (slot.prompt.n_tokens() < slot.task->n_tokens() && input_tokens[slot.prompt.n_tokens()] == LLAMA_TOKEN_NULL) { // process the image - int32_t new_n_past; - int32_t res = input_tokens.process_chunk(ctx, mctx, slot.n_past, slot.id, new_n_past); + size_t n_tokens_out = 0; + int32_t res = input_tokens.process_chunk(ctx, mctx, slot.prompt.n_tokens(), slot.prompt.tokens.pos_next(), slot.id, n_tokens_out); if (res != 0) { SLT_ERR(slot, "failed to process image, res = %d\n", res); send_error(slot, "failed to process image", ERROR_TYPE_SERVER); @@ -3935,16 +3938,13 @@ struct server_context { continue; } + slot.n_prompt_tokens_processed += n_tokens_out; + // add the image chunk to cache { - const auto & chunk = input_tokens.find_chunk(slot.n_past); + const auto & chunk = input_tokens.find_chunk(slot.prompt.n_tokens()); slot.prompt.tokens.push_back(chunk.get()); // copy } - - const int32_t n_pos = new_n_past - slot.n_past; - - slot.n_past += n_pos; - slot.n_prompt_tokens_processed += n_pos; } // If using an alora, there may be uncached tokens that come @@ -3952,8 +3952,8 @@ struct server_context { // tokens before the invocation sequence need to be // processed without the adpter in a separate batch, then // the adapter needs to be enabled for the remaining tokens. - if (lora_all_alora(slot.lora) && slot.alora_invocation_start - 1 > slot.n_past) { - SLT_DBG(slot, "processing pre-alora tokens without the adapter (n_past = %d, alora_invocation_start = %d)\n", slot.n_past, slot.alora_invocation_start); + if (lora_all_alora(slot.lora) && slot.alora_invocation_start - 1 > slot.prompt.n_tokens()) { + SLT_DBG(slot, "processing pre-alora tokens without the adapter (n_tokens = %d, alora_invocation_start = %d)\n", slot.prompt.n_tokens(), slot.alora_invocation_start); const auto & enabled_loras = lora_get_enabled_ids(slot.lora); GGML_ASSERT(enabled_loras.size() == 1); alora_scale = slot.lora[enabled_loras[0]].scale; @@ -3979,9 +3979,9 @@ struct server_context { ); // add prompt tokens for processing in the current batch - while (slot.n_past < slot.n_prompt_tokens() && batch.n_tokens < n_batch) { + while (slot.prompt.n_tokens() < slot.task->n_tokens() && batch.n_tokens < n_batch) { // get next token to process - llama_token cur_tok = input_tokens[slot.n_past]; + llama_token cur_tok = input_tokens[slot.prompt.n_tokens()]; if (cur_tok == LLAMA_TOKEN_NULL) { break; // end of text chunk } @@ -3989,30 +3989,33 @@ struct server_context { // if this is an alora request with pre-invocation // tokens that are not cached, we need to stop filling // this batch at those pre-invocation tokens. - if (alora_scale > 0 && slot.n_past == slot.alora_invocation_start - 1) { - SLT_DBG(slot, "stop prompt batch filling at (n_past = %d, alora_invocation_start = %d)\n", slot.n_past, slot.alora_invocation_start); + if (alora_scale > 0 && slot.prompt.n_tokens() == slot.alora_invocation_start - 1) { + SLT_DBG(slot, "stop prompt batch filling at (n_tokens = %d, alora_invocation_start = %d)\n", slot.prompt.n_tokens(), slot.alora_invocation_start); break; } // embedding requires all tokens in the batch to be output - common_batch_add(batch, cur_tok, slot.n_past, { slot.id }, slot.need_embd()); + common_batch_add(batch, + cur_tok, + slot.prompt.tokens.pos_next(), + { slot.id }, + slot.need_embd()); slot.prompt.tokens.push_back(cur_tok); slot.n_prompt_tokens_processed++; - slot.n_past++; // process the last few tokens of the prompt separately in order to allow for a checkpoint to be created. - if (do_checkpoint && slot.n_prompt_tokens() - slot.n_past == 64) { + if (do_checkpoint && slot.task->n_tokens() - slot.prompt.n_tokens() == 64) { break; } } // SLT_INF(slot, "new slot.prompt.tokens: %s\n", slot.slot.prompt.tokens.str().c_str()); - SLT_INF(slot, "prompt processing progress, n_past = %d, n_tokens = %d, progress = %f\n", slot.n_past, batch.n_tokens, (float) slot.n_past / slot.n_prompt_tokens()); + SLT_INF(slot, "prompt processing progress, n_tokens = %d, batch.n_tokens = %d, progress = %f\n", slot.prompt.n_tokens(), batch.n_tokens, (float) slot.prompt.n_tokens() / slot.task->n_tokens()); // entire prompt has been processed - if (slot.n_past == slot.n_prompt_tokens()) { + if (slot.prompt.n_tokens() == slot.task->n_tokens()) { slot.state = SLOT_STATE_DONE_PROMPT; GGML_ASSERT(batch.n_tokens > 0); @@ -4020,7 +4023,7 @@ struct server_context { common_sampler_reset(slot.smpl); // Process all prompt tokens through sampler system - for (int i = 0; i < slot.n_prompt_tokens(); ++i) { + for (int i = 0; i < slot.task->n_tokens(); ++i) { llama_token id = input_tokens[i]; if (id != LLAMA_TOKEN_NULL) { common_sampler_accept(slot.smpl, id, false); @@ -4033,7 +4036,7 @@ struct server_context { slot.n_decoded = 0; slot.i_batch = batch.n_tokens - 1; - SLT_INF(slot, "prompt done, n_past = %d, n_tokens = %d\n", slot.n_past, batch.n_tokens); + SLT_INF(slot, "prompt done, n_tokens = %d, batch.n_tokens = %d\n", slot.prompt.n_tokens(), batch.n_tokens); const auto pos_min = llama_memory_seq_pos_min(llama_get_memory(ctx), slot.id); const auto pos_max = llama_memory_seq_pos_max(llama_get_memory(ctx), slot.id); @@ -4253,9 +4256,9 @@ struct server_context { // determine the max draft that fits the current slot state int n_draft_max = slot.task->params.speculative.n_max; - // note: n_past is not yet increased for the `id` token sampled above + // note: slot.prompt is not yet expanded with the `id` token sampled above // also, need to leave space for 1 extra token to allow context shifts - n_draft_max = std::min(n_draft_max, slot.n_ctx - slot.n_past - 2); + n_draft_max = std::min(n_draft_max, slot.n_ctx - slot.prompt.n_tokens() - 2); if (slot.n_remaining > 0) { n_draft_max = std::min(n_draft_max, slot.n_remaining - 1); @@ -4291,10 +4294,10 @@ struct server_context { // construct the speculation batch common_batch_clear(slot.batch_spec); - common_batch_add (slot.batch_spec, id, slot.n_past, { slot.id }, true); + common_batch_add (slot.batch_spec, id, slot.prompt.tokens.pos_next(), { slot.id }, true); for (size_t i = 0; i < draft.size(); ++i) { - common_batch_add(slot.batch_spec, draft[i], slot.n_past + 1 + i, { slot.id }, true); + common_batch_add(slot.batch_spec, draft[i], slot.prompt.tokens.pos_next() + 1 + i, { slot.id }, true); } SLT_DBG(slot, "decoding speculative batch, size = %d\n", slot.batch_spec.n_tokens); @@ -4304,7 +4307,6 @@ struct server_context { // the accepted tokens from the speculation const auto ids = common_sampler_sample_and_accept_n(slot.smpl, ctx, draft); - slot.n_past += ids.size(); slot.n_decoded += ids.size(); // update how many tokens out of those tested were accepted @@ -4313,7 +4315,7 @@ struct server_context { slot.prompt.tokens.push_back(id); slot.prompt.tokens.insert({ids.begin(), ids.end() - 1}); - llama_memory_seq_rm(llama_get_memory(ctx), slot.id, slot.n_past, -1); + llama_memory_seq_rm(llama_get_memory(ctx), slot.id, slot.prompt.n_tokens(), -1); for (size_t i = 0; i < ids.size(); ++i) { completion_token_output result; @@ -4334,7 +4336,7 @@ struct server_context { } } - SLT_DBG(slot, "accepted %d/%d draft tokens, new n_past = %d\n", (int) ids.size() - 1, (int) draft.size(), slot.n_past); + SLT_DBG(slot, "accepted %d/%d draft tokens, new n_tokens = %d\n", (int) ids.size() - 1, (int) draft.size(), slot.prompt.n_tokens()); } } @@ -4662,9 +4664,9 @@ int main(int argc, char ** argv) { {"help", "Total number of llama_decode() calls"}, {"value", res_task->n_decode_total} }, { - {"name", "n_past_max"}, - {"help", "Largest observed n_past."}, - {"value", res_task->n_past_max} + {"name", "n_tokens_max"}, + {"help", "Largest observed n_tokens."}, + {"value", res_task->n_tokens_max} }, { {"name", "n_busy_slots_per_decode"}, {"help", "Average number of busy slots per llama_decode() call"}, diff --git a/tools/server/utils.hpp b/tools/server/utils.hpp index cc48f5a9d0a..fb95361b282 100644 --- a/tools/server/utils.hpp +++ b/tools/server/utils.hpp @@ -1080,19 +1080,22 @@ struct server_tokens { private: // disallow accessing these members directly, risking out-of-sync - // map a **start** position in tokens to the image chunk - std::unordered_map map_pos_to_media; + // map a **start** index in tokens to the image chunk + // note: the order need to be in-sync with tokens + std::map map_idx_to_media; // list of tokens - // it can include LLAMA_TOKEN_NULL, which is used to indicate a token that is not a text token - // a mtmd_input_chunk can occupy multiple tokens, one llama_token per **position** - // important: for models using mrope, an image can contain multiple tokens but will use only one **position** + // if the token is LLAMA_TOKEN_NULL, it indicates that this position is occupied by media chunk + // otherwise, it is a normal text token + // note: a non-text chunk can occupy multiple tokens (aka memory cells) in the token list + // note(2): for M-RoPE, an image can occupy different number of pos; do not assume 1-to-1 mapping tokens <-> pos llama_tokens tokens; - // for ex. with input of 5 text tokens and 2 images: - // [0] [1] [2] [3] [4] [img0] [img0] [img0] [img1] [img1] - // pos 0 1 2 3 4 5 6 7 8 9 - // map_pos_to_media will contain: {5, img0}, {8, img1} + // for ex. with input of 5 text tokens and 2 images (each image occupies 3 tokens and 2 pos): + // [0] [1] [2] [3] [4] [img0] [img0] [img0] [img1] [img1] [img1] + // idx 0 1 2 3 4 5 6 7 8 9 10 + // pos 0 1 2 3 4 5 5 5 7 7 7 + // map_idx_to_media will contain: {5, img0}, {8, img1} public: server_tokens() = default; @@ -1117,13 +1120,31 @@ struct server_tokens { } } - server_tokens(const llama_tokens & tokens, bool has_mtmd) : has_mtmd(has_mtmd), tokens(tokens) {} + server_tokens(const llama_tokens & tokens, bool has_mtmd) : has_mtmd(has_mtmd), tokens(tokens) { + } + + llama_pos pos_next() const { + if (!has_mtmd) { + return tokens.size(); + } + + llama_pos res = tokens.size(); + + for (auto it = map_idx_to_media.begin(); it != map_idx_to_media.end(); ++it) { + const auto & chunk = it->second; + res += mtmd_input_chunk_get_n_pos(chunk.get()) - mtmd_input_chunk_get_n_tokens(chunk.get()); + } + + return res; + } // for debugging std::string str() const { std::ostringstream oss; oss << "tokens: "; - for (const auto & t : tokens) { + for (size_t idx = 0; idx < tokens.size(); ++idx) { + llama_token t = tokens[idx]; + oss << "idx:" << idx << " "; if (t == LLAMA_TOKEN_NULL) { oss << " "; } else { @@ -1131,16 +1152,16 @@ struct server_tokens { } } oss << "\n"; - oss << "image pos: "; - for (const auto & it : map_pos_to_media) { + oss << "image idx: "; + for (const auto & it : map_idx_to_media) { oss << it.first << ", "; } return oss.str(); } - const mtmd::input_chunk_ptr & find_chunk(llama_pos pos) const { - auto it = map_pos_to_media.find(pos); - if (it != map_pos_to_media.end()) { + const mtmd::input_chunk_ptr & find_chunk(size_t idx) const { + auto it = map_idx_to_media.find(idx); + if (it != map_idx_to_media.end()) { return it->second; } throw std::runtime_error("Chunk not found"); @@ -1158,13 +1179,13 @@ struct server_tokens { auto type = mtmd_input_chunk_get_type(chunk); if (type == MTMD_INPUT_CHUNK_TYPE_IMAGE || type == MTMD_INPUT_CHUNK_TYPE_AUDIO) { GGML_ASSERT(has_mtmd); - const int n_pos = mtmd_input_chunk_get_n_pos(chunk); - llama_pos start_pos = tokens.size(); - for (int i = 0; i < n_pos; ++i) { + const size_t n_tokens = mtmd_input_chunk_get_n_tokens(chunk); + size_t start_idx = tokens.size(); + for (size_t i = 0; i < n_tokens; ++i) { tokens.emplace_back(LLAMA_TOKEN_NULL); } mtmd::input_chunk_ptr new_chunk(mtmd_input_chunk_copy(chunk)); - map_pos_to_media[start_pos] = std::move(new_chunk); + map_idx_to_media[start_idx] = std::move(new_chunk); } else if (type == MTMD_INPUT_CHUNK_TYPE_TEXT) { size_t n_tokens; const auto * text_tokens = mtmd_input_chunk_get_tokens_text(chunk, &n_tokens); @@ -1178,7 +1199,7 @@ struct server_tokens { // appends server tokens, updates the media map. copies media chunks. void push_back(server_tokens & tokens) { - size_t start_pos = size(); + size_t start_idx = size(); for (size_t i = 0; i < tokens.size(); i++) { push_back(tokens[i]); } @@ -1186,10 +1207,10 @@ struct server_tokens { // Assert if we are copying MTMD chunks to a server_tokens that does not have mtmd. // We could also just check, but this will prevent silently dropping MTMD data. GGML_ASSERT(has_mtmd); - for (auto it = tokens.map_pos_to_media.begin(); it != tokens.map_pos_to_media.end(); ) { - auto * chunk = tokens.map_pos_to_media[it->first].get(); + for (auto it = tokens.map_idx_to_media.begin(); it != tokens.map_idx_to_media.end(); ) { + auto * chunk = tokens.map_idx_to_media[it->first].get(); mtmd::input_chunk_ptr new_chunk(mtmd_input_chunk_copy(chunk)); - map_pos_to_media[start_pos+it->first] = std::move(new_chunk); + map_idx_to_media[start_idx+it->first] = std::move(new_chunk); } } } @@ -1245,10 +1266,10 @@ struct server_tokens { } } // remove all image chunks that are not used anymore - for (auto it = map_pos_to_media.begin(); it != map_pos_to_media.end(); ) { - llama_pos pos = it->first; - if (pos >= (llama_pos)n) { - it = map_pos_to_media.erase(it); + for (auto it = map_idx_to_media.begin(); it != map_idx_to_media.end(); ) { + size_t idx = it->first; + if (idx >= n) { + it = map_idx_to_media.erase(it); } else { ++it; } @@ -1296,12 +1317,12 @@ struct server_tokens { const std::string id_ai = mtmd_input_chunk_get_id(a_chunk.get()); const std::string id_bi = mtmd_input_chunk_get_id(b_chunk.get()); - const size_t pos_a = mtmd_input_chunk_get_n_pos(a_chunk.get()); - const size_t pos_b = mtmd_input_chunk_get_n_pos(b_chunk.get()); + const size_t n_tok_a = mtmd_input_chunk_get_n_tokens(a_chunk.get()); + const size_t n_tok_b = mtmd_input_chunk_get_n_tokens(b_chunk.get()); - if (id_ai == id_bi && pos_a == pos_b) { - GGML_ASSERT(pos_a > 0 && "Invalid media chunk"); // should never happen - i += pos_a - 1; // will be +1 by the for loop + if (id_ai == id_bi && n_tok_a == n_tok_b) { + GGML_ASSERT(n_tok_a > 0 && "Invalid media chunk"); // should never happen + i += n_tok_a - 1; // will be +1 by the for loop continue; } @@ -1329,8 +1350,8 @@ struct server_tokens { if (t == LLAMA_TOKEN_NULL) { try { const auto & chunk = find_chunk(i); - size_t n_pos = mtmd_input_chunk_get_n_pos(chunk.get()); - i += n_pos - 1; // will be +1 by the for loop + size_t n_tokens = mtmd_input_chunk_get_n_tokens(chunk.get()); + i += n_tokens - 1; // will be +1 by the for loop } catch (const std::exception & e) { return false; } @@ -1345,19 +1366,20 @@ struct server_tokens { int32_t process_chunk( llama_context * ctx, mtmd_context * mctx, - llama_pos n_past, + size_t idx, + llama_pos pos, int32_t seq_id, - llama_pos & n_pos_out) const { - const auto & chunk = find_chunk(n_past); + size_t & n_tokens_out) const { + const auto & chunk = find_chunk(idx); const char * name = mtmd_input_chunk_get_type(chunk.get()) == MTMD_INPUT_CHUNK_TYPE_IMAGE ? "image" : "audio"; SRV_INF("processing %s...\n", name); int32_t n_batch = llama_n_batch(ctx); int64_t t0 = ggml_time_ms(); - llama_pos new_n_past = n_past; + llama_pos new_n_past; // unused for now int32_t result = mtmd_helper_eval_chunk_single(mctx, ctx, chunk.get(), - n_past, + pos, seq_id, n_batch, true, // logits last @@ -1365,10 +1387,10 @@ struct server_tokens { SRV_INF("%s processed in %" PRId64 " ms\n", name, ggml_time_ms() - t0); if (result != 0) { LOG_ERR("mtmd_helper_eval failed with status %d", result); - n_pos_out = n_past; + n_tokens_out = 0; return result; } - n_pos_out = new_n_past; + n_tokens_out = mtmd_input_chunk_get_n_tokens(chunk.get()); return 0; } }; From 16724b5b6836a2d4b8936a5824d2ff27c52b4517 Mon Sep 17 00:00:00 2001 From: chansikpark Date: Thu, 30 Oct 2025 14:22:23 -0400 Subject: [PATCH 025/185] server : bump request URI max length to 32768 (#16862) --- tools/server/utils.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/server/utils.hpp b/tools/server/utils.hpp index fb95361b282..b6198edfc48 100644 --- a/tools/server/utils.hpp +++ b/tools/server/utils.hpp @@ -13,6 +13,8 @@ #define CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH 1048576 // increase backlog size to avoid connection resets for >> 1 slots #define CPPHTTPLIB_LISTEN_BACKLOG 512 +// increase max URI length to handle longer prompts in query string +#define CPPHTTPLIB_REQUEST_URI_MAX_LENGTH 32768 // disable Nagle's algorithm #define CPPHTTPLIB_TCP_NODELAY true #include From ce18efeaf1234bd08f25bc08f88ef95cf5d9e51f Mon Sep 17 00:00:00 2001 From: RodriMora Date: Thu, 30 Oct 2025 23:15:03 +0100 Subject: [PATCH 026/185] convert : update transformers requirements (#16866) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update requirements-convert_legacy_llama.txt Updated requirements to support Qwen3-VL in transformers 4.57.1 version * Update requirements/requirements-convert_legacy_llama.txt Co-authored-by: Sigbjørn Skjæret --------- Co-authored-by: Sigbjørn Skjæret --- requirements/requirements-convert_legacy_llama.txt | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/requirements/requirements-convert_legacy_llama.txt b/requirements/requirements-convert_legacy_llama.txt index f6076142cee..dbab3b9508f 100644 --- a/requirements/requirements-convert_legacy_llama.txt +++ b/requirements/requirements-convert_legacy_llama.txt @@ -1,14 +1,7 @@ numpy~=1.26.4 sentencepiece~=0.2.0 -# Embedding Gemma is currently a preview release: -# https://github.com/huggingface/transformers/releases/tag/v4.56.0-Embedding-Gemma-preview - -# The version is needed to be able to convert Embedding Gemma models to GGUF format: -git+https://github.com/huggingface/transformers@v4.56.0-Embedding-Gemma-preview - -# Once Embedding Gemma is officially released, we can switch to: -#transformers>=4.57.1,<5.0.0 +transformers>=4.57.1,<5.0.0 gguf>=0.1.0 protobuf>=4.21.0,<5.0.0 From 9984cbb61d12491d604484fb38b678fa15064061 Mon Sep 17 00:00:00 2001 From: lhez Date: Thu, 30 Oct 2025 16:00:20 -0700 Subject: [PATCH 027/185] opencl: fix boundary handling for mul_mm (#16875) --- ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl | 6 +++--- ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl | 4 ++-- ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl b/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl index 1a1bfe144f6..6982f8f514d 100644 --- a/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl +++ b/ggml/src/ggml-opencl/kernels/mul_mm_f16_f32_l4_lm.cl @@ -79,8 +79,8 @@ kernel void kernel_mul_mm_f16_f32_l4_lm( for (int block = 0; block < ne00; block += BK) { for (int l = 0; l < BM; l += loadstride_a) { - if (loadc_a + l < ne01) { - const int idx = pos_a + (loadc_a + l) * stride_a / LOAD_VEC_A + loadr_a; + if (ir*BM + loadc_a + l < ne01) { + const int idx = pos_a + (loadc_a + l) * stride_a / LOAD_VEC_A + loadr_a; buf_a[(loadr_a * LOAD_VEC_A + 0) * BM + loadc_a + l] = src0[idx].s0; buf_a[(loadr_a * LOAD_VEC_A + 1) * BM + loadc_a + l] = src0[idx].s1; buf_a[(loadr_a * LOAD_VEC_A + 2) * BM + loadc_a + l] = src0[idx].s2; @@ -94,7 +94,7 @@ kernel void kernel_mul_mm_f16_f32_l4_lm( } for (int l = 0; l < BN; l += loadstride_b) { - if (loadc_b + l < ne11) { + if (ic*BN + loadc_b + l < ne11) { const int idx = pos_b + (loadc_b + l) * stride_b / LOAD_VEC_B + loadr_b; buf_b[(loadr_b * LOAD_VEC_B + 0) * BN + loadc_b + l] = src1[idx].s0; buf_b[(loadr_b * LOAD_VEC_B + 1) * BN + loadc_b + l] = src1[idx].s1; diff --git a/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl b/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl index 39a5d4868ff..d7d5ba647e7 100644 --- a/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl +++ b/ggml/src/ggml-opencl/kernels/mul_mm_f32_f32_l4_lm.cl @@ -79,7 +79,7 @@ kernel void kernel_mul_mm_f32_f32_l4_lm( for (int block = 0; block < ne00; block += BK) { for (int l = 0; l < BM; l += loadstride_a) { - if (loadc_a + l < ne01) { + if (ir*BM + loadc_a + l < ne01) { const int idx = pos_a + (loadc_a + l) * stride_a / LOAD_VEC_A + loadr_a; buf_a[(loadr_a * LOAD_VEC_A + 0) * BM + loadc_a + l] = src0[idx].s0; buf_a[(loadr_a * LOAD_VEC_A + 1) * BM + loadc_a + l] = src0[idx].s1; @@ -94,7 +94,7 @@ kernel void kernel_mul_mm_f32_f32_l4_lm( } for (int l = 0; l < BN; l += loadstride_b) { - if (loadc_b + l < ne11) { + if (ic*BN + loadc_b + l < ne11) { const int idx = pos_b + (loadc_b + l) * stride_b / LOAD_VEC_B + loadr_b; buf_b[(loadr_b * LOAD_VEC_B + 0) * BN + loadc_b + l] = src1[idx].s0; buf_b[(loadr_b * LOAD_VEC_B + 1) * BN + loadc_b + l] = src1[idx].s1; diff --git a/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl b/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl index fd47e8a89dc..147b66f6692 100644 --- a/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl +++ b/ggml/src/ggml-opencl/kernels/mul_mm_q8_0_f32_l4_lm.cl @@ -78,7 +78,7 @@ kernel void kernel_mul_mm_q8_0_f32_l4_lm( for (int block = 0; block < ne00; block += BK) { for (int l = 0; l < BM; l += loadstride_a) { - if (loadc_a + l < ne01) { + if (ir*BM + loadc_a + l < ne01) { int idx = pos_a + (loadc_a + l) * stride_a / LOAD_VEC_A + loadr_a; int ib = idx / 8; int iqs = idx % 8; @@ -101,7 +101,7 @@ kernel void kernel_mul_mm_q8_0_f32_l4_lm( } for (int l = 0; l < BN; l += loadstride_b) { - if (loadc_b + l < ne11) { + if (ic*BN + loadc_b + l < ne11) { int idx = pos_b + (loadc_b + l) * stride_b / LOAD_VEC_B + loadr_b; buf_b[(loadr_b * LOAD_VEC_B + 0) * BN + loadc_b + l] = src1[idx].s0; buf_b[(loadr_b * LOAD_VEC_B + 1) * BN + loadc_b + l] = src1[idx].s1; From 6eb208d17ea29bb60295d9a2b5e7122dfb8f4b55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Fri, 31 Oct 2025 00:34:27 +0100 Subject: [PATCH 028/185] ci : enable free-disk-space on cuda docker build (#16877) --- .github/workflows/docker.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index f73a2bc9f45..7ca11b1dffc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -40,7 +40,7 @@ jobs: # https://github.com/ggml-org/llama.cpp/issues/11888 #- { tag: "cpu", dockerfile: ".devops/cpu.Dockerfile", platforms: "linux/amd64,linux/arm64", full: true, light: true, server: true, free_disk_space: false } - { tag: "cpu", dockerfile: ".devops/cpu.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: false, runs_on: "ubuntu-22.04" } - - { tag: "cuda", dockerfile: ".devops/cuda.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: false, runs_on: "ubuntu-22.04" } + - { tag: "cuda", dockerfile: ".devops/cuda.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: true, runs_on: "ubuntu-22.04" } - { tag: "musa", dockerfile: ".devops/musa.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: true, runs_on: "ubuntu-22.04" } - { tag: "intel", dockerfile: ".devops/intel.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: true, runs_on: "ubuntu-22.04" } - { tag: "vulkan", dockerfile: ".devops/vulkan.Dockerfile", platforms: "linux/amd64", full: true, light: true, server: true, free_disk_space: false, runs_on: "ubuntu-22.04" } From 13002a08960e51a76c4d696165b5d7638d2f2b99 Mon Sep 17 00:00:00 2001 From: l3utterfly Date: Fri, 31 Oct 2025 12:46:31 +0800 Subject: [PATCH 029/185] ggml-hexagon: respect input size when getting/setting tensor data (#16836) * respect input size when getting/setting tensor data allows partial repacking/copying when get tensor size is smaller than the actual tensor * Removed duplicate repack_mxfp4_mxfp4x4x2 function --- ggml/src/ggml-hexagon/ggml-hexagon.cpp | 180 +++++++++++++++++++++++-- 1 file changed, 168 insertions(+), 12 deletions(-) diff --git a/ggml/src/ggml-hexagon/ggml-hexagon.cpp b/ggml/src/ggml-hexagon/ggml-hexagon.cpp index 2d376a6025c..945652263d4 100644 --- a/ggml/src/ggml-hexagon/ggml-hexagon.cpp +++ b/ggml/src/ggml-hexagon/ggml-hexagon.cpp @@ -676,6 +676,15 @@ static void repack_q4_0_q4x4x2(ggml_tensor * t, const void * data, size_t size) size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_Q4_0x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to read more data than is available in the source buffer 'data' + // or write more than the tensor can hold. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -687,7 +696,8 @@ static void repack_q4_0_q4x4x2(ggml_tensor * t, const void * data, size_t size) init_row_q4x4x2((block_q4_0 *) buf_pd, t->ne[0]); // init padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) data + (i * row_size); uint8_t * dst = (uint8_t *) t->data + (i * row_size); @@ -696,6 +706,25 @@ static void repack_q4_0_q4x4x2(ggml_tensor * t, const void * data, size_t size) memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) data + (i * row_size); + uint8_t * dst = (uint8_t *) t->data + (i * row_size); + + // re-init the row because we are potentially copying a partial row + init_row_q4x4x2((block_q4_0 *) buf_pd, t->ne[0]); + + // Copy only the remaining bytes from the source. + memcpy(buf_pd, src, n_rem_bytes); + + // Repack the entire buffer + repack_row_q4x4x2((uint8_t *) buf_rp, (const block_q4_0 *) buf_pd, t->ne[0]); + + // Write only the corresponding remaining bytes to the destination tensor. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -708,6 +737,14 @@ static void repack_q4x4x2_q4_0(void * data, const ggml_tensor * t, size_t size) size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_Q4_0x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to copy more data than the tensor actually contains. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -719,7 +756,8 @@ static void repack_q4x4x2_q4_0(void * data, const ggml_tensor * t, size_t size) memset(buf_pd, 0, row_size_pd); // clear-out padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) t->data + (i * row_size); uint8_t * dst = (uint8_t *) data + (i * row_size); @@ -728,6 +766,20 @@ static void repack_q4x4x2_q4_0(void * data, const ggml_tensor * t, size_t size) memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) t->data + (i * row_size); + uint8_t * dst = (uint8_t *) data + (i * row_size); + + // We still need to read and unpack the entire source row because quantization is block-based. + memcpy(buf_pd, src, row_size); + unpack_row_q4x4x2((block_q4_0 *) buf_rp, (const uint8_t *) buf_pd, t->ne[0]); + + // But we only copy the remaining number of bytes to the destination. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -950,6 +1002,15 @@ static void repack_q8_0_q8x4x2(ggml_tensor * t, const void * data, size_t size) size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_Q8_0x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to read more data than is available in the source buffer 'data' + // or write more than the tensor can hold. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -961,7 +1022,8 @@ static void repack_q8_0_q8x4x2(ggml_tensor * t, const void * data, size_t size) init_row_q8x4x2((block_q8_0 *) buf_pd, t->ne[0]); // init padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) data + (i * row_size); uint8_t * dst = (uint8_t *) t->data + (i * row_size); @@ -970,6 +1032,25 @@ static void repack_q8_0_q8x4x2(ggml_tensor * t, const void * data, size_t size) memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) data + (i * row_size); + uint8_t * dst = (uint8_t *) t->data + (i * row_size); + + // re-init the row because we are potentially copying a partial row + init_row_q8x4x2((block_q8_0 *) buf_pd, t->ne[0]); + + // Copy only the remaining bytes from the source. + memcpy(buf_pd, src, n_rem_bytes); + + // Repack the entire buffer + repack_row_q8x4x2((uint8_t *) buf_rp, (const block_q8_0 *) buf_pd, t->ne[0]); + + // Write only the corresponding remaining bytes to the destination tensor. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -982,6 +1063,14 @@ static void repack_q8x4x2_q8_0(void * data, const ggml_tensor * t, size_t size) size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_Q8_0x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to copy more data than the tensor actually contains. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -993,7 +1082,8 @@ static void repack_q8x4x2_q8_0(void * data, const ggml_tensor * t, size_t size) memset(buf_pd, 0, row_size_pd); // clear-out padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) t->data + (i * row_size); uint8_t * dst = (uint8_t *) data + (i * row_size); @@ -1002,6 +1092,20 @@ static void repack_q8x4x2_q8_0(void * data, const ggml_tensor * t, size_t size) memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) t->data + (i * row_size); + uint8_t * dst = (uint8_t *) data + (i * row_size); + + // We still need to read and unpack the entire source row because quantization is block-based. + memcpy(buf_pd, src, row_size); + unpack_row_q8x4x2((block_q8_0 *) buf_rp, (const uint8_t *) buf_pd, t->ne[0]); + + // But we only copy the remaining number of bytes to the destination. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -1249,6 +1353,15 @@ static void repack_mxfp4_mxfp4x4x2(ggml_tensor * t, const void * data, size_t si size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_MXFP4x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to read more data than is available in the source buffer 'data' + // or write more than the tensor can hold. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -1260,7 +1373,8 @@ static void repack_mxfp4_mxfp4x4x2(ggml_tensor * t, const void * data, size_t si init_row_mxfp4x4x2((block_mxfp4 *) buf_pd, t->ne[0]); // init padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) data + (i * row_size); uint8_t * dst = (uint8_t *) t->data + (i * row_size); @@ -1269,6 +1383,25 @@ static void repack_mxfp4_mxfp4x4x2(ggml_tensor * t, const void * data, size_t si memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) data + (i * row_size); + uint8_t * dst = (uint8_t *) t->data + (i * row_size); + + // re-init the row because we are potentially copying a partial row + init_row_mxfp4x4x2((block_mxfp4 *) buf_pd, t->ne[0]); + + // Copy only the remaining bytes from the source. + memcpy(buf_pd, src, n_rem_bytes); + + // Repack the entire buffer (partial data + zero padding). + repack_row_mxfp4x4x2((uint8_t *) buf_rp, (const block_mxfp4 *) buf_pd, t->ne[0]); + + // Write only the corresponding remaining bytes to the destination tensor. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -1281,6 +1414,14 @@ static void repack_mxfp4x4x2_mxfp4(void * data, const ggml_tensor * t, size_t si size_t row_size_pd = ggml_row_size(t->type, hex_round_up(t->ne[0], QK_MXFP4x4x2)); // extra elements for the pad size_t row_size_rp = row_size * 2; // extra space for tmp pad (if any) + // Ensure we don't try to copy more data than the tensor actually contains. + const size_t total_tensor_size = (size_t)nrows * row_size; + const size_t n_bytes_to_copy = size < total_tensor_size ? size : total_tensor_size; + + // Calculate how many full rows and how many remaining bytes we need to process. + const int64_t n_full_rows = n_bytes_to_copy / row_size; + const size_t n_rem_bytes = n_bytes_to_copy % row_size; + void * buf_pd = ggml_aligned_malloc(row_size_pd); GGML_ASSERT(buf_pd != NULL); @@ -1292,7 +1433,8 @@ static void repack_mxfp4x4x2_mxfp4(void * data, const ggml_tensor * t, size_t si memset(buf_pd, 0, row_size_pd); // clear-out padded buffer to make sure the tail is all zeros - for (int64_t i = 0; i < nrows; i++) { + // 1. Process all the full rows + for (int64_t i = 0; i < n_full_rows; i++) { const uint8_t * src = (const uint8_t *) t->data + (i * row_size); uint8_t * dst = (uint8_t *) data + (i * row_size); @@ -1301,6 +1443,20 @@ static void repack_mxfp4x4x2_mxfp4(void * data, const ggml_tensor * t, size_t si memcpy(dst, buf_rp, row_size); } + // 2. Process the final, potentially partial, row + if (n_rem_bytes > 0) { + const int64_t i = n_full_rows; + const uint8_t * src = (const uint8_t *) t->data + (i * row_size); + uint8_t * dst = (uint8_t *) data + (i * row_size); + + // We still need to read and unpack the entire source row because the format is block-based. + memcpy(buf_pd, src, row_size); + unpack_row_mxfp4x4x2((block_mxfp4 *) buf_rp, (const uint8_t *) buf_pd, t->ne[0]); + + // But we only copy the remaining number of bytes to the destination to respect the size limit. + memcpy(dst, buf_rp, n_rem_bytes); + } + ggml_aligned_free(buf_pd, row_size_pd); ggml_aligned_free(buf_rp, row_size_rp); } @@ -1319,19 +1475,19 @@ static void ggml_backend_hexagon_buffer_set_tensor(ggml_backend_buffer_t buffer, switch (tensor->type) { case GGML_TYPE_Q4_0: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_q4_0_q4x4x2(tensor, data, size); break; case GGML_TYPE_Q8_0: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_q8_0_q8x4x2(tensor, data, size); break; case GGML_TYPE_MXFP4: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_mxfp4_mxfp4x4x2(tensor, data, size); break; @@ -1355,19 +1511,19 @@ static void ggml_backend_hexagon_buffer_get_tensor(ggml_backend_buffer_t buffer, switch (tensor->type) { case GGML_TYPE_Q4_0: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_q4x4x2_q4_0(data, tensor, size); break; case GGML_TYPE_Q8_0: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_q8x4x2_q8_0(data, tensor, size); break; case GGML_TYPE_MXFP4: GGML_ASSERT(offset == 0); - GGML_ASSERT(size == ggml_nbytes(tensor)); + GGML_ASSERT(offset + size <= ggml_nbytes(tensor)); repack_mxfp4x4x2_mxfp4(data, tensor, size); break; From d2a2673dd1c86a01ab010e18b13b8bb959968c48 Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Fri, 31 Oct 2025 08:14:49 +0100 Subject: [PATCH 030/185] vulkan: fix shmem overrun in mmq id shader (#16873) * vulkan: fix shmem overrun in mmq id shader * metal : fix mul_mm_id --------- Co-authored-by: Georgi Gerganov --- ggml/src/ggml-metal/ggml-metal-device.cpp | 2 +- ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp | 4 ++++ ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl | 2 +- tests/test-backend-ops.cpp | 3 +++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/ggml/src/ggml-metal/ggml-metal-device.cpp b/ggml/src/ggml-metal/ggml-metal-device.cpp index 1a3c7873b74..5607deaf414 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.cpp +++ b/ggml/src/ggml-metal/ggml-metal-device.cpp @@ -677,7 +677,7 @@ ggml_metal_pipeline_t ggml_metal_library_get_pipeline_mul_mm_id_map0(ggml_metal_ char name[256]; snprintf(base, 256, "kernel_mul_mm_id_map0_ne20_%d", ne20); - snprintf(name, 256, "%s", base); + snprintf(name, 256, "%s_ne02=%d", base, ne02); ggml_metal_pipeline_t res = ggml_metal_library_get_pipeline(lib, name); if (res) { diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp index 8b238ac4bc1..d955b4fc7af 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq.comp @@ -82,9 +82,13 @@ layout (constant_id = 10) const uint WARP = 32; #include "mul_mmq_shmem_types.glsl" +#ifdef MUL_MAT_ID +#define BK_STEP 1 +#else #ifndef BK_STEP #define BK_STEP 4 #endif +#endif // Shared memory cache shared block_a_cache buf_a[BM * BK_STEP]; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl index 72fec440490..1c0f5306f38 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mmq_shmem_types.glsl @@ -27,7 +27,7 @@ struct block_a_cache { #elif defined(DATA_A_Q8_0) #define QUANT_R_MMQ 1 // AMD likes 4, Intel likes 1 and Nvidia likes 2 -#define BK_STEP 1 +// #define BK_STEP 1 struct block_a_cache { int32_t qs[32/4]; FLOAT_TYPE dm; diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 92361d6f0f4..fa12c06ccdd 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -6880,6 +6880,9 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_mul_mat_id(GGML_TYPE_F16, GGML_TYPE_F32, 1, 1, false, 8, 16, 1)); test_cases.emplace_back(new test_mul_mat_id(GGML_TYPE_F16, GGML_TYPE_F32, 16, 16, false, 32, 32, 32, 3)); + // gpt-oss issue with Vulkan mmq_id + test_cases.emplace_back(new test_mul_mat_id(GGML_TYPE_MXFP4, GGML_TYPE_F32, 32, 2, false, 2880, 32, 2880)); + for (ggml_type type_a : base_types) { for (ggml_type type_b : {GGML_TYPE_F32 /*, GGML_TYPE_F16 */}) { for (int n_mats : {4, 8}) { From 2976b0374d36609b0429dd6ce48807e2ad39a7c2 Mon Sep 17 00:00:00 2001 From: Masato Nakasaka Date: Fri, 31 Oct 2025 16:18:59 +0900 Subject: [PATCH 031/185] vulkan: Fix crash when FP16 mul_mat accumulation is not supported (#16796) * Experimenting crash fix * added assert for aborting and fixed comment * changed to check if a pipeline is empty or not * Moved function in class definition * replaced with is_empty * Modified is_empty to check only unaligned pipelines --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index b61879aa5d3..c3e5a9eccc3 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -145,8 +145,13 @@ static void ggml_vk_destroy_pipeline(vk::Device& device, vk_pipeline& pipeline); struct vk_matmul_pipeline_struct { vk_pipeline l, m, s; vk_pipeline a_l, a_m, a_s; + // Returns true when all unaligned pipelines are null. + // We only check for unaligned variants since one of the unaligned pipelines must exist + // while aligned pipelines are optional + bool is_empty() const { + return l == nullptr && m == nullptr && s == nullptr; + } }; - typedef std::shared_ptr vk_matmul_pipeline; struct vk_matmul_pipeline2 { @@ -5079,7 +5084,7 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_pipeline(ggml_backend_vk_conte if (src1_type == GGML_TYPE_Q8_1) { vk_matmul_pipeline pipelines = ctx->device->pipeline_dequant_mul_mat_mat_q8_1[src0_type].f32acc; - if (pipelines->s == nullptr && pipelines->m == nullptr && pipelines->l == nullptr) { + if (pipelines->is_empty()) { return nullptr; } @@ -5228,7 +5233,7 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_id_pipeline(ggml_backend_vk_co if (src1_type == GGML_TYPE_Q8_1) { vk_matmul_pipeline pipelines = ctx->device->pipeline_dequant_mul_mat_mat_id_q8_1[src0_type].f32acc; - if (pipelines->s == nullptr && pipelines->m == nullptr && pipelines->l == nullptr) { + if (pipelines->is_empty()) { return nullptr; } @@ -5263,16 +5268,17 @@ static vk_matmul_pipeline ggml_vk_get_mul_mat_mat_id_pipeline(ggml_backend_vk_co return nullptr; } + vk_matmul_pipeline2& mmp = ctx->device->pipeline_dequant_mul_mat_mat_id[src0_type]; // XXX TODO 'prec' is not actually allowed in mul_mat_id. bool prefer_fp16acc = ctx->device->fp16 /*&& prec == GGML_PREC_DEFAULT*/; - bool support_fp16acc = ctx->device->pipeline_dequant_mul_mat_mat_id[src0_type].f16acc != nullptr; - bool support_fp32acc = ctx->device->pipeline_dequant_mul_mat_mat_id[src0_type].f32acc != nullptr; + bool support_fp16acc = !mmp.f16acc->is_empty(); + bool support_fp32acc = !mmp.f32acc->is_empty(); if (support_fp16acc && (prefer_fp16acc || !support_fp32acc)) { - return ctx->device->pipeline_dequant_mul_mat_mat_id[src0_type].f16acc; + return mmp.f16acc; } else { GGML_ASSERT(support_fp32acc); - return ctx->device->pipeline_dequant_mul_mat_mat_id[src0_type].f32acc; + return mmp.f32acc; } } From d2d931f173b8a736b08999436e9259aafddec718 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Fri, 31 Oct 2025 02:34:47 -0500 Subject: [PATCH 032/185] vulkan: disable spirv-opt for rope shaders (#16872) --- ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp index e6ec589fb84..bd178875d55 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp @@ -317,7 +317,8 @@ void string_to_spv_func(std::string name, std::string in_path, std::string out_p // disable spirv-opt for coopmat shaders for https://github.com/ggerganov/llama.cpp/issues/10734 // disable spirv-opt for bf16 shaders for https://github.com/ggml-org/llama.cpp/issues/15344 - std::string opt_level = (coopmat || name.find("bf16") != std::string::npos) ? "" : "-O"; + // disable spirv-opt for rope shaders for https://github.com/ggml-org/llama.cpp/issues/16860 + std::string opt_level = (coopmat || name.find("bf16") != std::string::npos || name.find("rope") != std::string::npos) ? "" : "-O"; #ifdef _WIN32 std::vector cmd = {GLSLC, "-fshader-stage=compute", target_env, opt_level, "\"" + in_path + "\"", "-o", "\"" + out_path + "\""}; From 0f715b4e759acceccb9f437cfd2a988fff85514a Mon Sep 17 00:00:00 2001 From: Daniel Bevenius Date: Fri, 31 Oct 2025 09:51:26 +0100 Subject: [PATCH 033/185] server : fix typos in server.cpp comments [no ci] (#16883) --- tools/server/server.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/server/server.cpp b/tools/server/server.cpp index d56468595dd..cb49254a1cc 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -3608,7 +3608,7 @@ struct server_context { slot.task->params.sampling.preserved_tokens.find(token) != slot.task->params.sampling.preserved_tokens.end(); }; - // frist, add sampled tokens from any ongoing sequences + // first, add sampled tokens from any ongoing sequences for (auto & slot : slots) { if (slot.state != SLOT_STATE_GENERATING) { continue; @@ -3950,7 +3950,7 @@ struct server_context { // If using an alora, there may be uncached tokens that come // before the invocation sequence. When this happens, the // tokens before the invocation sequence need to be - // processed without the adpter in a separate batch, then + // processed without the adapter in a separate batch, then // the adapter needs to be enabled for the remaining tokens. if (lora_all_alora(slot.lora) && slot.alora_invocation_start - 1 > slot.prompt.n_tokens()) { SLT_DBG(slot, "processing pre-alora tokens without the adapter (n_tokens = %d, alora_invocation_start = %d)\n", slot.prompt.n_tokens(), slot.alora_invocation_start); From c22473b580807929fd9e3a3344a48e8cfbe6c88f Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Fri, 31 Oct 2025 10:54:19 +0200 Subject: [PATCH 034/185] server : don't print user inputs to console (#16871) --- tools/server/server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/server/server.cpp b/tools/server/server.cpp index cb49254a1cc..92d30664e41 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -3796,7 +3796,7 @@ struct server_context { // when the prompt prefix does not match, print the tokens around the mismatch // this is useful for debugging prompt caching - { + if (slots_debug) { const int np0 = std::max(n_past - 4, 0); const int np1 = std::min(n_past + 6, std::min(slot.prompt.tokens.size(), slot.task->tokens.size())); From 8da3c0e200a586f768ada6f38745acb01380174c Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Fri, 31 Oct 2025 13:50:33 +0200 Subject: [PATCH 035/185] batch : fix consistency checks for the input positions (#16890) --- src/llama-batch.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/llama-batch.cpp b/src/llama-batch.cpp index 0d4939fdb01..86a1a4ba187 100644 --- a/src/llama-batch.cpp +++ b/src/llama-batch.cpp @@ -261,15 +261,29 @@ bool llama_batch_allocr::init( const llama_pos p0 = memory ? memory->seq_pos_max(s) : -1; - if (p0 >= 0 && p0 >= seq_pos_min(s)) { - LLAMA_LOG_ERROR( - "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" - " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" - " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" - " for M-RoPE, it is required that the position satisfies: X < Y\n", - __func__, s, s, p0, s, seq_pos_min(s)); + if (batch.token) { + if (p0 >= 0 && p0 >= seq_pos_min(s)) { + LLAMA_LOG_ERROR( + "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" + " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" + " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" + " for M-RoPE, it is required that the position satisfies: X < Y\n", + __func__, s, s, p0, s, seq_pos_min(s)); - return false; + return false; + } + } else { + // embedding inputs can have overlapping positions + if (p0 >= 0 && p0 > seq_pos_min(s)) { + LLAMA_LOG_ERROR( + "%s: the tokens of sequence %d in the input batch have inconsistent sequence positions:\n" + " - the last position stored in the memory module of the context (i.e. the KV cache) for sequence %d is X = %d\n" + " - the tokens for sequence %d in the input batch have a starting position of Y = %d\n" + " for M-RoPE, it is required that the position satisfies: X <= Y\n", + __func__, s, s, p0, s, seq_pos_min(s)); + + return false; + } } } } else { From 4146d6a1a6228711a487a1e3e9ddd120f8d027d7 Mon Sep 17 00:00:00 2001 From: Aman Gupta Date: Fri, 31 Oct 2025 20:05:07 +0800 Subject: [PATCH 036/185] CUDA: add expert reduce kernel (#16857) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CUDA: add expert reduce kernel * contigous checks, better formatting, use std::vector instead of array * use vector empty instead of size Co-authored-by: Johannes Gäßler --------- Co-authored-by: Johannes Gäßler --- ggml/src/ggml-cuda/ggml-cuda.cu | 26 ++++ ggml/src/ggml-cuda/moe-expert-reduce.cu | 168 +++++++++++++++++++++++ ggml/src/ggml-cuda/moe-expert-reduce.cuh | 11 ++ tests/test-backend-ops.cpp | 58 ++++++++ 4 files changed, 263 insertions(+) create mode 100644 ggml/src/ggml-cuda/moe-expert-reduce.cu create mode 100644 ggml/src/ggml-cuda/moe-expert-reduce.cuh diff --git a/ggml/src/ggml-cuda/ggml-cuda.cu b/ggml/src/ggml-cuda/ggml-cuda.cu index fcff5d7cdc1..61a8f1df87d 100644 --- a/ggml/src/ggml-cuda/ggml-cuda.cu +++ b/ggml/src/ggml-cuda/ggml-cuda.cu @@ -27,6 +27,7 @@ #include "ggml-cuda/mmq.cuh" #include "ggml-cuda/mmvf.cuh" #include "ggml-cuda/mmvq.cuh" +#include "ggml-cuda/moe-expert-reduce.cuh" #include "ggml-cuda/norm.cuh" #include "ggml-cuda/opt-step-adamw.cuh" #include "ggml-cuda/opt-step-sgd.cuh" @@ -3169,6 +3170,31 @@ static void evaluate_and_capture_cuda_graph(ggml_backend_cuda_context * cuda_ctx continue; } + if (node->op == GGML_OP_MUL) { + int current_node = i + 1; + int num_views = 0; + int num_adds = 0; + while (current_node < cgraph->n_nodes && cgraph->nodes[current_node]->op == GGML_OP_VIEW) { + num_views++; + current_node++; + } + + while (current_node < cgraph->n_nodes && cgraph->nodes[current_node]->op == GGML_OP_ADD && + num_adds < num_views - 1) { + num_adds++; + current_node++; + } + + if (num_adds == num_views - 1 && num_views > 0) { + ggml_tensor * dst_node = cgraph->nodes[current_node - 1]; + if (ggml_cuda_should_use_moe_expert_reduce(cgraph, i, current_node)) { + ggml_cuda_op_moe_expert_reduce(*cuda_ctx, node->src[0], node->src[1], dst_node); + i += num_views + num_adds; + continue; + } + } + } + if (node->op == GGML_OP_ADD) { int n_fuse = 0; ggml_op ops[8]; diff --git a/ggml/src/ggml-cuda/moe-expert-reduce.cu b/ggml/src/ggml-cuda/moe-expert-reduce.cu new file mode 100644 index 00000000000..a97c5d573bb --- /dev/null +++ b/ggml/src/ggml-cuda/moe-expert-reduce.cu @@ -0,0 +1,168 @@ +#include "moe-expert-reduce.cuh" + +// This kernel is a fusion of the expert weight reduce, common in MoE models + +template +__global__ void moe_expert_reduce_cuda(const float * __restrict__ experts, + const float * __restrict__ weights, + float * __restrict__ dst, + const int n_expert_used, + const int n_cols) { + const int row = blockIdx.x; + const int col = blockIdx.y * blockDim.x + threadIdx.x; + if (col >= n_cols) { + return; + } + + experts += row * n_cols * n_expert_used; + weights += row * n_expert_used; + dst += row * n_cols; + + float acc = 0.f; + if constexpr (n_expert_used_template == 0) { + for (int expert = 0; expert < n_expert_used; ++expert) { + ggml_cuda_mad(acc, experts[col], weights[expert]); + experts += n_cols; + } + dst[col] = acc; + } else { +#pragma unroll + for (int i = 0; i < n_expert_used_template; ++i) { + ggml_cuda_mad(acc, experts[col], weights[i]); + experts += n_cols; + } + dst[col] = acc; + } +} + +static void launch_moe_expert_reduce(ggml_backend_cuda_context & ctx, + const float * experts, + const float * weights, + float * dst, + const int n_expert_used, + const int n_cols, + const int n_rows) { + const int block_size = 32; + + const int n_blocks_x = n_rows; + const int n_blocks_y = (n_cols + block_size - 1) / block_size; + + dim3 block_dims(block_size); + dim3 grid_dims(n_blocks_x, n_blocks_y); + + cudaStream_t stream = ctx.stream(); + switch (n_expert_used) { + case 1: + moe_expert_reduce_cuda<1> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 2: + moe_expert_reduce_cuda<2> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 4: + moe_expert_reduce_cuda<4> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 6: + moe_expert_reduce_cuda<6> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 8: + moe_expert_reduce_cuda<8> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 16: + moe_expert_reduce_cuda<16> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 32: + moe_expert_reduce_cuda<32> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 64: + moe_expert_reduce_cuda<64> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + case 128: + moe_expert_reduce_cuda<128> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + default: + moe_expert_reduce_cuda<0> + <<>>(experts, weights, dst, n_expert_used, n_cols); + break; + } +} + +bool ggml_cuda_should_use_moe_expert_reduce(const ggml_cgraph * cgraph, int start_index, int end_index) { + const ggml_tensor * mul = cgraph->nodes[start_index]; + + if (mul->op != GGML_OP_MUL || !ggml_is_contiguous(mul->src[0]) || !ggml_is_contiguous(mul->src[1])) { + return false; + } + + int current_node = start_index + 1; + size_t current_offset = 0; + + std::vector view_nodes; + //check if all are views of the expert in increasing order + while (current_node < end_index && cgraph->nodes[current_node]->op == GGML_OP_VIEW) { + const ggml_tensor * node = cgraph->nodes[current_node]; + if (node->view_src != mul) { + return false; + } + if (node->view_offs < current_offset) { + return false; + } + current_offset = node->view_offs; + current_node++; + view_nodes.push_back(node); + } + + //check if all the adds are in increasing order + const ggml_tensor * prev_add_src = view_nodes.empty() ? nullptr : view_nodes[0]; + int num_adds = 0; + int num_views = view_nodes.size(); + while (current_node < end_index && cgraph->nodes[current_node]->op == GGML_OP_ADD) { + const ggml_tensor * add_node = cgraph->nodes[current_node]; + + bool is_first_op_ok = num_views > num_adds ? add_node->src[0] == prev_add_src : false; + bool is_second_op_ok = num_views > num_adds ? add_node->src[1] == view_nodes[num_adds + 1] : false; + + if (!is_first_op_ok || !is_second_op_ok) { + return false; + } + prev_add_src = add_node; + + num_adds++; + current_node++; + } + + if (num_views != num_adds + 1) { + return false; + } + + return true; +} + +void ggml_cuda_op_moe_expert_reduce(ggml_backend_cuda_context & ctx, + const ggml_tensor * experts, + const ggml_tensor * weights, + ggml_tensor * dst) { + const int n_rows = experts->ne[2]; + const int n_expert_used = experts->ne[1]; + const int n_cols = experts->ne[0]; + + GGML_ASSERT(experts->type == GGML_TYPE_F32); + GGML_ASSERT(weights->type == GGML_TYPE_F32); + GGML_ASSERT(ggml_is_contiguous(experts)); + GGML_ASSERT(ggml_is_contiguous(weights)); + GGML_ASSERT(dst->type == GGML_TYPE_F32); + + const float * experts_d = (const float *) experts->data; + const float * weights_d = (const float *) weights->data; + float * dst_d = (float *) dst->data; + + launch_moe_expert_reduce(ctx, experts_d, weights_d, dst_d, n_expert_used, n_cols, n_rows); +} diff --git a/ggml/src/ggml-cuda/moe-expert-reduce.cuh b/ggml/src/ggml-cuda/moe-expert-reduce.cuh new file mode 100644 index 00000000000..cafc50e104a --- /dev/null +++ b/ggml/src/ggml-cuda/moe-expert-reduce.cuh @@ -0,0 +1,11 @@ +#include "common.cuh" +#include "ggml.h" + +#include + +void ggml_cuda_op_moe_expert_reduce(ggml_backend_cuda_context & ctx, + const ggml_tensor * experts, + const ggml_tensor * weights, + ggml_tensor * dst); + +bool ggml_cuda_should_use_moe_expert_reduce(const ggml_cgraph * cgraph, int start_index, int end_index); diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index fa12c06ccdd..04fa1b62d3b 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -4807,6 +4807,60 @@ struct test_topk_moe: public test_case { } }; +struct test_moe_expert_reduce : public test_case { + const int64_t n_embd; + const int64_t n_tokens; + const int64_t n_expert_used; + + test_moe_expert_reduce(int64_t n_embd = 64, int64_t n_tokens = 5, int64_t n_expert_used = 4) + : n_embd(n_embd), n_tokens(n_tokens), n_expert_used(n_expert_used) { + GGML_ASSERT(n_expert_used > 1); + } + + std::string vars() override { + return VARS_TO_STR3(n_embd, n_tokens, n_expert_used); + } + + std::string op_desc(ggml_tensor * t) override { + GGML_UNUSED(t); + return "MOE_EXPERT_REDUCE"; + } + + bool run_whole_graph() override { return true; } + + ggml_tensor * build_graph(ggml_context * ctx) override { + ggml_tensor * experts = ggml_new_tensor_3d(ctx, GGML_TYPE_F32, n_embd, n_expert_used, n_tokens); + ggml_set_name(experts, "experts"); + + ggml_tensor * weights = ggml_new_tensor_3d(ctx, GGML_TYPE_F32, 1, n_expert_used, n_tokens); + ggml_set_name(weights, "weights"); + + ggml_tensor * weighted = ggml_mul(ctx, experts, weights); + ggml_set_name(weighted, "weighted_experts"); + + std::vector expert_views(n_expert_used); + for (int64_t i = 0; i < n_expert_used; ++i) { + expert_views[i] = ggml_view_2d(ctx, weighted, n_embd, n_tokens, weighted->nb[2], i * weighted->nb[1]); + + std::string name = "expert_view_" + std::to_string(i); + ggml_set_name(expert_views[i], name.c_str()); + ggml_build_forward_expand(gf, expert_views[i]); + } + + ggml_tensor * moe_out = expert_views[0]; + for (int64_t i = 1; i < n_expert_used; ++i) { + moe_out = ggml_add(ctx, moe_out, expert_views[i]); + + std::string name = "expert_add_" + std::to_string(i - 1); + ggml_set_name(moe_out, name.c_str()); + } + + ggml_set_name(moe_out, "moe_out"); + + return moe_out; + } +}; + struct test_mul_mat_vec_fusion : public test_case { const ggml_type type; const ggml_glu_op glu_op; @@ -7260,6 +7314,10 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_topk_moe({ 8, 22, 1, 1 }, 4, /*with_norm*/ false, /*delayed_softmax*/ true)); test_cases.emplace_back(new test_topk_moe({ 32, 22, 1, 1 }, 8, /*with_norm*/ false, /*delayed_softmax*/ true)); + test_cases.emplace_back(new test_moe_expert_reduce(1024, 5, 4)); + test_cases.emplace_back(new test_moe_expert_reduce(80, 3, 6)); + test_cases.emplace_back(new test_moe_expert_reduce(80, 3, 7)); + #if 0 // these tests are disabled to save execution time, sbut they can be handy for debugging test_cases.emplace_back(new test_llama(2, true)); From 6d39015a744b47bb7643ea73f412e6d64677f305 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Fri, 31 Oct 2025 16:25:50 +0200 Subject: [PATCH 037/185] sync : ggml --- scripts/sync-ggml.last | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/sync-ggml.last b/scripts/sync-ggml.last index 5e09de499e8..64a544d9110 100644 --- a/scripts/sync-ggml.last +++ b/scripts/sync-ggml.last @@ -1 +1 @@ -72632094336524a9c809e129e8b1c52154543a5a +e02fb860ccbba8967905bceff23b677e88105280 From 31c511a968348281e11d590446bb815048a1e912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Johannes=20G=C3=A4=C3=9Fler?= Date: Fri, 31 Oct 2025 15:57:19 +0100 Subject: [PATCH 038/185] CUDA: Volta tensor core support for MMF (#16843) * CUDA: Volta tensor core support for MMF * more generic checks for hardware support * Update ggml/src/ggml-cuda/mmf.cuh Co-authored-by: Aman Gupta --------- Co-authored-by: Aman Gupta --- ggml/src/ggml-cuda/common.cuh | 10 +- ggml/src/ggml-cuda/mma.cuh | 237 ++++++++++++++++++++++++++++++---- ggml/src/ggml-cuda/mmf.cu | 2 +- ggml/src/ggml-cuda/mmf.cuh | 41 ++++-- 4 files changed, 254 insertions(+), 36 deletions(-) diff --git a/ggml/src/ggml-cuda/common.cuh b/ggml/src/ggml-cuda/common.cuh index 6a472be7fbb..ca876459d40 100644 --- a/ggml/src/ggml-cuda/common.cuh +++ b/ggml/src/ggml-cuda/common.cuh @@ -224,6 +224,11 @@ static const char * cu_get_error_str(CUresult err) { #define AMD_MFMA_AVAILABLE #endif // defined(GGML_USE_HIP) && defined(CDNA) && !defined(GGML_HIP_NO_MMQ_MFMA) +// The Volta instructions are in principle available on Turing or newer but they are effectively unusable: +#if !defined(GGML_USE_HIP) && __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA +#define VOLTA_MMA_AVAILABLE +#endif // !defined(GGML_USE_HIP) && __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + #if !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_TURING #define TURING_MMA_AVAILABLE #endif // !defined(GGML_USE_HIP) && __CUDA_ARCH__ >= GGML_CUDA_CC_TURING @@ -278,7 +283,10 @@ static bool amd_mfma_available(const int cc) { #endif //!defined(GGML_HIP_NO_MMQ_MFMA) } -// Volta technically had FP16 tensor cores but they work very differently compared to Turing and later. +static bool volta_mma_available(const int cc) { + return GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) == GGML_CUDA_CC_VOLTA; +} + static bool turing_mma_available(const int cc) { return GGML_CUDA_CC_IS_NVIDIA(cc) && ggml_cuda_highest_compiled_arch(cc) >= GGML_CUDA_CC_TURING; } diff --git a/ggml/src/ggml-cuda/mma.cuh b/ggml/src/ggml-cuda/mma.cuh index c1f24243fe3..a7a28fd1ae6 100644 --- a/ggml/src/ggml-cuda/mma.cuh +++ b/ggml/src/ggml-cuda/mma.cuh @@ -18,6 +18,10 @@ #include "common.cuh" +// On Volta each warp is doing 4 8x8 mma operations in parallel. +// The basic memory layout for a 32x8 output tile is to stack 4 input tiles in I direction and to mirror the B tile. +// However, the i indices in this file are by default permuted to simplify the index calculations. +// #define GGML_CUDA_MMA_NO_VOLTA_PERM #if CUDART_VERSION >= 11080 @@ -73,6 +77,15 @@ namespace ggml_cuda_mma { static constexpr int ne = I * J / 64; T x[ne] = {0}; + static constexpr __device__ bool supported() { + if (I == 64 && J == 2) return true; + if (I == 16 && J == 8) return true; + if (I == 32 && J == 4) return true; + if (I == 16 && J == 16) return true; + if (I == 32 && J == 32) return true; + return false; + } + static __device__ __forceinline__ int get_i(const int l) { if constexpr (I == 64 && J == 2) { // Special tile size to load <16, 4> as <16, 8> return threadIdx.x % 16; @@ -85,7 +98,8 @@ namespace ggml_cuda_mma { } else if constexpr (I == 32 && J == 32) { return 4 * (threadIdx.x / 32) + 8 * (l / 4) + (l % 4); } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } @@ -101,22 +115,67 @@ namespace ggml_cuda_mma { } else if constexpr (I == 32 && J == 32) { return threadIdx.x % 32; } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; + } + } +#elif __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + static constexpr int ne = I * J / 32; + T x[ne] = {0}; + + static constexpr __device__ bool supported() { + if (I == 32 && J == 8) return true; + return false; + } + + static __device__ __forceinline__ int get_i(const int l) { + if constexpr (I == 32 && J == 8) { +#ifdef GGML_CUDA_MMA_NO_VOLTA_PERM + return (((threadIdx.x % 16) / 4) * 8) | ((threadIdx.x / 16) * 4) | (l & 2) | (threadIdx.x % 2); +#else + return (l & 2) | (threadIdx.x & ~2); +#endif // GGML_CUDA_MMA_NO_VOLTA_PERM + } else { + NO_DEVICE_CODE; + return -1; + } + } + + static __device__ __forceinline__ int get_j(const int l) { + if constexpr (I == 32 && J == 8) { + return (threadIdx.x & 2) | (l & (4 + 1)); + } else { + NO_DEVICE_CODE; + return -1; } } #else static constexpr int ne = I * J / 32; T x[ne] = {0}; + static constexpr __device__ bool supported() { + if (I == 8 && J == 4) return true; + if (I == 8 && J == 8) return true; + if (I == 16 && J == 8) return true; + if (I == 16 && J == 16) return true; + if (I == 32 && J == 8) return true; + return false; + } + static __device__ __forceinline__ int get_i(const int l) { - if constexpr (I == 8 && (J == 4 || J == 8)) { + if constexpr (I == 8 && J == 4) { + return threadIdx.x / 4; + } else if constexpr (I == 8 && J == 8) { return threadIdx.x / 4; } else if constexpr (I == 16 && J == 8) { - return (l / 2) * 8 + threadIdx.x / 4; + return ((l / 2) * 8) | (threadIdx.x / 4); } else if constexpr (I == 16 && J == 16) { - return ((l / 2) % 2) * 8 + threadIdx.x / 4; + return (((l / 2) % 2) * 8) | (threadIdx.x / 4); + } else if constexpr (I == 32 && J == 8) { + return tile<16, 8, T>::get_i(l); // Memory layout simply repeated with same pattern in i direction. } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } @@ -124,13 +183,16 @@ namespace ggml_cuda_mma { if constexpr (I == 8 && J == 4) { return threadIdx.x % 4; } else if constexpr (I == 8 && J == 8) { - return 4 * l + threadIdx.x % 4; + return (l * 4) | (threadIdx.x % 4); } else if constexpr (I == 16 && J == 8) { - return 2 * (threadIdx.x % 4) + l % 2; + return ((threadIdx.x % 4) * 2) | (l % 2); } else if constexpr (I == 16 && J == 16) { - return 8 * (l / 4) + 2 * (threadIdx.x % 4) + l % 2; + return ((l / 4) * 8) | ((threadIdx.x % 4) * 2) | (l % 2); + } else if constexpr (I == 32 && J == 8) { + return tile<16, 8, T>::get_j(l); // Memory layout simply repeated with same pattern in i direction. } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } #endif // defined(GGML_USE_HIP) @@ -140,32 +202,83 @@ namespace ggml_cuda_mma { struct tile { static constexpr int I = I_; static constexpr int J = J_; + +#if __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + static constexpr int ne = I == 8 && J == 8 ? I * J / (WARP_SIZE/4) : I * J / WARP_SIZE; + half2 x[ne] = {{0.0f, 0.0f}}; + + static constexpr __device__ bool supported() { + if (I == 8 && J == 8) return true; + if (I == 32 && J == 8) return true; + return false; + } + + static __device__ __forceinline__ int get_i(const int l) { + if constexpr (I == 8 && J == 8) { + return ((threadIdx.x / 16) * 4) | (threadIdx.x % 4); + } else if constexpr (I == 32 && J == 8) { +#ifdef GGML_CUDA_MMA_NO_VOLTA_PERM + return (((threadIdx.x % 16) / 4) * 8) | ((threadIdx.x / 16) * 4) | (threadIdx.x % 4); +#else + return threadIdx.x; +#endif // GGML_CUDA_MMA_NO_VOLTA_PERM + } else { + NO_DEVICE_CODE; + return -1; + } + } + + static __device__ __forceinline__ int get_j(const int l) { + if constexpr ((I == 8 || I == 32) && J == 8) { + return l; + } else { + NO_DEVICE_CODE; + return -1; + } + } +#else static constexpr int ne = I * J / WARP_SIZE; half2 x[ne] = {{0.0f, 0.0f}}; + static constexpr __device__ bool supported() { + if (I == 8 && J == 4) return true; + if (I == 8 && J == 8) return true; + if (I == 16 && J == 8) return true; + if (I == 16 && J == 16) return true; + if (I == 32 && J == 8) return true; + return false; + } + static __device__ __forceinline__ int get_i(const int l) { if constexpr (I == 8 && J == 8) { return threadIdx.x / 4; } else if constexpr (I == 16 && J == 4) { - return l * 8 + threadIdx.x / 4; + return (l * 8) | (threadIdx.x / 4); } else if constexpr (I == 16 && J == 8) { - return (l % 2) * 8 + threadIdx.x / 4; + return ((l % 2) * 8) | (threadIdx.x / 4); + } else if constexpr (I == 32 && J == 8) { + return ((l / 4) * 16) | ((l % 2) * 8) | (threadIdx.x / 4); } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } static __device__ __forceinline__ int get_j(const int l) { if constexpr (I == 8 && J == 8) { - return l * 4 + threadIdx.x % 4; + return (l * 4) | (threadIdx.x % 4); } else if constexpr (I == 16 && J == 4) { return threadIdx.x % 4; } else if constexpr (I == 16 && J == 8) { - return (l / 2) * 4 + threadIdx.x % 4; + return ((l / 2) * 4) | (threadIdx.x % 4); + } else if constexpr (I == 32 && J == 8) { + return ((l & 2) * 2) | (threadIdx.x % 4); } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } +#endif // __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA }; template @@ -175,27 +288,36 @@ namespace ggml_cuda_mma { static constexpr int ne = I * J / WARP_SIZE; nv_bfloat162 x[ne] = {{0.0f, 0.0f}}; + static constexpr __device__ bool supported() { + if (I == 8 && J == 8) return true; + if (I == 16 && J == 4) return true; + if (I == 16 && J == 8) return true; + return false; + } + static __device__ __forceinline__ int get_i(const int l) { if constexpr (I == 8 && J == 8) { return threadIdx.x / 4; } else if constexpr (I == 16 && J == 4) { - return l * 8 + threadIdx.x / 4; + return (l * 8) | (threadIdx.x / 4); } else if constexpr (I == 16 && J == 8) { - return (l % 2) * 8 + threadIdx.x / 4; + return ((l % 2) * 8) | (threadIdx.x / 4); } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } static __device__ __forceinline__ int get_j(const int l) { if constexpr (I == 8 && J == 8) { - return l * 4 + threadIdx.x % 4; + return (l * 4) | (threadIdx.x % 4); } else if constexpr (I == 16 && J == 4) { return threadIdx.x % 4; } else if constexpr (I == 16 && J == 8) { - return (l / 2) * 4 + threadIdx.x % 4; + return ((l / 2) * 4) | (threadIdx.x % 4); } else { - static_assert(I == -1 && J == -1, "template specialization not implemented"); + NO_DEVICE_CODE; + return -1; } } }; @@ -263,8 +385,12 @@ namespace ggml_cuda_mma { : "=r"(xi[0]), "=r"(xi[1]) : "l"(xs)); #else - load_generic(xs0, stride); - GGML_UNUSED(t); +#if __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + GGML_UNUSED_VARS(t, xs0, stride); + NO_DEVICE_CODE; +#else + load_generic(t, xs0, stride); +#endif // __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA #endif // TURING_MMA_AVAILABLE } @@ -277,11 +403,35 @@ namespace ggml_cuda_mma { asm volatile("ldmatrix.sync.aligned.m8n8.x4.b16 {%0, %1, %2, %3}, [%4];" : "=r"(xi[0]), "=r"(xi[1]), "=r"(xi[2]), "=r"(xi[3]) : "l"(xs)); +#else +#if __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + GGML_UNUSED_VARS(t, xs0, stride); + NO_DEVICE_CODE; #else load_generic(t, xs0, stride); +#endif // __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA #endif // TURING_MMA_AVAILABLE } + template + static __device__ __forceinline__ void load_ldmatrix( + tile<32, 8, T> & t, const T * __restrict__ xs0, const int stride) { +#if __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA +#if 1 + // TODO: more generic handling + static_assert(sizeof(T) == 4, "bad type size"); + ggml_cuda_memcpy_1<4*sizeof(T)>(t.x + 0, xs0 + t.get_i(0)*stride + 0); + ggml_cuda_memcpy_1<4*sizeof(T)>(t.x + 4, xs0 + t.get_i(4)*stride + 4); +#else + load_generic(t, xs0, stride); +#endif // 1 +#else + tile<16, 8, T> * t16 = (tile<16, 8, T> *) &t; + load_ldmatrix(t16[0], xs0 + 0*stride, stride); + load_ldmatrix(t16[1], xs0 + 16*stride, stride); +#endif // __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + } + template static __device__ __forceinline__ void load_ldmatrix_trans( tile<16, 8, T> & t, const T * __restrict__ xs0, const int stride) { @@ -546,4 +696,43 @@ namespace ggml_cuda_mma { NO_DEVICE_CODE; #endif // AMD_MFMA_AVAILABLE } + + template + static __device__ __forceinline__ void mma( + tile<32, J, T1> & D, const tile<32, K, T2> & A, const tile & B) { + tile<16, J, T1> * D16 = (tile<16, J, T1> *) &D; + tile<16, K, T2> * A16 = (tile<16, K, T2> *) &A; + mma(D16[0], A16[0], B); + mma(D16[1], A16[1], B); + } + + static __device__ __forceinline__ void mma( + tile<32, 8, float> & D, const tile<32, 8, half2> & A, const tile<8, 8, half2> & B) { +#if __CUDA_ARCH__ == GGML_CUDA_CC_VOLTA + const int * Axi = (const int *) A.x; + const int * Bxi = (const int *) B.x; + int * Dxi = (int *) D.x; + asm("mma.sync.aligned.m8n8k4.row.col.f32.f16.f16.f32 " + "{%0, %1, %2, %3, %4, %5, %6, %7}, {%8, %9}, {%10, %11}, {%0, %1, %2, %3, %4, %5, %6, %7};" + : "+r"(Dxi[0]), "+r"(Dxi[1]), "+r"(Dxi[2]), "+r"(Dxi[3]), "+r"(Dxi[4]), "+r"(Dxi[5]), "+r"(Dxi[6]), "+r"(Dxi[7]) + : "r"(Axi[0]), "r"(Axi[1]), "r"(Bxi[0]), "r"(Bxi[1])); + asm("mma.sync.aligned.m8n8k4.row.col.f32.f16.f16.f32 " + "{%0, %1, %2, %3, %4, %5, %6, %7}, {%8, %9}, {%10, %11}, {%0, %1, %2, %3, %4, %5, %6, %7};" + : "+r"(Dxi[0]), "+r"(Dxi[1]), "+r"(Dxi[2]), "+r"(Dxi[3]), "+r"(Dxi[4]), "+r"(Dxi[5]), "+r"(Dxi[6]), "+r"(Dxi[7]) + : "r"(Axi[2]), "r"(Axi[3]), "r"(Bxi[2]), "r"(Bxi[3])); + asm("mma.sync.aligned.m8n8k4.row.col.f32.f16.f16.f32 " + "{%0, %1, %2, %3, %4, %5, %6, %7}, {%8, %9}, {%10, %11}, {%0, %1, %2, %3, %4, %5, %6, %7};" + : "+r"(Dxi[0]), "+r"(Dxi[1]), "+r"(Dxi[2]), "+r"(Dxi[3]), "+r"(Dxi[4]), "+r"(Dxi[5]), "+r"(Dxi[6]), "+r"(Dxi[7]) + : "r"(Axi[4]), "r"(Axi[5]), "r"(Bxi[4]), "r"(Bxi[5])); + asm("mma.sync.aligned.m8n8k4.row.col.f32.f16.f16.f32 " + "{%0, %1, %2, %3, %4, %5, %6, %7}, {%8, %9}, {%10, %11}, {%0, %1, %2, %3, %4, %5, %6, %7};" + : "+r"(Dxi[0]), "+r"(Dxi[1]), "+r"(Dxi[2]), "+r"(Dxi[3]), "+r"(Dxi[4]), "+r"(Dxi[5]), "+r"(Dxi[6]), "+r"(Dxi[7]) + : "r"(Axi[6]), "r"(Axi[7]), "r"(Bxi[6]), "r"(Bxi[7])); +#else + tile<16, 8, float> * D16 = (tile<16, 8, float> *) &D; + tile<16, 8, half2> * A16 = (tile<16, 8, half2> *) &A; + mma(D16[0], A16[0], B); + mma(D16[1], A16[1], B); +#endif // __CUDA_ARCH__ >= GGML_CUDA_CC_AMPERE + } } diff --git a/ggml/src/ggml-cuda/mmf.cu b/ggml/src/ggml-cuda/mmf.cu index 9e2aaf52d6c..2b0a61395b4 100644 --- a/ggml/src/ggml-cuda/mmf.cu +++ b/ggml/src/ggml-cuda/mmf.cu @@ -148,7 +148,7 @@ bool ggml_cuda_should_use_mmf(enum ggml_type type, int cc, int warp_size, const case GGML_TYPE_F32: return ampere_mma_available(cc); case GGML_TYPE_F16: - return turing_mma_available(cc); + return volta_mma_available(cc) || turing_mma_available(cc); case GGML_TYPE_BF16: return ampere_mma_available(cc); default: diff --git a/ggml/src/ggml-cuda/mmf.cuh b/ggml/src/ggml-cuda/mmf.cuh index 49d5295be0e..f7e46e2f63b 100644 --- a/ggml/src/ggml-cuda/mmf.cuh +++ b/ggml/src/ggml-cuda/mmf.cuh @@ -28,9 +28,19 @@ static __global__ void mul_mat_f( const int channel_ratio, const int stride_channel_x, const int stride_channel_y, const int stride_channel_dst, const int sample_ratio, const int stride_sample_x, const int stride_sample_y, const int stride_sample_dst) { #if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) - typedef tile<16, 8, T> tile_A; - typedef tile< 8, 8, T> tile_B; - typedef tile<16, 8, float> tile_C; + constexpr bool I_16_supported = tile<16, 8, T>::supported() && tile<16, 8, float>::supported(); + constexpr bool I_32_supported = tile<32, 8, T>::supported() && tile<32, 8, float>::supported(); + + if (!I_16_supported && !I_32_supported) { + NO_DEVICE_CODE; + return; + } + + constexpr int I_preferred = I_16_supported ? 16 : 32; // For Turing MMA both work but 16 is ~1% faster. + + typedef tile tile_A; + typedef tile<8, 8, T> tile_B; + typedef tile tile_C; constexpr int warp_size = ggml_cuda_get_physical_warp_size(); constexpr int tile_k_padded = warp_size + 4; @@ -232,7 +242,6 @@ static __global__ void mul_mat_f( #endif // !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) } - //This kernel is for larger batch sizes of mul_mat_id template __launch_bounds__(ggml_cuda_get_physical_warp_size()*nwarps, 1) @@ -245,9 +254,19 @@ static __global__ void mul_mat_f_ids( const int sample_ratio, const int stride_sample_x, const int stride_sample_y, const int stride_sample_dst, const uint3 sis1_fd, const uint3 nch_fd) { #if !defined(GGML_USE_HIP) && !defined(GGML_USE_MUSA) - typedef tile<16, 8, T> tile_A; - typedef tile< 8, 8, T> tile_B; - typedef tile<16, 8, float> tile_C; + constexpr bool I_16_supported = tile<16, 8, T>::supported() && tile<16, 8, float>::supported(); + constexpr bool I_32_supported = tile<32, 8, T>::supported() && tile<32, 8, float>::supported(); + + if (!I_16_supported && !I_32_supported) { + NO_DEVICE_CODE; + return; + } + + constexpr int I_preferred = I_16_supported ? 16 : 32; // For Turing MMA both work butr 16 is ~1% faster. + + typedef tile tile_A; + typedef tile<8, 8, T> tile_B; + typedef tile tile_C; constexpr int warp_size = ggml_cuda_get_physical_warp_size(); constexpr int tile_k_padded = warp_size + 4; @@ -533,7 +552,8 @@ void mul_mat_f_cuda( const int64_t stride_channel_x, const int64_t stride_channel_y, const int64_t stride_channel_dst, const int64_t nsamples_x, const int64_t nsamples_dst, const int64_t stride_sample_x, const int64_t stride_sample_y, const int64_t stride_sample_dst, cudaStream_t stream, const mmf_ids_data * ids_data) { - typedef tile<16, 8, T> tile_A; + typedef tile<16, 8, T> tile_A_16; + typedef tile<32, 8, T> tile_A_32; typedef tile< 8, 8, T> tile_B; GGML_ASSERT(ncols_x % 2 == 0); @@ -544,7 +564,8 @@ void mul_mat_f_cuda( const int64_t channel_ratio = nchannels_dst / nchannels_x; const int64_t sample_ratio = nsamples_dst / nsamples_x; - const int device = ggml_cuda_get_device(); + const int device = ggml_cuda_get_device(); + const int cc = ggml_cuda_info().devices[device].cc; const int warp_size = ggml_cuda_info().devices[device].warp_size; int64_t nwarps_best = 1; @@ -559,7 +580,7 @@ void mul_mat_f_cuda( } constexpr int rows_per_block = MMF_ROWS_PER_BLOCK; - const int nbytes_shared_iter = nwarps_best * tile_A::I * (warp_size + 4) * 4; + const int nbytes_shared_iter = nwarps_best * (volta_mma_available(cc) ? tile_A_32::I : tile_A_16::I) * (warp_size + 4) * 4; const int nbytes_shared_combine = GGML_PAD(cols_per_block, tile_B::I) * (nwarps_best*rows_per_block + 4) * 4; const int nbytes_shared = std::max(nbytes_shared_iter, nbytes_shared_combine); const int nbytes_slotmap = ids ? GGML_PAD(cols_per_block, 16) * sizeof(int) : 0; From e58d585604bbbbbc24f8149effe444621b5191c6 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Fri, 31 Oct 2025 21:20:07 +0100 Subject: [PATCH 039/185] model : add Granite Hybrid nano types (#16896) Signed-off-by: Giuseppe Scrivano --- src/llama-model.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/llama-model.cpp b/src/llama-model.cpp index 1e0680bee95..89a6a51b2cc 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -1898,7 +1898,8 @@ void llama_model::load_hparams(llama_model_loader & ml) { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); switch (hparams.n_embd) { - case 1536: type = LLM_TYPE_7B_A1B; break; + case 768: type = LLM_TYPE_350M; break; + case 1536: type = (hparams.n_embd == 2048 ? LLM_TYPE_7B_A1B : LLM_TYPE_1B); break; case 2048: case 2560: type = LLM_TYPE_3B; break; case 4096: type = LLM_TYPE_32B; break; default: type = LLM_TYPE_UNKNOWN; From 0de0a01576772032008a689afc4d7c80685074c4 Mon Sep 17 00:00:00 2001 From: "Piotr Wilkin (ilintar)" Date: Fri, 31 Oct 2025 21:20:47 +0100 Subject: [PATCH 040/185] model : Minimax M2 (#16831) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Model: Minimax M2 * Cleanup * Cleanup pt. 2 * Cleanup pt. 3 * Update convert_hf_to_gguf_update.py - merge catch blocks Co-authored-by: Sigbjørn Skjæret * Remove vocab models and test * Remove all redundant hparam settings covered by TextModel * Move super to start, don't set block_count * Update src/llama-model.cpp Co-authored-by: Sigbjørn Skjæret * Update gguf-py/gguf/constants.py Co-authored-by: Sigbjørn Skjæret --------- Co-authored-by: Sigbjørn Skjæret --- convert_hf_to_gguf.py | 61 ++++++++++++ convert_hf_to_gguf_update.py | 3 +- gguf-py/gguf/constants.py | 20 ++++ gguf-py/gguf/tensor_mapping.py | 1 + src/llama-arch.cpp | 22 +++++ src/llama-arch.h | 1 + src/llama-model.cpp | 170 +++++++++++++++++++++++++++++++++ src/llama-model.h | 1 + src/llama-vocab.cpp | 5 + src/llama-vocab.h | 1 + 10 files changed, 284 insertions(+), 1 deletion(-) diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index 5abc1779588..f186c2167d7 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -1054,6 +1054,9 @@ def get_vocab_base_pre(self, tokenizer) -> str: if chkhsh == "53e325976a6e142379c19b09afcae354f2f496f147afa8f9e189a33fe4e3024e": # ref: https://huggingface.co/ibm-granite/granite-docling-258M res = "granite-docling" + if chkhsh == "f4f37b6c8eb9ea29b3eac6bb8c8487c5ab7885f8d8022e67edc1c68ce8403e95": + # ref: https://huggingface.co/MiniMaxAI/MiniMax-M2 + res = "minimax-m2" if res is None: logger.warning("\n") @@ -7126,6 +7129,64 @@ def prepare_tensors(self): raise ValueError(f"Unprocessed experts: {experts}") +@ModelBase.register("MiniMaxM2ForCausalLM") +class MiniMaxM2Model(TextModel): + model_arch = gguf.MODEL_ARCH.MINIMAXM2 + _experts_cache: dict[int, dict[str, Tensor]] = {} + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.hparams["num_experts"] = self.hparams["num_local_experts"] + + def set_gguf_parameters(self): + super().set_gguf_parameters() + if self.hparams["scoring_func"] == "sigmoid": + self.gguf_writer.add_expert_gating_func(gguf.ExpertGatingFuncType.SIGMOID) + elif self.hparams["scoring_func"] == "softmax": + self.gguf_writer.add_expert_gating_func(gguf.ExpertGatingFuncType.SOFTMAX) + else: + raise ValueError(f"Unsupported scoring_func value: {self.hparams['scoring_func']}") + + self.gguf_writer.add_expert_feed_forward_length(self.find_hparam(["intermediate_size"])) + self.gguf_writer.add_rope_dimension_count(self.find_hparam(["rotary_dim"])) + + def modify_tensors(self, data_torch: Tensor, name: str, bid: int | None): + if name.endswith("e_score_correction_bias"): + name = name.replace("e_score_correction_bias", "e_score_correction.bias") + + # merge expert weights + if 'experts' in name: + n_experts = self.hparams["num_experts"] + assert bid is not None + + expert_cache = self._experts_cache.setdefault(bid, {}) + expert_cache[name] = data_torch + expert_weights = ["w1", "w2", "w3"] + + # not enough expert weights to merge + if len(expert_cache) < n_experts * len(expert_weights): + return [] + + tensors: list[tuple[str, Tensor]] = [] + for w_name in expert_weights: + datas: list[Tensor] = [] + + for xid in range(n_experts): + ename = f"model.layers.{bid}.block_sparse_moe.experts.{xid}.{w_name}.weight" + datas.append(expert_cache[ename]) + del expert_cache[ename] + + data_torch = torch.stack(datas, dim=0) + merged_name = f"model.layers.{bid}.block_sparse_moe.experts.{w_name}.weight" + new_name = self.map_tensor_name(merged_name) + tensors.append((new_name, data_torch)) + + del self._experts_cache[bid] + return tensors + + return super().modify_tensors(data_torch, name, bid) + + @ModelBase.register("Dots1ForCausalLM") class Dots1Model(Qwen2MoeModel): model_arch = gguf.MODEL_ARCH.DOTS1 diff --git a/convert_hf_to_gguf_update.py b/convert_hf_to_gguf_update.py index 0ebc1b160f6..7df96eb0839 100755 --- a/convert_hf_to_gguf_update.py +++ b/convert_hf_to_gguf_update.py @@ -141,6 +141,7 @@ class TOKENIZER_TYPE(IntEnum): {"name": "mellum", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/JetBrains/Mellum-4b-base", }, {"name": "bailingmoe2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/inclusionAI/Ling-mini-base-2.0", }, {"name": "granite-docling", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/ibm-granite/granite-docling-258M", }, + {"name": "minimax-m2", "tokt": TOKENIZER_TYPE.BPE, "repo": "https://huggingface.co/MiniMaxAI/MiniMax-M2", }, ] # some models are known to be broken upstream, so we will skip them as exceptions @@ -435,7 +436,7 @@ def get_vocab_base_pre(self, tokenizer) -> str: tokenizer = AutoTokenizer.from_pretrained(f"models/tokenizers/{name}", use_fast=False) else: tokenizer = AutoTokenizer.from_pretrained(f"models/tokenizers/{name}") - except OSError as e: + except (OSError, TypeError) as e: logger.error(f"Failed to load tokenizer for model {name}. Error: {e}") continue # Skip this model and continue with the next one in the loop diff --git a/gguf-py/gguf/constants.py b/gguf-py/gguf/constants.py index d75ac704fed..0d5afa01edf 100644 --- a/gguf-py/gguf/constants.py +++ b/gguf-py/gguf/constants.py @@ -425,6 +425,7 @@ class MODEL_ARCH(IntEnum): GROVEMOE = auto() APERTUS = auto() COGVLM = auto() + MINIMAXM2 = auto() class VISION_PROJECTOR_TYPE(IntEnum): @@ -790,6 +791,7 @@ class MODEL_TENSOR(IntEnum): MODEL_ARCH.SEED_OSS: "seed_oss", MODEL_ARCH.GROVEMOE: "grovemoe", MODEL_ARCH.APERTUS: "apertus", + MODEL_ARCH.MINIMAXM2: "minimax-m2", MODEL_ARCH.COGVLM: "cogvlm", } @@ -2921,6 +2923,24 @@ class MODEL_TENSOR(IntEnum): MODEL_TENSOR.FFN_DOWN_CHEXP, MODEL_TENSOR.FFN_UP_CHEXP, ], + MODEL_ARCH.MINIMAXM2: [ + MODEL_TENSOR.TOKEN_EMBD, + MODEL_TENSOR.OUTPUT_NORM, + MODEL_TENSOR.OUTPUT, + MODEL_TENSOR.ATTN_NORM, + MODEL_TENSOR.ATTN_Q, + MODEL_TENSOR.ATTN_Q_NORM, + MODEL_TENSOR.ATTN_K, + MODEL_TENSOR.ATTN_K_NORM, + MODEL_TENSOR.ATTN_V, + MODEL_TENSOR.ATTN_OUT, + MODEL_TENSOR.FFN_NORM, + MODEL_TENSOR.FFN_GATE_INP, + MODEL_TENSOR.FFN_GATE_EXP, + MODEL_TENSOR.FFN_DOWN_EXP, + MODEL_TENSOR.FFN_UP_EXP, + MODEL_TENSOR.FFN_EXP_PROBS_B, + ], MODEL_ARCH.COGVLM: [ MODEL_TENSOR.TOKEN_EMBD, MODEL_TENSOR.OUTPUT_NORM, diff --git a/gguf-py/gguf/tensor_mapping.py b/gguf-py/gguf/tensor_mapping.py index 6fe6f22358c..cef5acec758 100644 --- a/gguf-py/gguf/tensor_mapping.py +++ b/gguf-py/gguf/tensor_mapping.py @@ -381,6 +381,7 @@ class TensorNameMap: "model.layers.{bid}.mlp.moe_statics.e_score_correction", # ernie4.5-moe "model.layers.{bid}.mlp.gate.expert_bias", # bailingmoe2 "model.layers.{bid}.feed_forward.expert_bias", # lfm2moe + "model.layers.{bid}.block_sparse_moe.e_score_correction", # minimax-m2 ), # Feed-forward up diff --git a/src/llama-arch.cpp b/src/llama-arch.cpp index ad2880034c2..7c7953b83dd 100644 --- a/src/llama-arch.cpp +++ b/src/llama-arch.cpp @@ -105,6 +105,7 @@ static const std::map LLM_ARCH_NAMES = { { LLM_ARCH_SEED_OSS, "seed_oss" }, { LLM_ARCH_GROVEMOE, "grovemoe" }, { LLM_ARCH_APERTUS, "apertus" }, + { LLM_ARCH_MINIMAX_M2, "minimax-m2" }, { LLM_ARCH_COGVLM, "cogvlm" }, { LLM_ARCH_UNKNOWN, "(unknown)" }, }; @@ -2355,6 +2356,27 @@ static const std::map> LLM_TENSOR_N { LLM_TENSOR_FFN_UP_CHEXPS, "blk.%d.ffn_up_chexps" }, }, }, + { + LLM_ARCH_MINIMAX_M2, + { + { LLM_TENSOR_TOKEN_EMBD, "token_embd" }, + { LLM_TENSOR_OUTPUT_NORM, "output_norm" }, + { LLM_TENSOR_OUTPUT, "output" }, + { LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" }, + { LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" }, + { LLM_TENSOR_ATTN_K, "blk.%d.attn_k" }, + { LLM_TENSOR_ATTN_V, "blk.%d.attn_v" }, + { LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" }, + { LLM_TENSOR_ATTN_Q_NORM, "blk.%d.attn_q_norm" }, + { LLM_TENSOR_ATTN_K_NORM, "blk.%d.attn_k_norm" }, + { LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" }, + { LLM_TENSOR_FFN_GATE_INP, "blk.%d.ffn_gate_inp" }, + { LLM_TENSOR_FFN_GATE_EXPS, "blk.%d.ffn_gate_exps" }, + { LLM_TENSOR_FFN_DOWN_EXPS, "blk.%d.ffn_down_exps" }, + { LLM_TENSOR_FFN_UP_EXPS, "blk.%d.ffn_up_exps" }, + { LLM_TENSOR_FFN_EXP_PROBS_B, "blk.%d.exp_probs_b" }, + }, + }, { LLM_ARCH_COGVLM, { diff --git a/src/llama-arch.h b/src/llama-arch.h index 4dae35e2923..3f893a2dc69 100644 --- a/src/llama-arch.h +++ b/src/llama-arch.h @@ -109,6 +109,7 @@ enum llm_arch { LLM_ARCH_SEED_OSS, LLM_ARCH_GROVEMOE, LLM_ARCH_APERTUS, + LLM_ARCH_MINIMAX_M2, LLM_ARCH_COGVLM, LLM_ARCH_UNKNOWN, }; diff --git a/src/llama-model.cpp b/src/llama-model.cpp index 89a6a51b2cc..db536525752 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -120,6 +120,7 @@ const char * llm_type_name(llm_type type) { case LLM_TYPE_30B_A3B: return "30B.A3B"; case LLM_TYPE_100B_A6B: return "100B.A6B"; case LLM_TYPE_106B_A12B: return "106B.A12B"; + case LLM_TYPE_230B_A10B: return "230B.A10B"; case LLM_TYPE_235B_A22B: return "235B.A22B"; case LLM_TYPE_300B_A47B: return "300B.A47B"; case LLM_TYPE_355B_A32B: return "355B.A32B"; @@ -2155,6 +2156,17 @@ void llama_model::load_hparams(llama_model_loader & ml) { default: type = LLM_TYPE_UNKNOWN; } } break; + case LLM_ARCH_MINIMAX_M2: + { + ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); + ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp); + ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func, false); + + switch (hparams.n_layer) { + case 62: type = LLM_TYPE_230B_A10B; break; + default: type = LLM_TYPE_UNKNOWN; + } + } break; case LLM_ARCH_COGVLM: { ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps); @@ -6185,6 +6197,35 @@ bool llama_model::load_tensors(llama_model_loader & ml) { layer.attn_k_norm_b = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "bias", i), { n_embd_head_k }, TENSOR_NOT_REQUIRED); } } break; + case LLM_ARCH_MINIMAX_M2: + { + tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); + + // output + output_norm = create_tensor(tn(LLM_TENSOR_OUTPUT_NORM, "weight"), {n_embd}, 0); + output = create_tensor(tn(LLM_TENSOR_OUTPUT, "weight"), {n_embd, n_vocab}, 0); + + for (int i = 0; i < n_layer; ++i) { + auto & layer = layers[i]; + + layer.wq = create_tensor(tn(LLM_TENSOR_ATTN_Q, "weight", i), { n_embd, n_embd_head_k * n_head }, 0); + layer.wk = create_tensor(tn(LLM_TENSOR_ATTN_K, "weight", i), { n_embd, n_embd_gqa }, 0); + layer.wv = create_tensor(tn(LLM_TENSOR_ATTN_V, "weight", i), { n_embd, n_embd_gqa }, 0); + layer.wo = create_tensor(tn(LLM_TENSOR_ATTN_OUT, "weight", i), { n_embd_head_k * n_head, n_embd }, 0); + + layer.attn_norm = create_tensor(tn(LLM_TENSOR_ATTN_NORM, "weight", i), {n_embd}, 0); + layer.attn_q_norm = create_tensor(tn(LLM_TENSOR_ATTN_Q_NORM, "weight", i), {n_embd_head_k * n_head}, 0); + layer.attn_k_norm = create_tensor(tn(LLM_TENSOR_ATTN_K_NORM, "weight", i), {n_embd_k_gqa}, 0); + + layer.ffn_norm = create_tensor(tn(LLM_TENSOR_FFN_NORM, "weight", i), {n_embd}, 0); + + layer.ffn_gate_inp = create_tensor(tn(LLM_TENSOR_FFN_GATE_INP, "weight", i), {n_embd, n_expert}, 0); + layer.ffn_gate_exps = create_tensor(tn(LLM_TENSOR_FFN_GATE_EXPS, "weight", i), {n_embd, n_ff, n_expert}, 0); + layer.ffn_down_exps = create_tensor(tn(LLM_TENSOR_FFN_DOWN_EXPS, "weight", i), {n_ff, n_embd, n_expert}, 0); + layer.ffn_up_exps = create_tensor(tn(LLM_TENSOR_FFN_UP_EXPS, "weight", i), {n_embd, n_ff, n_expert}, 0); + layer.ffn_exp_probs_b = create_tensor(tn(LLM_TENSOR_FFN_EXP_PROBS_B, "bias", i), {n_expert}, 0); + } + } break; case LLM_ARCH_COGVLM: { tok_embd = create_tensor(tn(LLM_TENSOR_TOKEN_EMBD, "weight"), {n_embd, n_vocab}, 0); @@ -20024,6 +20065,130 @@ struct llm_build_apertus : public llm_graph_context { } }; +struct llm_build_minimax_m2 : public llm_graph_context { + llm_build_minimax_m2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + // GGML_ASSERT(n_embd_head == hparams.n_rot); this is wrong in case of minimax, head_dim = 128, n_rot = 64 + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * inp_pos = build_inp_pos(); + auto inp_attn = build_attn_inp_kv(); + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = inpL; + + // self_attention + { + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } +}; + struct llm_build_cogvlm : public llm_graph_context { llm_build_cogvlm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; @@ -20654,6 +20819,10 @@ ggml_cgraph * llama_model::build_graph(const llm_graph_params & params) const { { llm = std::make_unique(*this, params); } break; + case LLM_ARCH_MINIMAX_M2: + { + llm = std::make_unique(*this, params); + } break; case LLM_ARCH_COGVLM: { llm = std::make_unique(*this, params); @@ -20875,6 +21044,7 @@ llama_rope_type llama_model_rope_type(const llama_model * model) { case LLM_ARCH_SEED_OSS: case LLM_ARCH_GROVEMOE: case LLM_ARCH_APERTUS: + case LLM_ARCH_MINIMAX_M2: case LLM_ARCH_COGVLM: return LLAMA_ROPE_TYPE_NEOX; diff --git a/src/llama-model.h b/src/llama-model.h index a5affda1c99..71ff148e07d 100644 --- a/src/llama-model.h +++ b/src/llama-model.h @@ -114,6 +114,7 @@ enum llm_type { LLM_TYPE_30B_A3B, LLM_TYPE_100B_A6B, LLM_TYPE_106B_A12B, // GLM-4.5-Air + LLM_TYPE_230B_A10B, // Minimax M2 LLM_TYPE_235B_A22B, LLM_TYPE_300B_A47B, // Ernie MoE big LLM_TYPE_355B_A32B, // GLM-4.5 diff --git a/src/llama-vocab.cpp b/src/llama-vocab.cpp index 639fecbd317..735c5d547f9 100644 --- a/src/llama-vocab.cpp +++ b/src/llama-vocab.cpp @@ -401,6 +401,7 @@ struct llm_tokenizer_bpe : llm_tokenizer { }; break; case LLAMA_VOCAB_PRE_TYPE_GPT4O: + case LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2: regex_exprs = { // original regex from tokenizer.json // "[^\\r\\n\\p{L}\\p{N}]?[\\p{Lu}\\p{Lt}\\p{Lm}\\p{Lo}\\p{M}]*[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}]+(?i:'s|'t|'re|'ve|'m|'ll|'d)?|[^\\r\\n\\p{L}\\p{N}]?[\\p{Lu}\\p{Lt}\\p{Lm}\\p{Lo}\\p{M}]+[\\p{Ll}\\p{Lm}\\p{Lo}\\p{M}]*(?i:'s|'t|'re|'ve|'m|'ll|'d)?|\\p{N}{1,3}| ?[^\\s\\p{L}\\p{N}]+[\\r\\n/]*|\\s*[\\r\\n]+|\\s+(?!\\S)|\\s+", @@ -1992,6 +1993,10 @@ void llama_vocab::impl::load(llama_model_loader & ml, const LLM_KV & kv) { tokenizer_pre == "grok-2") { pre_type = LLAMA_VOCAB_PRE_TYPE_GROK_2; clean_spaces = false; + } else if ( + tokenizer_pre == "minimax-m2") { + pre_type = LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2; + clean_spaces = false; } else { throw std::runtime_error(format("unknown pre-tokenizer type: '%s'", tokenizer_pre.c_str())); } diff --git a/src/llama-vocab.h b/src/llama-vocab.h index 5e468675e44..1194ec473d0 100644 --- a/src/llama-vocab.h +++ b/src/llama-vocab.h @@ -49,6 +49,7 @@ enum llama_vocab_pre_type { LLAMA_VOCAB_PRE_TYPE_HUNYUAN_DENSE = 38, LLAMA_VOCAB_PRE_TYPE_GROK_2 = 39, LLAMA_VOCAB_PRE_TYPE_GRANITE_DOCLING = 40, + LLAMA_VOCAB_PRE_TYPE_MINIMAX_M2 = 41, }; struct LLM_KV; From bea04522ff1a0d8559ccfd353aa018dcfbb608cc Mon Sep 17 00:00:00 2001 From: "Piotr Wilkin (ilintar)" Date: Fri, 31 Oct 2025 23:40:23 +0100 Subject: [PATCH 041/185] refactor : llama-model.cpp (#16252) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Sqashed: llama-model.cpp refactoring * Fix formatting of attn / ffn / ffn_moe calls * Fix import regression / unify spacing in models.h * totally DID NOT miss those! * Add missing qwen3vl(moe) models * Add missing new .cpp files to build * Remove extra semicolons * Editor checker * Update src/models/models.h Co-authored-by: Sigbjørn Skjæret --------- Co-authored-by: Sigbjørn Skjæret --- src/CMakeLists.txt | 94 + src/llama-model.cpp | 13565 +-------------------------- src/models/apertus.cpp | 125 + src/models/arcee.cpp | 135 + src/models/arctic.cpp | 138 + src/models/arwkv7.cpp | 86 + src/models/baichuan.cpp | 122 + src/models/bailingmoe.cpp | 144 + src/models/bailingmoe2.cpp | 135 + src/models/bert.cpp | 176 + src/models/bitnet.cpp | 160 + src/models/bloom.cpp | 101 + src/models/chameleon.cpp | 178 + src/models/chatglm.cpp | 132 + src/models/codeshell.cpp | 111 + src/models/cogvlm.cpp | 100 + src/models/cohere2-iswa.cpp | 131 + src/models/command-r.cpp | 122 + src/models/dbrx.cpp | 123 + src/models/deci.cpp | 135 + src/models/deepseek.cpp | 144 + src/models/deepseek2.cpp | 236 + src/models/dots1.cpp | 134 + src/models/dream.cpp | 105 + src/models/ernie4-5-moe.cpp | 150 + src/models/ernie4-5.cpp | 111 + src/models/exaone.cpp | 114 + src/models/exaone4.cpp | 123 + src/models/falcon-h1.cpp | 113 + src/models/falcon.cpp | 120 + src/models/gemma-embedding.cpp | 120 + src/models/gemma.cpp | 112 + src/models/gemma2-iswa.cpp | 125 + src/models/gemma3-iswa.cpp | 131 + src/models/gemma3n-iswa.cpp | 377 + src/models/glm4-moe.cpp | 153 + src/models/glm4.cpp | 127 + src/models/gpt2.cpp | 105 + src/models/gptneox.cpp | 144 + src/models/granite-hybrid.cpp | 196 + src/models/granite.cpp | 211 + src/models/graph-context-mamba.cpp | 283 + src/models/grok.cpp | 160 + src/models/grovemoe.cpp | 141 + src/models/hunyuan-dense.cpp | 132 + src/models/hunyuan-moe.cpp | 154 + src/models/internlm2.cpp | 121 + src/models/jais.cpp | 86 + src/models/jamba.cpp | 107 + src/models/lfm2.cpp | 173 + src/models/llada-moe.cpp | 123 + src/models/llada.cpp | 101 + src/models/llama-iswa.cpp | 174 + src/models/llama.cpp | 156 + src/models/mamba.cpp | 55 + src/models/minicpm3.cpp | 200 + src/models/minimax-m2.cpp | 124 + src/models/models.h | 477 + src/models/mpt.cpp | 126 + src/models/nemotron-h.cpp | 121 + src/models/nemotron.cpp | 122 + src/models/neo-bert.cpp | 104 + src/models/olmo.cpp | 121 + src/models/olmo2.cpp | 151 + src/models/olmoe.cpp | 124 + src/models/openai-moe-iswa.cpp | 123 + src/models/openelm.cpp | 124 + src/models/orion.cpp | 123 + src/models/phi2.cpp | 121 + src/models/phi3.cpp | 153 + src/models/plamo.cpp | 110 + src/models/plamo2.cpp | 316 + src/models/plm.cpp | 168 + src/models/qwen.cpp | 108 + src/models/qwen2.cpp | 118 + src/models/qwen2moe.cpp | 151 + src/models/qwen2vl.cpp | 117 + src/models/qwen3.cpp | 117 + src/models/qwen3moe.cpp | 124 + src/models/qwen3vl-moe.cpp | 150 + src/models/qwen3vl.cpp | 144 + src/models/refact.cpp | 94 + src/models/rwkv6-base.cpp | 162 + src/models/rwkv6.cpp | 94 + src/models/rwkv6qwen2.cpp | 86 + src/models/rwkv7-base.cpp | 135 + src/models/rwkv7.cpp | 90 + src/models/seed-oss.cpp | 124 + src/models/smallthinker.cpp | 120 + src/models/smollm3.cpp | 128 + src/models/stablelm.cpp | 146 + src/models/starcoder.cpp | 100 + src/models/starcoder2.cpp | 121 + src/models/t5-dec.cpp | 166 + src/models/t5-enc.cpp | 96 + src/models/wavtokenizer-dec.cpp | 149 + src/models/xverse.cpp | 108 + 97 files changed, 13423 insertions(+), 13563 deletions(-) create mode 100644 src/models/apertus.cpp create mode 100644 src/models/arcee.cpp create mode 100644 src/models/arctic.cpp create mode 100644 src/models/arwkv7.cpp create mode 100644 src/models/baichuan.cpp create mode 100644 src/models/bailingmoe.cpp create mode 100644 src/models/bailingmoe2.cpp create mode 100644 src/models/bert.cpp create mode 100644 src/models/bitnet.cpp create mode 100644 src/models/bloom.cpp create mode 100644 src/models/chameleon.cpp create mode 100644 src/models/chatglm.cpp create mode 100644 src/models/codeshell.cpp create mode 100644 src/models/cogvlm.cpp create mode 100644 src/models/cohere2-iswa.cpp create mode 100644 src/models/command-r.cpp create mode 100644 src/models/dbrx.cpp create mode 100644 src/models/deci.cpp create mode 100644 src/models/deepseek.cpp create mode 100644 src/models/deepseek2.cpp create mode 100644 src/models/dots1.cpp create mode 100644 src/models/dream.cpp create mode 100644 src/models/ernie4-5-moe.cpp create mode 100644 src/models/ernie4-5.cpp create mode 100644 src/models/exaone.cpp create mode 100644 src/models/exaone4.cpp create mode 100644 src/models/falcon-h1.cpp create mode 100644 src/models/falcon.cpp create mode 100644 src/models/gemma-embedding.cpp create mode 100644 src/models/gemma.cpp create mode 100644 src/models/gemma2-iswa.cpp create mode 100644 src/models/gemma3-iswa.cpp create mode 100644 src/models/gemma3n-iswa.cpp create mode 100644 src/models/glm4-moe.cpp create mode 100644 src/models/glm4.cpp create mode 100644 src/models/gpt2.cpp create mode 100644 src/models/gptneox.cpp create mode 100644 src/models/granite-hybrid.cpp create mode 100644 src/models/granite.cpp create mode 100644 src/models/graph-context-mamba.cpp create mode 100644 src/models/grok.cpp create mode 100644 src/models/grovemoe.cpp create mode 100644 src/models/hunyuan-dense.cpp create mode 100644 src/models/hunyuan-moe.cpp create mode 100644 src/models/internlm2.cpp create mode 100644 src/models/jais.cpp create mode 100644 src/models/jamba.cpp create mode 100644 src/models/lfm2.cpp create mode 100644 src/models/llada-moe.cpp create mode 100644 src/models/llada.cpp create mode 100644 src/models/llama-iswa.cpp create mode 100644 src/models/llama.cpp create mode 100644 src/models/mamba.cpp create mode 100644 src/models/minicpm3.cpp create mode 100644 src/models/minimax-m2.cpp create mode 100644 src/models/models.h create mode 100644 src/models/mpt.cpp create mode 100644 src/models/nemotron-h.cpp create mode 100644 src/models/nemotron.cpp create mode 100644 src/models/neo-bert.cpp create mode 100644 src/models/olmo.cpp create mode 100644 src/models/olmo2.cpp create mode 100644 src/models/olmoe.cpp create mode 100644 src/models/openai-moe-iswa.cpp create mode 100644 src/models/openelm.cpp create mode 100644 src/models/orion.cpp create mode 100644 src/models/phi2.cpp create mode 100644 src/models/phi3.cpp create mode 100644 src/models/plamo.cpp create mode 100644 src/models/plamo2.cpp create mode 100644 src/models/plm.cpp create mode 100644 src/models/qwen.cpp create mode 100644 src/models/qwen2.cpp create mode 100644 src/models/qwen2moe.cpp create mode 100644 src/models/qwen2vl.cpp create mode 100644 src/models/qwen3.cpp create mode 100644 src/models/qwen3moe.cpp create mode 100644 src/models/qwen3vl-moe.cpp create mode 100644 src/models/qwen3vl.cpp create mode 100644 src/models/refact.cpp create mode 100644 src/models/rwkv6-base.cpp create mode 100644 src/models/rwkv6.cpp create mode 100644 src/models/rwkv6qwen2.cpp create mode 100644 src/models/rwkv7-base.cpp create mode 100644 src/models/rwkv7.cpp create mode 100644 src/models/seed-oss.cpp create mode 100644 src/models/smallthinker.cpp create mode 100644 src/models/smollm3.cpp create mode 100644 src/models/stablelm.cpp create mode 100644 src/models/starcoder.cpp create mode 100644 src/models/starcoder2.cpp create mode 100644 src/models/t5-dec.cpp create mode 100644 src/models/t5-enc.cpp create mode 100644 src/models/wavtokenizer-dec.cpp create mode 100644 src/models/xverse.cpp diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 18cfc76564d..832b58e315d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -35,6 +35,100 @@ add_library(llama unicode-data.cpp unicode.cpp unicode.h + models/apertus.cpp + models/arcee.cpp + models/arctic.cpp + models/arwkv7.cpp + models/baichuan.cpp + models/bailingmoe.cpp + models/bailingmoe2.cpp + models/bert.cpp + models/bitnet.cpp + models/bloom.cpp + models/chameleon.cpp + models/chatglm.cpp + models/codeshell.cpp + models/cogvlm.cpp + models/cohere2-iswa.cpp + models/command-r.cpp + models/dbrx.cpp + models/deci.cpp + models/deepseek.cpp + models/deepseek2.cpp + models/dots1.cpp + models/dream.cpp + models/ernie4-5-moe.cpp + models/ernie4-5.cpp + models/exaone.cpp + models/exaone4.cpp + models/falcon-h1.cpp + models/falcon.cpp + models/gemma-embedding.cpp + models/gemma.cpp + models/gemma2-iswa.cpp + models/gemma3-iswa.cpp + models/gemma3n-iswa.cpp + models/glm4-moe.cpp + models/glm4.cpp + models/gpt2.cpp + models/gptneox.cpp + models/granite-hybrid.cpp + models/granite.cpp + models/grok.cpp + models/grovemoe.cpp + models/hunyuan-dense.cpp + models/hunyuan-moe.cpp + models/internlm2.cpp + models/jais.cpp + models/jamba.cpp + models/lfm2.cpp + models/llada-moe.cpp + models/llada.cpp + models/llama-iswa.cpp + models/llama.cpp + models/mamba.cpp + models/minicpm3.cpp + models/minimax-m2.cpp + models/mpt.cpp + models/nemotron-h.cpp + models/nemotron.cpp + models/neo-bert.cpp + models/olmo.cpp + models/olmo2.cpp + models/olmoe.cpp + models/openai-moe-iswa.cpp + models/openelm.cpp + models/orion.cpp + models/phi2.cpp + models/phi3.cpp + models/plamo.cpp + models/plamo2.cpp + models/plm.cpp + models/qwen.cpp + models/qwen2.cpp + models/qwen2moe.cpp + models/qwen2vl.cpp + models/qwen3.cpp + models/qwen3vl.cpp + models/qwen3vl-moe.cpp + models/qwen3moe.cpp + models/refact.cpp + models/rwkv6-base.cpp + models/rwkv6.cpp + models/rwkv6qwen2.cpp + models/rwkv7-base.cpp + models/rwkv7.cpp + models/seed-oss.cpp + models/smallthinker.cpp + models/smollm3.cpp + models/stablelm.cpp + models/starcoder.cpp + models/starcoder2.cpp + models/t5-dec.cpp + models/t5-enc.cpp + models/wavtokenizer-dec.cpp + models/xverse.cpp + models/graph-context-mamba.cpp ) target_include_directories(llama PRIVATE .) diff --git a/src/llama-model.cpp b/src/llama-model.cpp index db536525752..04239181c77 100644 --- a/src/llama-model.cpp +++ b/src/llama-model.cpp @@ -13,6 +13,8 @@ #include "ggml-cpp.h" +#include "models/models.h" + #include #include #include @@ -6724,13569 +6726,6 @@ ggml_tensor * llama_model::get_rope_factors(const llama_cparams & cparams, int i return layers[il].rope_short; } -struct llm_build_llama : public llm_graph_context { - llm_build_llama(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - if (hparams.use_kq_norm) { - // Llama4TextL2Norm - Qcur = ggml_rms_norm(ctx0, Qcur, hparams.f_norm_rms_eps); - Kcur = ggml_rms_norm(ctx0, Kcur, hparams.f_norm_rms_eps); - cb(Qcur, "Qcur_normed", il); - cb(Kcur, "Kcur_normed", il); - } - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network (non-MoE) - if (model.layers[il].ffn_gate_inp == nullptr) { - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_llama_iswa : public llm_graph_context { - llm_build_llama_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - // temperature tuning - ggml_tensor * inp_attn_scale = nullptr; - inp_attn_scale = build_inp_attn_scale(); - - auto * inp_attn = build_attn_inp_kv_iswa(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - const bool use_rope = hparams.n_no_rope_layer_step > 0 && - (il + 1) % hparams.n_no_rope_layer_step != 0; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (use_rope) { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } else if (inp_attn_scale) { - Qcur = ggml_mul(ctx0, Qcur, inp_attn_scale); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - if (use_rope && hparams.use_kq_norm) { - // Llama4TextL2Norm - Qcur = ggml_rms_norm(ctx0, Qcur, hparams.f_norm_rms_eps); - Kcur = ggml_rms_norm(ctx0, Kcur, hparams.f_norm_rms_eps); - cb(Qcur, "Qcur_normed", il); - cb(Kcur, "Kcur_normed", il); - } - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network (non-MoE) - if (model.layers[il].ffn_gate_inp == nullptr) { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - ggml_tensor * ffn_inp_normed = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = build_moe_ffn(ffn_inp_normed, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID, - il); - - // Shared experts - ggml_tensor * shexp_out = build_ffn(ffn_inp_normed, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(shexp_out, "ffn_moe_shexp", il); - - cur = ggml_add(ctx0, moe_out, shexp_out); - cb(cur, "ffn_moe_out_merged", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_deci : public llm_graph_context { - llm_build_deci(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - const int64_t n_head_kv = hparams.n_head_kv(il); - const int64_t n_head = hparams.n_head(il); - const int64_t n_ff = hparams.n_ff(il); - - if (n_head == 0) { - // attention-free layer of Llama-3_1-Nemotron-51B - cur = inpL; - } else { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - } - - if (n_head > 0 && n_head_kv == 0) { - // "linear attention" of Llama-3_1-Nemotron-51B - cur = build_lora_mm(model.layers[il].wo, cur); - cb(cur, "wo", il); - } else if (n_head > 0) { - // self-attention - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // FFN-free layer of Llama-3_1-Nemotron-Ultra-253B - if (n_ff == 0) { - continue; - } - - // modified to support attention-free layer of Llama-3_1-Nemotron-51B - ggml_tensor * ffn_inp = cur; - if (n_head > 0) { - ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - } - - // feed-forward network - if (model.layers[il].ffn_gate_inp == nullptr) { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_baichuan : public llm_graph_context { - llm_build_baichuan(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = model.type == LLM_TYPE_7B ? build_inp_pos() : nullptr; - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - switch (model.type) { - case LLM_TYPE_7B: - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - break; - case LLM_TYPE_13B: - break; - default: - GGML_ABORT("fatal error"); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_xverse : public llm_graph_context { - llm_build_xverse(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_falcon : public llm_graph_context { - llm_build_falcon(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * attn_norm; - - attn_norm = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(attn_norm, "attn_norm", il); - - // self-attention - { - if (model.layers[il].attn_norm_2) { - // Falcon-40B - cur = build_norm(inpL, - model.layers[il].attn_norm_2, - model.layers[il].attn_norm_2_b, - LLM_NORM, il); - cb(cur, "attn_norm_2", il); - } else { - cur = attn_norm; - } - - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - // using mode = 2 for neox mode - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - attn_norm = ggml_get_rows(ctx0, attn_norm, inp_out_ids); - } - - ggml_tensor * ffn_inp = cur; - - // feed forward - { - cur = build_ffn(attn_norm, // !! use the attn norm, not the result - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cur = ggml_add(ctx0, cur, inpL); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - // norm - cur = build_norm(cur, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_grok : public llm_graph_context { - llm_build_grok(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_out_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_out_norm", il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // MoE branch - ggml_tensor * moe_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_GELU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - if (model.layers[il].ffn_up) { - ggml_tensor * ffn_out = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_PAR, il); - cb(ffn_out, "ffn_out", il); - - cur = ggml_scale(ctx0, ggml_add(ctx0, ffn_out, moe_out), std::sqrt(2) / 2); - cb(cur, "ffn_out", il); - } else { - cur = moe_out; - } - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_post_norm", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cur = ggml_scale(ctx0, cur, hparams.f_logit_scale); - - // final logit soft-capping - if (hparams.f_final_logit_softcapping) { - cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); - cur = ggml_tanh(ctx0, cur); - cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_dbrx : public llm_graph_context { - llm_build_dbrx(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = nullptr; - ggml_tensor * Kcur = nullptr; - ggml_tensor * Vcur = nullptr; - - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_clamp(ctx0, cur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); - cb(cur, "wqkv_clamped", il); - - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].attn_out_norm, NULL, - LLM_NORM, il); - cb(cur, "attn_out_norm", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_starcoder : public llm_graph_context { - llm_build_starcoder(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); - cb(pos, "pos_embd", -1); - - inpL = ggml_add(ctx0, inpL, pos); - cb(inpL, "inpL", -1); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_refact : public llm_graph_context { - llm_build_refact(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_bert : public llm_graph_context { - llm_build_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - ggml_tensor * inp_pos = nullptr; - - if (model.arch != LLM_ARCH_JINA_BERT_V2) { - inp_pos = build_inp_pos(); - } - - // construct input embeddings (token, type, position) - inpL = build_inp_embd(model.tok_embd); - - // token types are hardcoded to zero ("Sentence A") - if (model.type_embd) { - ggml_tensor * type_row0 = ggml_view_1d(ctx0, model.type_embd, n_embd, 0); - inpL = ggml_add(ctx0, inpL, type_row0); - } - if (model.arch == LLM_ARCH_BERT) { - inpL = ggml_add(ctx0, ggml_get_rows(ctx0, model.pos_embd, inp_pos), inpL); - } - cb(inpL, "inp_embd", -1); - - // embed layer norm - inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); - cb(inpL, "inp_norm", -1); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * cur = inpL; - - { - ggml_tensor * Qcur; - ggml_tensor * Kcur; - ggml_tensor * Vcur; - - // self-attention - if (model.layers[il].wqkv) { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - if (model.layers[il].bqkv) { - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - } - - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - } else { - Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, cur), model.layers[il].bq); - Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, cur), model.layers[il].bk); - Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, cur), model.layers[il].bv); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - } - - if (model.layers[il].attn_q_norm) { - Qcur = ggml_reshape_2d(ctx0, Qcur, n_embd_head*n_head, n_tokens); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, - model.layers[il].attn_q_norm_b, - LLM_NORM, il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - } - - if (model.layers[il].attn_k_norm) { - Kcur = ggml_reshape_2d(ctx0, Kcur, n_embd_head*n_head_kv, n_tokens); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, - model.layers[il].attn_k_norm_b, - LLM_NORM, il); - - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - } - - // RoPE - if (model.arch == LLM_ARCH_NOMIC_BERT || model.arch == LLM_ARCH_NOMIC_BERT_MOE || model.arch == LLM_ARCH_JINA_BERT_V3) { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - cb(cur, "kqv_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // re-add the layer input - cur = ggml_add(ctx0, cur, inpL); - - // attention layer norm - cur = build_norm(cur, model.layers[il].attn_out_norm, model.layers[il].attn_out_norm_b, LLM_NORM, il); - - if (model.layers[il].attn_norm_2 != nullptr) { - cur = ggml_add(ctx0, cur, inpL); // re-add the layer input - cur = build_norm(cur, model.layers[il].attn_norm_2, model.layers[il].attn_norm_2_b, LLM_NORM, il); - } - - ggml_tensor * ffn_inp = cur; - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - if (hparams.moe_every_n_layers > 0 && il % hparams.moe_every_n_layers == 1) { - // MoE branch - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - nullptr, - model.layers[il].ffn_down_exps, - nullptr, - hparams.n_expert, - hparams.n_expert_used, - LLM_FFN_GELU, - false, false, - 0.0f, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, il); - cb(cur, "ffn_moe_out", il); - } else if (model.arch == LLM_ARCH_BERT || model.arch == LLM_ARCH_NOMIC_BERT_MOE || model.arch == LLM_ARCH_JINA_BERT_V3) { - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } else if (model.arch == LLM_ARCH_JINA_BERT_V2) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - model.layers[il].ffn_gate ? LLM_FFN_GELU : LLM_FFN_GEGLU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - // attentions bypass the intermediate layer - cur = ggml_add(ctx0, cur, ffn_inp); - - // output layer norm - cur = build_norm(cur, model.layers[il].layer_out_norm, model.layers[il].layer_out_norm_b, LLM_NORM, il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cb(cur, "result_embd", -1); - res->t_embd = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_neo_bert : public llm_graph_context { - llm_build_neo_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - ggml_tensor * inp_pos = build_inp_pos(); - - // construct input embeddings (token, type, position) - inpL = build_inp_embd(model.tok_embd); - cb(inpL, "inp_embd", -1); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * cur = inpL; - - // pre-norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - - { - ggml_tensor * Qcur; - ggml_tensor * Kcur; - ggml_tensor * Vcur; - - // self-attention - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - // RoPE - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, nullptr, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - cb(cur, "kqv_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // re-add the layer input - cur = ggml_add(ctx0, cur, inpL); - - ggml_tensor * ffn_inp = cur; - cb(ffn_inp, "ffn_inp", il); - - // pre-norm - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - cur = build_ffn(cur, - model.layers[il].ffn_up, - NULL, NULL, NULL, NULL, NULL, - model.layers[il].ffn_down, - NULL, NULL, NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - - // attentions bypass the intermediate layer - cur = ggml_add(ctx0, cur, ffn_inp); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm_enc, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_embd", -1); - res->t_embd = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_bloom : public llm_graph_context { - llm_build_bloom(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * inp_attn = build_attn_inp_kv(); - - inpL = build_norm(inpL, - model.tok_norm, - model.tok_norm_b, - LLM_NORM, -1); - cb(inpL, "inp_norm", -1); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // Add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_mpt : public llm_graph_context { - llm_build_mpt(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * pos; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * inp_attn = build_attn_inp_kv(); - - if (model.pos_embd) { - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); - cb(pos, "pos_embd", -1); - - inpL = ggml_add(ctx0, inpL, pos); - cb(inpL, "inpL", -1); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * attn_norm; - - attn_norm = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(attn_norm, "attn_norm", il); - - // self-attention - { - cur = attn_norm; - - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - if (model.layers[il].bqkv){ - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - } - - if (hparams.f_clamp_kqv > 0.0f) { - cur = ggml_clamp(ctx0, cur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); - cb(cur, "wqkv_clamped", il); - } - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - // Q/K Layernorm - if (model.layers[il].attn_q_norm) { - Qcur = ggml_reshape_2d(ctx0, Qcur, n_embd_head*n_head, n_tokens); - Kcur = ggml_reshape_2d(ctx0, Kcur, n_embd_head*n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, - model.layers[il].attn_q_norm_b, - LLM_NORM, il); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, - model.layers[il].attn_k_norm_b, - LLM_NORM, il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // Add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // feed forward - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - model.layers[il].ffn_act, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_stablelm : public llm_graph_context { - llm_build_stablelm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - ggml_tensor * inpSA = cur; - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (model.layers[il].attn_q_norm) { - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, - NULL, - LLM_NORM, il); - cb(Qcur, "Qcur", il); - } - - if (model.layers[il].attn_k_norm) { - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, - NULL, - LLM_NORM, il); - cb(Kcur, "Kcur", il); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - if (model.layers[il].ffn_norm) { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - } else { - // parallel residual - cur = inpSA; - } - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen : public llm_graph_context { - llm_build_qwen(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 2*sizeof(float)*(n_embd)); - - // using mode = 2 for neox mode - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward forward - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen2 : public llm_graph_context { - llm_build_qwen2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - if (model.output_b != nullptr) { - cur = ggml_add(ctx0, cur, model.output_b); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_dream : public llm_graph_context { - llm_build_dream(const llama_model & model, const llm_graph_params & params) : - llm_graph_context(params) { - //copied from qwen2 - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, model.layers[il].ffn_up, NULL, NULL, model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_llada : public llm_graph_context { - llm_build_llada(const llama_model & model, const llm_graph_params & params) : - llm_graph_context(params) { - // LLaDA is similar to LLaMA but uses non-causal attention for diffusion - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - // Non-causal attention for diffusion - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute separate Q, K, V projections without bias, matching LLaDALlamaBlock - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, model.layers[il].ffn_up, NULL, NULL, model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen2vl : public llm_graph_context { - llm_build_qwen2vl(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - int sections[4]; - std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_multi( - ctx0, Qcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_multi( - ctx0, Kcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen2moe : public llm_graph_context { - llm_build_qwen2moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // FFN shared expert - { - ggml_tensor * cur_gate_inp = build_lora_mm(model.layers[il].ffn_gate_inp_shexp, cur); - cb(cur_gate_inp, "ffn_shexp_gate_inp", il); - - // sigmoid - ggml_tensor * cur_gate = ggml_div(ctx0, ggml_silu(ctx0, cur_gate_inp), cur_gate_inp); - cb(cur_gate, "ffn_shexp_gate", il); - - ggml_tensor * cur_ffn = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur_ffn, "ffn_shexp", il); - - ggml_tensor * ffn_shexp_out = ggml_mul(ctx0, cur_ffn, cur_gate); - cb(ffn_shexp_out, "ffn_shexp_out", il); - - moe_out = ggml_add(ctx0, moe_out, ffn_shexp_out); - cb(moe_out, "ffn_out", il); - - cur = moe_out; - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen3 : public llm_graph_context { - llm_build_qwen3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen3moe : public llm_graph_context { - llm_build_qwen3moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - cur = moe_out; - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen3vl : public llm_graph_context { - llm_build_qwen3vl(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - - const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds - const size_t n_deepstack_layers = hparams.n_deepstack_layers; - const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); - const int64_t n_embd_head = hparams.n_embd_head_v; - - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - int sections[4]; - std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); - - std::vector deepstack_features(n_deepstack_layers, nullptr); - - if (ubatch.embd) { - // Image input: split main embd and deepstack embds - ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); - for (size_t i = 0; i < n_deepstack_layers; i++) { - deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); - } - inpL = inpL_main; - } - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_multi( - ctx0, Qcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_multi( - ctx0, Kcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - if (ubatch.embd && (size_t)il < n_deepstack_layers) { - cur = ggml_add(ctx0, cur, deepstack_features[il]); - cb(cur, "deepstack_out", il); - } - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_qwen3vlmoe : public llm_graph_context { - llm_build_qwen3vlmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds - const size_t n_deepstack_layers = hparams.n_deepstack_layers; - const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - int sections[4]; - std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); - - std::vector deepstack_features(n_deepstack_layers, nullptr); - - if (ubatch.embd) { - // Image input: split main embd and deepstack embds - ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); - for (size_t i = 0; i < n_deepstack_layers; i++) { - deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); - } - inpL = inpL_main; - } - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_multi( - ctx0, Qcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_multi( - ctx0, Kcur, inp_pos, nullptr, - n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - cur = moe_out; - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - if (ubatch.embd && (size_t)il < n_deepstack_layers) { - cur = ggml_add(ctx0, cur, deepstack_features[il]); - cb(cur, "deepstack_out", il); - } - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_phi2 : public llm_graph_context { - llm_build_phi2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * attn_norm_output; - ggml_tensor * ffn_output; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - attn_norm_output = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(attn_norm_output, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = nullptr; - ggml_tensor * Kcur = nullptr; - ggml_tensor * Vcur = nullptr; - - if (model.layers[il].wqkv) { - cur = build_lora_mm(model.layers[il].wqkv, attn_norm_output); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - } else { - Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, attn_norm_output), model.layers[il].bq); - Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, attn_norm_output), model.layers[il].bk); - Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, attn_norm_output), model.layers[il].bv); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - // with phi2, we scale the Q to avoid precision issues - // ref: https://github.com/ml-explore/mlx-examples/blob/08e862336ade809bc37d1035f94b359e7d1a5152/phi2/phi2.py#L64-L66 - Qcur = ggml_scale(ctx0, Qcur, 1.0f/sqrtf(float(n_embd_head))); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - attn_norm_output = ggml_get_rows(ctx0, attn_norm_output, inp_out_ids); - } - - // FF - { - ffn_output = build_ffn(attn_norm_output, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(ffn_output, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_output); - cur = ggml_add(ctx0, cur, inpL); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output_no_bias", -1); - - cur = ggml_add(ctx0, cur, model.output_b); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -template -struct llm_build_phi3 : public llm_graph_context { - llm_build_phi3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - using inp_attn_type = std::conditional_t; - inp_attn_type * inp_attn = nullptr; - - if constexpr (iswa) { - inp_attn = build_attn_inp_kv_iswa(); - } else { - inp_attn = build_attn_inp_kv(); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - auto * residual = inpL; - - // self-attention - { - // rope freq factors for 128k context - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - ggml_tensor* attn_norm_output = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM_RMS, il); - cb(attn_norm_output, "attn_norm", il); - - ggml_tensor * Qcur = nullptr; - ggml_tensor * Kcur = nullptr; - ggml_tensor * Vcur = nullptr; - - if (model.layers[il].wqkv) { - cur = build_lora_mm(model.layers[il].wqkv, attn_norm_output); - cb(cur, "wqkv", il); - - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 0 * sizeof(float) * (n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 1 * sizeof(float) * (n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); - } else { - Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, attn_norm_output), model.layers[il].bq); - Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, attn_norm_output), model.layers[il].bk); - Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, attn_norm_output), model.layers[il].bv); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = ggml_scale(ctx0, Qcur, 1.0f / sqrtf(float(n_embd_head))); - cb(Qcur, "Qcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - residual = ggml_get_rows(ctx0, residual, inp_out_ids); - } - - cur = ggml_add(ctx0, cur, residual); - residual = cur; - - cur = build_norm(cur, - model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - if (model.layers[il].ffn_gate_inp == nullptr) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - } - - cur = ggml_add(ctx0, residual, cur); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - if (model.output_b != nullptr) { - cb(cur, "result_output_no_bias", -1); - cur = ggml_add(ctx0, cur, model.output_b); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_plamo : public llm_graph_context { - llm_build_plamo(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - ggml_tensor * sa_inp = cur; - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_embd_head, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_embd_head, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - sa_inp = ggml_get_rows(ctx0, sa_inp, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - ggml_tensor * sa_out = cur; - - cur = sa_inp; - - // feed-forward network - { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, sa_out); - cur = ggml_add(ctx0, cur, inpL); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gpt2 : public llm_graph_context { - llm_build_gpt2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * pos; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); - cb(pos, "pos_embd", -1); - - inpL = ggml_add(ctx0, inpL, pos); - cb(inpL, "inpL", -1); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_codeshell : public llm_graph_context { - llm_build_codeshell(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_orion : public llm_graph_context { - llm_build_orion(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - // if (model.layers[il].bq) { - // Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - // cb(Qcur, "Qcur", il); - // } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - // if (model.layers[il].bk) { - // Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - // cb(Kcur, "Kcur", il); - // } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - // if (model.layers[il].bv) { - // Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - // cb(Vcur, "Vcur", il); - // } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_internlm2 : public llm_graph_context { - llm_build_internlm2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_minicpm3 : public llm_graph_context { - llm_build_minicpm3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - //TODO: if the model varies, these parameters need to be read from the model - const int64_t n_embd_base = 256; - const float scale_embd = 12.0f; - const float scale_depth = 1.4f; - const float kq_scale = 1.0f / sqrtf(float(hparams.n_embd_head_k)); - - const uint32_t n_embd_head_qk_rope = hparams.n_rot; - const uint32_t n_embd_head_qk_nope = hparams.n_embd_head_k - hparams.n_rot; - const uint32_t kv_lora_rank = hparams.n_lora_kv; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // scale the input embeddings - inpL = ggml_scale(ctx0, inpL, scale_embd); - cb(inpL, "inp_scaled", -1); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - ggml_tensor * q = NULL; - // {n_embd, q_lora_rank} * {n_embd, n_tokens} -> {q_lora_rank, n_tokens} - q = ggml_mul_mat(ctx0, model.layers[il].wq_a, cur); - cb(q, "q", il); - - q = build_norm(q, - model.layers[il].attn_q_a_norm, NULL, - LLM_NORM_RMS, il); - cb(q, "q", il); - - // {q_lora_rank, n_head * hparams.n_embd_head_k} * {q_lora_rank, n_tokens} -> {n_head * hparams.n_embd_head_k, n_tokens} - q = ggml_mul_mat(ctx0, model.layers[il].wq_b, q); - cb(q, "q", il); - - // split into {n_head * n_embd_head_qk_nope, n_tokens} - ggml_tensor * q_nope = ggml_view_3d(ctx0, q, n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(q->type, hparams.n_embd_head_k), - ggml_row_size(q->type, hparams.n_embd_head_k * n_head), - 0); - cb(q_nope, "q_nope", il); - - // and {n_head * n_embd_head_qk_rope, n_tokens} - ggml_tensor * q_pe = ggml_view_3d(ctx0, q, n_embd_head_qk_rope, n_head, n_tokens, - ggml_row_size(q->type, hparams.n_embd_head_k), - ggml_row_size(q->type, hparams.n_embd_head_k * n_head), - ggml_row_size(q->type, n_embd_head_qk_nope)); - cb(q_pe, "q_pe", il); - - // {n_embd, kv_lora_rank + n_embd_head_qk_rope} * {n_embd, n_tokens} -> {kv_lora_rank + n_embd_head_qk_rope, n_tokens} - ggml_tensor * kv_pe_compresseed = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); - cb(kv_pe_compresseed, "kv_pe_compresseed", il); - - // split into {kv_lora_rank, n_tokens} - ggml_tensor * kv_compressed = ggml_view_2d(ctx0, kv_pe_compresseed, kv_lora_rank, n_tokens, - kv_pe_compresseed->nb[1], - 0); - cb(kv_compressed, "kv_compressed", il); - - // and {n_embd_head_qk_rope, n_tokens} - ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_pe_compresseed, n_embd_head_qk_rope, 1, n_tokens, - kv_pe_compresseed->nb[1], - kv_pe_compresseed->nb[1], - ggml_row_size(kv_pe_compresseed->type, kv_lora_rank)); - cb(k_pe, "k_pe", il); - - kv_compressed = build_norm(kv_compressed, - model.layers[il].attn_kv_a_norm, NULL, - LLM_NORM_RMS, il); - cb(kv_compressed, "kv_compressed", il); - - // {kv_lora_rank, n_head * (n_embd_head_qk_nope + n_embd_head_v)} * {kv_lora_rank, n_tokens} -> {n_head * (n_embd_head_qk_nope + n_embd_head_v), n_tokens} - ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_compressed); - cb(kv, "kv", il); - - // split into {n_head * n_embd_head_qk_nope, n_tokens} - ggml_tensor * k_nope = ggml_view_3d(ctx0, kv, n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(kv->type, n_embd_head_qk_nope + hparams.n_embd_head_v), - ggml_row_size(kv->type, n_head * (n_embd_head_qk_nope + hparams.n_embd_head_v)), - 0); - cb(k_nope, "k_nope", il); - - // and {n_head * n_embd_head_v, n_tokens} - ggml_tensor * v_states = ggml_view_3d(ctx0, kv, hparams.n_embd_head_v, n_head, n_tokens, - ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)), - ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)*n_head), - ggml_row_size(kv->type, (n_embd_head_qk_nope))); - cb(v_states, "v_states", il); - - v_states = ggml_cont(ctx0, v_states); - cb(v_states, "v_states", il); - - q_pe = ggml_rope_ext( - ctx0, q_pe, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(q_pe, "q_pe", il); - - // shared RoPE key - k_pe = ggml_rope_ext( - ctx0, k_pe, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(k_pe, "k_pe", il); - - ggml_tensor * q_states = ggml_concat(ctx0, q_nope, q_pe, 0); - cb(q_states, "q_states", il); - - ggml_tensor * k_states = ggml_concat(ctx0, k_nope, ggml_repeat(ctx0, k_pe, q_pe), 0); - cb(k_states, "k_states", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - q_states, k_states, v_states, nullptr, nullptr, nullptr, kq_scale, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // scale_res - scale the hidden states for residual connection - const float scale_res = scale_depth/sqrtf(float(n_layer)); // TODO: is this correct? - cur = ggml_scale(ctx0, cur, scale_res); - cb(cur, "hidden_scaled", il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - // scale the hidden states for residual connection - cur = ggml_scale(ctx0, cur, scale_res); - cb(cur, "hidden_scaled_ffn", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head scaling - const float scale_lmhead = float(n_embd_base)/float(n_embd); - cur = ggml_scale(ctx0, cur, scale_lmhead); - cb(cur, "lmhead_scaling", -1); - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gemma : public llm_graph_context { - llm_build_gemma(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); - cb(inpL, "inp_scaled", -1); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = ggml_scale(ctx0, Qcur, 1.0f / sqrtf(float(n_embd_head))); - cb(Qcur, "Qcur_scaled", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); - cb(sa_out, "sa_out", il); - - cur = build_norm(sa_out, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, sa_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gemma2_iswa : public llm_graph_context { - llm_build_gemma2_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_k; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); - cb(inpL, "inp_scaled", -1); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv_iswa(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); - cb(sa_out, "sa_out", il); - - cur = build_norm(sa_out, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", -1); - - cur = ggml_add(ctx0, cur, sa_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - // final logit soft-capping - cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); - cur = ggml_tanh(ctx0, cur); - cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gemma3_iswa : public llm_graph_context { - llm_build_gemma3_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_k; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - if (ubatch.token) { - inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); - cb(inpL, "inp_scaled", -1); - } - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - // TODO: is causal == true correct? might need some changes - auto * inp_attn = build_attn_inp_kv_iswa(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - // ref: https://github.com/google/gemma_pytorch/blob/014acb7ac4563a5f77c76d7ff98f31b568c16508/gemma/model.py#L315 - Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); - cb(sa_out, "sa_out", il); - - cur = build_norm(sa_out, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", -1); - - cur = ggml_add(ctx0, cur, sa_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gemma3n_iswa : public llm_graph_context { - const llama_model & model; - - const int64_t n_embd_head; - const int64_t n_embd_altup; - const int64_t n_altup; - const int i_altup_act; - const int n_layer_sparsity = 10; // number of layers using activation sparsity - const float f_sparsity_std_mul = 1.6448533535003662f; // std_multiplier = normal_dist.icdf(0.95) - - llm_build_gemma3n_iswa(const llama_model & model, const llm_graph_params & params) - : llm_graph_context(params), - model(model), - n_embd_head(model.hparams.n_embd_head_k), - n_embd_altup(model.hparams.n_embd_altup), - n_altup(model.hparams.n_altup), - i_altup_act(model.hparams.i_altup_act) { - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - if (ubatch.token) { - inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); - cb(inpL, "inp_scaled", -1); - } - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - // TODO: is causal == true correct? might need some changes - auto * inp_attn = build_attn_inp_kv_iswa(); - - // inp_per_layer shape: [n_embd_altup, n_tokens, n_layer] - ggml_tensor * inp_per_layer = project_per_layer_inputs(inpL, get_per_layer_inputs()); - - // inpL now has only 1 altup, project it to the rest of the altups - // these "added" altups will be concat to the last dim of inpL - { - ggml_tensor * target_magnitude = calc_magnitude(inpL); - ggml_tensor * inp_repeated = ggml_repeat_4d(ctx0, inpL, n_embd, n_tokens, n_altup - 1, 1); - ggml_tensor * altup_added = ggml_mul_mat(ctx0, model.altup_proj, inp_repeated); // shape: [n_embd, n_tokens, n_altup - 1] - ggml_tensor * new_magnitude = calc_magnitude(altup_added); - altup_added = ggml_div(ctx0, - ggml_mul(ctx0, altup_added, target_magnitude), - new_magnitude); - inpL = ggml_concat(ctx0, inpL, altup_added, 2); // shape: [n_embd, n_tokens, n_altup] - cb(inpL, "inp_stacked", -1); - } - - // inpL now has shape: [n_embd, n_tokens, n_altup] - // inp_per_layer now has shape: [n_embd_altup, n_tokens, n_layer] - - for (int il = 0; il < n_layer; ++il) { - // this block is made to be closely resemble Gemma3p5DecoderLayer on python code - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - - ggml_tensor * cur = inpL; // [n_embd, n_tokens, n_altup] - ggml_tensor * predictions = altup_predict(cur, il); // [n_embd, n_tokens, n_altup] - - // predicted value will go through self-attention and laurel - ggml_tensor * active_prediction = view_2d_slice(predictions, i_altup_act); // [n_embd, n_tokens] - cur = active_prediction; - cb(cur, "active_prediction", il); - - // norm - cur = build_norm(cur, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // laurel - ggml_tensor * laurel_out = laurel(cur, il); // [n_embd, n_tokens] - - // self-attention - if (hparams.has_kv(il)) { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - Vcur = ggml_rms_norm(ctx0, Vcur, hparams.f_norm_rms_eps); - - cb(Qcur, "Qcur_normed", il); - cb(Kcur, "Kcur_normed", il); - cb(Vcur, "Vcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur_pos", il); - cb(Kcur, "Kcur_pos", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, hparams.f_attention_scale, il); - } else { - // reuse KV cache of earlier layers - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - cb(Qcur, "Qcur_pos", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, nullptr, nullptr, nullptr, nullptr, nullptr, hparams.f_attention_scale, il); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - cur = ggml_add(ctx0, cur, active_prediction); // [n_embd, n_tokens] - cb(cur, "attn_gated", il); - - ggml_tensor * attn_laurel = ggml_scale(ctx0, - ggml_add(ctx0, cur, laurel_out), - 1.0f / sqrtf(2.0f)); // [n_embd, n_tokens] - cb(attn_laurel, "attn_laurel", il); - - cur = build_norm(attn_laurel, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - { - ggml_tensor * up_proj = build_lora_mm(model.layers[il].ffn_up, cur); - ggml_tensor * gate_proj = build_lora_mm(model.layers[il].ffn_gate, cur); - - if (il < n_layer_sparsity) { - // apply activation sparsity - gate_proj = gaussian_topk(gate_proj); - } - gate_proj = ggml_gelu(ctx0, gate_proj); - - cur = ggml_mul(ctx0, up_proj, gate_proj); - cur = build_lora_mm(model.layers[il].ffn_down, cur); - cb(cur, "ffn_out", il); - } - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", il); - - ggml_tensor * attn_ffw_laurel_gated = ggml_add(ctx0, cur, attn_laurel); // [n_embd, n_tokens] - cb(attn_ffw_laurel_gated, "attn_ffw_laurel_gated", il); - - ggml_tensor * corrected = altup_correct(predictions, attn_ffw_laurel_gated, il); // [n_embd, n_tokens, n_altup] - - ggml_tensor * first_prediction; // [n_embd, n_tokens] - { - first_prediction = view_2d_slice(corrected, i_altup_act); // [n_embd, n_tokens] - first_prediction = ggml_mul(ctx0, first_prediction, model.layers[il].altup_correct_scale); - first_prediction = build_lora_mm(model.layers[il].per_layer_inp_gate, first_prediction); - first_prediction = ggml_gelu(ctx0, first_prediction); // [n_embd_altup, n_tokens] - cb(first_prediction, "first_prediction_gated", il); - ggml_tensor * inp_this_layer = view_2d_slice(inp_per_layer, il); // [n_embd_altup, n_tokens] - first_prediction = ggml_mul(ctx0, first_prediction, inp_this_layer); // [n_embd_altup, n_tokens] - cb(first_prediction, "first_prediction_scaled", il); - - first_prediction = build_lora_mm(model.layers[il].per_layer_proj, first_prediction); // [n_embd, n_tokens] - first_prediction = build_norm(first_prediction, - model.layers[il].per_layer_post_norm, NULL, - LLM_NORM_RMS, il); - cb(first_prediction, "first_prediction_out", il); - } - - // equivalent to python code: corrected_predictions[1:] += first_prediction - { - ggml_tensor * slice_first = view_2d_slice(corrected, 0); - ggml_tensor * slice_rest = ggml_view_3d(ctx0, corrected, n_embd, n_tokens, n_altup - 1, - ggml_row_size(corrected->type, n_embd), - ggml_row_size(corrected->type, n_embd*n_tokens), - n_embd*n_tokens*ggml_element_size(corrected)); - ggml_tensor * tmp = ggml_add(ctx0, slice_rest, first_prediction); // [n_embd, n_tokens, n_altup - 1] - corrected = ggml_concat(ctx0, slice_first, tmp, 2); // [n_embd, n_tokens, n_altup] - } - - cur = corrected; // [n_embd, n_tokens, n_altup] - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; // [n_embd, n_tokens, n_altup] - - // cur now has multiple altup(s), we want to merge them back to 1 altup - { - ggml_tensor * target_magnitude = calc_magnitude(view_2d_slice(cur, i_altup_act)); // [n_embd, n_tokens] - // do a view to skip the first slice (active altup) - ggml_tensor * alt_slice = ggml_view_3d(ctx0, cur, n_embd, n_tokens, n_altup - 1, - ggml_row_size(cur->type, n_embd), - ggml_row_size(cur->type, n_embd*n_tokens), - n_embd*n_tokens*ggml_element_size(cur)); - ggml_tensor * altup_unembd = ggml_mul_mat(ctx0, model.altup_unembd_proj, alt_slice); // shape: [n_embd, n_tokens, n_altup - 1] - ggml_tensor * new_magnitude = calc_magnitude(altup_unembd); - altup_unembd = ggml_div(ctx0, - ggml_mul(ctx0, altup_unembd, target_magnitude), - new_magnitude); - cb(altup_unembd, "altup_unembd", -1); - - // equivalent to torch.mean(hidden_states, dim=0) - cur = view_2d_slice(cur, 0); // [n_embd, n_tokens] - for (int i = 0; i < n_altup - 1; ++i) { - cur = ggml_add(ctx0, cur, view_2d_slice(altup_unembd, i)); - } - cur = ggml_scale(ctx0, cur, 1.0f / float(n_altup)); // [n_embd, n_tokens] - cb(cur, "unembd_merged", -1); - } - - // cur now has shape: [n_embd, n_tokens] - - // TODO: move this to right after the last KV layer - { - // skip computing output for unused tokens - ggml_tensor * inp_out_ids = build_inp_out_ids(); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - } - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - { - // final logit soft-capping - cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); - cur = ggml_tanh(ctx0, cur); - cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - - ggml_tensor * calc_magnitude(ggml_tensor * x) { - return ggml_sqrt(ctx0, ggml_sum_rows(ctx0, ggml_sqr(ctx0, x))); - } - - // get 2D slice view from a 3D tensor, the idx corresponds to the 3rd dim - ggml_tensor * view_2d_slice(ggml_tensor * x, int idx) { - GGML_ASSERT(idx < (int)x->ne[2]); - return ggml_view_2d(ctx0, x, x->ne[0], x->ne[1], - ggml_row_size(x->type, x->ne[0]), - idx * x->ne[0] * x->ne[1] * ggml_element_size(x)); - } - - // equivalent to get_per_layer_inputs() in python code - // output shape: [n_embd_altup, n_layer, n_tokens] - ggml_tensor * get_per_layer_inputs() { - auto inp = std::make_unique(); - ggml_tensor * inp_per_layer; - if (ubatch.token) { - inp->tokens = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ubatch.n_tokens); - ggml_set_input(inp->tokens); - res->t_tokens = inp->tokens; - inp_per_layer = ggml_get_rows(ctx0, model.tok_embd_per_layer, inp->tokens); - inp_per_layer = ggml_reshape_3d(ctx0, inp_per_layer, n_embd_altup, n_layer, n_tokens); - inp_per_layer = ggml_scale(ctx0, inp_per_layer, sqrtf((float)n_embd_altup)); - cb(inp_per_layer, "inp_per_layer_selected", -1); - } else { - GGML_ABORT("TODO: support embd input"); - } - res->add_input(std::move(inp)); - return inp_per_layer; - } - - // equivalent to project_per_layer_inputs() in python code - // this calculates the per-layer inputs, so the final tensor shape will have n_layer as the last dim - // output shape: [n_embd_altup, n_tokens, n_layer] - ggml_tensor * project_per_layer_inputs(ggml_tensor * inputs_embeds, ggml_tensor * inp_per_layer) { - const float per_layer_projection_scale = 1.0f / sqrtf((float)n_embd); - const float per_layer_input_scale = 1.0f / sqrtf(2.0f); - - ggml_tensor * per_layer_proj = ggml_mul_mat(ctx0, model.per_layer_model_proj, inputs_embeds); - per_layer_proj = ggml_scale(ctx0, per_layer_proj, per_layer_projection_scale); - per_layer_proj = ggml_reshape_3d(ctx0, per_layer_proj, n_embd_altup, n_layer, n_tokens); - per_layer_proj = build_norm(per_layer_proj, - model.per_layer_proj_norm, NULL, - LLM_NORM_RMS, -1); // [n_embd_altup, n_layer, n_tokens] - cb(per_layer_proj, "per_layer_proj", -1); - - inp_per_layer = ggml_add(ctx0, inp_per_layer, per_layer_proj); - inp_per_layer = ggml_scale(ctx0, inp_per_layer, per_layer_input_scale); - cb(inp_per_layer, "inp_per_layer", -1); - - // permute to shape: [n_embd_altup, n_tokens, n_layer] - inp_per_layer = ggml_cont(ctx0, ggml_permute(ctx0, inp_per_layer, 0, 2, 1, 3)); - return inp_per_layer; - } - - // input cur shape: [n_altup, n_tokens] - // output shape: [n_altup, n_tokens] - ggml_tensor * laurel(ggml_tensor * cur, int il) { - ggml_tensor * tmp = cur; - tmp = build_lora_mm(model.layers[il].laurel_l, tmp); - tmp = build_lora_mm(model.layers[il].laurel_r, tmp); - tmp = build_norm(tmp, model.layers[il].laurel_post_norm, NULL, LLM_NORM_RMS, il); - tmp = ggml_add(ctx0, tmp, cur); - cb(tmp, "laurel_out", il); - return tmp; - } - - // input x shape: [n_embd, n_tokens] - // output shape: [n_embd, n_tokens] - ggml_tensor * gaussian_topk(ggml_tensor * x) { - ggml_tensor * mean = ggml_mean(ctx0, x); - ggml_tensor * std = ggml_sqrt(ctx0, ggml_scale(ctx0, - ggml_sum_rows(ctx0, ggml_sqr(ctx0, ggml_sub(ctx0, x, mean))), - 1.0f / (float)(x->ne[0] - 1) - )); - ggml_tensor * cutoff_x = ggml_add(ctx0, mean, ggml_scale(ctx0, std, f_sparsity_std_mul)); - return ggml_relu(ctx0, ggml_sub(ctx0, x, cutoff_x)); - } - - // - // altup functions - // - - // equivalent to compute_router_modalities() in python code - // input x shape: [n_embd, n_tokens] - // output shape: [n_altup, n_tokens] - ggml_tensor * altup_compute_router_modalities(ggml_tensor * x, int il) { - ggml_tensor * router_inputs = build_norm(x, - model.layers[il].altup_router_norm, NULL, - LLM_NORM_RMS, il); - - // router_input_scale - router_inputs = ggml_scale(ctx0, router_inputs, 1.0f / (float)n_embd); - - ggml_tensor * output = ggml_mul_mat(ctx0, model.layers[il].altup_router, router_inputs); - return ggml_tanh(ctx0, output); // [n_altup, n_tokens] - } - - // input cur shape: [n_embd, n_tokens, n_altup] - // output shape: [n_embd, n_tokens, n_altup] - ggml_tensor * altup_predict(ggml_tensor * cur, int il) { - ggml_tensor * activated = view_2d_slice(cur, i_altup_act); // [n_embd, n_tokens] - ggml_tensor * modalities = altup_compute_router_modalities(activated, il); // [n_altup, n_tokens] - cb(modalities, "modalities", il); - - ggml_tensor * all_coefs = build_lora_mm(model.layers[il].altup_predict_coef, modalities); - cb(all_coefs, "all_coefs", il); - // first dim now having n_altup^2 elements, we reshape it to 2D (so we end up with 3D tensor) - all_coefs = ggml_reshape_3d(ctx0, all_coefs, n_altup, n_altup, n_tokens); - - // permute to [n_altup, n_embd, n_tokens] - ggml_tensor * cur_permuted = ggml_cont(ctx0, ggml_permute(ctx0, cur, 1, 2, 0, 3)); - ggml_tensor * predictions = ggml_mul_mat(ctx0, cur_permuted, all_coefs); // [n_altup, n_embd, n_tokens] - - // final shape must be the same as cur: [n_embd, n_tokens, n_altup] - predictions = ggml_cont(ctx0, ggml_permute(ctx0, predictions, 0, 2, 1, 3)); - predictions = ggml_add(ctx0, predictions, cur); - cb(predictions, "predictions", il); - - return predictions; - } - - // input predictions shape: [n_embd, n_tokens, n_altup] - // input activated shape: [n_embd, n_tokens] - // output shape: [n_embd, n_tokens, n_altup] - ggml_tensor * altup_correct(ggml_tensor * predictions, ggml_tensor * activated, int il) { - ggml_tensor * modalities = altup_compute_router_modalities(activated, il); // [n_altup, n_tokens] - cb(modalities, "modalities", il); - - ggml_tensor * active_prediction = view_2d_slice(predictions, i_altup_act); - ggml_tensor * innovation = ggml_sub(ctx0, activated, active_prediction); // [n_embd, n_tokens] - cb(innovation, "innovation", il); - - ggml_tensor * all_coefs = build_lora_mm(model.layers[il].altup_correct_coef, modalities); // [n_altup, n_tokens] - all_coefs = ggml_scale_bias(ctx0, all_coefs, 1.0f, 1.0f); // + 1.0 - cb(all_coefs, "all_coefs", il); - all_coefs = ggml_transpose(ctx0, all_coefs); // [n_tokens, n_altup] - all_coefs = ggml_cont_3d(ctx0, all_coefs, 1, n_tokens, n_altup); // [1, n_tokens, n_altup] - - innovation = ggml_repeat_4d(ctx0, innovation, n_embd, n_tokens, n_altup, 1); - ggml_tensor * corrected = ggml_mul(ctx0, innovation, all_coefs); // [n_embd, n_tokens, n_altup] - corrected = ggml_add(ctx0, corrected, predictions); // [n_embd, n_tokens, n_altup] - cb(corrected, "corrected", il); - - return corrected; - } -}; - -struct llm_build_gemma_embedding : public llm_graph_context { - llm_build_gemma_embedding(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_k; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) - if (ubatch.token) { - inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); - cb(inpL, "inp_scaled", -1); - } - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const float freq_base_l = model.get_rope_freq_base (cparams, il); - const float freq_scale_l = model.get_rope_freq_scale(cparams, il); - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, - ext_factor, attn_factor, beta_fast, beta_slow); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - // ref: https://github.com/google/gemma_pytorch/blob/014acb7ac4563a5f77c76d7ff98f31b568c16508/gemma/model.py#L315 - Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); - cb(sa_out, "sa_out", il); - - cur = build_norm(sa_out, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", -1); - - cur = ggml_add(ctx0, cur, sa_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -// TODO: move up next to build_starcoder -struct llm_build_starcoder2 : public llm_graph_context { - llm_build_starcoder2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_graph_context_mamba : public llm_graph_context { - llm_graph_context_mamba(const llm_graph_params & params) : llm_graph_context(params) {} - - ggml_tensor * build_mamba_layer( - llm_graph_input_rs * inp, - ggml_tensor * cur, - const llama_model & model, - const llama_ubatch & ubatch, - int il) { - - const auto * mctx_cur = inp->mctx; - - const auto kv_head = mctx_cur->get_head(); - - const auto & layer = model.layers[il]; - - const int64_t d_conv = hparams.ssm_d_conv; - const int64_t d_inner = hparams.ssm_d_inner; - const int64_t d_state = hparams.ssm_d_state; - const int64_t dt_rank = hparams.ssm_dt_rank; - const int64_t n_head = d_inner; - const int64_t head_dim = 1; - const int64_t n_seqs = ubatch.n_seqs; - // Some variants of Mamba arch (e.g. FalconMamba do apply layer norm on B and Dt layers) - const bool ssm_dt_b_c_rms = hparams.ssm_dt_b_c_rms; - - const int64_t n_seq_tokens = ubatch.n_seq_tokens; - - GGML_ASSERT(n_seqs != 0); - GGML_ASSERT(ubatch.equal_seqs()); - GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); - - ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); - ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); - - ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); - conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner, n_seqs); - - // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} - cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); - - // {n_embd, 2*d_inner} @ {n_embd, n_seq_tokens, n_seqs} => {2*d_inner, n_seq_tokens, n_seqs} - ggml_tensor * xz = build_lora_mm(layer.ssm_in, cur); - // split the above in two - // => {d_inner, n_seq_tokens, n_seqs} - ggml_tensor * x = ggml_view_3d(ctx0, xz, d_inner, xz->ne[1], xz->ne[2], xz->nb[1], xz->nb[2], 0); - ggml_tensor * z = ggml_view_3d(ctx0, xz, d_inner, xz->ne[1], xz->ne[2], xz->nb[1], xz->nb[2], d_inner*ggml_element_size(xz)); - - // conv - { - // => {d_conv - 1 + n_seq_tokens, d_inner, n_seqs} - ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, x), 0); - - // copy last (d_conv - 1) columns back into the state cache - ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner, n_seqs, conv_x->nb[1], conv_x->nb[2], n_seq_tokens*(conv_x->nb[0])); - - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, last_conv, - ggml_view_1d(ctx0, conv_states_all, - (d_conv - 1)*(d_inner)*(n_seqs), - kv_head*(d_conv - 1)*(d_inner)*ggml_element_size(conv_states_all)))); - - // 1D convolution - // The equivalent is to make a self-overlapping view of conv_x - // over d_conv columns at each stride in the 3rd dimension, - // then element-wise multiply that with the conv1d weight, - // then sum the elements of each row, - // (the last two steps are a dot product over rows (also doable with mul_mat)) - // then permute away the ne[0] dimension, - // and then you're left with the resulting x tensor. - // For simultaneous sequences, all sequences need to have the same length. - x = ggml_ssm_conv(ctx0, conv_x, layer.ssm_conv1d); - - // bias - x = ggml_add(ctx0, x, layer.ssm_conv1d_b); - - x = ggml_silu(ctx0, x); - } - - // ssm - { - // {d_inner, dt_rank + 2*d_state} @ {d_inner, n_seq_tokens, n_seqs} => {dt_rank + 2*d_state, n_seq_tokens, n_seqs} - ggml_tensor * x_db = build_lora_mm(layer.ssm_x, x); - // split - ggml_tensor * dt = ggml_view_3d(ctx0, x_db, dt_rank, n_seq_tokens, n_seqs, x_db->nb[1], x_db->nb[2], 0); - ggml_tensor * B = ggml_view_4d(ctx0, x_db, d_state, /* n_group */ 1, n_seq_tokens, n_seqs, d_state*x_db->nb[0], x_db->nb[1], x_db->nb[2], ggml_element_size(x_db)*dt_rank); - ggml_tensor * C = ggml_view_4d(ctx0, x_db, d_state, /* n_group */ 1, n_seq_tokens, n_seqs, d_state*x_db->nb[0], x_db->nb[1], x_db->nb[2], ggml_element_size(x_db)*(dt_rank+d_state)); - - // Some Mamba variants (e.g. FalconMamba, Jamba) apply RMS norm in B, C & Dt layers - if (ssm_dt_b_c_rms || (layer.ssm_dt_norm && layer.ssm_b_norm && layer.ssm_c_norm)) { - dt = build_norm(dt, layer.ssm_dt_norm, NULL, LLM_NORM_RMS, il); - B = build_norm(B, layer.ssm_b_norm, NULL, LLM_NORM_RMS, il); - C = build_norm(C, layer.ssm_c_norm, NULL, LLM_NORM_RMS, il); - } - - // {dt_rank, d_inner} @ {dt_rank, n_seq_tokens, n_seqs} => {d_inner, n_seq_tokens, n_seqs} - dt = build_lora_mm(layer.ssm_dt, dt); - dt = ggml_add(ctx0, dt, layer.ssm_dt_b); - - cur = x; - x = ggml_reshape_4d(ctx0, x, head_dim, n_head, n_seq_tokens, n_seqs); - - ggml_tensor * A = layer.ssm_a; - - // use the states and the indices provided by build_recurrent_state - // (this is necessary in order to properly use the states before they are overwritten, - // while avoiding to make unnecessary copies of the states) - auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { - ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_head, mctx_cur->get_size()); - - // Custom operator to optimize the parallel associative scan - // as described in the Annex D of the Mamba paper. - // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} - return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); - }; - - ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); - - // store last states - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, - ggml_view_1d(ctx0, y_ssm, d_state*d_inner*n_seqs, x->nb[3]*x->ne[3]), - ggml_view_1d(ctx0, ssm_states_all, d_state*d_inner*n_seqs, kv_head*d_state*d_inner*ggml_element_size(ssm_states_all)))); - - ggml_tensor * y = ggml_view_3d(ctx0, y_ssm, d_inner, n_seq_tokens, n_seqs, x->nb[2], x->nb[3], 0); - - // TODO: skip computing output earlier for unused tokens - - y = ggml_add(ctx0, y, ggml_mul(ctx0, cur, layer.ssm_d)); - y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); - - // {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} - cur = build_lora_mm(layer.ssm_out, y); - } - - // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} - cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); - - return cur; - } - - ggml_tensor * build_mamba2_layer( - llm_graph_input_rs * inp, - ggml_tensor * cur, - const llama_model & model, - const llama_ubatch & ubatch, - int il) const { - - const auto * mctx_cur = inp->mctx; - - const auto kv_head = mctx_cur->get_head(); - - const int64_t d_conv = hparams.ssm_d_conv; - const int64_t d_inner = hparams.ssm_d_inner; - const int64_t d_state = hparams.ssm_d_state; - const int64_t n_head = hparams.ssm_dt_rank; - const int64_t head_dim = d_inner / n_head; - const int64_t n_group = hparams.ssm_n_group; - const int64_t n_seqs = ubatch.n_seqs; - - const int64_t n_seq_tokens = ubatch.n_seq_tokens; - - GGML_ASSERT(n_seqs != 0); - GGML_ASSERT(ubatch.equal_seqs()); - GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); - - ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); - ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); - - ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); - conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner + 2*n_group*d_state, n_seqs); - - // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} - cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); - - // d_in_proj = 2 * self.d_inner + 2 * self.ngroups * self.d_state + self.nheads - - // {n_embd, d_in_proj} @ {n_embd, n_seq_tokens, n_seqs} => {d_in_proj, n_seq_tokens, n_seqs} - ggml_tensor * zxBCdt = build_lora_mm(model.layers[il].ssm_in, cur); - - // split the above in three - ggml_tensor * z = ggml_view_4d(ctx0, zxBCdt, head_dim, n_head, n_seq_tokens, n_seqs, head_dim*zxBCdt->nb[0], zxBCdt->nb[1], zxBCdt->nb[2], 0); - ggml_tensor * xBC = ggml_view_3d(ctx0, zxBCdt, d_inner + 2*n_group*d_state, n_seq_tokens, n_seqs, zxBCdt->nb[1], zxBCdt->nb[2], d_inner*ggml_element_size(zxBCdt)); - ggml_tensor * dt = ggml_view_3d(ctx0, zxBCdt, n_head, n_seq_tokens, n_seqs, zxBCdt->nb[1], zxBCdt->nb[2], (2*d_inner + 2*n_group*d_state)*ggml_element_size(zxBCdt)); - - // conv - { - // => {d_conv - 1 + n_seq_tokens, d_inner + 2*n_group*d_state, n_seqs} - ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, xBC), 0); - - // copy last (d_conv - 1) columns back into the state cache - ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner + 2*n_group*d_state, n_seqs, conv_x->nb[1], conv_x->nb[2], n_seq_tokens*(conv_x->nb[0])); - - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, last_conv, - ggml_view_1d(ctx0, conv_states_all, - (d_conv - 1)*(d_inner + 2*n_group*d_state)*(n_seqs), - kv_head*(d_conv - 1)*(d_inner + 2*n_group*d_state)*ggml_element_size(conv_states_all)))); - - // 1D convolution - // The equivalent is to make a self-overlapping view of conv_x - // over d_conv columns at each stride in the 3rd dimension, - // then element-wise multiply that with the conv1d weight, - // then sum the elements of each row, - // (the last two steps are a dot product over rows (also doable with mul_mat)) - // then permute away the ne[0] dimension, - // and then you're left with the resulting x tensor. - // For simultaneous sequences, all sequences need to have the same length. - xBC = ggml_ssm_conv(ctx0, conv_x, model.layers[il].ssm_conv1d); - - // bias - xBC = ggml_add(ctx0, xBC, model.layers[il].ssm_conv1d_b); - - xBC = ggml_silu(ctx0, xBC); - } - - // ssm - { - // These correspond to V K Q in SSM/attention duality - ggml_tensor * x = ggml_view_4d(ctx0, xBC, head_dim, n_head, n_seq_tokens, n_seqs, head_dim*xBC->nb[0], xBC->nb[1], xBC->nb[2], 0); - ggml_tensor * B = ggml_view_4d(ctx0, xBC, d_state, n_group, n_seq_tokens, n_seqs, d_state*xBC->nb[0], xBC->nb[1], xBC->nb[2], d_inner*ggml_element_size(xBC)); - ggml_tensor * C = ggml_view_4d(ctx0, xBC, d_state, n_group, n_seq_tokens, n_seqs, d_state*xBC->nb[0], xBC->nb[1], xBC->nb[2], (d_inner + n_group*d_state)*ggml_element_size(xBC)); - - // {n_head, n_seq_tokens, n_seqs} - dt = ggml_add(ctx0, ggml_cont(ctx0, dt), model.layers[il].ssm_dt_b); - - ggml_tensor * A = model.layers[il].ssm_a; - - // use the states and the indices provided by build_recurrent_state - // (this is necessary in order to properly use the states before they are overwritten, - // while avoiding to make unnecessary copies of the states) - auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { - ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_head, mctx_cur->get_size()); - - // TODO: use semistructured matrices to implement state-space duality - // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} - return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); - }; - - ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); - - // store last states - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, - ggml_view_1d(ctx0, y_ssm, d_state*d_inner*n_seqs, ggml_nelements(x)*x->nb[0]), - ggml_view_1d(ctx0, ssm_states_all, d_state*d_inner*n_seqs, kv_head*d_state*d_inner*ggml_element_size(ssm_states_all)))); - - ggml_tensor * y = ggml_view_4d(ctx0, y_ssm, head_dim, n_head, n_seq_tokens, n_seqs, x->nb[1], n_head*x->nb[1], n_seq_tokens*n_head*x->nb[1], 0); - - // TODO: skip computing output earlier for unused tokens - - y = ggml_add(ctx0, y, ggml_mul(ctx0, x, model.layers[il].ssm_d)); - cb(y, "mamba2_y_add_d", il); - y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); - - // grouped RMS norm - if (model.layers[il].ssm_norm) { - y = ggml_reshape_4d(ctx0, y, d_inner / n_group, n_group, n_seq_tokens, n_seqs); - y = build_norm(y, model.layers[il].ssm_norm, NULL, LLM_NORM_RMS, il); - } - - y = ggml_reshape_3d(ctx0, y, d_inner, n_seq_tokens, n_seqs); - - // {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} - cur = build_lora_mm(model.layers[il].ssm_out, y); - } - - // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} - cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); - cb(cur, "mamba_out", il); - - return cur; - } -}; - -struct llm_build_mamba : public llm_graph_context_mamba { - llm_build_mamba(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - // {n_embd, n_tokens} - inpL = build_inp_embd(model.tok_embd); - - auto * rs_inp = build_rs_inp(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - if (model.arch == LLM_ARCH_MAMBA2) { - cur = build_mamba2_layer(rs_inp, cur, model, ubatch, il); - } else { - cur = build_mamba_layer(rs_inp, cur, model, ubatch, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // residual - cur = ggml_add(ctx0, cur, inpL); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - // final rmsnorm - cur = build_norm(inpL, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - -}; - -struct llm_build_jamba : public llm_graph_context_mamba { - llm_build_jamba(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - ggml_tensor * cur; - ggml_tensor * inpL; - - // {n_embd, n_tokens} - inpL = build_inp_embd(model.tok_embd); - - auto * inp_hybrid = build_inp_mem_hybrid(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const int64_t n_head_kv = hparams.n_head_kv(il); - - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - if (n_head_kv == 0) { - cur = build_mamba_layer(inp_hybrid->get_recr(), cur, model, ubatch, il); - } else { - // Attention - - struct ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - struct ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - struct ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - // No RoPE :) - cur = build_attn(inp_hybrid->get_attn(), - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, NULL, NULL, NULL, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // residual - struct ggml_tensor * ffn_inp = ggml_add(ctx0, inpL, cur); - cb(cur, "ffn_inp", il); - - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network - if (model.layers[il].ffn_gate_inp == nullptr) { - // FFN - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - } - - // residual - cur = ggml_add(ctx0, ffn_inp, cur); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - // final rmsnorm - cur = build_norm(inpL, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_command_r : public llm_graph_context { - llm_build_command_r(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - const float f_logit_scale = hparams.f_logit_scale; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - ggml_tensor * ffn_inp = cur; - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (model.layers[il].attn_q_norm) { - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, - NULL, - LLM_NORM, il); - cb(Qcur, "Qcur", il); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - if (model.layers[il].attn_k_norm) { - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, - NULL, - LLM_NORM, il); - cb(Kcur, "Kcur", il); - } - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - } - - ggml_tensor * attn_out = cur; - - // feed-forward network - { - cur = build_ffn(ffn_inp, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - // add together residual + FFN + self-attention - cur = ggml_add(ctx0, cur, inpL); - cur = ggml_add(ctx0, cur, attn_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - if (f_logit_scale) { - cur = ggml_scale(ctx0, cur, f_logit_scale); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_cohere2_iswa : public llm_graph_context { - llm_build_cohere2_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - const float f_logit_scale = hparams.f_logit_scale; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv_iswa(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const bool is_swa = hparams.is_swa(il); - - // norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM, il); - cb(cur, "attn_norm", il); - ggml_tensor * ffn_inp = cur; - - // self-attention - { - // rope freq factors for 128k context - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (is_swa) { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - } - - ggml_tensor * attn_out = cur; - - // feed-forward network - { - cur = build_ffn(ffn_inp, model.layers[il].ffn_up, NULL, NULL, model.layers[il].ffn_gate, - NULL, NULL, model.layers[il].ffn_down, NULL, NULL, NULL, LLM_FFN_SILU, LLM_FFN_PAR, - il); - cb(cur, "ffn_out", il); - } - - // add together residual + FFN + self-attention - cur = ggml_add(ctx0, cur, inpL); - cur = ggml_add(ctx0, cur, attn_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - if (f_logit_scale) { - cur = ggml_scale(ctx0, cur, f_logit_scale); - } - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -// ref: https://allenai.org/olmo -// based on the original build_llama() function, changes: -// * non-parametric layer norm -// * clamp qkv -// * removed bias -// * removed MoE -struct llm_build_olmo : public llm_graph_context { - llm_build_olmo(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - NULL, NULL, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (hparams.f_clamp_kqv > 0.0f) { - Qcur = ggml_clamp(ctx0, Qcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (hparams.f_clamp_kqv > 0.0f) { - Kcur = ggml_clamp(ctx0, Kcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (hparams.f_clamp_kqv > 0.0f) { - Vcur = ggml_clamp(ctx0, Vcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, nullptr, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - NULL, NULL, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - NULL, NULL, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -template -struct llm_build_olmo2 : public llm_graph_context { - llm_build_olmo2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - using inp_attn_type = std::conditional_t; - inp_attn_type * inp_attn = nullptr; - - if constexpr (iswa) { - inp_attn = build_attn_inp_kv_iswa(); - } else { - inp_attn = build_attn_inp_kv(); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = inpL; - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - const bool is_swa = hparams.is_swa(il); - - if (is_swa) { - // For sliding window layers, Olmo3 use regular rope with no yarn rope scaling. - // This is achieved here by setting freq_scale and attn_factor to 1. - // We also set ext_factor to 0 to avoid a few unnecessary computations. - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, 1.0, - 0.0, 1.0, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, 1.0, - 0.0, 1.0, beta_fast, beta_slow - ); - } else { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_ffn(ffn_inp, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", -1); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -// based on the build_qwen2moe() function, changes: -// * removed shared experts -// * removed bias -// * added q, k norm -struct llm_build_olmoe : public llm_graph_context { - llm_build_olmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_llada_moe : public llm_graph_context { - llm_build_llada_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_openelm : public llm_graph_context { - llm_build_openelm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const int64_t n_head = hparams.n_head(il); - const int64_t n_head_kv = hparams.n_head_kv(il); - const int64_t n_head_qkv = 2*n_head_kv + n_head; - - cur = inpL; - ggml_tensor * residual = cur; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_reshape_3d(ctx0, cur, n_embd_head_k, n_head_qkv, n_tokens); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, cur->nb[1], cur->nb[2], 0); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, cur->nb[1], cur->nb[2], cur->nb[1]*n_head); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = ggml_cont(ctx0, ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, cur->nb[1], cur->nb[2], cur->nb[1]*(n_head+n_head_kv))); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, NULL, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur", il); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, NULL, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, NULL, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, NULL, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Qcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - residual = ggml_get_rows(ctx0, residual, inp_out_ids); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, residual, cur); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - inpL = cur; - } - - cur = inpL; - - // norm - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_gptneox : public llm_graph_context { - llm_build_gptneox(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // ffn - if (hparams.use_par_res) { - // attention and ffn are computed in parallel - // x = x + attn(ln1(x)) + ffn(ln2(x)) - - ggml_tensor * attn_out = cur; - - cur = build_norm(inpL, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, inpL); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, attn_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } else { - // attention and ffn are computed sequentially - // x = x + attn(ln1(x)) - // x = x + ffn(ln2(x)) - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_arctic : public llm_graph_context { - llm_build_arctic(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - ggml_tensor * ffn_out = ggml_add(ctx0, cur, ffn_inp); - cb(ffn_out, "ffn_out", il); - - // MoE - cur = build_norm(inpSA, - model.layers[il].ffn_norm_exps, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm_exps", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_out); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_deepseek : public llm_graph_context { - llm_build_deepseek(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - if ((uint32_t) il < hparams.n_layer_dense_lead) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, false, - false, hparams.expert_weights_scale, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // FFN shared expert - { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_deepseek2 : public llm_graph_context { - llm_build_deepseek2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - bool is_lite = (hparams.n_layer == 27); - - const bool is_mla = (hparams.n_embd_head_k_mla != 0 && hparams.n_embd_head_v_mla != 0); - - // note: these are the actual head sizes you get when treating as MHA or after "decompression" using wv_b for MLA - const int64_t n_embd_head_k = is_mla ? hparams.n_embd_head_k_mla : hparams.n_embd_head_k; - const int64_t n_embd_head_v = is_mla ? hparams.n_embd_head_v_mla : hparams.n_embd_head_v; - - const int64_t n_embd_head_qk_rope = hparams.n_rot; - const int64_t n_embd_head_qk_nope = n_embd_head_k - n_embd_head_qk_rope; - - const uint32_t kv_lora_rank = hparams.n_lora_kv; - - // We have to pre-scale kq_scale and attn_factor to make the YaRN RoPE work correctly. - // See https://github.com/ggerganov/llama.cpp/discussions/7416 for detailed explanation. - const float mscale = attn_factor * (1.0f + hparams.rope_yarn_log_mul * logf(1.0f / freq_scale)); - const float kq_scale = 1.0f*mscale*mscale/sqrtf(float(n_embd_head_k)); - const float attn_factor = 1.0f / (1.0f + 0.1f * logf(1.0f / freq_scale)); - - ggml_tensor * cur; - ggml_tensor * inpL; - - // {n_embd, n_tokens} - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - ggml_tensor * q = NULL; - if (!is_lite) { - q = ggml_mul_mat(ctx0, model.layers[il].wq_a, cur); - cb(q, "q", il); - - q = build_norm(q, - model.layers[il].attn_q_a_norm, nullptr, - LLM_NORM_RMS, il); - cb(q, "q", il); - - q = ggml_mul_mat(ctx0, model.layers[il].wq_b, q); - cb(q, "q", il); - } else { - q = ggml_mul_mat(ctx0, model.layers[il].wq, cur); - cb(q, "q", il); - } - - // split into {n_embd_head_qk_nope, n_head, n_tokens} - ggml_tensor * q_nope = ggml_view_3d(ctx0, q, - n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(q->type, n_embd_head_k), - ggml_row_size(q->type, n_embd_head_k) * n_head, - 0); - cb(q_nope, "q_nope", il); - - // and {n_embd_head_qk_rope, n_head, n_tokens} - ggml_tensor * q_pe = ggml_view_3d(ctx0, q, - n_embd_head_qk_rope, n_head, n_tokens, - ggml_row_size(q->type, n_embd_head_k), - ggml_row_size(q->type, n_embd_head_k) * n_head, - ggml_row_size(q->type, n_embd_head_qk_nope)); - cb(q_pe, "q_pe", il); - - ggml_tensor * kv_cmpr_pe = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); - cb(kv_cmpr_pe, "kv_cmpr_pe", il); - - // split into {kv_lora_rank, n_tokens} - ggml_tensor * kv_cmpr = ggml_view_2d(ctx0, kv_cmpr_pe, - kv_lora_rank, n_tokens, - ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), - 0); - cb(kv_cmpr, "kv_cmpr", il); - - // and {n_embd_head_qk_rope, 1, n_tokens} - ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_cmpr_pe, - n_embd_head_qk_rope, 1, n_tokens, - ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), - ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), - ggml_row_size(kv_cmpr_pe->type, kv_lora_rank)); - cb(k_pe, "k_pe", il); - - q_pe = ggml_rope_ext(ctx0, q_pe, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(q_pe, "q_pe", il); - - k_pe = ggml_rope_ext(ctx0, k_pe, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(k_pe, "k_pe", il); - - kv_cmpr = build_norm(kv_cmpr, - model.layers[il].attn_kv_a_norm, nullptr, - LLM_NORM_RMS, il); - cb(kv_cmpr, "kv_cmpr", il); - - if (is_mla) { - // {n_embd_head_qk_nope, n_tokens, n_head} - q_nope = ggml_permute(ctx0, q_nope, 0, 2, 1, 3); - cb(q_nope, "q_nope_perm", il); - - // {n_embd_head_qk_nope, kv_lora_rank, n_head} x {n_embd_head_qk_nope, n_tokens, n_head} - ggml_tensor * q_nope_absorbed = ggml_mul_mat(ctx0, model.layers[il].wk_b, q_nope); - cb(q_nope_absorbed, "q_nope_absorbed", il); - - // {kv_lora_rank, n_head, n_tokens} - q_nope_absorbed = ggml_permute(ctx0, q_nope_absorbed, 0, 2, 1, 3); - cb(q_nope_absorbed, "q_nope_absorbed_perm", il); - - // {n_embd_head_qk_rope + kv_lora_rank, n_head, n_tokens} - // note: rope must go first for in-place context shifting in build_rope_shift() - ggml_tensor * Qcur = ggml_concat(ctx0, q_pe, q_nope_absorbed, 0); - cb(Qcur, "Qcur", il); - - kv_cmpr = ggml_reshape_3d(ctx0, kv_cmpr, kv_lora_rank, 1, n_tokens); - cb(kv_cmpr, "kv_cmpr_reshape", il); - - // {n_embd_head_qk_rope + kv_lora_rank, 1, n_tokens} - ggml_tensor * Kcur = ggml_concat(ctx0, k_pe, kv_cmpr, 0); - cb(Kcur, "Kcur", il); - - // {kv_lora_rank, 1, n_tokens} - ggml_tensor * Vcur = kv_cmpr; - cb(Vcur, "Vcur", il); - - // note: MLA with the absorption optimzation converts into MQA (ie: GQA with 1 group) - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, model.layers[il].wv_b, kq_scale, il); - } else { - ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_cmpr); - cb(kv, "kv", il); - - // split into {n_embd_head_qk_nope, n_head, n_tokens} - ggml_tensor * k_nope = ggml_view_3d(ctx0, kv, - n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v), - ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v) * n_head, - 0); - cb(k_nope, "k_nope_view", il); - - // and {n_embd_head_v, n_head, n_tokens} - ggml_tensor * Vcur = ggml_view_3d(ctx0, kv, - n_embd_head_v, n_head, n_tokens, - ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v), - ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v) * n_head, - ggml_row_size(kv->type, n_embd_head_qk_nope)); - cb(Vcur, "Vcur_view", il); - - Vcur = ggml_cont(ctx0, Vcur); - cb(Vcur, "Vcur_cont", il); - - // note: rope must go first for in-place context shifting in build_rope_shift() - ggml_tensor * Qcur = ggml_concat(ctx0, q_pe, q_nope, 0); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = ggml_concat(ctx0, ggml_repeat(ctx0, k_pe, q_pe), k_nope, 0); - cb(Kcur, "Kcur", il); - - // note: MLA without the absorption optimization converts into MHA (ie: GQA with full n_head groups) - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - } - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - if ((uint32_t) il < hparams.n_layer_dense_lead) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - true, hparams.expert_weights_scale, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(moe_out, "ffn_moe_out", il); - - // FFN shared expert - { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = ggml_mul_mat(ctx0, model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_bitnet : public llm_graph_context { - llm_build_bitnet(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - if (model.layers[il].wq_scale) { - Qcur = ggml_mul(ctx0, Qcur, model.layers[il].wq_scale); - } - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - // B1.K - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - if (model.layers[il].wk_scale) { - Kcur = ggml_mul(ctx0, Kcur, model.layers[il].wk_scale); - } - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - // B1.V - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - if (model.layers[il].wv_scale) { - Vcur = ggml_mul(ctx0, Vcur, model.layers[il].wv_scale); - } - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - NULL, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - - cur = build_norm(cur, - model.layers[il].attn_sub_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_sub_norm", il); - - cur = build_lora_mm(model.layers[il].wo, cur); - if (model.layers[il].wo_scale) { - cur = ggml_mul(ctx0, cur, model.layers[il].wo_scale); - } - if (model.layers[il].bo) { - cur = ggml_add(ctx0, cur, model.layers[il].bo); - } - cb(cur, "attn_o_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward forward - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, model.layers[il].ffn_up_scale, - model.layers[il].ffn_gate, NULL, model.layers[il].ffn_gate_scale, - NULL, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_sub_out", il); - - cur = build_norm(cur, - model.layers[il].ffn_sub_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_sub_norm", il); - - cur = build_lora_mm(model.layers[il].ffn_down, cur); - if (model.layers[il].ffn_down_scale) { - cur = ggml_mul(ctx0, cur, model.layers[il].ffn_down_scale); - } - cb(cur, "ffn_down", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - // FIXME: do not use model.tok_embd directly, duplicate as model.output - cur = build_lora_mm(model.tok_embd, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_t5_enc : public llm_graph_context { - llm_build_t5_enc(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * pos_bucket_enc = build_inp_pos_bucket_enc(); - - auto * inp_attn = build_attn_inp_no_cache(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm_enc, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq_enc, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk_enc, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv_enc, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - ggml_tensor * attn_rel_b = model.layers[il].attn_rel_b_enc ? model.layers[il].attn_rel_b_enc : model.layers[0].attn_rel_b_enc; - ggml_tensor * kq_b = build_pos_bias(pos_bucket_enc, attn_rel_b); - - cur = build_attn(inp_attn, - model.layers[il].wo_enc, nullptr, - Qcur, Kcur, Vcur, kq_b, nullptr, nullptr, 1.0f, il); - cb(cur, "kqv_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm_enc, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // T5 uses relu, flan-T5 uses gelu-gated - cur = build_ffn(cur, - model.layers[il].ffn_up_enc, NULL, NULL, - model.layers[il].ffn_gate_enc, NULL, NULL, - model.layers[il].ffn_down_enc, NULL, NULL, - NULL, - model.layers[il].ffn_gate_enc ? LLM_FFN_GELU : LLM_FFN_RELU, - model.layers[il].ffn_gate_enc ? LLM_FFN_PAR : LLM_FFN_SEQ, - il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cb(cur, "result_embd", -1); - - cur = build_norm(cur, - model.output_norm_enc, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_t5_dec : public llm_graph_context { - llm_build_t5_dec(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - //const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * embd_enc = build_inp_cross_embd(); - ggml_tensor * pos_bucket_dec = build_inp_pos_bucket_dec(); - - const int64_t n_outputs_enc = embd_enc->ne[1]; - - auto * inp_attn_self = build_attn_inp_kv(); - auto * inp_attn_cross = build_attn_inp_cross(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - const int64_t dec_n_layer = hparams.dec_n_layer; - - for (int il = 0; il < dec_n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - ggml_tensor * attn_rel_b = model.layers[il].attn_rel_b ? model.layers[il].attn_rel_b : model.layers[0].attn_rel_b; - ggml_tensor * kq_b = build_pos_bias(pos_bucket_dec, attn_rel_b); - - cur = build_attn(inp_attn_self, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, kq_b, nullptr, nullptr, 1.0f, il); - cb(cur, "kqv_out", il); - } - - cur = ggml_add(ctx0, cur, inpSA); - cb(cur, "cross_inp", il); - - ggml_tensor * inpCA = cur; - - // norm - cur = build_norm(cur, - model.layers[il].attn_norm_cross, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm_cross", il); - - // cross-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq_cross, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk_cross, embd_enc); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv_cross, embd_enc); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_outputs_enc); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_outputs_enc); - - cur = build_attn(inp_attn_cross, - model.layers[il].wo_cross, nullptr, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); - cb(cur, "kqv_out", il); - - //ggml_tensor * q = ggml_permute(ctx0, Qcur, 0, 2, 1, 3); - //ggml_tensor * k = ggml_cont(ctx0, ggml_permute(ctx0, Kcur, 0, 2, 1, 3)); - - //ggml_tensor * kq = ggml_mul_mat(ctx0, k, q); - //cb(kq, "kq", il); - - //kq = ggml_soft_max_ext(ctx0, kq, KQ_mask_cross, 1.0f, hparams.f_max_alibi_bias); - //cb(kq, "kq_soft_max_ext", il); - - //ggml_tensor * v = ggml_cont(ctx0, ggml_transpose(ctx0, ggml_reshape_2d(ctx0, Vcur, n_embd_gqa, n_outputs_enc))); - //cb(v, "v", il); - - //ggml_tensor * kqv = ggml_mul_mat(ctx0, ggml_reshape_3d(ctx0, v, n_outputs_enc, n_embd_head, n_head_kv), kq); - //cb(kqv, "kqv", il); - - //ggml_tensor * kqv_merged = ggml_permute(ctx0, kqv, 0, 2, 1, 3); - //cb(kqv_merged, "kqv_merged", il); - - //cur = ggml_cont_2d(ctx0, kqv_merged, n_embd_gqa, n_tokens); - //cb(cur, "kqv_merged_cont", il); - - //ggml_build_forward_expand(gf, cur); - - //cur = build_lora_mm(model.layers[il].wo_cross, cur); - //cb(cur, "kqv_out", il); - } - - if (il == dec_n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpCA = ggml_get_rows(ctx0, inpCA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpCA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // T5 uses relu, flan-T5 uses gelu-gated - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - model.layers[il].ffn_gate ? LLM_FFN_GELU : LLM_FFN_RELU, - model.layers[il].ffn_gate ? LLM_FFN_PAR : LLM_FFN_SEQ, - il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cb(cur, "result_embd", -1); - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_jais : public llm_graph_context { - llm_build_jais(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*cur->nb[0]*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*cur->nb[0]*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*cur->nb[0]*(n_embd + n_embd_gqa)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/float(n_embd_head), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); - } - - // add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - inpL = ggml_add(ctx0, cur, ffn_inp); - cb(inpL, "l_out", il); - } - - cur = build_norm(inpL, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_chatglm : public llm_graph_context { - llm_build_chatglm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = nullptr; - ggml_tensor * Kcur = nullptr; - ggml_tensor * Vcur = nullptr; - - if (model.layers[il].wqkv == nullptr) { - Qcur = build_lora_mm(model.layers[il].wq, cur); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - } - Kcur = build_lora_mm(model.layers[il].wk, cur); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - } - Vcur = build_lora_mm(model.layers[il].wv, cur); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - } - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - } else { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - if (model.layers[il].bqkv) { - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - } - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - } - - //printf("freq_base: %f freq_scale: %f ext_factor: %f attn_factor: %f\n", freq_base, freq_scale, ext_factor, attn_factor); - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // Add the input - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - } - - inpL = ggml_add(ctx0, cur, ffn_inp); - cb(inpL, "l_out", il); - } - - cur = build_norm(inpL, - model.output_norm, - NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_glm4 : public llm_graph_context { - llm_build_glm4(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // Pre-attention norm - cur = build_norm(inpL, - model.layers[il].attn_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = nullptr; - ggml_tensor * Kcur = nullptr; - ggml_tensor * Vcur = nullptr; - - if (model.layers[il].wqkv == nullptr) { - Qcur = build_lora_mm(model.layers[il].wq, cur); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - } - Kcur = build_lora_mm(model.layers[il].wk, cur); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - } - Vcur = build_lora_mm(model.layers[il].wv, cur); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - } - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - } else { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - if (model.layers[il].bqkv) { - cur = ggml_add(ctx0, cur, model.layers[il].bqkv); - cb(cur, "bqkv", il); - } - Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // Post-attention norm (new!) - cur = build_norm(cur, - model.layers[il].attn_post_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "post_attn_norm", il); - - // Add the input (residual connection after post-attention norm) - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // FF - { - // Pre-MLP norm - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // MLP - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - // Post-MLP norm - cur = build_norm(cur, - model.layers[il].ffn_post_norm, - NULL, - LLM_NORM_RMS, il); - cb(cur, "post_mlp_norm", il); - } - - // Add residual connection after post-MLP norm - inpL = ggml_add(ctx0, cur, ffn_inp); - cb(inpL, "l_out", il); - } - - // Final norm - cur = build_norm(inpL, - model.output_norm, - NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // Output projection - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_glm4_moe : public llm_graph_context { - llm_build_glm4_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - // Only process up to last layer (skip final NextN layer) - // Final layer tensors are loaded but not processed in forward pass - const int n_transformer_layers = n_layer - hparams.nextn_predict_layers; - for (int il = 0; il < n_transformer_layers; ++il) { - ggml_tensor * inpSA = inpL; - - // Pre-attention norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - } - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - } - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - } - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - // Apply Q/K norm if available (GLM-4.5 355B variant) - if (model.layers[il].attn_q_norm) { - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - } - if (model.layers[il].attn_k_norm) { - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - } - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_transformer_layers - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // Post-attention norm - cur = build_norm(ffn_inp, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "post_attn_norm", il); - - // Check if this is a dense layer (n_layer_dense_lead=1, so layer 0 is dense) - if (static_cast(il) < hparams.n_layer_dense_lead) { - // Dense FFN layer - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // Process routed experts using existing MoE infrastructure - ggml_tensor * routed_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - true, hparams.expert_weights_scale, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(routed_out, "ffn_moe_out", il); - - // Process shared expert on original input - ggml_tensor * shared_out = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(shared_out, "ffn_shexp_out", il); - - // Final output: routed_output + shared_output - cur = ggml_add(ctx0, routed_out, shared_out); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_nemotron : public llm_graph_context { - llm_build_nemotron(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - //GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, - model.layers[il].attn_norm_b, - LLM_NORM, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, - model.layers[il].ffn_norm_b, - LLM_NORM, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, model.output_norm_b, - LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_nemotron_h : public llm_graph_context_mamba { - llm_build_nemotron_h( - const llama_model & model, - const llm_graph_params & params) : - llm_graph_context_mamba(params) { - - const int64_t n_embd_head = hparams.n_embd_head_v; - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - ggml_build_forward_expand(gf, inpL); - - auto * inp = build_inp_mem_hybrid(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - struct ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - if (hparams.is_recurrent(il)) { - // ssm layer // - cur = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); - } else if (hparams.n_ff(il) == 0) { - // attention layer // - cur = build_attention_layer(cur, inp->get_attn(), model, n_embd_head, il); - } else { - cur = build_ffn_layer(cur, model, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // add residual - cur = ggml_add(ctx0, cur, inpSA); - cb(cur, "nemotron_h_block_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - - ggml_tensor * build_attention_layer( - ggml_tensor * cur, - llm_graph_input_attn_kv * inp_attn, - const llama_model & model, - const int64_t n_embd_head, - const int il) { - - // compute Q and K and (optionally) RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - return cur; - } - - ggml_tensor * build_ffn_layer( - ggml_tensor * cur, - const llama_model & model, - const int il) { - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_RELU_SQR, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - return cur; - } -}; - -struct llm_build_exaone : public llm_graph_context { - llm_build_exaone(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -template -struct llm_build_exaone4 : public llm_graph_context { - llm_build_exaone4(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_k; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_v); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - using inp_attn_type = std::conditional_t; - inp_attn_type * inp_attn = nullptr; - - if constexpr (iswa) { - inp_attn = build_attn_inp_kv_iswa(); - } else { - inp_attn = build_attn_inp_kv(); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // use RoPE for SWA layers or non-SWA models - const bool use_rope = hparams.is_swa(il) || hparams.swa_type == LLAMA_SWA_TYPE_NONE; - - cur = inpL; - - // self-attention - { - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - cb(Kcur, "Kcur_normed", il); - - if (use_rope) { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - cur = build_norm(cur, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_ffn(ffn_inp, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = build_norm(cur, - model.layers[il].ffn_post_norm, NULL, - LLM_NORM_RMS, -1); - cb(cur, "ffn_post_norm", -1); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_rwkv6_base : public llm_graph_context { - const llama_model & model; - - llm_build_rwkv6_base(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params), model(model) { - } - - ggml_tensor * build_rwkv6_channel_mix( - const llama_layer * layer, - ggml_tensor * cur, - ggml_tensor * x_prev, - llm_arch arch) const { - ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); - switch (arch) { - case LLM_ARCH_RWKV6: - { - ggml_tensor * xk = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_k), cur); - ggml_tensor * xr = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_r), cur); - - ggml_tensor * r = ggml_sigmoid(ctx0, build_lora_mm(layer->channel_mix_receptance, xr)); - ggml_tensor * k = ggml_sqr( - ctx0, - ggml_relu( - ctx0, - build_lora_mm(layer->channel_mix_key, xk) - ) - ); - cur = ggml_mul(ctx0, r, build_lora_mm(layer->channel_mix_value, k)); - } break; - default: - GGML_ABORT("fatal error"); - } - - return cur; - } - - ggml_tensor * build_rwkv6_time_mix( - llm_graph_input_rs * inp, - ggml_tensor * cur, - ggml_tensor * x_prev, - const llama_ubatch & ubatch, - int il) const { - const auto * mctx_cur = static_cast(mctx); - - const auto n_tokens = ubatch.n_tokens; - const auto n_seqs = ubatch.n_seqs; - const auto n_seq_tokens = ubatch.n_seq_tokens; - const auto n_embd = hparams.n_embd; - const auto head_size = hparams.wkv_head_size; - const auto n_head = n_embd / head_size; - const auto n_head_kv = hparams.n_head_kv(il); - - const auto kv_head = mctx_cur->get_head(); - - const auto & layer = model.layers[il]; - - bool is_qrwkv = layer.time_mix_first == nullptr; - - ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); - - sx = ggml_reshape_2d(ctx0, sx, n_embd, n_tokens); - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - - ggml_tensor * xxx = ggml_add(ctx0, ggml_mul(ctx0, sx, layer.time_mix_lerp_x), cur); - - xxx = ggml_reshape_4d( - ctx0, - ggml_tanh( - ctx0, - ggml_mul_mat(ctx0, layer.time_mix_w1, xxx) - ), - layer.time_mix_w1->ne[1] / 5, 1, 5, n_tokens - ); - - xxx = ggml_cont(ctx0, ggml_permute(ctx0, xxx, 0, 1, 3, 2)); - - xxx = ggml_mul_mat( - ctx0, - ggml_reshape_4d( - ctx0, - layer.time_mix_w2, - layer.time_mix_w2->ne[0], layer.time_mix_w2->ne[1], 1, 5 - ), - xxx - ); - - ggml_tensor *xw, *xk, *xv, *xr, *xg; - if (layer.time_mix_lerp_fused) { - // fusing these weights makes some performance improvement - sx = ggml_reshape_3d(ctx0, sx, n_embd, 1, n_tokens); - cur = ggml_reshape_3d(ctx0, cur, n_embd, 1, n_tokens); - xxx = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xxx, layer.time_mix_lerp_fused), sx), cur); - xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); - xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); - xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); - xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); - xg = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); - } else { - // for backward compatibility - xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); - xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); - xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); - xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); - xg = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); - - xw = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xw, layer.time_mix_lerp_w), sx), cur); - xk = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xk, layer.time_mix_lerp_k), sx), cur); - xv = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xv, layer.time_mix_lerp_v), sx), cur); - xr = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xr, layer.time_mix_lerp_r), sx), cur); - xg = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xg, layer.time_mix_lerp_g), sx), cur); - } - - ggml_tensor * r = build_lora_mm(layer.time_mix_receptance, xr); - ggml_tensor * k = build_lora_mm(layer.time_mix_key, xk); - ggml_tensor * v = build_lora_mm(layer.time_mix_value, xv); - if (layer.time_mix_receptance_b) { - r = ggml_add(ctx0, r, layer.time_mix_receptance_b); - } - if (layer.time_mix_key_b) { - k = ggml_add(ctx0, k, layer.time_mix_key_b); - } - if (layer.time_mix_value_b) { - v = ggml_add(ctx0, v, layer.time_mix_value_b); - } - - ggml_tensor * g = build_lora_mm(layer.time_mix_gate, xg); - if (is_qrwkv) { - g = ggml_sigmoid(ctx0, g); - } else { - g = ggml_silu(ctx0, g); - } - - if (n_head_kv != 0 && n_head_kv != n_head) { - GGML_ASSERT(n_head % n_head_kv == 0); - k = ggml_reshape_4d(ctx0, k, head_size, 1, n_head_kv, n_tokens); - v = ggml_reshape_4d(ctx0, v, head_size, 1, n_head_kv, n_tokens); - ggml_tensor * tmp = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, head_size, n_head / n_head_kv, n_head_kv, n_tokens); - k = ggml_repeat(ctx0, k, tmp); - v = ggml_repeat(ctx0, v, tmp); - } - - k = ggml_reshape_3d(ctx0, k, head_size, n_head, n_tokens); - v = ggml_reshape_3d(ctx0, v, head_size, n_head, n_tokens); - r = ggml_reshape_3d(ctx0, r, head_size, n_head, n_tokens); - - ggml_tensor * w = ggml_mul_mat( - ctx0, - layer.time_mix_decay_w2, - ggml_tanh( - ctx0, - ggml_mul_mat(ctx0, layer.time_mix_decay_w1, xw) - ) - ); - - w = ggml_add(ctx0, w, layer.time_mix_decay); - w = ggml_exp(ctx0, ggml_neg(ctx0, ggml_exp(ctx0, w))); - w = ggml_reshape_3d(ctx0, w, head_size, n_head, n_tokens); - - if (is_qrwkv) { - // k = k * (1 - w) - k = ggml_sub(ctx0, k, ggml_mul(ctx0, k, w)); - } - - ggml_tensor * wkv_state = build_rs( - inp, mctx_cur->get_s_l(il), - hparams.n_embd_s(), n_seqs); - - ggml_tensor * wkv_output; - if (is_qrwkv) { - wkv_output = ggml_gated_linear_attn(ctx0, k, v, r, w, wkv_state, pow(head_size, -0.5f)); - } else { - wkv_output = ggml_rwkv_wkv6(ctx0, k, v, r, layer.time_mix_first, w, wkv_state); - } - cur = ggml_view_1d(ctx0, wkv_output, n_embd * n_tokens, 0); - wkv_state = ggml_view_1d(ctx0, wkv_output, n_embd * head_size * n_seqs, n_embd * n_tokens * sizeof(float)); - - ggml_build_forward_expand( - gf, - ggml_cpy( - ctx0, - wkv_state, - ggml_view_1d( - ctx0, - mctx_cur->get_s_l(il), - hparams.n_embd_s() * n_seqs, - hparams.n_embd_s() * kv_head * ggml_element_size(mctx_cur->get_s_l(il)) - ) - ) - ); - - if (!is_qrwkv) { - // group norm with head_count groups - cur = ggml_reshape_3d(ctx0, cur, n_embd / n_head, n_head, n_tokens); - cur = ggml_norm(ctx0, cur, 64e-5f); - - // Convert back to regular vectors. - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - cur = ggml_add(ctx0, ggml_mul(ctx0, cur, layer.time_mix_ln), layer.time_mix_ln_b); - } else { - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - } - - cur = ggml_mul(ctx0, cur, g); - cur = build_lora_mm(layer.time_mix_output, cur); - - return ggml_reshape_3d(ctx0, cur, n_embd, n_seq_tokens, n_seqs); - } -}; - -struct llm_build_rwkv6 : public llm_build_rwkv6_base { - llm_build_rwkv6(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv6_base(model, params) { - GGML_ASSERT(hparams.token_shift_count == 2); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); - - auto * rs_inp = build_rs_inp(); - - const auto n_embd = hparams.n_embd; - const auto n_seq_tokens = ubatch.n_seq_tokens; - const auto n_seqs = ubatch.n_seqs; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const llama_layer * layer = &model.layers[il]; - inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); - - ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); - - ggml_tensor * att_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], 0); - ggml_tensor * ffn_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], n_embd * ggml_element_size(token_shift)); - - ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM, il); - cb(att_norm, "attn_norm", il); - - ggml_tensor * x_prev = ggml_concat( - ctx0, - att_shift, - ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), - 1 - ); - - cur = build_rwkv6_time_mix(rs_inp, att_norm, x_prev, ubatch, il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - ggml_tensor * ffn_norm = build_norm(ffn_inp, layer->attn_norm_2, layer->attn_norm_2_b, LLM_NORM, il); - cb(ffn_norm, "ffn_norm", il); - - x_prev = ggml_concat( - ctx0, - ffn_shift, - ggml_view_3d(ctx0, ffn_norm, n_embd, n_seq_tokens - 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], 0), - 1 - ); - - token_shift = ggml_concat(ctx0, - ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)), - ggml_view_3d(ctx0, ffn_norm, n_embd, 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(ffn_norm)), - 1 - ); - ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); - - ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); - ffn_norm = ggml_reshape_2d(ctx0, ffn_norm, n_embd, n_tokens); - x_prev = ggml_reshape_2d(ctx0, x_prev, n_embd, n_tokens); - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - - if (il == n_layer - 1 && inp_out_ids) { - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - ffn_norm = ggml_get_rows(ctx0, ffn_norm, inp_out_ids); - x_prev = ggml_get_rows(ctx0, x_prev, inp_out_ids); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - } - - cur = build_rwkv6_channel_mix(layer, ffn_norm, x_prev, LLM_ARCH_RWKV6); - cur = ggml_add(ctx0, cur, ffn_inp); - - if (hparams.rescale_every_n_layers != 0 && (il + 1) % hparams.rescale_every_n_layers == 0) { - cur = ggml_scale(ctx0, cur, 0.5F); - } - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -// ref: https://huggingface.co/recursal/QRWKV6-32B-Instruct-Preview-v0.1/blob/main/modeling_rwkv6qwen2.py -struct llm_build_rwkv6qwen2 : public llm_build_rwkv6_base { - llm_build_rwkv6qwen2(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv6_base(model, params) { - GGML_ASSERT(n_embd == hparams.n_embd_r()); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * rs_inp = build_rs_inp(); - - const auto n_embd = hparams.n_embd; - const auto n_seq_tokens = ubatch.n_seq_tokens; - const auto n_seqs = ubatch.n_seqs; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const llama_layer * layer = &model.layers[il]; - inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); - - ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); - - ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM_RMS, il); - cb(att_norm, "attn_norm", il); - - ggml_tensor * x_prev = ggml_concat( - ctx0, - token_shift, - ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), - 1 - ); - - cur = build_rwkv6_time_mix(rs_inp, att_norm, x_prev, ubatch, il); - - token_shift = ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)); - ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - } - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_rwkv7_base : public llm_graph_context { - const llama_model & model; - - llm_build_rwkv7_base(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params), model(model) { - } - - ggml_tensor * build_rwkv7_channel_mix( - const llama_layer * layer, - ggml_tensor * cur, - ggml_tensor * x_prev, - llm_arch arch) const { - ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); - switch (arch) { - case LLM_ARCH_RWKV7: - { - ggml_tensor * xk = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_k), cur); - - ggml_tensor * k = ggml_sqr( - ctx0, - ggml_relu( - ctx0, - build_lora_mm(layer->channel_mix_key, xk) - ) - ); - - cur = build_lora_mm(layer->channel_mix_value, k); - } break; - default: - GGML_ABORT("fatal error"); - } - - return cur; - } - - ggml_tensor * build_rwkv7_time_mix( - llm_graph_input_rs * inp, - ggml_tensor * cur, - ggml_tensor * x_prev, - ggml_tensor *& first_layer_value, - const llama_ubatch & ubatch, - int il) const { - const auto * mctx_cur = static_cast(mctx); - - const auto n_tokens = ubatch.n_tokens; - const auto n_seqs = ubatch.n_seqs; - const auto n_embd = hparams.n_embd; - const auto head_size = hparams.wkv_head_size; - const auto head_count = n_embd / head_size; - const auto n_seq_tokens = ubatch.n_seq_tokens; - - const auto kv_head = mctx_cur->get_head(); - - const auto & layer = model.layers[il]; - - bool has_gating = layer.time_mix_g1 && layer.time_mix_g2; - - ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); - ggml_tensor * dummy = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, n_embd, n_seq_tokens, n_seqs, has_gating ? 6 : 5); - sx = ggml_repeat(ctx0, sx, dummy); - - ggml_tensor * xxx = ggml_add(ctx0, ggml_mul(ctx0, sx, layer.time_mix_lerp_fused), cur); - - ggml_tensor * xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); - ggml_tensor * xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); - ggml_tensor * xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); - ggml_tensor * xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); - ggml_tensor * xa = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); - ggml_tensor * xg = has_gating ? ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 5 * sizeof(float)) : nullptr; - - ggml_tensor * r = build_lora_mm(layer.time_mix_receptance, xr); - ggml_tensor * w = ggml_add( - ctx0, - ggml_mul_mat(ctx0, layer.time_mix_w2, ggml_tanh(ctx0, ggml_mul_mat(ctx0, layer.time_mix_w1, xw))), - layer.time_mix_w0 - ); - w = ggml_exp(ctx0, ggml_scale(ctx0, ggml_sigmoid(ctx0, w), -0.606531)); - - ggml_tensor * k = build_lora_mm(layer.time_mix_key, xk); - ggml_tensor * v = build_lora_mm(layer.time_mix_value, xv); - if (first_layer_value == nullptr) { - first_layer_value = v; - } else { - // Add the first layer value as a residual connection. - v = ggml_add(ctx0, v, - ggml_mul(ctx0, - ggml_sub(ctx0, first_layer_value, v), - ggml_sigmoid(ctx0, ggml_add(ctx0, - ggml_mul_mat(ctx0, layer.time_mix_v2, ggml_mul_mat(ctx0, layer.time_mix_v1, xv)), - layer.time_mix_v0 - ) - ) - ) - ); - } - - ggml_tensor * g = nullptr; - if (layer.time_mix_g1 && layer.time_mix_g2) { - g = ggml_mul_mat(ctx0, layer.time_mix_g2, ggml_sigmoid(ctx0, ggml_mul_mat(ctx0, layer.time_mix_g1, xg))); - } - - ggml_tensor * a = ggml_sigmoid(ctx0, - ggml_add( - ctx0, - ggml_mul_mat(ctx0, layer.time_mix_a2, ggml_mul_mat(ctx0, layer.time_mix_a1, xa)), - layer.time_mix_a0 - ) - ); - - ggml_tensor * kk = ggml_reshape_3d(ctx0, ggml_mul(ctx0, k, layer.time_mix_k_k), head_size, head_count, n_tokens); - kk = ggml_l2_norm(ctx0, kk, 1e-12); - - ggml_tensor * ka = ggml_mul(ctx0, k, layer.time_mix_k_a); - k = ggml_add(ctx0, k, ggml_sub(ctx0, ggml_mul(ctx0, a, ka), ka)); - - r = ggml_reshape_3d(ctx0, r, head_size, head_count, n_tokens); - w = ggml_reshape_3d(ctx0, w, head_size, head_count, n_tokens); - k = ggml_reshape_3d(ctx0, k, head_size, head_count, n_tokens); - v = ggml_reshape_3d(ctx0, v, head_size, head_count, n_tokens); - a = ggml_reshape_3d(ctx0, a, head_size, head_count, n_tokens); - - ggml_tensor * wkv_state = build_rs( - inp, mctx_cur->get_s_l(il), - hparams.n_embd_s(), n_seqs); - - ggml_tensor * wkv_output = ggml_rwkv_wkv7(ctx0, r, w, k, v, ggml_neg(ctx0, kk), ggml_mul(ctx0, kk, a), wkv_state); - cur = ggml_view_1d(ctx0, wkv_output, n_embd * n_tokens, 0); - wkv_state = ggml_view_1d(ctx0, wkv_output, n_embd * head_size * n_seqs, n_embd * n_tokens * sizeof(float)); - - ggml_build_forward_expand( - gf, - ggml_cpy( - ctx0, - wkv_state, - ggml_view_1d( - ctx0, - mctx_cur->get_s_l(il), - hparams.n_embd_s() * n_seqs, - hparams.n_embd_s() * kv_head * ggml_element_size(mctx_cur->get_s_l(il)) - ) - ) - ); - - if (layer.time_mix_ln && layer.time_mix_ln_b) { - // group norm with head_count groups - cur = ggml_reshape_3d(ctx0, cur, n_embd / head_count, head_count, n_tokens); - cur = ggml_norm(ctx0, cur, 64e-5f); - - // Convert back to regular vectors. - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - cur = ggml_add(ctx0, ggml_mul(ctx0, cur, layer.time_mix_ln), layer.time_mix_ln_b); - } else { - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - } - - ggml_tensor * rk = ggml_sum_rows(ctx0, - ggml_mul(ctx0, ggml_mul(ctx0, k, r), ggml_reshape_2d(ctx0, layer.time_mix_r_k, head_size, head_count))); - cur = ggml_add(ctx0, cur, ggml_reshape_2d(ctx0, ggml_mul(ctx0, v, rk), n_embd, n_tokens)); - - if (has_gating) { - cur = ggml_mul(ctx0, cur, g); - } - cur = build_lora_mm(layer.time_mix_output, cur); - - return ggml_reshape_3d(ctx0, cur, n_embd, n_seq_tokens, n_seqs); - } -}; - -struct llm_build_rwkv7 : public llm_build_rwkv7_base { - llm_build_rwkv7(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv7_base(model, params) { - GGML_ASSERT(hparams.token_shift_count == 2); - - ggml_tensor * cur; - ggml_tensor * inpL; - ggml_tensor * v_first = nullptr; - - inpL = build_inp_embd(model.tok_embd); - inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); - - auto * rs_inp = build_rs_inp(); - - const auto n_embd = hparams.n_embd; - const auto n_seq_tokens = ubatch.n_seq_tokens; - const auto n_seqs = ubatch.n_seqs; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const llama_layer * layer = &model.layers[il]; - inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); - - ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); - - ggml_tensor * att_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], 0); - ggml_tensor * ffn_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], n_embd * ggml_element_size(token_shift)); - - ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM, il); - cb(att_norm, "attn_norm", il); - - ggml_tensor * x_prev = ggml_concat( - ctx0, - att_shift, - ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), - 1 - ); - - cur = build_rwkv7_time_mix(rs_inp, att_norm, x_prev, v_first, ubatch, il); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - ggml_tensor * ffn_norm = build_norm(ffn_inp, layer->attn_norm_2, layer->attn_norm_2_b, LLM_NORM, il); - cb(ffn_norm, "ffn_norm", il); - - x_prev = ggml_concat( - ctx0, - ffn_shift, - ggml_view_3d(ctx0, ffn_norm, n_embd, n_seq_tokens - 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], 0), - 1 - ); - - token_shift = ggml_concat(ctx0, - ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)), - ggml_view_3d(ctx0, ffn_norm, n_embd, 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(ffn_norm)), - 1 - ); - ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); - - ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); - ffn_norm = ggml_reshape_2d(ctx0, ffn_norm, n_embd, n_tokens); - x_prev = ggml_reshape_2d(ctx0, x_prev, n_embd, n_tokens); - - if (il == n_layer - 1 && inp_out_ids) { - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - ffn_norm = ggml_get_rows(ctx0, ffn_norm, inp_out_ids); - x_prev = ggml_get_rows(ctx0, x_prev, inp_out_ids); - } - - cur = build_rwkv7_channel_mix(layer, ffn_norm, x_prev, LLM_ARCH_RWKV7); - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - - -struct llm_build_arwkv7 : public llm_build_rwkv7_base { - llm_build_arwkv7(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv7_base(model, params) { - GGML_ASSERT(n_embd == hparams.n_embd_r()); - - ggml_tensor * cur; - ggml_tensor * inpL; - ggml_tensor * v_first = nullptr; - - inpL = build_inp_embd(model.tok_embd); - - auto * rs_inp = build_rs_inp(); - - const auto n_embd = hparams.n_embd; - const auto n_seq_tokens = ubatch.n_seq_tokens; - const auto n_seqs = ubatch.n_seqs; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const llama_layer * layer = &model.layers[il]; - inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); - - ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); - - ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM_RMS, il); - cb(att_norm, "attn_norm", il); - - ggml_tensor * x_prev = ggml_concat( - ctx0, - token_shift, - ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), - 1 - ); - - cur = build_rwkv7_time_mix(rs_inp, att_norm, x_prev, v_first, ubatch, il); - - token_shift = ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)); - ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); - cb(ffn_inp, "ffn_inp", il); - - cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); - ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); - } - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_granite : public llm_graph_context { - llm_build_granite( - const llama_model & model, - const llm_graph_params & params) - : llm_graph_context(params) { - - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - built only if rope enabled - ggml_tensor * inp_pos = nullptr; - if (hparams.rope_finetuned) { - inp_pos = build_inp_pos(); - } - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - cur = build_attention_layer( - cur, inp_pos, inp_attn, - model, n_embd_head, il); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // ffn - cur = build_layer_ffn(cur, inpSA, model, il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - // For Granite architectures - scale logits - cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_logit_scale); - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - - ggml_tensor * build_attention_layer( - ggml_tensor * cur, - ggml_tensor * inp_pos, - llm_graph_input_attn_kv * inp_attn, - const llama_model & model, - const int64_t n_embd_head, - const int il) { - - // compute Q and K and (optionally) RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - - const bool use_rope = hparams.rope_finetuned; - if (use_rope) { - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - return cur; - } - - ggml_tensor * build_layer_ffn( - ggml_tensor * cur, - ggml_tensor * inpSA, - const llama_model & model, - const int il) { - - // For Granite architectures - scale residual - if (hparams.f_residual_scale) { - cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); - } - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network (non-MoE) - if (model.layers[il].ffn_gate_inp == nullptr) { - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - } else { - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // For Granite MoE Shared - if (hparams.n_ff_shexp > 0) { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } else { - cur = moe_out; - } - } - - // For Granite architectures - scale residual - if (hparams.f_residual_scale) { - cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); - } - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - return cur; - } -}; - -struct llm_build_granite_hybrid : public llm_graph_context_mamba { - llm_build_granite_hybrid( - const llama_model & model, - const llm_graph_params & params) : - llm_graph_context_mamba(params) { - - const int64_t n_embd_head = hparams.n_embd_head_v; - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - auto * inp = build_inp_mem_hybrid(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - // Positional embeddings populated if rope enabled - ggml_tensor * inp_pos = nullptr; - if (hparams.rope_finetuned) { - inp_pos = build_inp_pos(); - } - - for (int il = 0; il < n_layer; ++il) { - struct ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - if (hparams.is_recurrent(il)) { - // ssm layer // - cur = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); - } else { - // attention layer // - cur = build_attention_layer( - cur, inp_pos, inp->get_attn(), model, - n_embd_head, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - // ffn - cur = build_layer_ffn(cur, inpSA, model, il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - // For Granite architectures - scale logits - if (hparams.f_logit_scale) { - cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_logit_scale); - } - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - - ggml_tensor * build_attention_layer( - ggml_tensor * cur, - ggml_tensor * inp_pos, - llm_graph_input_attn_kv * inp_attn, - const llama_model & model, - const int64_t n_embd_head, - const int il) { - - // compute Q and K and (optionally) RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); - - const bool use_rope = hparams.rope_finetuned; - if (use_rope) { - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - return cur; - } - - ggml_tensor * build_layer_ffn( - ggml_tensor * cur, - ggml_tensor * inpSA, - const llama_model & model, - const int il) { - - // For Granite architectures - scale residual - if (hparams.f_residual_scale) { - cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); - } - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network (non-MoE) - if (model.layers[il].ffn_gate_inp == nullptr) { - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - } else { - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // For Granite MoE Shared - if (hparams.n_ff_shexp > 0) { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } else { - cur = moe_out; - } - } - - // For Granite architectures - scale residual - if (hparams.f_residual_scale) { - cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); - } - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - return cur; - } -}; - -// ref: https://github.com/facebookresearch/chameleon -// based on the original build_llama() function, changes: -// * qk-norm -// * swin-norm -// * removed bias -// * removed MoE -struct llm_build_chameleon : public llm_graph_context { - llm_build_chameleon(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - if (hparams.swin_norm) { - cur = inpL; - } else { - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - } - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - if (model.layers[il].attn_q_norm) { - Qcur = ggml_view_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens, - ggml_element_size(Qcur) * n_embd_head, - ggml_element_size(Qcur) * n_embd_head * n_head, - 0); - cb(Qcur, "Qcur", il); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, - model.layers[il].attn_q_norm_b, - LLM_NORM, il); - cb(Qcur, "Qcur", il); - } - - if (model.layers[il].attn_k_norm) { - Kcur = ggml_view_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens, - ggml_element_size(Kcur) * n_embd_head, - ggml_element_size(Kcur) * n_embd_head * n_head_kv, - 0); - cb(Kcur, "Kcur", il); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, - model.layers[il].attn_k_norm_b, - LLM_NORM, il); - cb(Kcur, "Kcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, nullptr, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - if (hparams.swin_norm) { - cur = build_norm(cur, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - if (!hparams.swin_norm) { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - } - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - if (hparams.swin_norm) { - cur = build_norm(cur, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output_with_img_logits", -1); - - // TODO: this suppresses the output of image tokens, which is required to enable text-only outputs. - // Needs to be removed once image outputs are supported. - int img_token_end_idx = 8196; - int img_token_start_idx = 4; - int num_img_tokens = img_token_end_idx - img_token_start_idx; - // creates 1d tensor of size num_img_tokens and values -FLT_MAX, - // which ensures that text token values are always at least larger than image token values - ggml_tensor * img_logits = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, num_img_tokens); - img_logits = ggml_clamp(ctx0, img_logits, -FLT_MAX, -FLT_MAX); - cb(img_logits, "img_logits", -1); - - cur = ggml_set_1d(ctx0, cur, img_logits, ggml_element_size(cur) * img_token_start_idx); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_wavtokenizer_dec : public llm_graph_context { - llm_build_wavtokenizer_dec(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, inpL)); - - cur = ggml_conv_1d_ph(ctx0, model.conv1d, cur, 1, 1); - cur = ggml_add(ctx0, cur, model.conv1d_b); - - // posnet - for (uint32_t il = 0; il < hparams.posnet.n_layer; ++il) { - const auto & layer = model.layers[il].posnet; - - inpL = cur; - - switch (il) { - case 0: - case 1: - case 3: - case 4: - { - cur = build_norm(cur, - layer.norm1, - layer.norm1_b, - LLM_NORM_GROUP, 0); - - cur = ggml_mul(ctx0, ggml_sigmoid(ctx0, cur), cur); - - cur = ggml_conv_1d_ph(ctx0, layer.conv1, cur, 1, 1); - cur = ggml_add(ctx0, cur, layer.conv1_b); - - cur = build_norm(cur, - layer.norm2, - layer.norm2_b, - LLM_NORM_GROUP, 0); - - cur = ggml_mul(ctx0, ggml_sigmoid(ctx0, cur), cur); - - cur = ggml_conv_1d_ph(ctx0, layer.conv2, cur, 1, 1); - cur = ggml_add(ctx0, cur, layer.conv2_b); - - cur = ggml_add(ctx0, cur, inpL); - } break; - case 2: - { - cur = build_norm(cur, - layer.attn_norm, - layer.attn_norm_b, - LLM_NORM_GROUP, 0); - - ggml_tensor * q; - ggml_tensor * k; - ggml_tensor * v; - - q = ggml_conv_1d_ph(ctx0, layer.attn_q, cur, 1, 1); - k = ggml_conv_1d_ph(ctx0, layer.attn_k, cur, 1, 1); - v = ggml_conv_1d_ph(ctx0, layer.attn_v, cur, 1, 1); - - q = ggml_add(ctx0, q, layer.attn_q_b); - k = ggml_add(ctx0, k, layer.attn_k_b); - v = ggml_add(ctx0, v, layer.attn_v_b); - - q = ggml_cont(ctx0, ggml_transpose(ctx0, q)); - k = ggml_cont(ctx0, ggml_transpose(ctx0, k)); - - ggml_tensor * kq = ggml_mul_mat(ctx0, k, q); - - kq = ggml_soft_max_ext(ctx0, kq, nullptr, 1.0f/sqrtf(float(hparams.posnet.n_embd)), 0.0f); - - cur = ggml_mul_mat(ctx0, kq, v); - - cur = ggml_conv_1d_ph(ctx0, layer.attn_o, cur, 1, 1); - cur = ggml_add(ctx0, cur, layer.attn_o_b); - - cur = ggml_add(ctx0, cur, inpL); - } break; - case 5: - { - cur = build_norm(cur, - layer.norm, - layer.norm_b, - LLM_NORM_GROUP, 0); - } break; - default: GGML_ABORT("unknown posnet layer"); - }; - } - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); - - cur = build_norm(cur, - model.tok_norm, - model.tok_norm_b, - LLM_NORM, -1); - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); - - inpL = cur; - - // convnext - for (uint32_t il = 0; il < hparams.convnext.n_layer; ++il) { - const auto & layer = model.layers[il].convnext; - - cur = inpL; - - cur = ggml_conv_1d_dw_ph(ctx0, layer.dw, cur, 1, 1); - cur = ggml_add(ctx0, cur, layer.dw_b); - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); - - cur = build_norm(cur, - layer.norm, - layer.norm_b, - LLM_NORM, -1); - - cur = build_ffn(cur, - layer.pw1, layer.pw1_b, NULL, - NULL, NULL, NULL, - layer.pw2, layer.pw2_b, NULL, - NULL, - LLM_FFN_GELU, LLM_FFN_SEQ, il); - - cur = ggml_mul(ctx0, cur, layer.gamma); - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); - - inpL = ggml_add(ctx0, cur, inpL); - } - - cur = inpL; - - cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); - - cur = build_norm(cur, - model.output_norm, - model.output_norm_b, - LLM_NORM, -1); - - // lm_head - cur = build_lora_mm(model.output, cur); - - cur = ggml_add(ctx0, cur, model.output_b); - - cb(cur, "result_embd", -1); - res->t_embd = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_plm : public llm_graph_context { - llm_build_plm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const float kq_scale = 1.0f/sqrtf(float(hparams.n_embd_head_k)); - - const uint32_t n_embd_head_qk_rope = hparams.n_rot; - const uint32_t n_embd_head_qk_nope = hparams.n_embd_head_k - hparams.n_rot; - const uint32_t kv_lora_rank = hparams.n_lora_kv; - - ggml_tensor * cur; - ggml_tensor * inpL; - - // {n_embd, n_tokens} - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - ggml_tensor * q = NULL; - q = ggml_mul_mat(ctx0, model.layers[il].wq, cur); - cb(q, "q", il); - - // split into {n_head * n_embd_head_qk_nope, n_tokens} - ggml_tensor * q_nope = ggml_view_3d(ctx0, q, n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(q->type, hparams.n_embd_head_k), - ggml_row_size(q->type, hparams.n_embd_head_k * n_head), - 0); - cb(q_nope, "q_nope", il); - - // and {n_head * n_embd_head_qk_rope, n_tokens} - ggml_tensor * q_pe = ggml_view_3d(ctx0, q, n_embd_head_qk_rope, n_head, n_tokens, - ggml_row_size(q->type, hparams.n_embd_head_k), - ggml_row_size(q->type, hparams.n_embd_head_k * n_head), - ggml_row_size(q->type, n_embd_head_qk_nope)); - cb(q_pe, "q_pe", il); - - // {n_embd, kv_lora_rank + n_embd_head_qk_rope} * {n_embd, n_tokens} -> {kv_lora_rank + n_embd_head_qk_rope, n_tokens} - ggml_tensor * kv_pe_compresseed = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); - cb(kv_pe_compresseed, "kv_pe_compresseed", il); - - // split into {kv_lora_rank, n_tokens} - ggml_tensor * kv_compressed = ggml_view_2d(ctx0, kv_pe_compresseed, kv_lora_rank, n_tokens, - kv_pe_compresseed->nb[1], - 0); - cb(kv_compressed, "kv_compressed", il); - - // and {n_embd_head_qk_rope, n_tokens} - ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_pe_compresseed, n_embd_head_qk_rope, 1, n_tokens, - kv_pe_compresseed->nb[1], - kv_pe_compresseed->nb[1], - ggml_row_size(kv_pe_compresseed->type, kv_lora_rank)); - cb(k_pe, "k_pe", il); - - kv_compressed = build_norm(kv_compressed, - model.layers[il].attn_kv_a_norm, NULL, - LLM_NORM_RMS, il); - cb(kv_compressed, "kv_compressed", il); - - // {kv_lora_rank, n_head * (n_embd_head_qk_nope + n_embd_head_v)} * {kv_lora_rank, n_tokens} -> {n_head * (n_embd_head_qk_nope + n_embd_head_v), n_tokens} - ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_compressed); - cb(kv, "kv", il); - - // split into {n_head * n_embd_head_qk_nope, n_tokens} - ggml_tensor * k_nope = ggml_view_3d(ctx0, kv, n_embd_head_qk_nope, n_head, n_tokens, - ggml_row_size(kv->type, n_embd_head_qk_nope + hparams.n_embd_head_v), - ggml_row_size(kv->type, n_head * (n_embd_head_qk_nope + hparams.n_embd_head_v)), - 0); - cb(k_nope, "k_nope", il); - - // and {n_head * n_embd_head_v, n_tokens} - ggml_tensor * v_states = ggml_view_3d(ctx0, kv, hparams.n_embd_head_v, n_head, n_tokens, - ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)), - ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)*n_head), - ggml_row_size(kv->type, (n_embd_head_qk_nope))); - cb(v_states, "v_states", il); - - v_states = ggml_cont(ctx0, v_states); - cb(v_states, "v_states", il); - - v_states = ggml_view_2d(ctx0, v_states, hparams.n_embd_head_v * n_head, n_tokens, - ggml_row_size(kv->type, hparams.n_embd_head_v * n_head), - 0); - cb(v_states, "v_states", il); - - q_pe = ggml_rope_ext( - ctx0, q_pe, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(q_pe, "q_pe", il); - - // shared RoPE key - k_pe = ggml_rope_ext( - ctx0, k_pe, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - cb(k_pe, "k_pe", il); - - ggml_tensor * q_states = ggml_concat(ctx0, q_nope, q_pe, 0); - cb(q_states, "q_states", il); - - ggml_tensor * k_states = ggml_concat(ctx0, k_nope, ggml_repeat(ctx0, k_pe, q_pe), 0); - cb(k_states, "k_states", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - q_states, k_states, v_states, nullptr, nullptr, nullptr, kq_scale, il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_bailingmoe : public llm_graph_context { - llm_build_bailingmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_rot, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_rot, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_rot, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_rot)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - false, hparams.expert_weights_scale, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // FFN shared expert - { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_bailingmoe2 : public llm_graph_context { - llm_build_bailingmoe2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - const int n_transformer_layers = n_layer - hparams.nextn_predict_layers; - for (int il = 0; il < n_transformer_layers; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - cur = build_lora_mm(model.layers[il].wqkv, cur); - cb(cur, "wqkv", il); - - ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_transformer_layers - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * sa_out = ggml_add(ctx0, cur, inpSA); - cb(sa_out, "sa_out", il); - - // MoE branch - cur = build_norm(sa_out, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - if (static_cast(il) < hparams.n_layer_dense_lead) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - true, hparams.expert_weights_scale, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(moe_out, "ffn_moe_out", il); - - { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - } - - cur = ggml_add(ctx0, cur, sa_out); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_dots1 : public llm_graph_context { - llm_build_dots1(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - if ((uint32_t) il < hparams.n_layer_dense_lead) { - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - ggml_tensor * moe_out = - build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, hparams.expert_weights_norm, - true, hparams.expert_weights_scale, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(moe_out, "ffn_moe_out", il); - - { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - cb(cur, "ffn_out", il); - } - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_ernie4_5 : public llm_graph_context { - llm_build_ernie4_5(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - { - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - } - - // self-attention - { - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1) { - // skip computing output for unused tokens - ggml_tensor * inp_out_ids = build_inp_out_ids(); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_ernie4_5_moe : public llm_graph_context { - llm_build_ernie4_5_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - GGML_ASSERT(hparams.n_moe_layer_step > 0 && "Ernie 4.5 MoE requires n_moe_layer_step > 0"); - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - // norm - { - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - } - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - bool is_moe_layer = static_cast(il) >= hparams.n_layer_dense_lead && (il + 1) % hparams.n_moe_layer_step == 0; - - if (!is_moe_layer) { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } else { - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * moe_out = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(moe_out, "ffn_moe_out", il); - - // Shared expert (if present) - if (hparams.n_ff_shexp > 0) { - ggml_tensor * ffn_shexp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(ffn_shexp, "ffn_shexp", il); - - cur = ggml_add(ctx0, moe_out, ffn_shexp); - } else { - cur = moe_out; - } - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_falcon_h1 : public llm_graph_context_mamba { - llm_build_falcon_h1(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - // Build the inputs in the recurrent & kv cache - auto * inp = build_inp_mem_hybrid(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, hparams.rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, hparams.rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur-post-rope", il); - cb(Kcur, "Kcur-post-rope", il); - cb(Vcur, "Vcur-post-rope", il); - - ggml_tensor * attn_out = build_attn(inp->get_attn(), - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(attn_out, "attn_out", il); - - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - // Mamba2 layer - cb(cur, "ssm_in", il); - - ggml_tensor * ssm_out = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); - cb(ssm_out, "ssm_out", il); - - // // Aggregation - cur = ggml_add(ctx0, attn_out, ssm_out); - inpSA = ggml_add(ctx0, cur, inpSA); - cb(cur, "layer_out", il); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = inpSA; - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, inpSA); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_plamo2 : public llm_graph_context_mamba { - llm_build_plamo2(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - // {n_embd, n_tokens} - inpL = build_inp_embd(model.tok_embd); - cb(inpL, "embedding_output", -1); - - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_hybrid = build_inp_mem_hybrid(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * residual = inpL; - - // ggml_graph_add_node(gf, model.layers[il].attn_norm); - // cb(model.layers[il].attn_norm, "attn_norm", il); - - // pre_mixer_norm - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - - // check if this layer is Mamba or Attention - bool is_mamba_layer = hparams.is_recurrent(il); - - if (is_mamba_layer) { - // PLaMo-2 Mamba layer - cur = build_plamo2_mamba_layer(inp_hybrid->get_recr(), cur, model, ubatch, il); - } else { - // PLaMo-2 Attention layer - cur = build_plamo2_attn_layer(inp_hybrid->get_attn(), inp_pos, cur, model, il); - } - - // post_mixer_norm - cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - // residual connection - cur = ggml_add(ctx0, cur, residual); - cb(cur, "attn_residual", il); - residual = cur; - - // pre-ffn norm - cur = build_norm(cur, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_pre_norm", il); - - // feed-forward network - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - // post ffn norm - cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_post_norm", il); - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - residual = ggml_get_rows(ctx0, residual, inp_out_ids); - } - - // residual connection - cur = ggml_add(ctx0, cur, residual); - cb(cur, "ffn_residual", il); - - inpL = cur; - } - - cur = inpL; - - // final norm - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - cb(cur, "result_norm", -1); - - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - - // Explicitly mark as output tensor to ensure proper backend assignment - ggml_set_output(cur); - - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - -private: - ggml_tensor * build_plamo2_attn_layer( - llm_graph_input_attn_kv * inp, - ggml_tensor * inp_pos, - ggml_tensor * cur, - const llama_model & model, - int il) { - - // self-attention - { - // PLaMo-2 uses combined QKV tensor - ggml_tensor * qkv = build_lora_mm(model.layers[il].wqkv, cur); - cb(qkv, "wqkv", il); - - // split QKV tensor into Q, K, V - const int64_t n_embd_head_q = hparams.n_embd_head_k; - const int64_t n_embd_head_k = hparams.n_embd_head_k; - const int64_t n_embd_head_v = hparams.n_embd_head_v; - int32_t n_head = hparams.n_head(il); - int32_t n_head_kv = hparams.n_head_kv(il); - - const int64_t q_offset = 0; - const int64_t k_offset = n_embd_head_q * n_head; - const int64_t v_offset = k_offset + n_embd_head_k * n_head_kv; - - ggml_tensor * Qcur = ggml_view_3d(ctx0, qkv, n_embd_head_q, n_head, n_tokens, n_embd_head_q * sizeof(float), qkv->nb[1], q_offset * ggml_element_size(qkv)); - ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, n_embd_head_k, n_head_kv, n_tokens, n_embd_head_k * sizeof(float), qkv->nb[1], k_offset * ggml_element_size(qkv)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, n_embd_head_v, n_head_kv, n_tokens, n_embd_head_v * sizeof(float), qkv->nb[1], v_offset * ggml_element_size(qkv)); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cur = build_attn(inp, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, NULL, NULL, NULL, 1.0f/sqrtf(float(n_embd_head_v)), il); - } - - cb(cur, "attn_out", il); - - return cur; - } - - ggml_tensor * build_plamo2_mamba_layer( - llm_graph_input_rs * inp, - ggml_tensor * cur, - const llama_model & model, - const llama_ubatch & ubatch, - int il) { - - const auto * mctx_cur = inp->mctx; - - const auto kv_head = mctx_cur->get_head(); - - const int64_t d_conv = hparams.ssm_d_conv; - const int64_t d_inner = hparams.ssm_d_inner; - const int64_t d_state = hparams.ssm_d_state; - const int64_t n_heads = hparams.ssm_dt_rank; - const int64_t head_dim = d_inner / n_heads; - const int64_t n_group = hparams.ssm_n_group; - const int64_t n_seqs = ubatch.n_seqs; - - const int64_t n_seq_tokens = ubatch.n_seq_tokens; - - GGML_ASSERT(n_seqs != 0); - GGML_ASSERT(ubatch.equal_seqs()); - GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); - - ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); - ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); - - ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); - conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner + 2*n_group*d_state, n_seqs); - - // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} - cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); - - // in_proj: {n_embd, 2*d_inner} @ {n_embd, n_seq_tokens, n_seqs} => {2*d_inner, n_seq_tokens, n_seqs} - ggml_tensor * zx = build_lora_mm(model.layers[il].ssm_in, cur); - cb(zx, "mamba_in_proj", il); - // {8192, 5, 1, 1} -> {8192, 1, 5, 1} - zx = ggml_permute(ctx0, zx, 0, 2, 1, 3); - zx = ggml_cont_4d(ctx0, zx, head_dim * 2, n_heads, n_seq_tokens, n_seqs); - cb(zx, "mamba_in_proj_out", il); - - // split into z and x - // => {head_dim * n_heads, n_seq_tokens, n_seqs} - ggml_tensor * x = ggml_view_4d(ctx0, zx, head_dim, n_heads, n_seq_tokens, n_seqs, zx->nb[1], zx->nb[2], zx->nb[3], head_dim*ggml_element_size(zx)); - x = ggml_cont_3d(ctx0, x, head_dim * n_heads, n_seq_tokens, n_seqs); - // x = ggml_permute(ctx0, x, 0, 2, 1, 3); - cb(x, "mamba_x_split", il); - - ggml_tensor * z = ggml_view_4d(ctx0, zx, head_dim, n_heads, n_seq_tokens, n_seqs, zx->nb[1], zx->nb[2], zx->nb[3], 0); - cb(z, "mamba_z_split", il); - - // conv1d - { - // => {d_conv - 1 + n_seq_tokens, d_inner, n_seqs} - ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, x), 0); - cb(conv_x, "mamba_conv1d_input", il); - - // copy last (d_conv - 1) columns back into the state cache - ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner, n_seqs, - conv_x->nb[1], conv_x->nb[2], n_seq_tokens*(conv_x->nb[0])); - - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, last_conv, - ggml_view_1d(ctx0, conv_states_all, - (d_conv - 1)*(d_inner + 2*n_group*d_state)*(n_seqs), - kv_head*(d_conv - 1)*(d_inner + 2*n_group*d_state)*ggml_element_size(conv_states_all)))); - cb(conv_states_all, "mamba_conv1d_state", il); - - // 1D convolution - x = ggml_ssm_conv(ctx0, conv_x, model.layers[il].ssm_conv1d); - cb(x, "mamba_conv1d", il); - - x = ggml_silu(ctx0, x); - cb(x, "mamba_conv1d_silu", il); - } - - // SSM - { - // bcdt_proj: {d_inner, dt_rank + 2*d_state} @ {d_inner, n_seq_tokens, n_seqs} => {dt_rank + 2*d_state, n_seq_tokens, n_seqs} - ggml_tensor * x_bcdt = build_lora_mm(model.layers[il].ssm_x, x); - cb(x_bcdt, "mamba_bcdt_proj", il); - - // split into dt, B, C - const int64_t dt_dim = std::max(64, int(hparams.n_embd / 16)); - ggml_tensor * B = ggml_view_3d(ctx0, x_bcdt, d_state, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], 0); - ggml_tensor * C = ggml_view_3d(ctx0, x_bcdt, d_state, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], ggml_element_size(x_bcdt)*d_state); - ggml_tensor * dt = ggml_view_3d(ctx0, x_bcdt, dt_dim, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], ggml_element_size(x_bcdt)*(2*d_state)); - cb(B, "mamba_B_raw", il); - cb(C, "mamba_C_raw", il); - cb(dt, "mamba_dt_raw", il); - - // Apply RMS norm to dt, B, C (PLaMo-2 specific) - B = build_norm(B, model.layers[il].ssm_b_norm, NULL, LLM_NORM_RMS, il); - C = build_norm(C, model.layers[il].ssm_c_norm, NULL, LLM_NORM_RMS, il); - dt = build_norm(dt, model.layers[il].ssm_dt_norm, NULL, LLM_NORM_RMS, il); - cb(B, "mamba_B_normed", il); - cb(C, "mamba_C_normed", il); - cb(dt, "mamba_dt_normed", il); - - // dt_proj: {dt_rank, d_inner} @ {dt_rank, n_seq_tokens, n_seqs} => {d_inner, n_seq_tokens, n_seqs} - dt = build_lora_mm(model.layers[il].ssm_dt, dt); - dt = ggml_add(ctx0, dt, model.layers[il].ssm_dt_b); - cb(dt, "mamba_dt_proj", il); - - ggml_tensor * A = ggml_reshape_2d(ctx0, model.layers[il].ssm_a, 1, n_heads); - cb(A, "mamba_A", il); - - x = ggml_view_4d(ctx0, x, head_dim, n_heads, n_seq_tokens, n_seqs, head_dim * ggml_element_size(x), head_dim * n_heads * ggml_element_size(x), head_dim * n_heads * n_seq_tokens * ggml_element_size(x), 0); - B = ggml_view_4d(ctx0, B, d_state, 1, n_seq_tokens, n_seqs, d_state * B->nb[0], B->nb[1], B->nb[2], 0); - C = ggml_view_4d(ctx0, C, d_state, 1, n_seq_tokens, n_seqs, d_state * C->nb[0], C->nb[1], C->nb[2], 0); - - // use the states and the indices provided by build_recurrent_state - // (this is necessary in order to properly use the states before they are overwritten, - // while avoiding to make unnecessary copies of the states) - auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { - ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_heads, mctx_cur->get_size()); - - // Custom operator to optimize the parallel associative scan - // as described in the Annex D of the Mamba paper. - // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} - return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); - }; - - ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); - cb(y_ssm, "mamba_ssm_scan", il); - - // store last states - ggml_build_forward_expand(gf, - ggml_cpy(ctx0, - ggml_view_1d(ctx0, y_ssm, n_heads*head_dim*d_state*n_seqs, n_heads*head_dim*n_seq_tokens*n_seqs*ggml_element_size(y_ssm)), - ggml_view_1d(ctx0, ssm_states_all, n_heads*head_dim*d_state*n_seqs, kv_head*n_seqs*n_heads*head_dim*d_state*ggml_element_size(ssm_states_all)))); - cb(ssm_states_all, "mamba_ssm_states", il); - - ggml_tensor * y = ggml_view_4d(ctx0, y_ssm, head_dim, n_heads, n_seq_tokens, n_seqs, head_dim * ggml_element_size(x), head_dim * n_heads * ggml_element_size(x), head_dim * n_heads * n_seq_tokens * ggml_element_size(x), 0); - cb(y, "mamba_y_view", il); - - // Add D parameter and apply gating with z - // {d_inner, n_seq_tokens, n_seqs} * {d_inner} => {d_inner, n_seq_tokens, n_seqs} - ggml_tensor * D = ggml_reshape_2d(ctx0, model.layers[il].ssm_d, 1, n_heads); - y = ggml_add(ctx0, y, ggml_mul(ctx0, x, D)); - cb(y, "mamba_y_add_d", il); - - y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); - cb(y, "mamba_y_swiglu_z", il); - - // out_proj: {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} - y = ggml_view_3d(ctx0, y, head_dim * n_heads, n_seq_tokens, n_seqs, y->nb[2], y->nb[3], 0); - cur = build_lora_mm(model.layers[il].ssm_out, y); - cb(cur, "mamba_out_proj", il); - } - - // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} - cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); - cb(cur, "mamba_out", il); - - return cur; - } -}; - -struct llm_build_arcee : public llm_graph_context { - llm_build_arcee(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - // ARCEE uses relu^2 instead of silu - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - NULL, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_hunyuan_moe : public llm_graph_context { - llm_build_hunyuan_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = 1.0f / sqrtf(float(n_embd_head)); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, nullptr, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur_norm", il); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, nullptr, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur_norm", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // feed-forward network (non-MoE) - ggml_tensor * cur_mlp = build_ffn(cur, - model.layers[il].ffn_up_shexp, NULL, NULL, - model.layers[il].ffn_gate_shexp, NULL, NULL, - model.layers[il].ffn_down_shexp, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur_mlp, "ffn_mlp", il); - - // MoE branch - ggml_tensor * cur_moe = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, - true, // norm_topk_prob - false, - 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il); - cb(cur_moe, "ffn_moe_out", il); - - ggml_tensor * ffn_out = ggml_add(ctx0, cur_moe, cur_mlp); - cb(ffn_out, "ffn_out", il); - - cur = ggml_add(ctx0, ffn_out, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_hunyuan_dense : public llm_graph_context { - llm_build_hunyuan_dense(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = 1.0f / sqrtf(float(n_embd_head)); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - // self-attention - { - // rope freq factors for llama3; may return nullptr for llama2 and other models - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, - model.layers[il].attn_k_norm, nullptr, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur_norm", il); - - Qcur = build_norm(Qcur, - model.layers[il].attn_q_norm, nullptr, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur_norm", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - // feed-forward network (non-MoE) - ggml_tensor * cur_mlp = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur_mlp, "ffn_out", il); - - cur = ggml_add(ctx0, cur_mlp, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_smollm3 : public llm_graph_context { - llm_build_smollm3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - const bool use_rope = (il + 1) % hparams.n_no_rope_layer_step != 0; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (use_rope) { - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, - model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, - model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_openai_moe_iswa : public llm_graph_context { - llm_build_openai_moe_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv_iswa(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, nullptr, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_rot, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_rot, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_rot, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, model.layers[il].attn_sinks, nullptr, 1.0f/sqrtf(float(n_rot)), il); - - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1) { - // skip computing output for unused tokens - ggml_tensor * inp_out_ids = build_inp_out_ids(); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = ffn_inp; - cur = build_norm(cur, - model.layers[il].attn_post_norm, nullptr, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - // MoE branch - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, model.layers[il].ffn_gate_inp_b, - model.layers[il].ffn_up_exps, model.layers[il].ffn_up_exps_b, - model.layers[il].ffn_gate_exps, model.layers[il].ffn_gate_exps_b, - model.layers[il].ffn_down_exps, model.layers[il].ffn_down_exps_b, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SWIGLU_OAI_MOE, false, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX_WEIGHT, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_lfm2 : public llm_graph_context { - const llama_model & model; - - llm_build_lfm2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params), model(model) { - - ggml_tensor * cur = build_inp_embd(model.tok_embd); - cb(cur, "model.embed_tokens", -1); - - ggml_tensor * inp_pos = build_inp_pos(); - auto * inp_hybrid = build_inp_mem_hybrid(); - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - const bool is_moe_layer = il >= static_cast(hparams.n_layer_dense_lead); - - auto * prev_cur = cur; - cur = build_norm(cur, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "model.layers.{}.operator_norm", il); - - cur = hparams.is_recurrent(il) ? - build_shortconv_block(cur, inp_hybrid->get_recr(), il) : - build_attn_block(cur, inp_pos, inp_hybrid->get_attn(), il) ; - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - prev_cur = ggml_get_rows(ctx0, prev_cur, inp_out_ids); - } - - cur = ggml_add(ctx0, prev_cur, cur); - - auto * ffn_norm_out = build_norm(cur, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(ffn_norm_out, "model.layers.{}.ffn_norm", il); - - ggml_tensor * ffn_out = is_moe_layer ? - build_moe_feed_forward(ffn_norm_out, il) : - build_dense_feed_forward(ffn_norm_out, il); - cb(ffn_norm_out, "model.layers.{}.ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_out); - } - - cur = build_norm(cur, model.tok_norm, NULL, LLM_NORM_RMS, -1); - cb(cur, "model.embedding_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - cb(cur, "lm_head", -1); - - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } - - ggml_tensor * build_moe_feed_forward(ggml_tensor * cur, - int il) const { - return build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - static_cast(hparams.expert_gating_func), - il); - } - - ggml_tensor * build_dense_feed_forward(ggml_tensor * cur, - int il) const { - GGML_ASSERT(!model.layers[il].ffn_up_b); - GGML_ASSERT(!model.layers[il].ffn_gate_b); - GGML_ASSERT(!model.layers[il].ffn_down_b); - return build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - } - - ggml_tensor * build_attn_block(ggml_tensor * cur, - ggml_tensor * inp_pos, - llm_graph_input_attn_kv * inp_attn, - int il) const { - GGML_ASSERT(hparams.n_embd_v_gqa(il) == hparams.n_embd_k_gqa(il)); - auto const n_embd_head = hparams.n_embd_head_v; - auto const n_head_kv = hparams.n_head_kv(il); - - auto * q = build_lora_mm(model.layers[il].wq, cur); - cb(q, "model.layers.{}.self_attn.q_proj", il); - auto * k = build_lora_mm(model.layers[il].wk, cur); - cb(k, "model.layers.{}.self_attn.k_proj", il); - auto * v = build_lora_mm(model.layers[il].wv, cur); - cb(v, "model.layers.{}.self_attn.v_proj", il); - - q = ggml_reshape_3d(ctx0, q, n_embd_head, n_head, n_tokens); - k = ggml_reshape_3d(ctx0, k, n_embd_head, n_head_kv, n_tokens); - v = ggml_reshape_3d(ctx0, v, n_embd_head, n_head_kv, n_tokens); - - // qk norm - q = build_norm(q, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(q, "model.layers.{}.self_attn.q_layernorm", il); - k = build_norm(k, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(k, "model.layers.{}.self_attn.k_layernorm", il); - - // RoPE - q = ggml_rope_ext( - ctx0, q, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - k = ggml_rope_ext( - ctx0, k, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cur = build_attn(inp_attn, model.layers[il].wo, NULL, - q, k, v, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - - cb(cur, "model.layers.{}.self_attn.out_proj", il); - - return cur; - } - - ggml_tensor * build_shortconv_block(ggml_tensor * cur, - llm_graph_input_rs * inp_recr, - int il) { - const auto * mctx_cur = static_cast(mctx)->get_recr(); - const uint32_t kv_head = mctx_cur->get_head(); - const int64_t n_seq_tokens = ubatch.n_seq_tokens; - const int64_t n_seqs = ubatch.n_seqs; - GGML_ASSERT(n_seqs != 0); - GGML_ASSERT(ubatch.equal_seqs()); - GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); - - GGML_ASSERT(hparams.n_shortconv_l_cache > 1); - const uint32_t d_conv = hparams.n_shortconv_l_cache - 1; - - // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} - cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); - - auto * bcx = build_lora_mm(model.layers[il].shortconv.in_proj, cur); - cb(bcx, "model.layers.{}.conv.in_proj", il); - - constexpr auto n_chunks = 3; - GGML_ASSERT(bcx->ne[0] % n_chunks == 0); - auto const chunk_size = bcx->ne[0] / n_chunks; - auto * b = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], 0*chunk_size*ggml_element_size(bcx)); - auto * c = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], 1*chunk_size*ggml_element_size(bcx)); - auto * x = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], 2*chunk_size*ggml_element_size(bcx)); - - auto * bx = ggml_transpose(ctx0, ggml_mul(ctx0, b, x)); - - // read conv state - auto * conv_state = mctx_cur->get_r_l(il); - auto * conv_rs = build_rs(inp_recr, conv_state, hparams.n_embd_r(), n_seqs); - auto * conv = ggml_reshape_3d(ctx0, conv_rs, d_conv, hparams.n_embd, n_seqs); - - bx = ggml_concat(ctx0, conv, bx, 0); - GGML_ASSERT(bx->ne[0] > conv->ne[0]); - - // last d_conv columns is a new conv state - auto * new_conv = ggml_view_3d(ctx0, bx, conv->ne[0], bx->ne[1], bx->ne[2], bx->nb[1], bx->nb[2], (bx->ne[0] - conv->ne[0])*ggml_element_size(bx)); - GGML_ASSERT(ggml_are_same_shape(conv, new_conv)); - - // write new conv conv state - ggml_build_forward_expand( - gf, - ggml_cpy( - ctx0, - new_conv, - ggml_view_1d( - ctx0, - conv_state, - ggml_nelements(new_conv), - kv_head*d_conv*n_embd*ggml_element_size(new_conv) - ) - ) - ); - - auto * conv_kernel = model.layers[il].shortconv.conv; - auto * conv_out = ggml_ssm_conv(ctx0, bx, conv_kernel); - cb(conv_out, "model.layers.{}.conv.conv", il); - - auto * y = ggml_mul(ctx0, c, conv_out); - y = build_lora_mm(model.layers[il].shortconv.out_proj, y); - cb(y, "model.layers.{}.conv.out_proj", il); - // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} - y = ggml_reshape_2d(ctx0, y, y->ne[0], n_seq_tokens * n_seqs); - - return y; - } -}; - -struct llm_build_seed_oss : public llm_graph_context { - llm_build_seed_oss(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - if (model.layers[il].bq) { - Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); - cb(Qcur, "Qcur", il); - } - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - if (model.layers[il].bk) { - Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); - cb(Kcur, "Kcur", il); - } - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - if (model.layers[il].bv) { - Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); - cb(Vcur, "Vcur", il); - } - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network - cur = build_norm(ffn_inp, - model.layers[il].attn_post_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_post_norm", il); - - cur = build_ffn(cur, - model.layers[il].ffn_up, NULL, NULL, - model.layers[il].ffn_gate, NULL, NULL, - model.layers[il].ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - cb(cur, "ffn_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -template -struct llm_build_smallthinker : public llm_graph_context{ - llm_build_smallthinker(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params){ - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - using inp_attn_type = std::conditional_t; - inp_attn_type * inp_attn = nullptr; - - if constexpr (iswa) { - inp_attn = build_attn_inp_kv_iswa(); - } else { - inp_attn = build_attn_inp_kv(); - } - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - ggml_tensor * probs = nullptr; - - probs = build_lora_mm(model.layers[il].ffn_gate_inp, inpL); // [n_expert, n_tokens] - cb(probs, "ffn_moe_logits", il); - - // norm - cur = build_norm(inpL,model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - struct ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - struct ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - struct ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - if (hparams.n_no_rope_layer_step == n_layer || il % hparams.n_no_rope_layer_step != 0) { - Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - - Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow); - } - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - probs = ggml_get_rows(ctx0, probs, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * ffn_out = - build_moe_ffn(cur, - nullptr, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_RELU, true, - false, 0.0, - static_cast(hparams.expert_gating_func), - il, probs); - - cb(ffn_out, "ffn_out", il); - cur = ffn_out; - - cur = ggml_add(ctx0, cur, ffn_inp); - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_grovemoe : public llm_graph_context { - llm_build_grovemoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - const int64_t n_chunk_expert = n_expert / hparams.n_group_experts; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - // inp_pos - contains the positions - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - // norm - cur = build_norm(inpL, - model.layers[il].attn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self_attention - { - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - ggml_tensor * probs = build_lora_mm(model.layers[il].ffn_gate_inp, cur); // [n_expert, n_tokens] - cb(probs, "ffn_moe_logits", il); - - ggml_tensor * moe_out = - build_moe_ffn(cur, - nullptr, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - nullptr, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il, probs); - cb(moe_out, "ffn_moe_out", il); - cur = moe_out; - - // TODO: Only do the expert selection and weights once - moe_out = - build_moe_ffn(cur, - nullptr, - model.layers[il].ffn_up_chexps, - model.layers[il].ffn_gate_chexps, - model.layers[il].ffn_down_chexps, - nullptr, - n_chunk_expert, n_expert_used > n_chunk_expert ? n_chunk_expert : n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, - il, probs); - cb(moe_out, "ffn_adj_moe_out", il); - - cur = ggml_add(ctx0, cur, ggml_scale(ctx0, moe_out, hparams.expert_group_scale)); - cb(cur, "ffn_final_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_apertus : public llm_graph_context { - llm_build_apertus(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * inp_pos = build_inp_pos(); - auto * inp_attn = build_attn_inp_kv(); - - const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; - - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = build_norm(inpL, - model.layers[il].attn_norm, nullptr, - LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // self-attention - { - ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, rope_factors, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur_pos", il); - cb(Kcur, "Kcur_pos", il); - cb(Vcur, "Vcur_pos", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, model.layers[il].bo, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // feed-forward network with xIELU activation - { - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, nullptr, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - // Up projection - ggml_tensor * up = build_lora_mm(model.layers[il].ffn_up, cur); - cb(up, "ffn_up", il); - - float alpha_n_val = hparams.xielu_alpha_n[il]; - float alpha_p_val = hparams.xielu_alpha_p[il]; - float beta_val = hparams.xielu_beta[il]; - float eps_val = hparams.xielu_eps[il]; - - // Apply xIELU activation - ggml_tensor * activated = ggml_xielu(ctx0, up, alpha_n_val, alpha_p_val, beta_val, eps_val); - cb(activated, "ffn_xielu", il); - - // Down projection - cur = build_lora_mm(model.layers[il].ffn_down, activated); - cb(cur, "ffn_down", il); - } - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, nullptr, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_minimax_m2 : public llm_graph_context { - llm_build_minimax_m2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - // GGML_ASSERT(n_embd_head == hparams.n_rot); this is wrong in case of minimax, head_dim = 128, n_rot = 64 - - ggml_tensor * cur; - ggml_tensor * inpL; - - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * inp_pos = build_inp_pos(); - auto inp_attn = build_attn_inp_kv(); - ggml_tensor * inp_out_ids = build_inp_out_ids(); - - for (int il = 0; il < n_layer; ++il) { - ggml_tensor * inpSA = inpL; - - cur = inpL; - - // self_attention - { - cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "attn_norm", il); - - // compute Q and K and RoPE them - ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); - cb(Qcur, "Qcur", il); - - ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); - cb(Kcur, "Kcur", il); - - ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); - cb(Vcur, "Vcur", il); - - Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, - LLM_NORM_RMS, il); - cb(Qcur, "Qcur_normed", il); - - Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, - LLM_NORM_RMS, il); - cb(Kcur, "Kcur_normed", il); - - Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); - Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); - Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); - - Qcur = ggml_rope_ext( - ctx0, Qcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - Kcur = ggml_rope_ext( - ctx0, Kcur, inp_pos, nullptr, - n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, - ext_factor, attn_factor, beta_fast, beta_slow - ); - - cb(Qcur, "Qcur", il); - cb(Kcur, "Kcur", il); - cb(Vcur, "Vcur", il); - - cur = build_attn(inp_attn, - model.layers[il].wo, NULL, - Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); - } - - if (il == n_layer - 1 && inp_out_ids) { - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - // MoE branch - cur = build_norm(ffn_inp, - model.layers[il].ffn_norm, NULL, - LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_moe_ffn(cur, - model.layers[il].ffn_gate_inp, - model.layers[il].ffn_up_exps, - model.layers[il].ffn_gate_exps, - model.layers[il].ffn_down_exps, - model.layers[il].ffn_exp_probs_b, - n_expert, n_expert_used, - LLM_FFN_SILU, true, - false, 0.0, - (llama_expert_gating_func_type) hparams.expert_gating_func, - il); - cb(cur, "ffn_moe_out", il); - - cur = ggml_add(ctx0, cur, ffn_inp); - - cur = build_cvec(cur, il); - cb(cur, "l_out", il); - - // input for next layer - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, - model.output_norm, NULL, - LLM_NORM_RMS, -1); - - cb(cur, "result_norm", -1); - res->t_embd = cur; - - // lm_head - cur = build_lora_mm(model.output, cur); - - cb(cur, "result_output", -1); - res->t_logits = cur; - - ggml_build_forward_expand(gf, cur); - } -}; - -struct llm_build_cogvlm : public llm_graph_context { - llm_build_cogvlm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { - const int64_t n_embd_head = hparams.n_embd_head_v; - float kq_scale = 1.0f / sqrtf(float(n_embd_head)); - - GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); - GGML_ASSERT(n_embd_head == hparams.n_rot); - - ggml_tensor * inpL, * cur; - inpL = build_inp_embd(model.tok_embd); - - ggml_tensor * inp_pos = build_inp_pos(); - - auto * inp_attn = build_attn_inp_kv(); - - // check ubatch to see if we have input tokens (text) - // or an input embedding vector (image) - bool is_text; - if (ubatch.token) { - is_text = true; - } else { - is_text = false; - } - - for (int il = 0; il < n_layer; ++il) { - // get either the text or image weight tensors - ggml_tensor * wqkv, * wo; - ggml_tensor * ffn_gate, * ffn_down, * ffn_up; - - if (is_text) { - wqkv = model.layers[il].wqkv; - wo = model.layers[il].wo; - ffn_gate = model.layers[il].ffn_gate; - ffn_down = model.layers[il].ffn_down; - ffn_up = model.layers[il].ffn_up; - } else { - wqkv = model.layers[il].visexp_attn_wqkv; - wo = model.layers[il].visexp_attn_wo; - ffn_gate = model.layers[il].visexp_ffn_gate; - ffn_down = model.layers[il].visexp_ffn_down; - ffn_up = model.layers[il].visexp_ffn_up; - } - - ggml_tensor * inpSA = inpL; - cur = build_norm(inpSA, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); - - // build self attention - { - ggml_tensor * qkv = build_lora_mm(wqkv, cur); - - // split qkv into Q, K, V along the first dimension - ggml_tensor * Qcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), - qkv->nb[1], 0); - ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), - qkv->nb[1], n_embd * ggml_element_size(qkv)); - ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), - qkv->nb[1], 2 * n_embd * ggml_element_size(qkv)); - - Qcur = ggml_rope(ctx0, Qcur, inp_pos, n_embd_head, rope_type); - Kcur = ggml_rope(ctx0, Kcur, inp_pos, n_embd_head, rope_type); - - cur = build_attn(inp_attn, wo, nullptr, Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); - cb(cur, "attn_out", il); - } - - ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); - cb(ffn_inp, "ffn_inp", il); - - cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); - cb(cur, "ffn_norm", il); - - cur = build_ffn(cur, - ffn_up, NULL, NULL, - ffn_gate, NULL, NULL, - ffn_down, NULL, NULL, - NULL, - LLM_FFN_SILU, LLM_FFN_PAR, il); - - cur = ggml_add(ctx0, cur, ffn_inp); - cb(cur, "ffn_out", il); - - inpL = cur; - } - - cur = inpL; - - cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); - cb(cur, "result_norm", -1); - res->t_embd = cur; - - cur = build_lora_mm(model.output, cur); - cb(cur, "result_output", -1); - res->t_logits = cur; - ggml_build_forward_expand(gf, cur); - - } -}; - llama_memory_i * llama_model::create_memory(const llama_memory_params & params, const llama_cparams & cparams) const { llama_memory_i * res; diff --git a/src/models/apertus.cpp b/src/models/apertus.cpp new file mode 100644 index 00000000000..9af19c1bfe8 --- /dev/null +++ b/src/models/apertus.cpp @@ -0,0 +1,125 @@ +#include "models.h" + + + +llm_build_apertus::llm_build_apertus(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * inp_pos = build_inp_pos(); + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, model.layers[il].attn_norm, nullptr, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur_pos", il); + cb(Kcur, "Kcur_pos", il); + cb(Vcur, "Vcur_pos", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network with xIELU activation + { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, nullptr, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // Up projection + ggml_tensor * up = build_lora_mm(model.layers[il].ffn_up, cur); + cb(up, "ffn_up", il); + + float alpha_n_val = hparams.xielu_alpha_n[il]; + float alpha_p_val = hparams.xielu_alpha_p[il]; + float beta_val = hparams.xielu_beta[il]; + float eps_val = hparams.xielu_eps[il]; + + // Apply xIELU activation + ggml_tensor * activated = ggml_xielu(ctx0, up, alpha_n_val, alpha_p_val, beta_val, eps_val); + cb(activated, "ffn_xielu", il); + + // Down projection + cur = build_lora_mm(model.layers[il].ffn_down, activated); + cb(cur, "ffn_down", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, nullptr, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/arcee.cpp b/src/models/arcee.cpp new file mode 100644 index 00000000000..aa6167dba1e --- /dev/null +++ b/src/models/arcee.cpp @@ -0,0 +1,135 @@ +#include "models.h" + + +llm_build_arcee::llm_build_arcee(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + // ARCEE uses relu^2 instead of silu + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/arctic.cpp b/src/models/arctic.cpp new file mode 100644 index 00000000000..e8f028a723e --- /dev/null +++ b/src/models/arctic.cpp @@ -0,0 +1,138 @@ +#include "models.h" + + +llm_build_arctic::llm_build_arctic(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + ggml_tensor * ffn_out = ggml_add(ctx0, cur, ffn_inp); + cb(ffn_out, "ffn_out", il); + + // MoE + cur = build_norm(inpSA, + model.layers[il].ffn_norm_exps, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm_exps", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_out); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/arwkv7.cpp b/src/models/arwkv7.cpp new file mode 100644 index 00000000000..107a3bef8da --- /dev/null +++ b/src/models/arwkv7.cpp @@ -0,0 +1,86 @@ +#include "models.h" + + +llm_build_arwkv7::llm_build_arwkv7(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv7_base(model, params) { + GGML_ASSERT(n_embd == hparams.n_embd_r()); + + ggml_tensor * cur; + ggml_tensor * inpL; + ggml_tensor * v_first = nullptr; + + inpL = build_inp_embd(model.tok_embd); + + auto * rs_inp = build_rs_inp(); + + const auto n_embd = hparams.n_embd; + const auto n_seq_tokens = ubatch.n_seq_tokens; + const auto n_seqs = ubatch.n_seqs; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const llama_layer * layer = &model.layers[il]; + inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); + + ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); + + ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM_RMS, il); + cb(att_norm, "attn_norm", il); + + ggml_tensor * x_prev = ggml_concat( + ctx0, + token_shift, + ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), + 1 + ); + + cur = build_rwkv7_time_mix(rs_inp, att_norm, x_prev, v_first, ubatch, il); + + token_shift = ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)); + ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + } + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/baichuan.cpp b/src/models/baichuan.cpp new file mode 100644 index 00000000000..c04b0c98b0b --- /dev/null +++ b/src/models/baichuan.cpp @@ -0,0 +1,122 @@ +#include "models.h" + + +llm_build_baichuan::llm_build_baichuan(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = model.type == LLM_TYPE_7B ? build_inp_pos() : nullptr; + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + switch (model.type) { + case LLM_TYPE_7B: + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + break; + case LLM_TYPE_13B: + break; + default: + GGML_ABORT("fatal error"); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/bailingmoe.cpp b/src/models/bailingmoe.cpp new file mode 100644 index 00000000000..ed56b9c4713 --- /dev/null +++ b/src/models/bailingmoe.cpp @@ -0,0 +1,144 @@ +#include "models.h" + + +llm_build_bailingmoe::llm_build_bailingmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_rot, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_rot, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_rot, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_rot)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, hparams.expert_weights_norm, + false, hparams.expert_weights_scale, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // FFN shared expert + { + ggml_tensor * ffn_shexp = build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/bailingmoe2.cpp b/src/models/bailingmoe2.cpp new file mode 100644 index 00000000000..fbf7b210c42 --- /dev/null +++ b/src/models/bailingmoe2.cpp @@ -0,0 +1,135 @@ +#include "models.h" + + + +llm_build_bailingmoe2::llm_build_bailingmoe2(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + const int n_transformer_layers = n_layer - hparams.nextn_predict_layers; + for (int il = 0; il < n_transformer_layers; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 0 * sizeof(float) * (n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + + if (il == n_transformer_layers - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * sa_out = ggml_add(ctx0, cur, inpSA); + cb(sa_out, "sa_out", il); + + // MoE branch + cur = build_norm(sa_out, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + if (static_cast(il) < hparams.n_layer_dense_lead) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, hparams.expert_weights_norm, + true, hparams.expert_weights_scale, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(moe_out, "ffn_moe_out", il); + + { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } + } + + cur = ggml_add(ctx0, cur, sa_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/bert.cpp b/src/models/bert.cpp new file mode 100644 index 00000000000..3274fa3b99d --- /dev/null +++ b/src/models/bert.cpp @@ -0,0 +1,176 @@ +#include "models.h" + + + +llm_build_bert::llm_build_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + ggml_tensor * inp_pos = nullptr; + + if (model.arch != LLM_ARCH_JINA_BERT_V2) { + inp_pos = build_inp_pos(); + } + + // construct input embeddings (token, type, position) + inpL = build_inp_embd(model.tok_embd); + + // token types are hardcoded to zero ("Sentence A") + if (model.type_embd) { + ggml_tensor * type_row0 = ggml_view_1d(ctx0, model.type_embd, n_embd, 0); + inpL = ggml_add(ctx0, inpL, type_row0); + } + if (model.arch == LLM_ARCH_BERT) { + inpL = ggml_add(ctx0, ggml_get_rows(ctx0, model.pos_embd, inp_pos), inpL); + } + cb(inpL, "inp_embd", -1); + + // embed layer norm + inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); + cb(inpL, "inp_norm", -1); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * cur = inpL; + + { + ggml_tensor * Qcur; + ggml_tensor * Kcur; + ggml_tensor * Vcur; + + // self-attention + if (model.layers[il].wqkv) { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + if (model.layers[il].bqkv) { + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + } + + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), cur->nb[1], + 0 * sizeof(float) * (n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); + } else { + Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, cur), model.layers[il].bq); + Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, cur), model.layers[il].bk); + Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, cur), model.layers[il].bv); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + } + + if (model.layers[il].attn_q_norm) { + Qcur = ggml_reshape_2d(ctx0, Qcur, n_embd_head * n_head, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, model.layers[il].attn_q_norm_b, LLM_NORM, il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + } + + if (model.layers[il].attn_k_norm) { + Kcur = ggml_reshape_2d(ctx0, Kcur, n_embd_head * n_head_kv, n_tokens); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, model.layers[il].attn_k_norm_b, LLM_NORM, il); + + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + } + + // RoPE + if (model.arch == LLM_ARCH_NOMIC_BERT || model.arch == LLM_ARCH_NOMIC_BERT_MOE || + model.arch == LLM_ARCH_JINA_BERT_V3) { + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + cb(cur, "kqv_out", il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // re-add the layer input + cur = ggml_add(ctx0, cur, inpL); + + // attention layer norm + cur = build_norm(cur, model.layers[il].attn_out_norm, model.layers[il].attn_out_norm_b, LLM_NORM, il); + + if (model.layers[il].attn_norm_2 != nullptr) { + cur = ggml_add(ctx0, cur, inpL); // re-add the layer input + cur = build_norm(cur, model.layers[il].attn_norm_2, model.layers[il].attn_norm_2_b, LLM_NORM, il); + } + + ggml_tensor * ffn_inp = cur; + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + if (hparams.moe_every_n_layers > 0 && il % hparams.moe_every_n_layers == 1) { + // MoE branch + cur = build_moe_ffn(cur, model.layers[il].ffn_gate_inp, model.layers[il].ffn_up_exps, nullptr, + model.layers[il].ffn_down_exps, nullptr, hparams.n_expert, hparams.n_expert_used, + LLM_FFN_GELU, false, false, 0.0f, LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, il); + cb(cur, "ffn_moe_out", il); + } else if (model.arch == LLM_ARCH_BERT || model.arch == LLM_ARCH_NOMIC_BERT_MOE || + model.arch == LLM_ARCH_JINA_BERT_V3) { + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } else if (model.arch == LLM_ARCH_JINA_BERT_V2) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, NULL, + model.layers[il].ffn_gate ? LLM_FFN_GELU : LLM_FFN_GEGLU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + + // attentions bypass the intermediate layer + cur = ggml_add(ctx0, cur, ffn_inp); + + // output layer norm + cur = build_norm(cur, model.layers[il].layer_out_norm, model.layers[il].layer_out_norm_b, LLM_NORM, il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cb(cur, "result_embd", -1); + res->t_embd = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/bitnet.cpp b/src/models/bitnet.cpp new file mode 100644 index 00000000000..331a3f11197 --- /dev/null +++ b/src/models/bitnet.cpp @@ -0,0 +1,160 @@ +#include "models.h" + + +llm_build_bitnet::llm_build_bitnet(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + if (model.layers[il].wq_scale) { + Qcur = ggml_mul(ctx0, Qcur, model.layers[il].wq_scale); + } + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + // B1.K + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + if (model.layers[il].wk_scale) { + Kcur = ggml_mul(ctx0, Kcur, model.layers[il].wk_scale); + } + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + // B1.V + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + if (model.layers[il].wv_scale) { + Vcur = ggml_mul(ctx0, Vcur, model.layers[il].wv_scale); + } + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + NULL, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + + cur = build_norm(cur, + model.layers[il].attn_sub_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_sub_norm", il); + + cur = build_lora_mm(model.layers[il].wo, cur); + if (model.layers[il].wo_scale) { + cur = ggml_mul(ctx0, cur, model.layers[il].wo_scale); + } + if (model.layers[il].bo) { + cur = ggml_add(ctx0, cur, model.layers[il].bo); + } + cb(cur, "attn_out", il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward forward + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, model.layers[il].ffn_up_scale, + model.layers[il].ffn_gate, NULL, model.layers[il].ffn_gate_scale, + NULL, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_sub_out", il); + + cur = build_norm(cur, + model.layers[il].ffn_sub_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_sub_norm", il); + + cur = build_lora_mm(model.layers[il].ffn_down, cur); + if (model.layers[il].ffn_down_scale) { + cur = ggml_mul(ctx0, cur, model.layers[il].ffn_down_scale); + } + cb(cur, "ffn_down", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + // FIXME: do not use model.tok_embd directly, duplicate as model.output + cur = build_lora_mm(model.tok_embd, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/bloom.cpp b/src/models/bloom.cpp new file mode 100644 index 00000000000..2c552d1d15e --- /dev/null +++ b/src/models/bloom.cpp @@ -0,0 +1,101 @@ +#include "models.h" + +llm_build_bloom::llm_build_bloom(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * inp_attn = build_attn_inp_kv(); + + inpL = build_norm(inpL, + model.tok_norm, + model.tok_norm_b, + LLM_NORM, -1); + cb(inpL, "inp_norm", -1); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // Add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/chameleon.cpp b/src/models/chameleon.cpp new file mode 100644 index 00000000000..184511aed4c --- /dev/null +++ b/src/models/chameleon.cpp @@ -0,0 +1,178 @@ +#include "models.h" + +#include + +llm_build_chameleon::llm_build_chameleon(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + if (hparams.swin_norm) { + cur = inpL; + } else { + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + } + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + if (model.layers[il].attn_q_norm) { + Qcur = ggml_view_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens, + ggml_element_size(Qcur) * n_embd_head, + ggml_element_size(Qcur) * n_embd_head * n_head, + 0); + cb(Qcur, "Qcur", il); + + Qcur = build_norm(Qcur, + model.layers[il].attn_q_norm, + model.layers[il].attn_q_norm_b, + LLM_NORM, il); + cb(Qcur, "Qcur", il); + } + + if (model.layers[il].attn_k_norm) { + Kcur = ggml_view_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens, + ggml_element_size(Kcur) * n_embd_head, + ggml_element_size(Kcur) * n_embd_head * n_head_kv, + 0); + cb(Kcur, "Kcur", il); + + Kcur = build_norm(Kcur, + model.layers[il].attn_k_norm, + model.layers[il].attn_k_norm_b, + LLM_NORM, il); + cb(Kcur, "Kcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, nullptr, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + if (hparams.swin_norm) { + cur = build_norm(cur, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + if (!hparams.swin_norm) { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + } + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + if (hparams.swin_norm) { + cur = build_norm(cur, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output_with_img_logits", -1); + + // TODO: this suppresses the output of image tokens, which is required to enable text-only outputs. + // Needs to be removed once image outputs are supported. + int img_token_end_idx = 8196; + int img_token_start_idx = 4; + int num_img_tokens = img_token_end_idx - img_token_start_idx; + // creates 1d tensor of size num_img_tokens and values -FLT_MAX, + // which ensures that text token values are always at least larger than image token values + ggml_tensor * img_logits = ggml_new_tensor_1d(ctx0, GGML_TYPE_F32, num_img_tokens); + img_logits = ggml_clamp(ctx0, img_logits, -FLT_MAX, -FLT_MAX); + cb(img_logits, "img_logits", -1); + + cur = ggml_set_1d(ctx0, cur, img_logits, ggml_element_size(cur) * img_token_start_idx); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/chatglm.cpp b/src/models/chatglm.cpp new file mode 100644 index 00000000000..2685d4fbcbe --- /dev/null +++ b/src/models/chatglm.cpp @@ -0,0 +1,132 @@ +#include "models.h" + + +llm_build_chatglm::llm_build_chatglm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, + NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = nullptr; + ggml_tensor * Kcur = nullptr; + ggml_tensor * Vcur = nullptr; + + if (model.layers[il].wqkv == nullptr) { + Qcur = build_lora_mm(model.layers[il].wq, cur); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + } + Kcur = build_lora_mm(model.layers[il].wk, cur); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + } + Vcur = build_lora_mm(model.layers[il].wv, cur); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + } else { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + if (model.layers[il].bqkv) { + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + } + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + } + + //printf("freq_base: %f freq_scale: %f ext_factor: %f attn_factor: %f\n", freq_base, freq_scale, ext_factor, attn_factor); + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + // Add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + } + + inpL = ggml_add(ctx0, cur, ffn_inp); + cb(inpL, "l_out", il); + } + + cur = build_norm(inpL, + model.output_norm, + NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/codeshell.cpp b/src/models/codeshell.cpp new file mode 100644 index 00000000000..0b3bdbff529 --- /dev/null +++ b/src/models/codeshell.cpp @@ -0,0 +1,111 @@ +#include "models.h" + +llm_build_codeshell::llm_build_codeshell(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/cogvlm.cpp b/src/models/cogvlm.cpp new file mode 100644 index 00000000000..edf0d1424ce --- /dev/null +++ b/src/models/cogvlm.cpp @@ -0,0 +1,100 @@ +#include "models.h" + +llm_build_cogvlm::llm_build_cogvlm(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + float kq_scale = 1.0f / sqrtf(float(n_embd_head)); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor *inpL, *cur; + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + // check ubatch to see if we have input tokens (text) + // or an input embedding vector (image) + bool is_text; + if (ubatch.token) { + is_text = true; + } else { + is_text = false; + } + + for (int il = 0; il < n_layer; ++il) { + // get either the text or image weight tensors + ggml_tensor *wqkv, *wo; + ggml_tensor *ffn_gate, *ffn_down, *ffn_up; + + if (is_text) { + wqkv = model.layers[il].wqkv; + wo = model.layers[il].wo; + ffn_gate = model.layers[il].ffn_gate; + ffn_down = model.layers[il].ffn_down; + ffn_up = model.layers[il].ffn_up; + } else { + wqkv = model.layers[il].visexp_attn_wqkv; + wo = model.layers[il].visexp_attn_wo; + ffn_gate = model.layers[il].visexp_ffn_gate; + ffn_down = model.layers[il].visexp_ffn_down; + ffn_up = model.layers[il].visexp_ffn_up; + } + + ggml_tensor * inpSA = inpL; + cur = build_norm(inpSA, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + + // build self attention + { + ggml_tensor * qkv = build_lora_mm(wqkv, cur); + + // split qkv into Q, K, V along the first dimension + ggml_tensor * Qcur = + ggml_view_3d(ctx0, qkv, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), qkv->nb[1], 0); + ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + qkv->nb[1], n_embd * ggml_element_size(qkv)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + qkv->nb[1], 2 * n_embd * ggml_element_size(qkv)); + + Qcur = ggml_rope(ctx0, Qcur, inp_pos, n_embd_head, rope_type); + Kcur = ggml_rope(ctx0, Kcur, inp_pos, n_embd_head, rope_type); + + cur = build_attn(inp_attn, + wo, nullptr, + Qcur, Kcur, Vcur, + nullptr, nullptr, nullptr, + kq_scale, il); + cb(cur, "attn_out", il); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + ffn_up, NULL, NULL, + ffn_gate, NULL, NULL, + ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/cohere2-iswa.cpp b/src/models/cohere2-iswa.cpp new file mode 100644 index 00000000000..b18aa8c4e6c --- /dev/null +++ b/src/models/cohere2-iswa.cpp @@ -0,0 +1,131 @@ +#include "models.h" + +llm_build_cohere2_iswa::llm_build_cohere2_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + const float f_logit_scale = hparams.f_logit_scale; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv_iswa(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const bool is_swa = hparams.is_swa(il); + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM, il); + cb(cur, "attn_norm", il); + ggml_tensor * ffn_inp = cur; + + // self-attention + { + // rope freq factors for 128k context + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (is_swa) { + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + } + + ggml_tensor * attn_out = cur; + + // feed-forward network + { + cur = build_ffn(ffn_inp, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + + // add together residual + FFN + self-attention + cur = ggml_add(ctx0, cur, inpL); + cur = ggml_add(ctx0, cur, attn_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + if (f_logit_scale) { + cur = ggml_scale(ctx0, cur, f_logit_scale); + } + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/command-r.cpp b/src/models/command-r.cpp new file mode 100644 index 00000000000..4d3b643b444 --- /dev/null +++ b/src/models/command-r.cpp @@ -0,0 +1,122 @@ +#include "models.h" + + + +llm_build_command_r::llm_build_command_r(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + const float f_logit_scale = hparams.f_logit_scale; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM, il); + cb(cur, "attn_norm", il); + + ggml_tensor * ffn_inp = cur; + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (model.layers[il].attn_q_norm) { + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM, il); + cb(Qcur, "Qcur", il); + } + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + if (model.layers[il].attn_k_norm) { + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM, il); + cb(Kcur, "Kcur", il); + } + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + } + ggml_tensor * attn_out = cur; + + // feed-forward network + { + cur = build_ffn(ffn_inp, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + // add together residual + FFN + self-attention + cur = ggml_add(ctx0, cur, inpL); + cur = ggml_add(ctx0, cur, attn_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + if (f_logit_scale) { + cur = ggml_scale(ctx0, cur, f_logit_scale); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/dbrx.cpp b/src/models/dbrx.cpp new file mode 100644 index 00000000000..6d2a0ebf1b7 --- /dev/null +++ b/src/models/dbrx.cpp @@ -0,0 +1,123 @@ +#include "models.h" + + +llm_build_dbrx::llm_build_dbrx(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = nullptr; + ggml_tensor * Kcur = nullptr; + ggml_tensor * Vcur = nullptr; + + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_clamp(ctx0, cur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); + cb(cur, "wqkv_clamped", il); + + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].attn_out_norm, NULL, + LLM_NORM, il); + cb(cur, "attn_out_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/deci.cpp b/src/models/deci.cpp new file mode 100644 index 00000000000..7410a3a46d9 --- /dev/null +++ b/src/models/deci.cpp @@ -0,0 +1,135 @@ +#include "models.h" + + + +llm_build_deci::llm_build_deci(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + const int64_t n_head_kv = hparams.n_head_kv(il); + const int64_t n_head = hparams.n_head(il); + const int64_t n_ff = hparams.n_ff(il); + + if (n_head == 0) { + // attention-free layer of Llama-3_1-Nemotron-51B + cur = inpL; + } else { + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + } + if (n_head > 0 && n_head_kv == 0) { + // "linear attention" of Llama-3_1-Nemotron-51B + cur = build_lora_mm(model.layers[il].wo, cur); + cb(cur, "wo", il); + } else if (n_head > 0) { + // self-attention + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + // FFN-free layer of Llama-3_1-Nemotron-Ultra-253B + if (n_ff == 0) { + continue; + } + // modified to support attention-free layer of Llama-3_1-Nemotron-51B + ggml_tensor * ffn_inp = cur; + if (n_head > 0) { + ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + } + // feed-forward network + if (model.layers[il].ffn_gate_inp == nullptr) { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/deepseek.cpp b/src/models/deepseek.cpp new file mode 100644 index 00000000000..17866c0d88e --- /dev/null +++ b/src/models/deepseek.cpp @@ -0,0 +1,144 @@ +#include "models.h" + + + +llm_build_deepseek::llm_build_deepseek(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + if ((uint32_t) il < hparams.n_layer_dense_lead) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, hparams.expert_weights_scale, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // FFN shared expert + { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/deepseek2.cpp b/src/models/deepseek2.cpp new file mode 100644 index 00000000000..68f72f72bb6 --- /dev/null +++ b/src/models/deepseek2.cpp @@ -0,0 +1,236 @@ +#include "models.h" + + + +llm_build_deepseek2::llm_build_deepseek2(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + bool is_lite = (hparams.n_layer == 27); + + const bool is_mla = (hparams.n_embd_head_k_mla != 0 && hparams.n_embd_head_v_mla != 0); + + // note: these are the actual head sizes you get when treating as MHA or after "decompression" using wv_b for MLA + const int64_t n_embd_head_k = is_mla ? hparams.n_embd_head_k_mla : hparams.n_embd_head_k; + const int64_t n_embd_head_v = is_mla ? hparams.n_embd_head_v_mla : hparams.n_embd_head_v; + + const int64_t n_embd_head_qk_rope = hparams.n_rot; + const int64_t n_embd_head_qk_nope = n_embd_head_k - n_embd_head_qk_rope; + + const uint32_t kv_lora_rank = hparams.n_lora_kv; + + // We have to pre-scale kq_scale and attn_factor to make the YaRN RoPE work correctly. + // See https://github.com/ggerganov/llama.cpp/discussions/7416 for detailed explanation. + const float mscale = attn_factor * (1.0f + hparams.rope_yarn_log_mul * logf(1.0f / freq_scale)); + const float kq_scale = 1.0f * mscale * mscale / sqrtf(float(n_embd_head_k)); + const float attn_factor = 1.0f / (1.0f + 0.1f * logf(1.0f / freq_scale)); + + ggml_tensor * cur; + ggml_tensor * inpL; + + // {n_embd, n_tokens} + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + ggml_tensor * q = NULL; + if (!is_lite) { + q = ggml_mul_mat(ctx0, model.layers[il].wq_a, cur); + cb(q, "q", il); + + q = build_norm(q, model.layers[il].attn_q_a_norm, nullptr, LLM_NORM_RMS, il); + cb(q, "q", il); + + q = ggml_mul_mat(ctx0, model.layers[il].wq_b, q); + cb(q, "q", il); + } else { + q = ggml_mul_mat(ctx0, model.layers[il].wq, cur); + cb(q, "q", il); + } + // split into {n_embd_head_qk_nope, n_head, n_tokens} + ggml_tensor * q_nope = + ggml_view_3d(ctx0, q, n_embd_head_qk_nope, n_head, n_tokens, ggml_row_size(q->type, n_embd_head_k), + ggml_row_size(q->type, n_embd_head_k) * n_head, 0); + cb(q_nope, "q_nope", il); + + // and {n_embd_head_qk_rope, n_head, n_tokens} + ggml_tensor * q_pe = ggml_view_3d( + ctx0, q, n_embd_head_qk_rope, n_head, n_tokens, ggml_row_size(q->type, n_embd_head_k), + ggml_row_size(q->type, n_embd_head_k) * n_head, ggml_row_size(q->type, n_embd_head_qk_nope)); + cb(q_pe, "q_pe", il); + + ggml_tensor * kv_cmpr_pe = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); + cb(kv_cmpr_pe, "kv_cmpr_pe", il); + + // split into {kv_lora_rank, n_tokens} + ggml_tensor * kv_cmpr = + ggml_view_2d(ctx0, kv_cmpr_pe, kv_lora_rank, n_tokens, + ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), 0); + cb(kv_cmpr, "kv_cmpr", il); + + // and {n_embd_head_qk_rope, 1, n_tokens} + ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_cmpr_pe, n_embd_head_qk_rope, 1, n_tokens, + ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), + ggml_row_size(kv_cmpr_pe->type, kv_lora_rank + n_embd_head_qk_rope), + ggml_row_size(kv_cmpr_pe->type, kv_lora_rank)); + cb(k_pe, "k_pe", il); + + q_pe = ggml_rope_ext(ctx0, q_pe, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + cb(q_pe, "q_pe", il); + + k_pe = ggml_rope_ext(ctx0, k_pe, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + cb(k_pe, "k_pe", il); + + kv_cmpr = build_norm(kv_cmpr, model.layers[il].attn_kv_a_norm, nullptr, LLM_NORM_RMS, il); + cb(kv_cmpr, "kv_cmpr", il); + + if (is_mla) { + // {n_embd_head_qk_nope, n_tokens, n_head} + q_nope = ggml_permute(ctx0, q_nope, 0, 2, 1, 3); + cb(q_nope, "q_nope_perm", il); + + // {n_embd_head_qk_nope, kv_lora_rank, n_head} x {n_embd_head_qk_nope, n_tokens, n_head} + ggml_tensor * q_nope_absorbed = ggml_mul_mat(ctx0, model.layers[il].wk_b, q_nope); + cb(q_nope_absorbed, "q_nope_absorbed", il); + + // {kv_lora_rank, n_head, n_tokens} + q_nope_absorbed = ggml_permute(ctx0, q_nope_absorbed, 0, 2, 1, 3); + cb(q_nope_absorbed, "q_nope_absorbed_perm", il); + + // {n_embd_head_qk_rope + kv_lora_rank, n_head, n_tokens} + // note: rope must go first for in-place context shifting in build_rope_shift() + ggml_tensor * Qcur = ggml_concat(ctx0, q_pe, q_nope_absorbed, 0); + cb(Qcur, "Qcur", il); + + kv_cmpr = ggml_reshape_3d(ctx0, kv_cmpr, kv_lora_rank, 1, n_tokens); + cb(kv_cmpr, "kv_cmpr_reshape", il); + + // {n_embd_head_qk_rope + kv_lora_rank, 1, n_tokens} + ggml_tensor * Kcur = ggml_concat(ctx0, k_pe, kv_cmpr, 0); + cb(Kcur, "Kcur", il); + + // {kv_lora_rank, 1, n_tokens} + ggml_tensor * Vcur = kv_cmpr; + cb(Vcur, "Vcur", il); + + // note: MLA with the absorption optimzation converts into MQA (ie: GQA with 1 group) + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, model.layers[il].wv_b, kq_scale, il); + } else { + ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_cmpr); + cb(kv, "kv", il); + + // split into {n_embd_head_qk_nope, n_head, n_tokens} + ggml_tensor * k_nope = + ggml_view_3d(ctx0, kv, n_embd_head_qk_nope, n_head, n_tokens, + ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v), + ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v) * n_head, 0); + cb(k_nope, "k_nope_view", il); + + // and {n_embd_head_v, n_head, n_tokens} + ggml_tensor * Vcur = ggml_view_3d(ctx0, kv, n_embd_head_v, n_head, n_tokens, + ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v), + ggml_row_size(kv->type, n_embd_head_qk_nope + n_embd_head_v) * n_head, + ggml_row_size(kv->type, n_embd_head_qk_nope)); + cb(Vcur, "Vcur_view", il); + + Vcur = ggml_cont(ctx0, Vcur); + cb(Vcur, "Vcur_cont", il); + + // note: rope must go first for in-place context shifting in build_rope_shift() + ggml_tensor * Qcur = ggml_concat(ctx0, q_pe, q_nope, 0); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = ggml_concat(ctx0, ggml_repeat(ctx0, k_pe, q_pe), k_nope, 0); + cb(Kcur, "Kcur", il); + + // note: MLA without the absorption optimization converts into MHA (ie: GQA with full n_head groups) + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + } + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + if ((uint32_t) il < hparams.n_layer_dense_lead) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, hparams.expert_weights_norm, + true, hparams.expert_weights_scale, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(moe_out, "ffn_moe_out", il); + + // FFN shared expert + { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = ggml_mul_mat(ctx0, model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/dots1.cpp b/src/models/dots1.cpp new file mode 100644 index 00000000000..09c36f82fe2 --- /dev/null +++ b/src/models/dots1.cpp @@ -0,0 +1,134 @@ +#include "models.h" + + + +llm_build_dots1::llm_build_dots1(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + if ((uint32_t) il < hparams.n_layer_dense_lead) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, hparams.expert_weights_norm, + true, hparams.expert_weights_scale, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(moe_out, "ffn_moe_out", il); + + { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/dream.cpp b/src/models/dream.cpp new file mode 100644 index 00000000000..2aafbae1397 --- /dev/null +++ b/src/models/dream.cpp @@ -0,0 +1,105 @@ +#include "models.h" + + + +llm_build_dream::llm_build_dream(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + //copied from qwen2 + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/ernie4-5-moe.cpp b/src/models/ernie4-5-moe.cpp new file mode 100644 index 00000000000..0d96d14e6fd --- /dev/null +++ b/src/models/ernie4-5-moe.cpp @@ -0,0 +1,150 @@ +#include "models.h" + + + +llm_build_ernie4_5_moe::llm_build_ernie4_5_moe(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + GGML_ASSERT(hparams.n_moe_layer_step > 0 && "Ernie 4.5 MoE requires n_moe_layer_step > 0"); + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + // norm + { + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + } + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + bool is_moe_layer = + static_cast(il) >= hparams.n_layer_dense_lead && (il + 1) % hparams.n_moe_layer_step == 0; + + if (!is_moe_layer) { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // Shared expert (if present) + if (hparams.n_ff_shexp > 0) { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + } else { + cur = moe_out; + } + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/ernie4-5.cpp b/src/models/ernie4-5.cpp new file mode 100644 index 00000000000..99962af111f --- /dev/null +++ b/src/models/ernie4-5.cpp @@ -0,0 +1,111 @@ +#include "models.h" + + + +llm_build_ernie4_5::llm_build_ernie4_5(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + { + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + } + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1) { + // skip computing output for unused tokens + ggml_tensor * inp_out_ids = build_inp_out_ids(); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/exaone.cpp b/src/models/exaone.cpp new file mode 100644 index 00000000000..62602b284de --- /dev/null +++ b/src/models/exaone.cpp @@ -0,0 +1,114 @@ +#include "models.h" + + + +llm_build_exaone::llm_build_exaone(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/exaone4.cpp b/src/models/exaone4.cpp new file mode 100644 index 00000000000..8b7e3dc06e5 --- /dev/null +++ b/src/models/exaone4.cpp @@ -0,0 +1,123 @@ +#include "models.h" + + +template +llm_build_exaone4::llm_build_exaone4(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_k; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_v); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + using inp_attn_type = std::conditional_t; + inp_attn_type * inp_attn = nullptr; + + if constexpr (iswa) { + inp_attn = build_attn_inp_kv_iswa(); + } else { + inp_attn = build_attn_inp_kv(); + } + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // use RoPE for SWA layers or non-SWA models + const bool use_rope = hparams.is_swa(il) || hparams.swa_type == LLAMA_SWA_TYPE_NONE; + + cur = inpL; + + // self-attention + { + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + cb(Kcur, "Kcur_normed", il); + + if (use_rope) { + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, + freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, + freq_scale, ext_factor, attn_factor, beta_fast, beta_slow); + } + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_ffn(ffn_inp, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", -1); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +// Explicit template instantiations +template struct llm_build_exaone4; +template struct llm_build_exaone4; diff --git a/src/models/falcon-h1.cpp b/src/models/falcon-h1.cpp new file mode 100644 index 00000000000..b641a094079 --- /dev/null +++ b/src/models/falcon-h1.cpp @@ -0,0 +1,113 @@ +#include "models.h" + + + +llm_build_falcon_h1::llm_build_falcon_h1(const llama_model & model, const llm_graph_params & params) : + llm_graph_context_mamba(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + // Build the inputs in the recurrent & kv cache + auto * inp = build_inp_mem_hybrid(); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, hparams.rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, hparams.rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur-post-rope", il); + cb(Kcur, "Kcur-post-rope", il); + cb(Vcur, "Vcur-post-rope", il); + + ggml_tensor * attn_out = build_attn(inp->get_attn(), + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(attn_out, "attn_out", il); + + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + // Mamba2 layer + cb(cur, "ssm_in", il); + + ggml_tensor * ssm_out = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); + cb(ssm_out, "ssm_out", il); + + // // Aggregation + cur = ggml_add(ctx0, attn_out, ssm_out); + inpSA = ggml_add(ctx0, cur, inpSA); + cb(cur, "layer_out", il); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = inpSA; + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, inpSA); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/falcon.cpp b/src/models/falcon.cpp new file mode 100644 index 00000000000..db1ccdb5008 --- /dev/null +++ b/src/models/falcon.cpp @@ -0,0 +1,120 @@ +#include "models.h" + + +llm_build_falcon::llm_build_falcon(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * attn_norm; + + attn_norm = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(attn_norm, "attn_norm", il); + + // self-attention + { + if (model.layers[il].attn_norm_2) { + // Falcon-40B + cur = build_norm(inpL, + model.layers[il].attn_norm_2, + model.layers[il].attn_norm_2_b, + LLM_NORM, il); + cb(cur, "attn_norm_2", il); + } else { + cur = attn_norm; + } + + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + // using mode = 2 for neox mode + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + attn_norm = ggml_get_rows(ctx0, attn_norm, inp_out_ids); + } + + ggml_tensor * ffn_inp = cur; + + // feed forward + { + cur = build_ffn(attn_norm, // !! use the attn norm, not the result + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + cur = ggml_add(ctx0, cur, inpL); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + // norm + cur = build_norm(cur, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gemma-embedding.cpp b/src/models/gemma-embedding.cpp new file mode 100644 index 00000000000..90a98f7abf0 --- /dev/null +++ b/src/models/gemma-embedding.cpp @@ -0,0 +1,120 @@ +#include "models.h" + + + +llm_build_gemma_embedding::llm_build_gemma_embedding(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_k; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const float freq_base_l = model.get_rope_freq_base(cparams, il); + const float freq_scale_l = model.get_rope_freq_scale(cparams, il); + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + // ref: https://github.com/google/gemma_pytorch/blob/014acb7ac4563a5f77c76d7ff98f31b568c16508/gemma/model.py#L315 + Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); + + cur = + build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); + cb(sa_out, "sa_out", il); + + cur = build_norm(sa_out, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_GELU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + + cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", -1); + + cur = ggml_add(ctx0, cur, sa_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gemma.cpp b/src/models/gemma.cpp new file mode 100644 index 00000000000..4893d9af4b8 --- /dev/null +++ b/src/models/gemma.cpp @@ -0,0 +1,112 @@ +#include "models.h" + + +llm_build_gemma::llm_build_gemma(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = ggml_scale(ctx0, Qcur, 1.0f / sqrtf(float(n_embd_head))); + cb(Qcur, "Qcur_scaled", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); + cb(sa_out, "sa_out", il); + + cur = build_norm(sa_out, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, sa_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gemma2-iswa.cpp b/src/models/gemma2-iswa.cpp new file mode 100644 index 00000000000..1f2b597c65e --- /dev/null +++ b/src/models/gemma2-iswa.cpp @@ -0,0 +1,125 @@ +#include "models.h" + +llm_build_gemma2_iswa::llm_build_gemma2_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_k; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv_iswa(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + cur = build_norm(cur, + model.layers[il].attn_post_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); + cb(sa_out, "sa_out", il); + + cur = build_norm(sa_out, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = build_norm(cur, + model.layers[il].ffn_post_norm, NULL, + LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", -1); + + cur = ggml_add(ctx0, cur, sa_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + // final logit soft-capping + cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); + cur = ggml_tanh(ctx0, cur); + cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gemma3-iswa.cpp b/src/models/gemma3-iswa.cpp new file mode 100644 index 00000000000..84badc38f17 --- /dev/null +++ b/src/models/gemma3-iswa.cpp @@ -0,0 +1,131 @@ +#include "models.h" + +llm_build_gemma3_iswa::llm_build_gemma3_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_k; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + // TODO: is causal == true correct? might need some changes + auto * inp_attn = build_attn_inp_kv_iswa(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const float freq_base_l = model.get_rope_freq_base (cparams, il); + const float freq_scale_l = model.get_rope_freq_scale(cparams, il); + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + // ref: https://github.com/google/gemma_pytorch/blob/014acb7ac4563a5f77c76d7ff98f31b568c16508/gemma/model.py#L315 + Qcur = ggml_scale(ctx0, Qcur, hparams.f_attention_scale); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + cur = build_norm(cur, + model.layers[il].attn_post_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + ggml_tensor * sa_out = ggml_add(ctx0, cur, inpL); + cb(sa_out, "sa_out", il); + + cur = build_norm(sa_out, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = build_norm(cur, + model.layers[il].ffn_post_norm, NULL, + LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", -1); + + cur = ggml_add(ctx0, cur, sa_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gemma3n-iswa.cpp b/src/models/gemma3n-iswa.cpp new file mode 100644 index 00000000000..a0bdd6a15a1 --- /dev/null +++ b/src/models/gemma3n-iswa.cpp @@ -0,0 +1,377 @@ +#include "models.h" + + + +llm_build_gemma3n_iswa::llm_build_gemma3n_iswa(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params), + model(model), + n_embd_head(model.hparams.n_embd_head_k), + n_embd_altup(model.hparams.n_embd_altup), + n_altup(model.hparams.n_altup), + i_altup_act(model.hparams.i_altup_act) { + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // important: do not normalize weights for raw embeddings input (i.e. encoded image emdeddings) + if (ubatch.token) { + inpL = ggml_scale(ctx0, inpL, sqrtf(n_embd)); + cb(inpL, "inp_scaled", -1); + } + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + // TODO: is causal == true correct? might need some changes + auto * inp_attn = build_attn_inp_kv_iswa(); + + // inp_per_layer shape: [n_embd_altup, n_tokens, n_layer] + ggml_tensor * inp_per_layer = project_per_layer_inputs(inpL, get_per_layer_inputs()); + + // inpL now has only 1 altup, project it to the rest of the altups + // these "added" altups will be concat to the last dim of inpL + { + ggml_tensor * target_magnitude = calc_magnitude(inpL); + ggml_tensor * inp_repeated = ggml_repeat_4d(ctx0, inpL, n_embd, n_tokens, n_altup - 1, 1); + ggml_tensor * altup_added = + ggml_mul_mat(ctx0, model.altup_proj, inp_repeated); // shape: [n_embd, n_tokens, n_altup - 1] + ggml_tensor * new_magnitude = calc_magnitude(altup_added); + altup_added = ggml_div(ctx0, ggml_mul(ctx0, altup_added, target_magnitude), new_magnitude); + inpL = ggml_concat(ctx0, inpL, altup_added, 2); // shape: [n_embd, n_tokens, n_altup] + cb(inpL, "inp_stacked", -1); + } + // inpL now has shape: [n_embd, n_tokens, n_altup] + // inp_per_layer now has shape: [n_embd_altup, n_tokens, n_layer] + + for (int il = 0; il < n_layer; ++il) { + // this block is made to be closely resemble Gemma3p5DecoderLayer on python code + const float freq_base_l = model.get_rope_freq_base(cparams, il); + const float freq_scale_l = model.get_rope_freq_scale(cparams, il); + + ggml_tensor * cur = inpL; // [n_embd, n_tokens, n_altup] + ggml_tensor * predictions = altup_predict(cur, il); // [n_embd, n_tokens, n_altup] + + // predicted value will go through self-attention and laurel + ggml_tensor * active_prediction = view_2d_slice(predictions, i_altup_act); // [n_embd, n_tokens] + cur = active_prediction; + cb(cur, "active_prediction", il); + + // norm + cur = build_norm(cur, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // laurel + ggml_tensor * laurel_out = laurel(cur, il); // [n_embd, n_tokens] + + // self-attention + if (hparams.has_kv(il)) { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + Vcur = ggml_rms_norm(ctx0, Vcur, hparams.f_norm_rms_eps); + + cb(Qcur, "Qcur_normed", il); + cb(Kcur, "Kcur_normed", il); + cb(Vcur, "Vcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur_pos", il); + cb(Kcur, "Kcur_pos", il); + + cur = build_attn(inp_attn, model.layers[il].wo, + NULL, Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, + hparams.f_attention_scale, il); + } else { + // reuse KV cache of earlier layers + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base_l, freq_scale_l, + ext_factor, attn_factor, beta_fast, beta_slow); + cb(Qcur, "Qcur_pos", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, nullptr, nullptr, nullptr, nullptr, nullptr, hparams.f_attention_scale, il); + } + cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + cur = ggml_add(ctx0, cur, active_prediction); // [n_embd, n_tokens] + cb(cur, "attn_gated", il); + + ggml_tensor * attn_laurel = ggml_scale(ctx0, ggml_add(ctx0, cur, laurel_out), + 1.0f / sqrtf(2.0f)); // [n_embd, n_tokens] + cb(attn_laurel, "attn_laurel", il); + + cur = build_norm(attn_laurel, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + { + ggml_tensor * up_proj = build_lora_mm(model.layers[il].ffn_up, cur); + ggml_tensor * gate_proj = build_lora_mm(model.layers[il].ffn_gate, cur); + + if (il < n_layer_sparsity) { + // apply activation sparsity + gate_proj = gaussian_topk(gate_proj); + } + gate_proj = ggml_gelu(ctx0, gate_proj); + + cur = ggml_mul(ctx0, up_proj, gate_proj); + cur = build_lora_mm(model.layers[il].ffn_down, cur); + cb(cur, "ffn_out", il); + } + cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", il); + + ggml_tensor * attn_ffw_laurel_gated = ggml_add(ctx0, cur, attn_laurel); // [n_embd, n_tokens] + cb(attn_ffw_laurel_gated, "attn_ffw_laurel_gated", il); + + ggml_tensor * corrected = altup_correct(predictions, attn_ffw_laurel_gated, il); // [n_embd, n_tokens, n_altup] + + ggml_tensor * first_prediction; // [n_embd, n_tokens] + { + first_prediction = view_2d_slice(corrected, i_altup_act); // [n_embd, n_tokens] + first_prediction = ggml_mul(ctx0, first_prediction, model.layers[il].altup_correct_scale); + first_prediction = build_lora_mm(model.layers[il].per_layer_inp_gate, first_prediction); + first_prediction = ggml_gelu(ctx0, first_prediction); // [n_embd_altup, n_tokens] + cb(first_prediction, "first_prediction_gated", il); + ggml_tensor * inp_this_layer = view_2d_slice(inp_per_layer, il); // [n_embd_altup, n_tokens] + first_prediction = ggml_mul(ctx0, first_prediction, inp_this_layer); // [n_embd_altup, n_tokens] + cb(first_prediction, "first_prediction_scaled", il); + + first_prediction = build_lora_mm(model.layers[il].per_layer_proj, first_prediction); // [n_embd, n_tokens] + first_prediction = + build_norm(first_prediction, model.layers[il].per_layer_post_norm, NULL, LLM_NORM_RMS, il); + cb(first_prediction, "first_prediction_out", il); + } + // equivalent to python code: corrected_predictions[1:] += first_prediction + { + ggml_tensor * slice_first = view_2d_slice(corrected, 0); + ggml_tensor * slice_rest = ggml_view_3d( + ctx0, corrected, n_embd, n_tokens, n_altup - 1, ggml_row_size(corrected->type, n_embd), + ggml_row_size(corrected->type, n_embd * n_tokens), n_embd * n_tokens * ggml_element_size(corrected)); + ggml_tensor * tmp = ggml_add(ctx0, slice_rest, first_prediction); // [n_embd, n_tokens, n_altup - 1] + corrected = ggml_concat(ctx0, slice_first, tmp, 2); // [n_embd, n_tokens, n_altup] + } + cur = corrected; // [n_embd, n_tokens, n_altup] + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; // [n_embd, n_tokens, n_altup] + + // cur now has multiple altup(s), we want to merge them back to 1 altup + { + ggml_tensor * target_magnitude = calc_magnitude(view_2d_slice(cur, i_altup_act)); // [n_embd, n_tokens] + // do a view to skip the first slice (active altup) + ggml_tensor * alt_slice = + ggml_view_3d(ctx0, cur, n_embd, n_tokens, n_altup - 1, ggml_row_size(cur->type, n_embd), + ggml_row_size(cur->type, n_embd * n_tokens), n_embd * n_tokens * ggml_element_size(cur)); + ggml_tensor * altup_unembd = + ggml_mul_mat(ctx0, model.altup_unembd_proj, alt_slice); // shape: [n_embd, n_tokens, n_altup - 1] + ggml_tensor * new_magnitude = calc_magnitude(altup_unembd); + altup_unembd = ggml_div(ctx0, ggml_mul(ctx0, altup_unembd, target_magnitude), new_magnitude); + cb(altup_unembd, "altup_unembd", -1); + + // equivalent to torch.mean(hidden_states, dim=0) + cur = view_2d_slice(cur, 0); // [n_embd, n_tokens] + for (int i = 0; i < n_altup - 1; ++i) { + cur = ggml_add(ctx0, cur, view_2d_slice(altup_unembd, i)); + } + cur = ggml_scale(ctx0, cur, 1.0f / float(n_altup)); // [n_embd, n_tokens] + cb(cur, "unembd_merged", -1); + } + // cur now has shape: [n_embd, n_tokens] + + // TODO: move this to right after the last KV layer + { + // skip computing output for unused tokens + ggml_tensor * inp_out_ids = build_inp_out_ids(); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + } + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + { + // final logit soft-capping + cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); + cur = ggml_tanh(ctx0, cur); + cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_gemma3n_iswa::calc_magnitude(ggml_tensor * x) { + return ggml_sqrt(ctx0, ggml_sum_rows(ctx0, ggml_sqr(ctx0, x))); +} + +// get 2D slice view from a 3D tensor, the idx corresponds to the 3rd dim +ggml_tensor * llm_build_gemma3n_iswa::view_2d_slice(ggml_tensor * x, int idx) { + GGML_ASSERT(idx < (int) x->ne[2]); + return ggml_view_2d(ctx0, x, x->ne[0], x->ne[1], ggml_row_size(x->type, x->ne[0]), + idx * x->ne[0] * x->ne[1] * ggml_element_size(x)); +} + +// equivalent to get_per_layer_inputs() in python code +// output shape: [n_embd_altup, n_layer, n_tokens] +ggml_tensor * llm_build_gemma3n_iswa::get_per_layer_inputs() { + auto inp = std::make_unique(); + ggml_tensor * inp_per_layer; + if (ubatch.token) { + inp->tokens = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ubatch.n_tokens); + ggml_set_input(inp->tokens); + res->t_tokens = inp->tokens; + inp_per_layer = ggml_get_rows(ctx0, model.tok_embd_per_layer, inp->tokens); + inp_per_layer = ggml_reshape_3d(ctx0, inp_per_layer, n_embd_altup, n_layer, n_tokens); + inp_per_layer = ggml_scale(ctx0, inp_per_layer, sqrtf((float) n_embd_altup)); + cb(inp_per_layer, "inp_per_layer_selected", -1); + } else { + GGML_ABORT("TODO: support embd input"); + } + res->add_input(std::move(inp)); + return inp_per_layer; +} + +// equivalent to project_per_layer_inputs() in python code +// this calculates the per-layer inputs, so the final tensor shape will have n_layer as the last dim +// output shape: [n_embd_altup, n_tokens, n_layer] +ggml_tensor * llm_build_gemma3n_iswa::project_per_layer_inputs(ggml_tensor * inputs_embeds, ggml_tensor * inp_per_layer) { + const float per_layer_projection_scale = 1.0f / sqrtf((float) n_embd); + const float per_layer_input_scale = 1.0f / sqrtf(2.0f); + + ggml_tensor * per_layer_proj = ggml_mul_mat(ctx0, model.per_layer_model_proj, inputs_embeds); + per_layer_proj = ggml_scale(ctx0, per_layer_proj, per_layer_projection_scale); + per_layer_proj = ggml_reshape_3d(ctx0, per_layer_proj, n_embd_altup, n_layer, n_tokens); + per_layer_proj = build_norm(per_layer_proj, model.per_layer_proj_norm, NULL, LLM_NORM_RMS, + -1); // [n_embd_altup, n_layer, n_tokens] + cb(per_layer_proj, "per_layer_proj", -1); + + inp_per_layer = ggml_add(ctx0, inp_per_layer, per_layer_proj); + inp_per_layer = ggml_scale(ctx0, inp_per_layer, per_layer_input_scale); + cb(inp_per_layer, "inp_per_layer", -1); + + // permute to shape: [n_embd_altup, n_tokens, n_layer] + inp_per_layer = ggml_cont(ctx0, ggml_permute(ctx0, inp_per_layer, 0, 2, 1, 3)); + return inp_per_layer; +} + +// input cur shape: [n_altup, n_tokens] +// output shape: [n_altup, n_tokens] +ggml_tensor * llm_build_gemma3n_iswa::laurel(ggml_tensor * cur, int il) { + ggml_tensor * tmp = cur; + tmp = build_lora_mm(model.layers[il].laurel_l, tmp); + tmp = build_lora_mm(model.layers[il].laurel_r, tmp); + tmp = build_norm(tmp, model.layers[il].laurel_post_norm, NULL, LLM_NORM_RMS, il); + tmp = ggml_add(ctx0, tmp, cur); + cb(tmp, "laurel_out", il); + return tmp; +} + +// input x shape: [n_embd, n_tokens] +// output shape: [n_embd, n_tokens] +ggml_tensor * llm_build_gemma3n_iswa::gaussian_topk(ggml_tensor * x) { + ggml_tensor * mean = ggml_mean(ctx0, x); + ggml_tensor * std = ggml_sqrt(ctx0, ggml_scale(ctx0, ggml_sum_rows(ctx0, ggml_sqr(ctx0, ggml_sub(ctx0, x, mean))), + 1.0f / (float) (x->ne[0] - 1))); + ggml_tensor * cutoff_x = ggml_add(ctx0, mean, ggml_scale(ctx0, std, f_sparsity_std_mul)); + return ggml_relu(ctx0, ggml_sub(ctx0, x, cutoff_x)); +} + +// +// altup functions +// + +// equivalent to compute_router_modalities() in python code +// input x shape: [n_embd, n_tokens] +// output shape: [n_altup, n_tokens] +ggml_tensor * llm_build_gemma3n_iswa::altup_compute_router_modalities(ggml_tensor * x, int il) { + ggml_tensor * router_inputs = build_norm(x, model.layers[il].altup_router_norm, NULL, LLM_NORM_RMS, il); + + // router_input_scale + router_inputs = ggml_scale(ctx0, router_inputs, 1.0f / (float) n_embd); + + ggml_tensor * output = ggml_mul_mat(ctx0, model.layers[il].altup_router, router_inputs); + return ggml_tanh(ctx0, output); // [n_altup, n_tokens] +} + +// input cur shape: [n_embd, n_tokens, n_altup] +// output shape: [n_embd, n_tokens, n_altup] +ggml_tensor * llm_build_gemma3n_iswa::altup_predict(ggml_tensor * cur, int il) { + ggml_tensor * activated = view_2d_slice(cur, i_altup_act); // [n_embd, n_tokens] + ggml_tensor * modalities = altup_compute_router_modalities(activated, il); // [n_altup, n_tokens] + cb(modalities, "modalities", il); + + ggml_tensor * all_coefs = build_lora_mm(model.layers[il].altup_predict_coef, modalities); + cb(all_coefs, "all_coefs", il); + // first dim now having n_altup^2 elements, we reshape it to 2D (so we end up with 3D tensor) + all_coefs = ggml_reshape_3d(ctx0, all_coefs, n_altup, n_altup, n_tokens); + + // permute to [n_altup, n_embd, n_tokens] + ggml_tensor * cur_permuted = ggml_cont(ctx0, ggml_permute(ctx0, cur, 1, 2, 0, 3)); + ggml_tensor * predictions = ggml_mul_mat(ctx0, cur_permuted, all_coefs); // [n_altup, n_embd, n_tokens] + + // final shape must be the same as cur: [n_embd, n_tokens, n_altup] + predictions = ggml_cont(ctx0, ggml_permute(ctx0, predictions, 0, 2, 1, 3)); + predictions = ggml_add(ctx0, predictions, cur); + cb(predictions, "predictions", il); + + return predictions; +} + +// input predictions shape: [n_embd, n_tokens, n_altup] +// input activated shape: [n_embd, n_tokens] +// output shape: [n_embd, n_tokens, n_altup] +ggml_tensor * llm_build_gemma3n_iswa::altup_correct(ggml_tensor * predictions, ggml_tensor * activated, int il) { + ggml_tensor * modalities = altup_compute_router_modalities(activated, il); // [n_altup, n_tokens] + cb(modalities, "modalities", il); + + ggml_tensor * active_prediction = view_2d_slice(predictions, i_altup_act); + ggml_tensor * innovation = ggml_sub(ctx0, activated, active_prediction); // [n_embd, n_tokens] + cb(innovation, "innovation", il); + + ggml_tensor * all_coefs = build_lora_mm(model.layers[il].altup_correct_coef, modalities); // [n_altup, n_tokens] + all_coefs = ggml_scale_bias(ctx0, all_coefs, 1.0f, 1.0f); // + 1.0 + cb(all_coefs, "all_coefs", il); + all_coefs = ggml_transpose(ctx0, all_coefs); // [n_tokens, n_altup] + all_coefs = ggml_cont_3d(ctx0, all_coefs, 1, n_tokens, n_altup); // [1, n_tokens, n_altup] + + innovation = ggml_repeat_4d(ctx0, innovation, n_embd, n_tokens, n_altup, 1); + ggml_tensor * corrected = ggml_mul(ctx0, innovation, all_coefs); // [n_embd, n_tokens, n_altup] + corrected = ggml_add(ctx0, corrected, predictions); // [n_embd, n_tokens, n_altup] + cb(corrected, "corrected", il); + + return corrected; +} diff --git a/src/models/glm4-moe.cpp b/src/models/glm4-moe.cpp new file mode 100644 index 00000000000..036625dc34e --- /dev/null +++ b/src/models/glm4-moe.cpp @@ -0,0 +1,153 @@ +#include "models.h" + +llm_build_glm4_moe::llm_build_glm4_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + // Only process up to last layer (skip final NextN layer) + // Final layer tensors are loaded but not processed in forward pass + const int n_transformer_layers = n_layer - hparams.nextn_predict_layers; + for (int il = 0; il < n_transformer_layers; ++il) { + ggml_tensor * inpSA = inpL; + + // Pre-attention norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + } + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + } + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + } + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + // Apply Q/K norm if available (GLM-4.5 355B variant) + if (model.layers[il].attn_q_norm) { + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + } + if (model.layers[il].attn_k_norm) { + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + } + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_transformer_layers - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // Post-attention norm + cur = build_norm(ffn_inp, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "post_attn_norm", il); + + // Check if this is a dense layer (n_layer_dense_lead=1, so layer 0 is dense) + if (static_cast(il) < hparams.n_layer_dense_lead) { + // Dense FFN layer + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // Process routed experts using existing MoE infrastructure + ggml_tensor * routed_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, hparams.expert_weights_norm, + true, hparams.expert_weights_scale, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(routed_out, "ffn_moe_out", il); + + // Process shared expert on original input + ggml_tensor * shared_out = build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(shared_out, "ffn_shexp_out", il); + + // Final output: routed_output + shared_output + cur = ggml_add(ctx0, routed_out, shared_out); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/glm4.cpp b/src/models/glm4.cpp new file mode 100644 index 00000000000..f789b282488 --- /dev/null +++ b/src/models/glm4.cpp @@ -0,0 +1,127 @@ +#include "models.h" + + + +llm_build_glm4::llm_build_glm4(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // Pre-attention norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = nullptr; + ggml_tensor * Kcur = nullptr; + ggml_tensor * Vcur = nullptr; + + if (model.layers[il].wqkv == nullptr) { + Qcur = build_lora_mm(model.layers[il].wq, cur); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + } + Kcur = build_lora_mm(model.layers[il].wk, cur); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + } + Vcur = build_lora_mm(model.layers[il].wv, cur); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + } else { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + if (model.layers[il].bqkv) { + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + } + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), cur->nb[1], + 0 * sizeof(float) * (n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); + } + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + // Post-attention norm (new!) + cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "post_attn_norm", il); + + // Add the input (residual connection after post-attention norm) + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + // Pre-MLP norm + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // MLP + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + // Post-MLP norm + cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "post_mlp_norm", il); + } + // Add residual connection after post-MLP norm + inpL = ggml_add(ctx0, cur, ffn_inp); + cb(inpL, "l_out", il); + } + // Final norm + cur = build_norm(inpL, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // Output projection + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gpt2.cpp b/src/models/gpt2.cpp new file mode 100644 index 00000000000..60761c8e765 --- /dev/null +++ b/src/models/gpt2.cpp @@ -0,0 +1,105 @@ +#include "models.h" + +llm_build_gpt2::llm_build_gpt2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * pos; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); + cb(pos, "pos_embd", -1); + + inpL = ggml_add(ctx0, inpL, pos); + cb(inpL, "inpL", -1); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/gptneox.cpp b/src/models/gptneox.cpp new file mode 100644 index 00000000000..2151b14e939 --- /dev/null +++ b/src/models/gptneox.cpp @@ -0,0 +1,144 @@ +#include "models.h" + + +llm_build_gptneox::llm_build_gptneox(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // ffn + if (hparams.use_par_res) { + // attention and ffn are computed in parallel + // x = x + attn(ln1(x)) + ffn(ln2(x)) + + ggml_tensor * attn_out = cur; + + cur = build_norm(inpL, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, inpL); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, attn_out); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } else { + // attention and ffn are computed sequentially + // x = x + attn(ln1(x)) + // x = x + ffn(ln2(x)) + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + } + + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/granite-hybrid.cpp b/src/models/granite-hybrid.cpp new file mode 100644 index 00000000000..f6ca4c17a21 --- /dev/null +++ b/src/models/granite-hybrid.cpp @@ -0,0 +1,196 @@ +#include "models.h" + + +llm_build_granite_hybrid::llm_build_granite_hybrid(const llama_model & model, const llm_graph_params & params) : + llm_graph_context_mamba(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * inp = build_inp_mem_hybrid(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + // Positional embeddings populated if rope enabled + ggml_tensor * inp_pos = nullptr; + if (hparams.rope_finetuned) { + inp_pos = build_inp_pos(); + } + + for (int il = 0; il < n_layer; ++il) { + struct ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + if (hparams.is_recurrent(il)) { + // ssm layer // + cur = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); + } else { + // attention layer // + cur = build_attention_layer(cur, inp_pos, inp->get_attn(), model, n_embd_head, il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + // ffn + cur = build_layer_ffn(cur, inpSA, model, il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + // For Granite architectures - scale logits + if (hparams.f_logit_scale) { + cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_logit_scale); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_granite_hybrid::build_attention_layer(ggml_tensor * cur, + ggml_tensor * inp_pos, + llm_graph_input_attn_kv * inp_attn, + const llama_model & model, + const int64_t n_embd_head, + const int il) { + // compute Q and K and (optionally) RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + + const bool use_rope = hparams.rope_finetuned; + if (use_rope) { + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, rope_factors, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + return cur; +} + +ggml_tensor * llm_build_granite_hybrid::build_layer_ffn(ggml_tensor * cur, + ggml_tensor * inpSA, + const llama_model & model, + const int il) { + // For Granite architectures - scale residual + if (hparams.f_residual_scale) { + cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network (non-MoE) + if (model.layers[il].ffn_gate_inp == nullptr) { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + } else { + // MoE branch + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // For Granite MoE Shared + if (hparams.n_ff_shexp > 0) { + ggml_tensor * ffn_shexp = + build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } else { + cur = moe_out; + } + } + + // For Granite architectures - scale residual + if (hparams.f_residual_scale) { + cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + return cur; +} diff --git a/src/models/granite.cpp b/src/models/granite.cpp new file mode 100644 index 00000000000..18748e9c26c --- /dev/null +++ b/src/models/granite.cpp @@ -0,0 +1,211 @@ +#include "models.h" + + +llm_build_granite::llm_build_granite( + const llama_model & model, + const llm_graph_params & params) + : llm_graph_context(params) { + + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - built only if rope enabled + ggml_tensor * inp_pos = nullptr; + if (hparams.rope_finetuned) { + inp_pos = build_inp_pos(); + } + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + cur = build_attention_layer( + cur, inp_pos, inp_attn, + model, n_embd_head, il); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + // ffn + cur = build_layer_ffn(cur, inpSA, model, il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + // For Granite architectures - scale logits + cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_logit_scale); + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_granite::build_attention_layer( + ggml_tensor * cur, + ggml_tensor * inp_pos, + llm_graph_input_attn_kv * inp_attn, + const llama_model & model, + const int64_t n_embd_head, + const int il) { + + // compute Q and K and (optionally) RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + + const bool use_rope = hparams.rope_finetuned; + if (use_rope) { + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + return cur; +} + +ggml_tensor * llm_build_granite::build_layer_ffn( + ggml_tensor * cur, + ggml_tensor * inpSA, + const llama_model & model, + const int il) { + + // For Granite architectures - scale residual + if (hparams.f_residual_scale) { + cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network (non-MoE) + if (model.layers[il].ffn_gate_inp == nullptr) { + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + } else { + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // For Granite MoE Shared + if (hparams.n_ff_shexp > 0) { + ggml_tensor * ffn_shexp = build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(ffn_shexp, "ffn_shexp", il); + + cur = ggml_add(ctx0, moe_out, ffn_shexp); + cb(cur, "ffn_out", il); + } else { + cur = moe_out; + } + } + + // For Granite architectures - scale residual + if (hparams.f_residual_scale) { + cur = ggml_scale(ctx0, cur, hparams.f_residual_scale); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + return cur; +} diff --git a/src/models/graph-context-mamba.cpp b/src/models/graph-context-mamba.cpp new file mode 100644 index 00000000000..b9a363b32b6 --- /dev/null +++ b/src/models/graph-context-mamba.cpp @@ -0,0 +1,283 @@ +#include "models.h" + +llm_graph_context_mamba::llm_graph_context_mamba(const llm_graph_params & params) : llm_graph_context(params) {} + +ggml_tensor * llm_graph_context_mamba::build_mamba_layer(llm_graph_input_rs * inp, + ggml_tensor * cur, + const llama_model & model, + const llama_ubatch & ubatch, + int il) { + const auto * mctx_cur = inp->mctx; + + const auto kv_head = mctx_cur->get_head(); + + const auto & layer = model.layers[il]; + + const int64_t d_conv = hparams.ssm_d_conv; + const int64_t d_inner = hparams.ssm_d_inner; + const int64_t d_state = hparams.ssm_d_state; + const int64_t dt_rank = hparams.ssm_dt_rank; + const int64_t n_head = d_inner; + const int64_t head_dim = 1; + const int64_t n_seqs = ubatch.n_seqs; + // Some variants of Mamba arch (e.g. FalconMamba do apply layer norm on B and Dt layers) + const bool ssm_dt_b_c_rms = hparams.ssm_dt_b_c_rms; + + const int64_t n_seq_tokens = ubatch.n_seq_tokens; + + GGML_ASSERT(n_seqs != 0); + GGML_ASSERT(ubatch.equal_seqs()); + GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); + + ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); + ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); + + ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); + conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner, n_seqs); + + // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} + cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); + + // {n_embd, 2*d_inner} @ {n_embd, n_seq_tokens, n_seqs} => {2*d_inner, n_seq_tokens, n_seqs} + ggml_tensor * xz = build_lora_mm(layer.ssm_in, cur); + // split the above in two + // => {d_inner, n_seq_tokens, n_seqs} + ggml_tensor * x = ggml_view_3d(ctx0, xz, d_inner, xz->ne[1], xz->ne[2], xz->nb[1], xz->nb[2], 0); + ggml_tensor * z = + ggml_view_3d(ctx0, xz, d_inner, xz->ne[1], xz->ne[2], xz->nb[1], xz->nb[2], d_inner * ggml_element_size(xz)); + + // conv + { + // => {d_conv - 1 + n_seq_tokens, d_inner, n_seqs} + ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, x), 0); + + // copy last (d_conv - 1) columns back into the state cache + ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner, n_seqs, conv_x->nb[1], conv_x->nb[2], + n_seq_tokens * (conv_x->nb[0])); + + ggml_build_forward_expand( + gf, ggml_cpy(ctx0, last_conv, + ggml_view_1d(ctx0, conv_states_all, (d_conv - 1) * (d_inner) * (n_seqs), + kv_head * (d_conv - 1) * (d_inner) *ggml_element_size(conv_states_all)))); + + // 1D convolution + // The equivalent is to make a self-overlapping view of conv_x + // over d_conv columns at each stride in the 3rd dimension, + // then element-wise multiply that with the conv1d weight, + // then sum the elements of each row, + // (the last two steps are a dot product over rows (also doable with mul_mat)) + // then permute away the ne[0] dimension, + // and then you're left with the resulting x tensor. + // For simultaneous sequences, all sequences need to have the same length. + x = ggml_ssm_conv(ctx0, conv_x, layer.ssm_conv1d); + + // bias + x = ggml_add(ctx0, x, layer.ssm_conv1d_b); + + x = ggml_silu(ctx0, x); + } + + // ssm + { + // {d_inner, dt_rank + 2*d_state} @ {d_inner, n_seq_tokens, n_seqs} => {dt_rank + 2*d_state, n_seq_tokens, n_seqs} + ggml_tensor * x_db = build_lora_mm(layer.ssm_x, x); + // split + ggml_tensor * dt = ggml_view_3d(ctx0, x_db, dt_rank, n_seq_tokens, n_seqs, x_db->nb[1], x_db->nb[2], 0); + ggml_tensor * B = + ggml_view_4d(ctx0, x_db, d_state, /* n_group */ 1, n_seq_tokens, n_seqs, d_state * x_db->nb[0], x_db->nb[1], + x_db->nb[2], ggml_element_size(x_db) * dt_rank); + ggml_tensor * C = + ggml_view_4d(ctx0, x_db, d_state, /* n_group */ 1, n_seq_tokens, n_seqs, d_state * x_db->nb[0], x_db->nb[1], + x_db->nb[2], ggml_element_size(x_db) * (dt_rank + d_state)); + + // Some Mamba variants (e.g. FalconMamba, Jamba) apply RMS norm in B, C & Dt layers + if (ssm_dt_b_c_rms || (layer.ssm_dt_norm && layer.ssm_b_norm && layer.ssm_c_norm)) { + dt = build_norm(dt, layer.ssm_dt_norm, NULL, LLM_NORM_RMS, il); + B = build_norm(B, layer.ssm_b_norm, NULL, LLM_NORM_RMS, il); + C = build_norm(C, layer.ssm_c_norm, NULL, LLM_NORM_RMS, il); + } + + // {dt_rank, d_inner} @ {dt_rank, n_seq_tokens, n_seqs} => {d_inner, n_seq_tokens, n_seqs} + dt = build_lora_mm(layer.ssm_dt, dt); + dt = ggml_add(ctx0, dt, layer.ssm_dt_b); + + cur = x; + x = ggml_reshape_4d(ctx0, x, head_dim, n_head, n_seq_tokens, n_seqs); + + ggml_tensor * A = layer.ssm_a; + + // use the states and the indices provided by build_recurrent_state + // (this is necessary in order to properly use the states before they are overwritten, + // while avoiding to make unnecessary copies of the states) + auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { + ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_head, mctx_cur->get_size()); + + // Custom operator to optimize the parallel associative scan + // as described in the Annex D of the Mamba paper. + // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} + return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); + }; + + ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); + + // store last states + ggml_build_forward_expand( + gf, ggml_cpy(ctx0, ggml_view_1d(ctx0, y_ssm, d_state * d_inner * n_seqs, x->nb[3] * x->ne[3]), + ggml_view_1d(ctx0, ssm_states_all, d_state * d_inner * n_seqs, + kv_head * d_state * d_inner * ggml_element_size(ssm_states_all)))); + + ggml_tensor * y = ggml_view_3d(ctx0, y_ssm, d_inner, n_seq_tokens, n_seqs, x->nb[2], x->nb[3], 0); + + // TODO: skip computing output earlier for unused tokens + + y = ggml_add(ctx0, y, ggml_mul(ctx0, cur, layer.ssm_d)); + y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); + + // {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} + cur = build_lora_mm(layer.ssm_out, y); + } + + // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} + cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); + + return cur; +} + +ggml_tensor * llm_graph_context_mamba::build_mamba2_layer(llm_graph_input_rs * inp, + ggml_tensor * cur, + const llama_model & model, + const llama_ubatch & ubatch, + int il) const { + const auto * mctx_cur = inp->mctx; + + const auto kv_head = mctx_cur->get_head(); + + const int64_t d_conv = hparams.ssm_d_conv; + const int64_t d_inner = hparams.ssm_d_inner; + const int64_t d_state = hparams.ssm_d_state; + const int64_t n_head = hparams.ssm_dt_rank; + const int64_t head_dim = d_inner / n_head; + const int64_t n_group = hparams.ssm_n_group; + const int64_t n_seqs = ubatch.n_seqs; + + const int64_t n_seq_tokens = ubatch.n_seq_tokens; + + GGML_ASSERT(n_seqs != 0); + GGML_ASSERT(ubatch.equal_seqs()); + GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); + + ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); + ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); + + ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); + conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner + 2 * n_group * d_state, n_seqs); + + // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} + cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); + + // d_in_proj = 2 * self.d_inner + 2 * self.ngroups * self.d_state + self.nheads + + // {n_embd, d_in_proj} @ {n_embd, n_seq_tokens, n_seqs} => {d_in_proj, n_seq_tokens, n_seqs} + ggml_tensor * zxBCdt = build_lora_mm(model.layers[il].ssm_in, cur); + + // split the above in three + ggml_tensor * z = ggml_view_4d(ctx0, zxBCdt, head_dim, n_head, n_seq_tokens, n_seqs, head_dim * zxBCdt->nb[0], + zxBCdt->nb[1], zxBCdt->nb[2], 0); + ggml_tensor * xBC = ggml_view_3d(ctx0, zxBCdt, d_inner + 2 * n_group * d_state, n_seq_tokens, n_seqs, zxBCdt->nb[1], + zxBCdt->nb[2], d_inner * ggml_element_size(zxBCdt)); + ggml_tensor * dt = ggml_view_3d(ctx0, zxBCdt, n_head, n_seq_tokens, n_seqs, zxBCdt->nb[1], zxBCdt->nb[2], + (2 * d_inner + 2 * n_group * d_state) * ggml_element_size(zxBCdt)); + + // conv + { + // => {d_conv - 1 + n_seq_tokens, d_inner + 2*n_group*d_state, n_seqs} + ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, xBC), 0); + + // copy last (d_conv - 1) columns back into the state cache + ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner + 2 * n_group * d_state, n_seqs, + conv_x->nb[1], conv_x->nb[2], n_seq_tokens * (conv_x->nb[0])); + + ggml_build_forward_expand(gf, ggml_cpy(ctx0, last_conv, + ggml_view_1d(ctx0, conv_states_all, + (d_conv - 1) * (d_inner + 2 * n_group * d_state) * (n_seqs), + kv_head * (d_conv - 1) * (d_inner + 2 * n_group * d_state) * + ggml_element_size(conv_states_all)))); + + // 1D convolution + // The equivalent is to make a self-overlapping view of conv_x + // over d_conv columns at each stride in the 3rd dimension, + // then element-wise multiply that with the conv1d weight, + // then sum the elements of each row, + // (the last two steps are a dot product over rows (also doable with mul_mat)) + // then permute away the ne[0] dimension, + // and then you're left with the resulting x tensor. + // For simultaneous sequences, all sequences need to have the same length. + xBC = ggml_ssm_conv(ctx0, conv_x, model.layers[il].ssm_conv1d); + + // bias + xBC = ggml_add(ctx0, xBC, model.layers[il].ssm_conv1d_b); + + xBC = ggml_silu(ctx0, xBC); + } + + // ssm + { + // These correspond to V K Q in SSM/attention duality + ggml_tensor * x = ggml_view_4d(ctx0, xBC, head_dim, n_head, n_seq_tokens, n_seqs, head_dim * xBC->nb[0], + xBC->nb[1], xBC->nb[2], 0); + ggml_tensor * B = ggml_view_4d(ctx0, xBC, d_state, n_group, n_seq_tokens, n_seqs, d_state * xBC->nb[0], + xBC->nb[1], xBC->nb[2], d_inner * ggml_element_size(xBC)); + ggml_tensor * C = ggml_view_4d(ctx0, xBC, d_state, n_group, n_seq_tokens, n_seqs, d_state * xBC->nb[0], + xBC->nb[1], xBC->nb[2], (d_inner + n_group * d_state) * ggml_element_size(xBC)); + + // {n_head, n_seq_tokens, n_seqs} + dt = ggml_add(ctx0, ggml_cont(ctx0, dt), model.layers[il].ssm_dt_b); + + ggml_tensor * A = model.layers[il].ssm_a; + + // use the states and the indices provided by build_recurrent_state + // (this is necessary in order to properly use the states before they are overwritten, + // while avoiding to make unnecessary copies of the states) + auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { + ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_head, mctx_cur->get_size()); + + // TODO: use semistructured matrices to implement state-space duality + // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} + return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); + }; + + ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); + + // store last states + ggml_build_forward_expand( + gf, ggml_cpy(ctx0, ggml_view_1d(ctx0, y_ssm, d_state * d_inner * n_seqs, ggml_nelements(x) * x->nb[0]), + ggml_view_1d(ctx0, ssm_states_all, d_state * d_inner * n_seqs, + kv_head * d_state * d_inner * ggml_element_size(ssm_states_all)))); + + ggml_tensor * y = ggml_view_4d(ctx0, y_ssm, head_dim, n_head, n_seq_tokens, n_seqs, x->nb[1], n_head * x->nb[1], + n_seq_tokens * n_head * x->nb[1], 0); + + // TODO: skip computing output earlier for unused tokens + + y = ggml_add(ctx0, y, ggml_mul(ctx0, x, model.layers[il].ssm_d)); + cb(y, "mamba2_y_add_d", il); + y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); + + // grouped RMS norm + if (model.layers[il].ssm_norm) { + y = ggml_reshape_4d(ctx0, y, d_inner / n_group, n_group, n_seq_tokens, n_seqs); + y = build_norm(y, model.layers[il].ssm_norm, NULL, LLM_NORM_RMS, il); + } + + y = ggml_reshape_3d(ctx0, y, d_inner, n_seq_tokens, n_seqs); + + // {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} + cur = build_lora_mm(model.layers[il].ssm_out, y); + } + + // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} + cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); + cb(cur, "mamba_out", il); + + return cur; +} diff --git a/src/models/grok.cpp b/src/models/grok.cpp new file mode 100644 index 00000000000..6781a0e924a --- /dev/null +++ b/src/models/grok.cpp @@ -0,0 +1,160 @@ +#include "models.h" + +llm_build_grok::llm_build_grok(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + cur = build_norm(cur, + model.layers[il].attn_out_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_out_norm", il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // MoE branch + ggml_tensor * moe_out = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_GELU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + if (model.layers[il].ffn_up) { + ggml_tensor * ffn_out = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_PAR, il); + cb(ffn_out, "ffn_out", il); + + cur = ggml_scale(ctx0, ggml_add(ctx0, ffn_out, moe_out), std::sqrt(2) / 2); + cb(cur, "ffn_out", il); + } else { + cur = moe_out; + } + cur = build_norm(cur, + model.layers[il].ffn_post_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_post_norm", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cur = ggml_scale(ctx0, cur, hparams.f_logit_scale); + + // final logit soft-capping + if (hparams.f_final_logit_softcapping) { + cur = ggml_scale(ctx0, cur, 1.0f / hparams.f_final_logit_softcapping); + cur = ggml_tanh(ctx0, cur); + cur = ggml_scale(ctx0, cur, hparams.f_final_logit_softcapping); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/grovemoe.cpp b/src/models/grovemoe.cpp new file mode 100644 index 00000000000..56b6db9a3d0 --- /dev/null +++ b/src/models/grovemoe.cpp @@ -0,0 +1,141 @@ +#include "models.h" + + + +llm_build_grovemoe::llm_build_grovemoe(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_chunk_expert = n_expert / hparams.n_group_experts; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * probs = build_lora_mm(model.layers[il].ffn_gate_inp, cur); // [n_expert, n_tokens] + cb(probs, "ffn_moe_logits", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + nullptr, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il, + probs); + cb(moe_out, "ffn_moe_out", il); + cur = moe_out; + + // TODO: Only do the expert selection and weights once + moe_out = build_moe_ffn(cur, + nullptr, + model.layers[il].ffn_up_chexps, + model.layers[il].ffn_gate_chexps, + model.layers[il].ffn_down_chexps, + nullptr, + n_chunk_expert, n_expert_used > n_chunk_expert ? n_chunk_expert : n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il, + probs); + cb(moe_out, "ffn_adj_moe_out", il); + + cur = ggml_add(ctx0, cur, ggml_scale(ctx0, moe_out, hparams.expert_group_scale)); + cb(cur, "ffn_final_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/hunyuan-dense.cpp b/src/models/hunyuan-dense.cpp new file mode 100644 index 00000000000..cb30a6a33aa --- /dev/null +++ b/src/models/hunyuan-dense.cpp @@ -0,0 +1,132 @@ +#include "models.h" + +llm_build_hunyuan_dense::llm_build_hunyuan_dense(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = 1.0f / sqrtf(float(n_embd_head)); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, + model.layers[il].attn_k_norm, nullptr, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_norm", il); + + Qcur = build_norm(Qcur, + model.layers[il].attn_q_norm, nullptr, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_norm", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + // feed-forward network (non-MoE) + ggml_tensor * cur_mlp = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur_mlp, "ffn_out", il); + + cur = ggml_add(ctx0, cur_mlp, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/hunyuan-moe.cpp b/src/models/hunyuan-moe.cpp new file mode 100644 index 00000000000..a9940b04af9 --- /dev/null +++ b/src/models/hunyuan-moe.cpp @@ -0,0 +1,154 @@ +#include "models.h" + +llm_build_hunyuan_moe::llm_build_hunyuan_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = 1.0f / sqrtf(float(n_embd_head)); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, + model.layers[il].attn_k_norm, nullptr, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_norm", il); + + Qcur = build_norm(Qcur, + model.layers[il].attn_q_norm, nullptr, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_norm", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network (non-MoE) + ggml_tensor * cur_mlp = build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur_mlp, "ffn_mlp", il); + + // MoE branch + ggml_tensor * cur_moe = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, + true, // norm_topk_prob + false, + 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur_moe, "ffn_moe_out", il); + + ggml_tensor * ffn_out = ggml_add(ctx0, cur_moe, cur_mlp); + cb(ffn_out, "ffn_out", il); + + cur = ggml_add(ctx0, ffn_out, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/internlm2.cpp b/src/models/internlm2.cpp new file mode 100644 index 00000000000..e97c82198df --- /dev/null +++ b/src/models/internlm2.cpp @@ -0,0 +1,121 @@ +#include "models.h" + + +llm_build_internlm2::llm_build_internlm2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/jais.cpp b/src/models/jais.cpp new file mode 100644 index 00000000000..a1c43065bbc --- /dev/null +++ b/src/models/jais.cpp @@ -0,0 +1,86 @@ +#include "models.h" + +llm_build_jais::llm_build_jais(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*cur->nb[0]*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*cur->nb[0]*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*cur->nb[0]*(n_embd + n_embd_gqa)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/float(n_embd_head), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + // add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + inpL = ggml_add(ctx0, cur, ffn_inp); + cb(inpL, "l_out", il); + } + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/jamba.cpp b/src/models/jamba.cpp new file mode 100644 index 00000000000..0c8c1361d4e --- /dev/null +++ b/src/models/jamba.cpp @@ -0,0 +1,107 @@ +#include "models.h" + + +llm_build_jamba::llm_build_jamba(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + ggml_tensor * cur; + ggml_tensor * inpL; + + // {n_embd, n_tokens} + inpL = build_inp_embd(model.tok_embd); + + auto * inp_hybrid = build_inp_mem_hybrid(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const int64_t n_head_kv = hparams.n_head_kv(il); + + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + if (n_head_kv == 0) { + cur = build_mamba_layer(inp_hybrid->get_recr(), cur, model, ubatch, il); + } else { + // Attention + + struct ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + struct ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + struct ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + // No RoPE :) + cur = build_attn(inp_hybrid->get_attn(), + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, NULL, NULL, NULL, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + // residual + struct ggml_tensor * ffn_inp = ggml_add(ctx0, inpL, cur); + cb(cur, "ffn_inp", il); + + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + if (model.layers[il].ffn_gate_inp == nullptr) { + // FFN + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + } + // residual + cur = ggml_add(ctx0, ffn_inp, cur); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + // final rmsnorm + cur = build_norm(inpL, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/lfm2.cpp b/src/models/lfm2.cpp new file mode 100644 index 00000000000..ca06bacd7bc --- /dev/null +++ b/src/models/lfm2.cpp @@ -0,0 +1,173 @@ +#include "models.h" + +#include "../llama-memory-hybrid.h" + + +llm_build_lfm2::llm_build_lfm2(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params), + model(model) { + ggml_tensor * cur = build_inp_embd(model.tok_embd); + cb(cur, "model.embed_tokens", -1); + + ggml_tensor * inp_pos = build_inp_pos(); + auto * inp_hybrid = build_inp_mem_hybrid(); + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const bool is_moe_layer = il >= static_cast(hparams.n_layer_dense_lead); + + auto * prev_cur = cur; + cur = build_norm(cur, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "model.layers.{}.operator_norm", il); + + cur = hparams.is_recurrent(il) ? build_shortconv_block(cur, inp_hybrid->get_recr(), il) : + build_attn_block(cur, inp_pos, inp_hybrid->get_attn(), il); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + prev_cur = ggml_get_rows(ctx0, prev_cur, inp_out_ids); + } + + cur = ggml_add(ctx0, prev_cur, cur); + + auto * ffn_norm_out = build_norm(cur, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(ffn_norm_out, "model.layers.{}.ffn_norm", il); + + ggml_tensor * ffn_out = + is_moe_layer ? build_moe_feed_forward(ffn_norm_out, il) : build_dense_feed_forward(ffn_norm_out, il); + cb(ffn_norm_out, "model.layers.{}.ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_out); + } + + cur = build_norm(cur, model.tok_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "model.embedding_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + cb(cur, "lm_head", -1); + + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_lfm2::build_moe_feed_forward(ggml_tensor * cur, int il) const { + return build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, n_expert, n_expert_used, LLM_FFN_SILU, true, false, 0.0, + static_cast(hparams.expert_gating_func), il); +} + +ggml_tensor * llm_build_lfm2::build_dense_feed_forward(ggml_tensor * cur, int il) const { + GGML_ASSERT(!model.layers[il].ffn_up_b); + GGML_ASSERT(!model.layers[il].ffn_gate_b); + GGML_ASSERT(!model.layers[il].ffn_down_b); + return build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); +} + +ggml_tensor * llm_build_lfm2::build_attn_block(ggml_tensor * cur, + ggml_tensor * inp_pos, + llm_graph_input_attn_kv * inp_attn, + int il) const { + GGML_ASSERT(hparams.n_embd_v_gqa(il) == hparams.n_embd_k_gqa(il)); + const auto n_embd_head = hparams.n_embd_head_v; + const auto n_head_kv = hparams.n_head_kv(il); + + auto * q = build_lora_mm(model.layers[il].wq, cur); + cb(q, "model.layers.{}.self_attn.q_proj", il); + auto * k = build_lora_mm(model.layers[il].wk, cur); + cb(k, "model.layers.{}.self_attn.k_proj", il); + auto * v = build_lora_mm(model.layers[il].wv, cur); + cb(v, "model.layers.{}.self_attn.v_proj", il); + + q = ggml_reshape_3d(ctx0, q, n_embd_head, n_head, n_tokens); + k = ggml_reshape_3d(ctx0, k, n_embd_head, n_head_kv, n_tokens); + v = ggml_reshape_3d(ctx0, v, n_embd_head, n_head_kv, n_tokens); + + // qk norm + q = build_norm(q, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(q, "model.layers.{}.self_attn.q_layernorm", il); + k = build_norm(k, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(k, "model.layers.{}.self_attn.k_layernorm", il); + + // RoPE + q = ggml_rope_ext(ctx0, q, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, + attn_factor, beta_fast, beta_slow); + k = ggml_rope_ext(ctx0, k, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, ext_factor, + attn_factor, beta_fast, beta_slow); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + q, k, v, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + + cb(cur, "model.layers.{}.self_attn.out_proj", il); + + return cur; +} + +ggml_tensor * llm_build_lfm2::build_shortconv_block(ggml_tensor * cur, llm_graph_input_rs * inp_recr, int il) { + const auto * mctx_cur = static_cast(mctx)->get_recr(); + const uint32_t kv_head = mctx_cur->get_head(); + const int64_t n_seq_tokens = ubatch.n_seq_tokens; + const int64_t n_seqs = ubatch.n_seqs; + GGML_ASSERT(n_seqs != 0); + GGML_ASSERT(ubatch.equal_seqs()); + GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); + + GGML_ASSERT(hparams.n_shortconv_l_cache > 1); + const uint32_t d_conv = hparams.n_shortconv_l_cache - 1; + + // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} + cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); + + auto * bcx = build_lora_mm(model.layers[il].shortconv.in_proj, cur); + cb(bcx, "model.layers.{}.conv.in_proj", il); + + constexpr auto n_chunks = 3; + GGML_ASSERT(bcx->ne[0] % n_chunks == 0); + const auto chunk_size = bcx->ne[0] / n_chunks; + auto * b = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], + 0 * chunk_size * ggml_element_size(bcx)); + auto * c = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], + 1 * chunk_size * ggml_element_size(bcx)); + auto * x = ggml_view_3d(ctx0, bcx, chunk_size, bcx->ne[1], bcx->ne[2], bcx->nb[1], bcx->nb[2], + 2 * chunk_size * ggml_element_size(bcx)); + + auto * bx = ggml_transpose(ctx0, ggml_mul(ctx0, b, x)); + + // read conv state + auto * conv_state = mctx_cur->get_r_l(il); + auto * conv_rs = build_rs(inp_recr, conv_state, hparams.n_embd_r(), n_seqs); + auto * conv = ggml_reshape_3d(ctx0, conv_rs, d_conv, hparams.n_embd, n_seqs); + + bx = ggml_concat(ctx0, conv, bx, 0); + GGML_ASSERT(bx->ne[0] > conv->ne[0]); + + // last d_conv columns is a new conv state + auto * new_conv = ggml_view_3d(ctx0, bx, conv->ne[0], bx->ne[1], bx->ne[2], bx->nb[1], bx->nb[2], + (bx->ne[0] - conv->ne[0]) * ggml_element_size(bx)); + GGML_ASSERT(ggml_are_same_shape(conv, new_conv)); + + // write new conv conv state + ggml_build_forward_expand(gf, ggml_cpy(ctx0, new_conv, + ggml_view_1d(ctx0, conv_state, ggml_nelements(new_conv), + kv_head * d_conv * n_embd * ggml_element_size(new_conv)))); + + auto * conv_kernel = model.layers[il].shortconv.conv; + auto * conv_out = ggml_ssm_conv(ctx0, bx, conv_kernel); + cb(conv_out, "model.layers.{}.conv.conv", il); + + auto * y = ggml_mul(ctx0, c, conv_out); + y = build_lora_mm(model.layers[il].shortconv.out_proj, y); + cb(y, "model.layers.{}.conv.out_proj", il); + // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} + y = ggml_reshape_2d(ctx0, y, y->ne[0], n_seq_tokens * n_seqs); + + return y; +} diff --git a/src/models/llada-moe.cpp b/src/models/llada-moe.cpp new file mode 100644 index 00000000000..2dcef4caccc --- /dev/null +++ b/src/models/llada-moe.cpp @@ -0,0 +1,123 @@ +#include "models.h" + +llm_build_llada_moe::llm_build_llada_moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + diff --git a/src/models/llada.cpp b/src/models/llada.cpp new file mode 100644 index 00000000000..b10b89b1f62 --- /dev/null +++ b/src/models/llada.cpp @@ -0,0 +1,101 @@ +#include "models.h" + + +llm_build_llada::llm_build_llada(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params) { + // LLaDA is similar to LLaMA but uses non-causal attention for diffusion + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + // Non-causal attention for diffusion + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute separate Q, K, V projections without bias, matching LLaDALlamaBlock + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/llama-iswa.cpp b/src/models/llama-iswa.cpp new file mode 100644 index 00000000000..03f80616821 --- /dev/null +++ b/src/models/llama-iswa.cpp @@ -0,0 +1,174 @@ +#include "models.h" + +llm_build_llama_iswa::llm_build_llama_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + // temperature tuning + ggml_tensor * inp_attn_scale = nullptr; + inp_attn_scale = build_inp_attn_scale(); + + auto * inp_attn = build_attn_inp_kv_iswa(); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + const bool use_rope = hparams.n_no_rope_layer_step > 0 && + (il + 1) % hparams.n_no_rope_layer_step != 0; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (use_rope) { + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + } else if (inp_attn_scale) { + Qcur = ggml_mul(ctx0, Qcur, inp_attn_scale); + } + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + if (use_rope && hparams.use_kq_norm) { + // Llama4TextL2Norm + Qcur = ggml_rms_norm(ctx0, Qcur, hparams.f_norm_rms_eps); + Kcur = ggml_rms_norm(ctx0, Kcur, hparams.f_norm_rms_eps); + cb(Qcur, "Qcur_normed", il); + cb(Kcur, "Kcur_normed", il); + } + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network (non-MoE) + if (model.layers[il].ffn_gate_inp == nullptr) { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + ggml_tensor * ffn_inp_normed = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = build_moe_ffn(ffn_inp_normed, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID, + il); + + // Shared experts + ggml_tensor * shexp_out = build_ffn(ffn_inp_normed, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(shexp_out, "ffn_moe_shexp", il); + + cur = ggml_add(ctx0, moe_out, shexp_out); + cb(cur, "ffn_moe_out_merged", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/llama.cpp b/src/models/llama.cpp new file mode 100644 index 00000000000..289028959f9 --- /dev/null +++ b/src/models/llama.cpp @@ -0,0 +1,156 @@ +#include "models.h" + + +llm_build_llama::llm_build_llama(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // rope freq factors for llama3; may return nullptr for llama2 and other models + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + if (hparams.use_kq_norm) { + // Llama4TextL2Norm + Qcur = ggml_rms_norm(ctx0, Qcur, hparams.f_norm_rms_eps); + Kcur = ggml_rms_norm(ctx0, Kcur, hparams.f_norm_rms_eps); + cb(Qcur, "Qcur_normed", il); + cb(Kcur, "Kcur_normed", il); + } + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network (non-MoE) + if (model.layers[il].ffn_gate_inp == nullptr) { + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } diff --git a/src/models/mamba.cpp b/src/models/mamba.cpp new file mode 100644 index 00000000000..46819613c2d --- /dev/null +++ b/src/models/mamba.cpp @@ -0,0 +1,55 @@ +#include "models.h" + + +llm_build_mamba::llm_build_mamba(const llama_model & model, const llm_graph_params & params) : llm_graph_context_mamba(params) { + ggml_tensor * cur; + ggml_tensor * inpL; + + // {n_embd, n_tokens} + inpL = build_inp_embd(model.tok_embd); + + auto * rs_inp = build_rs_inp(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + if (model.arch == LLM_ARCH_MAMBA2) { + cur = build_mamba2_layer(rs_inp, cur, model, ubatch, il); + } else { + cur = build_mamba_layer(rs_inp, cur, model, ubatch, il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // residual + cur = ggml_add(ctx0, cur, inpL); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + // final rmsnorm + cur = build_norm(inpL, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + diff --git a/src/models/minicpm3.cpp b/src/models/minicpm3.cpp new file mode 100644 index 00000000000..02ce21ce653 --- /dev/null +++ b/src/models/minicpm3.cpp @@ -0,0 +1,200 @@ +#include "models.h" + + +llm_build_minicpm3::llm_build_minicpm3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + //TODO: if the model varies, these parameters need to be read from the model + const int64_t n_embd_base = 256; + const float scale_embd = 12.0f; + const float scale_depth = 1.4f; + const float kq_scale = 1.0f / sqrtf(float(hparams.n_embd_head_k)); + + const uint32_t n_embd_head_qk_rope = hparams.n_rot; + const uint32_t n_embd_head_qk_nope = hparams.n_embd_head_k - hparams.n_rot; + const uint32_t kv_lora_rank = hparams.n_lora_kv; + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // scale the input embeddings + inpL = ggml_scale(ctx0, inpL, scale_embd); + cb(inpL, "inp_scaled", -1); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + ggml_tensor * q = NULL; + // {n_embd, q_lora_rank} * {n_embd, n_tokens} -> {q_lora_rank, n_tokens} + q = ggml_mul_mat(ctx0, model.layers[il].wq_a, cur); + cb(q, "q", il); + + q = build_norm(q, + model.layers[il].attn_q_a_norm, NULL, + LLM_NORM_RMS, il); + cb(q, "q", il); + + // {q_lora_rank, n_head * hparams.n_embd_head_k} * {q_lora_rank, n_tokens} -> {n_head * hparams.n_embd_head_k, n_tokens} + q = ggml_mul_mat(ctx0, model.layers[il].wq_b, q); + cb(q, "q", il); + + // split into {n_head * n_embd_head_qk_nope, n_tokens} + ggml_tensor * q_nope = ggml_view_3d(ctx0, q, n_embd_head_qk_nope, n_head, n_tokens, + ggml_row_size(q->type, hparams.n_embd_head_k), + ggml_row_size(q->type, hparams.n_embd_head_k * n_head), + 0); + cb(q_nope, "q_nope", il); + + // and {n_head * n_embd_head_qk_rope, n_tokens} + ggml_tensor * q_pe = ggml_view_3d(ctx0, q, n_embd_head_qk_rope, n_head, n_tokens, + ggml_row_size(q->type, hparams.n_embd_head_k), + ggml_row_size(q->type, hparams.n_embd_head_k * n_head), + ggml_row_size(q->type, n_embd_head_qk_nope)); + cb(q_pe, "q_pe", il); + + // {n_embd, kv_lora_rank + n_embd_head_qk_rope} * {n_embd, n_tokens} -> {kv_lora_rank + n_embd_head_qk_rope, n_tokens} + ggml_tensor * kv_pe_compresseed = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); + cb(kv_pe_compresseed, "kv_pe_compresseed", il); + + // split into {kv_lora_rank, n_tokens} + ggml_tensor * kv_compressed = ggml_view_2d(ctx0, kv_pe_compresseed, kv_lora_rank, n_tokens, + kv_pe_compresseed->nb[1], + 0); + cb(kv_compressed, "kv_compressed", il); + + // and {n_embd_head_qk_rope, n_tokens} + ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_pe_compresseed, n_embd_head_qk_rope, 1, n_tokens, + kv_pe_compresseed->nb[1], + kv_pe_compresseed->nb[1], + ggml_row_size(kv_pe_compresseed->type, kv_lora_rank)); + cb(k_pe, "k_pe", il); + + kv_compressed = build_norm(kv_compressed, + model.layers[il].attn_kv_a_norm, NULL, + LLM_NORM_RMS, il); + cb(kv_compressed, "kv_compressed", il); + + // {kv_lora_rank, n_head * (n_embd_head_qk_nope + n_embd_head_v)} * {kv_lora_rank, n_tokens} -> {n_head * (n_embd_head_qk_nope + n_embd_head_v), n_tokens} + ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_compressed); + cb(kv, "kv", il); + + // split into {n_head * n_embd_head_qk_nope, n_tokens} + ggml_tensor * k_nope = ggml_view_3d(ctx0, kv, n_embd_head_qk_nope, n_head, n_tokens, + ggml_row_size(kv->type, n_embd_head_qk_nope + hparams.n_embd_head_v), + ggml_row_size(kv->type, n_head * (n_embd_head_qk_nope + hparams.n_embd_head_v)), + 0); + cb(k_nope, "k_nope", il); + + // and {n_head * n_embd_head_v, n_tokens} + ggml_tensor * v_states = ggml_view_3d(ctx0, kv, hparams.n_embd_head_v, n_head, n_tokens, + ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)), + ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)*n_head), + ggml_row_size(kv->type, (n_embd_head_qk_nope))); + cb(v_states, "v_states", il); + + v_states = ggml_cont(ctx0, v_states); + cb(v_states, "v_states", il); + + q_pe = ggml_rope_ext( + ctx0, q_pe, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(q_pe, "q_pe", il); + + // shared RoPE key + k_pe = ggml_rope_ext( + ctx0, k_pe, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(k_pe, "k_pe", il); + + ggml_tensor * q_states = ggml_concat(ctx0, q_nope, q_pe, 0); + cb(q_states, "q_states", il); + + ggml_tensor * k_states = ggml_concat(ctx0, k_nope, ggml_repeat(ctx0, k_pe, q_pe), 0); + cb(k_states, "k_states", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + q_states, k_states, v_states, nullptr, nullptr, nullptr, kq_scale, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + // scale_res - scale the hidden states for residual connection + const float scale_res = scale_depth/sqrtf(float(n_layer)); // TODO: is this correct? + cur = ggml_scale(ctx0, cur, scale_res); + cb(cur, "hidden_scaled", il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + // scale the hidden states for residual connection + cur = ggml_scale(ctx0, cur, scale_res); + cb(cur, "hidden_scaled_ffn", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head scaling + const float scale_lmhead = float(n_embd_base)/float(n_embd); + cur = ggml_scale(ctx0, cur, scale_lmhead); + cb(cur, "lmhead_scaling", -1); + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/minimax-m2.cpp b/src/models/minimax-m2.cpp new file mode 100644 index 00000000000..f7001badf75 --- /dev/null +++ b/src/models/minimax-m2.cpp @@ -0,0 +1,124 @@ + +#include "models.h" + +llm_build_minimax_m2::llm_build_minimax_m2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + // GGML_ASSERT(n_embd_head == hparams.n_rot); this is wrong in case of minimax, head_dim = 128, n_rot = 64 + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * inp_pos = build_inp_pos(); + auto inp_attn = build_attn_inp_kv(); + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = inpL; + + // self_attention + { + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + model.layers[il].ffn_exp_probs_b, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + (llama_expert_gating_func_type) hparams.expert_gating_func, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/models.h b/src/models/models.h new file mode 100644 index 00000000000..af203343a4d --- /dev/null +++ b/src/models/models.h @@ -0,0 +1,477 @@ +#pragma once + +#include "../llama-model.h" +#include "../llama-graph.h" +#include "../llama-memory-recurrent.h" + +#include + +struct llm_graph_context_mamba : public llm_graph_context { + llm_graph_context_mamba(const llm_graph_params & params); + + virtual ~llm_graph_context_mamba() = default; + + ggml_tensor * build_mamba_layer(llm_graph_input_rs * inp, ggml_tensor * cur, const llama_model & model, const llama_ubatch & ubatch, int il); + ggml_tensor * build_mamba2_layer(llm_graph_input_rs * inp, ggml_tensor * cur, const llama_model & model, const llama_ubatch & ubatch, int il) const; + +}; + +// Base class for RWKV-related models +struct llm_build_rwkv6_base : public llm_graph_context { + const llama_model & model; + + llm_build_rwkv6_base(const llama_model & model, const llm_graph_params & params); + + virtual ~llm_build_rwkv6_base() = default; + + ggml_tensor * build_rwkv6_channel_mix(const llama_layer * layer, + ggml_tensor * cur, + ggml_tensor * x_prev, + llm_arch arch) const; + + ggml_tensor * build_rwkv6_time_mix(llm_graph_input_rs * inp, + ggml_tensor * cur, + ggml_tensor * x_prev, + const llama_ubatch & ubatch, + int il) const; +}; + +// Base class for RWKV7-related models +struct llm_build_rwkv7_base : public llm_graph_context { + const llama_model & model; + + llm_build_rwkv7_base(const llama_model & model, const llm_graph_params & params); + + virtual ~llm_build_rwkv7_base() = default; + + // RWKV7-specific graph building methods + ggml_tensor * build_rwkv7_channel_mix(const llama_layer * layer, + ggml_tensor * cur, + ggml_tensor * x_prev, + llm_arch arch) const; + ggml_tensor * build_rwkv7_time_mix(llm_graph_input_rs * inp, + ggml_tensor * cur, + ggml_tensor * x_prev, + ggml_tensor *& first_layer_value, + const llama_ubatch & ubatch, + int il) const; +}; + +struct llm_build_apertus : public llm_graph_context { + llm_build_apertus(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_arcee : public llm_graph_context { + llm_build_arcee(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_arctic : public llm_graph_context { + llm_build_arctic(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_arwkv7 : public llm_build_rwkv7_base { + llm_build_arwkv7(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_baichuan : public llm_graph_context { + llm_build_baichuan(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_bailingmoe2 : public llm_graph_context { + llm_build_bailingmoe2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_bailingmoe : public llm_graph_context { + llm_build_bailingmoe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_bert : public llm_graph_context { + llm_build_bert(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_bitnet : public llm_graph_context { + llm_build_bitnet(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_bloom : public llm_graph_context { + llm_build_bloom(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_chameleon : public llm_graph_context { + llm_build_chameleon(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_chatglm : public llm_graph_context { + llm_build_chatglm(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_codeshell : public llm_graph_context { + llm_build_codeshell(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_cogvlm : public llm_graph_context { + llm_build_cogvlm(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_cohere2_iswa : public llm_graph_context { + llm_build_cohere2_iswa(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_command_r : public llm_graph_context { + llm_build_command_r(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_dbrx : public llm_graph_context { + llm_build_dbrx(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_deci : public llm_graph_context { + llm_build_deci(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_deepseek2 : public llm_graph_context { + llm_build_deepseek2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_deepseek : public llm_graph_context { + llm_build_deepseek(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_dots1 : public llm_graph_context { + llm_build_dots1(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_dream : public llm_graph_context { + llm_build_dream(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_ernie4_5 : public llm_graph_context { + llm_build_ernie4_5(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_ernie4_5_moe : public llm_graph_context { + llm_build_ernie4_5_moe(const llama_model & model, const llm_graph_params & params); +}; + +template +struct llm_build_exaone4 : public llm_graph_context { + llm_build_exaone4(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_exaone : public llm_graph_context { + llm_build_exaone(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_falcon : public llm_graph_context { + llm_build_falcon(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_falcon_h1 : public llm_graph_context_mamba { + llm_build_falcon_h1(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gemma2_iswa : public llm_graph_context { + llm_build_gemma2_iswa(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gemma3_iswa : public llm_graph_context { + llm_build_gemma3_iswa(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gemma3n_iswa : public llm_graph_context { + const llama_model & model; + + const int64_t n_embd_head; + const int64_t n_embd_altup; + const int64_t n_altup; + const int i_altup_act; + const int n_layer_sparsity = 10; // number of layers using activation sparsity + const float f_sparsity_std_mul = 1.6448533535003662f; // std_multiplier = normal_dist.icdf(0.95) + + llm_build_gemma3n_iswa(const llama_model & model, const llm_graph_params & params); + ggml_tensor * calc_magnitude(ggml_tensor * x); + ggml_tensor * view_2d_slice(ggml_tensor * x, int idx); + ggml_tensor * get_per_layer_inputs(); + ggml_tensor * project_per_layer_inputs(ggml_tensor * inputs_embeds, ggml_tensor * inp_per_layer); + ggml_tensor * gaussian_topk(ggml_tensor * x); + ggml_tensor * altup_compute_router_modalities(ggml_tensor * x, int il); + ggml_tensor * altup_predict(ggml_tensor * cur, int il); + ggml_tensor * laurel(ggml_tensor * cur, int il); + ggml_tensor * altup_correct(ggml_tensor * predictions, ggml_tensor * activated, int il); +}; + +struct llm_build_gemma_embedding : public llm_graph_context { + llm_build_gemma_embedding(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gemma : public llm_graph_context { + llm_build_gemma(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_glm4 : public llm_graph_context { + llm_build_glm4(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_glm4_moe : public llm_graph_context { + llm_build_glm4_moe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gpt2 : public llm_graph_context { + llm_build_gpt2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_gptneox : public llm_graph_context { + llm_build_gptneox(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_granite : public llm_graph_context { + llm_build_granite(const llama_model & model, const llm_graph_params & params); + +private: + ggml_tensor * build_attention_layer( + ggml_tensor * cur, + ggml_tensor * inp_pos, + llm_graph_input_attn_kv * inp_attn, + const llama_model & model, + const int64_t n_embd_head, + const int il); + + ggml_tensor * build_layer_ffn( + ggml_tensor * cur, + ggml_tensor * inpSA, + const llama_model & model, + const int il); +}; + +struct llm_build_granite_hybrid : public llm_graph_context_mamba { + llm_build_granite_hybrid(const llama_model & model, const llm_graph_params & params); + ggml_tensor * build_layer_ffn(ggml_tensor * cur, ggml_tensor * inpSA, const llama_model & model, const int il); + ggml_tensor * build_attention_layer(ggml_tensor * cur, ggml_tensor * inp_pos, llm_graph_input_attn_kv * inp_attn, + const llama_model & model,const int64_t n_embd_head, const int il); +}; + +struct llm_build_grok : public llm_graph_context { + llm_build_grok(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_grovemoe : public llm_graph_context { + llm_build_grovemoe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_hunyuan_dense : public llm_graph_context { + llm_build_hunyuan_dense(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_hunyuan_moe : public llm_graph_context { + llm_build_hunyuan_moe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_internlm2 : public llm_graph_context { + llm_build_internlm2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_jais : public llm_graph_context { + llm_build_jais(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_jamba : public llm_graph_context_mamba { + llm_build_jamba(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_lfm2 : public llm_graph_context { + const llama_model & model; + + llm_build_lfm2(const llama_model & model, const llm_graph_params & params); + ggml_tensor * build_moe_feed_forward(ggml_tensor * cur, int il) const; + ggml_tensor * build_dense_feed_forward(ggml_tensor * cur, int il) const; + ggml_tensor * build_attn_block(ggml_tensor * cur, ggml_tensor * inp_pos, llm_graph_input_attn_kv * inp_attn, int il) const; + ggml_tensor * build_shortconv_block(ggml_tensor * cur, llm_graph_input_rs * inp_recr, int il); + +}; + +struct llm_build_llada : public llm_graph_context { + llm_build_llada(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_llada_moe : public llm_graph_context { + llm_build_llada_moe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_llama : public llm_graph_context { + llm_build_llama(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_llama_iswa : public llm_graph_context { + llm_build_llama_iswa(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_mamba : public llm_graph_context_mamba { + llm_build_mamba(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_minicpm3 : public llm_graph_context { + llm_build_minicpm3(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_minimax_m2 : public llm_graph_context { + llm_build_minimax_m2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_mpt : public llm_graph_context { + llm_build_mpt(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_nemotron : public llm_graph_context { + llm_build_nemotron(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_nemotron_h : public llm_graph_context_mamba { + llm_build_nemotron_h(const llama_model & model, const llm_graph_params & params); + ggml_tensor * build_ffn_layer(ggml_tensor * cur, const llama_model & model, const int il); + ggml_tensor * build_attention_layer(ggml_tensor * cur, llm_graph_input_attn_kv * inp_attn, + const llama_model & model, const int64_t n_embd_head, const int il); +}; + +struct llm_build_neo_bert : public llm_graph_context { + llm_build_neo_bert(const llama_model & model, const llm_graph_params & params); +}; + +template +struct llm_build_olmo2 : public llm_graph_context { + llm_build_olmo2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_olmoe : public llm_graph_context { + llm_build_olmoe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_olmo : public llm_graph_context { + llm_build_olmo(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_openai_moe_iswa : public llm_graph_context { + llm_build_openai_moe_iswa(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_openelm : public llm_graph_context { + llm_build_openelm(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_orion : public llm_graph_context { + llm_build_orion(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_phi2 : public llm_graph_context { + llm_build_phi2(const llama_model & model, const llm_graph_params & params); +}; + +template +struct llm_build_phi3 : public llm_graph_context { + llm_build_phi3(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_plamo2 : public llm_graph_context_mamba { + llm_build_plamo2(const llama_model & model, const llm_graph_params & params); + private: + ggml_tensor * build_plamo2_mamba_layer(llm_graph_input_rs * inp, ggml_tensor * cur, const llama_model & model, const llama_ubatch & ubatch, int il); + ggml_tensor * build_plamo2_attn_layer(llm_graph_input_attn_kv * inp, ggml_tensor * inp_pos, ggml_tensor * cur, + const llama_model & model, int il); +}; + +struct llm_build_plamo : public llm_graph_context { + llm_build_plamo(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_plm : public llm_graph_context { + llm_build_plm(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen2 : public llm_graph_context { + llm_build_qwen2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen2moe : public llm_graph_context { + llm_build_qwen2moe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen2vl : public llm_graph_context { + llm_build_qwen2vl(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen3 : public llm_graph_context { + llm_build_qwen3(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen3moe : public llm_graph_context { + llm_build_qwen3moe(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen3vl : public llm_graph_context { + llm_build_qwen3vl(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_qwen3vlmoe : public llm_graph_context { + llm_build_qwen3vlmoe(const llama_model & model, const llm_graph_params & params); +}; + + +struct llm_build_qwen : public llm_graph_context { + llm_build_qwen(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_refact : public llm_graph_context { + llm_build_refact(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_rwkv6 : public llm_build_rwkv6_base { + llm_build_rwkv6(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_rwkv6qwen2 : public llm_build_rwkv6_base { + llm_build_rwkv6qwen2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_rwkv7 : public llm_build_rwkv7_base { + llm_build_rwkv7(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_seed_oss : public llm_graph_context { + llm_build_seed_oss(const llama_model & model, const llm_graph_params & params); +}; + +template +struct llm_build_smallthinker : public llm_graph_context { + llm_build_smallthinker(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_smollm3 : public llm_graph_context { + llm_build_smollm3(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_stablelm : public llm_graph_context { + llm_build_stablelm(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_starcoder2 : public llm_graph_context { + llm_build_starcoder2(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_starcoder : public llm_graph_context { + llm_build_starcoder(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_t5_dec : public llm_graph_context { + llm_build_t5_dec(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_t5_enc : public llm_graph_context { + llm_build_t5_enc(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_wavtokenizer_dec : public llm_graph_context { + llm_build_wavtokenizer_dec(const llama_model & model, const llm_graph_params & params); +}; + +struct llm_build_xverse : public llm_graph_context { + llm_build_xverse(const llama_model & model, const llm_graph_params & params); +}; diff --git a/src/models/mpt.cpp b/src/models/mpt.cpp new file mode 100644 index 00000000000..2328e027a74 --- /dev/null +++ b/src/models/mpt.cpp @@ -0,0 +1,126 @@ +#include "models.h" + + + +llm_build_mpt::llm_build_mpt(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * pos; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * inp_attn = build_attn_inp_kv(); + + if (model.pos_embd) { + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); + cb(pos, "pos_embd", -1); + + inpL = ggml_add(ctx0, inpL, pos); + cb(inpL, "inpL", -1); + } + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * attn_norm; + + attn_norm = build_norm(inpL, model.layers[il].attn_norm, model.layers[il].attn_norm_b, LLM_NORM, il); + cb(attn_norm, "attn_norm", il); + + // self-attention + { + cur = attn_norm; + + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + if (model.layers[il].bqkv) { + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + } + + if (hparams.f_clamp_kqv > 0.0f) { + cur = ggml_clamp(ctx0, cur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); + cb(cur, "wqkv_clamped", il); + } + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 0 * sizeof(float) * (n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), + cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); + + // Q/K Layernorm + if (model.layers[il].attn_q_norm) { + Qcur = ggml_reshape_2d(ctx0, Qcur, n_embd_head * n_head, n_tokens); + Kcur = ggml_reshape_2d(ctx0, Kcur, n_embd_head * n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, model.layers[il].attn_q_norm_b, LLM_NORM, il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, model.layers[il].attn_k_norm_b, LLM_NORM, il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + } + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + + // Add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // feed forward + { + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, LLM_NORM, il); + cb(cur, "ffn_norm", il); + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + model.layers[il].ffn_act, LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/nemotron-h.cpp b/src/models/nemotron-h.cpp new file mode 100644 index 00000000000..54143488887 --- /dev/null +++ b/src/models/nemotron-h.cpp @@ -0,0 +1,121 @@ +#include "models.h" + + + +llm_build_nemotron_h::llm_build_nemotron_h(const llama_model & model, const llm_graph_params & params) : + llm_graph_context_mamba(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + ggml_build_forward_expand(gf, inpL); + + auto * inp = build_inp_mem_hybrid(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + struct ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + if (hparams.is_recurrent(il)) { + // ssm layer // + cur = build_mamba2_layer(inp->get_recr(), cur, model, ubatch, il); + } else if (hparams.n_ff(il) == 0) { + // attention layer // + cur = build_attention_layer(cur, inp->get_attn(), model, n_embd_head, il); + } else { + cur = build_ffn_layer(cur, model, il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + // add residual + cur = ggml_add(ctx0, cur, inpSA); + cb(cur, "nemotron_h_block_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_nemotron_h::build_attention_layer(ggml_tensor * cur, + llm_graph_input_attn_kv * inp_attn, + const llama_model & model, + const int64_t n_embd_head, + const int il) { + // compute Q and K and (optionally) RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, hparams.n_head(il), n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, hparams.n_head_kv(il), n_tokens); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + const float kq_scale = + hparams.f_attention_scale == 0.0f ? 1.0f / sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + return cur; +} + +ggml_tensor * llm_build_nemotron_h::build_ffn_layer(ggml_tensor * cur, const llama_model & model, const int il) { + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, LLM_FFN_RELU_SQR, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + return cur; +} diff --git a/src/models/nemotron.cpp b/src/models/nemotron.cpp new file mode 100644 index 00000000000..781aa719393 --- /dev/null +++ b/src/models/nemotron.cpp @@ -0,0 +1,122 @@ +#include "models.h" + +llm_build_nemotron::llm_build_nemotron(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + //GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/neo-bert.cpp b/src/models/neo-bert.cpp new file mode 100644 index 00000000000..b05c79025bb --- /dev/null +++ b/src/models/neo-bert.cpp @@ -0,0 +1,104 @@ +#include "models.h" + +llm_build_neo_bert::llm_build_neo_bert(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + ggml_tensor * inp_pos = build_inp_pos(); + + // construct input embeddings (token, type, position) + inpL = build_inp_embd(model.tok_embd); + cb(inpL, "inp_embd", -1); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * cur = inpL; + + // pre-norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + + { + ggml_tensor * Qcur; + ggml_tensor * Kcur; + ggml_tensor * Vcur; + + // self-attention + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + // RoPE + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, nullptr, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + cb(cur, "kqv_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + // re-add the layer input + cur = ggml_add(ctx0, cur, inpL); + + ggml_tensor * ffn_inp = cur; + cb(ffn_inp, "ffn_inp", il); + + // pre-norm + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + cur = build_ffn(cur, + model.layers[il].ffn_up, + NULL, NULL, NULL, NULL, NULL, + model.layers[il].ffn_down, + NULL, NULL, NULL, + LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); + + // attentions bypass the intermediate layer + cur = ggml_add(ctx0, cur, ffn_inp); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm_enc, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_embd", -1); + res->t_embd = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/olmo.cpp b/src/models/olmo.cpp new file mode 100644 index 00000000000..e15d716536d --- /dev/null +++ b/src/models/olmo.cpp @@ -0,0 +1,121 @@ +#include "models.h" + +llm_build_olmo::llm_build_olmo(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + NULL, NULL, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (hparams.f_clamp_kqv > 0.0f) { + Qcur = ggml_clamp(ctx0, Qcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (hparams.f_clamp_kqv > 0.0f) { + Kcur = ggml_clamp(ctx0, Kcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (hparams.f_clamp_kqv > 0.0f) { + Vcur = ggml_clamp(ctx0, Vcur, -hparams.f_clamp_kqv, hparams.f_clamp_kqv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, nullptr, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + NULL, NULL, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + NULL, NULL, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/olmo2.cpp b/src/models/olmo2.cpp new file mode 100644 index 00000000000..b05a3f9b4b0 --- /dev/null +++ b/src/models/olmo2.cpp @@ -0,0 +1,151 @@ +#include "models.h" + + +template +llm_build_olmo2::llm_build_olmo2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + using inp_attn_type = std::conditional_t; + inp_attn_type * inp_attn = nullptr; + + if constexpr (iswa) { + inp_attn = build_attn_inp_kv_iswa(); + } else { + inp_attn = build_attn_inp_kv(); + } + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = inpL; + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + const bool is_swa = hparams.is_swa(il); + + if (is_swa) { + // For sliding window layers, Olmo3 use regular rope with no yarn rope scaling. + // This is achieved here by setting freq_scale and attn_factor to 1. + // We also set ext_factor to 0 to avoid a few unnecessary computations. + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, 1.0, + 0.0, 1.0, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, 1.0, + 0.0, 1.0, beta_fast, beta_slow + ); + } else { + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + } + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + cur = build_norm(cur, + model.layers[il].attn_post_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_ffn(ffn_inp, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = build_norm(cur, + model.layers[il].ffn_post_norm, NULL, + LLM_NORM_RMS, -1); + cb(cur, "ffn_post_norm", -1); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } + +// Explicit template instantiations +template struct llm_build_olmo2; +template struct llm_build_olmo2; diff --git a/src/models/olmoe.cpp b/src/models/olmoe.cpp new file mode 100644 index 00000000000..49f51f9724c --- /dev/null +++ b/src/models/olmoe.cpp @@ -0,0 +1,124 @@ +#include "models.h" + +llm_build_olmoe::llm_build_olmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/openai-moe-iswa.cpp b/src/models/openai-moe-iswa.cpp new file mode 100644 index 00000000000..14e55eeb7a9 --- /dev/null +++ b/src/models/openai-moe-iswa.cpp @@ -0,0 +1,123 @@ +#include "models.h" + +llm_build_openai_moe_iswa::llm_build_openai_moe_iswa(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv_iswa(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, nullptr, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_rot, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_rot, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_rot, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, model.layers[il].attn_sinks, nullptr, 1.0f/sqrtf(float(n_rot)), il); + + cb(cur, "attn_out", il); + } + if (il == n_layer - 1) { + // skip computing output for unused tokens + ggml_tensor * inp_out_ids = build_inp_out_ids(); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = ffn_inp; + cur = build_norm(cur, + model.layers[il].attn_post_norm, nullptr, + LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + // MoE branch + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, model.layers[il].ffn_gate_inp_b, + model.layers[il].ffn_up_exps, model.layers[il].ffn_up_exps_b, + model.layers[il].ffn_gate_exps, model.layers[il].ffn_gate_exps_b, + model.layers[il].ffn_down_exps, model.layers[il].ffn_down_exps_b, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SWIGLU_OAI_MOE, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX_WEIGHT, + il); + cb(cur, "ffn_moe_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/openelm.cpp b/src/models/openelm.cpp new file mode 100644 index 00000000000..a16a459f3fa --- /dev/null +++ b/src/models/openelm.cpp @@ -0,0 +1,124 @@ +#include "models.h" + +llm_build_openelm::llm_build_openelm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const int64_t n_head = hparams.n_head(il); + const int64_t n_head_kv = hparams.n_head_kv(il); + const int64_t n_head_qkv = 2*n_head_kv + n_head; + + cur = inpL; + ggml_tensor * residual = cur; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_reshape_3d(ctx0, cur, n_embd_head_k, n_head_qkv, n_tokens); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, cur->nb[1], cur->nb[2], 0); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, cur->nb[1], cur->nb[2], cur->nb[1]*n_head); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = ggml_cont(ctx0, ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, cur->nb[1], cur->nb[2], cur->nb[1]*(n_head+n_head_kv))); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, + model.layers[il].attn_q_norm, NULL, + LLM_NORM_RMS, il); + cb(Qcur, "Qcur", il); + + Kcur = build_norm(Kcur, + model.layers[il].attn_k_norm, NULL, + LLM_NORM_RMS, il); + cb(Kcur, "Kcur", il); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, NULL, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, NULL, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Qcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + residual = ggml_get_rows(ctx0, residual, inp_out_ids); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, residual, cur); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + inpL = cur; + } + cur = inpL; + + // norm + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/orion.cpp b/src/models/orion.cpp new file mode 100644 index 00000000000..8c20c003ce0 --- /dev/null +++ b/src/models/orion.cpp @@ -0,0 +1,123 @@ +#include "models.h" + +llm_build_orion::llm_build_orion(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + // if (model.layers[il].bq) { + // Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + // cb(Qcur, "Qcur", il); + // } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + // if (model.layers[il].bk) { + // Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + // cb(Kcur, "Kcur", il); + // } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + // if (model.layers[il].bv) { + // Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + // cb(Vcur, "Vcur", il); + // } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/phi2.cpp b/src/models/phi2.cpp new file mode 100644 index 00000000000..22dbf610767 --- /dev/null +++ b/src/models/phi2.cpp @@ -0,0 +1,121 @@ +#include "models.h" + + +llm_build_phi2::llm_build_phi2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * attn_norm_output; + ggml_tensor * ffn_output; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + attn_norm_output = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(attn_norm_output, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = nullptr; + ggml_tensor * Kcur = nullptr; + ggml_tensor * Vcur = nullptr; + + if (model.layers[il].wqkv) { + cur = build_lora_mm(model.layers[il].wqkv, attn_norm_output); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + } else { + Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, attn_norm_output), model.layers[il].bq); + Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, attn_norm_output), model.layers[il].bk); + Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, attn_norm_output), model.layers[il].bv); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + } + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + // with phi2, we scale the Q to avoid precision issues + // ref: https://github.com/ml-explore/mlx-examples/blob/08e862336ade809bc37d1035f94b359e7d1a5152/phi2/phi2.py#L64-L66 + Qcur = ggml_scale(ctx0, Qcur, 1.0f/sqrtf(float(n_embd_head))); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + attn_norm_output = ggml_get_rows(ctx0, attn_norm_output, inp_out_ids); + } + // FF + { + ffn_output = build_ffn(attn_norm_output, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(ffn_output, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_output); + cur = ggml_add(ctx0, cur, inpL); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output_no_bias", -1); + + cur = ggml_add(ctx0, cur, model.output_b); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/phi3.cpp b/src/models/phi3.cpp new file mode 100644 index 00000000000..63907e3d4ed --- /dev/null +++ b/src/models/phi3.cpp @@ -0,0 +1,153 @@ +#include "models.h" + + +template +llm_build_phi3::llm_build_phi3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + using inp_attn_type = std::conditional_t; + inp_attn_type * inp_attn = nullptr; + + if constexpr (iswa) { + inp_attn = build_attn_inp_kv_iswa(); + } else { + inp_attn = build_attn_inp_kv(); + } + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + auto * residual = inpL; + + // self-attention + { + // rope freq factors for 128k context + ggml_tensor * rope_factors = model.get_rope_factors(cparams, il); + + ggml_tensor* attn_norm_output = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM_RMS, il); + cb(attn_norm_output, "attn_norm", il); + + ggml_tensor * Qcur = nullptr; + ggml_tensor * Kcur = nullptr; + ggml_tensor * Vcur = nullptr; + + if (model.layers[il].wqkv) { + cur = build_lora_mm(model.layers[il].wqkv, attn_norm_output); + cb(cur, "wqkv", il); + + Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 0 * sizeof(float) * (n_embd)); + Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 1 * sizeof(float) * (n_embd)); + Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head * sizeof(float), cur->nb[1], 1 * sizeof(float) * (n_embd + n_embd_gqa)); + } + else { + Qcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wq, attn_norm_output), model.layers[il].bq); + Kcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wk, attn_norm_output), model.layers[il].bk); + Vcur = ggml_add(ctx0, build_lora_mm(model.layers[il].wv, attn_norm_output), model.layers[il].bv); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + } + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, rope_factors, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = ggml_scale(ctx0, Qcur, 1.0f / sqrtf(float(n_embd_head))); + cb(Qcur, "Qcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + residual = ggml_get_rows(ctx0, residual, inp_out_ids); + } + cur = ggml_add(ctx0, cur, residual); + residual = cur; + + cur = build_norm(cur, + model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // feed-forward network + if (model.layers[il].ffn_gate_inp == nullptr) { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } else { + // MoE branch + cur = build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(cur, "ffn_moe_out", il); + } + cur = ggml_add(ctx0, residual, cur); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + if (model.output_b != nullptr) { + cb(cur, "result_output_no_bias", -1); + cur = ggml_add(ctx0, cur, model.output_b); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } + +// Explicit template instantiations +template struct llm_build_phi3; +template struct llm_build_phi3; diff --git a/src/models/plamo.cpp b/src/models/plamo.cpp new file mode 100644 index 00000000000..73b4473fcab --- /dev/null +++ b/src/models/plamo.cpp @@ -0,0 +1,110 @@ +#include "models.h" + +llm_build_plamo::llm_build_plamo(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + ggml_tensor * sa_inp = cur; + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_embd_head, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_embd_head, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + sa_inp = ggml_get_rows(ctx0, sa_inp, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + ggml_tensor * sa_out = cur; + + cur = sa_inp; + + // feed-forward network + { + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, sa_out); + cur = ggml_add(ctx0, cur, inpL); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/plamo2.cpp b/src/models/plamo2.cpp new file mode 100644 index 00000000000..31115a08f95 --- /dev/null +++ b/src/models/plamo2.cpp @@ -0,0 +1,316 @@ +#include "models.h" + +llm_build_plamo2::llm_build_plamo2(const llama_model & model, const llm_graph_params & params) : + llm_graph_context_mamba(params) { + ggml_tensor * cur; + ggml_tensor * inpL; + + // {n_embd, n_tokens} + inpL = build_inp_embd(model.tok_embd); + cb(inpL, "embedding_output", -1); + + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_hybrid = build_inp_mem_hybrid(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * residual = inpL; + + // ggml_graph_add_node(gf, model.layers[il].attn_norm); + // cb(model.layers[il].attn_norm, "attn_norm", il); + + // pre_mixer_norm + cur = build_norm(inpL, model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + + // check if this layer is Mamba or Attention + bool is_mamba_layer = hparams.is_recurrent(il); + + if (is_mamba_layer) { + // PLaMo-2 Mamba layer + cur = build_plamo2_mamba_layer(inp_hybrid->get_recr(), cur, model, ubatch, il); + } else { + // PLaMo-2 Attention layer + cur = build_plamo2_attn_layer(inp_hybrid->get_attn(), inp_pos, cur, model, il); + } + + // post_mixer_norm + cur = build_norm(cur, model.layers[il].attn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + // residual connection + cur = ggml_add(ctx0, cur, residual); + cb(cur, "attn_residual", il); + residual = cur; + + // pre-ffn norm + cur = build_norm(cur, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_pre_norm", il); + + // feed-forward network + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, LLM_FFN_SWIGLU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + // post ffn norm + cur = build_norm(cur, model.layers[il].ffn_post_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_post_norm", il); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + residual = ggml_get_rows(ctx0, residual, inp_out_ids); + } + + // residual connection + cur = ggml_add(ctx0, cur, residual); + cb(cur, "ffn_residual", il); + + inpL = cur; + } + + cur = inpL; + + // final norm + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "result_norm", -1); + + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + + // Explicitly mark as output tensor to ensure proper backend assignment + ggml_set_output(cur); + + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + +ggml_tensor * llm_build_plamo2::build_plamo2_attn_layer(llm_graph_input_attn_kv * inp, + ggml_tensor * inp_pos, + ggml_tensor * cur, + const llama_model & model, + int il) { + // self-attention + { + // PLaMo-2 uses combined QKV tensor + ggml_tensor * qkv = build_lora_mm(model.layers[il].wqkv, cur); + cb(qkv, "wqkv", il); + + // split QKV tensor into Q, K, V + const int64_t n_embd_head_q = hparams.n_embd_head_k; + const int64_t n_embd_head_k = hparams.n_embd_head_k; + const int64_t n_embd_head_v = hparams.n_embd_head_v; + int32_t n_head = hparams.n_head(il); + int32_t n_head_kv = hparams.n_head_kv(il); + + const int64_t q_offset = 0; + const int64_t k_offset = n_embd_head_q * n_head; + const int64_t v_offset = k_offset + n_embd_head_k * n_head_kv; + + ggml_tensor * Qcur = ggml_view_3d(ctx0, qkv, n_embd_head_q, n_head, n_tokens, n_embd_head_q * sizeof(float), + qkv->nb[1], q_offset * ggml_element_size(qkv)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, qkv, n_embd_head_k, n_head_kv, n_tokens, n_embd_head_k * sizeof(float), + qkv->nb[1], k_offset * ggml_element_size(qkv)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, qkv, n_embd_head_v, n_head_kv, n_tokens, n_embd_head_v * sizeof(float), + qkv->nb[1], v_offset * ggml_element_size(qkv)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + cur = build_attn(inp, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, NULL, NULL, NULL, 1.0f / sqrtf(float(n_embd_head_v)), il); + } + + cb(cur, "attn_out", il); + + return cur; +} + +ggml_tensor * llm_build_plamo2::build_plamo2_mamba_layer(llm_graph_input_rs * inp, + ggml_tensor * cur, + const llama_model & model, + const llama_ubatch & ubatch, + int il) { + const auto * mctx_cur = inp->mctx; + + const auto kv_head = mctx_cur->get_head(); + + const int64_t d_conv = hparams.ssm_d_conv; + const int64_t d_inner = hparams.ssm_d_inner; + const int64_t d_state = hparams.ssm_d_state; + const int64_t n_heads = hparams.ssm_dt_rank; + const int64_t head_dim = d_inner / n_heads; + const int64_t n_group = hparams.ssm_n_group; + const int64_t n_seqs = ubatch.n_seqs; + + const int64_t n_seq_tokens = ubatch.n_seq_tokens; + + GGML_ASSERT(n_seqs != 0); + GGML_ASSERT(ubatch.equal_seqs()); + GGML_ASSERT(ubatch.n_tokens == n_seq_tokens * n_seqs); + + ggml_tensor * conv_states_all = mctx_cur->get_r_l(il); + ggml_tensor * ssm_states_all = mctx_cur->get_s_l(il); + + ggml_tensor * conv = build_rs(inp, conv_states_all, hparams.n_embd_r(), n_seqs); + conv = ggml_reshape_3d(ctx0, conv, d_conv - 1, d_inner + 2 * n_group * d_state, n_seqs); + + // {n_embd, n_tokens} => {n_embd, n_seq_tokens, n_seqs} + cur = ggml_reshape_3d(ctx0, cur, cur->ne[0], n_seq_tokens, n_seqs); + + // in_proj: {n_embd, 2*d_inner} @ {n_embd, n_seq_tokens, n_seqs} => {2*d_inner, n_seq_tokens, n_seqs} + ggml_tensor * zx = build_lora_mm(model.layers[il].ssm_in, cur); + cb(zx, "mamba_in_proj", il); + // {8192, 5, 1, 1} -> {8192, 1, 5, 1} + zx = ggml_permute(ctx0, zx, 0, 2, 1, 3); + zx = ggml_cont_4d(ctx0, zx, head_dim * 2, n_heads, n_seq_tokens, n_seqs); + cb(zx, "mamba_in_proj_out", il); + + // split into z and x + // => {head_dim * n_heads, n_seq_tokens, n_seqs} + ggml_tensor * x = ggml_view_4d(ctx0, zx, head_dim, n_heads, n_seq_tokens, n_seqs, zx->nb[1], zx->nb[2], zx->nb[3], + head_dim * ggml_element_size(zx)); + x = ggml_cont_3d(ctx0, x, head_dim * n_heads, n_seq_tokens, n_seqs); + // x = ggml_permute(ctx0, x, 0, 2, 1, 3); + cb(x, "mamba_x_split", il); + + ggml_tensor * z = + ggml_view_4d(ctx0, zx, head_dim, n_heads, n_seq_tokens, n_seqs, zx->nb[1], zx->nb[2], zx->nb[3], 0); + cb(z, "mamba_z_split", il); + + // conv1d + { + // => {d_conv - 1 + n_seq_tokens, d_inner, n_seqs} + ggml_tensor * conv_x = ggml_concat(ctx0, conv, ggml_transpose(ctx0, x), 0); + cb(conv_x, "mamba_conv1d_input", il); + + // copy last (d_conv - 1) columns back into the state cache + ggml_tensor * last_conv = ggml_view_3d(ctx0, conv_x, d_conv - 1, d_inner, n_seqs, conv_x->nb[1], conv_x->nb[2], + n_seq_tokens * (conv_x->nb[0])); + + ggml_build_forward_expand(gf, ggml_cpy(ctx0, last_conv, + ggml_view_1d(ctx0, conv_states_all, + (d_conv - 1) * (d_inner + 2 * n_group * d_state) * (n_seqs), + kv_head * (d_conv - 1) * (d_inner + 2 * n_group * d_state) * + ggml_element_size(conv_states_all)))); + cb(conv_states_all, "mamba_conv1d_state", il); + + // 1D convolution + x = ggml_ssm_conv(ctx0, conv_x, model.layers[il].ssm_conv1d); + cb(x, "mamba_conv1d", il); + + x = ggml_silu(ctx0, x); + cb(x, "mamba_conv1d_silu", il); + } + + // SSM + { + // bcdt_proj: {d_inner, dt_rank + 2*d_state} @ {d_inner, n_seq_tokens, n_seqs} => {dt_rank + 2*d_state, n_seq_tokens, n_seqs} + ggml_tensor * x_bcdt = build_lora_mm(model.layers[il].ssm_x, x); + cb(x_bcdt, "mamba_bcdt_proj", il); + + // split into dt, B, C + const int64_t dt_dim = std::max(64, int(hparams.n_embd / 16)); + ggml_tensor * B = ggml_view_3d(ctx0, x_bcdt, d_state, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], 0); + ggml_tensor * C = ggml_view_3d(ctx0, x_bcdt, d_state, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], + ggml_element_size(x_bcdt) * d_state); + ggml_tensor * dt = ggml_view_3d(ctx0, x_bcdt, dt_dim, n_seq_tokens, n_seqs, x_bcdt->nb[1], x_bcdt->nb[2], + ggml_element_size(x_bcdt) * (2 * d_state)); + cb(B, "mamba_B_raw", il); + cb(C, "mamba_C_raw", il); + cb(dt, "mamba_dt_raw", il); + + // Apply RMS norm to dt, B, C (PLaMo-2 specific) + B = build_norm(B, model.layers[il].ssm_b_norm, NULL, LLM_NORM_RMS, il); + C = build_norm(C, model.layers[il].ssm_c_norm, NULL, LLM_NORM_RMS, il); + dt = build_norm(dt, model.layers[il].ssm_dt_norm, NULL, LLM_NORM_RMS, il); + cb(B, "mamba_B_normed", il); + cb(C, "mamba_C_normed", il); + cb(dt, "mamba_dt_normed", il); + + // dt_proj: {dt_rank, d_inner} @ {dt_rank, n_seq_tokens, n_seqs} => {d_inner, n_seq_tokens, n_seqs} + dt = build_lora_mm(model.layers[il].ssm_dt, dt); + dt = ggml_add(ctx0, dt, model.layers[il].ssm_dt_b); + cb(dt, "mamba_dt_proj", il); + + ggml_tensor * A = ggml_reshape_2d(ctx0, model.layers[il].ssm_a, 1, n_heads); + cb(A, "mamba_A", il); + + x = ggml_view_4d(ctx0, x, head_dim, n_heads, n_seq_tokens, n_seqs, head_dim * ggml_element_size(x), + head_dim * n_heads * ggml_element_size(x), + head_dim * n_heads * n_seq_tokens * ggml_element_size(x), 0); + B = ggml_view_4d(ctx0, B, d_state, 1, n_seq_tokens, n_seqs, d_state * B->nb[0], B->nb[1], B->nb[2], 0); + C = ggml_view_4d(ctx0, C, d_state, 1, n_seq_tokens, n_seqs, d_state * C->nb[0], C->nb[1], C->nb[2], 0); + + // use the states and the indices provided by build_recurrent_state + // (this is necessary in order to properly use the states before they are overwritten, + // while avoiding to make unnecessary copies of the states) + auto get_ssm_rows = [&](ggml_context * ctx, ggml_tensor * states, ggml_tensor * ids) { + ggml_tensor * ssm = ggml_reshape_4d(ctx, states, d_state, head_dim, n_heads, mctx_cur->get_size()); + + // Custom operator to optimize the parallel associative scan + // as described in the Annex D of the Mamba paper. + // => {d_inner, n_seq_tokens, n_seqs} and {d_state, d_inner, n_seqs} + return ggml_ssm_scan(ctx, ssm, x, dt, A, B, C, ids); + }; + + ggml_tensor * y_ssm = build_rs(inp, ssm_states_all, hparams.n_embd_s(), ubatch.n_seqs, get_ssm_rows); + cb(y_ssm, "mamba_ssm_scan", il); + + // store last states + ggml_build_forward_expand( + gf, ggml_cpy( + ctx0, + ggml_view_1d(ctx0, y_ssm, n_heads * head_dim * d_state * n_seqs, + n_heads * head_dim * n_seq_tokens * n_seqs * ggml_element_size(y_ssm)), + ggml_view_1d(ctx0, ssm_states_all, n_heads * head_dim * d_state * n_seqs, + kv_head * n_seqs * n_heads * head_dim * d_state * ggml_element_size(ssm_states_all)))); + cb(ssm_states_all, "mamba_ssm_states", il); + + ggml_tensor * y = ggml_view_4d(ctx0, y_ssm, head_dim, n_heads, n_seq_tokens, n_seqs, + head_dim * ggml_element_size(x), head_dim * n_heads * ggml_element_size(x), + head_dim * n_heads * n_seq_tokens * ggml_element_size(x), 0); + cb(y, "mamba_y_view", il); + + // Add D parameter and apply gating with z + // {d_inner, n_seq_tokens, n_seqs} * {d_inner} => {d_inner, n_seq_tokens, n_seqs} + ggml_tensor * D = ggml_reshape_2d(ctx0, model.layers[il].ssm_d, 1, n_heads); + y = ggml_add(ctx0, y, ggml_mul(ctx0, x, D)); + cb(y, "mamba_y_add_d", il); + + y = ggml_swiglu_split(ctx0, ggml_cont(ctx0, z), y); + cb(y, "mamba_y_swiglu_z", il); + + // out_proj: {d_inner, n_embd} @ {d_inner, n_seq_tokens, n_seqs} => {n_embd, n_seq_tokens, n_seqs} + y = ggml_view_3d(ctx0, y, head_dim * n_heads, n_seq_tokens, n_seqs, y->nb[2], y->nb[3], 0); + cur = build_lora_mm(model.layers[il].ssm_out, y); + cb(cur, "mamba_out_proj", il); + } + + // {n_embd, n_seq_tokens, n_seqs} => {n_embd, n_tokens} + cur = ggml_reshape_2d(ctx0, cur, cur->ne[0], n_seq_tokens * n_seqs); + cb(cur, "mamba_out", il); + + return cur; +} diff --git a/src/models/plm.cpp b/src/models/plm.cpp new file mode 100644 index 00000000000..ddd52162b23 --- /dev/null +++ b/src/models/plm.cpp @@ -0,0 +1,168 @@ +#include "models.h" + +llm_build_plm::llm_build_plm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const float kq_scale = 1.0f/sqrtf(float(hparams.n_embd_head_k)); + + const uint32_t n_embd_head_qk_rope = hparams.n_rot; + const uint32_t n_embd_head_qk_nope = hparams.n_embd_head_k - hparams.n_rot; + const uint32_t kv_lora_rank = hparams.n_lora_kv; + + ggml_tensor * cur; + ggml_tensor * inpL; + + // {n_embd, n_tokens} + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + ggml_tensor * q = NULL; + q = ggml_mul_mat(ctx0, model.layers[il].wq, cur); + cb(q, "q", il); + + // split into {n_head * n_embd_head_qk_nope, n_tokens} + ggml_tensor * q_nope = ggml_view_3d(ctx0, q, n_embd_head_qk_nope, n_head, n_tokens, + ggml_row_size(q->type, hparams.n_embd_head_k), + ggml_row_size(q->type, hparams.n_embd_head_k * n_head), + 0); + cb(q_nope, "q_nope", il); + + // and {n_head * n_embd_head_qk_rope, n_tokens} + ggml_tensor * q_pe = ggml_view_3d(ctx0, q, n_embd_head_qk_rope, n_head, n_tokens, + ggml_row_size(q->type, hparams.n_embd_head_k), + ggml_row_size(q->type, hparams.n_embd_head_k * n_head), + ggml_row_size(q->type, n_embd_head_qk_nope)); + cb(q_pe, "q_pe", il); + + // {n_embd, kv_lora_rank + n_embd_head_qk_rope} * {n_embd, n_tokens} -> {kv_lora_rank + n_embd_head_qk_rope, n_tokens} + ggml_tensor * kv_pe_compresseed = ggml_mul_mat(ctx0, model.layers[il].wkv_a_mqa, cur); + cb(kv_pe_compresseed, "kv_pe_compresseed", il); + + // split into {kv_lora_rank, n_tokens} + ggml_tensor * kv_compressed = ggml_view_2d(ctx0, kv_pe_compresseed, kv_lora_rank, n_tokens, + kv_pe_compresseed->nb[1], + 0); + cb(kv_compressed, "kv_compressed", il); + + // and {n_embd_head_qk_rope, n_tokens} + ggml_tensor * k_pe = ggml_view_3d(ctx0, kv_pe_compresseed, n_embd_head_qk_rope, 1, n_tokens, + kv_pe_compresseed->nb[1], + kv_pe_compresseed->nb[1], + ggml_row_size(kv_pe_compresseed->type, kv_lora_rank)); + cb(k_pe, "k_pe", il); + + kv_compressed = build_norm(kv_compressed, + model.layers[il].attn_kv_a_norm, NULL, + LLM_NORM_RMS, il); + cb(kv_compressed, "kv_compressed", il); + + // {kv_lora_rank, n_head * (n_embd_head_qk_nope + n_embd_head_v)} * {kv_lora_rank, n_tokens} -> {n_head * (n_embd_head_qk_nope + n_embd_head_v), n_tokens} + ggml_tensor * kv = ggml_mul_mat(ctx0, model.layers[il].wkv_b, kv_compressed); + cb(kv, "kv", il); + + // split into {n_head * n_embd_head_qk_nope, n_tokens} + ggml_tensor * k_nope = ggml_view_3d(ctx0, kv, n_embd_head_qk_nope, n_head, n_tokens, + ggml_row_size(kv->type, n_embd_head_qk_nope + hparams.n_embd_head_v), + ggml_row_size(kv->type, n_head * (n_embd_head_qk_nope + hparams.n_embd_head_v)), + 0); + cb(k_nope, "k_nope", il); + + // and {n_head * n_embd_head_v, n_tokens} + ggml_tensor * v_states = ggml_view_3d(ctx0, kv, hparams.n_embd_head_v, n_head, n_tokens, + ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)), + ggml_row_size(kv->type, (n_embd_head_qk_nope + hparams.n_embd_head_v)*n_head), + ggml_row_size(kv->type, (n_embd_head_qk_nope))); + cb(v_states, "v_states", il); + + v_states = ggml_cont(ctx0, v_states); + cb(v_states, "v_states", il); + + v_states = ggml_view_2d(ctx0, v_states, hparams.n_embd_head_v * n_head, n_tokens, + ggml_row_size(kv->type, hparams.n_embd_head_v * n_head), + 0); + cb(v_states, "v_states", il); + + q_pe = ggml_rope_ext( + ctx0, q_pe, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(q_pe, "q_pe", il); + + // shared RoPE key + k_pe = ggml_rope_ext( + ctx0, k_pe, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + cb(k_pe, "k_pe", il); + + ggml_tensor * q_states = ggml_concat(ctx0, q_nope, q_pe, 0); + cb(q_states, "q_states", il); + + ggml_tensor * k_states = ggml_concat(ctx0, k_nope, ggml_repeat(ctx0, k_pe, q_pe), 0); + cb(k_states, "k_states", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + q_states, k_states, v_states, nullptr, nullptr, nullptr, kq_scale, il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_RELU_SQR, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen.cpp b/src/models/qwen.cpp new file mode 100644 index 00000000000..31fd9b73763 --- /dev/null +++ b/src/models/qwen.cpp @@ -0,0 +1,108 @@ +#include "models.h" + + +llm_build_qwen::llm_build_qwen(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 2*sizeof(float)*(n_embd)); + + // using mode = 2 for neox mode + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward forward + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen2.cpp b/src/models/qwen2.cpp new file mode 100644 index 00000000000..885cb46894d --- /dev/null +++ b/src/models/qwen2.cpp @@ -0,0 +1,118 @@ +#include "models.h" + + +llm_build_qwen2::llm_build_qwen2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + if (model.output_b != nullptr) { + cur = ggml_add(ctx0, cur, model.output_b); + } + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen2moe.cpp b/src/models/qwen2moe.cpp new file mode 100644 index 00000000000..40623ea66f2 --- /dev/null +++ b/src/models/qwen2moe.cpp @@ -0,0 +1,151 @@ +#include "models.h" + +llm_build_qwen2moe::llm_build_qwen2moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, false, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + + // FFN shared expert + { + ggml_tensor * cur_gate_inp = build_lora_mm(model.layers[il].ffn_gate_inp_shexp, cur); + cb(cur_gate_inp, "ffn_shexp_gate_inp", il); + + // sigmoid + ggml_tensor * cur_gate = ggml_div(ctx0, ggml_silu(ctx0, cur_gate_inp), cur_gate_inp); + cb(cur_gate, "ffn_shexp_gate", il); + + ggml_tensor * cur_ffn = build_ffn(cur, + model.layers[il].ffn_up_shexp, NULL, NULL, + model.layers[il].ffn_gate_shexp, NULL, NULL, + model.layers[il].ffn_down_shexp, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur_ffn, "ffn_shexp", il); + + ggml_tensor * ffn_shexp_out = ggml_mul(ctx0, cur_ffn, cur_gate); + cb(ffn_shexp_out, "ffn_shexp_out", il); + + moe_out = ggml_add(ctx0, moe_out, ffn_shexp_out); + cb(moe_out, "ffn_out", il); + + cur = moe_out; + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen2vl.cpp b/src/models/qwen2vl.cpp new file mode 100644 index 00000000000..addc37f9a8f --- /dev/null +++ b/src/models/qwen2vl.cpp @@ -0,0 +1,117 @@ +#include "models.h" + +llm_build_qwen2vl::llm_build_qwen2vl(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_multi( + ctx0, Qcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_multi( + ctx0, Kcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen3.cpp b/src/models/qwen3.cpp new file mode 100644 index 00000000000..782d32107a3 --- /dev/null +++ b/src/models/qwen3.cpp @@ -0,0 +1,117 @@ +#include "models.h" + +llm_build_qwen3::llm_build_qwen3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen3moe.cpp b/src/models/qwen3moe.cpp new file mode 100644 index 00000000000..f5087cdb06a --- /dev/null +++ b/src/models/qwen3moe.cpp @@ -0,0 +1,124 @@ +#include "models.h" + +llm_build_qwen3moe::llm_build_qwen3moe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + cur = moe_out; + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/qwen3vl-moe.cpp b/src/models/qwen3vl-moe.cpp new file mode 100644 index 00000000000..c48643c0cd1 --- /dev/null +++ b/src/models/qwen3vl-moe.cpp @@ -0,0 +1,150 @@ +#include "models.h" + +llm_build_qwen3vlmoe::llm_build_qwen3vlmoe(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds + const size_t n_deepstack_layers = hparams.n_deepstack_layers; + const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + std::vector deepstack_features(n_deepstack_layers, nullptr); + + if (ubatch.embd) { + // Image input: split main embd and deepstack embds + ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); + for (size_t i = 0; i < n_deepstack_layers; i++) { + deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); + } + inpL = inpL_main; + } + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_multi( + ctx0, Qcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_multi( + ctx0, Kcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * moe_out = + build_moe_ffn(cur, + model.layers[il].ffn_gate_inp, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_SILU, true, + false, 0.0, + LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX, + il); + cb(moe_out, "ffn_moe_out", il); + cur = moe_out; + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + if (ubatch.embd && (size_t)il < n_deepstack_layers) { + cur = ggml_add(ctx0, cur, deepstack_features[il]); + cb(cur, "deepstack_out", il); + } + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} + diff --git a/src/models/qwen3vl.cpp b/src/models/qwen3vl.cpp new file mode 100644 index 00000000000..10b36c1f65e --- /dev/null +++ b/src/models/qwen3vl.cpp @@ -0,0 +1,144 @@ +#include "models.h" + +llm_build_qwen3vl::llm_build_qwen3vl(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + + const int64_t n_embd_full = hparams.n_embd; // main embd + deepstack embds + const size_t n_deepstack_layers = hparams.n_deepstack_layers; + const int64_t n_embd = n_embd_full / (n_deepstack_layers + 1); + const int64_t n_embd_head = hparams.n_embd_head_v; + + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + int sections[4]; + std::copy(std::begin(hparams.rope_sections), std::begin(hparams.rope_sections) + 4, sections); + + std::vector deepstack_features(n_deepstack_layers, nullptr); + + if (ubatch.embd) { + // Image input: split main embd and deepstack embds + ggml_tensor * inpL_main = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], 0); + for (size_t i = 0; i < n_deepstack_layers; i++) { + deepstack_features[i] = ggml_view_2d(ctx0, inpL, n_embd, n_tokens, inpL->nb[1], (i + 1) * n_embd * sizeof(float)); + } + inpL = inpL_main; + } + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = build_norm(Qcur, model.layers[il].attn_q_norm, NULL, LLM_NORM_RMS, il); + cb(Qcur, "Qcur_normed", il); + + Qcur = ggml_rope_multi( + ctx0, Qcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = build_norm(Kcur, model.layers[il].attn_k_norm, NULL, LLM_NORM_RMS, il); + cb(Kcur, "Kcur_normed", il); + + Kcur = ggml_rope_multi( + ctx0, Kcur, inp_pos, nullptr, + n_rot, sections, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + if (ubatch.embd && (size_t)il < n_deepstack_layers) { + cur = ggml_add(ctx0, cur, deepstack_features[il]); + cb(cur, "deepstack_out", il); + } + + // input for next layer + inpL = cur; + } + + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/refact.cpp b/src/models/refact.cpp new file mode 100644 index 00000000000..951844f6408 --- /dev/null +++ b/src/models/refact.cpp @@ -0,0 +1,94 @@ +#include "models.h" + +llm_build_refact::llm_build_refact(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/rwkv6-base.cpp b/src/models/rwkv6-base.cpp new file mode 100644 index 00000000000..7beed2daffb --- /dev/null +++ b/src/models/rwkv6-base.cpp @@ -0,0 +1,162 @@ +#include "models.h" + +llm_build_rwkv6_base::llm_build_rwkv6_base(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params), + model(model) {} + +ggml_tensor * llm_build_rwkv6_base::build_rwkv6_channel_mix(const llama_layer * layer, + ggml_tensor * cur, + ggml_tensor * x_prev, + llm_arch arch) const { + ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); + switch (arch) { + case LLM_ARCH_RWKV6: + { + ggml_tensor * xk = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_k), cur); + ggml_tensor * xr = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_r), cur); + + ggml_tensor * r = ggml_sigmoid(ctx0, build_lora_mm(layer->channel_mix_receptance, xr)); + ggml_tensor * k = ggml_sqr(ctx0, ggml_relu(ctx0, build_lora_mm(layer->channel_mix_key, xk))); + cur = ggml_mul(ctx0, r, build_lora_mm(layer->channel_mix_value, k)); + } + break; + default: + GGML_ABORT("fatal error"); + } + return cur; +} + +ggml_tensor * llm_build_rwkv6_base::build_rwkv6_time_mix(llm_graph_input_rs * inp, + ggml_tensor * cur, + ggml_tensor * x_prev, + const llama_ubatch & ubatch, + int il) const { + const auto * mctx_cur = static_cast(mctx); + + const auto n_tokens = ubatch.n_tokens; + const auto n_seqs = ubatch.n_seqs; + const auto n_seq_tokens = ubatch.n_seq_tokens; + const auto n_embd = hparams.n_embd; + const auto head_size = hparams.wkv_head_size; + const auto n_head = n_embd / head_size; + const auto n_head_kv = hparams.n_head_kv(il); + + const auto kv_head = mctx_cur->get_head(); + + const auto & layer = model.layers[il]; + + bool is_qrwkv = layer.time_mix_first == nullptr; + + ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); + + sx = ggml_reshape_2d(ctx0, sx, n_embd, n_tokens); + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + + ggml_tensor * xxx = ggml_add(ctx0, ggml_mul(ctx0, sx, layer.time_mix_lerp_x), cur); + + xxx = ggml_reshape_4d(ctx0, ggml_tanh(ctx0, ggml_mul_mat(ctx0, layer.time_mix_w1, xxx)), + layer.time_mix_w1->ne[1] / 5, 1, 5, n_tokens); + + xxx = ggml_cont(ctx0, ggml_permute(ctx0, xxx, 0, 1, 3, 2)); + + xxx = ggml_mul_mat( + ctx0, ggml_reshape_4d(ctx0, layer.time_mix_w2, layer.time_mix_w2->ne[0], layer.time_mix_w2->ne[1], 1, 5), xxx); + + ggml_tensor *xw, *xk, *xv, *xr, *xg; + if (layer.time_mix_lerp_fused) { + // fusing these weights makes some performance improvement + sx = ggml_reshape_3d(ctx0, sx, n_embd, 1, n_tokens); + cur = ggml_reshape_3d(ctx0, cur, n_embd, 1, n_tokens); + xxx = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xxx, layer.time_mix_lerp_fused), sx), cur); + xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); + xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); + xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); + xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); + xg = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); + } else { + // for backward compatibility + xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); + xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); + xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); + xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); + xg = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); + + xw = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xw, layer.time_mix_lerp_w), sx), cur); + xk = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xk, layer.time_mix_lerp_k), sx), cur); + xv = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xv, layer.time_mix_lerp_v), sx), cur); + xr = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xr, layer.time_mix_lerp_r), sx), cur); + xg = ggml_add(ctx0, ggml_mul(ctx0, ggml_add(ctx0, xg, layer.time_mix_lerp_g), sx), cur); + } + ggml_tensor * r = build_lora_mm(layer.time_mix_receptance, xr); + ggml_tensor * k = build_lora_mm(layer.time_mix_key, xk); + ggml_tensor * v = build_lora_mm(layer.time_mix_value, xv); + if (layer.time_mix_receptance_b) { + r = ggml_add(ctx0, r, layer.time_mix_receptance_b); + } + if (layer.time_mix_key_b) { + k = ggml_add(ctx0, k, layer.time_mix_key_b); + } + if (layer.time_mix_value_b) { + v = ggml_add(ctx0, v, layer.time_mix_value_b); + } + ggml_tensor * g = build_lora_mm(layer.time_mix_gate, xg); + if (is_qrwkv) { + g = ggml_sigmoid(ctx0, g); + } else { + g = ggml_silu(ctx0, g); + } + if (n_head_kv != 0 && n_head_kv != n_head) { + GGML_ASSERT(n_head % n_head_kv == 0); + k = ggml_reshape_4d(ctx0, k, head_size, 1, n_head_kv, n_tokens); + v = ggml_reshape_4d(ctx0, v, head_size, 1, n_head_kv, n_tokens); + ggml_tensor * tmp = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, head_size, n_head / n_head_kv, n_head_kv, n_tokens); + k = ggml_repeat(ctx0, k, tmp); + v = ggml_repeat(ctx0, v, tmp); + } + k = ggml_reshape_3d(ctx0, k, head_size, n_head, n_tokens); + v = ggml_reshape_3d(ctx0, v, head_size, n_head, n_tokens); + r = ggml_reshape_3d(ctx0, r, head_size, n_head, n_tokens); + + ggml_tensor * w = + ggml_mul_mat(ctx0, layer.time_mix_decay_w2, ggml_tanh(ctx0, ggml_mul_mat(ctx0, layer.time_mix_decay_w1, xw))); + + w = ggml_add(ctx0, w, layer.time_mix_decay); + w = ggml_exp(ctx0, ggml_neg(ctx0, ggml_exp(ctx0, w))); + w = ggml_reshape_3d(ctx0, w, head_size, n_head, n_tokens); + + if (is_qrwkv) { + // k = k * (1 - w) + k = ggml_sub(ctx0, k, ggml_mul(ctx0, k, w)); + } + ggml_tensor * wkv_state = build_rs(inp, mctx_cur->get_s_l(il), hparams.n_embd_s(), n_seqs); + + ggml_tensor * wkv_output; + if (is_qrwkv) { + wkv_output = ggml_gated_linear_attn(ctx0, k, v, r, w, wkv_state, pow(head_size, -0.5f)); + } else { + wkv_output = ggml_rwkv_wkv6(ctx0, k, v, r, layer.time_mix_first, w, wkv_state); + } + cur = ggml_view_1d(ctx0, wkv_output, n_embd * n_tokens, 0); + wkv_state = ggml_view_1d(ctx0, wkv_output, n_embd * head_size * n_seqs, n_embd * n_tokens * sizeof(float)); + + ggml_build_forward_expand( + gf, ggml_cpy(ctx0, wkv_state, + ggml_view_1d(ctx0, mctx_cur->get_s_l(il), hparams.n_embd_s() * n_seqs, + hparams.n_embd_s() * kv_head * ggml_element_size(mctx_cur->get_s_l(il))))); + + if (!is_qrwkv) { + // group norm with head_count groups + cur = ggml_reshape_3d(ctx0, cur, n_embd / n_head, n_head, n_tokens); + cur = ggml_norm(ctx0, cur, 64e-5f); + + // Convert back to regular vectors. + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + cur = ggml_add(ctx0, ggml_mul(ctx0, cur, layer.time_mix_ln), layer.time_mix_ln_b); + } else { + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + } + cur = ggml_mul(ctx0, cur, g); + cur = build_lora_mm(layer.time_mix_output, cur); + + return ggml_reshape_3d(ctx0, cur, n_embd, n_seq_tokens, n_seqs); +} diff --git a/src/models/rwkv6.cpp b/src/models/rwkv6.cpp new file mode 100644 index 00000000000..15453fbf50f --- /dev/null +++ b/src/models/rwkv6.cpp @@ -0,0 +1,94 @@ +#include "models.h" + +llm_build_rwkv6::llm_build_rwkv6(const llama_model & model, const llm_graph_params & params) : + llm_build_rwkv6_base(model, params) { + GGML_ASSERT(hparams.token_shift_count == 2); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); + + auto * rs_inp = build_rs_inp(); + + const auto n_embd = hparams.n_embd; + const auto n_seq_tokens = ubatch.n_seq_tokens; + const auto n_seqs = ubatch.n_seqs; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const llama_layer * layer = &model.layers[il]; + inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); + + ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); + + ggml_tensor * att_shift = + ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], 0); + ggml_tensor * ffn_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], + token_shift->nb[2], n_embd * ggml_element_size(token_shift)); + + ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM, il); + cb(att_norm, "attn_norm", il); + + ggml_tensor * x_prev = ggml_concat( + ctx0, att_shift, + ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), 1); + + cur = build_rwkv6_time_mix(rs_inp, att_norm, x_prev, ubatch, il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + ggml_tensor * ffn_norm = build_norm(ffn_inp, layer->attn_norm_2, layer->attn_norm_2_b, LLM_NORM, il); + cb(ffn_norm, "ffn_norm", il); + + x_prev = ggml_concat( + ctx0, ffn_shift, + ggml_view_3d(ctx0, ffn_norm, n_embd, n_seq_tokens - 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], 0), 1); + + token_shift = ggml_concat(ctx0, + ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], + (n_seq_tokens - 1) * n_embd * ggml_element_size(att_norm)), + ggml_view_3d(ctx0, ffn_norm, n_embd, 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], + (n_seq_tokens - 1) * n_embd * ggml_element_size(ffn_norm)), + 1); + ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); + + ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); + ffn_norm = ggml_reshape_2d(ctx0, ffn_norm, n_embd, n_tokens); + x_prev = ggml_reshape_2d(ctx0, x_prev, n_embd, n_tokens); + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + + if (il == n_layer - 1 && inp_out_ids) { + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + ffn_norm = ggml_get_rows(ctx0, ffn_norm, inp_out_ids); + x_prev = ggml_get_rows(ctx0, x_prev, inp_out_ids); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + } + cur = build_rwkv6_channel_mix(layer, ffn_norm, x_prev, LLM_ARCH_RWKV6); + cur = ggml_add(ctx0, cur, ffn_inp); + + if (hparams.rescale_every_n_layers != 0 && (il + 1) % hparams.rescale_every_n_layers == 0) { + cur = ggml_scale(ctx0, cur, 0.5F); + } + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/rwkv6qwen2.cpp b/src/models/rwkv6qwen2.cpp new file mode 100644 index 00000000000..e84e5973820 --- /dev/null +++ b/src/models/rwkv6qwen2.cpp @@ -0,0 +1,86 @@ +#include "models.h" + +llm_build_rwkv6qwen2::llm_build_rwkv6qwen2(const llama_model & model, const llm_graph_params & params) : llm_build_rwkv6_base(model, params) { + GGML_ASSERT(n_embd == hparams.n_embd_r()); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + auto * rs_inp = build_rs_inp(); + + const auto n_embd = hparams.n_embd; + const auto n_seq_tokens = ubatch.n_seq_tokens; + const auto n_seqs = ubatch.n_seqs; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const llama_layer * layer = &model.layers[il]; + inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); + + ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); + + ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM_RMS, il); + cb(att_norm, "attn_norm", il); + + ggml_tensor * x_prev = ggml_concat( + ctx0, + token_shift, + ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), + 1 + ); + + cur = build_rwkv6_time_mix(rs_inp, att_norm, x_prev, ubatch, il); + + token_shift = ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], (n_seq_tokens-1)*n_embd*ggml_element_size(att_norm)); + ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); + + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + } + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + + cur = inpL; + cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/rwkv7-base.cpp b/src/models/rwkv7-base.cpp new file mode 100644 index 00000000000..cda44653849 --- /dev/null +++ b/src/models/rwkv7-base.cpp @@ -0,0 +1,135 @@ +#include "models.h" + +llm_build_rwkv7_base::llm_build_rwkv7_base(const llama_model & model, const llm_graph_params & params) : + llm_graph_context(params), + model(model) {} + +ggml_tensor * llm_build_rwkv7_base::build_rwkv7_channel_mix(const llama_layer * layer, + ggml_tensor * cur, + ggml_tensor * x_prev, + llm_arch arch) const { + ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); + switch (arch) { + case LLM_ARCH_RWKV7: + { + ggml_tensor * xk = ggml_add(ctx0, ggml_mul(ctx0, sx, layer->channel_mix_lerp_k), cur); + + ggml_tensor * k = ggml_sqr(ctx0, ggml_relu(ctx0, build_lora_mm(layer->channel_mix_key, xk))); + + cur = build_lora_mm(layer->channel_mix_value, k); + } + break; + default: + GGML_ABORT("fatal error"); + } + return cur; +} + +ggml_tensor * llm_build_rwkv7_base::build_rwkv7_time_mix(llm_graph_input_rs * inp, + ggml_tensor * cur, + ggml_tensor * x_prev, + ggml_tensor *& first_layer_value, + const llama_ubatch & ubatch, + int il) const { + const auto * mctx_cur = static_cast(mctx); + + const auto n_tokens = ubatch.n_tokens; + const auto n_seqs = ubatch.n_seqs; + const auto n_embd = hparams.n_embd; + const auto head_size = hparams.wkv_head_size; + const auto head_count = n_embd / head_size; + const auto n_seq_tokens = ubatch.n_seq_tokens; + + const auto kv_head = mctx_cur->get_head(); + + const auto & layer = model.layers[il]; + + bool has_gating = layer.time_mix_g1 && layer.time_mix_g2; + + ggml_tensor * sx = ggml_sub(ctx0, x_prev, cur); + ggml_tensor * dummy = ggml_new_tensor_4d(ctx0, GGML_TYPE_F32, n_embd, n_seq_tokens, n_seqs, has_gating ? 6 : 5); + sx = ggml_repeat(ctx0, sx, dummy); + + ggml_tensor * xxx = ggml_add(ctx0, ggml_mul(ctx0, sx, layer.time_mix_lerp_fused), cur); + + ggml_tensor * xr = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], 0); + ggml_tensor * xw = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * sizeof(float)); + ggml_tensor * xk = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 2 * sizeof(float)); + ggml_tensor * xv = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 3 * sizeof(float)); + ggml_tensor * xa = ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 4 * sizeof(float)); + ggml_tensor * xg = + has_gating ? ggml_view_2d(ctx0, xxx, n_embd, n_tokens, xxx->nb[1], n_embd * n_tokens * 5 * sizeof(float)) : + nullptr; + + ggml_tensor * r = build_lora_mm(layer.time_mix_receptance, xr); + ggml_tensor * w = ggml_add( + ctx0, ggml_mul_mat(ctx0, layer.time_mix_w2, ggml_tanh(ctx0, ggml_mul_mat(ctx0, layer.time_mix_w1, xw))), + layer.time_mix_w0); + w = ggml_exp(ctx0, ggml_scale(ctx0, ggml_sigmoid(ctx0, w), -0.606531)); + + ggml_tensor * k = build_lora_mm(layer.time_mix_key, xk); + ggml_tensor * v = build_lora_mm(layer.time_mix_value, xv); + if (first_layer_value == nullptr) { + first_layer_value = v; + } else { + // Add the first layer value as a residual connection. + v = ggml_add(ctx0, v, + ggml_mul(ctx0, ggml_sub(ctx0, first_layer_value, v), + ggml_sigmoid(ctx0, ggml_add(ctx0, + ggml_mul_mat(ctx0, layer.time_mix_v2, + ggml_mul_mat(ctx0, layer.time_mix_v1, xv)), + layer.time_mix_v0)))); + } + ggml_tensor * g = nullptr; + if (layer.time_mix_g1 && layer.time_mix_g2) { + g = ggml_mul_mat(ctx0, layer.time_mix_g2, ggml_sigmoid(ctx0, ggml_mul_mat(ctx0, layer.time_mix_g1, xg))); + } + ggml_tensor * a = ggml_sigmoid( + ctx0, ggml_add(ctx0, ggml_mul_mat(ctx0, layer.time_mix_a2, ggml_mul_mat(ctx0, layer.time_mix_a1, xa)), + layer.time_mix_a0)); + + ggml_tensor * kk = ggml_reshape_3d(ctx0, ggml_mul(ctx0, k, layer.time_mix_k_k), head_size, head_count, n_tokens); + kk = ggml_l2_norm(ctx0, kk, 1e-12); + + ggml_tensor * ka = ggml_mul(ctx0, k, layer.time_mix_k_a); + k = ggml_add(ctx0, k, ggml_sub(ctx0, ggml_mul(ctx0, a, ka), ka)); + + r = ggml_reshape_3d(ctx0, r, head_size, head_count, n_tokens); + w = ggml_reshape_3d(ctx0, w, head_size, head_count, n_tokens); + k = ggml_reshape_3d(ctx0, k, head_size, head_count, n_tokens); + v = ggml_reshape_3d(ctx0, v, head_size, head_count, n_tokens); + a = ggml_reshape_3d(ctx0, a, head_size, head_count, n_tokens); + + ggml_tensor * wkv_state = build_rs(inp, mctx_cur->get_s_l(il), hparams.n_embd_s(), n_seqs); + + ggml_tensor * wkv_output = ggml_rwkv_wkv7(ctx0, r, w, k, v, ggml_neg(ctx0, kk), ggml_mul(ctx0, kk, a), wkv_state); + cur = ggml_view_1d(ctx0, wkv_output, n_embd * n_tokens, 0); + wkv_state = ggml_view_1d(ctx0, wkv_output, n_embd * head_size * n_seqs, n_embd * n_tokens * sizeof(float)); + + ggml_build_forward_expand( + gf, ggml_cpy(ctx0, wkv_state, + ggml_view_1d(ctx0, mctx_cur->get_s_l(il), hparams.n_embd_s() * n_seqs, + hparams.n_embd_s() * kv_head * ggml_element_size(mctx_cur->get_s_l(il))))); + + if (layer.time_mix_ln && layer.time_mix_ln_b) { + // group norm with head_count groups + cur = ggml_reshape_3d(ctx0, cur, n_embd / head_count, head_count, n_tokens); + cur = ggml_norm(ctx0, cur, 64e-5f); + + // Convert back to regular vectors. + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + cur = ggml_add(ctx0, ggml_mul(ctx0, cur, layer.time_mix_ln), layer.time_mix_ln_b); + } else { + cur = ggml_reshape_2d(ctx0, cur, n_embd, n_tokens); + } + ggml_tensor * rk = ggml_sum_rows( + ctx0, ggml_mul(ctx0, ggml_mul(ctx0, k, r), ggml_reshape_2d(ctx0, layer.time_mix_r_k, head_size, head_count))); + cur = ggml_add(ctx0, cur, ggml_reshape_2d(ctx0, ggml_mul(ctx0, v, rk), n_embd, n_tokens)); + + if (has_gating) { + cur = ggml_mul(ctx0, cur, g); + } + cur = build_lora_mm(layer.time_mix_output, cur); + + return ggml_reshape_3d(ctx0, cur, n_embd, n_seq_tokens, n_seqs); +} diff --git a/src/models/rwkv7.cpp b/src/models/rwkv7.cpp new file mode 100644 index 00000000000..5caf6553dfe --- /dev/null +++ b/src/models/rwkv7.cpp @@ -0,0 +1,90 @@ +#include "models.h" + +llm_build_rwkv7::llm_build_rwkv7(const llama_model & model, const llm_graph_params & params) : + llm_build_rwkv7_base(model, params) { + GGML_ASSERT(hparams.token_shift_count == 2); + + ggml_tensor * cur; + ggml_tensor * inpL; + ggml_tensor * v_first = nullptr; + + inpL = build_inp_embd(model.tok_embd); + inpL = build_norm(inpL, model.tok_norm, model.tok_norm_b, LLM_NORM, -1); + + auto * rs_inp = build_rs_inp(); + + const auto n_embd = hparams.n_embd; + const auto n_seq_tokens = ubatch.n_seq_tokens; + const auto n_seqs = ubatch.n_seqs; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + const llama_layer * layer = &model.layers[il]; + inpL = ggml_reshape_3d(ctx0, inpL, n_embd, n_seq_tokens, n_seqs); + + ggml_tensor * token_shift = build_rwkv_token_shift_load(rs_inp, ubatch, il); + + ggml_tensor * att_shift = + ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], token_shift->nb[2], 0); + ggml_tensor * ffn_shift = ggml_view_3d(ctx0, token_shift, n_embd, 1, n_seqs, token_shift->nb[1], + token_shift->nb[2], n_embd * ggml_element_size(token_shift)); + + ggml_tensor * att_norm = build_norm(inpL, layer->attn_norm, layer->attn_norm_b, LLM_NORM, il); + cb(att_norm, "attn_norm", il); + + ggml_tensor * x_prev = ggml_concat( + ctx0, att_shift, + ggml_view_3d(ctx0, att_norm, n_embd, n_seq_tokens - 1, n_seqs, att_norm->nb[1], att_norm->nb[2], 0), 1); + + cur = build_rwkv7_time_mix(rs_inp, att_norm, x_prev, v_first, ubatch, il); + + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + ggml_tensor * ffn_norm = build_norm(ffn_inp, layer->attn_norm_2, layer->attn_norm_2_b, LLM_NORM, il); + cb(ffn_norm, "ffn_norm", il); + + x_prev = ggml_concat( + ctx0, ffn_shift, + ggml_view_3d(ctx0, ffn_norm, n_embd, n_seq_tokens - 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], 0), 1); + + token_shift = ggml_concat(ctx0, + ggml_view_3d(ctx0, att_norm, n_embd, 1, n_seqs, att_norm->nb[1], att_norm->nb[2], + (n_seq_tokens - 1) * n_embd * ggml_element_size(att_norm)), + ggml_view_3d(ctx0, ffn_norm, n_embd, 1, n_seqs, ffn_norm->nb[1], ffn_norm->nb[2], + (n_seq_tokens - 1) * n_embd * ggml_element_size(ffn_norm)), + 1); + ggml_build_forward_expand(gf, build_rwkv_token_shift_store(token_shift, ubatch, il)); + + ffn_inp = ggml_reshape_2d(ctx0, ffn_inp, n_embd, n_tokens); + ffn_norm = ggml_reshape_2d(ctx0, ffn_norm, n_embd, n_tokens); + x_prev = ggml_reshape_2d(ctx0, x_prev, n_embd, n_tokens); + + if (il == n_layer - 1 && inp_out_ids) { + ffn_inp = ggml_get_rows(ctx0, ffn_inp, inp_out_ids); + ffn_norm = ggml_get_rows(ctx0, ffn_norm, inp_out_ids); + x_prev = ggml_get_rows(ctx0, x_prev, inp_out_ids); + } + cur = build_rwkv7_channel_mix(layer, ffn_norm, x_prev, LLM_ARCH_RWKV7); + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cur = build_norm(cur, model.output_norm, model.output_norm_b, LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/seed-oss.cpp b/src/models/seed-oss.cpp new file mode 100644 index 00000000000..94ce1633629 --- /dev/null +++ b/src/models/seed-oss.cpp @@ -0,0 +1,124 @@ +#include "models.h" + +llm_build_seed_oss::llm_build_seed_oss(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + cur = build_norm(ffn_inp, + model.layers[il].attn_post_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_post_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/smallthinker.cpp b/src/models/smallthinker.cpp new file mode 100644 index 00000000000..2fcd87a8a0e --- /dev/null +++ b/src/models/smallthinker.cpp @@ -0,0 +1,120 @@ +#include "models.h" + +template +llm_build_smallthinker::llm_build_smallthinker(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params){ + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + using inp_attn_type = std::conditional_t; + inp_attn_type * inp_attn = nullptr; + + if constexpr (iswa) { + inp_attn = build_attn_inp_kv_iswa(); + } else { + inp_attn = build_attn_inp_kv(); + } + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + ggml_tensor * probs = nullptr; + + probs = build_lora_mm(model.layers[il].ffn_gate_inp, inpL); // [n_expert, n_tokens] + cb(probs, "ffn_moe_logits", il); + + // norm + cur = build_norm(inpL,model.layers[il].attn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self_attention + { + // compute Q and K and RoPE them + struct ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + struct ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + struct ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (hparams.n_no_rope_layer_step == n_layer || il % hparams.n_no_rope_layer_step != 0) { + Qcur = ggml_rope_ext(ctx0, Qcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + + Kcur = ggml_rope_ext(ctx0, Kcur, inp_pos, nullptr, n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow); + } + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f / sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + probs = ggml_get_rows(ctx0, probs, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // MoE branch + cur = build_norm(ffn_inp, model.layers[il].ffn_norm, NULL, LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + ggml_tensor * ffn_out = + build_moe_ffn(cur, + nullptr, + model.layers[il].ffn_up_exps, + model.layers[il].ffn_gate_exps, + model.layers[il].ffn_down_exps, + nullptr, + n_expert, n_expert_used, + LLM_FFN_RELU, true, + false, 0.0, + static_cast(hparams.expert_gating_func), + il, probs); + + cb(ffn_out, "ffn_out", il); + cur = ffn_out; + + cur = ggml_add(ctx0, cur, ffn_inp); + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); + } + +// Explicit template instantiations +template struct llm_build_smallthinker; +template struct llm_build_smallthinker; diff --git a/src/models/smollm3.cpp b/src/models/smollm3.cpp new file mode 100644 index 00000000000..830aa35415e --- /dev/null +++ b/src/models/smollm3.cpp @@ -0,0 +1,128 @@ +#include "models.h" + +llm_build_smollm3::llm_build_smollm3(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + const float kq_scale = hparams.f_attention_scale == 0.0f ? 1.0f/sqrtf(float(n_embd_head)) : hparams.f_attention_scale; + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + const bool use_rope = (il + 1) % hparams.n_no_rope_layer_step != 0; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (use_rope) { + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + } + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, kq_scale, il); + cb(cur, "attn_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + model.layers[il].ffn_gate, model.layers[il].ffn_gate_b, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/stablelm.cpp b/src/models/stablelm.cpp new file mode 100644 index 00000000000..bed1915c006 --- /dev/null +++ b/src/models/stablelm.cpp @@ -0,0 +1,146 @@ +#include "models.h" + +llm_build_stablelm::llm_build_stablelm(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + ggml_tensor * inpSA = cur; + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + if (model.layers[il].attn_q_norm) { + Qcur = build_norm(Qcur, + model.layers[il].attn_q_norm, + NULL, + LLM_NORM, il); + cb(Qcur, "Qcur", il); + } + if (model.layers[il].attn_k_norm) { + Kcur = build_norm(Kcur, + model.layers[il].attn_k_norm, + NULL, + LLM_NORM, il); + cb(Kcur, "Kcur", il); + } + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + if (model.layers[il].ffn_norm) { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + } else { + // parallel residual + cur = inpSA; + } + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/starcoder.cpp b/src/models/starcoder.cpp new file mode 100644 index 00000000000..0b9e58982aa --- /dev/null +++ b/src/models/starcoder.cpp @@ -0,0 +1,100 @@ +#include "models.h" + +llm_build_starcoder::llm_build_starcoder(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * pos = ggml_get_rows(ctx0, model.pos_embd, inp_pos); + cb(pos, "pos_embd", -1); + + inpL = ggml_add(ctx0, inpL, pos); + cb(inpL, "inpL", -1); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + cur = build_norm(inpL, + model.layers[il].attn_norm, + model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + cur = build_lora_mm(model.layers[il].wqkv, cur); + cb(cur, "wqkv", il); + + cur = ggml_add(ctx0, cur, model.layers[il].bqkv); + cb(cur, "bqkv", il); + + ggml_tensor * Qcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 0*sizeof(float)*(n_embd)); + ggml_tensor * Kcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd)); + ggml_tensor * Vcur = ggml_view_3d(ctx0, cur, n_embd_head, n_head_kv, n_tokens, n_embd_head*sizeof(float), cur->nb[1], 1*sizeof(float)*(n_embd + n_embd_gqa)); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpL = ggml_get_rows(ctx0, inpL, inp_out_ids); + } + // add the input + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpL); + cb(ffn_inp, "ffn_inp", il); + + // FF + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, + model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = build_norm(inpL, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/starcoder2.cpp b/src/models/starcoder2.cpp new file mode 100644 index 00000000000..67c26149e3b --- /dev/null +++ b/src/models/starcoder2.cpp @@ -0,0 +1,121 @@ +#include "models.h" + +llm_build_starcoder2::llm_build_starcoder2(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, model.layers[il].attn_norm_b, + LLM_NORM, il); + cb(cur, "attn_norm", il); + + // self-attention + { + // compute Q and K and RoPE them + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + if (model.layers[il].bq) { + Qcur = ggml_add(ctx0, Qcur, model.layers[il].bq); + cb(Qcur, "Qcur", il); + } + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + if (model.layers[il].bk) { + Kcur = ggml_add(ctx0, Kcur, model.layers[il].bk); + cb(Kcur, "Kcur", il); + } + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + if (model.layers[il].bv) { + Vcur = ggml_add(ctx0, Vcur, model.layers[il].bv); + cb(Vcur, "Vcur", il); + } + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, model.layers[il].ffn_norm_b, + LLM_NORM, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, model.layers[il].ffn_up_b, NULL, + NULL, NULL, NULL, + model.layers[il].ffn_down, model.layers[il].ffn_down_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + cb(cur, "ffn_out", il); + + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, + model.output_norm, model.output_norm_b, + LLM_NORM, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/t5-dec.cpp b/src/models/t5-dec.cpp new file mode 100644 index 00000000000..c1974e78215 --- /dev/null +++ b/src/models/t5-dec.cpp @@ -0,0 +1,166 @@ +#include "models.h" + +llm_build_t5_dec::llm_build_t5_dec(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + //const int64_t n_embd_gqa = hparams.n_embd_v_gqa(); + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * embd_enc = build_inp_cross_embd(); + ggml_tensor * pos_bucket_dec = build_inp_pos_bucket_dec(); + + const int64_t n_outputs_enc = embd_enc->ne[1]; + + auto * inp_attn_self = build_attn_inp_kv(); + auto * inp_attn_cross = build_attn_inp_cross(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + const int64_t dec_n_layer = hparams.dec_n_layer; + + for (int il = 0; il < dec_n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + ggml_tensor * attn_rel_b = model.layers[il].attn_rel_b ? model.layers[il].attn_rel_b : model.layers[0].attn_rel_b; + ggml_tensor * kq_b = build_pos_bias(pos_bucket_dec, attn_rel_b); + + cur = build_attn(inp_attn_self, + model.layers[il].wo, model.layers[il].bo, + Qcur, Kcur, Vcur, kq_b, nullptr, nullptr, 1.0f, il); + cb(cur, "kqv_out", il); + } + cur = ggml_add(ctx0, cur, inpSA); + cb(cur, "cross_inp", il); + + ggml_tensor * inpCA = cur; + + // norm + cur = build_norm(cur, + model.layers[il].attn_norm_cross, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm_cross", il); + + // cross-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq_cross, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk_cross, embd_enc); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv_cross, embd_enc); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_outputs_enc); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_outputs_enc); + + cur = build_attn(inp_attn_cross, + model.layers[il].wo_cross, nullptr, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f, il); + cb(cur, "kqv_out", il); + + //ggml_tensor * q = ggml_permute(ctx0, Qcur, 0, 2, 1, 3); + //ggml_tensor * k = ggml_cont(ctx0, ggml_permute(ctx0, Kcur, 0, 2, 1, 3)); + + //ggml_tensor * kq = ggml_mul_mat(ctx0, k, q); + //cb(kq, "kq", il); + + //kq = ggml_soft_max_ext(ctx0, kq, KQ_mask_cross, 1.0f, hparams.f_max_alibi_bias); + //cb(kq, "kq_soft_max_ext", il); + + //ggml_tensor * v = ggml_cont(ctx0, ggml_transpose(ctx0, ggml_reshape_2d(ctx0, Vcur, n_embd_gqa, n_outputs_enc))); + //cb(v, "v", il); + + //ggml_tensor * kqv = ggml_mul_mat(ctx0, ggml_reshape_3d(ctx0, v, n_outputs_enc, n_embd_head, n_head_kv), kq); + //cb(kqv, "kqv", il); + + //ggml_tensor * kqv_merged = ggml_permute(ctx0, kqv, 0, 2, 1, 3); + //cb(kqv_merged, "kqv_merged", il); + + //cur = ggml_cont_2d(ctx0, kqv_merged, n_embd_gqa, n_tokens); + //cb(cur, "kqv_merged_cont", il); + + //ggml_build_forward_expand(gf, cur); + + //cur = build_lora_mm(model.layers[il].wo_cross, cur); + //cb(cur, "kqv_out", il); + } + if (il == dec_n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpCA = ggml_get_rows(ctx0, inpCA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpCA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // T5 uses relu, flan-T5 uses gelu-gated + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + model.layers[il].ffn_gate ? LLM_FFN_GELU : LLM_FFN_RELU, + model.layers[il].ffn_gate ? LLM_FFN_PAR : LLM_FFN_SEQ, + il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cb(cur, "result_embd", -1); + + cur = build_norm(cur, + model.output_norm, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/t5-enc.cpp b/src/models/t5-enc.cpp new file mode 100644 index 00000000000..6b29355d20f --- /dev/null +++ b/src/models/t5-enc.cpp @@ -0,0 +1,96 @@ +#include "models.h" + +llm_build_t5_enc::llm_build_t5_enc(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + ggml_tensor * pos_bucket_enc = build_inp_pos_bucket_enc(); + + auto * inp_attn = build_attn_inp_no_cache(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + // norm + cur = build_norm(inpL, + model.layers[il].attn_norm_enc, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq_enc, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk_enc, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv_enc, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + ggml_tensor * attn_rel_b = model.layers[il].attn_rel_b_enc ? model.layers[il].attn_rel_b_enc : model.layers[0].attn_rel_b_enc; + ggml_tensor * kq_b = build_pos_bias(pos_bucket_enc, attn_rel_b); + + cur = build_attn(inp_attn, + model.layers[il].wo_enc, nullptr, + Qcur, Kcur, Vcur, kq_b, nullptr, nullptr, 1.0f, il); + cb(cur, "kqv_out", il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm_enc, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + // T5 uses relu, flan-T5 uses gelu-gated + cur = build_ffn(cur, + model.layers[il].ffn_up_enc, NULL, NULL, + model.layers[il].ffn_gate_enc, NULL, NULL, + model.layers[il].ffn_down_enc, NULL, NULL, + NULL, + model.layers[il].ffn_gate_enc ? LLM_FFN_GELU : LLM_FFN_RELU, + model.layers[il].ffn_gate_enc ? LLM_FFN_PAR : LLM_FFN_SEQ, + il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + cb(cur, "ffn_out", il); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + cb(cur, "result_embd", -1); + + cur = build_norm(cur, + model.output_norm_enc, NULL, + LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/wavtokenizer-dec.cpp b/src/models/wavtokenizer-dec.cpp new file mode 100644 index 00000000000..81a3c5cd628 --- /dev/null +++ b/src/models/wavtokenizer-dec.cpp @@ -0,0 +1,149 @@ +#include "models.h" + +llm_build_wavtokenizer_dec::llm_build_wavtokenizer_dec(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + cur = ggml_cont(ctx0, ggml_transpose(ctx0, inpL)); + + cur = ggml_conv_1d_ph(ctx0, model.conv1d, cur, 1, 1); + cur = ggml_add(ctx0, cur, model.conv1d_b); + + // posnet + for (uint32_t il = 0; il < hparams.posnet.n_layer; ++il) { + const auto & layer = model.layers[il].posnet; + + inpL = cur; + + switch (il) { + case 0: + case 1: + case 3: + case 4: + { + cur = build_norm(cur, + layer.norm1, + layer.norm1_b, + LLM_NORM_GROUP, 0); + + cur = ggml_mul(ctx0, ggml_sigmoid(ctx0, cur), cur); + + cur = ggml_conv_1d_ph(ctx0, layer.conv1, cur, 1, 1); + cur = ggml_add(ctx0, cur, layer.conv1_b); + + cur = build_norm(cur, + layer.norm2, + layer.norm2_b, + LLM_NORM_GROUP, 0); + + cur = ggml_mul(ctx0, ggml_sigmoid(ctx0, cur), cur); + + cur = ggml_conv_1d_ph(ctx0, layer.conv2, cur, 1, 1); + cur = ggml_add(ctx0, cur, layer.conv2_b); + + cur = ggml_add(ctx0, cur, inpL); + } break; + case 2: + { + cur = build_norm(cur, + layer.attn_norm, + layer.attn_norm_b, + LLM_NORM_GROUP, 0); + + ggml_tensor * q; + ggml_tensor * k; + ggml_tensor * v; + + q = ggml_conv_1d_ph(ctx0, layer.attn_q, cur, 1, 1); + k = ggml_conv_1d_ph(ctx0, layer.attn_k, cur, 1, 1); + v = ggml_conv_1d_ph(ctx0, layer.attn_v, cur, 1, 1); + + q = ggml_add(ctx0, q, layer.attn_q_b); + k = ggml_add(ctx0, k, layer.attn_k_b); + v = ggml_add(ctx0, v, layer.attn_v_b); + + q = ggml_cont(ctx0, ggml_transpose(ctx0, q)); + k = ggml_cont(ctx0, ggml_transpose(ctx0, k)); + + ggml_tensor * kq = ggml_mul_mat(ctx0, k, q); + + kq = ggml_soft_max_ext(ctx0, kq, nullptr, 1.0f/sqrtf(float(hparams.posnet.n_embd)), 0.0f); + + cur = ggml_mul_mat(ctx0, kq, v); + + cur = ggml_conv_1d_ph(ctx0, layer.attn_o, cur, 1, 1); + cur = ggml_add(ctx0, cur, layer.attn_o_b); + + cur = ggml_add(ctx0, cur, inpL); + } break; + case 5: + { + cur = build_norm(cur, + layer.norm, + layer.norm_b, + LLM_NORM_GROUP, 0); + } break; + default: GGML_ABORT("unknown posnet layer"); + }; + } + cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); + + cur = build_norm(cur, + model.tok_norm, + model.tok_norm_b, + LLM_NORM, -1); + + cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); + + inpL = cur; + + // convnext + for (uint32_t il = 0; il < hparams.convnext.n_layer; ++il) { + const auto & layer = model.layers[il].convnext; + + cur = inpL; + + cur = ggml_conv_1d_dw_ph(ctx0, layer.dw, cur, 1, 1); + cur = ggml_add(ctx0, cur, layer.dw_b); + + cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); + + cur = build_norm(cur, + layer.norm, + layer.norm_b, + LLM_NORM, -1); + + cur = build_ffn(cur, + layer.pw1, layer.pw1_b, NULL, + NULL, NULL, NULL, + layer.pw2, layer.pw2_b, NULL, + NULL, + LLM_FFN_GELU, LLM_FFN_SEQ, il); + + cur = ggml_mul(ctx0, cur, layer.gamma); + + cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); + + inpL = ggml_add(ctx0, cur, inpL); + } + cur = inpL; + + cur = ggml_cont(ctx0, ggml_transpose(ctx0, cur)); + + cur = build_norm(cur, + model.output_norm, + model.output_norm_b, + LLM_NORM, -1); + + // lm_head + cur = build_lora_mm(model.output, cur); + + cur = ggml_add(ctx0, cur, model.output_b); + + cb(cur, "result_embd", -1); + res->t_embd = cur; + + ggml_build_forward_expand(gf, cur); +} diff --git a/src/models/xverse.cpp b/src/models/xverse.cpp new file mode 100644 index 00000000000..95e2eafef3d --- /dev/null +++ b/src/models/xverse.cpp @@ -0,0 +1,108 @@ +#include "models.h" + +llm_build_xverse::llm_build_xverse(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { + const int64_t n_embd_head = hparams.n_embd_head_v; + + GGML_ASSERT(n_embd_head == hparams.n_embd_head_k); + GGML_ASSERT(n_embd_head == hparams.n_rot); + + ggml_tensor * cur; + ggml_tensor * inpL; + + inpL = build_inp_embd(model.tok_embd); + + // inp_pos - contains the positions + ggml_tensor * inp_pos = build_inp_pos(); + + auto * inp_attn = build_attn_inp_kv(); + + ggml_tensor * inp_out_ids = build_inp_out_ids(); + + for (int il = 0; il < n_layer; ++il) { + ggml_tensor * inpSA = inpL; + + cur = build_norm(inpL, + model.layers[il].attn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "attn_norm", il); + + // self-attention + { + ggml_tensor * Qcur = build_lora_mm(model.layers[il].wq, cur); + cb(Qcur, "Qcur", il); + + ggml_tensor * Kcur = build_lora_mm(model.layers[il].wk, cur); + cb(Kcur, "Kcur", il); + + ggml_tensor * Vcur = build_lora_mm(model.layers[il].wv, cur); + cb(Vcur, "Vcur", il); + + Qcur = ggml_reshape_3d(ctx0, Qcur, n_embd_head, n_head, n_tokens); + Kcur = ggml_reshape_3d(ctx0, Kcur, n_embd_head, n_head_kv, n_tokens); + Vcur = ggml_reshape_3d(ctx0, Vcur, n_embd_head, n_head_kv, n_tokens); + + Qcur = ggml_rope_ext( + ctx0, Qcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + Kcur = ggml_rope_ext( + ctx0, Kcur, inp_pos, nullptr, + n_rot, rope_type, n_ctx_orig, freq_base, freq_scale, + ext_factor, attn_factor, beta_fast, beta_slow + ); + + cb(Qcur, "Qcur", il); + cb(Kcur, "Kcur", il); + cb(Vcur, "Vcur", il); + + cur = build_attn(inp_attn, + model.layers[il].wo, NULL, + Qcur, Kcur, Vcur, nullptr, nullptr, nullptr, 1.0f/sqrtf(float(n_embd_head)), il); + } + if (il == n_layer - 1 && inp_out_ids) { + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + } + ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); + cb(ffn_inp, "ffn_inp", il); + + // feed-forward network + { + cur = build_norm(ffn_inp, + model.layers[il].ffn_norm, NULL, + LLM_NORM_RMS, il); + cb(cur, "ffn_norm", il); + + cur = build_ffn(cur, + model.layers[il].ffn_up, NULL, NULL, + model.layers[il].ffn_gate, NULL, NULL, + model.layers[il].ffn_down, NULL, NULL, + NULL, + LLM_FFN_SILU, LLM_FFN_PAR, il); + cb(cur, "ffn_out", il); + } + cur = ggml_add(ctx0, cur, ffn_inp); + + cur = build_cvec(cur, il); + cb(cur, "l_out", il); + + // input for next layer + inpL = cur; + } + cur = inpL; + + cur = build_norm(cur, model.output_norm, NULL, LLM_NORM_RMS, -1); + + cb(cur, "result_norm", -1); + res->t_embd = cur; + + // lm_head + cur = build_lora_mm(model.output, cur); + + cb(cur, "result_output", -1); + res->t_logits = cur; + + ggml_build_forward_expand(gf, cur); +} From d3dc9dd898be805c23a408cc36daed5b3bf29221 Mon Sep 17 00:00:00 2001 From: Oliver Simons Date: Sat, 1 Nov 2025 06:13:26 +0100 Subject: [PATCH 042/185] CUDA: Remove unneded bias/gate dims in fused mmvq (#16858) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * CUDA: Remove unneded bias/gate dims in fused mmvq Pointed out [here](https://github.com/ggml-org/llama.cpp/pull/16847#discussion_r2476798989) that only a single value is needed per target col per thread * Apply suggestions from code review Co-authored-by: Johannes Gäßler * Fix "Error 991-D: extra braces are nonstandard" during compilation --------- Co-authored-by: Johannes Gäßler --- ggml/src/ggml-cuda/mmvq.cu | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/ggml/src/ggml-cuda/mmvq.cu b/ggml/src/ggml-cuda/mmvq.cu index 07645ad9e71..d671551c171 100644 --- a/ggml/src/ggml-cuda/mmvq.cu +++ b/ggml/src/ggml-cuda/mmvq.cu @@ -190,8 +190,8 @@ static __global__ void mul_mat_vec_q( const uint32_t channel_bias = ids ? channel_x : channel_dst; - float x_biases[ncols_dst][rows_per_cuda_block] = { { 0.0f } }; - float gate_biases[ncols_dst][rows_per_cuda_block] = { { 0.0f } }; + float x_biases[ncols_dst] = { 0.0f }; + float gate_biases[ncols_dst] = { 0.0f }; if constexpr (has_fusion) { if (use_bias) { x_bias = x_bias + sample_dst*stride_sample_dst + channel_bias*stride_channel_dst + row0; @@ -199,8 +199,9 @@ static __global__ void mul_mat_vec_q( // 2. load only on threads that won't die after partial sum calculation if (threadIdx.x < rows_per_cuda_block && threadIdx.y == 0 && (rows_per_cuda_block == 1 || uint32_t(row0 + threadIdx.x) < stride_col_dst)) { +#pragma unroll for (int j = 0; j < ncols_dst; ++j) { - x_biases[j][threadIdx.x] = x_bias[j * stride_col_dst + threadIdx.x]; + x_biases[j] = x_bias[j * stride_col_dst + threadIdx.x]; } } } @@ -208,8 +209,9 @@ static __global__ void mul_mat_vec_q( gate_bias = gate_bias + sample_dst*stride_sample_dst + channel_bias*stride_channel_dst + row0; if (threadIdx.x < rows_per_cuda_block && threadIdx.y == 0 && (rows_per_cuda_block == 1 || uint32_t(row0 + threadIdx.x) < stride_col_dst)) { +#pragma unroll for (int j = 0; j < ncols_dst; ++j) { - gate_biases[j][threadIdx.x] = gate_bias[j * stride_col_dst + threadIdx.x]; + gate_biases[j] = gate_bias[j * stride_col_dst + threadIdx.x]; } } } @@ -299,12 +301,12 @@ static __global__ void mul_mat_vec_q( float result = tmp[j][threadIdx.x]; if constexpr (has_fusion) { if (use_bias) { - result += x_biases[j][threadIdx.x]; + result += x_biases[j]; } if (use_gate) { float gate_value = tmp_gate[j][threadIdx.x]; if (use_gate_bias) { - gate_value += gate_biases[j][threadIdx.x]; + gate_value += gate_biases[j]; } switch (active_glu) { case GGML_GLU_OP_SWIGLU: From 2e76e013600cb0d51ccf158571ca1d0502952a07 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Sat, 1 Nov 2025 00:45:28 -0500 Subject: [PATCH 043/185] vulkan: fuse mul_mat+add and mul_mat_id+add_id (#16868) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * vulkan: fuse mul_mat+add and mul_mat_id+add_id The fusion is only applied for the mat-vec mul paths. * Apply suggestions from code review Co-authored-by: Sigbjørn Skjæret * fix 32b build --------- Co-authored-by: Sigbjørn Skjæret --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 515 +++++++++++++----- .../vulkan-shaders/mul_mat_vec_base.glsl | 34 +- .../vulkan-shaders/mul_mat_vec_nc.comp | 6 + .../vulkan-shaders/mul_mat_vec_p021.comp | 6 + 4 files changed, 437 insertions(+), 124 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index c3e5a9eccc3..6a46d0889bd 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -797,9 +797,18 @@ struct vk_mat_mat_push_constants { uint32_t padded_N; }; struct vk_mat_vec_push_constants { - uint32_t ncols; uint32_t stride_a; uint32_t stride_b; uint32_t stride_d; - uint32_t batch_stride_a; uint32_t batch_stride_b; uint32_t batch_stride_d; - uint32_t ne02; uint32_t ne12; uint32_t broadcast2; uint32_t broadcast3; + uint32_t ncols; + uint32_t stride_a; + uint32_t stride_b; + uint32_t stride_d; + uint32_t batch_stride_a; + uint32_t batch_stride_b; + uint32_t batch_stride_d; + uint32_t enable_bias; + uint32_t ne02; + uint32_t ne12; + uint32_t broadcast2; + uint32_t broadcast3; }; struct vk_mat_mat_id_push_constants { @@ -810,9 +819,16 @@ struct vk_mat_mat_id_push_constants { uint32_t padded_N; }; struct vk_mat_vec_id_push_constants { - uint32_t ncols; uint32_t stride_a; uint32_t stride_b; uint32_t stride_d; - uint32_t batch_stride_a; uint32_t batch_stride_b; uint32_t batch_stride_d; - uint32_t nei0; uint32_t ne11; + uint32_t ncols; + uint32_t stride_a; + uint32_t stride_b; + uint32_t stride_d; + uint32_t batch_stride_a; + uint32_t batch_stride_b; + uint32_t batch_stride_d; + uint32_t enable_bias; + uint32_t nei0; + uint32_t ne11; }; struct vk_flash_attn_push_constants { @@ -3347,92 +3363,92 @@ static void ggml_vk_load_shaders(vk_device& device) { SHADER_REDUCTION_MODE_SHMEM; for (uint32_t i = 0; i < mul_mat_vec_max_cols; ++i) { - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_F32 ][i], "mul_mat_vec_f32_f32_f32", arr_dmmv_f32_f32_f32_len[reduc], arr_dmmv_f32_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_F16 ][i], "mul_mat_vec_f16_f32_f32", arr_dmmv_f16_f32_f32_len[reduc], arr_dmmv_f16_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_BF16][i], "mul_mat_vec_bf16_f32_f32", arr_dmmv_bf16_f32_f32_len[reduc], arr_dmmv_bf16_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_f32_f32", arr_dmmv_q4_0_f32_f32_len[reduc], arr_dmmv_q4_0_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_f32_f32", arr_dmmv_q4_1_f32_f32_len[reduc], arr_dmmv_q4_1_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_f32_f32", arr_dmmv_q5_0_f32_f32_len[reduc], arr_dmmv_q5_0_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_f32_f32", arr_dmmv_q5_1_f32_f32_len[reduc], arr_dmmv_q5_1_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_f32_f32", arr_dmmv_q8_0_f32_f32_len[reduc], arr_dmmv_q8_0_f32_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup, 1*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q2_K][i], "mul_mat_vec_q2_k_f32_f32", arr_dmmv_q2_k_f32_f32_len[reduc16], arr_dmmv_q2_k_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q3_K][i], "mul_mat_vec_q3_k_f32_f32", arr_dmmv_q3_k_f32_f32_len[reduc16], arr_dmmv_q3_k_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_K][i], "mul_mat_vec_q4_k_f32_f32", arr_dmmv_q4_k_f32_f32_len[reduc16], arr_dmmv_q4_k_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_K][i], "mul_mat_vec_q5_k_f32_f32", arr_dmmv_q5_k_f32_f32_len[reduc16], arr_dmmv_q5_k_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q6_K][i], "mul_mat_vec_q6_k_f32_f32", arr_dmmv_q6_k_f32_f32_len[reduc16], arr_dmmv_q6_k_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ1_S][i], "mul_mat_vec_iq1_s_f32_f32", arr_dmmv_iq1_s_f32_f32_len[reduc16], arr_dmmv_iq1_s_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ1_M][i], "mul_mat_vec_iq1_m_f32_f32", arr_dmmv_iq1_m_f32_f32_len[reduc16], arr_dmmv_iq1_m_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_XXS][i], "mul_mat_vec_iq2_xxs_f32_f32", arr_dmmv_iq2_xxs_f32_f32_len[reduc16], arr_dmmv_iq2_xxs_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_XS][i], "mul_mat_vec_iq2_xs_f32_f32", arr_dmmv_iq2_xs_f32_f32_len[reduc16], arr_dmmv_iq2_xs_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_S][i], "mul_mat_vec_iq2_s_f32_f32", arr_dmmv_iq2_s_f32_f32_len[reduc16], arr_dmmv_iq2_s_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ3_XXS][i], "mul_mat_vec_iq3_xxs_f32_f32", arr_dmmv_iq3_xxs_f32_f32_len[reduc16], arr_dmmv_iq3_xxs_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ3_S][i], "mul_mat_vec_iq3_s_f32_f32", arr_dmmv_iq3_s_f32_f32_len[reduc16], arr_dmmv_iq3_s_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ4_XS][i], "mul_mat_vec_iq4_xs_f32_f32", arr_dmmv_iq4_xs_f32_f32_len[reduc16], arr_dmmv_iq4_xs_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ4_NL][i], "mul_mat_vec_iq4_nl_f32_f32", arr_dmmv_iq4_nl_f32_f32_len[reduc16], arr_dmmv_iq4_nl_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_MXFP4][i], "mul_mat_vec_mxfp4_f32_f32", arr_dmmv_mxfp4_f32_f32_len[reduc16], arr_dmmv_mxfp4_f32_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_F32 ][i], "mul_mat_vec_f32_f16_f32", arr_dmmv_f32_f16_f32_len[reduc], arr_dmmv_f32_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_F16 ][i], "mul_mat_vec_f16_f16_f32", arr_dmmv_f16_f16_f32_len[reduc], arr_dmmv_f16_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_BF16][i], "mul_mat_vec_bf16_f16_f32", arr_dmmv_bf16_f16_f32_len[reduc], arr_dmmv_bf16_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_f16_f32", arr_dmmv_q4_0_f16_f32_len[reduc], arr_dmmv_q4_0_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_f16_f32", arr_dmmv_q4_1_f16_f32_len[reduc], arr_dmmv_q4_1_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_f16_f32", arr_dmmv_q5_0_f16_f32_len[reduc], arr_dmmv_q5_0_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_f16_f32", arr_dmmv_q5_1_f16_f32_len[reduc], arr_dmmv_q5_1_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_f16_f32", arr_dmmv_q8_0_f16_f32_len[reduc], arr_dmmv_q8_0_f16_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup, 1*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q2_K][i], "mul_mat_vec_q2_k_f16_f32", arr_dmmv_q2_k_f16_f32_len[reduc16], arr_dmmv_q2_k_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q3_K][i], "mul_mat_vec_q3_k_f16_f32", arr_dmmv_q3_k_f16_f32_len[reduc16], arr_dmmv_q3_k_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_K][i], "mul_mat_vec_q4_k_f16_f32", arr_dmmv_q4_k_f16_f32_len[reduc16], arr_dmmv_q4_k_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_K][i], "mul_mat_vec_q5_k_f16_f32", arr_dmmv_q5_k_f16_f32_len[reduc16], arr_dmmv_q5_k_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q6_K][i], "mul_mat_vec_q6_k_f16_f32", arr_dmmv_q6_k_f16_f32_len[reduc16], arr_dmmv_q6_k_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ1_S][i], "mul_mat_vec_iq1_s_f16_f32", arr_dmmv_iq1_s_f16_f32_len[reduc16], arr_dmmv_iq1_s_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ1_M][i], "mul_mat_vec_iq1_m_f16_f32", arr_dmmv_iq1_m_f16_f32_len[reduc16], arr_dmmv_iq1_m_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_XXS][i], "mul_mat_vec_iq2_xxs_f16_f32", arr_dmmv_iq2_xxs_f16_f32_len[reduc16], arr_dmmv_iq2_xxs_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_XS][i], "mul_mat_vec_iq2_xs_f16_f32", arr_dmmv_iq2_xs_f16_f32_len[reduc16], arr_dmmv_iq2_xs_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_S][i], "mul_mat_vec_iq2_s_f16_f32", arr_dmmv_iq2_s_f16_f32_len[reduc16], arr_dmmv_iq2_s_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ3_XXS][i], "mul_mat_vec_iq3_xxs_f16_f32", arr_dmmv_iq3_xxs_f16_f32_len[reduc16], arr_dmmv_iq3_xxs_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ3_S][i], "mul_mat_vec_iq3_s_f16_f32", arr_dmmv_iq3_s_f16_f32_len[reduc16], arr_dmmv_iq3_s_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ4_XS][i], "mul_mat_vec_iq4_xs_f16_f32", arr_dmmv_iq4_xs_f16_f32_len[reduc16], arr_dmmv_iq4_xs_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ4_NL][i], "mul_mat_vec_iq4_nl_f16_f32", arr_dmmv_iq4_nl_f16_f32_len[reduc16], arr_dmmv_iq4_nl_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_MXFP4][i], "mul_mat_vec_mxfp4_f16_f32", arr_dmmv_mxfp4_f16_f32_len[reduc16], arr_dmmv_mxfp4_f16_f32_data[reduc16], "main", 3, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_F32 ][i], "mul_mat_vec_f32_f32_f32", arr_dmmv_f32_f32_f32_len[reduc], arr_dmmv_f32_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_F16 ][i], "mul_mat_vec_f16_f32_f32", arr_dmmv_f16_f32_f32_len[reduc], arr_dmmv_f16_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_BF16][i], "mul_mat_vec_bf16_f32_f32", arr_dmmv_bf16_f32_f32_len[reduc], arr_dmmv_bf16_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_f32_f32", arr_dmmv_q4_0_f32_f32_len[reduc], arr_dmmv_q4_0_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_f32_f32", arr_dmmv_q4_1_f32_f32_len[reduc], arr_dmmv_q4_1_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_f32_f32", arr_dmmv_q5_0_f32_f32_len[reduc], arr_dmmv_q5_0_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_f32_f32", arr_dmmv_q5_1_f32_f32_len[reduc], arr_dmmv_q5_1_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_f32_f32", arr_dmmv_q8_0_f32_f32_len[reduc], arr_dmmv_q8_0_f32_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup, 1*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q2_K][i], "mul_mat_vec_q2_k_f32_f32", arr_dmmv_q2_k_f32_f32_len[reduc16], arr_dmmv_q2_k_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q3_K][i], "mul_mat_vec_q3_k_f32_f32", arr_dmmv_q3_k_f32_f32_len[reduc16], arr_dmmv_q3_k_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q4_K][i], "mul_mat_vec_q4_k_f32_f32", arr_dmmv_q4_k_f32_f32_len[reduc16], arr_dmmv_q4_k_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q5_K][i], "mul_mat_vec_q5_k_f32_f32", arr_dmmv_q5_k_f32_f32_len[reduc16], arr_dmmv_q5_k_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_Q6_K][i], "mul_mat_vec_q6_k_f32_f32", arr_dmmv_q6_k_f32_f32_len[reduc16], arr_dmmv_q6_k_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ1_S][i], "mul_mat_vec_iq1_s_f32_f32", arr_dmmv_iq1_s_f32_f32_len[reduc16], arr_dmmv_iq1_s_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ1_M][i], "mul_mat_vec_iq1_m_f32_f32", arr_dmmv_iq1_m_f32_f32_len[reduc16], arr_dmmv_iq1_m_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_XXS][i], "mul_mat_vec_iq2_xxs_f32_f32", arr_dmmv_iq2_xxs_f32_f32_len[reduc16], arr_dmmv_iq2_xxs_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_XS][i], "mul_mat_vec_iq2_xs_f32_f32", arr_dmmv_iq2_xs_f32_f32_len[reduc16], arr_dmmv_iq2_xs_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ2_S][i], "mul_mat_vec_iq2_s_f32_f32", arr_dmmv_iq2_s_f32_f32_len[reduc16], arr_dmmv_iq2_s_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ3_XXS][i], "mul_mat_vec_iq3_xxs_f32_f32", arr_dmmv_iq3_xxs_f32_f32_len[reduc16], arr_dmmv_iq3_xxs_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ3_S][i], "mul_mat_vec_iq3_s_f32_f32", arr_dmmv_iq3_s_f32_f32_len[reduc16], arr_dmmv_iq3_s_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ4_XS][i], "mul_mat_vec_iq4_xs_f32_f32", arr_dmmv_iq4_xs_f32_f32_len[reduc16], arr_dmmv_iq4_xs_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_IQ4_NL][i], "mul_mat_vec_iq4_nl_f32_f32", arr_dmmv_iq4_nl_f32_f32_len[reduc16], arr_dmmv_iq4_nl_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f32_f32[w][GGML_TYPE_MXFP4][i], "mul_mat_vec_mxfp4_f32_f32", arr_dmmv_mxfp4_f32_f32_len[reduc16], arr_dmmv_mxfp4_f32_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_F32 ][i], "mul_mat_vec_f32_f16_f32", arr_dmmv_f32_f16_f32_len[reduc], arr_dmmv_f32_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_F16 ][i], "mul_mat_vec_f16_f16_f32", arr_dmmv_f16_f16_f32_len[reduc], arr_dmmv_f16_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_BF16][i], "mul_mat_vec_bf16_f16_f32", arr_dmmv_bf16_f16_f32_len[reduc], arr_dmmv_bf16_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2, 1, 1}, {wg_size_subgroup, 2, i+1}, 1, false, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_f16_f32", arr_dmmv_q4_0_f16_f32_len[reduc], arr_dmmv_q4_0_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_f16_f32", arr_dmmv_q4_1_f16_f32_len[reduc], arr_dmmv_q4_1_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_f16_f32", arr_dmmv_q5_0_f16_f32_len[reduc], arr_dmmv_q5_0_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_f16_f32", arr_dmmv_q5_1_f16_f32_len[reduc], arr_dmmv_q5_1_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup, 2*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_f16_f32", arr_dmmv_q8_0_f16_f32_len[reduc], arr_dmmv_q8_0_f16_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup, 1*rm_stdq, i+1}, 1, true, use_subgroups, force_subgroup_size); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q2_K][i], "mul_mat_vec_q2_k_f16_f32", arr_dmmv_q2_k_f16_f32_len[reduc16], arr_dmmv_q2_k_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q3_K][i], "mul_mat_vec_q3_k_f16_f32", arr_dmmv_q3_k_f16_f32_len[reduc16], arr_dmmv_q3_k_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q4_K][i], "mul_mat_vec_q4_k_f16_f32", arr_dmmv_q4_k_f16_f32_len[reduc16], arr_dmmv_q4_k_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q5_K][i], "mul_mat_vec_q5_k_f16_f32", arr_dmmv_q5_k_f16_f32_len[reduc16], arr_dmmv_q5_k_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_Q6_K][i], "mul_mat_vec_q6_k_f16_f32", arr_dmmv_q6_k_f16_f32_len[reduc16], arr_dmmv_q6_k_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_kq, 1, 1}, {wg_size_subgroup16, rm_kq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ1_S][i], "mul_mat_vec_iq1_s_f16_f32", arr_dmmv_iq1_s_f16_f32_len[reduc16], arr_dmmv_iq1_s_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ1_M][i], "mul_mat_vec_iq1_m_f16_f32", arr_dmmv_iq1_m_f16_f32_len[reduc16], arr_dmmv_iq1_m_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_XXS][i], "mul_mat_vec_iq2_xxs_f16_f32", arr_dmmv_iq2_xxs_f16_f32_len[reduc16], arr_dmmv_iq2_xxs_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_XS][i], "mul_mat_vec_iq2_xs_f16_f32", arr_dmmv_iq2_xs_f16_f32_len[reduc16], arr_dmmv_iq2_xs_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ2_S][i], "mul_mat_vec_iq2_s_f16_f32", arr_dmmv_iq2_s_f16_f32_len[reduc16], arr_dmmv_iq2_s_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ3_XXS][i], "mul_mat_vec_iq3_xxs_f16_f32", arr_dmmv_iq3_xxs_f16_f32_len[reduc16], arr_dmmv_iq3_xxs_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ3_S][i], "mul_mat_vec_iq3_s_f16_f32", arr_dmmv_iq3_s_f16_f32_len[reduc16], arr_dmmv_iq3_s_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ4_XS][i], "mul_mat_vec_iq4_xs_f16_f32", arr_dmmv_iq4_xs_f16_f32_len[reduc16], arr_dmmv_iq4_xs_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_IQ4_NL][i], "mul_mat_vec_iq4_nl_f16_f32", arr_dmmv_iq4_nl_f16_f32_len[reduc16], arr_dmmv_iq4_nl_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_f16_f32[w][GGML_TYPE_MXFP4][i], "mul_mat_vec_mxfp4_f16_f32", arr_dmmv_mxfp4_f16_f32_len[reduc16], arr_dmmv_mxfp4_f16_f32_data[reduc16], "main", 4, sizeof(vk_mat_vec_push_constants), {rm_iq, 1, 1}, {wg_size_subgroup16, rm_iq, i+1}, 1, true, use_subgroups16, force_subgroup_size16); #if defined(GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT) if (device->integer_dot_product) { const uint32_t subgroup_size_int = (device->vendor_id == VK_VENDOR_ID_INTEL && device->subgroup_size_control) ? device->subgroup_min_size : device->subgroup_size; const uint32_t wg_size_subgroup_int = (w == DMMV_WG_SIZE_SUBGROUP) ? subgroup_size_int : (subgroup_size_int * 4); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_q8_1_f32", arr_dmmv_q4_0_q8_1_f32_len[reduc], arr_dmmv_q4_0_q8_1_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_q8_1_f32", arr_dmmv_q4_1_q8_1_f32_len[reduc], arr_dmmv_q4_1_q8_1_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_q8_1_f32", arr_dmmv_q5_0_q8_1_f32_len[reduc], arr_dmmv_q5_0_q8_1_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_q8_1_f32", arr_dmmv_q5_1_q8_1_f32_len[reduc], arr_dmmv_q5_1_q8_1_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_q8_1_f32", arr_dmmv_q8_0_q8_1_f32_len[reduc], arr_dmmv_q8_0_q8_1_f32_data[reduc], "main", 3, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q4_0][i], "mul_mat_vec_q4_0_q8_1_f32", arr_dmmv_q4_0_q8_1_f32_len[reduc], arr_dmmv_q4_0_q8_1_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q4_1][i], "mul_mat_vec_q4_1_q8_1_f32", arr_dmmv_q4_1_q8_1_f32_len[reduc], arr_dmmv_q4_1_q8_1_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q5_0][i], "mul_mat_vec_q5_0_q8_1_f32", arr_dmmv_q5_0_q8_1_f32_len[reduc], arr_dmmv_q5_0_q8_1_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q5_1][i], "mul_mat_vec_q5_1_q8_1_f32", arr_dmmv_q5_1_q8_1_f32_len[reduc], arr_dmmv_q5_1_q8_1_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {2*rm_stdq, 1, 1}, {wg_size_subgroup_int, 2*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_q8_1_f32[w][GGML_TYPE_Q8_0][i], "mul_mat_vec_q8_0_q8_1_f32", arr_dmmv_q8_0_q8_1_f32_len[reduc], arr_dmmv_q8_0_q8_1_f32_data[reduc], "main", 4, sizeof(vk_mat_vec_push_constants), {1*rm_stdq, 1, 1}, {wg_size_subgroup_int, 1*rm_stdq, i+1}, 1, true, use_subgroups, subgroup_size_int); } #endif // GGML_VULKAN_INTEGER_DOT_GLSLC_SUPPORT } } - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F32 ], "mul_mat_vec_id_f32_f32", mul_mat_vec_id_f32_f32_len, mul_mat_vec_id_f32_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F16 ], "mul_mat_vec_id_f16_f32", mul_mat_vec_id_f16_f32_len, mul_mat_vec_id_f16_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_BF16], "mul_mat_vec_id_bf16_f32", mul_mat_vec_id_bf16_f32_len, mul_mat_vec_id_bf16_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_f32", mul_mat_vec_id_q4_0_f32_len, mul_mat_vec_id_q4_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_f32", mul_mat_vec_id_q4_1_f32_len, mul_mat_vec_id_q4_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_f32", mul_mat_vec_id_q5_0_f32_len, mul_mat_vec_id_q5_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_f32", mul_mat_vec_id_q5_1_f32_len, mul_mat_vec_id_q5_1_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_f32", mul_mat_vec_id_q8_0_f32_len, mul_mat_vec_id_q8_0_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq, 1, 1}, {device->subgroup_size, 1*rm_stdq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q2_K], "mul_mat_vec_id_q2_k_f32", mul_mat_vec_id_q2_k_f32_len, mul_mat_vec_id_q2_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q3_K], "mul_mat_vec_id_q3_k_f32", mul_mat_vec_id_q3_k_f32_len, mul_mat_vec_id_q3_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_K], "mul_mat_vec_id_q4_k_f32", mul_mat_vec_id_q4_k_f32_len, mul_mat_vec_id_q4_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_K], "mul_mat_vec_id_q5_k_f32", mul_mat_vec_id_q5_k_f32_len, mul_mat_vec_id_q5_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q6_K], "mul_mat_vec_id_q6_k_f32", mul_mat_vec_id_q6_k_f32_len, mul_mat_vec_id_q6_k_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ1_S], "mul_mat_vec_id_iq1_s_f32", mul_mat_vec_id_iq1_s_f32_len, mul_mat_vec_id_iq1_s_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ1_M], "mul_mat_vec_id_iq1_m_f32", mul_mat_vec_id_iq1_m_f32_len, mul_mat_vec_id_iq1_m_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_XXS], "mul_mat_vec_id_iq2_xxs_f32", mul_mat_vec_id_iq2_xxs_f32_len, mul_mat_vec_id_iq2_xxs_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_XS], "mul_mat_vec_id_iq2_xs_f32", mul_mat_vec_id_iq2_xs_f32_len, mul_mat_vec_id_iq2_xs_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_S], "mul_mat_vec_id_iq2_s_f32", mul_mat_vec_id_iq2_s_f32_len, mul_mat_vec_id_iq2_s_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ3_XXS], "mul_mat_vec_id_iq3_xxs_f32", mul_mat_vec_id_iq3_xxs_f32_len, mul_mat_vec_id_iq3_xxs_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ3_S], "mul_mat_vec_id_iq3_s_f32", mul_mat_vec_id_iq3_s_f32_len, mul_mat_vec_id_iq3_s_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_XS], "mul_mat_vec_id_iq4_xs_f32", mul_mat_vec_id_iq4_xs_f32_len, mul_mat_vec_id_iq4_xs_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_id_iq4_nl_f32", mul_mat_vec_id_iq4_nl_f32_len, mul_mat_vec_id_iq4_nl_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); - ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_MXFP4], "mul_mat_vec_id_mxfp4_f32", mul_mat_vec_id_mxfp4_f32_len, mul_mat_vec_id_mxfp4_f32_data, "main", 4, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F32 ], "mul_mat_vec_id_f32_f32", mul_mat_vec_id_f32_f32_len, mul_mat_vec_id_f32_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_F16 ], "mul_mat_vec_id_f16_f32", mul_mat_vec_id_f16_f32_len, mul_mat_vec_id_f16_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_BF16], "mul_mat_vec_id_bf16_f32", mul_mat_vec_id_bf16_f32_len, mul_mat_vec_id_bf16_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2, 1, 1}, {device->subgroup_size, 2}, 1); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_0], "mul_mat_vec_id_q4_0_f32", mul_mat_vec_id_q4_0_f32_len, mul_mat_vec_id_q4_0_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_1], "mul_mat_vec_id_q4_1_f32", mul_mat_vec_id_q4_1_f32_len, mul_mat_vec_id_q4_1_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_0], "mul_mat_vec_id_q5_0_f32", mul_mat_vec_id_q5_0_f32_len, mul_mat_vec_id_q5_0_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_1], "mul_mat_vec_id_q5_1_f32", mul_mat_vec_id_q5_1_f32_len, mul_mat_vec_id_q5_1_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {2*rm_stdq, 1, 1}, {device->subgroup_size, 2*rm_stdq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q8_0], "mul_mat_vec_id_q8_0_f32", mul_mat_vec_id_q8_0_f32_len, mul_mat_vec_id_q8_0_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {1*rm_stdq, 1, 1}, {device->subgroup_size, 1*rm_stdq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q2_K], "mul_mat_vec_id_q2_k_f32", mul_mat_vec_id_q2_k_f32_len, mul_mat_vec_id_q2_k_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q3_K], "mul_mat_vec_id_q3_k_f32", mul_mat_vec_id_q3_k_f32_len, mul_mat_vec_id_q3_k_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q4_K], "mul_mat_vec_id_q4_k_f32", mul_mat_vec_id_q4_k_f32_len, mul_mat_vec_id_q4_k_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q5_K], "mul_mat_vec_id_q5_k_f32", mul_mat_vec_id_q5_k_f32_len, mul_mat_vec_id_q5_k_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_Q6_K], "mul_mat_vec_id_q6_k_f32", mul_mat_vec_id_q6_k_f32_len, mul_mat_vec_id_q6_k_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_kq, 1, 1}, {subgroup_size_16, rm_kq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ1_S], "mul_mat_vec_id_iq1_s_f32", mul_mat_vec_id_iq1_s_f32_len, mul_mat_vec_id_iq1_s_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ1_M], "mul_mat_vec_id_iq1_m_f32", mul_mat_vec_id_iq1_m_f32_len, mul_mat_vec_id_iq1_m_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_XXS], "mul_mat_vec_id_iq2_xxs_f32", mul_mat_vec_id_iq2_xxs_f32_len, mul_mat_vec_id_iq2_xxs_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_XS], "mul_mat_vec_id_iq2_xs_f32", mul_mat_vec_id_iq2_xs_f32_len, mul_mat_vec_id_iq2_xs_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ2_S], "mul_mat_vec_id_iq2_s_f32", mul_mat_vec_id_iq2_s_f32_len, mul_mat_vec_id_iq2_s_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ3_XXS], "mul_mat_vec_id_iq3_xxs_f32", mul_mat_vec_id_iq3_xxs_f32_len, mul_mat_vec_id_iq3_xxs_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ3_S], "mul_mat_vec_id_iq3_s_f32", mul_mat_vec_id_iq3_s_f32_len, mul_mat_vec_id_iq3_s_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_XS], "mul_mat_vec_id_iq4_xs_f32", mul_mat_vec_id_iq4_xs_f32_len, mul_mat_vec_id_iq4_xs_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_IQ4_NL], "mul_mat_vec_id_iq4_nl_f32", mul_mat_vec_id_iq4_nl_f32_len, mul_mat_vec_id_iq4_nl_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); + ggml_vk_create_pipeline(device, device->pipeline_dequant_mul_mat_vec_id_f32[GGML_TYPE_MXFP4], "mul_mat_vec_id_mxfp4_f32", mul_mat_vec_id_mxfp4_f32_len, mul_mat_vec_id_mxfp4_f32_data, "main", 5, sizeof(vk_mat_vec_id_push_constants), {rm_iq, 1, 1}, {subgroup_size_16, rm_iq}, 1, true); // dequant shaders ggml_vk_create_pipeline(device, device->pipeline_dequant[GGML_TYPE_F32 ], "f32_to_f16", dequant_f32_len, dequant_f32_data, "main", 2, 5 * sizeof(uint32_t), {256 * 16, 1, 1}, {}, 1); @@ -3519,12 +3535,12 @@ static void ggml_vk_load_shaders(vk_device& device) { for (uint32_t i = 0; i < p021_max_gqa_ratio; ++i) { if (device->subgroup_arithmetic && device->subgroup_require_full_support) { - ggml_vk_create_pipeline2(device, device->pipeline_mul_mat_vec_p021_f16_f32[i], "mul_mat_vec_p021_f16_f32"+std::to_string(i+1), mul_mat_vec_p021_f16_f32_subgroup_add_len, mul_mat_vec_p021_f16_f32_subgroup_add_data, "main", 3, 6 * sizeof(uint32_t), {1, 1, 1}, {device->subgroup_size, i + 1}, 1, true, true); + ggml_vk_create_pipeline2(device, device->pipeline_mul_mat_vec_p021_f16_f32[i], "mul_mat_vec_p021_f16_f32"+std::to_string(i+1), mul_mat_vec_p021_f16_f32_subgroup_add_len, mul_mat_vec_p021_f16_f32_subgroup_add_data, "main", 4, 7 * sizeof(uint32_t), {1, 1, 1}, {device->subgroup_size, i + 1}, 1, true, true); } else { - ggml_vk_create_pipeline2(device, device->pipeline_mul_mat_vec_p021_f16_f32[i], "mul_mat_vec_p021_f16_f32"+std::to_string(i+1), mul_mat_vec_p021_f16_f32_len, mul_mat_vec_p021_f16_f32_data, "main", 3, 6 * sizeof(uint32_t), {1, 1, 1}, {device->subgroup_size, i + 1}, 1, true); + ggml_vk_create_pipeline2(device, device->pipeline_mul_mat_vec_p021_f16_f32[i], "mul_mat_vec_p021_f16_f32"+std::to_string(i+1), mul_mat_vec_p021_f16_f32_len, mul_mat_vec_p021_f16_f32_data, "main", 4, 7 * sizeof(uint32_t), {1, 1, 1}, {device->subgroup_size, i + 1}, 1, true); } } - ggml_vk_create_pipeline(device, device->pipeline_mul_mat_vec_nc_f16_f32, "mul_mat_vec_nc_f16_f32", mul_mat_vec_nc_f16_f32_len, mul_mat_vec_nc_f16_f32_data, "main", 3, 12 * sizeof(uint32_t), {1, 1, 1}, {}, 1); + ggml_vk_create_pipeline(device, device->pipeline_mul_mat_vec_nc_f16_f32, "mul_mat_vec_nc_f16_f32", mul_mat_vec_nc_f16_f32_len, mul_mat_vec_nc_f16_f32_data, "main", 4, 13 * sizeof(uint32_t), {1, 1, 1}, {}, 1); ggml_vk_create_pipeline(device, device->pipeline_norm_f32, "norm_f32", norm_f32_len, norm_f32_data, "main", 2, sizeof(vk_op_push_constants), {1, 1, 1}, {}, 1); ggml_vk_create_pipeline(device, device->pipeline_group_norm_f32, "group_norm_f32", group_norm_f32_len, group_norm_f32_data, "main", 2, sizeof(vk_op_push_constants), {1, 1, 1}, {}, 1); @@ -6501,7 +6517,11 @@ static bool ggml_vk_should_use_mmvq(const vk_device& device, uint32_t m, uint32_ GGML_UNUSED(k); } -static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { +static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; + VK_LOG_DEBUG("ggml_vk_mul_mat_vec_q_f16((" << src0 << ", name=" << src0->name << ", type=" << src0->type << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << src1->type << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; std::cerr << "), (" << dst << ", name=" << dst->name << ", type=" << dst->type << ", ne0=" << dst->ne[0] << ", ne1=" << dst->ne[1] << ", ne2=" << dst->ne[2] << ", ne3=" << dst->ne[3] << ", nb0=" << dst->nb[0] << ", nb1=" << dst->nb[1] << ", nb2=" << dst->nb[2] << ", nb3=" << dst->nb[3]; @@ -6532,7 +6552,6 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& GGML_ASSERT(ne11 == 1 || ne12 * ne13 == 1); bool batch_n = ne11 > 1; - ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; ggml_backend_vk_buffer_context * src0_buf_ctx = (ggml_backend_vk_buffer_context *)src0->buffer->context; ggml_backend_vk_buffer_context * src1_buf_ctx = (ggml_backend_vk_buffer_context *)src1->buffer->context; @@ -6634,8 +6653,20 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& return; } - vk_buffer d_D = dst_buf_ctx->dev_buffer; - const uint64_t d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + vk_buffer d_D; + uint64_t d_buf_offset = 0; + + if (ctx->num_additional_fused_ops > 0) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)add->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(add) + add->view_offs; + } else { + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + } + GGML_ASSERT(d_D != nullptr); vk_buffer d_X; uint64_t x_buf_offset = 0; @@ -6730,14 +6761,43 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& y_sz_total = CEIL_DIV(y_sz_total, 144) * 144; } + uint32_t enable_bias = ctx->num_additional_fused_ops > 0; + + vk_buffer d_B = d_D; + size_t b_buf_offset = 0; + uint64_t b_sz = 0; + + if (enable_bias) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + const ggml_tensor * bias = add->src[0] == dst ? add->src[1] : add->src[0]; + + bool b_uma = false; + if (ctx->device->uma) { + ggml_vk_host_get(ctx->device, bias->data, d_B, b_buf_offset); + b_uma = d_B != nullptr; + } + if(!b_uma) { + ggml_backend_vk_buffer_context * bias_buf_ctx = (ggml_backend_vk_buffer_context *)bias->buffer->context; + d_B = bias_buf_ctx->dev_buffer; + b_buf_offset = vk_tensor_offset(bias) + bias->view_offs; + GGML_ASSERT(d_B != nullptr); + b_sz = ggml_nbytes(bias); + } + } + // compute const vk_mat_vec_push_constants pc = { (uint32_t)ne00, (uint32_t)ne10, (uint32_t)ne10, (uint32_t)ne01, - stride_batch_x, stride_batch_y, stride_batch_d, + stride_batch_x, stride_batch_y, stride_batch_d, enable_bias, (uint32_t)ne02, (uint32_t)ne12, (uint32_t)r2, (uint32_t)r3, }; ggml_vk_dispatch_pipeline(ctx, subctx, dmmv, - { vk_subbuffer{ d_X, x_buf_offset, x_sz * ne02 * ne03 }, vk_subbuffer{ d_Y, y_buf_offset, y_sz_total }, vk_subbuffer{ d_D, d_buf_offset, d_sz * ne22 * ne23} }, + { + vk_subbuffer{ d_X, x_buf_offset, x_sz * ne02 * ne03 }, + vk_subbuffer{ d_Y, y_buf_offset, y_sz_total }, + vk_subbuffer{ d_D, d_buf_offset, d_sz * ne22 * ne23}, + vk_subbuffer{ d_B, b_buf_offset, b_sz }, + }, pc, { groups_x, (uint32_t)(ne12 * ne13), groups_z }); if (x_non_contig) { @@ -6748,7 +6808,10 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& } } -static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { +static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; VK_LOG_DEBUG("ggml_vk_mul_mat_p021_f16_f32(" << src0 << ", name=" << src0->name << ", type=" << src0->type << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << src1->type << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; std::cerr << "), (" << dst << ", name=" << dst->name << ", type=" << dst->type << ", ne0=" << dst->ne[0] << ", ne1=" << dst->ne[1] << ", ne2=" << dst->ne[2] << ", ne3=" << dst->ne[3] << ", nb0=" << dst->nb[0] << ", nb1=" << dst->nb[1] << ", nb2=" << dst->nb[2] << ", nb3=" << dst->nb[3]; @@ -6771,7 +6834,6 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c GGML_ASSERT(ne11 == 1); - ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; ggml_backend_vk_buffer_context * src0_buf_ctx = (ggml_backend_vk_buffer_context *)src0->buffer->context; ggml_backend_vk_buffer_context * src1_buf_ctx = (ggml_backend_vk_buffer_context *)src1->buffer->context; @@ -6805,8 +6867,19 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c return; } - vk_buffer d_D = dst_buf_ctx->dev_buffer; - const uint64_t d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + vk_buffer d_D; + uint64_t d_buf_offset = 0; + + if (ctx->num_additional_fused_ops > 0) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)add->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(add) + add->view_offs; + } else { + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + } GGML_ASSERT(d_D != nullptr); vk_buffer d_Qx = src0_buf_ctx->dev_buffer; const uint64_t qx_buf_offset = vk_tensor_offset(src0) + src0->view_offs; @@ -6823,8 +6896,32 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c const uint64_t d_buffer_offset = (d_buf_offset / ctx->device->properties.limits.minStorageBufferOffsetAlignment) * ctx->device->properties.limits.minStorageBufferOffsetAlignment; const uint64_t d_shader_offset = d_buf_offset - d_buffer_offset; + uint32_t enable_bias = ctx->num_additional_fused_ops > 0; + + vk_buffer d_B = d_D; + size_t b_buf_offset = 0; + uint64_t b_sz = 0; + + if (enable_bias) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + const ggml_tensor * bias = add->src[0] == dst ? add->src[1] : add->src[0]; + + bool b_uma = false; + if (ctx->device->uma) { + ggml_vk_host_get(ctx->device, bias->data, d_B, b_buf_offset); + b_uma = d_B != nullptr; + } + if(!b_uma) { + ggml_backend_vk_buffer_context * bias_buf_ctx = (ggml_backend_vk_buffer_context *)bias->buffer->context; + d_B = bias_buf_ctx->dev_buffer; + b_buf_offset = vk_tensor_offset(bias) + bias->view_offs; + GGML_ASSERT(d_B != nullptr); + b_sz = ggml_nbytes(bias); + } + } + // compute - const std::array pc = { (uint32_t)ne00, (uint32_t)ne01, (uint32_t)ne02, (uint32_t)ne12, (uint32_t)(qy_shader_offset / ggml_type_size(src1->type)), (uint32_t)(d_shader_offset / ggml_type_size(dst->type)) }; + const std::array pc = { (uint32_t)ne00, (uint32_t)ne01, (uint32_t)ne02, (uint32_t)ne12, (uint32_t)(qy_shader_offset / ggml_type_size(src1->type)), (uint32_t)(d_shader_offset / ggml_type_size(dst->type)), enable_bias }; uint32_t workgroups_z = (uint32_t)ne12; // When gqa_ratio > 1, each invocation does multiple rows and we can launch fewer workgroups @@ -6832,10 +6929,19 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c workgroups_z /= gqa_ratio; } - ggml_vk_dispatch_pipeline(ctx, subctx, ctx->device->pipeline_mul_mat_vec_p021_f16_f32[gqa_ratio - 1], { vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, vk_subbuffer{ d_Qy, qy_buffer_offset, qy_sz + qy_shader_offset }, vk_subbuffer{ d_D, d_buffer_offset, d_sz + d_shader_offset } }, pc, { 1, (uint32_t)ne01, workgroups_z }); + ggml_vk_dispatch_pipeline(ctx, subctx, ctx->device->pipeline_mul_mat_vec_p021_f16_f32[gqa_ratio - 1], + { + vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, + vk_subbuffer{ d_Qy, qy_buffer_offset, qy_sz + qy_shader_offset }, + vk_subbuffer{ d_D, d_buffer_offset, d_sz + d_shader_offset }, + vk_subbuffer{ d_B, b_buf_offset, b_sz }, + }, pc, { 1, (uint32_t)ne01, workgroups_z }); } -static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { +static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; VK_LOG_DEBUG("ggml_vk_mul_mat_nc_f16_f32((" << src0 << ", name=" << src0->name << ", type=" << src0->type << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << src1->type << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; std::cerr << "), (" << dst << ", name=" << dst->name << ", type=" << dst->type << ", ne0=" << dst->ne[0] << ", ne1=" << dst->ne[1] << ", ne2=" << dst->ne[2] << ", ne3=" << dst->ne[3] << ", nb0=" << dst->nb[0] << ", nb1=" << dst->nb[1] << ", nb2=" << dst->nb[2] << ", nb3=" << dst->nb[3]; @@ -6868,7 +6974,6 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con GGML_ASSERT(ne11 == 1); GGML_ASSERT(src0->ne[3] == src1->ne[3]); // checked in supports_op - ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; ggml_backend_vk_buffer_context * src0_buf_ctx = (ggml_backend_vk_buffer_context *)src0->buffer->context; ggml_backend_vk_buffer_context * src1_buf_ctx = (ggml_backend_vk_buffer_context *)src1->buffer->context; @@ -6898,8 +7003,20 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con return; } - vk_buffer d_D = dst_buf_ctx->dev_buffer; - const uint64_t d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + vk_buffer d_D; + uint64_t d_buf_offset = 0; + + if (ctx->num_additional_fused_ops > 0) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)add->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(add) + add->view_offs; + } else { + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + } + GGML_ASSERT(d_D != nullptr); vk_buffer d_Qx = src0_buf_ctx->dev_buffer; const uint64_t qx_buf_offset = vk_tensor_offset(src0) + src0->view_offs; @@ -6916,13 +7033,45 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con const uint64_t d_buffer_offset = (d_buf_offset / ctx->device->properties.limits.minStorageBufferOffsetAlignment) * ctx->device->properties.limits.minStorageBufferOffsetAlignment; const uint64_t d_shader_offset = d_buf_offset - d_buffer_offset; + uint32_t enable_bias = ctx->num_additional_fused_ops > 0; + + vk_buffer d_B = d_D; + size_t b_buf_offset = 0; + uint64_t b_sz = 0; + + if (enable_bias) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + const ggml_tensor * bias = add->src[0] == dst ? add->src[1] : add->src[0]; + + bool b_uma = false; + if (ctx->device->uma) { + ggml_vk_host_get(ctx->device, bias->data, d_B, b_buf_offset); + b_uma = d_B != nullptr; + } + if(!b_uma) { + ggml_backend_vk_buffer_context * bias_buf_ctx = (ggml_backend_vk_buffer_context *)bias->buffer->context; + d_B = bias_buf_ctx->dev_buffer; + b_buf_offset = vk_tensor_offset(bias) + bias->view_offs; + GGML_ASSERT(d_B != nullptr); + b_sz = ggml_nbytes(bias); + } + } + // compute - const std::array pc = { (uint32_t)ne00, (uint32_t)ne01, row_stride_x, channel_stride_x, channel_stride_y, (uint32_t)(ne12 / ne02), (uint32_t)ne12, (uint32_t)(qy_shader_offset / ggml_type_size(src1->type)), (uint32_t)(d_shader_offset / ggml_type_size(dst->type)), nb03, nb13, nb23 }; + const std::array pc = { (uint32_t)ne00, (uint32_t)ne01, row_stride_x, channel_stride_x, channel_stride_y, (uint32_t)(ne12 / ne02), (uint32_t)ne12, (uint32_t)(qy_shader_offset / ggml_type_size(src1->type)), (uint32_t)(d_shader_offset / ggml_type_size(dst->type)), nb03, nb13, nb23, enable_bias }; ggml_vk_dispatch_pipeline(ctx, subctx, ctx->device->pipeline_mul_mat_vec_nc_f16_f32, - { vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, vk_subbuffer{ d_Qy, qy_buffer_offset, qy_sz + qy_shader_offset }, vk_subbuffer{ d_D, d_buffer_offset, d_sz + d_shader_offset } }, pc, { (uint32_t)ne03, (uint32_t)ne01, (uint32_t)ne12 }); + { + vk_subbuffer{ d_Qx, qx_buf_offset, qx_sz }, + vk_subbuffer{ d_Qy, qy_buffer_offset, qy_sz + qy_shader_offset }, + vk_subbuffer{ d_D, d_buffer_offset, d_sz + d_shader_offset }, + vk_subbuffer{ d_B, b_buf_offset, b_sz }, + }, pc, { (uint32_t)ne03, (uint32_t)ne01, (uint32_t)ne12 }); } -static void ggml_vk_mul_mat(ggml_backend_vk_context * ctx, vk_context& subctx, ggml_tensor * src0, ggml_tensor * src1, ggml_tensor * dst, bool dryrun = false) { +static void ggml_vk_mul_mat(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + ggml_tensor * src0 = dst->src[0]; + ggml_tensor * src1 = dst->src[1]; VK_LOG_DEBUG("ggml_vk_mul_mat(" << src0 << ", " << src1 << ", " << dst << ")"); // Handle huge A matrix by splitting the M dimensions. This works well for convolution use cases @@ -6961,15 +7110,15 @@ static void ggml_vk_mul_mat(ggml_backend_vk_context * ctx, vk_context& subctx, g src1->nb[1] <= src1->nb[3] && src0->ne[3] == 1 && src1->ne[3] == 1) { - ggml_vk_mul_mat_vec_p021_f16_f32(ctx, subctx, src0, src1, dst, dryrun); + ggml_vk_mul_mat_vec_p021_f16_f32(ctx, subctx, cgraph, node_idx, dryrun); } else if (src0->type == GGML_TYPE_F16 && !ggml_is_contiguous(src0) && !ggml_is_transposed(src1) && dst->ne[1] == 1 && !ggml_is_permuted(src0) && !ggml_is_permuted(src1)) { - ggml_vk_mul_mat_vec_nc_f16_f32(ctx, subctx, src0, src1, dst, dryrun); + ggml_vk_mul_mat_vec_nc_f16_f32(ctx, subctx, cgraph, node_idx, dryrun); // mul_mat_vec supports batching ne12*ne13 when ne11==1, or treating ne11 as the batch size (up to four) // when ne12 and ne13 are one. } else if ((dst->ne[1] == 1 || (dst->ne[1] <= mul_mat_vec_max_cols && src1->ne[2] * src1->ne[3] == 1)) && (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || src0->type == GGML_TYPE_BF16 || ggml_is_quantized(src0->type))) { - ggml_vk_mul_mat_vec_q_f16(ctx, subctx, src0, src1, dst, dryrun); + ggml_vk_mul_mat_vec_q_f16(ctx, subctx, cgraph, node_idx, dryrun); } else { ggml_vk_mul_mat_q_f16(ctx, subctx, src0, src1, dst, false, dryrun); } @@ -7249,7 +7398,11 @@ static void ggml_vk_mul_mat_id_q_f16(ggml_backend_vk_context * ctx, vk_context& } } -static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * ids, ggml_tensor * dst, bool dryrun = false) { +static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + ggml_tensor * src0 = dst->src[0]; + ggml_tensor * src1 = dst->src[1]; + ggml_tensor * ids = dst->src[2]; VK_LOG_DEBUG("ggml_vk_mul_mat_vec_id_q_f16((" << src0 << ", name=" << src0->name << ", type=" << src0->type << ", ne0=" << src0->ne[0] << ", ne1=" << src0->ne[1] << ", ne2=" << src0->ne[2] << ", ne3=" << src0->ne[3] << ", nb0=" << src0->nb[0] << ", nb1=" << src0->nb[1] << ", nb2=" << src0->nb[2] << ", nb3=" << src0->nb[3]; std::cerr << "), (" << src1 << ", name=" << src1->name << ", type=" << src1->type << ", ne0=" << src1->ne[0] << ", ne1=" << src1->ne[1] << ", ne2=" << src1->ne[2] << ", ne3=" << src1->ne[3] << ", nb0=" << src1->nb[0] << ", nb1=" << src1->nb[1] << ", nb2=" << src1->nb[2] << ", nb3=" << src1->nb[3]; std::cerr << "), (" << ids << ", name=" << ids->name << ", type=" << ids->type << ", ne0=" << ids->ne[0] << ", ne1=" << ids->ne[1] << ", ne2=" << ids->ne[2] << ", ne3=" << ids->ne[3] << ", nb0=" << ids->nb[0] << ", nb1=" << ids->nb[1] << ", nb2=" << ids->nb[2] << ", nb3=" << ids->nb[3]; @@ -7281,7 +7434,6 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte const uint64_t ne22 = dst->ne[2]; const uint64_t ne23 = dst->ne[3]; - ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; ggml_backend_vk_buffer_context * src0_buf_ctx = (ggml_backend_vk_buffer_context *)src0->buffer->context; ggml_backend_vk_buffer_context * src1_buf_ctx = (ggml_backend_vk_buffer_context *)src1->buffer->context; ggml_backend_vk_buffer_context * ids_buf_ctx = (ggml_backend_vk_buffer_context *)ids->buffer->context; @@ -7369,8 +7521,20 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte return; } - vk_buffer d_D = dst_buf_ctx->dev_buffer; - const uint64_t d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + vk_buffer d_D; + uint64_t d_buf_offset = 0; + + if (ctx->num_additional_fused_ops > 0) { + const ggml_tensor * add = cgraph->nodes[node_idx + 1]; + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)add->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(add) + add->view_offs; + } else { + ggml_backend_vk_buffer_context * dst_buf_ctx = (ggml_backend_vk_buffer_context *)dst->buffer->context; + d_D = dst_buf_ctx->dev_buffer; + d_buf_offset = vk_tensor_offset(dst) + dst->view_offs; + } + GGML_ASSERT(d_D != nullptr); vk_buffer d_X; uint64_t x_buf_offset = 0; @@ -7445,15 +7609,46 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte groups_x = CEIL_DIV(groups_x, groups_z); } + uint32_t enable_bias = ctx->num_additional_fused_ops > 0; + + vk_buffer d_B = d_D; + size_t b_buf_offset = 0; + uint64_t b_sz = 0; + + if (enable_bias) { + const ggml_tensor * bias = cgraph->nodes[node_idx + 1]->src[1]; + + bool b_uma = false; + if (ctx->device->uma) { + ggml_vk_host_get(ctx->device, bias->data, d_B, b_buf_offset); + b_uma = d_B != nullptr; + } + if(!b_uma) { + ggml_backend_vk_buffer_context * bias_buf_ctx = (ggml_backend_vk_buffer_context *)bias->buffer->context; + d_B = bias_buf_ctx->dev_buffer; + b_buf_offset = vk_tensor_offset(bias) + bias->view_offs; + GGML_ASSERT(d_B != nullptr); + b_sz = ggml_nbytes(bias); + } + } + // compute const vk_mat_vec_id_push_constants pc = { (uint32_t)ne00, (uint32_t)ne10, (uint32_t)ne10, (uint32_t)ne01, (uint32_t)x_ne, stride_batch_y, (uint32_t)(ne20*ne21), + + enable_bias, + (uint32_t)nei0, (uint32_t)ne11, }; ggml_vk_dispatch_pipeline(ctx, subctx, dmmv, - { vk_subbuffer{ d_X, x_buf_offset, x_sz * ne02 * ne03 }, - vk_subbuffer{ d_Y, y_buf_offset, y_sz * ne12 * ne13 }, vk_subbuffer{ d_D, d_buf_offset, d_sz * ne22 * ne23}, vk_subbuffer{ d_ids, ids_buf_offset, ids_sz } }, + { + vk_subbuffer{ d_X, x_buf_offset, x_sz * ne02 * ne03 }, + vk_subbuffer{ d_Y, y_buf_offset, y_sz * ne12 * ne13 }, + vk_subbuffer{ d_D, d_buf_offset, d_sz * ne22 * ne23}, + vk_subbuffer{ d_B, b_buf_offset, b_sz }, + vk_subbuffer{ d_ids, ids_buf_offset, ids_sz }, + }, pc, { groups_x, (uint32_t)nei0, groups_z }); if (x_non_contig) { @@ -7464,10 +7659,21 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte } } -static void ggml_vk_mul_mat_id(ggml_backend_vk_context * ctx, vk_context& subctx, const ggml_tensor * src0, const ggml_tensor * src1, const ggml_tensor * src2, ggml_tensor * dst, bool dryrun = false) { +static bool ggml_vk_use_mul_mat_vec_id(const struct ggml_cgraph * cgraph, int node_idx) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + ggml_tensor * src0 = dst->src[0]; + ggml_tensor * src2 = dst->src[2]; + return src2->ne[1] == 1 && (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type)); +} + +static void ggml_vk_mul_mat_id(ggml_backend_vk_context * ctx, vk_context& subctx, const struct ggml_cgraph * cgraph, int node_idx, bool dryrun = false) { + ggml_tensor * dst = cgraph->nodes[node_idx]; + ggml_tensor * src0 = dst->src[0]; + ggml_tensor * src1 = dst->src[1]; + ggml_tensor * src2 = dst->src[2]; VK_LOG_DEBUG("ggml_vk_mul_mat_id(" << src0 << ", " << src1 << ", " << src2 << ", " << dst << ")"); - if (src2->ne[1] == 1 && (src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16 || ggml_is_quantized(src0->type))) { - ggml_vk_mul_mat_vec_id_q_f16(ctx, subctx, src0, src1, src2, dst, dryrun); + if (ggml_vk_use_mul_mat_vec_id(cgraph, node_idx)) { + ggml_vk_mul_mat_vec_id_q_f16(ctx, subctx, cgraph, node_idx, dryrun); } else { ggml_vk_mul_mat_id_q_f16(ctx, subctx, src0, src1, src2, dst, dryrun); } @@ -8433,7 +8639,7 @@ static bool ggml_vk_op_supports_incontiguous(ggml_op op) { } } -static uint32_t get_misalign_bytes(ggml_backend_vk_context * ctx, const ggml_tensor * t) +static uint32_t get_misalign_bytes(const ggml_backend_vk_context * ctx, const ggml_tensor * t) { return ((vk_tensor_offset(t) + t->view_offs) & (ctx->device->properties.limits.minStorageBufferOffsetAlignment - 1));; } @@ -11793,11 +11999,11 @@ static bool ggml_vk_build_graph(ggml_backend_vk_context * ctx, ggml_cgraph * cgr break; case GGML_OP_MUL_MAT: - ggml_vk_mul_mat(ctx, compute_ctx, src0, src1, node, dryrun); + ggml_vk_mul_mat(ctx, compute_ctx, cgraph, node_idx, dryrun); break; case GGML_OP_MUL_MAT_ID: - ggml_vk_mul_mat_id(ctx, compute_ctx, src0, src1, src2, node, dryrun); + ggml_vk_mul_mat_id(ctx, compute_ctx, cgraph, node_idx, dryrun); break; @@ -12474,7 +12680,7 @@ static bool ggml_vk_is_empty(ggml_tensor * node) { return ggml_is_empty(node) || node->op == GGML_OP_NONE || node->op == GGML_OP_RESHAPE || node->op == GGML_OP_TRANSPOSE || node->op == GGML_OP_VIEW || node->op == GGML_OP_PERMUTE; } -static bool ggml_vk_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, std::initializer_list ops) { +static bool ggml_vk_can_fuse(const ggml_backend_vk_context * ctx, const struct ggml_cgraph * cgraph, int node_idx, std::initializer_list ops) { if (!ggml_can_fuse(cgraph, node_idx, ops)) { return false; } @@ -12502,6 +12708,61 @@ static bool ggml_vk_can_fuse(const struct ggml_cgraph * cgraph, int node_idx, st return false; } } + if (ops.size() == 2 && ops.begin()[0] == GGML_OP_MUL_MAT && ops.begin()[1] == GGML_OP_ADD) { + // additional constraints specific to this fusion + const ggml_tensor *mul = cgraph->nodes[node_idx]; + const ggml_tensor *add = cgraph->nodes[node_idx + 1]; + const ggml_tensor *bias = add->src[0] == mul ? add->src[1] : add->src[0]; + + // mat-vec only + if (ggml_nrows(mul) != 1) { + return false; + } + // shaders assume the types match + if (mul->type != bias->type) { + return false; + } + // shaders reuse the D shape for bias + if (!ggml_are_same_shape(mul, bias) || + !ggml_are_same_stride(mul, bias)) { + return false; + } + // unaligned bias isn't handled + if (get_misalign_bytes(ctx, bias) != 0) { + return false; + } + } + if (ops.size() == 2 && ops.begin()[0] == GGML_OP_MUL_MAT_ID && ops.begin()[1] == GGML_OP_ADD_ID) { + // additional constraints specific to this fusion + const ggml_tensor *mul = cgraph->nodes[node_idx]; + const ggml_tensor *add = cgraph->nodes[node_idx + 1]; + const ggml_tensor *bias = add->src[1]; + + if (mul != add->src[0]) { + return false; + } + // mat-vec only + if (!ggml_vk_use_mul_mat_vec_id(cgraph, node_idx)) { + return false; + } + // shaders assume the types match + if (mul->type != bias->type) { + return false; + } + // shaders assume the bias is contiguous + if (!ggml_is_contiguous(bias)) { + return false; + } + // the ID tensor must be the same for mul_mat_id and add_id + if (mul->src[2] != add->src[2]) { + return false; + } + // unaligned bias isn't handled + if (get_misalign_bytes(ctx, bias) != 0) { + return false; + } + } + return true; } @@ -12670,7 +12931,11 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg uint32_t num_adds = ggml_vk_fuse_multi_add(ctx, cgraph, i); if (num_adds) { ctx->num_additional_fused_ops = num_adds - 1; - } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { + ctx->num_additional_fused_ops = 1; + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_MUL_MAT, GGML_OP_ADD })) { + ctx->num_additional_fused_ops = 1; + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_MUL_MAT_ID, GGML_OP_ADD_ID })) { ctx->num_additional_fused_ops = 1; } else if (ggml_can_fuse_subgraph(cgraph, i, { GGML_OP_ROPE, GGML_OP_VIEW, GGML_OP_SET_ROWS }, { i + 2 }) && ggml_check_edges(cgraph, i, rope_view_set_rows_edges) && @@ -12783,7 +13048,11 @@ static ggml_status ggml_backend_vk_graph_compute(ggml_backend_t backend, ggml_cg uint32_t num_adds = ggml_vk_fuse_multi_add(ctx, cgraph, i); if (num_adds) { ctx->num_additional_fused_ops = num_adds - 1; - } else if (ggml_vk_can_fuse(cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_RMS_NORM, GGML_OP_MUL })) { + ctx->num_additional_fused_ops = 1; + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_MUL_MAT, GGML_OP_ADD })) { + ctx->num_additional_fused_ops = 1; + } else if (ggml_vk_can_fuse(ctx, cgraph, i, { GGML_OP_MUL_MAT_ID, GGML_OP_ADD_ID })) { ctx->num_additional_fused_ops = 1; } else if (ggml_can_fuse_subgraph(cgraph, i, { GGML_OP_ROPE, GGML_OP_VIEW, GGML_OP_SET_ROWS }, { i + 2 }) && ggml_check_edges(cgraph, i, rope_view_set_rows_edges) && @@ -13005,7 +13274,9 @@ static void ggml_vk_graph_optimize(ggml_backend_t backend, struct ggml_cgraph * for (int c = first_unused; c < j; ++c) { if (!used[c] && is_src_of(graph->nodes[j], graph->nodes[c]) && - !(j == c+1 && c == current_set.back() && graph->nodes[c]->op == GGML_OP_RMS_NORM && graph->nodes[j]->op == GGML_OP_MUL)) { + !(j == c+1 && c == current_set.back() && graph->nodes[c]->op == GGML_OP_RMS_NORM && graph->nodes[j]->op == GGML_OP_MUL) && + !(j == c+1 && c == current_set.back() && graph->nodes[c]->op == GGML_OP_MUL_MAT && graph->nodes[j]->op == GGML_OP_ADD) && + !(j == c+1 && c == current_set.back() && graph->nodes[c]->op == GGML_OP_MUL_MAT_ID && graph->nodes[j]->op == GGML_OP_ADD_ID)) { ok = false; break; } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl index 450dee04087..bbb4d1206b7 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_base.glsl @@ -28,8 +28,11 @@ layout (binding = 1) readonly buffer BV4 {B_TYPE_VEC4 data_b_v4[];}; #endif layout (binding = 2) writeonly buffer D {D_TYPE data_d[];}; + +layout (binding = 3) readonly buffer Bias {D_TYPE data_bias[];}; + #ifdef MUL_MAT_ID -layout (binding = 3) readonly buffer IDS {int data_ids[];}; +layout (binding = 4) readonly buffer IDS {int data_ids[];}; #endif #include "dequant_funcs.glsl" @@ -45,6 +48,8 @@ layout (push_constant) uniform parameter uint batch_stride_b; uint batch_stride_d; + uint enable_bias; + #ifdef MUL_MAT_ID uint nei0; uint ne11; @@ -56,6 +61,10 @@ layout (push_constant) uniform parameter #endif } p; +#ifdef MUL_MAT_ID +uint expert_id; +#endif + void get_offsets(out uint a_offset, out uint b_offset, out uint d_offset) { #ifdef MUL_MAT_ID const uint expert_idx = gl_GlobalInvocationID.y; @@ -75,7 +84,7 @@ void get_offsets(out uint a_offset, out uint b_offset, out uint d_offset) { batch_idx_a = i03 * p.ne02 + i02; } #else - const uint expert_id = data_ids[expert_idx]; + expert_id = data_ids[expert_idx]; #endif a_offset = @@ -113,6 +122,13 @@ void reduce_result(inout FLOAT_TYPE temp[NUM_COLS][NUM_ROWS], const in uint32_t if (tid == 0) { [[unroll]] for (uint j = 0; j < NUM_COLS; ++j) { [[unroll]] for (uint n = 0; n < num_rows; ++n) { + if (p.enable_bias != 0) { +#ifdef MUL_MAT_ID + temp[j][n] += FLOAT_TYPE(data_bias[expert_id*p.stride_d + first_row + n]); +#else + temp[j][n] += FLOAT_TYPE(data_bias[j*p.batch_stride_d + d_offset + first_row + n]); +#endif + } data_d[j*p.batch_stride_d + d_offset + first_row + n] = D_TYPE(temp[j][n]); } } @@ -148,6 +164,13 @@ void reduce_result(FLOAT_TYPE temp[NUM_COLS][NUM_ROWS], const in uint32_t d_offs [[unroll]] for (uint s = 0; s < gl_NumSubgroups; ++s) { temp[j][n] += tmpsh[j][n][s]; } + if (p.enable_bias != 0) { +#ifdef MUL_MAT_ID + temp[j][n] += FLOAT_TYPE(data_bias[expert_id*p.stride_d + first_row + n]); +#else + temp[j][n] += FLOAT_TYPE(data_bias[j*p.batch_stride_d + d_offset + first_row + n]); +#endif + } data_d[j*p.batch_stride_d + d_offset + first_row + n] = D_TYPE(temp[j][n]); } } @@ -173,6 +196,13 @@ void reduce_result(FLOAT_TYPE temp[NUM_COLS][NUM_ROWS], const in uint32_t d_offs if (tid == 0) { [[unroll]] for (uint j = 0; j < NUM_COLS; ++j) { [[unroll]] for (uint n = 0; n < num_rows; ++n) { + if (p.enable_bias != 0) { +#ifdef MUL_MAT_ID + tmpsh[j][n][0] += FLOAT_TYPE(data_bias[expert_id*p.stride_d + first_row + n]); +#else + tmpsh[j][n][0] += FLOAT_TYPE(data_bias[j*p.batch_stride_d + d_offset + first_row + n]); +#endif + } data_d[j*p.batch_stride_d + d_offset + first_row + n] = D_TYPE(tmpsh[j][n][0]); } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_nc.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_nc.comp index 638878d94ce..3f4584c984c 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_nc.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_nc.comp @@ -15,6 +15,8 @@ layout (binding = 2) writeonly buffer D {D_TYPE dst[];}; layout (binding = 0) readonly buffer AV4 {A_TYPE_VEC4 data_a_v4[];}; layout (binding = 1) readonly buffer BV4 {B_TYPE_VEC4 data_b_v4[];}; +layout (binding = 3) readonly buffer Bias {D_TYPE data_bias[];}; + layout (push_constant) uniform parameter { uint ncols_x; @@ -29,6 +31,7 @@ layout (push_constant) uniform parameter uint nb03; uint nb13; uint nb23; + uint enable_bias; } p; shared FLOAT_TYPE tmp[BLOCK_SIZE]; @@ -117,6 +120,9 @@ void main() { } if (tid == 0) { + if (p.enable_bias != 0) { + tmp[0] += FLOAT_TYPE(data_bias[idst]); + } dst[idst] = tmp[0]; } } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_p021.comp b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_p021.comp index 7aa070eebdf..d51424d4175 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_p021.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/mul_mat_vec_p021.comp @@ -17,6 +17,8 @@ layout (binding = 2) writeonly buffer D {D_TYPE dst[];}; layout (binding = 0) readonly buffer AV4 {A_TYPE_VEC4 data_a_v4[];}; layout (binding = 1) readonly buffer BV4 {B_TYPE_VEC4 data_b_v4[];}; +layout (binding = 3) readonly buffer Bias {D_TYPE data_bias[];}; + layout(constant_id = 0) const int BLOCK_SIZE = 32; // gqa_ratio is in the range [1,8] layout(constant_id = 1) const uint gqa_ratio = 1; @@ -29,6 +31,7 @@ layout (push_constant) uniform parameter uint nchannels_y; uint b_offset; uint d_offset; + uint enable_bias; } p; #if !USE_SUBGROUP_ADD @@ -148,6 +151,9 @@ void main() { [[unroll]] for (uint c = 0; c < gqa_ratio; ++c) { // dst is not transposed and not permuted const uint idst = (channel + c)*nrows_dst + row_dst; + if (p.enable_bias != 0) { + temp[c] += FLOAT_TYPE(data_bias[idst]); + } dst[idst] = temp[c]; } } From 5d8bb900bc7daa84bfa7bb1d25ab7e32394919f3 Mon Sep 17 00:00:00 2001 From: Jeff Bolz Date: Sat, 1 Nov 2025 00:52:14 -0500 Subject: [PATCH 044/185] vulkan: Fix multi_add invalid descriptor usage (#16899) --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 2 - .../ggml-vulkan/vulkan-shaders/multi_add.comp | 104 ++++++++++++++++-- 2 files changed, 94 insertions(+), 12 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 6a46d0889bd..8d1a85c9693 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -4274,8 +4274,6 @@ static vk_device ggml_vk_get_device(size_t idx) { device->multi_add = vk12_props.shaderRoundingModeRTEFloat16 && device->properties.limits.maxPushConstantsSize >= sizeof(vk_op_multi_add_push_constants) && - vk12_features.runtimeDescriptorArray && - device->vendor_id != VK_VENDOR_ID_INTEL && getenv("GGML_VK_DISABLE_MULTI_ADD") == nullptr; device->shader_int64 = device_features2.features.shaderInt64; diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp b/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp index 1e8f694a724..10cf5202a4a 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/multi_add.comp @@ -23,16 +23,100 @@ layout (push_constant) uniform parameter2 uint rms_partials; } p; -// Workaround for MoltenVK Bug, see https://github.com/ggml-org/llama.cpp/issues/15498 -// layout (binding = 0) readonly buffer A {A_TYPE data_a[];} a[]; -// layout (binding = 0) writeonly buffer D {D_TYPE data_d[];} d[]; -layout (binding = 0) buffer A {A_TYPE data_a[];} a[]; -layout (binding = 0) buffer D {D_TYPE data_d[];} d[]; - -layout (binding = 0, std430) buffer PartialBuf {float partial_sums[];} partials[]; +// No readonly/writeonly decorations. Workaround for MoltenVK Bug, see https://github.com/ggml-org/llama.cpp/issues/15498 +layout (binding = 0) buffer A0 {A_TYPE data_a[];} a0; +layout (binding = 1) buffer A1 {A_TYPE data_a[];} a1; +layout (binding = 2) buffer A2 {A_TYPE data_a[];} a2; +layout (binding = 3) buffer A3 {A_TYPE data_a[];} a3; +layout (binding = 4) buffer A4 {A_TYPE data_a[];} a4; +layout (binding = 5) buffer A5 {A_TYPE data_a[];} a5; +layout (binding = 6) buffer A6 {A_TYPE data_a[];} a6; +layout (binding = 7) buffer A7 {A_TYPE data_a[];} a7; +layout (binding = 8) buffer A8 {A_TYPE data_a[];} a8; +layout (binding = 9) buffer A9 {A_TYPE data_a[];} a9; +layout (binding = 10) buffer A10 {A_TYPE data_a[];} a10; +layout (binding = 11) buffer A11 {A_TYPE data_a[];} a11; +layout (binding = 0) buffer D0 {D_TYPE data_d[];} d0; +layout (binding = 1) buffer D1 {D_TYPE data_d[];} d1; +layout (binding = 2) buffer D2 {D_TYPE data_d[];} d2; +layout (binding = 3) buffer D3 {D_TYPE data_d[];} d3; +layout (binding = 4) buffer D4 {D_TYPE data_d[];} d4; +layout (binding = 5) buffer D5 {D_TYPE data_d[];} d5; +layout (binding = 6) buffer D6 {D_TYPE data_d[];} d6; +layout (binding = 7) buffer D7 {D_TYPE data_d[];} d7; +layout (binding = 8) buffer D8 {D_TYPE data_d[];} d8; +layout (binding = 9) buffer D9 {D_TYPE data_d[];} d9; +layout (binding = 10) buffer D10 {D_TYPE data_d[];} d10; +layout (binding = 11) buffer D11 {D_TYPE data_d[];} d11; +layout (binding = 0, std430) buffer PartialBuf0 {float partial_sums[];} partials0; +layout (binding = 1, std430) buffer PartialBuf1 {float partial_sums[];} partials1; +layout (binding = 2, std430) buffer PartialBuf2 {float partial_sums[];} partials2; +layout (binding = 3, std430) buffer PartialBuf3 {float partial_sums[];} partials3; +layout (binding = 4, std430) buffer PartialBuf4 {float partial_sums[];} partials4; +layout (binding = 5, std430) buffer PartialBuf5 {float partial_sums[];} partials5; +layout (binding = 6, std430) buffer PartialBuf6 {float partial_sums[];} partials6; +layout (binding = 7, std430) buffer PartialBuf7 {float partial_sums[];} partials7; +layout (binding = 8, std430) buffer PartialBuf8 {float partial_sums[];} partials8; +layout (binding = 9, std430) buffer PartialBuf9 {float partial_sums[];} partials9; +layout (binding = 10, std430) buffer PartialBuf10 {float partial_sums[];} partials10; +layout (binding = 11, std430) buffer PartialBuf11 {float partial_sums[];} partials11; layout(constant_id = 0) const uint num_srcs = 2; +FLOAT_TYPE load_a(uint b, uint i) { + switch (b) { + case 0: return FLOAT_TYPE(a0.data_a[i]); + case 1: return FLOAT_TYPE(a1.data_a[i]); + case 2: return FLOAT_TYPE(a2.data_a[i]); + case 3: return FLOAT_TYPE(a3.data_a[i]); + case 4: return FLOAT_TYPE(a4.data_a[i]); + case 5: return FLOAT_TYPE(a5.data_a[i]); + case 6: return FLOAT_TYPE(a6.data_a[i]); + case 7: return FLOAT_TYPE(a7.data_a[i]); + case 8: return FLOAT_TYPE(a8.data_a[i]); + case 9: return FLOAT_TYPE(a9.data_a[i]); + case 10: return FLOAT_TYPE(a10.data_a[i]); + case 11: return FLOAT_TYPE(a11.data_a[i]); + default: return FLOAT_TYPE(0); + } +} + +void store_d(uint b, uint i, FLOAT_TYPE v) { + switch (b) { + case 0: d0.data_d[i] = D_TYPE(v); break; + case 1: d1.data_d[i] = D_TYPE(v); break; + case 2: d2.data_d[i] = D_TYPE(v); break; + case 3: d3.data_d[i] = D_TYPE(v); break; + case 4: d4.data_d[i] = D_TYPE(v); break; + case 5: d5.data_d[i] = D_TYPE(v); break; + case 6: d6.data_d[i] = D_TYPE(v); break; + case 7: d7.data_d[i] = D_TYPE(v); break; + case 8: d8.data_d[i] = D_TYPE(v); break; + case 9: d9.data_d[i] = D_TYPE(v); break; + case 10: d10.data_d[i] = D_TYPE(v); break; + case 11: d11.data_d[i] = D_TYPE(v); break; + default: break; + } +} + +void store_partial(uint b, uint i, float v) { + switch (b) { + case 0: partials0.partial_sums[i] = v; break; + case 1: partials1.partial_sums[i] = v; break; + case 2: partials2.partial_sums[i] = v; break; + case 3: partials3.partial_sums[i] = v; break; + case 4: partials4.partial_sums[i] = v; break; + case 5: partials5.partial_sums[i] = v; break; + case 6: partials6.partial_sums[i] = v; break; + case 7: partials7.partial_sums[i] = v; break; + case 8: partials8.partial_sums[i] = v; break; + case 9: partials9.partial_sums[i] = v; break; + case 10: partials10.partial_sums[i] = v; break; + case 11: partials11.partial_sums[i] = v; break; + default: break; + } +} + uint src_idx(uint s, uint i00, uint i01, uint i02, uint i03) { return i03*p.nb[s][3] + i02*p.nb[s][2] + i01*p.nb[s][1] + i00*p.nb[s][0]; } @@ -78,10 +162,10 @@ void main() { FLOAT_TYPE sum = FLOAT_TYPE(0); [[unroll]] for (uint s = 0; s < num_srcs; ++s) { - sum += FLOAT_TYPE(a[s].data_a[src_idx(s, i00, i01, i02, i03)]); + sum += load_a(s, src_idx(s, i00, i01, i02, i03)); } sum_sq += sum*sum; - d[num_srcs].data_d[dst_idx(i00, i01, i02, i03)] = D_TYPE(sum); + store_d(num_srcs, dst_idx(i00, i01, i02, i03), sum); idx += num_threads; } @@ -104,7 +188,7 @@ void main() { } if (gl_SubgroupID == 0 && gl_SubgroupInvocationID == 0) { - partials[num_srcs + 1].partial_sums[orig_idx / (num_iter * num_threads)] = sum_sq; + store_partial(num_srcs + 1, orig_idx / (num_iter * num_threads), sum_sq); } } #endif From 74fef4129fa58f6277c243777a4894371479dbad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Sat, 1 Nov 2025 08:55:25 +0100 Subject: [PATCH 045/185] codeowners : update after refactor (#16905) --- CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/CODEOWNERS b/CODEOWNERS index bacc86cbbd6..908d13a35b9 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -89,6 +89,7 @@ /src/llama-model-loader.* @slaren /src/llama-model.* @CISC /src/llama-vocab.* @CISC +/src/models/ @CISC /tests/ @ggerganov /tests/test-backend-ops.cpp @slaren /tests/test-thread-safety.cpp @slaren From 961660b8c395afb8903f61ace69396a158ea0cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Sat, 1 Nov 2025 11:01:42 +0100 Subject: [PATCH 046/185] common : allow --system-prompt-file for diffusion-cli (#16903) --- common/arg.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/arg.cpp b/common/arg.cpp index e8941cda41c..d8f9bbd2430 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -2030,7 +2030,7 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.system_prompt.pop_back(); } } - ).set_examples({LLAMA_EXAMPLE_MAIN})); + ).set_examples({LLAMA_EXAMPLE_MAIN, LLAMA_EXAMPLE_DIFFUSION})); add_opt(common_arg( {"--in-file"}, "FNAME", "an input file (repeat to specify multiple files)", From 1ae74882f8f6755e44dff8f23f3abdc5b53ab7c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jarom=C3=ADr=20Hrad=C3=ADlek?= Date: Sat, 1 Nov 2025 15:02:57 +0100 Subject: [PATCH 047/185] webui: recognize AsciiDoc files as valid text files (#16850) * webui: recognize AsciiDoc files as valid text files * webui: add an updated static webui build * webui: add the updated dependency list * webui: re-add an updated static webui build This also reverts commit 742dbb837939c176a813868c268d28ebd3fafb7c. --- tools/server/public/index.html.gz | Bin 859993 -> 860046 bytes .../src/lib/constants/supported-file-types.ts | 4 ++++ tools/server/webui/src/lib/enums/files.ts | 3 +++ 3 files changed, 7 insertions(+) diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 026b53b28632fb82031333a4ef411444cdabddb2..29579e08c251298048f842eafac774166f23d516 100644 GIT binary patch delta 794871 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�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�}~I3UqHzAHmANkrJxzcKram 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 z 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

#Rdxh{iBUtcmb3Q^_ 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 r``ZuG}c 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

!}-e%0>wFA4dj(y8o$zgh^-Ty-di zN~_x(e?qHNn7#ERq}eUA1QnD<)6cKU+?!A(RgSo27^LUeE6=Z`uMMdIQFk`jF$k_N z^@)V`(&X%n5c$`(jUS?Xa4&tV?aL(QbxCd}5mLTv2EPZz*-Iu*aDfV=e<(J$%Xlo5?igrqVTE;<>5hKoAQcge z2ndNHAlUUA-SKV$P@{GcuWEFO)KNJlxZ!Wr;KS`Bs2(WetTsAN-(;z!SpDzN7|1=_ zgp3VrvcMjKUO%`dXlCKj_`5!RO4XJbc~l3jN}rmWq3UBsDrO4vD94g{?}hJRGc1ZO zf1pg;_o3IsLKwtCgLuxUx?aQFi3g1%Xu_DrJz!v3p8e_SuV zK`-#~vR?n9x9kj{w%%kn&0^>jrQ;ETOv9^dLTkPwT~Ul1R>6*_ zxT`O~y)l$+ah(Vome*0|$adwbJcOby_b3cvz)cOQK@>DqOjt*)k8r*r&XIAicg2GB z9HFS-;(dkB*6v>I-h*fK@Sm5xe@mH;C_aX2A)z9ML2^PiDkwv!CPkP7fX1MSbSv3R zZOce#JalSG))VfE1mx-W-_Zj{ZVkQblK9Dk1*ax+XeW6K`L*F;7%jkf8r}NKE3^x% z5m*p)KT0+UNBpkWyZDKI{9=P;34o#R;M+{a3wAbfF6laRT?2-2)(B`Ve{<|o6I>!$ zpwyEybXZByG^Q{KQ>GL~z1iC-af$1B;u3M{LbK^f^uuT(-ux!Q`;R4R9YDyqAajq{ zG`0E&Mv|)^TOG09v7O;;6%HU+<6E8}?zMU4%!CwyJxftS|Hj&r{?YpJa%(J6D33Pe zCt3=aL0w|bl6i44xbh9be<}+*Uipm>ReZ?3D;jKzELL>XGqw3XBSFQQIrtSR(xISC zx0p>u)j3TWqj$Z?q$BrZyAJ%$)R!o}pEC@JjRgU?v|~|4Ef8mqsMKrUD~v`rs&cWF z9c}pF(di6oh;3}u;Gz`m3%z9kI{Xp7JUF_KrvL?U%NQH!KJ{sU zVNAi~2I7`lyCpL3vdGaZt58gf2#af?C{{&od<4bNnE#+5e-PZ>Bia;I*Ht>5UdV+@ zDj*=L3{%f}^EriM7P#|h2*AdBl|+e7Db^IK|CVVAUz=jie~>8R`jh0|X>#vza_=I! z_dK}={a$qM$K>8y?RJp+U(`9Kmycy94`q|@+*?BR7of9GIAs0 zY5K!g2o!a7I7&6PiZqG5NF%n{t7mdeG2+w}^?%7dz;y@Ca*)Gn3pMd2ywiD4ksB}-f^ z<@|QDf0ay8K_wp0SoQ(D8eD!B<{@arLwut-zJB~^93<@%KMnIf6vk_N52Hb%o3if4 zP!q%@qF8g1ZWiu43?sMitl?K^IYEQ?2y;;Yp<-MMw_7>OYG_N=sI#}lHh|i)pv9K9QEoYJEKbfAkP4JJ!h2Z16lxX-5y z5@e_XloPnMquM`V`omE&Fj-qvk9L84W^FQLG-;8+lE16?`|2C|5Xbc>YwE&a=S z<5Sf0*qstU!1Z+uH&tBmQL3CLFf>;J{d=yYpwcg?Q*5U>M>{~Irnq6^iac%@ynDb6 ze?vGJEdnu26kFSv1>%KGoMf9ZQWnvJr_c@F*d*5eLOr9ja~b@|pqJ^!S9{%Zw=j*p z;R6m7l$Zl!%O#NEiE1;udzXq;eRkfcL2YPHBin8CJ}7%n6GyfeH44bCOipv`r-hAq+f52HGssc?At33TM{RUnIj4pBE3;(8Kca7+2 zefDkg>|3oCH0s&8FBF9cCO!`WEz$h0pnnUelZ6$`(880EJ6UtOm)6@9U|I?v#r&29 z=}0}BQhhyC984d00tJYi0R@jOXzL;kUue+3)W(5me#B&}lca`rP7FImS1`kBfA}V4 zUfImYHc2t`HIx!#cQN>F=;>4aD4r>Be+bkhLM)+@5IvFU&^%ybBqn07CAI9;@Bx!o z!^1G>DFvl1SWi5}lOu*vN`c})oln+B&?Na8PNz^3*q*46$3qCB?37B#5H;gVF>a-T zNBbT|oQtNAn=v@uxN#0`oE>Hqf6*O=g9V6#Zq!4b5h9*{J?ZrO-;aMheAe82{1hW~ zJQ=f#88%%8$_;Di`B5hGHoQ4@V*IFLu@>EUaw~SO1xc9bn9H|hsqkKZAL|UC5gA+R z#MfhE8fb2WREzYoj~RXC>&+Rj437meoOd%q0GnKqtZ1|VzCl6d^6%k@e_TH!3Cm6Y z;StnRrILL3j8BzHW_TVDO$JgB^rNL9Q-T0Q+NNP5#KfBsWG>bJ1fv|b2@@9=P7QKhwK;C8@|QdN+QlEfrxlmtcJ zPFXm9w;?S{x*xu&Hd#`I!)`NJ8N$x=e-npOiL;lg_#9~EN3!Z6fn_-^5-ld)0yOND zt=0SYy$vYtWi+5r=qdX=pH@Qx+2gY0M+E_UREW=nEcNp&n^$NXe;hO70j5w*;IuO1 zZo_fE?~VJZUEl1M?4K`geUwxz{u&lh_li(9$U@_x^ej8?jZb@_Ee%X2g(hpXCEk>- zcDPBM!6vH@fq7(Q*uAj_aANAL34C(C$v)v^FWxJh>2XU~HSy(F4a#N7tAI^|DGa3a zJ=BW^8~|$4RX|Wse^#K8@%!Q6s-!~ODrg{ff;DMLVh=GB5w4@FS{ivnYmm$nSN4ARzjG9bS0Qj4aO)x^q zuxn?LoE>b6zlNwHc8^>1TnjC zvH)Fy({#pzfBHCHVp9d2oxzQoHw*94Lh((Jb(DH_eaq{GH^DRZ7SNPrItRi@w?n)K zD}%N9g)E<0ebbVn7yxxQxDv1hMYxh*9NajPUBL0Dvd^l97EpO1_!1mgh=f4xH35T#y>aOHda7{_`E#vs+J z!P7fICn&Rf86mA4IPC67t4qvu9%*%nH@HF~trBQKu4^`$B2|OzHDZo=nI+XPC5jIy zcy2>&;bnQ8Oc`&ZtVp;{fn87<_`&1>ThZVRuyx0EFw!hIFaB&wA+MwhL7D{VLhoNw z7u6_qf6K-5lK@_)w2($dDA1_FQ{PlRl@dT^ka31{CO41bQv+|>eGPb7SNqRHRSav& zZluUg;mi8sq7I+*B&35XPDVdoU|raAsl&g55FlY9w*+urB1=ok5c8hCQ5-@65>K3|)e{=)bkHLH}@EsFVmO=92!9!W0{&A>U zxE_`g<@Tu$cYNcrR50T+VL=+anNfYDhr`J5#{kaoNs+9jvKSyGO8k{r1H+g|A=I0i zQFmSSH ze_R4>hGB@{gL!$>NoNex5d9uHaG~J!N}A_Kil3}%J>`!lI5Km-0wryulHJyzdzRF& zSgY9GxJ!!&J&sJ>3m13H1< zzkgzh(Bv*REVVc>b`vUOt%E2NR3s*YzZa!~_ARJegKwLc^o4UtPFo)@fGRCTzqu4Y zfHgbqgA&1$EWeiaao|9fD%XV~FGabI6pX+n`4r`IQo7sDE)a?(SSb7wuyX~$e<=Vh zwlN`~1q}^G3mxTA+Ht}_;k&1Wpv`BRNZV8&KKykLpS)D(ADv(Pnqe~OMz2>d9JSf%AMrOa^_aRS;nDRYG-G_Q0>>-YN z0BPokayS7zfi5WLD$WJdi$sv|lFkqO=eR{UR>>khkj!wDqv=B8oT&6>f93GQ!s8bQ z3;%>PH@NxB!qXQAZ*GbQ3X^5IbSBj2wp1spe80kioxCox*5s9G|wQ*f50JzRSRKBk}gZqHo6G&AGY)Cl>Bvher&C zv$`ce01`ons}rPQJIT7vbE8aTjK=plT;N-^6(6h>Dv`qz{DX+9e>$nBh_`i~y*17t zuLux=D{d*0#|1RtmabVkwb{~>BYJ?Ls+Y!lG8DNJ-5ARcevvmmIr{0tgm)}3W%VE{PP`kwEwc)C7+k+j7`XiMVQ9mP!m$WD&F;G6r%0Zr%14Wx6Dkus3{-FeOY_BnVJ(Sf77g z0=Taa!fk~=#lxp@!^1m;yNs&dzWne;oamZ3x5{TC>Hn9E-PX zjTmfJT0zFnemnH_Emg(NIodmtE$p%iVo`!8kTu1o7EhK}v+nXb;@7<;%H%f6(up$& zR&NIjPG3uzgn43lN8#(w+gEZIA~cTJh0X|xfI8E`6;G+V3`%5@51g6;fEIe z(O)ipsPFe5f1InImqavtaGuFU`|Sib9{`A>U-xy0a40`c;9dkf$I0>qkmdCZX(``D z`<`w=5;Bmkv{lDZ5Fy zQk+32e$03 zDGx!3&cG8Kj=mXOU7SfWw7~TUcLH8#rP*7f<5IepI2)4a$O3k`u`nF;Eoc3xwFoUr zbG7~e-od(sgh5{Htw5ekV#-T7Gl(6&A3f=xfA$eZ2Yrh+TeH!4&_fp+5*I}B#Cm*} zQz<3W!O+&=H;WDH7Uo{=t$-g{fqD%7(9JlpF3sO%tRgh!N#r?UM7%5u)Ki`j@nzn+!wAAk!hw<=%dBa~)o}bdS?2p^)>yRNYM;DlO?^xpLRK?2iaXcc{y{P?H ztUt0dc#S+aXjPkS&4d%TS#X$iF-*{AVj*#;VvV*8!r(Y}riO@(o30|hc;M2(OIQyJ z*c>QW12$)v!Qxng%<-O;@tjure;>y=9?PKKE>(-wlM%fTI zP-`pC`?x*k88BIZ?I-1K;VW7ZBP6zHDgvm)!fxcwOyGQBAunl}YANv$iNJD%xvBTn zJTR!gRG^^Rbie(ofq%dBaU9C)liE1YXCTax{IHjD-vwe=Gm^`q?72x7SQSUH@fq zf0rV<_}W~PK(?oKls$zs^z+Y)M?e1`q|RMD`Un3m)%Eh{pX+;nSTTznR55zoJk*Ex zy#`WCedFQA5Q_jtb@v3h{;1GDz;X?&^C@kYHdFFIdEZOA$fbqhVr_+tOF-CZh5Pp{ z6$JcSTp96qfBuDO1z#*A8Emh@>=&XtzUkKJCdXoWr7MpN)PS|vL8j^+qYko4z=;qG_C zIx?m0?>oDaE@Sjyip6H*5nM2MeQzb#ur4d#etZ4mf5r7=a(%XAu^vzBC*~5DXX2P|`mLTy z!bBQRe;2%?PE;g%Q`8YaQA3#?wh6~cBszeu>HvDPbPtm<-NR@J-e;;SxQG=1Ra%$Q ziG~`7AI`920ujd<(SaSe>q61{>vS;vp)36{CIFd2Km$t_*cSFr;(-LFEp{nE#L z;9W04bZ(6brb;vgWLDPlL1;=tHp!vnz{F7^(Rf)~I+s!uPL9nYHealQUn7mv%Hq+( z2TS|^_`}DW#rpNp&p#jkjQ@cxS^W9u$x?mgG=nGZ4dk))2xw*Af*$h*8CdyqvP9dP zLe@@Uuw8uf4=H|ty>nx~-XNDCi3~vxf8MtsdGWzV9zH7NW!4LqaES~;R(I)JJtWV1 z9e{=-MPA4@0gYbyUB?&~#ia>Ix7lNp@=+@Au~~p^TK5R`G@YV;RfJ|4=>X}oklZ5~ zvs-boXgRTZFT{yQQEh1F!&zvZsC>hW@dWzr(_gNc6vcVb8gAlVfA{uK1LN9W_5| zVJFpeVWa>5Hfx&=nnhYDc3dS2pl_hjwgZit@sjbY2_MHcU>NI%+YdaPK@PtNKV6e! zM>N5N9b1DBw>CB&3|*@aw;H&*0hqeBR`dFS8X&rz;)6TQ(gz3jf8ga10u{tEdQHEX zHA+O&M6^|B6wE(8{e?QJFa!&J^a^J#uuw zo2%rsyl;hzJ5{Kv?iRURrIDtx@Bove6$GWo91;Rhe0oBWd2)l4M@mWFFS%!mY0Ih% zu#tmuA(>okz7-l+ako@%*scAYpUa(n`98}zX((NX`E$z3f4T*umv?f7I+7rOD_2SG zvH)hXeS4yhU<*EovXO1~FmlanXn6%4guwMK_Pu*u48p>yGKT`jldw6U6G7GESSrzr zN>yVCc0RU+NBmQP?L_+Kpf1ic840&nu{#o{`j7@@ADNZoi+%;ZtYE(pi!|I?YT9D0LL>bVHRJ;N zqZ)z|lpb(iJ}6gDvkkd+uZo+AcB@mj&2LkJsYp)vc}+`*JM23xaS>-3f9_=Dsj?LP zPc#0AOf^+BN`4<>Rd^1|qy>!z;e+2|&8iqsfBVn&#mN(}vv1oH9yF*#gnh6_nRg_*bUur*QN}!L2|RG;@;t~%1pAZ_fh9TgQ*SpU zf7?sF-MnOFVM$c`G^VQ?R1f)dm&KmaSuXMaEkE7+h-w~dw}`jfg-1l}8$9o$$nSwi zB}ZOv?qkXy@l1X)%Y2w^K60Lo$!9Bu_vM#Fx(odKl{}!w zZpp6|1xgB~#}!1C6XDYsmP|s$NZc|_e-3-MP)nb1zD7CE@bqiLQJfCfId}6C`>p3& z0$SiT(3FmCN$Q??9w)%2i-%-!HORa7Yx0LjB2uNp62xEFG&5(V^t)hrE0Z|;=)1!K z_t{P~D9WBQXI<$Uu~8{Z1Ia;kp8au?{{WwGJW9U2sNB}kf9J7@m`7z%seIs^e~7-A z0Axw8O5-1@1tBGz1kD2}e*^~+Pu77dgaOh4x}!MADZwTt&;V>elfUK6^VmYdlt6fM z#30`hy1$|D3jp|4qbe>Di@f!OfF?Clwr(uvYXRZ}9N{QM11b#qJ zE{{S?ry(w6wvuQbiM^!?Fq?$v2-WvZ1%H;;kELH@$ghEnkVB1XXXCc13!E&>{awe~VOn)i} zNXHj|-%1XzM5&)%w!rlR-s=6!`7{65~nDSz`?zJ;-h zNSm+r&vzSp)`0>hsVTxl$N^aTz#BBp6o&3BXd{4gqm&+=yXHAZgqI;q5*QE-xr zYD$T#p3elP4Ocg$4yCp{06u>A8FF1zC^0KP>|yn~P`UpvKBJV2*njOaI7y z0IM=ViIE7vCCla{vF4bTiUlPZuz!<`Z)W{T^WhP)FaCni+F1oAV$8l#&tEIjT$AGGH%~4?d+J}9 zi!k)0B=2B6F`t}wFho^#DF6b4W#fD1(_$pa1p=^1(P@sC_h~Jo?8A3XYw14XUDI0H zY<*&WLANqAfL_c5(M=v^7B#lv3fzi?;YpJtC7IJlgKpU5$bT3pN{l`ZeJ*y!fkvo| z7KoWgzCbPMLU@j*Pd`9!!zj(7h7P%7rAbamv8q>EhuW4itE{$+gQ54`y?B#J3>pLA zSdy=hk6}`kDJ`Ez%BG_v^uaU4()xV7%=}zSfAZ86P%$4Dhbbs!Zi)vYGN$EoR<%{p z&U{eSr26~W8Gm}b$}f^!3*NUOR$j_N*}4nCS~NzC2$;~!_~0^fNS1#rVpQGd!m`X) zdg{jPYwL*%Tw)=i9(^CNWn{jjJFgi`@BoKs^6jd_z{x|&T;390u8){a=H@r=Ghii} z4g1Jp-ZY?&%o`Y=IRx{R3^Air%o`S5*^-*K#rE_uO@E!T0-qVY5Y2;cq1Q!c;S2>7 z9v5CNDkEvYv;KH8bzY&*hbJS4`858^*fFO_OrrU*KVFv30e^tp>t*HY*$$*Fakj+Rx+<2-RZqHF z2F5tw6DWx)x7(udTgx>}>ar&y0%mdJkLmSwyig`4%t{s<`*<>-a2HVU|}2{HNz3n4?}SNG`A z(tjDL!W($yauwJ>!&+5<3|Of-16}Y_fB5xq(vN@zNryq7>`Q5HqFllAsI?g`B80ND zHp7(PK;N4kNi^l`>KG7cjcojO`2woatL5{(GX{^pM=SE;(fjNJEDIm9_ujJb8lfO! zUu}dO?Jz2VG;;ve^okw83%@0X2I@y&2Y<8vX(3j!=wn>C-z_`&r0ICo@hkt=n zu;>;VyWb&WxPtDF_nyL*!{DI@t7iyHaI@u~SdpT+-|_3ipB{zY1E*Mcu==9_>aO1pqYTo?3N>2uV86s_`k)7Sqh z8PPL@==&~Y%x3tN#zN=(4a=X#<$tEE&qPz6%Xc`|0N$u@cTG;a}&0U-zwoOztMc=-riVP{=>&#N?!{giN5p3 zDns86$`P`b|JeF9R<~z=OX%9)N*qR{tkPj5xm$1;vG&wq1c#DcM@|_qB7a$7!HY!J zoh}_uM*dm!)%dZ#_fK`p_?r_={~2jQd%s7xoCTmNlj~l54kbEhlIp)i^A+Q>zQYI8 zqhAjH&;mnH98ezU!&Cs!mZY-x!ThBir$)tGb5}I4?KRv!-jmM)fvE>!nV&Y5N(SD)!rn z#Nn9;q4jKB6fx9DZb%Yv8Xo-Fo*{x#~WSI;^qk_B*Zi(tqM`nIW^841H;Fv^?hT zvzC=Um;lgar4J_2!WWDQju9pBoh3;=jBDEngQd&x`(~jdwe)IP?${Hub)+r)(psJ6 za7VV6J)yr{ExppW*c0-0*DutnozW8cdw1dwqrsJgPW*y<@#*h8ctRPB&QLRe)AQ!L zLi%G4@N@)?fqzeX9BhZ5g99{K%xHr(@K@`X*@|Io6_Ll_`$h_KfiFr%^=vR|PuErz z=y-z6W|oQUbJ8&f^yH(r5U)LrAyIe-k^unrIkCV*EJtd?9!7D6G-5P*AwVAETM{W- z->;oOWBC~W@$YMw{(CO2721)E|4~gM|0GaMNRAPvmVc6CYqc)CCK<`cgbm|^(e<1# zTd=YCvn2d1ufezKHGW{I|1CUfk<98Hq#p=8s+}HHls64u=_f?PS7Jf}jq3whOmc$1 z7&d=t_|e)qf$}x#imkG@cFsjklHKO1Ns-XZVav=Bj+dT)0IU3&%%!7$T`M?^*xiC9cP&D-gf*(D#*9Qu}&kf>3^A>!k5F(qB zc1bz*j|{n{s;%Jj1FU7N^p? zo+*KG&Lx4slv3OtXwC94!yi&y`Ek7DuJHpX@Yxi1QbKX@&|N5Q|5l1SgQVuY$kI9S zD;pYh`4BcK?XSjrP@2b77omfN*5YqOb=xIWmu#F*FH=c(?`ZN&4V!&LSyh#Ym_V8F zUVrvFtW1muHGzo#3S6U3tzH2@t;B znZp)|c;0)+P3@Wzt@3kfu+gV)fmcK#j(;3lL5#m@9vxs`(}z=RryO zf2PyQ4FqI`;TGxZfIJ~H-#ObvdU{91lqBhQ%P`52SNSNk@_w3{7TZ+D#FO2?T*C0&u)15=?AppJcz@ea zG|16fM8uI1y0F|7DN{>H4|<)lxL7?Xg-}jchd`Y-OQ`dvIGIVR2vT62tktiYE>*p3 zx+Jd~kW_ioFe0M+X#2-_@nirIh5+ZKO$Kw5*CcfW)swdEGOfXyv{YL_fQ*|>$_@Fz z<9D7I^z_EfK4oJU_O6rIfTBoTaepAK$Oa^3l{TQ{Zovj*?fIZ#cJ0D~4LtY4Fil)A zr8|rf>7%PCuXrCzJ|q(*TcpGgPIdWqm9SB1@-!jSM@439`BTGJeTNV0uM&KST`P=i@EXaHA$Vh zHl96LJ6j;!%xA_=HcS+1kFhtuOq9Jj;^<*xL?QITUXB)bRb;#pgp7;5$BhCrt%DjV z<^|y?Ym$ECVsNGBG50Pr1Apm5fWVNqO&%)lMcY#f#mPtDJ8{AGY)zjy3DxhIFR8nW zg~iV=QzkA^k@HL5Yep4lsmFg1oS2;6VJgGtE!CV|U*AJ@!O2J8!!(3(iXTNgmQDHc z0zA`3{AP&v(;rNi`@@CsBy;lPL(dMIXsMh zAM`U7i()yb68RaHr-Oe&KKNI{KO@H9fe|O4fd8yOd;TlYm-eo(g@pj8H_N0DrmW00 zZp_X9Xjtd1%nR1rXMbW@G@DUgke~?RqifD!nu*OSW16AO%1aZgrMjM3;zOnIAgz;! zaV$9vS;lW99C_eEP98*Dd&-3T58>KluGldlrEEmRgn*kUa@g1yF*lG~rDQ^wU2Hxk z#Bj03gd`7DG9gH3Rl?Yx<{0}^$AtVy)c%(?ApUw+M&WbY%zx%qJJyblfyP82lZP8y z&4u?urS7VJj8ElovMx0ru7#61oWfdO0z&$ioVo$L)IUZ3wlBE|e)(Uw2tIWII534o zNds~RLg31#8M2D5$(GAfL_S2+siBH)!z^PzNOI-O)#yI`)uq7y6a)ej8CN z%IZ>Y^8Tz3|9{o~S0Esz@Pc&&utyffHbl$e68?VPbp*v?fWVrwdXs$B#n5*DltRK;uLSkl0)=9{)GCunGIbyxcPMXmJnUjo8scWHR z%aB-Vl4=)A1#x$3tKAx;K3V!qN{@J3-EsT9dkc14$fh;qgK|fle=H|QU1MR4o_wr41cPZCnr6;le)0U2%OY2i~vz-4iQ!ZpX9s#6h8cf2DOL#^jLlL=+Wx>z1Hf+ z#x5@J-CM-3`~SrN_?YGnqv%sE7Xxjp23pHx##$zDb=RSiF&Mu#z~J$Vn4!bbV>lQu ze$;?Deb!z1^`Zx#DbO(Z99``qbIHRgR+xFywtqRO$1);%)W)e?0uKybT4Z@+qbN&R zTVqa@rvx)>*PhpQ!X9|l{&eyKBbS_CAh`|QvjAUAv}3_L8sy|j?>8tjUws2`TUzTG z6fKlNYflaipGas?SHm&uKEH}Dmw;WO*S3OhWqFDETSAa|6dArtEGcpYZ0iCT#cKNM zPk)~?lDnsT5?P8ztr7l_<)IlC=6QsRhmVDn6S41J?km`J{1vRI^ef1{8DHTWjGxj) zelo2fnoO_9RDqZu0!blU1SqZ`y(c-^teU#!4Wu$W>?Y^%d$d|7S%DthRof$49thxx zmS?DP`6TFeMylKCklsMKovL%3wt5bAPJgj#i8@ElFJF6ccqdg3<`aCJy(dxSFrHq8 zDyLXpQ02HPIaLlcE_P=QjZ5b?jf-jCXKP#r$w~1aSd`HL0r(fGJ!ED^n#ieHoQ@^3 z>E5noxy6zT|3(;ci+YwyGtTEX)y{a;r<-bFG0K^0oy91w^9iQfPn{Tw9QG_QF@Mhl zBKp6`{**V~oaKx+XP<<9h{;y6g5`F9;-ds6=m@uGOaSs!PS`1>!|HFY6j`zO+8c>R#0)_$%t9IzMvLQ zXdTuys9jO}W&oE&e9LDw<-`72=YOtwXT!LQ{R8Pb#8&(KVy;01_?p)jy^bQgF}2uL zX?T;I=<|O+8%7_zEOYiUatYlqDX;|0dmLXdABr$Z`@$;w?!fus$upxGeW_aCm3$jN z^bsP_>p`?>i9wKbMvY*tGN|TIqQ4KnYBen#48D@aXYI6jAS{4QcHu{oEPn<#LUWAb z(N@-6&6-=;>S}iD&y8#+Yp!Rjjaz=LXHD1#H?!5X+kb9mO@KQ$veo9TKXJI+(D<_O zu3~uaba)7q?*yTv<<0HJ_SWXk+Ge)Aw!O2lxxTTznQb;Un~ja_<_^%LjrH}7)s3|^ zB1^Y6*PGkhI~+0s!frR#SAX$XbA4-Vb*;I!4j6 zd%d~7j!9ZxUu|rzu?W#)8@P+9Lo=I=wasnBR$XtPm1cup{2L9tVs&)~V_RL@+*sRK zTV-!HH@0>*H!xy!Y;$L$(cD~H%{JH9w(!Cx8eZGND7MxbXl$#|+<(AecADARHtIFd ztL4qj#`@Ow+S&%+wXw0bwY|QbA*Sv6I@;J~qs^UdbOx_oZf}+gsiuh{>bAQ9(Zmn+bpo?s417UWzI7IYp2hBG&*BcpLzl!vaTYSOBHU_bZ zwYQ9aH&&ZFTRYj-W@B}yxsB;U?X}JI^=+B>=5}*q8zaZ7w$@P>L)_WHhuy|}vfJC6 zYYj{UM!UMXz0+LBn!;!~bcFiFZwz3KlZMeY8tWL?79ZQ*S%1fqSTOA3Msov87Q@9O ztLP&ZJSGuqV{HSyLGPRBHM-s0*yKdxyJSrayt&cbT<6za-@x;YEl&RbWA9v;+c=Uu z|5a#eher%SnE=5DNI?pZEZr&2vVD@gGZD0Cg9J!oMFKbgl*A)BpZ$LS%&O|@20+QP zvlp=!J24g;)qmCX$jZvf$|o4sYye%RLmT^hO>2P>(D9C;I?;b)@UPSE<>~dM!iRpp z6OUY%tFkgpVPAV2$-`z7G-1LtIwVF%eAPnE8sF>}3E(#NnrlEX9GCg!(eIg;bx%xj ziE{1|W^ZHTvUYkz405q+8{F-VF8R}GG-I3Bozdn#Rewoa%12TVd5!LqC);aW3DfVV zPj@Q68`TQUMy23svu!1p8=dWv`AfFj8@sjo?FTMm6UF8ppJu}!9lG(eG>sQe8oSKq zqE1__TJPxMeMj@UQ)i9$PoC`CQOkYyr~ z>SzOD`IF(@0MKqXHwjC>b;!i-C-@(Bc^-5I8-FAI66b59xr>%u7X4pvr`Lw5Bs zH-DDU81dAdSCWVhrt5F7e;^Da{6ylB-VUxvYmv$ycFGwtXctqChDd8(T=vCz<>^R0 zF+%07DFyK6P)=a65)5Rj?3qzGYR%5*Vlw(U50fH;}Dlz*xi@uvqRe2Mp9T#2Hw$3*tM)&#>m^H5Lj zWm6sXq8<*l^0WDVj#fYS#s~bj3fkD>-+EY7hn4-Y7;iCGU?JhwE7@j+3k?Bly%HJyeLT9UjY1$n-AP19J>uA+V^P3*D6~t9hlj!Z0+RED@{&dks#M%@HhcyW^4Uwmlz9%*Rk$*;#A4rIH zOkv0pdNg@&z4M^sH$LuAO3!-ac&6W~BFXUUKB5QOVjX}HJtj{EhZCX4AM7Jw6Kzil zol~6geYe-M0A!f}#3@1qY1Bmxrn*UDzcT4QSKu-d<)=mxSe_RdonpTq@+4lW5M!f7 z{7c_-wwzj}PvU*qHe9AKV}HzP9L3gq8FPrK#hBq`!LSP)d6|8i?$D+2+$*58bX>*$ z4)(N$$b+86bxxy>Q!9L0Gs^SMPmtH$ag}sb{M{m5u2K(6wwd-))k!m+PZf$6oiLN> z`upfn$AD_HFcI64ibhVBIH1c94^dAY6T6^#SK~aHF@0Q@@V4)Yd4Cc>m5?cgTU6Lp z3$tP&CM0;==ziPur2E<6_^33vDPHZ;XZC9ZT}Vw!MmkaGg#}AXX{DYy&_k}OD6`1L zP}3m~pc3%T)K30Eh6sy1HnUF+BwjV5!C#U3@3zWphKQBN!$$_#*}4l-oy*ZDe$4K> z#N3V8sTylgI{i(xRDZyq`_I|wqYB5>iYib=OU3fW9X_1LdD;>4p1Ms=<3B#z5E{8Tinz3_V4MjXvxb2JAdC2iBEI#;j`bWZNQqu z=Md#FWK{HddyVwtaQ3v-rj*PZ_gliD zn|bDM{3c;9VkQ!QVRsEH-*)|GF>_aJLi@T>q|u2!HSa8QGDDl5ei{hRJ@Kt*!m~_U;z4m^}n!m?~s7_S@}N3$X^GxGf|% z4MY{C3fo()HUhF1;u54uNMl;t?RL3F8&L<6AjC&aNhOd8aktHDAcbo0?=h4*BSC70 zsHs^V#m*LTFJwsDb%aaX``d`-%EM^3b`WPF#M!Sm+ke|kq=6`{Tw{N4OTs3Eirc%p z2;~q5Zj}eR+eA#(K=M~_BH-FblGbjOYaj$_@3)YY0k~EhSzW6s|+G_70RBdlH z%CKs-5U*`DkPtTZk?w9IO)cXEGDdKxvDZ*UPLqC+MkBx2-Q8&;wXEzC$pahP zAZ~rT$%-Kx+$py~8S-H^B-n=}S;FXMr3M1O9q=6Sdb72=ODA&xW09J>wvYA@mo|5+ zxPJw@G?9Y0k%R8i&>o`m@|x`;N8LjN$_@a-5Q0_^oJH1Dr8U@LlQGKe3VuV!_bA;{ zjb?KnY3hDu%_NovKbfd-h;7IoDAzzZ4#1Jr3b*KR4_vLRDq>rS`2{Sb+CuSi4QP=7 zxVGyqIxmtmuus4P43|6LRsjFSgmGu#Sglez*} zBmZt~BZA*yGL_xjrk4g=j2gRppdvV0nJj~6EUo(f4%Dv=5|mqDp4#FqX37wnAb(gH zoI9vApfl)9KywMF(VUcV3xc?d2!2<{3F%|&mth4(X8Y~$F;7$vTPRT~Yl1)!EZQ4^^pd=C%$~;U}vO zG{_oR9t5-kVC;ezAP{vL6$B@*q-kR6JNtVuv-=g|%4$M`IAGZ5`@4GpYo|iKx7hu# zDFXH`Sm7E0HjALW&Pk;6q}`|?8Oya=>B6f7z}!Kd*R_ECy2zQ)UQvh+ zUAGUF@zP=e=oW{GS!(gB`)_}+$x2hjTd%pSBdT0^YFT7I`@$H$79fCh`ABxNnJym+HfZxhNs8LH|Kq!zMl&KKQZm1^hoB;4TSdECzYaz` zZXX*d9W)9RF}oWY0)MI8gVk#)aA9ftiH(3Y-m04-dkdb7u!ngSU1Xri9A$MKb7;&t zqR{)5h%WpYX9xxx@JBFg9O)=+OC3Q6(TPh}4q1W$LLW~Zw`fbJP+LQ0ucJ9V_`>=T!c3XH_J!#-lczzM_^x6M&e1raOJ;)Df^ z@NmGOxz&yaU4K1k;yvu{X@79Jj)a6e-?tRTVGo1+2#t z8@i7gUN0N&KL22FexmVaFe>~eFa@}|?_8aR+$WVf53kDBkevRGWVO+aCIU2urA(EC^Rtt zV2RHHQD|xXH3?OyEq>;EFV0gRfxpAMD_5_lE`s@y{OU`#Cxz$K?M6k7)s{1_=|V)EDXPplh9@Q*@Ra)Eq?0gyDWaT z@P8+=17WU5gb@ExJu>a$Crw=!KM~MGi!$3(;sM1I>k< zxl}WWFAF(kCXg&7kC})ulO<+S!(2XC2m&*SUm@Eogm{^>E)&ZY^0!>jR!Gz`(OD)W z%cWt3*ejE7WrD0Eu_|O!nGh4# z*-9ZqDa0j(T%-_y6q1fYq>;%kG9g7KjmX3fnS3D^Boq>ZOg4~90gCH>aj!35+hCQ0 zA}$&}aq7?R`lce9E#QTJ1OJhE{ub|h#fNLNgOx5=GiuU$v$Aatj;=2VcRqa3% zPdq@cmzdunsZtY{D>Kl<&W<`6-%9B6f zR`fDCEY{EM_&nqIJTory46Dnt#D8V-T;?*dQpAw-?8z7=^Q?o3@EJ^~8 zSrh~wvnX&LGyX2~m{)TSw3-g=#J#H~nu?AL**au&;&s`J|Il{ipM$oM055%?)R zIzOc+_$lVmGXCgX{L#7Fi=Nl4fpuH?n+`w35y87VF5IxIYsWXtx`9emZ+{7%@gQ2M z4&0JghB-nbotv&+W4b!VboEnb3J*Mj>pg|fy@a!MdtaYi7#fDA&*yu~_QdDf{A)J4 zIF=8!4Ke2$1|hyXOZI4YK?Bqu!V8+3cwTnu-zcG_tYG$`8dsW%3 zVy|j;tDpEQi`UQmJ?)%synhu$I+q(C_a=kySl@(7gnt}M1Q&5-W9ou=ed{_ zd86fn;&N7oVNgmIQSvM2-!%@>^PTuYCePGNWzOi9y_m$Y5B8;!MN z!%qo((&4I?L!$;9F@GH`8{fI#zdQdScft%j`D@z9hEv?{f-61o1KbQL8jR&1V+tM? z_q#XGU*dQ6d@#P4H~RH>B2Wx(ASLQ_tK4i4v8@#qHVr2;=EQ=Nw-#DoW}09@*_01R zh6>3tO7UYR?`^XWH~L4DKXu<5Jy$8O2GAP|UGKohlW;+`3YIc11b%nUa+6f?hrO-XjR3<%$kCw!N+7-YpGio5R*^$vS{ zJ$D9&!=tHA#p(Ow2_g4KX36eTV1yCG-9)AC116+N4%5?@-L%atXdoiPEJh+#LvB&?4dyVP1VUi&=aHvv~ zi35i9g|n4c4S%I{6)8f*DK{EgftxoY6KY6ex5roT(x@W%QfePr38+Qc6Ts}^8`Z)< zf)C;H;nU%e5v{@y!l!c~p#F`DQ znFg45On_!~_Uf?jd%7)9ra8#eLY?y^_ZghH_(&RXG)^d`xRup)BigHTuahqp13=4< zgqT0nFn{H+)W6bNa=Fzlh`H&O${3_F<*i-bcq7@L`fkgL(n-0z9v`>Z~=Y zIJ(sUge4L|Q(Jdky3uS|m4+^EECSlxy4<@=!+)*Tw(D9X;KG%;u1l$wiJ{0t&#tZj zSHsXy86&Gh9eqK8T)XI}sl}1@AF$Ac5Dr{~;Jf$MB_X8Eq2nD;gKhm~29D z7KRBev?&EbzzME_O4_d)w)UBpKyG@P4B*)lwg^@1)@t(sF0^Wsp*zh-eW5(&hOg-$ zX%Gw<75xhxwHDm@Swt<7O&@RzB6bfCn}2cNwh!w8+87eBO4?ltF}M$1RVNA@B)fj0c~v!Eg&IJ+Lnfg&;~7#)*W~QDu1mg zpK5z)s*-)M7*0d95i}CL+0EJSWaH3UlowiZipRBJ$9nAH$<*DeGI@`W~cXn{v`MifqF5>5nc=R-By z+TfzSBHnUA`R!`p>Wlo+O2hyT|}0YBF%)fAPMAg zi*fIvX%vj`md56RBM#z38E)Woyoc@-S6_yMfDb_{pGw*X3_zQ&jcvhp zOHkC-Mc}v(kU;_f%Bb0*h@mMoMgap3c_(W}H$fewx59ozLRepE129HDG~Nmk6HsEa zf-@+j5oz1mf=rq%E`Pp(zffNhi#FsL8X(#Y0Ob@f$tVRNiyXHZB{e066mh47qlZ(~m4UDvAOU7qZiyo;F-FOhGIV)svj?{&`~>HONqR}s z5GK%eA04#Fu5{u!(`!PUURW>TEpIdosVpll!iohC(sDZ+gn#&mgGG`+d=qDjnzA%9 z=M&js2MW1G9+(-3q=Ow{99A^!5{aPYYOiw@bk{!RFu|S+Q$9!&LRh}mIl0YA2X06m zkAzx>60%{%9x%=scYk@ei)zp%CUP1w&C<9|NEVZAvuC^oV?b1FM}madprZ}~g#CO3 z{^_`ufBL=-9)HkkyA5P@aLee9BZ57KR9%NOn}EHuFU&y9sL#Q6WQ=V#93-1vj0hZE z1GH2|Q|wfok)Q~s=3)os#Lxe9tYDdhiIq+a_y#@%-DS+pK*3Qag~(g#4~P|(S5O$b zV%3=yb`DxIMu9n#EJ}e2*ug|VV|5Ga>5v7{Kr`%?z<&kSQ*=xWHn=RR2?fG-3ktfw z$GO28f>1zSXCP8}sHOM^00^jzNq{B@iH)CxcoIgyR$ZG6&c)0J+kl-Ntg{VBvJVs? z0jeaE3RnVWyob?&arGihB1^Q$(ze86p#fkU=zzl*3tFj-C@RK!0s<66!V9sb%#VNr zIybk#d4I+N2*GMLv0@Nl_Y8HC0iNK-C!&TxeotG+ZZldxAS8xcWK-f_aWN2PR2vKw z2uTSgz74F$^bT?%uHEPWm>_cm21SD~2<&b)gqD$j1GEonXghJ35r{&Zsty$>gU)m| z4I8edb5fBYKooH_LL7M-=oCax1N!M!rvL^*d4HzK;_9^0DoN3S+*_=avgw4x9w z#cME*lRZSoI`M^qAc(jmAjO$u=F#jXNT2bt^n?M7-ACEv5DSr428IF+8N4>8^mdRl z4u1}I1pJ%~f51*oTM!O_LL6a>VY{%T(`8uzLMbIxmuuMIKcL`jJXwc8B-!0iI13Jf zDo1P{8;zMVP*6syGxjL>#yN#H5W_wdFb8Q_UD;4Wg0*p>t#*%5 zqzS1KID&vX%0MyasG#;CY9j6Y3-&+_IDe@WR)ynTib$uT;9M1=Mc51r&DyXf#XGV0Su_|#AkK6lryMZsd1KjWiIctr6C0aanp!SRn$7 zL4y!=FitDRK87b#fER+Lz-x1?vw!JWK&A!dVnZAEt=_cl#H>&cCjgz>&^|~Zt{Q+q zuUQSTfynmhH&T62oqh(9qr5Lnz?c6SmSbywMs5`sWx!;~)SH zBFP|;bV+8lIVt|L*FTS@h;m0my!3wSe;#A(`9J$Nl4e~G5g(sk$W4+ElYbU*O4_%} zmEVhczptQ@BSz`U339F#lX~I6`dbi|xqj5V+GL8FqCG7b5Sfr9gv~QEnR~khSH?N= zEs|y=q^4}@*Ecr0HDzWxM#_o!u=vL7pWcwKe)=o15k)I6P{g zhq8ZpZtJnFryV`vtHv99jem{|ktGj=>;{fU4RUVUFP@3mZ3R3w^@uB5mp}N+kwsE< zY0SQ%DGc`rt*rXixc64))2~M8m{PG;ySYV$z<(va$Q;J_#)ClP>U? z@LAX3gMfIhSpo&L3Xeo@8{G4j72i59L67%7W++W%P0B)eu~bILXn*-u9xK?%{_#Y5 zz+(k9Y3v>oWQBh{GRg52T_7`NR;I;tFG26fl$P!u=)I`G{Q|uQ^9$_aEc~Bq4R4n$ zVnpKp`xH`!T^J?GDTHR!Yy39#K=O+9SVTph-%XY;y|SB%!Aw)9*?Ts~lV!UHeAy@k zo+!7~=^p71v*}C)bbtNB6R^`iJh3?XM{fa}{YySw)duPV{;&>uRs~i^zxBw1SpjwJ zmsA6k(}ccZEhegE9nv6=)+1|S^%=uJe;L8#OFKZrhuZK590b?(fc9Cv3F+u)cHBK4 z9IIi$ZgQM3A9{VnOZBXe=ic#|ziZCFqd|YSJ^yZaOup|g?SJuU+T*F}fAZCNnC3^! zmC7g>m8HYRG&5#vUTm7AXLB`LcIu^+%cV0golwMUag~-UJ3nUOUs3Xz^@c2eq+OF& zH9rSZtqv6KsuEfuPAHy<6IWkqf=l*i*Ji1?qPK^xq<9t!k8(7Ft{e-e{bYd_a}boa zABoe&FqKCl=6^g)5lYJ~2Wwi)V|M?X(j$5RniMhOad)=9skp5M7ZMS%!m2_^^09o10xlA?dSkz0cPhTwv}_13!Adsj#@R)15<4l$-_8n-zyiV!++qkqDnMV5s&E~Ria4~TEZU# z0ovFF7^T?C9tH~N6QW0|^&FXotU94bNIeZof#k#5;Aj}IO0oSdfZF_u4wo2dU>O=a z8=x%Dphr6;Jb9Qa4BZ5cb`F*@I{U7RgPE&r+p$oQ{Kl zlP=tW%6}6dPRQ~mjx#B3Vp(MTQ#a}C>o;j+0in2|25?QZ-$I~VPT}jn89eC?Z;>~ybH`2^dT#WBr%g2R3r%H3+6QOcA^j= z)OAiL@z4!fu}e1>rZKSV2^B=cU7|3=a)>}fx`pZiZe6xSeOLy}c=Z5(D*GsL*!+R~ zkAL_xf}r!~ly}E4#<1pP#!lv*#@N9(Q^OimYOak9jFTvvE+`ub|vp(q_Do;+9r&upg?$p+c4*)0WS;X!AX}j4m zzL2Bdjn>RSt+Yfb>Z{i#3LLh3w#ro3gMTjR_MmHpJ=mpwX@iH8W6a9dM^9i$Yfq6K zz-q0JOoo6@OoLdlBUq%_WDz+4!F5AYYFke0_+@Y2gh zhjURN0~(w^=7am<2*}k&nl?O=F)lR-8H)eE08X;YtO6uw*YnMfb6%NYCTVP=8lIkQ zV{;KO(^UTba7=Oi=U}&Vw1diMyMN0@Ti|(PFA=zfSRe0R6~B%dra%dYkLt-Cv11MPPEbjU8o;h_l28lXFg4>87O$Z(QDLU~RY zj;>LjkEE|mPZt~6-N%Y2p*S`fib6V(g2SDVYr^!n;&!blFL@1%~bGg;P{{0&`WfOk5=t zqCq~26IDyOgrL&_^ZtSUC2z_zkCb?*0?-JK;-34HOMkt=$7e*qR)3Vv=L$^Stq~lR z)IMyzi0}(<^ETL#To>NJKaH*|BKA}~yB$jB0l z6097!)&z5L**VEx2!G`-rju@!Z0Q)OU!@} z%Q&Tzc=S^UjFJ*&r7$EO+qaN!rqI_iQYwykIOLp+$fv+kq)ILoiKJ!MdZwA$iDjwt z>?n*Y&?8=Xl{=a-lxgi*Pk0qi`Wb_RTE^bj*20HnzHi24hJTQG|2AroYbzaN$ya9nJR?YeooD!@^*C)DT-ODl;QR|X*;(4dS#V>cSGzpw$s?ur z{$7V+c%^fd7ji{hjCqnW&ZE%Lh1@0M5lIY>-bNAUI<#l5X7NXKK+Apy9b-`t)sXR= z_GZ&LElKRtPJfFa$^h-s5)&yLV!c=IZQwXh)s}6+v*KJ*k`iS|q@|dv9sTEaXlmP% zPI|tK9bJGl;Wv7`1^H$iFacpOaLsW<L<6vx^4>J2W?_laRpp z_G@SHM?jZi9-KVx69@YynP-?clX6Yeo{hua`#$ZxrS}huxL|^f=sh+q?W}@t4_xXL zuq15(S6PxSWn>vX76SO$%JSE|HMr3~&|rQ$E49bXr)Y2c544wG-0!n&H>Cym zW%yw@`oy{$R~zI_5-`pCDi>N%&r9feogMPZeu^jjgtYRkd#^j8jb&?&Pp@?uc9R7y z4Bh%=%F#d#aw*nSbC>8OxCq1e*DwOlgG+`@WiWp@w@KgKHPA5+*4CQ-hveS+v!g%D z2ZyY6OdgdmZLY0#=e8B8d^Fq%nR8#H!OHJC5>!vE=vf*S9u7C{(kKBDAt#1U zS|oo{MBS{B-kU%795~62b*Fm#`=|YH5YH|FAO=phqY*o=IPpt6nK%UHD~gZhCs0M( zdC|LH^zO8SNmE&BbE%x}5?_3SL<)ynT&o?^+8YppIm zpbu7l8A=$u!mbQS<5!fUOIXQuwYM@32e*<_!CjUHMGp+a5q%tzjBo=W3Q4^0a0h_b zD6|Lypr?0`AKB;A4MC zj`k!I2xg{Y>eLZ{EV?%k_e&rS-9FggD^_%(#4PD08Q>+iJ9E5UTZ@czVGmN!CN6tR z%{fZ7jM*5+8|!={hQI?ZI=Q?v(WrmJ1q6x1cp>=-y`P>%kNxTF>a0xS?(T~8>aTia z-Wtr5vOY$J$ZAi%P`iJYD!+JXbyJs!Hca|f*mRY|hsd^HFzkU@nCG8WskMk;@ya^PGQcbiSJ; zNctP8s&60t81kSk7N=5#bTUd$$Gx-H-62`55tv5AWxw~QX6|DO3S~(KbKKySY(h~L zips1{UZj*C$&1IR2p|^>#6RGn_=W-q$CR}C^uimCx-5u_Ucc*K!2)zAH}h}N!xmpo zpR0S%PzVB&9K6)9WSM#wF=~HN&oMXJ!cpa*2o!(=yAmj6(U)i<%kYWnpCkpOp0m?v zhr-zNS$nRl>fkGI32V6sVv9$f0?;fPb8KxPgv07qZT;taPKL}2dT>kTrM(0ZNCj{L z68D!XJbQh{p>Sv)3QIfx1>B|{ zZ2e@Wot+}ya29yU|GMs9ljIO9cFXNZ`o$RP*-l~0d>;~ta@6(upOs=$t|SOWS4Nij zokKh(Z5pVCr-Mhf9L1~lN&$^*2viP1J^uz-FwlfKpfx8osgV)mzCvp8a60K;V~I^e z8ms(7dp)4R;klA%rlWs39NYav&w{GHJ$2^FCJEY{&rNNwFqA$yC{O#A7`1PSQFZ*6 z*mfP9g_JoA@74Eksa&jLsH10nbdm?8!o=WWA$y;be%l<2c}TlLRwyhJa2^ALP-TIQ zV|X(f{l~z^8eR&V$sBMrD!m9S9%BYO<{;<@LDMNUA;-@@ee8eU`_jRa^t52?)Pf~m zOT;tOjo}MQs!%O)qJZF4ph%&#zE39xeY`&uB1ibeCXW?trL5#6EU5TgZy#H!`ceG!mCh|_8 z;YzCHmJ;b)SO#ZSvWT=6hNMwWo?v7zb|G5_aEz6S(~Wa4)`Yoho$|7#mo<|F#ngW~pk^PXp0BLOJu}_7vs!>e=c6BD6{05}*2# zS@}@q+yq8fcAylY`{p1V2e=UYHd4LuPLQRPTV1j^zsJQf*l8(jm5TK^SoxRR!F`>7 zhxa5Dmm$eyZ7p^pixKX@>zLA~tF1AYB&!{~k92=9FYBP9$ySQY?h6+3>((x8^(rE# z;sTFTI@>sst@ld3S}w6E{Sh3#CKlotC?WK*5d@|Q)J>M9*?|!aKOzC}S(nZYHoIpB z5Jfwf)d9vq_r8PuSL6o%3PU2h1!qshlIdbibe&Kn8`ITVxSVA@g!2c>2oBDJL0!fM ze;t4HW*5_gNqynbgjHneXi38_QP`}DlxyAyexkF*v`e?6{6lj4+S(U{)!Akfw4*wC zT#Od^m24-{RDxcu2t^sXIYN;xr?$oWXyFFJ?(_>=#MT~G?!3=>_b+=>?TxAJjgj`o z!p@AW&y`LVmJYsd2)*_9+w68K$|Zu~Dk|~pUX-S5mciVt%VRLN ztbh6#oVfZZP?h>9${j0?=0Cq<2zP&iHP2}1ofH4pJNJGrbU0na!|9Yqok^F6@r-}* z^JQi0;9|k?veKZqa=PTNn+N_QXr0Ls{k8a~B@@~S;ha=NQaarj&XInVb+8%Da1Vga z;U1dTaj;yJC1Cl|d0WJJhq$~Oedv>YHU%^2tgh;=CKo*;3XLtq>>O2%ZU4I)et)yh z8Y=I6)O^EBEVewu%F7!pEX9i)S08@{<6n?>URJemNwr)AXiXLbHZEaN$hZ`X22U85 zB924tKzdos*P>q>&Y6M1BOtk1P$r-Bcw7DU*I!T8k*sn2-2M7%Z{ycrr~K!CRVEqT zU0@d}`}310HNN=v9G^4$)FcL0X~EZ_YPa+4@w$rnJ>4jtsG$n;jw5&zD5C~jT9@hz31h#IVJRb^h6Wd1w}4#A%3 zw~v9wZ2g>U@MMv{#bCPF8Z;@p%4>JSbaU$RTQuO&y<{vl|8xIz{XBoNK_a?$V?5(! zM$H56L=!@y$Nt@}6O|%){;T}m?7bTfmdlKAvcXK2;YuIzl#r3YKV5DWQjL;G!&`juQz1`y=7Nlzl&x%Tl3@^wK}p=4X3@is!c3M38(o7Qo(g=~KWs0=!n3^3+N$n=^Q z^$R@G>L(epUAdtYvpIRfh2`q#M46(5>eN(O}@Nrs=~5$&t&P7 zX0mX(il&#YSa*NZ`mC;4*H#P&cKtU`amv(50`nEa8!pZZ1lkTYt|4X7Gs?|C)6Qa? z2vq;|D-nlEyVw*vg^wV0QSDM%Ksq+&3TK416XNmFCnpM1_EkMh`Q|nJg733TGPh7z zGarbeBuQ8xlt%s;yx6;sajMCr=Aao9Wabsn9X)>h_^f}v3MqKWfKR%oBz97f6U9=w znMB%+bR5|X!~TLNja7sBiXR`&5(8UN(js_3Cb4#b-~4o{01(HNOO*Y)dGT}gJ7U)d zCAi7T$RRd=n-ak^_#|3A_C-%8sg&j4pk3})Aj_wrNIHP1Y3?7MckHwCSaP0Dp4n(@ ziz)xL4L zvn+cS4#+aFI#1~UCqXM`hiH}48+;OT#?X1@Wprou0NsJkgp{qm3ljNo$}_A7j!g%; z>zS&G3)r$8MU%$De`215QQE*am`ibFVMhlG#J*9IR-BjuG~(c(JS`oh;OkPN9^YZ3 z@a%sX2{J-{)x}nCUvZq$G!RuJ|f;(jOU=Ml-iI zf!&ONSiU%R$}H>crOq1EH#(8Kl}_)|vf?ZFaS_=Z)}B4ELI=3`7E|XfVRDw%emul{ z;2%`~4Tfi<_0@H|#@IaK{uGal=RruHvT%O~CUNhVi1NdFLfK!eh_fn|21!L>ty3Ut zumVV!K1B@sbnBU0Wp_WXbNH5PxciS;c$nOJPCgoWe1hG?-n7qx*nJkHLCUU)p%r8mdn@HPYB6Q4*LFa`p&jU^{X7Q1ClY3cy$>}O)1wcbfw9(R7`&X zNRXlzmdrQYl}3WK z4@|N$XOWc7hxs>?{uOMVD7o{{ug-_qpn;I5gNe-YC%GzG7dY|2p|hK=qiU(a@wLTk zFr7LZGQX~6EA&fNY%c4pSMm0F_1%BGkySD9unVJxe#z{7l~I>e*WuY<0qhS-)k+M- zz}Sh0)@$H+SDB(>dlf8!D?Eq6fzvR_R!)VEFi~lVfKrccC4*CBWL~2}%U9+1V%_KY zTkR@JpU|o;GDJAv=kueDj2NIdM$F`Z8Be5s4GRmF2%peWFoK}>FAE#u=H7qEtN7&; zZ;OXm2FCCJ%OG3s;#iaMcKUId{V;u|ER^r=P6cFXr7x@c%?jPDO!N1@aO|v?w2ztO zIIM+rWQQxgkkwX-QcCQpbgQ=WSDcJ-UmR1h4mwK5s_h!0zl#3l$L^2PrzC9qCk*&r z<_wvI55%eaECDWm^LVj+tGs`VYiN5P<|2ZjY}p*l_IEO3nBV`^jT4b5hHY~qA5nIK z#arNpmh9oBtjr0JV(=Vd1tSx2I_&!3hJr>EZ6)qgS?Q0Q>D9@;<1j2>dS^9YAAhFkE*T@=y{lSg?2W+#8Ud8emMHb32^ z<}e6te7fPpg%I+kh?~MZmnJG?ooRQ)1NcjwVq)@jojO7-?X+v1T14G)5R-Hm>w5Vt z>ak20BUV(D9F~S7!%Qt$CyS4olwS&FA!=}UM~=}U;@+=^HwBxGXS7EQ*iAKi;LL^x z#9Zns6S?&VChVHZ2XTL?Le(!eGywLgZwH(wzKm+6#k)4J%*lwdEn5*43~{`q$6lGC z#3vPAs#jVDd8kV;F3xhE^vH=_9JRxaYLLO}BRlgDWPSx*{lYPjs9JY=Gdx`>c-imt zyPVE>IX7EWhNaC~${H~dN%ctga2w7YxtCByYPIl|5~fWM>ra1OWCT@P&Po4&6MI5| zD9-U0e0qcPC4I6dq^^m0%?zZ{)(FJJYd-_x*u27a0K z@xioya*Z?KtKolhki?4!lMp-%Us6rb^77Nr5aE+YlegpUY2V8)V+U7s>_r##=?x6r zl^XC8e04^{zaZ%8Nx(Wq9CXmDe?IHRF`eB9em3(|h`tMPZZR`!oL~&|DHuez20eyI zpJ|drRuNH-wCV+L$QrLrAsQST{{7<#v@tn@qy5rasLplv(uo35Kz|2>@gqy#Q zMf!jH7c`OQ;`i@=zb`_Q2p{LG53>6J)$i{g{hTK-4^&l|Y+uCrtluVTX$yzr*RY2` z9b7JuxV(Sv^+7`2MRUxsxxDW4sJ##kmZ1A`)L60)mZQu323d$bbDL%nF4ael5dN}? zCil3D|6tBb84ua*uz;_IFt7uYi2gho;fOH1Sr67}`JSrdRmxKEfgQ|{mMLPEzh0nd zkbdcatjCG)Sq=CPKf;NRBA?G_HGwlN;@axvQ~!TFzUogPrd2%9SiH|J+EabZgXA_k z3^`{iG&Bxa$Epti{ee|fiVS_nL524f0y(}cdlmwr)i?2NVdPf|uamxBt(VR!n@0b@ zy2g=Yb_2x!&5%CcNZF)9m6E6`ls!H<8GTN=s>{*n!}a(_F)WvF;LC!qo2?(Zj=Bk! zLKuG-{fpXsa|T?V;z~Rt>N`Ig{74-Ik;V&+s=fl>9N514%C|b8{jio{ecYbGs|x4v z-k|%J(dQ+RhT`kh;919XS6|06xc!?`2ly#?wY-(^HgDv4D2g71u_JE|ZRO+_@?ck& zFJF1wS3|8O%NQG3t*<((jh;;QPOKz6l0<)d{ey=0_i@nw6#Kdjqh%|^K^@HQt$*{j zQDk*4jinfgI`@k$_Y1meTy1oR(bAd|kT^c=3)WHit##~b9lND9$qRpZ z5})<|q(2A!C-P}0WjOIfcegh9j{tT2vv@ywlM3kc=r^NKK`*w5j6KHjXf){?7eB4| zk%+PKjUF<=Z?0Hv3GomlYz9pMRv5FA6-HnstDk4swU`6+Y~~S({nG;3O0=Qi;K8ag zb?nzHURAgnycJi;H$@0J1O0E9L!*DxcXulU%OQY<*RmB0bY#gE3va^~E0~36x1u|N z)}~Ukg%VK*a@w}#L$`Jx1ltC-N56y^B!yfeSV4sgqSWzyi^cGGAUpX0Qi&;Ki5Hjz zdl}^Q!HD5IB+kRl%faviiVn+y(G!7Usi?q%=01T7fG(@Vm#Ac#UbxV}!5qyXNKSjyU7`SsV|OP}#u z@|7g$CRSlG3O7jmj(}glVx)hMzxE~C#;}j3-H&~oEQ`jFxR-*|RIqJc@9?*m-yN)k z@u@X?S75-j8ldK}GnYYf>JG<&CCXipvt2B#?OG(ZB=IRTJD0%`J?qp%qZs7pwI_0y z2)YHX{TG2^6flT8YXNYE2{^^JVH2Nm$EEFyd;i;sPt zuKBChFN}-02SdAfHLBk#(#F9xJY2<;W?J)_{ZPetgM6*$18n7Mg0oQp_TOB&p3R;$ zE0GK9a#)l0L{l+%Nib?1JoYPm3cs0rTYon!$;f?1E;Q(s-nA7&@;!zTR#3C<^h0(C zBoBO>UZKOtQCw~hAUnbdkxwEBX>c-FqHjD_OuVUTt^eA`o9{!0> zke=y#mx&c8@lV`CbnO3tx@Y~ixCtVr`M}k~7Oz_uUo(_A!-RiXL}5UtQ7rviz6baR zNOM`#dOR&&;ndM{=jsT%^CZQrZ~*lXUZlL>uZXi9{OkjkpZKrrU{(7E?%bcDJ2y*= z`sz2G6JM*!$!hZJPo0Q!g4HGXZ^vz&jN8E<{ie$IR`Kln(dqhX0f_%@*GZv+*>sgm zQ=<8elbw^njC_BGuX;e*AK`7mnVZ@-eK_&EJ2w*Q!~RX8-HU%XASV9V6yZUC2;u(N zoxY8soDK%g9nT9c%+uJ_=*5H}k>(tb(V-)Dzl^9(Yr(e0l}2ZfJnl_4%xJz8f4}OP zbyqa1n|0SKm ze*4K;+J^YE%f@($z(~PiSco?~Dje!L>^q`YbYKv8*w>qbD=kMM(jt`fLOB;3Y?)}M z*wUOyKF)tDla!YzL(oldhB`$^+d=x#8Tf3!t9rwZ?O1W zgN(iNr|Vk%Cx1et{o0>UwSDhTcwD?$z!*HQt^ag)_gY)~>Uui+OaEWFw4xh5t-rMW zo)>>gGWDWIiVnE%cSM7_yZgSV^0W4oK9o7wo5*Zbu}gc5v*iK4qw>Yqu^=82ZYc|L zI~p6t+MzY=OXE4~OL>KeE&X;PE1{b)D-NR{7ohSRC;Bgt`qh6ZSxU!#I8^gakn5HE z=;{RcQ7aC`|H-})-G4zUu-V}c{M)@RkfDFB5TREGFWA2J@egU+EkO@I@exBS=f*q! zh7&kH^bJmE)rO~+*FAJr6K;f|8e6_Mm`Zl((z3z-F_6O&7^g5W7QsXx+-7hs%1`~^ z5wzgcCu7b0ss9eD7_SM{12-si)>ki42cZ!^x~$hP7E%_AdySjZb(QvBI_;&GlKOwh z84L}w1e`$kE+cFTx_AAL!AasDlVzz>{itgy=xa&<%vm&`h2H5MNB&nzN)nJa_SEL<5nJi7=A=cT)4?--bTY zy)J^<5yd^kx+?;X^OBw*;5eV^2?B0T8U+FGih!p}B2Hd+cX&H>4c7$P!*$G%P+JoP zK*U)^GSv+{++)#Dmy_yv&GrJUA7aXQu_^`p(kw_A1lC;Wd0pY#xw zuK+hE^s}PvuefK5Tn9&)$8syV?A}ynv$mGJL3H*;r-J|6+_!(Vb!6%OeDha;(&L7U zAjXNibA>U>P2!1rk~lYZCOy~oN`xeX8j!dWvQ1i zNk@=L;rNKhRD^NIg&5@!e-iIJwe#a{7rvGON^t=fuplwuNhlX~Kk9#wQvr+v{yeh_ z(9csrBVg8^#=eGvSLv^LeNlsQ)Mi4aG9^N3tp$-8WEMGG`*v(D#4>RU87BgW;~oB^hj zSF`Ooqxk`2flp-Tf317ZEN?0;oVIo2(2wROB^D!pWMF^5DtIeep$Xx|5~SK?35gj` z0G?pSf3O297%PPD(f+q-fsD!PD*mpRAehB!Y%Lp<7>qg85Fb>^2nO}w&@OIy%39$* z5?D}moi$GL0(t?wV9ekK@SJtCM&@G5$-VLX=aVrKjM1HkYDV9b$VHizz9EbZULX~g z4Ayu+$dP}gJne%g>abV{CitVj*JP-@t&<@L{Ly54zrT(A^kQWP=m@oP3_b)F(!PDc zhXKx6hQ-oI8NLO1FEr{Ls1g>-Ya>)BiQ$q;y@E!}PjpIEdU_@<+ zGBzRa^W-QzVfVv=qB=%@?G2PJ z0a|}5cM1XS=y27cP6aFln~UyCZ!rz>$3z{)u=w~bceIiIJ-@s{ z^6Qh4{P@h9e1j;63n43*xHuX@pEQ5csHCBTh;bdy#bHe_J~`qrz8C`4mj%m7kGPm5 z-jMAsorKiT!sw`AXqhqZzeOSoE zl|Zf2s&Er1B_D++17SWC&#A(~jo{BE17cED{q>`s=-0qG0+rK@nIvZc6(@kuNanKr zB|~#~#oyk7(dS3+Xf%ZRkVaheVlQdHc?Kz*gfCUp6El7M z#5j{Ud1kK7ZL4o1#4#@3j`&m`GgTpBiN^CEaDJlKa0Oe}-eVIs%0v_y&yfdqj2o0R zadLTnhOwn>1W)TF!i-BYGQa9y^M^YdHqfN{1z^2A&?@N$1nJ%e?!$lc?}ZP~O5OOu zU?-D1lt+!7G$Pwly#_m9As18YxoWlBoPLm)yu*8O2a#>j_oqPUkpi`F)2s_;owk`Y zkHAJ{Yc=(jh4V=F8vffaLI8wVLN~kDjku0^5(Cm2zLX!Y7Vi0*!c(?)8zCu$av~c~ zWw>n-Rvz2|B_P}jOW%JC7+?f|@R~b-Jw)1HSU&X|*mdn41U5q^108nFMKIkfH#dq% z&q2V68&}COH27!O`ut=F1AIZk2&sYK0|g8}F#()F>>5fHSK(3;*Xs`n3OiGmtW{}S zn2sDo3HR6xP)n)qs}bCe#z>$Sz+aXDQaRXosQ$EnK0YI;Jn?^#kc65p6HlN5{_NG- z8^OTb1Ttpl54*wTbgbGZtq1!lfBZZeAD_U+8k^N86vaVP#9t-!PR3<{h* z;rFz+zjz_@N>D2^0fkk-BB*_(YB&k|(Hz-wo+Go(gs+?(hqVF>YwAi* ze|jF=hO?L|&yRmM@kzF%B3l2-Mcw{!bWF^QUm>quxThFGO`#3Eckfugt@Fe1?O$JP z2bi*k=jky|)AbAYt1Tp$Yf8^O+<2s;PPz_XK$D!#`~91)mHrF7oU@{TZY`>dw6xvb z2U)|F8fEjSkw{rORl!#HD^{Rb^*-aRY<5Y>)M}^XH%fmy19D9Gk@X63JN}}SRi&Vk za{3np5HaHEB6*o@-o)`W3EOQNsr+nnE+9rg?rwd{(-kH-x32ThSF`oXr*^1n_4MqP zfE`t-6as)tJ@(c@i=ds6IxgQNXFiOkb2WO=0Gh}>_7g+4zmlsz4x(;yYc6AF_ zMVXM~{ZoI_kwNYSumui8F8gJ8T~tg#Jt$fWEgV2V1Dw2E47CUbUo=F%<5}<@BiUpt z^vgOz0Q3$MPIMUkcLiKU0P2sQp7oD;F{cT}kug1^ z0cMx2_zVbtk}htNC5AR93v#59WVu|LlR&!SfE!P*c~KBCV0OCkFu}*m@g>gkp8Wk} z0fWuVen1l>`6Bce+*z6aX>LCcDe;D);Go0B06L@OB|Zid;Vr{!R(~n@EAMPEXpyX# z@DYCJ1o_!D6W92l151*U0J8=hekiRqvqo!U;wzqi)^rScH6z$8#1TltHnJX4nAXOU z=0(xKOZ~c|=@fw7NR>90T7UaQv0YY7%>BQd`{0LDX#8) zm?tN=W@FO|jtb?^h@ZK0D8=DVRJ-x}YsKjZwW|Ft>#)juO2X4)39~kuiAz+f4C=go zeZND0c@=|`oTI^5?$RVa13(hZR=#rqldAS3%`8`{ z=I-5#eItk!YS~BumavzP_ZXbaFj>jal2n1-OmIreI(Y6bQ+am#6gI#WB)xEBi0vdlwE)%N({TD z(k?B00w^kid%r9Ayo~Jy#~1awwudu1Glc})+!$6b0hXxD0s_{nSshh%3PG#(l6HW9 zu{fPaum4)LM|}oi)rVB3Seh1~s4KS9Yrvv4~|vf;Wx7`gsVJmPwW<-f< zOc(){fY6ja289A8s!dddBG5E+Wya2FK-1i&Oi>?=7IY7U1+50{!9-Q7<9c9XRs;3$ zf=duR&~pLj(SXH4+(7XtUw4{a0vTz3(FkxjF-KuBq{})h1qMJ+;G{BbXVgD`I+3Q> z+9exm;z7AB4nwd!t=O(ft4zuJOC&Ap4dJ%(wL==HarOTzIxDPvogQ zH=_f3Uz?TWGno-2C>V_Ze!*{~j5QOXPC20D0dc*$sKn3CoSBItKE(ygPR`#l+8W_u zb}UV5dXsp?#Am!sV9V%8OC!20AH02%cu>j?G?ByODp#tge3TZo(9s$qUpDdN7Eas- z5_TIWRy9-`&eF;tOaD5Ar4`_nZfC~Wj!T!${0tX=Cf1?k_)pf-WXuwAqsics0}_5O zgsz}IZ#1OrXBi@P-g>V%g&QW9K*i3QZJR4ot|;1a&!SL#vnPp})JI*$!(`JcT>nQv z69C%rq&xRd7kZsWn4Ln&Pj{1#A14|D9IQ?Bp%w&chj`FQndTy}HaBRsSxLZ)RUITI zHQelfd7aW+Zsq;-;7nAyLI;9@3wcozah!RxcsMX2o8q&Jfz2Cpvu9R-TUSRCdjK9> z)W|ym37R?=4?;Ft2>;=V0DdJfHIS|wIFs(R6DHEK&ekVRl`0iui`EL>KdXIUYOP%I zfo}G{A;^+Vpnno$VdW+xla;Jcx1-McETXu7+=xNoWj+S8>;8m)KAx%seoH*Vlol?v z$spzza*sLQ&X@d6_y4yaO&;r%>^p6usZ%oN;O)pd2c@{ zEh}p$n`vmGY)Qs!_?9%aL>y>K5JDDTvNRCIb*|MQ8NGX|Lc8jjkqovG0h8<7W3{M% zpr^!WneEi!4Y&20L0Z$&;m~TL%rxRja)o_4o5*1(WP{^CW)+Opv(VM7o|Da~l48ot zVO7zoy2K<&2JSQx9YP9-%@z3s1rlAJqWCmV21J}#h%SDay+hR$Of?IM4_Ihp4ev?= zfqF0#dq4_S=&vu9$E2i1mXd>p_k5Fo7N^NdXrlSfbz(AIs|QR4aXp60+$~tjy;FdT z0sZ>{`_gH-chAU2RDsZ6#aEj<^C{Sq2JeSIIk8l~?SR3^IqQ?^x-L9?K7%_3fJ;i> zB|lu9oDBiy@VVK-OUF(1o-1R{ax}hXukJ(UJFXW0)zmo=<4R&ME13aq@6mOCla~HM zXQZ*eTWGBr3D<37!BTC{b^0A}7aCi>{%Ljw!C3-Ia2*ZKRuI%m z845zRyN!$?Y0u|02hgX(QZ~c}_k%)LNFGFJFZ>!Fk5v5-@qt3r$nVs3f3R&k7!icX)nv`t0zKD>OWOk-u~+WfHbzQQjKi#Miz?WeI=oZ8(WFe;cwl zH<2Z##(!J*5c|rFsyBKAI3-=+%z|gO-u>Ix1U|QD0zy#4VK_i#(E^i<$-)u(Q|Avl1DW9=Y zb7{S#RU!uAOg<(+{P>-_YuwUgf2C5=W$)Y%@}Xa`KR3(gLJ>UD8(21x;xpjv2BRpIU9-7ce?e~gt>z9C;I zpZD)amsrQs-#+t+anQp|CI0bbK|oO*fxQSz(!D;PAAjS1o#yU1>l$*6i%kxZ07L)u zDR0DhQ$Fef3=7&Nc19r@CGrP=#aVIn8=qkg?G%rYZTnl3UUWP_$Be}4a(c18NDwgQE)tcz%aTXdb!1%_3z=-fuM@HDi=y~%@g(<77r;=)0dU_f9|4$v)i`!5S}jZ zMNu7Iy#Hx(I+?zoh+aFAPyoKj%1WV+ADJ17{xc~yw_lh5Ad_(Q*ME%P-dp?n!v(4V zIG8y=@dP+5h(Cu1!P*8QW#{9gvnwbt;rNVvCDPT->puc`!Mu7jGE2Q#@;U4Dk_-m< zD^xS6>=g||4Ko}yVs1>=%1;n z1v3nr1%ETI#DBrOB-p^m% z7}FB)`lrdr`BfNWF$z2H|f) z*rtRctNbTUN+-|TAV)QjoV zQ^sR=#O^f`C~qePYu(xcDNUs8Q-%J z#{_g{w;i8@nBk!Up6-N#DeyF+ag2srnGDVFDs6*hCwqTL>Bu@GCV$Qhjzj?gc(8na z8|Txj@tb`~Hm|?2Nu{OL#(%d`{mug9U5)@LP!NG ze}O@DJ|ASCkc^#jP=6eI;x-sYu2U&vhq!|bO}SVvEP#4+mRcjiEetX^*xaSjMBu26 zxci64#dLwFTFlp&;beE6pu=o}n!FU7sWLaR^OTb&B7!&M0>X-ClWjKNVJ!zKw%he+ zf~(_#9BhIs8~ha9(+e{oQw46D+hlEzCQGgJm^|1ff)6tDN`D%s;vKQLOj?CZ85rKx z^0kzsz@{Lp7Upl|1JG9KS+Yu(UBC3wEX+Vs@bn~kPdXPm_T&jk-dU%&3Y|M-Gv7-S({pDX+9ydaGvYK z6l~8nuEQY=&3|nP8@Hg9pyk6WrKm;`Bd5mQ2djZ(imAxQn2urk75~-jkXY%i9xn+fjnIm_We;Vtlu+_^q&X4kWjoJ#oMDfb7_SFDOYcp}c zonhy5Ttz@nrcc{%7fGnj+IM-geh_A@CJ$F@^!b3nM}O;NpLblI?^+k$JcLT-$)JVg z30Z7|Cq_EYYGc(>uALDxw1C`uA3stP_fH_`_V4<=1f93sO3>-@JR9_keNMnF^~8gr zeY!XsD#x^pYEd9mrb&n!l>^Kd4DPC-2-LoIbneLMk@fgA?NQE?-`HO&h-AInA!VMK zlKMD{Nq<{=nSHbz5w{H?|2#Q)>ZIS=>AQS)MQJPBU)kd&JFK;vL*H-q%mkBKD-AN& zgG34apTfJ}{mV!_Z@Hb+D-1wpl@Pq;37;y33O-!KDlSp(IPr*T$NXryPIBvS_%6Y} z3{j;+q=t$78gV*W0H>(4+w@r^k?<7GO3lIN2Y<{B_#1u_K*-g5@MsbR-Q}KzotJgG%02oje(gL@99~W9U{|k}xL4?P_cl8bOU8KgwT! zS%18JE8!MQF2W@Kh`En#SYc_x$Bzij39kA&W~_E?-ZY@f)Gt=;(W49rLlO39^F#13 zguPJkSIONvAM`IquplU^-R8|2bvtoja0(JmYu>*zg~Wpsy7u+>am&C`<%9zh2Q*CH zF4T)svIHaG44$*_46VA~G3CFzpgJZV@_*we&_v>{10UXVaje7T%Di~e5EI(#1x$lx>CB9orw*tdX!>1w!KDY9 zRp92+FbZ3CKIm*39Pv*R^>H!a0^$@%8)EwLA>VY@F7OqYP(gX`uN^IpxrK7FA-r=? zW;+xouDDx$0O^k(%YV1GiGM2r9rA;R5AVU?|M>C#mjU{6>#}IkC$ey1a$L{Y2lOw% z_#7jdTL0DMmN$>*4A*5E&9B$2GH|j+OAQXVRDf|!=%?WxW=v9iCc^=MBJO zI3_u)Y@DyJo_{Azb${fmh|z<+^Q!XxQzqphhQ=EsbUv2Q*SE}TE%+QVL1yzc1FGb% zZhpjYael$W!IL8G{2ibHh~wD2fpC$6ze=7i-_>FgvN<;QKRox{$peMrlf050PUK^G zBsh_8g`p|}Ll@cIk48f{HsM@Uqp;-ewT!%o{Ej4z0Z1gL=6|KFdF)GWVM*!+uYIy$ zK?32@JlNdQKX!p!{>nY@w|C!c?T4d9Y7n&{V33BcdDen@pM7NspDWPO5~nhPgFocw z@OLA@(JXE#Ym;an*&g~1i-)9hQ+yO5aS)7&4E>+&jy@+ombT2J2o6LYCag(=5D;>c zGG9t5@EwN;fq&p05842YPPC6Xf;0i*O>5;iP-F<8P=u>o@WK^_TWD&TJd(hm@h0!u zDQ5#DWthoa7Ri84=0Gy>X@bsCrUFDD0trxAfL`Kr2`QL>42^3VvOUd&nEPix3DeuS zM)oQ==Jn5{nm^Y7&m=KH!6P-Xo|W(y5`Q|~1F|6U7yxJX3BZPsRuCr_ zqKjbG(|{G$w*0&yBn$YP{OueWXqWs6ywAU3G`fF!NH_+-Pm`^SZ&j`yc&`SJ(thih zY+3Jp|1dh~H^)D2d~4%t=3&B+S@e1xUTb3nqkjCDqWY%U%*T$DO5vHs*HIY2j+wa# znFd4hZhu~4h`N>p|0Hm3Az?1m1e(nA0mvl+JSQ(c#|x0>Kq-f{33G;F*pu(`FY7Ra z1nqbdF{#XE0A^!TI!l%;U(i4+b&|M!N|7VcX%HG+B)+Je)F;hmnkTi*<}h*;W>QpC zqxANjrbL$Kj`t+<0uJyFQ}ND$vq1y2+yTYtoLUIBEnIvtuUwGHZy!HdW~x5z## zTwbzWn6pT;7LH7h6q_M!qQqEPDM_P<@!9jFB>7re(y;CPc~a7(;k2+}(y@Ge8;`*o z(Rd({E8$wZ#|}GOxl$lI2G_-s3n0oi%y$;?=+id25io6_R*ndV&uDcUCPWUG=+|AO z#(&i|k$z1T#ZXlX@|9yt4n6Z6=*RP$T-1?Hecl`85uO!~{yCLmI0VqPrQqe-Z1Z|A ze~~>id>!+|Q{W=XtNO|34D^#DmK3vlA0Guo#of>OFXZN^JHo!bz_}YSBizMKkWqcv z0#Yml3Qa=4I4D+t2%?Nu6~_5ed}Tw7y?-x6OpgZa{OshCi7+Rg8T&SU5WwH`fJCMX zW_MOayp9SN06U@K2QAvCN%v0=AAbIjs&X0at6h$OSYXJIWfP>a>t)5Q-LmR^FfmlU zna2Kcp1{+_DIC&Ihq$RO2NCAVnJPM_h=yJDY@)g>xHc9~rkn7X*T#Mp6+|M~Fn^pW z1b3Y^L7c>GLt|M=nfVt1I}dbhv~dCo>kMHgT99=z%zc> zMeXD<4sGD10p1QF@iiXz@%Vv0Hqh5hUu(Rpi=44tsGexX7V;B5M;0nti_276B5D5H zzkU7uscJRR@kRF-9lQljRF&=;6z83I`!Rn-U$$mWj>}0=ToP4=oxFmM$y6ytu}1^gFY zl<6L=$AhLmlNWFC=Z_YEBKa%QmlEcay`6)%GWzhTRI?0LW@1$Ll4gs5;>$-ZXcD0T zYBv%4ffxpaG?;5A^0kjbZoS$VHM)N&ZPZ3n&Ojce(`%cb2;t&yC+@=R+S$C2`2DjzR5Cw>q3haiAE!9 z`oQWamabNW3bN--0kn&HcYA-ai|yb$!xq$-JxPLS`K!~;FuITmeG?wrhD{5C?5 zU3QQkgt3U28k7?U!i@SQveK#l_NBx;{Lh|zo%xqY_g!UC)Q^RDCl6Un*bM9+xA>Sk zK=Bwk!5Wkrs|R0GE$U7NX^9v|9D^sVSUNP^(IjT{`zaEM`(yPuEy{m3V{CLbBpv(O z`#vB8L)jSYt!0X6GELTc-GSbCgfBq(V9j}t@Tlo~q5|Sx8sCSj>3npC+jJ%FmM>DL z78IIJJp2kq7_F$DrW1rUNSXth0)F82lW#*3Sx8Dm5#SlDxL;Vn5w;A3KAdWuu0RB7 zAQUcFFdh8Lw4*Wd@bw_#qi=xQA5G_2!*7vZP>8aD zOv$W_8$;j}Q*%iGe61iZINAgDDWab3Al6>gHB!7qJRsT@M7|Y#JWI!0E2Hxv*`lEX zPB@2RIT7n=&O1l(2?%vlC>Pu+FUAhuk0e1OWCrRy-1%bX;TL}$!EeI_;;b5pv-aeN zXP$(DHs`@jM-Yd_0s&x7BqqR-Xyld_JX5$Y6QzNaIQ(vY%nUr#Hb~2_Un?3K_SEH+ z)Px6eLiMqZYm4Y>G{UV2;3T+wt)VP};x7e`{E~3wmnVz)nz${2v(dX`hwVZ{f-ZcF zJIk-oQ4-ihLX3ak(n1S=N~9-A#P9J07sm42eZ(6by4k?Vk7q4PbuaRN;`R1kqMTiFDXv$ZgW22Y4o&ihbgrlj$S<+O=~l(*%jM$pPD z$Aj|1z)}O;N2p0igb?#j^R(gNCFoO0_Sb%2EL0xZ>`9h}2JiQDmG-tjxqDIB;t3{W?s;r4xq8YMyK7g7K`wk%rQUC#H1_Xwot)bG1qY-o-&5Xs8{@N(oW6-U*GKt#<{dwpt zQm!+$vJOAHT6k;WoPZNl;e`sTw_$2A6uGhfVl`_($LvMeFS`&VURjBQYppq-WlV7l zf~Qf%gFfp8GH29eIT|BrS(A)s0OUgFAy7r`K3jipqJiU`BN-ns@VE)7QStj-WrX(| zBMgMcsp_RJl{lGx+><&9zSaDINVJxzzWR=x(?;aq89e+CF$qF zSvD4y6puPHUf*OngN{);H;OiGjw$kV<2bTghYrudgUj!SPD^%5@ zrgm!Nl99Pv`{w1#AJ+6e!btUwx{!f^Nf8V|N8N&I0C-6&-^D@OD)-KV{p_vX%$0v? z!?FmZo4cASZqKr!ccBfKk8z(G+SNT*YTo!RM!H11KW`G2xY$ybe4WB(ygFCFY3gDw z6vk;HhFc_JT;T+dqIoO?1}_)Hux6NIEyg8t5H0a@NtRyY=rC>4Kyd=5=fuMAiYj?# zbKv^nh~XD=$JFMmmbK7DGHlKcZdZTm|D8RgXq`QQQ_AcoT+oZh@8F$E$*}BLje2y@ zu>o9bKiKI4$j|>`Mj<37Mi)!@=3U`TVe{boI&Gw*Y-Y>=ntiSdXr6~C3%Ce#S3u+1 zR9bro6UqBR;#D{j$|Vt7vc4KciwrXfRa#qHu`vuUtAsF_@vs;p$Nz2r2$Fx;ij9(J ztU|4&tLcLJiPc+@3eA?7GvE&GNb$TCIzW$RFs%u5mRrwC&5?HUdU?A*G@U3S@`?>Y zwcr){LCQRvP)a7cYpcb;!%_LSoRCQ>|G4h&kO#XkF&v zVFt~m6c?%%o@(h`JMXUt_hux@q2{h~zm6teO}h~5iBzQD;JC$`5gyo$L<{gt!!>h&U>2@)k8!`F_X+XBftw+Yub6`# zJ}K}_!OgU$=bLQevU;3mx0Ku{+Og7+Tx_pI&A)l=@ipg^)YX3)vuVREQY&H1$&mhX zCCLHdH47Wa6x%e#L`;rd7WP3U`weN^v{ z1cw}G<-zS8Q-*~pG!jd&*%==h60lw!OnaF>C$+4&VgvBbV+TS)u{3{0>N=8gH13bJ zjnQz7p=<_*HmfnT=plmW2~^AJ0t}7GT7V(7NsT-x;A**I58i~rN7Ox5KW#}8jxyG> zT-@5q*4Iz{mXCh{_|&%U?&3U`Ytv@$>fXJ(4DHI)pR0{#Sdj4-d8vZAOrYSA5_Po z3b_ya@8PN`p8g*k<@QVk1#yTN@!7y_jK%1c;ZFZO?tsw4 zF_6IBbAx{q6Zl-_tlv|T+f0<%uqCHevJ@d2n&*w6cx93+Box_ux{vF= zIOtmM|kD?ig(JG_n=veHLdsvc7&=26!A+!%5yXqDNk2(I`M- z@-USUGSd4{#1oC@;tGoynO^X(5R8%V2w|h5(yXjPDd47=K{8P>QT##!8mXd3$nmKJQZ1jmNGM z=d>m047reB>wcVg9WiCKBhOVXJueZIYIpEDNhCKz$WD{N*HQF)ClrD zGrZ!E)eO*o6UO&0qoAMzY@DCPz>I)8Te!Ye&QXU9s*n$Ygg!`Gjij}df`oLy8jVe}m?_&^T$3u{W1# zotUxIv(dD5lxM7g(iAaVv4um;OVd`_)7C)aAL|5vgH&0I{$@!Gvf8SWS-Yd9BAB<* zG}1BtN$n~MGSW;jx;H-9xnqBYt&qvB9lgQb9_hlC_$>NCSQW+->P6s>LoV&Xqe<;S zaYEH`I)|!G96^vA(@jX$--)}!Ron#={eQ)Es$%gaCBbYEPZA5G7K+2dvZxNBC>4z%A3 zguN$UdkX)ni;Mk#yzAmG;ZpnWzwVkOs9u;@0P%U-IGwE2Hd;blD@=u-eDcZv;{Sg6 zWe#t^%hBoh@|WGk`Tw~%ow8HyZUfF-6mw87oMmtL-$$R}iafr!e2gEDJ{ykT;g3h3 a9ZiQcf*4M!eu~B1hE^aGry9fo>VYGYF6^|SJpfIWL+QXi+Rq4(X7uzKF6J`0vD`w@J^#pf!M0RxjeL5hw+Be1;9B6^{x})4eV)gqH z2tMJSp2)6dzHiyny@5aVlU>D0ZxQQ)5g=Ik69Az9KCdLNSS#0}##nHlP~W7>U2gNd z4Hrf!1Y->Iaf#Yzl;fHFqdn{@zeVTS_CQ@G``K1d_JG!(pth)F)S##Y*_(1(zKOjTLAPJ9zw`c*-WXqJ`vYslPIMQjWh{FW z?jt3nifBWlY`-TSYo4^S(V|JbsUO? z!GPr*zt5-uKfIKB@wA5S}HXc!>MDqc~%_3jRmqrc8rJy zgSlIgL=?d-98h_BGT1s@>5%PRMJWV)$3nDqN3bLrn~d!P$*prEF{moj`H4eA-9@Z! zR042$_i}Tu(2Z#r(R0HNu;rz3d>OwJUmGB|qcog~;0or1Li#4HkWOq1-wx3F<)GEB z)Ku`BVdGa3Sn#UYM${8EhjQ?1SLK(UcN{e`j%JmH9%^U0UUt+@o_46((gc_>E^4t@ z4;W4LTk8)$3k)7)dwbIb5j4!$2o{dmMkd%?@EfFn&62egZAshhd%kiL^j8*oUb0e+ z_}L~*E)DMaCmFYXqLlN`u>-B4&i1*WBiEQx17#|Hls>6Zl_?!5d)q}d&a`OHPKYkW zF&#nZ<5QX21~&q(ls<d%IH0pc zsq1A7P-$^;U^CNj0sd)2VwL96$~akoU0V!Sv6(#(pv~*3DE^MSspW%+;d1`0y;GCq zGwSsnr`WJD!b?S$5L!M#R{Vfr(Z?##me(I#cA(*JM>y12@ny`0W+nTuvP9uam*aGL z(dI=Ur}N{Wc}4QeIM9Mur_R(Esv_>?btF@MJjBk>qM?i9jgq&Db&y^bHljnaQ!9`_ zyWt9TzQ}PIq8Mb%^zmW0!Qr?-wF&y$*)ppNZ6Q_T)t~n{%m-h=b@0a%U*>Ol_Rp#k zO*|D^N=PHj=ck-=m25240Uw?RTbviN8G;Xn&kb!E;EV?onivP@oD>-4jaXPv03#aGw6|KFX z!17Ms-{;(~S~;E`CqG@#*~Tf-ClNdjy=Hu{p`*9tfv852#+hf+*sZIjc=zQ}^qQy6 zK**%wUCQ5j7#r6ihd~~vOb@x&)k;w`)wWUcmkh<7{S>*2 zk=~_PK(Yh8BClC#sd_{lKenKazjoUzyrZ zBC?MmpG@YeYuhKXzoXZ(wr|N7#R})6&cD_!ELWVWV(9~luAQ=J8sRsT=p0~|TLsE| zvLud=>*pD~ld_m^L~3Vo6Cr|Z3TK%w>d)eWUcPbIS$f7R=L zDNFQ*PUnphgvu+b{0-*IF{}lT3kug6A2VIoklj;DOZk@aMp3^rvy`qQER$Uq)vgIy zhou#v2X*0?eycD?|Tf<>A%0!A)b-;E5+B#cVDQi7kTo_dsGF(ikCpGHLI~ZqIoeYawv&W2&4twEWiDl%2vEm~7CYkbP~vHO?~(L|yUWe9^*vQJi^~ zIiw(v;(|0izW(jw+Ep&$4o)R5zv31q_NblWA3d$rM6F-CtGFl)X&$5l9e#?Tahgj%)p123U~eg;KCf(nWjjU>a~9(<;C%R zQII7mbJmA{A)AkSe|F$@tHQM@L#Arb^qHLrX+ezxWUWj*kc2WqZ5pz_s?Rpv0;|G! zTrAFoJ9AN?Lh=T9y*er5L``O|?viu!iqV!mhk9hUv1Ni-?xf1osksV821Kmf)hU=5 z=2o1+G2LdoU2b9PFBB*csGPH zz2547?wE6R(c9dxrfS}{CbkhczfZaD^VfH#ESA6DUfcs$UikPrLbMkKOS@y@cMQ&o zxZhvD3PG7>N0jz5Ztm;_sE}5^S1PO{9X~FbHk0a&O8o|;cg>2-hnfWonkm}V?Tc;e z&u5YD>XQuj}X>lpe%EOoE`nb*uQ;JrvM!VH68mF~p z!U~I@MhC#-5XZ(?NUO(MDy_%vtwk&QNv6!`V?-8*bVhKMg|RX#RXJ6^Dj z?Bzqfsp+!|RWY}7Z~cdv0n=q~e!YNM!@NzKk6~wtOkU$*y3Yj#iia4I!+p9PLi!;U|aPMkX_@&1?RZbZw_@>ln~Dv{)}M-6-K&JRqYI0Vy$~uyg$K zT&j%dG>6rgz4LmbSi(iD3W;*4Ex@RhC{Tbctn_uUPfJ&R&FNRP z&WRSiT{SL9KF_#^Zr*riQcKay433*wtp^-LffNw!7@GI0hg-^HLpsRV^9q^e-TA!p z`OQw{aq0F%ti$@=7T@23JOB7lc4M$_*n+ujKg?ydoE!aJcIqggB;}hAdY^d>bN};uw@5CidEf8}XG~HFgTaM@KcZ!}ZYfCO&iIRB$H6@ug z=4t354|5cuUi71N4mEXcOPFKY>Ob(QuxT#Og?We#^JaR_-}92S#TxH-MS$|~(erlroxluzqadu-_u|rZoBJ&EuU0b8zE39jbXD*qp459a-^W^Dm93Pe zF$XNH{lbj+2mN1bP;?O*n~ zNTfx{YS*}Sb`ixChV`_B7XOl+J130L`(ap~d})E@wt5L&)&g2c9H3r+4x@$7gWm4< zyn(T^iJHndSBr{*1MKo-7Clu)Izr0LzXwEmqO-Iz46%xkSOyKkBA{w_DBoQ3o2^ZYFro$FRL zyXZQW2Pre?q|)As39#H~>dl8%ste)Q>asjjffterQ}Q@fhV=8EOlBKUd+S(xgzJ^-xS>JmPNP@v`UZtu`l$jli+Pc1 zNRM!rvx`br6!^^5(cQdm#a-EUaXH_G!zymGfN=-zNaJJsjcsoar8@>Xy2 zX_a`TJ2@^#j0*oyz2mnVE!$g^6J}!gSXyvGtc~-o$uVJWmE|j0IbbeR$!6jC# zDgDk>C6X30_aN=WpsAOPYnN9P)R)Y@I7+0;O<`z;vvi1(Y14opChHsC=od^%2W2~>{f6v zz)#$mDU`}azN@g}-6Q$Geyph%eMWNWKI^%Igm(tQUwqJz= zH16v^6D5ly{1o)|_ng;^X!Xf&3QkZn*p`*uX_WtHb>e1Mx(CTc2&Dy-u$+u*hV;D8 z3`~Dc-&~ganNGOTES>aaZHiega2jIsojg@>jF{owQk4lWXwd7h-3gva9Lrv}MW&vuz8cIlG;fNxRQ~|{3{%IC;+^v&o`!~-Ih8;7^zg37 zzRvgmB6lUiIX??QoxG7oYlp6fe~)sRm%Ao-%l(AeI8!j~Fgd89@{_&qkB>(Hiu;S~ zhbc#-=fMVt>ca5-mz@SrWw;5$dlQl-I^y%S7v}*0>zEq;L*lF#08n6dV4k_Gb(Bv+ z9$y~Q!Y%)t09G~cLI#A)n-m$026!%VLS(U|Y zapN^c2l$hM2{`vB4I3?;Ksb<1O;#*I%i7d?oId(S#zPG)>AGamp-gB0F7jEH&Jpzx zajY~od`}SR@X?exLQb>x_b|5*LvjCRJ>$`)_b{_`K`Hz4W+Aexz9i7H!{^;ahZiRa z9t+P~iDrUNLwOgf;-;x6b!KpDB=qt9<8Z8x@<`CXxx?(2%GdyS*dpN5&KZqCKx31P zwYq)FZlu=eXwK|8rqrKNtJsNB&ua&JqiBHi9ai|8P`n$S7U#Z`PsgW4+e!sG4g zeyvo6Xt^@_LFkIp$qrO5rY)V^cCw52S7V*GKNH1vfu{B?N+X=i?(7yiIuZ9oi&xyv zPa4=X%2MkMe#iS9son-B4R2sAJV1uJBbu}P9L5}48M`)fTImpX4(`YUdt8;WK&cF# z3tDASHCvPq!%C}Eb@Q>XOL!GO|AormKiQjRwJmt zAFK)AyQjt%rYk@W89$^dRkf9VSiZer%9X-I7w`93Qv!zV&NTh)FY+$FZ+`H!+&us; zP3GRfFrY21&dB+Bh_rDv&o6wK)tPOPkfExY|C38TQtVXxP0f=3W?63}u{MWIov{S>D#<|5YEbvJSNy}FP! zO9bN;j8*ZM&)`KSy&l^6Imv`g{=PUdQhMbf zb-*>$_r7?Ws}9!I>Ve}v63mZd4G)965CvlPzJZ?>^x$x70B@*UZrkNGrD)Ul1bbjA z2J=YomNs~sKB!|mkkkws`n`^SBVqk<;;s3L12OoXLc;}OH{3DzmGGKO=eOv_{?|IX z)T~?#iqsxp`YIy=-XG_43l$SFU$^(pv@rjf3#??vtaR~S|LnnA*Y}3Z@oXoc4Trz~ zN2=0EJmzlOM~#u#1l8=fox}q-&`r(0hkglphxK&VJ+^sXDYQzXb@|rVrt=L)y+-Lt zZ&>}|1asiIgL50a`d31jsRe*|q+8$^WVE&ZPsj}2GH^d!R~U`FQd-QcOeG|oE#-=* zlI7To@Mj*@1?}bIH9A(oDiX|UjU*@UGfXI#*0y->4_LZ2Sk1nlt{ORzmrYS2(s?tZ z{m8yuh-yC2NEr*R|H=H*M2gV%gYu~Zm-OlTwLS3=C!T4?AZmNsu+9&}v3dyF%V^&y zW1yp-c0_~IW|T1n`1c}1GzC?FOq6sqJYtMMMe&~@PMs*2-a_lMqJHZ6*L&3gwdOKh zM_e#?;h#G;$faAE(DJWc*aM!heEk$*iaRf`@RR4e5Ns{PD1;qw_%(pGe)>jZlMY`v zbf5XzZmi%XKjKI%k^qqHhv$RjvJAm_^J6*gQBRbshBxT^$g?INe>r78rZ2h!nv<;O z1HB1pGr;S&;0JEg?qyH3r``~6P<+2B>C0FDy-NQF?7#xu?K+{U_Bba z=n%{HruQj$N$oAqhX@%Ja{kFPH;73_2|JydAht}jI!E>%=0Zq zffmm0oxv<3gme2D<^%Qcf1}iu>Si;*F@_;-86e&Y{x5okf;_G8NYf^%y@=`pSJDvF}! z5=4LEV%-5Sn(5%=yT_vb3l<2QVyX+04+Yl=8|9xh{khUhF9cR?X54(!QyJ2?{69&S zSU10fdR!3wit4I6SL>vkjN$YuXCMJN&)>X1VwK87ltOO#fj`XB5&h zDVG=F6Te4fXY+?JnEMZJmC7D|D}9JO-;g0Mg|mIarWy$O?mi2Wg^8iHS3UXcDiJlZ$I*qRGp8u=pI^43@&RCzo0mHAUxoQz7_&^moex6 z65aRve=6Wh^|t+`ssSM7`JmqUqx&pvw&C--57`l`TY`Rsg6qn2+?Hv&eQ|{Qhj(~g zGaZdA_27(8{ydErlJzCc1C( zTk!vamezZ}efeu9y6}?9(qsoNzoi@J#uiFV#gG0px*e{%0ra8?`2oT>6Z}@&h+p{6 z|HEhf!r$inO8Vkg(!(x8gX)7Amq}IFr?BX{qWHf?*wcq(Y#;d9$dE=vaH5EUZ(UOj zwL!9>;Gb}`{{u&m@17Ikdic|t8nE0;_XV(zJ@~Z}*m>Q_O5Fc0Fr&Yi=u6H+Zs!0X zYqACZzN)q(MKplFM26&<`s+48o$*CZI8{_ibNJmF$%?DOZ?3veTa&cD|GEme@!_^) zvpG%4L58?_zFbqeZbZ1>2lIQ7Bs#t*KKKjnjdDEf3zh9F>|Gcki0SX70t8y~|NooY zYG_bSluSQQ3kh2wwbvJqfh)50{ijspp)dCczII?#-;+L})aU0{wrY^RvZXKoHS^(r zR;j|jtcnTwP1XOdt!k=4X%9>mhXl{1?2l7a+FYS7+d3wesWZI`-M_o zU`U*hzn>c+@<$1~SoiXQ2B}0v4JB1K-(J3@+?Q-bD)IG$gIQ;}tCDjhx&g3-T7y*b z0*g^n(gm*hsGfR^f9qM@wxg1AaZ%z9Dj?`_`;`5)##hS=RJH0mPxR~F7X2O#KFDHA zC2tU9@7EJB0YvvVJsXFiQdUsnA_(zP`NLta;Wh|`VH{v^Aq@Bv80$R5uN{;aV?Fz) z=a;%PMp+K(F2>xE2fgd#>`0J5kLrNUQpb(*TS9~bjOd^~f{lI1 zNb7OqjV`o2ZDc84ba*ejbac8V`ebKaSp)rTLO|tR6v^f*hA%t!BSzJNdA_pDby3X~ zo&YLzgaLen{P3|U<~|Fkt_MERO^pgU5MuZ+XiOO%-gXgr%#|BuH=Vg(K`Z77q?XTnzO5qt5WMRPP2gpsS58Q@#@Et;E#=9r61D?e zu>`Bb#Q3-=RLFoMHQVoE1oH}y@2#OA%A`WT$C-CzA6#wlw<#k#ZVciH+A7-@%MRRk zLj>Z6c2l*6SQRAQnoHgxLmPYwe-m+~4PUy%@ zV@l^R{;Y_R{uu0t z3RkVWw%|owWm*>%YMvgx%(8REAnN(k;paAnkG+5=eCCSI+gB8z+d$eO3<3julB?Yg z9}ErW^Xd5vNDXgXO8%h-Lu8yGpoG1M=J=&Gb^Um6!aFh)jn30WFC_ozkj1X`aWt3* zNwVr#iu3(=7_wdfbc*t6E0pDK82TSoRs>&k>0vbvhjuEdcHLeu!>8=@_W~-gv8>y!F<_F2SaA{ z`Hb7&Y3se)$gOR&Nus{VyM~%n%}_yY;i26D-~KZ~!3bSy5Jp2FZ=2i)meM%*w60D{ z_9j#lb4sLT-H0$WqVf|?)t!LTwOT(At-%t~@RK6+dDeGdR$u+?<-^Db?_5b(Rgf)q zb#p%S^iTJvTrCDTXX!l14n0)s!M|85AZmx+}+3O%HM zx16hbO&)I9g{)PvoFfgw0Sn`$>KTWdZay%C59~rDyTQvUkFE2KruRaPmmSQ(@k0&ggus8lI-BqRvTT@o0rK^SY-?W44tT{$qoECWkVQ(-W$?3LD zKX0TpWLF3x*#=$!-)DARL7lKZ@OQ%^N0h%Y+GTohQ7PtR6O##d#f*+ zo-0m^ao~koa&Ek&OPpl=<0TRu4R&BFzme`JB@SZja!5U7J>K#ecNuCWeB82AbpFl? z$%s0n+<6A(D%)wlaPr`(m68OAsdlK5{!O5x7D{eu+7Gm({}73h^rs~x#PYV>f_0IHL*V`bPGu3sj?sffALjTM zv(ZP~#XTl~w>m#IA+{Pwo&m*oXkoi7{|ULg{9ZwWxaKR}YEz(crdY-aKN+;Va}9A- z6LPGPOkNrXsni-%vE+qe>p%Qo;LLmm+X|!FY1}WwZ4%_mP#ljH)-c)@RhMcjG@QC9 zYg1-|cK9?zI|@uGwtisC*Qrh1A>-`zA{ zk8u7aR3Ro@-o8B8$#hN(GSygxG52EXjOTdmM7BALXw#5$`p?oM6FP zskRCPJ?92&Z1Mbe=ovtE4zeMsbUk)-#<+GVjA-0E))G|(8}__>J2Aeo3VC0dCU?Z+ zUbXxF4)t(_s4tXRXne_Oi(n@`=;q1CjXPXyksjSkv#YPWSXG8~N(xtc`I$c4tICi- z^_%u|CNWefK&sX!-A6WiIyIz>o{14>*Mti|FkdxuA-6$gXDP)gvUbi=H9l@XAD zDmvP9TnVMd-lPY8qlnzeot)Eou_9?JY>Xc?Or&hJT^_P(Sh9FjJ@!^uRa?g%Ca(bI zlZV4f#Q{y2Wf5?kYsnWfWIwfZ8p#^S-TREoKqLQX+q_Ju3Sy< zJJq&~vZnhk*H6!c7vwyIn?CzR>+FaEQi7tP z^PSp%)Yf8c?@9kPgwND;mn2hm$-i1B;pClbB;|wWr0FFdnJQ;E{EqgqBCUX+qQ@S~ zmM*!mrmPQ;Od7af#1WOlEu>OQN7e#PPu!I8_X&g~b>7!y6126A;xHCY+#Qjpe>^A^BR6aumb^kL_2+eAJOo1%z*S`7b`xBxRUMl zod8(w`n-NR^7V-vI+&PoB5x(`e23mw=UMHUfZ%K#ExhbP`p{hI@l8RmbL9hJLNrzr zs7)^)b^3zeU0jD(4}FdRIo_6a`Hv|R$iC@CEQQ(7y^=wP?9jhGfZ=Nc7ws+6At}=K zfIVG6ESY;VH}Qmh8Cm}s_pAe7(NBXZ40_+GVmz{APq)}GKJ(~yEF$&h++-fiX^pe} z^=Whz3o7fTQ$vaCBHHgZb8-1hP>IDvkD8NO@RHeHc5s|6^#`5gqsMKJ zJD46{ZTirlNM)Y*fYJuy@A@oPF{<}B#HZ)gP!IC@EN&wIdhov=k9&A&|0Q{KQc34vd4W?u=IX`*y4=o%xHZaQW_Y_5NFoGAVkZ4_~>3R1~~Bbg3m^|so-HW@%lK_ zif8w5E_HQ2{&gxJexv%el7^^uU?Xsly-^zEo*HStJ56)ySznAmWvovjEzSO&f?C?# zQUWAb6%d}JQ1qv8UTIWu|JSfYc636)%Ye{I;Jc-3n`d3>Xw2{rlsufu(A2m$%x;*3 zO}3njRH?Y3dB9Ju~Hi9@9ypDnKj1ZPW^pM zJ&`1S^T%`bJ2pYrbJ;pl zBG<_z@H$=TF!%hK5kwyZ1em4isc4M}Fb#LJ7>DLvh46*takcnhUk==JdxoN37 z0j5OAYl;cKjAvy;66Z`9s;C-_=!!DbN9@GZAL3giz0sw6AvN5ETFsFB()DRmTFZ@uxG2MjKJ>>1a?vO>tMw~YFiW_Ys{E%6>oeWPgSqv zN^c45jn_?hQAd5>VIa{1K4B;*K2a3fzJ(I#57fou%6D#DZY7}6Ne@_XUV3#!utYOZ_nQyO{+A1!!Jon!L@|TxNH`J*1eT~ zmKw<&Hzw#8>XGfzFi(a4_sk>ez4y9KbAkCoL)3@Y)L3novFk$hkizZfdL|XyCpU{& znr|-{D+7CXnU%6Pg2t5D@hU1NJ#?PQ4nR`~hMkPy@ErD`KIZoz=E^p4caYB>ENn#> zkX9e`O0VVt-;vJsGhhf-<_{Z$J0Ud>=nvL3IuAXBla$kRK=ah2mABi5tg8h_AX9O^ zV4wJ*yslXr=6H4uxV zTNZPWbC|m^PJZA^?KpmnaQJjU{E<03V1!t*J`^&f25Zv2@{FJQlRwzyR^4p!p#`!0 zN?lEHy?Aq$z+Ou);hS29cX7HNc_W$IlQufnzZ7sJ+JJ%nL{$1T2{_#1e#1Az2{4h79J9al;7%K ziwle#Nn#d?1n)OU)uHLM{7_Uw7zV9Ed^IVTJ9=>w#G`P2?*1|Q*S0{z4&dEbSsf)+gwU96D{kQk+%`WS}sc-GflxR*Q zM@lZjIrRNM?=(N3Z{2L;{}VE^k#i+lux^^6Y#(I%;oB1Ma|n02=UbTvhp&DLWazb$ zN&J5@_6Vfc#{Q3)O#xxP)XhNm=cOsbQyDQ`z~7lwTG~6;RnY5oA1g@IR2O#9_od(x z?=y=!1#97q zXfu8nEfUKgPh)1LEXALImxO=8X!e{&q*2_>SuZ9K`>0pu;D`lhFnDM_VsSVKW1OU<3qo9|-zTmh7YN_US}6Ln|A~Hj1btwK1{Y7@_SM zlQ2uCyKmQhgW$zr7)*Ra`Y?sRt9RDM1H;Es0TJ9RMrw^_-tfuL(JTeF`_aOy-xB*$ z@fqrCn7qMHRx?>8A%IM+;lQdQf@$58Bm`}0&G;Q08*0i$TsH}W5uxYEwe9Vt;ZXy< zD4`s@toT;ZkbQtK1&47*9xVoksc&pno+m(MkW65$yW87wuW2|v^hEiyCM>z_rQYeUu`=u?aJtzrT(1!h=Ce3J|^VQT<39B5Fi<#<{r!YX3afSJ2dRbEb{&X$P z`)qiPrTB693d~$~>8{8=!-&Bc>=lxOB`z0D9*n7ryZxdgg$c~uC-Z#&57C}wWTtmF z0zR;mfGU2vKfm~;NA5><##`J^uYMP6$Aqefn^_#T{$(88yMCGdBxnk)ey{><>>(J7 z9X?KWeQ0uxa@Rk)G4qxNsqK7Meg{b|Q+r=s{a^>FHz4(Ur0s;0$pRA7)Ykd!QLT(% zE%X@2aJiRk?VvbTFk(x;Q_s&mvxz!JCTkgn@%C%}Q__|5KWCJ7i!b&o1&}y;>roxp z!q4zcL0*DLDKw~7llAywJg?Wge#=b0$Iwv_nPFChG^?vF!Ct4a2U=&Oxz+46rCa4LZ( z_E~*oQ(K+K9JM@DGoe$7&6QiqWkP7r>^clRLvN;mKh4u;$1P3uq8=ArVpuFPA3=o@ zu3)>k;GsR-YQc-)@#&*79^v1mN@uz*NKRqDuF4XmWMkY>ia_>5?Di4!MMD)I7IC73 zhO>&QIR4CmI#SMBEQo*bc;b1uYm0OKo68t>p8Aox@Xz^Du@iQ5_gv%Iay2Eh=tDsN zCj^G`rd%?qea&H2#94bB}u#v<68+1n%GR8i_w7JHf_V293e&qNL&s!e{3 zclslB$tfm-_!GJ13HLXJbO+de`v4q;$<5lvGQRC)oGg(&!ml#lP_}Hd+|+_;H37hv zO#J(0ie4pshxz5QmtQBCvpCUh&;vGIJ$q;HSiv+1C{GFoBH^}N2D0;uQw`Da5KXqp7!VGO&twliC_4k>v9x1G7e$6(_@PFN4%1?asi_#I~b8YBWB`Y5M2RZ~Q3HmE-3eu$RD%hAWm^?a)r z4CBK=e!uZAR##9RguYd0fM!@#?8NXWu$wYtX<|r2mX=4?q&9-ES9;J+Meyy*>i&Az z1xbslEPDWR#JZIwP|W)y0P00JuZ_DlfMmp#d}=P=Cw(HZfswy7Fd;qgC$MJaYvs56 zA&-&>zqrt6(rq69dxb3yt0KrF5EOR#*wf>;k>S6|EyaB(whAI>a>Ae zWtO2cgT>a2_M{V0ptcx8uR|UOW{GlmBBb#Rr)wqkdOaWTTX)s&AIv=HkI5!d{BMJy z|ITA$=qU;tKOvzT@&+m?0=5i(Xr?kW$ybVz@iR}ll=^^*O*+2*0Lc~ZAe;LdR}F_q z#DmbA)8hvQkAXlWp@DCY{qaw#C0Gyr94LR+bB5*qO+ zl7#`X9pVw;iLgq*RFK6VGJa*G4|*^$jt%t&Dt4!c96@t|X=+3~S#dO_J;<1g8k@!* zpB4E)ZgqUHm@XhcA9*oxxoo8zzsd4La@WNqShcEJe;9)owr}S!Rz}__J|C!UzimDV ztAD%^{Le66ffe$O+wMOMDAp=&wb!bS+m2nYVnv>mP%hCxI)UWpQ8LRIvVGO~CM6bH z&msQKT2rY-fjt47J<=DQhAw1LCScKA%uVdK>;-35%m3sV+e~bse zK6Ch+@wH8D0^YfF06{_%Ta|r=V<`dM8PQU|S*V%33Wl-zlyv-+jFtF_P|lW^-u`mK zFWB#Y?4%FwEAY5Pt+&v)V%^e1tfm>M;70Uhs(^-nG`?Z8!fRu(PcA z-xju71sIFVqQZShwa5OcNa7Q_hHFTd$hxi#c&k$lPbI!7dR3RRxd;Itv-@{Iw`gg1 z`S{0iA+a({YmnKn1TsVAe}x9K^0EE66?qMeisL}iyG4XnM_38;qXDGlfm7JgH zT@%*b{8cDpl5_N^f5#(S5Bl7Ne#$)hW+>$4>+sp5`A;tBO>RCq%v(?Zb(TY1l4;PU z_mR5BmC8AKj5p!^z02Q2Ew zjJ|w2Fs>eEeY0ijPU3)FaBX{J%Z_a53>65+7QZ$&r|b-!H_v8@;a8cL`pF5NNG~kL z1wn>!1%Y2IGMLhjjBC!!ZMU||Jnbmjwp_AE_zX^}$7|FJ6HK;pr+vL*|3|+=-_Y;a zcLMylM_5;jBLqfd2wxwcC^KYdx`C<>tymnXpoeYeJFb_ipM*B?jj5=1T@idLsyAS4 z(a7nL;v``p`&Wi;hlvQ0&Y!Gs7jE*;>q8d9pnT9DC}_R*PT@<)wcuElo~d7a^$sF8 zxS&01f@RtR%Wff;5br#)YyIO?1jR*S6Z5l9VTh(jeE|i#EZQCfMsZwKAF* z-Q9oBPE&_ED%N2-20Y|b6T?ZH$~R)I-pxFEzCD8E61F1dgMIcC3DfO0L=UF==+&f3 zVIFzxtLJpJ_!?T0C{lz~A_kMT^l3!s}7D9pKLj3d$Le1#caHq;BIO-?VfSNTA zL4DCo3&59V%HVzaZ|$8AI;TFEicBL@09{TzWJI`{;f|+Z&g4=EsT6uXobQ*Ph-A_} z>31ynX_4EeQbihyP(y(pPs6&8Y_=y7m*XAij170L^Om=L8g4PX(%WMs$FoPmLh?g_avW(68qCEDLbkd=nBs~~Iz>r&e zf|@HuZ$>{>(JpYKohmHDh^Ui3G6{>#1?Nn1>VVeeN49-*hI)aLv1q(nWNP!nih||h z`a*L-BNa`~^gCugCR`0r4=@fZcYYmwTLRfGx~7HF9XV z3Ms}ksh<;jiA`ceQQQpYU++zjh0Q53NoS||_Hcn|<2swzl2gJH&FO@kC~W-rRr^y_ zXvaB+48>q@AxnbE@gXB76x`f1oLN*(i-g4}R)But%rSrdW>=|;D_2F2F`t*q1acig z3L$lw?W6zVKc-$S?%*WjHRGgbrMNMxc1!rUZ4l3%NMzn1w>7^GoU-N(u1Ix zYgzWie|;H;-b*PhCE=$Bixpz%N2EBW}AQ0X3NKj#0i zLXn?8zqf5uw3a?Wu}=-H2TLVnL`wn!=A?-(z1(0_!;i6Ac;@uW|KN}ug*s9k=fzj~ znM*S6vVVs5F=F}PmRE$?=1fMi1WDl%W|(GJ)YmB4P$JVCD-?ty&UA*=$J~O0Vy8V? zX`?m6NK^u<&g$~DgHadH7>Y^m)VzLit7G_4MJ_KFGdeU8#)$OenZtyhuCj<~e}Hqm zp$cP*(QZR?vc&4EW0}Z%4DCJ^2s}Voq047zEsMWh+wWkXlYWYY&WK+@dZMlql7yzB zWe$o#Jho6crQDWH9HS;w#s~_@AiD8!<5g}6jUlR4$yPolx}F>tB6qvfTHDo$N)Mi) zosb!N0165$_4K%6;XqfELIV&Z0yyNca19SM`N`&2?*HEW~lW`0?Y;{fXcS zXm?hRg>#JBa(hcegRtMkFBFI z`LVE0iZ=uJlTg1zdGwk85)LGW(l`QpH{c0E!{Fa+eUW%_ax;itFb5Rd=Y-J>^CV*? z7ueL`MRC~_S~D^XFsCsX=kc+}#X{Tq&W?RzxHwM!_@R0gT!7_KaH)SA6()s|oKl4f!o(5p*armz*AmJ~6_}H4H)D6g$yLf`SrTZd zR-{+~C***+#;Ly3ro!+_I!~K{lBOAo1rU`pI8c(rRLGm|4^{-n9yuYxNCg&fN4hip z2UKK&q;%Wukk6FhX0U%=lU7L{knK(=x&Zf2nUvY1Jv4NB(ta7Vl`(Z%(&@@PojRwm z;fa#6!{&$~K~mi~2Y1w1Vnd?hvJ)D4cgS0g$y_@=2mpG$R{)WHWLRYP0sI2T=1D;V zw%t~gfh}?3{OVhI<#7zivr))MS;Yt(r#vN~JcBpb3NqkSM=XCF9KtOKtijo11!^NynSwj1Kjn(i1IhP-qqy2V>mJ z?c15f%6oiH8y-!#O|)KT9$PC~03)J>m16cN#}$IvtKgwa`#g7vuuV-Uh&`3cfdt$( zXIxiC+n%k~;+B6&W;w8VHD}9A^(^V2Cs2W7`=VeqpV@Xj;+Tn&*+QYjWBMxFipgpo zfgHf%k~POgWkv+ zgETJuhNZ*nw?%kxyrXR%?Mx5}3i=6~Y9@dlld4n%1$jf3ST7xl7rAQe{(``H{~elR z;xii&2}6JGOL#gm`2hsrzO)66WRkIS@kAy&PR;gv_5kC*v|!P}lj-1n=6=fDa_b9ZYC3Y=ZlfN8a6oT;c=j7#uxUM5%iU4q8skBV_MlVZPtRu{p zPgWZuV~9GAKRllQ7qSm#T_Ue_%CcB9a+y7!h0}lDW4mWIRC33~qQD7@HZ&>bg=T}V zNE`EF!XXiJ#{=ZDAd6R(FM4KkVJnoL2!{y3SJacq5tt3;7RDthwu?nDR0(w+cFo>! z$=@C>w_4d_Wp9P?3e(9JnlLYu7olrCv^&4SGlg{?&MCyP+|JXJ-Fb8aB~G9mL)VFI zF>HTt#WGvJD_B-#ER%)?FR(T9V4EUEiMc0gI0ew=tcjS#0?Rew2Hmi)c*(y)if7`_ zh3Y8LP_8S_MDjGbe;Me*TC1D+?Pu+iVQ1hc4Uh;BRaHN)oMJ6S&mG1AKHzn77 zMn%r{!GlI@dzGuV3qsG7(-Mx$ke&Xe0UY01U3PF?GrT?miNSS@#gocee_fN2%2!R3~n zSLU<7$k^wg_|^Aq;8E-XFDTAdCwa21A53qAldQ8_6T9&k*j#?UYA|(_uDq|X-3sj6 zb~cb9I(^KJG`0y14XS7m3;KxcH!6SaEho&?4)k)wiaJ(F_8Rm;Tm>!$65nE;$%5ie zDf&TEK|)2Gi^#C0CP5BXG7q;$3LNVtFW|^WRL{?y1{H7Uge61c5mx zbvkiT8QDsD!ec8Gv4qJZmTmEfHX)Wk>uZ0%KE>9c+8$#}*`;c({Kh`=7Px=+H625Z zwosWPK@`aed)UKCB%sAYvvO*SARG&9%`vG*17Wz5lcr+tqiJ${T{Lz7)UYk1E%L7V zmt372xfr8FXJ0P&Y3X z`w%Dh-l+_%xx;hE!gN90xLtoFzgOqX%8fA&zPSg$yayEnpE%J$8a|BLQU^hwMHPKS zc&B})kfc5QBI%_*-QNf0NRp7vo{0#dP+|kZVWtSO71n$=7=!Jh6pYaks)nI+LP2ca z&^L$j~5qRf+5@qB)b%TaU<1lU7N`6G}rdE1Q1|=VIA+QvCP= z;hJHU);%IYgs5S&)}KK{#IU1<43D2Le3RdUzd4`6!Gok{ELq8$M}#T}EMQPJU;YLP zbodHX-dv#2+0tjVe2?l2xTno1nU@T4Qv@pD^Z~-qA?-`z3nLXt7PME*24?~Nc<{^F zH?XhmF{IH*{vxfP) zdy0I(U~COyyK`O;HU^-|jY&Q+L|7HMdBDetaoXbToqVXR;@WPhGxIK?rr=EDZn^29)+pFVXBfU)izC&9ip^7%{#&C`h zjyL#?sk1fy6mEa(RXe&dNAlvvQIk2l2pPw8(QA4H5V*r|0R*rSphMC>e3p1HxUFr+ z3pZ~84n%-0ta%6;u$5K>$vqudYum%iOA($lY@zokW(YsYPnSm{V9~=H*BK-028|#C zr3VjPu=|3bA?gbbOOT5!E*Dv>_cF&7SuV&S%gJydWv_ogPedjXxMay@X-01z{5l5f zRWDm!isUqbFBbLW;df{ToXr8fE{P!+)mbYSs+=`|Lt)Z=x3w&7gd-N5 z%ZocIG)jLWcPyI5?%*0vLCzdDegHT{AW7*CxWl1{wRtzo2AO@|90p||u*n))JMt+e zrOj&A2wF}kPC?j0Tfi(-d^j{e)F*5dq)ZexUVDs=3m5G;tBC+HQoLPB1;}5*pKJ9M zM!WioI_JJ~oiCrs*6DQAppGJ0qc|5cS)9hh5{`ec{;Q5*QgomGb8S`@w>x{YBa^ioM@$HhRuGvcxSWFg{N4)Pf1uG6wc9Xm#+@2GiA-EE^j8H67w_--P*F zykmdANo8jL=9T$RN*ODDvx=hYqN;cjmBkaUZa;7U;)#Knm{a7!9W?EqqBi@@G=jTQ znA}W8c;ivtg#_A`kMIIUqUV9hax;NUj(~%4zhvHu=Us(TKn;&}4GXlk3oBgTY|=%? zy92Yxe!z{!_h=VC`8uIKxxF7qJqN9tbGkAc&MvqX!Jj>Z+q>~DZ^@V@Q-f{7@ zBY0)uLKZ7{@Gp<^mU5#B6%htQc~#bX%?*%f83KYZWs~GqwBrh z6DN(xI_k!XK|ux3g}wDnF(jW1dg%_CpL&1?vVlrTuvlZ8$wlYwNs|ky)6QRJEA1Sr z9>CSYvaqU;4EV`WOS~-9E-Z_Rhe1HIj#u3AjQ_Sj<4G2+&TfjAMM{4QFL(vS1e@gT zEOx7ipsA3le9nyZTM`vtCAd@vQByKT&_a4_?|HLieV0}Yn|0D`P^Qyy)^?p^mP7J+ zBeG^$ULi1CA&)!pftME;wGmMJJMcGA17{h)7AdKTz{jS^L@ts1ua~6bBTGq*S9T!k z&mgHayf|~P2_e-61a*Ifl$=15V8M%BxGY0yBch3Vzmjl%#^DL}Xr@Cpep_-UNr44^ z&r=qOq}yCXM(Uzfhh;ixIU5O-qtGGPPWNCmowpf{jebfP0;8U-H4}!QVNyLHB5NbH zY_(@%;5h2Cb1J#r(NhOf;>!y+f{Uooep3Ct`}nxKKVX4q{cnGcA2Zx=_|^^ITzi}> z0D>LPOkbaC3w|#t?ZWKuWdC?cE_J;nIO%U(`%W)~9at#sW7~6ZTWmbcfPlri48FoZGnELEhmw&1 zFLwSoelt$al6k`m)HHf`2B@aGpdI}V@`|I0Z5Y2vl`-%Vlf1x}`;x}p8}Lh=qqef4Z4 zeDcK@(M^9Kj4yH|IVBC5LkD1v0iOzs2!pXt_uXK!3?dFF-ECJn*r%EaH`TuZW;*5` zwg#D?k8ooIrAB0L$gjus{4xm=g2_qKM9u?j!jI7-a(U-V77rHXi*%AfN`@{WlEK*> zDRpgCX93xaSPfM++QLgI9S zK0BdM9$#8UdBRI}!aQo3t1JXQ1u)<{;&B^3=T7Nw;)VN|udFP4w>=%JZ5}cYb?l#V#=35VI>tRF<)pgt7Cf+~4IYSr>|pk|sACw0AUG}$I9GH)zYIC> zU}`k+E2#Wa`;H5FJtgSd{{HJf*)}i;kSQI)^}}R}PrQ^pvU#Yg?eQg8@$T-C(6!-> zt!q2clTe}?VVn>FN-+@NwGusFa>o<*dscX&P^1GGC*_g2U;G49;uYk#{#@n-MoHV)^nN80nG4p20oD8Nmp@o+Rt^AIJ_kU<|Yl zZa9<7qG5j#9Z3{+khb8NEfjJ`Fv!zH9g)faCl=}$TmA6g5J$USl45-v84;p<6X9Dz zln3n!`*yPPyUAp|Zzj{+B843?UXhHCa6~RgLVJSW8xB$}<@;2@O<4RWgP=tbWmV$l z161m}QKGIO^FAB}5Lkd1(sS+|IS+k`fO>sB#(`6_?Yl~VM?SV$SA`>@W=E!ccgGD+mAACSFp+CKjFjcR3hidJG}JPJp!GE|1{h(|+Gw2d-LvJ=XZ1uwrZ zRIux;NK%+_IR^X{(Lg6j8XI3>L*ES3Nhxbq-YHAYjTV#?uqu$05=g2dK4&dumY|U; zxca8g#1vBC*Yv~9ssplR(k!O%xc}n^-*;Y*#d(H*rXJa7DIOo&ib%l8ea;p5fv|-< zpw%mRO9|O`Bkh6O;9N%@bu2+QPm(xF9ktpnF)`l&Huu>2Jm%wVRE6GfsFahydbRsc zDh~+z@M$6Ji*Rg8oJzBKOrAdG2c{9spHJh|nZ~4;s|iJME1i=xa>dAa)hKBw%Q(6T zNogT}XsqY8C_3nqeRA35rx*p({@A%BN$+!P{ZfxD>|AiY)uC{KRKSilV&j8H7P*ak zlIGbe5m`-S`|cB4JH}>C=Ky=mlsUuBJ*6P+2)YOL6ZhWMf2%)(e>3OWy;nFz8(!Y6 zp@SMasM%ZVG^rzv{xP|9QIZ};uhWCBfQv+b%>YZ{Ui8_xImN*twB~4IEFwEy9j} z`#q^n9({eh#Z7luGzP|u#PpzVcTEhXsXdvVfN@Uuj;1zks^q?K zvN&7|CX4D|IV-oJAfG(T=c#nbul(14?6^xb#KhbUM<5XaN|&2hbi^W%0{k&g%ET^~ zOb&l{|5hr=fv=!+kvK6~XwzBIR8l;$te{ksE<-eh(ePErHu8#+0as0CUT3tR(0dw% z-Dfs9_<6HEK}Nmnut3~~O1lq ziXt-@P0KCc5TE&m$fs(l+=^e%%6H0=^BoiLtQ08Gqk~!7sNf)hCbx^N1e42u>UKHg zt_->R)=WAr1I{wpb!Usl;9PeR+5|byq{%D)=EQcYK2i(YkUqfs; zj2wO|H zqvV6MCywk`uQ4t@wQPX`heWo29dplF&Q4fA_=+F#75{*>?qL-YQ&=g&sQVRy;Y4|W zR}AS*pnDN^UP=e(j+bpGbYPzCv8BPSO~hjDFi$bFEZHOdfP5t)KXIm6;?5fzV|Oez zk>@IcR|Tbwzazfx$bv4b#&Q*`8kx2RKhivI=Eo1pT8C86l-6wU1N@nPxg)ce% zJY2n{gM(vZcNxB%n#b3(A%m~up`2oK1=ijea62Cf&traIur2$2 z+#w_+1WKofqbsG!q3im8@kInU($whenMXlV8p{96+qrKyb!A=t@BW?wJ5)X^7QT># zN@RqFBcNi60KtKz%D6ztvaPZ#IhJH_jQd&oS^CNPH`m&?Bgsi>bdRo#!bj(_&p!LQ zE_2N#bw1MLIoQ)W^OOxf1WTUcoe59y=%UEUQ^ff24!h$t8RklVi+>6}EY%Mc3$j9g zW;O!F)b%hV&7KwXxNRFsm_C^S%wa4yl=DuXELMql zXzhocq>LxEucnaL0E+13rXtBn3QgJ+j%Jh3is90H3YymP@)lv`Nu(czY(~N4!2E4t zxfa4RDhI*9FD+|-VeGNuj4M|VIEy&r$|c0VY%6mmSLo*8bCK8_WZ*P=2Te2PcVU|@ zDKBTu!h>iPmY=4^-Ka)%h_gDy98@#*V)w5wY|UAk*zZijhR_X*`_=^hyLb0-6XDgG z;>*&}yM~x0be^n`$Kiqj1{t9s;5ZYaZ)p6DKAqj-tAIoUr1*vG9X>w#?f{NEWmg4)U7FrBd) zc}Yxm@+dD>`=1r~IGjdye;81_TQNNBwHEe7pUSJ?rvD_0@m5S9fG}8oi8}3{D$#>^ zLTR?(u_RG{m47WEcy8~)E+XM;dIo|70feT+AVTB0mt|Cjdl))K>UPF~25aIXbB+Z{ zh9o#ugP?Mosj=LM6B|pxiG@3Lffa}Pdx?5z6pAg4IYoa&Wxy;s#t9$IJ6jG!`D42d z>dK5=XH?jAXe63&&awj|C!cqHb1(lpZHH_#Z9VA3~`s4r?&O)ZI?t8q$c7yS-o`C)>3-t*lhwN6LO=R zn+8Cf;Ea_?;n>+dn0$EgSQTle0}pxAnsOXlOx@E}9lMRgBE5czWO%lVwf2Cb7vmh5 z(F{(1r9P4*p;iGms-2yyQW3nU5Hba4&oGS;^O)j)u=E8?OE6t2W`!`#1W*~KE({fv|G`s@ zmAQL!7_6ZJS?8;95rNpRl4TWIN*Mf>YcSL^{$rTUTr7nEQ*$vL0dttJb`A*={0^Ef ztU&_YX?Jg`W&+>EFXUy*xA5BYHzaMiWtkNMT^?lIi*8J`T?OF`TV77DX7YhREig2H z_M5mSZ79Z+BoKc0jkp|{FI^Mww}I`f@fOrC^T8Ic?UeLD^NrP_T151bPZBaPUjcso zwy88f?{58%|9W%&=J0?2uQwNOrjH*ze*CULXFpEkFs$I&M|T)I z!>`|F0QqoljD~G3$c9A;UgGRcBW@uq)=SWbvGXOM1F1)9wbk;>2{nh0L ze>$r<=^$L^q~?}*)bZ!;Vt5m!P28U@PYVFhmQ)n@=JeZ}0Q>(yFxzs&m* z>nR?-I_1(*hRa=Vvh!MrHd}u){^HI0n=jVBXuZ+F_>1);(iTVIBt#)1PCG=E150ou zLe&(u93qy8kP&Z@5i&g&BNOg_<;6Gk^G(6UEi)j&!af&Ht1E_!mK$5g_fNNuqaT9k z_Pt|s@sC=zQLZaYXirug{rW!K=YQ2tW!OuGU3%OM_cPpbWTn+5}@9W|m!l+oI!TUpQ5` zw5(-CdR)xZ zp(BhMh}v`a;VhL2reql#5oh2%r8RT5r#ueHHM5(0 zD%_Q7*&UBXv`Tvybgn(`4GrPyk~m~Zw3b6e)4Dk1A3!7V%%;xp&vM!fs87Q$>-!h% z?k|Ih#kLcJbe|G`7}P%_Jj531O8BqMT3m)HocGrE;-9aipgvz4ojLiC^gNLq_s|IP zO#j&?WK`4j=*(lGJM2Ewq~6kfV&pE$OJT&<@V+QwAR8SGdlzrq(ax?FDSz-&(|R2g zY7Ww=(&LPV&)>rY44TYEPiq!+h|}aF2oo9McL)mBl^CyoQLgX+mZ%9qcsk4sy_H{& zjoP`f7s%N6v4G~d4^aDT6+6>{E5}$7_-|=$83;pB^s2!Uj1l*Pz?Rf?CX<$QAZ(&D4JCoUwAB}G)xyMS&7jnLd#}G$ zvJ&>3U%uUwp|q)ge*5jW>mO}~<6AHX0LX(nNJ4!ppQbMk@8b`@s51Y~zdI}~SGK8c zTM0CaH%?IkzbJu!a|tfy=?>dla69806@!5eqHA*yYt-8&EsV-L)~n^u3k4-ffqEO`^?rZ0jM;e@A`3)7%O7 zY}D`k6$o?;ur&J3C45!x&)s&NDmw`mha&FK7Jw>nitDdixQeF*E5R=C?(N&#S3B45 z)OJMu;eHFYSJnDuGv%*+-=(3aA>0|LIeCE{5NmvYF^IsPxiDqngv0awtZwbSNQhJJ$Yf3`ij^ z-LgD+Ls~kt{G{Ky(`?6hYpc>$du~y^(2y$cY3^`;!keX?8tA08I*}Im3xiK3;~L$XGHI~#6J59+w+US;Ec!O8F6hgw zsfDGSnba-Bw6HhIpFh+;7O*85Rm7M>Hizi?3P#3(W;U3)%GS60=;@>OPs{8JjtPr) zNMD|Rd(!2{iFEm}Y1@(TZBpr!9;cE(2esS8LUM0-?xYybcq#!l*aWKCNnDar9x2G> zP6M5hGM`W&^&=@eVO>}t;xuL z^sHD(6g5k2K45+LdEC4rJ?BXS=7w`}>0wph9`an{IM zz9&_=r0)4KV3`A{0WuW&)tQ2bY!6=18{4My_-}>3mTrYe5oIg}hseh0L_r5bRex+J zj2+7ai^D?+-^C5j{fzTxmC4XBC5ghDjis zZf~TuCIUWBMz3%z1xxEHVraOjw)StB8sv*AxB+d_#COZ|k}I$!EiVbGrjjG5I^dGk zkZm#E+2BrX_2k*g!O$VpJBEePjQwQl6B3*_PyabPFMfTC<^KUWPZF86g#(vL5$R-~ z27G0w$wCZy4myF>5SB^SeOktUOeu;5qsKl7rc;dusS;giL1G}uo+C$Bt3^vdWJolb z9#8sTZ1PR9CMmGC7O~segMbJ$Q#udq}%*`GIj%Wp`i?iL9h^t&Grw;>vGGyhjMe&lAYq?|JGAlW2B;nlj18i#xpc}R zqm!hw&{Nk4_i=9t9!E(Pw&0XRITs~22X*>DvWKt_%FWMi9@DdCz?TW39{Kx3#?4 zLU5eIBB5HusV@qc@LG@^#XI=rWpdyJf%vj1LJ~<>m>MI7KMPC)dIIeh-8xV`^ zzrMYO9K&~R+!>ztuZyYznmwSz4w}sUft@1GBy>E!ZyV=_wli&i-huN(%=@pj%+15Aki!98M&ML8dTn5R@S_9bOFq~5ioqQsYM zzq51YO0cEtVvcC5u>-!RnB~uc4L(}gQ~uf*n<&;J<6w#$cAe1P*k`a!l^Rntg*puG zg`735$D-G4Kx-o;&vzMv*iX6Cl>k>JF~iKI>_O3fOdaVV+hdATkA?^6^{$e!l46o6 zFm1DsvQbojAN6s3%91AANB#`_oGL>h3eK zAJ$Obg2Wn1MkygA73N$M!=ucgvIB-A7(Ch2U_>l`GAvcx(}iOX7K`jakAxVEJ0D(= zS_bRw#npWuEXv z3C=B!5Lt3OknLle*XyPYcxF;$)#QtS+2RJ#J!T!jsj)#10$db((t9Q=aGiiMbK*)a#T z0a1YRF!D#vJN`6vN`~jmNP>eLc7Hg@q~ckBHAJ`zHAtdqCy$nQg(N=~mls4UuDw?S zllQ9t$n_)EYO;1}vi#w8a)_mX#UiCgzZOg>%(&8&0v1o5!BkCEh%c&Cp-LderHH@) znLs<{w;4;ApA>__Rwa;o7(}wD9TjdtGRDN5lP`OrsS}{gUHBL*-UsV{azYX+lP4Y{Pihe;;*qPO1;@ima}nLu=H1$hE&~YtY()nkGiqDu287^Z5A0a& zRxEc+L1H6jAN#@>0KdnH{oHg~#RW`%j0(0$)P$>(;Y#_B0SC%%V1pq=VU-Uk_SW_d z%PwOv)Il}7(yraFPtS~o6lpv5NTUS8|1z)i+Xz7~1x=uw4LxHT7{jr!S$}#Ior;Ao z@peLh#lD;1Gm^CkWkwu)#tAT*o_Bi<0xIGVE5-=IvZXTQtMr7YC|Fu~dgSJR8JTov z#*`XBx59L8`vQEK{`H)rffb5q*K%N1GIprzrmm(f5LfATis?|&?RyTsSeP=j&} z+?pu!Y{*L++hJl_8mhQOL$K6}3oGnRn4&Wkd6qY=F_QK>^rj4btIAhiP^rK$Rlu^( zSq0!c>ifAX}P zpFh|2ADK1TBQVq35q#FP_Xxqg3)>Pv}U2PfeTP+1o_;Scslq`{Uv%aJK8lqQ|vea2eMvj;1MVya;>R+Q6aR!kXbEa8l#f3 z>)8z=YkrPzrIdz$zILO&3-R&IPn7SDUOlWcxu8*F_u7G+pTF>E%Q(fYHX$@qfZN-* z2fd?C7v}Des66`0<<3q-t}~GN2QW05ReNchsNGMW4jH%8mF*VEd>XLW?A96_xku_! zeRt6$GVJqb-o>rorj661nlg!beC0wo0^Z0dtF|DgcjL%c=4@z+i7QVjWm*?&7f2kKrV0l^$(U|{l3QRC zmEPc1ukF=2pLVrMvf7NN%)b@Rf;Ai}E48VdJ!y#7;o0`pXT7b@ETF!8(qZ3`odj(P zAv1?EBI=EQL+os(WYiMg(F_?yCC{xyVaDpkzUUYXD6)Vx2qvxDZl^b-tn}zao;(E^ zkaxumIo_ur8m+12GXn39k6PfWSN{0%bSjoYf&KwFE>e-tXUfsX7s znXVmQ9$@S1wH|)k=x^Y}a8_n@KxU{*EXPh%2eX=g9R$9*%uyHESe1*?xataWL9BO1 zuE)7>BtwBr+Ez%5Ip*xdXw+m=GUzxHM(L93UfUj#7O^9WmE2U?5 z^WzX=lzyZ3!tw#zx>1yS&*sn+F9(;bw>F)ZPZ7jhuZVoPQP=d!reya}E9Yc3RSLUh zyeZUw#g{L5(qgr*ul2l!by=Rgl2q3;-f*F3fVgxh^6aFvx_L$xfsEp@Q)vdI=i;Uo zY*mYjj*?`bKu}2>s$+`Q%GJyPT!r1LU8X`$ zlI#zqfuoNqHveL(V{5YT1Y3LW%?g^94JujdFajYb$!(tN^>$j<3urcne2m))3}S^JoYgO}u1ujYn`LNjKI+{QH7d>gA{)0x*_b0&1} z`;_J|+dclX5<(KN3Ts)#PMnxSA%2w!q0_)P`d@=w%9$L*Ms=n%yAZ@rc9i*LrS zo5BUI-o7;q$lJGWgyBA>Lxn z9t?>mH31u-fk(mo)WL`lQr?8LIXKL>e8+z>tx5@L^}{bdA$tlZa`vkL7;D)L%A?S{ z0{=7a9Q8naG$zG)I2`8hdH3l2oXzdl?W-Ovzt^#TdHs5_`}`R%*2(_ir7zejLX;&| z+gC?_SX=!Xj3A*E*b3f%fAF_|qa+tuC1#6}j^N@E>-2&W)d?z13(2dOPeF$pW${UW za>uf3Xe_L+m$>_ptx;9a#(H#uFnAb`#NAn5+2tV<_gqnUIWHAuDPkrUj{N?V~1lY-neSny7Am~=3Dll{FB8oKTNQg( zdX^Y!7iK~Ni}<<%ZFID9C73%^o39NV(->U~#%f>MEgMbpF}UQYc4ucdGFM2YSYk6nP^f#3cx`#qS=DlMzctf;I$pp zchB4K^_Sn2sR`W-VX?t;>rJ%Yq|~QwZrZ95clE`WU;Yaj?6`A(-ex>*Pgd^W9Z%?J zi^2MCiX$Adpz-T|?}Mxk$$D+0iuwDE$7!KB`e-(Z*n|3AS^N* zefqTgw?{uMO98fn&p-ch8oeXmOP+uP&{x_xLwGzuv^Ald$<2D*w7m;h6{x;p<*DT2G|s&uz(~|Nci7W2 zkPwG8UuVWogj+8i(1xhVxv#O=`|^ut=1i9(Q=X9p1-`%cm9zeZS-RU3tZ$h=)ShAn3hL!@0Ysn)~{VbCn>PkG+rz7&nk%G18 zYxQXbv@~#Q`&@YE2IoC%<-GmdgS~@&KR-PmG;d#j&B!q~40Y~pARh0(Gw?I{V#yEF zJC`ZANJk+I=r;e;qB-uahmD?!1(@?{-(-tzvt%svn@W44>?|5|yoM-1$nHT|c94^UjR z8cjQY(C__P>-Kt)II^-@@#Vq&!)_-z3(&O*QmyrWy;;A#Zu|So-qE9vXDjdiMM?=h zZNkm4P{g=*&nqzd`ZxQx*YVu+-&0l+ME5A))F1F9#i5$6Ud5-k-<)Q>v}k%rUqidYr<@vn={U6d(m`tWgO+S-Vr4+E zH9V7ob>KW|E!%i#)s`E_cD&BuXo1f5?%{l#KYS_P{Q?kP9Im%+zXRQ8LM(p5yjopW zr2Rk!BG@E23%Yl8Cen`A+*lT=}u#n!zI! zpd@qg$q{6QIojJKC=t0tDFc}7)+kFEBLjmb^bb^t z57Pmz@?+gJx~MuZ66l1fI0p(&TAGIUOhfE^husg4Q1L+k8x^3ao4GK}7-ImD(fnd*53^4x6QGu>{N@81#FNwTmWqoh&&HldFTHd_5{W-%V zUHFSmx{{gBy;=8@dyfzIE9YB(cK*xR^PllSkQ_A9QpE&@q~wIr-tVoC5O>~}tl>+_3c#K{ zV;0@tPu9M)JsroXd2roiE5ko;blN=j)#uCuS7SGSFttuuijYu1 zGNLn#8+)4)G2!jp+uyeuP{{e-nWDrxmqZzG$A<2}w;AtH=CNMqupuf&0_cMWYt0Lc z!{`tyJ$pW$aG-1FBcTVCJL|J|@=>UGRYX*rv7`IZ_pC5MCjbAW4QQ`(W^$qDgO^Gp zOiFh0816Z4m52O^!T@Q1c(y{&#`cr3Es+0VW-=7-2!_6%V2deLcz$ib#Ca)6L@NMI z>VFkGR~p;~vA8hBJ53KY`AHU{n8ga2@a;GEJ{BN^LfQLAeYoory4RK)ffP$Y8FNn#zjB*F z&f!YKVtX=aW>FGid7x7TNuYJ3&=9tRC<)xCNVY|ohmxe zXd~G}u0C2j{t_$&m-g!){;L>t4+-6?;E*b6+q)Ts!mOha`!l_0%2oPu082&V<$(O6 z^6M3`Qtmpj*1^|PiKJ@7C6%sIEiFfo?Gp{k|jO?uw?zdn=9wVrH2qdYq8w!%8OiQ^Bc0r;S)Jnufc zeKoo!+oJt{lpQ;)3d!qpb7ez{?p)pI^=&ReSOF&!{%84$&PmYBdGVt~ zd40UPUXXY!%f>BRw8=PFFMOs6y^g3b+cBuULv4@A{%|FYl(&aMWOZ=&be|^mdn<_2 z!F(E4PZ8mNW>ZB4rdKRe8dRXOB^9Q=iU*;!wx9=p%nZ~`rqBqBCoMoF?#RF;-Bu|* zlbxe_izbz+zxkG4xaFkRI}3aWP9+v;p2PLwC@iF0ju~E!BFZoO3v^KsgK%-2E}FDr zYp!k~h317)Cl}1N#B7g0^fd}O>S{?^ZrC5(5k2hp5x`~VSVzNETT0XA&8=WE2`3U1 zIDG$qTQyN*da*ZT|4|_%O9)rgGP*(@sc~)OA(=XZUBdCoG~ENrDZt-?0a)57vxJq`loiDz1hS5n zA+rNyE3@RgEPa%Ot8cdf4$2*y5pt0S02!VTG%8}+^7%@iDpMM^7OTsJx&I{nElw?nQg;&yc+wHDXS~PL&F0;&v~sTo`p~N72Qc5}y}xd5-uq^w_TT}=o%+o;-uwEl-9_B#4L40b zzx(yq)^F0N3qse;yRDVUg9pv8ZhR8Te?GhM8|@<8dH4T8MI?@SfBw*h53l~5fA7|x z@$Z-Qm;C!x{RRJiU4P8K_X?DG@N`sZk|T|BifM)g$n#Y%&C(`ocI2dBfxBPBHF&Ug zhWM~pUp>Av8q<{Cd)SO_wB$(2i@L{vJ8+VMe`ps3g*x#pp1Ad_^DLfxnNDu5e;ZYg zPQHjI?-VB=r;~On^V|@_n7;lGzeR=3z~4I&@V+Ex%Ch-os}fRzN%z-|f)3pOy_ z>B-Anl)$!uC=rZPG3LsifqNm$f6>DxKH2+ZN(|mj+2Y7SN$8SZeW+I#CE{X>B|`ol zd~Q~vJ4P3mc(;al&Bh)|B$AoG3b?A2?Kb`5qk@rNpH&}W`mWsVmYQ(4|Cn!p@A^lW zfx}JyWBw+|bMd1NBJ{{nK^9a=ETJAh_}vdY*wd%&6Yvl|t$YKob&qQhf9$dgwmi`u zbWW2)*w6Fe=Dpb)t7o|7%e%9;RL>Y8%7Rn(zA8_7^UR%7ap`0jw}*vkgK-Nbfw~J< zN*t^{G3c^n1STICGC{{@hPg5Jz69TX7IN*`+lrmDc$IbkS(6QyEQ3~X<)NQ?qEYP( z)*goN`cUcxK`JJ}7hSN{o? z<{+1wK0LZOz73xpA7Gr>?op0pZwnOX;`yjb`)yXl;mqB;C4Oe^$@1!=QldUGyU4zK zH9W!F>lhfIUjrF8oDeOpdr44Ij@GbsSlMI*sf28%Sw_TWauSf3e_A;~MP&V4d3Y5F z%*;~?h3abv#VblJ;)xvtB!2)TcmYPZV7F*@hNum<%=CDx!(+BM;6R=ngXDmsFFgA0 zmH^j6(4_4#)G<{pb6yMloOWemK>YqQ@&pHS^q$du3hr~>^V}^G^vC*lZ2yA$>krsS zb^*Ex0_0enW%@@Rf8w)?{d)8iTXBA_Rz&AMt@?m+P#fWy9%t&6`VP7BV_~T3`|inD zrFySsF2-8j8C$jT+oonTh;J)xB~LJMS5EwPWTer;;WfVA*eJ3sRcbu6+ElMDQyDY()XTAu`f-1tV7G;NiPBYG1M;3nx@Xh3i^TGOj9d%P`7j zM^Ns+FxYM!M)CUWNV1_iTdYhb|96GTBw=wLua6?Dk1;`H463ad)o>9O1IC-LZQrwe zt-m$fm{~!V>%VfwwEpsJ;j^eNni+}fHU@!rvk}40p&{LNW=Le5Ic6;WIUQns0{o%$bz>e`#Mg$L;!U2T1yk+NZU(e}58THR(<iAiC*0^g%Vb+HU{ zj({;0GQgrtmcg`6ak|z0l9&OAf6yAP0ie8|v`~ccBUvL39<4AmWiAXRcfre~7d4g@ zxP>&YA%Z*nm3tRk(?@A@uXYVF1J$mox@HXeC%T3D=ux?%{3!3m!A9b>@j;faZ<`P2 za05~k)_$n~#H|Okf${JhYn9@fjx;Liq&F&7e*~e>>guEooSo9$PA(h`R%34}?-ZeN{*_vK{K%q_lecW9 z=;ws+txb-5!QxEaz)&u^4Xl&{FMt4jQP>2K@Hx7}+ zVx;4wu10hWEUSU$Y{HGAI?H(F+v8+}Q`2?jZE{X~m{wMqIcGmKaGVMXLAB79s|(^a z85jnGR}NZG!kcoHRZTTY8nZzW$YtMk)6gfvydwwOwKnR)fBbN|v0`!`gD}8w>tVm= zTV0b!*|dG1hP4mqxM^Sv-q10xA?D9$Fq9~(;;@wPGjl?2&03A;Lj0fm8L}Y@uY&lW z4_QrRaH$eY9QsMtfn2EK6Vos87)Tv^%0oCte@!09vmLNOgVcN0y9Q?r`z0QUL)lg~B|ut5he~ zbC@Db2o#gJNdjE&h}1=SE>xB=uTm$mHp5UGML8Q#*P2Mtu63WWn1aReDi%+v-Rc9Jx`j=t+;2z6jBo!YFOk((2ndy{Jdq-swd&A{KG2 z7NgmK9r{p#b(UV(S4tb62XeBRcACD~pBv6Sf5-5#o2+ukl<`sPa)yllhEbsQBvg0e zoEH90#Xj*y$c6nBE{n3ctyBoC(JD;1MN05dV~7{k;!2*_*+40Z20?AXa0ekKP+PiU z0hQk*pZWgL_QU0tPmYH7=fT>0bUP;-x?$1>QKfVFS3QDjv|AsZfHqO<~OlW16aN9X;CYL|{pf<(@`&^yy{J;XM~N<#p^Xy+Gyl6c7Pc*r@NUs(O^ zoFArhFGje7^wR2yx|4cv-Vd}Q39Ib`Gi-AQ#IQtp>h!w#(}h}JV>A<|PN9-^#p2ZL zL?Os5azp!29yg|8u4QYD4+TGK<4>Dve`F`1`>%}LwZLs-PfA3Dn(E5<23fTAUojDF z9ydgh^UKVAy44%5YA&2<_0YkpSief_493f4q_? zs*~1pw$UPd6DEB(?*L&UDz>1o%cFxWBa9Bva2W?wF#IcjsvYmSXgrbHNij zXu|+x6{+leNkUE0F<*%=o*$kGNROfVVdZdEP(=km%yjcJ`Q{EG>b{TqIez}mbLG0M zr_qm1{Z-sjQoqF#wSZhNQ_`Rsf0P(+hD4^;?uhB3I5j@$pDnit4e&(K8pc`2cvP@s zmQk%1n^NI02%2EV;FM0jD8*H7HNLM!7ea2G1-V3=$EJM3$q_`90SWmHml&*)Z!d-J z>|||`RumaQx}?b5@{%YBVt{T!wWX%{0o~7qnseKLqC}GgfJ88{SY-YEe}|(83;9fx zSqnK-90yr`6+z9c)FahYYAbs}P_nh1-zfJ)1y1B; zNgE$1hqZ>6$vHIq$I$RL zykqMdRInO1Jl7Ruy5Yc**DUSO_|^4}>8(!Tcj_mC9Oe*M4nP#*aHVCCii^|(JLpI7E);!mZogiM=CE6&6Fp(WpDUI_Qy{$F+V{N-S zK|{~%mISZce8l$sM0UQdZ;_I-x4mD}z}^js(8AYnHjM4If2~XHN=#PV@I%eh=tA&v z>r11Z*q4mxI}P&KlXkC{I9S8RlLZ~3@Y`bw9+jY6Zf|VcF z8mrk(UJ(AofA@t+`7%5-VO=DXXCisK^|BR>PV@U!%!ayAe@S5ZpZ zzG$3;1%v#eX-)CBz0{JHDpTL7p9BV-Ff?N1cFd7;b4}vA?rsp^ksV)g&Y2;h7j-m8 zV9ePLO#YFa?6GHJZx(b`@tjd~c0cG+PxR8Y;T>F`e_5g6J3cmstDD&CnRTugghr(Z zG1mFopkFTE%ktq<%~ji^Fjxg+d{>H{p4<0}g_)Y$SI131=;}q3F{_I{!h@nTT+xQh zP-W)~0C$}tLq_Gsv$sV0cs+(hzzkHBzsZ*{RV5c2fmP|adRJH~H%P6OZwY#oe`V4i zLhuEte-(p?u=E|qbDusvIg&t^hyC?@y^Hl22W@5GL?a=2tb8@LbeA(WS-H~}t)|A# zk432HVRIygci{=H_GG1#t>f*xZyeSABo9h}iX%JsaHzTuVqY->nb^V=Q~sy~!c1#q zS~r8X%~)ijc{h#bM%p=ZBl{oRUZ}xvv|)>Ee`dkqgxGh`?K~7I_lmfC)0XF98DX8G z3g+R(mSBh{j|MEPfU?ts{nF`wQE5eZ3*k!im!One^11+YCq8c$<<7v*RBqAD+40cI zegmGeXrG4psM$%-$ZPUbZ1Gh_)T%rw@V`2qAPiitCC^XHv6nQ6nPxPPO-QJM2x0+9 zf5cr!yHt)R4pu?6dNs98A`p8NgLlIG)~C6QMzUP=&(IPuJgC#Q zDvakHST|y1y83^@@XCZ+vdNcs1cKL?@l5FhslNpa6foa>|1G~CTP&^@%u-PqXI;F^ z4pK7{puN^fBqDWw&i9!d%~A0@8xb{qz&B?{^Dw)YSrjW?Wu}<@<$DCGs(6u=e_}BE zku9Nea3yz}7Z-J`pCF*79Ht%UxCxNt@c(t%IgqP(C-KuLT&!DJYIDamfk;vjHmR z^Uv`J<$jG@m{*BJi6qKR@G56Zed|Z`s#PtgjU5r5)J*p>jvY4WMF-CIrA$b z9UB_s?J_hFLK2L_3A&qvJB^&*j#j?f_^Q7A40!lsItGiwI~^bD*!WJLJ76 zCR{N48pW9+2j>C0ki0`Z8d7_3tmEPD4_!+PXakpCHL-YsN~q0>Xtj-6fBeWolmT!Z zwz|rvhBv(oWdI!;q1yeKPb!Tr#d#ORD-B=ll$Uv@?A6?GN#XG6kS9|g<~i~Uw^xw$ ziPqa-9Ni?lYw1`Zwu?kiW=&8sb?_!<1~NH?tiODLTyup`l)F}eih2LK@fpR9LzU|u zeGE5Bun}}Ra_eots{zt6e?XL0o7)kkWQX00eSFAUE1lLNs8eL`Fsa?n$bN%8E}XBo zS)oOHh^*gP8%`x*a*DthM32g8vGrU??K`tNcj1 zY_^|>?FIhel6-6mH_#MrpFPH>GaZ@ym`U&+>D zLm{mEE#W_HVpw{bi`?)~bg)2u{`mrilkYBf4pyGBIw?nLD?!jc0zvx-1g){%+72%u zB4T6#$E4Vdw{0MAe}=_)_l8uG+Hi|E&tA)H8`7GW@JTF@hPC@h5FE!gR$F`ydQxp! z2SVBIan3ZH)-fFp-%htmP0DWw)G&>FH@&I~;ey1%nkcx=neX3a96P-8Rk=!r(7 z0A|doM11{|qt@JN8u1_#7w5t7FLKJ@q+=f_S)GPbXGU}6@?>^E ze=)4axOeb^&t4IOvkHP0sCIpGUBw}?EZKeGEe5;xWZZa|Fqkkt@Shgc$LEzq8X^Nl~79M;Rfqfs00oaBmp-DKJ#-#b~(XsaAB46q-mRlQ8WRe?0J$$p}iW-r9%bephJ9 zP5l73(;=0f4!e`{K{y;A_YWuGxHE`Hv-@Us;fAXYiEY6)%I2}a)HKV?MHs6iayun6 zm)1W7jOzNA*?t36#+zpTG4u#pHl%th)WdSIEUD!Sb66V8QWLHhG(|8A7r|?SBc40JYJ1p+ z0FZutjGZEcwG~qFfp!&n8;UcNy6!6}iN4Nc4?GPnvq8#oB=j^YbPlF^?RcF=qX-pr1~{hE;p z3}wedoH}5vJKst-0LDI+fU#Y$R=f8vw|3_NV;>`6>~L>)zgESIeO!!x7bDZJMQ(&v zE3NLdxF=AKSjlOOElhQ}q%N2DPb2Q@628S#TISOy$hVLzk%TYnG7*0MoLfeqOu>ym@@kixw|5soTSIN?u;$m)sK_pQbx`kOwDkc#Y^cl|- zUZKUk7W__FDAI4|2MXCTnM72{*xJ07QK#?fu1@*#iXkR0G%W;_ze!UblKKf%3LP{o>Eq7(2a1P*u1qx}l$r65rfk4E47bKPiDYONS_9XV!!nuP?5O+0m9alLS!mKSkD8u#)nofG>j zP5fl4w0?H4a{pEn!<+E${iIyMrJyM;hY{cm8QYwCLLVk;WaepRa)p2L;MAPfwH2{S zxRP@|j`_42$IS;7rVJ0Kx{@3>VX$1e!vgEB+hDZ3*?%6lxD2I?uxwDPyP|)97*1G? zCoepX3#K#$?W;EF1zD*%p`h(@t4*Z}>9*ee*Sp3+JJe9G271%$oVp1;z5s`RH*u}< zMA9uGA_^phVTCOcnst8@!jN?GCTUZMpE@AT3cB2laN|x`s`4$4MDv(W(&9#2lQLrv zWLddO!0fba`w`2bt)0yQCu|WlfmCma@=JbI_jszkJv1$Q3t(_+u zGUPOTsBB3aDR#$Si-1QCtCdUY>8Y_K4uG z1|sSnKa;Ln9OIIo7okQ7Xw(@y^uR{_6o`Idc%w?KT(H8gZ2%4pZ=b1{EBLaTg3R}1 z$}_bhgqHVeA{;PfzBCw2ns_BcD(IU%mnk13$rSJfvP7Hsyfy2riqp3u4sPiKHuCNf zZ9F3Bp9pHPNJM}2TO7Z1182xsLS?)oN%0DMs#}uF#j?@-riBR|0ZVeebJn>w~FzxS`O1((<$Kgi+q=qrD-Q5$T66Tk!uLNE@IE!kF( zEk&}7F{pog&$%8|wI4E0&bdk7G5X#UtX;dRc0E_ET93Kh)aE&;P%zn(_;b!xw82%h z?_(Ir#Xq7E(i%(?U{P*S&V`!t9k8jfH%rqfu3WJ&c4^Pe&P0QE)i=T#=m9km^tF{S~!I~N*i==?d%}>oM3!Xe}OuJo4FpK zp->FY!AtazJOTrt%c=kv#Ay-t_CW*N+>0ZZQ=5Op1e~?tO=UIk!%iU^%*YJt3_+T) z61+G^KNB7>;ID|CYgO!Iqcuqg79pM*UBm3eC5sD->t}nk0L}#~ssBTw+fb6Ew|OxV zmMni3m(5#J(FEwWwB>J3q0E6(G6IF0qO(@NiL_vllR7%4F>+KuRQ~~aar?VGh$Ye` zo0UK}(nwMW@Zd5#(N+m=9aKb^32ThVhiLu6;fPWEu>Fa7V76pjE_BTj-d!t# zm<|Hvl9W{W+i|cqRzMl}CniP(qMZh=IL?1g+1JXRg5lvp6mS{ZMSz0>e;X$}c+k;W z9hfMa9GT8$R{Ljd&6Jhe(EGIs*&WxxIA9qA;{)L49DnUNM`V5a(QhuUF_8Y@X4dU4 zd~?6kJD-F1poMH&B2q2J6y}n1?NP72ME7&3;1FYKMB^Pxg~IHl2Od-cj{ss4*fD=J zx*7L`9KeJS^Fu(JxqkQXtO2)yIjRNt7g{s?AfvaiIw$|XsEJFw(NJYe?)RUo|AAy$ zmmKy79~*P3wOgBmP7Q6uyZ}>Z4#-_27#(03IxKm2c(FEj-0dA5Qo^ZBqpvy)70wU{zGI>WUx;4tz5cS zv3o?fN}Xyn7Y~_=UH$e;~Pe7NSsIODp?i^gu|CO zT`Fh}l?DNic0w>qX`3sEq5Pq+pVF!wZB-Bi6q*;Jqe!MBtV67_Z7?|WcZ`4VPx5vf z))Rq~IqRME;owoj>C0aoAgWSqM}P+ruz8F;xB#%KlVGOP&wjIUN;@rp(Oj_y*%6ho zlk73X*=vZ>K7u(0!gR{7PucfD!hT*|5B*=5^#T=q!p|-xE68>PaY=n)r@qdfv_=c- z_)UO|0^BVI9B`o}3|pNJeN%r#meonLGXh{C$Gv_B%ya24FJHf`W{MVqhy{rldM76n z+%@{$m3@eDfIs|jxb@@zdj4t?LLZ3Pic#52H*>vae){jx%n$!Pn)&E&ZsuP791C=> z{t5gLB%Te%fT*oNHFUPJ+w1Hh;U55DcnCD)#Kx@=jNGUpkOO}Y4*JU0(|Q({0%hP0 zqz0HQrw9a(xRi+CReyEv(L8v~*|eChg%Ga~&xz!sr99dzmYOgAmuCz zEik@N1mJ0Lap4TM1iTObcHp&r|6=pItoGZmdn9F_<6#ItM*RM63-ussEPwyB`S3+n z``Fzd@(D&xWWkvWb^eCEBF?Kruk+c9f8b^{{D+iWe~p6ebF1Z<)B-I&OOA)u8i1N> z$)xS98R~y%zK30%zkj;E_58i|3UVyOEYYqlKU;tK!^ZYc&uNZ0`k*G*=-m42b=}wK zV*9*J9&sr7TR*?p^f$bq#5dpXyg}wMq)f=g-)H*!(asJetz&HV(K78zXqE*8bSbfo z?<$=7X!#9aUFe&i*ZJ_Ntxu13Fcb%48H%Ud7{Y)4KnMNj))Uq+`~=I9&~9z9lzV}( zKN!l;zj%V*!(;jV^3}tiaWk9jBaSVm3v1v=7Qo9_JLuJDGM4`AJlTATMvRYP`zX&p z^67W^{Sw(E?a}&Ed~gh#82RE4+pVWtXwiqk8Pvv-T+1BZ*Z}d1$CTTs>|tGUDn0QHo*dpxj(MvmgjO< zpC1u?kr`f&JVT2MbNS5HLAGx7rkNUmx`; zu06x@x5c-dTYbyE{C?J_WG&(YaWO(kX{(W4lqIFha5=XQmu(?3Y`}puhm8qKbJ^GC zL;N1?`@)1RhNQArBk9x*%Q27(*26jnZNII{mCJKEuFvIkfx^7bS15~o&=R^dmkWPu z6GE|MaV{5DC)R{7Pg#ppmfG56TY79cX80wI6YXhq0( zo^(t4Ecz`k^F%zpe!tGOnN!HlCikqUg68W7Qo=78lMN{exlJi4`E#J871nKOhn5tu z{mIl)yOX_}773e}>7_!s6UJI8YsQZj{p?clgt26f)sli=+dhB4gV>Ay`rv=g9Wcc5 zCZ8TspKM^Kdg^gUwycl?|89CL=mYI|fmObFV z!G8Xfk!=CsHaM2V`U$jC42OS?r1f5)OdwYBdRk{`(42B(62{^?8H;ls4~1eMS0ynmwt?t)NMf`X7K64n^0kH1FNLSbm41J3bd(K6Q750} zg3mUJ46UzUh(3(UCJyf8f~j)<3DJk%`5&BS}l}EG!p! z`LI|*@@bLpw#x;ORw#fJ|H4kiHhfuH>5@;2$SGScv-5<5f>VFCSXAPz$=X@b$Wj}R*1HO z)UDG_@SIGJC_;a_@xt%t@K5ttJjFnO`7;b7*+=%G#cKgwj9#aa?zDuphq^45-7`}EijF634dOrv8Vi@a_k>i5tn zINDs@W4_lROoO92ZXLCKh4ZZ?p}hu)$q;Mg7ruOXzZnO_zb0KOhRO#9nj%?asiP_k zUZdQ)rj36;MBLB{sJ9(f?TES+dlkI!Xy<2s7RQ;2?%^yxfZ<-fKMV=I@zO^`8KBMu z_JlD?Rt^=8g9oGFW5zcgB~gXaOosqs9zPshNY?(ako6EYl4gHIYlCOhu>`F6-Gk#j zswH;&L-{)+d?)k=^rj520Clu2#y~V9NWt-K9l3wu=x?dfRP(xD1N>y}Yp^&HB=Kn@ z)KFOx3fi;I#iaq+~s4#GOk2fr=oZLXd#G7YiWJ;D<*n2|5bI zj&FaL#w_gz#_TII5I+j-9?DZkmu+nVbW(;oYst?;h{{2fHXz_VCW&YKc4!!(SD3zBc;P4@owF!WF*~sB0-rBhV?h+@uM#ZnSt?q zbMF2D2g9{D=K%0!kx_<_xbJT7{&IWo_Pg767IuGGxxMF4i?`pctQ^7DZspx6{+@qj zE5E!O-(G=-1~?AP=0|M_hWSS+$gS@toK=!-D%$ z23!iP0FE?9ynexmv4Qnkc)ck0Dwo-7=)GyN2<*d4`pwCw=6H)7DgS>38?=k; z|GaG?RdOx8ZCu>(hvekP%(M9G>@y^W-3Edh!MgC|v~dxDHN#k3hJ|^#?DmLa|M&>a ztiOb{&1FKbnFy37gn1Qn>+Cf`SK|TZ)#Xp=D;4Py5l((gAEl1)<`{Mo2j@c^oQR;} zh3~-6>dv|Rdx3xFYIk1C&|iO=Ehw6ENdP=VbrMuSErm2TEjz~#ZCrMNpVqLG`aCkS z%$ZI8WpX^FQzhuKC;CB6eVbjv&dG;#XW=c;p%BqP41nMIOy&j<1NwQ3r)LBz3f~ZZ z@^$u_hOcXv*#>Nx7B9h!&ELIs>$TeaUxuUlb>a{crW+HlcpwM!Xa|36JVvnAUxn`{ zKrq5HJoc6TYRA4^1LjJ2c}bhaH1{P+r?p+e2?_1GbLUb9;!gH0_8ua&h4*l73XudB zYMZAW(s$dIb1;$_>yFX!^TGPIez^p5FZa=8t%c#d1P~yTUz^u4lc+B_fQDGNzRgdXC!t*fv(WUW>6OivE#wO9t0=sLg>a~I#W3gG9@ z=HMQ?z*8?_)WMk6!JqMMgn^$Yn1zylz+wf`?_P9L7fb-)(Cr^sBs|K%c?Uvm2L>d1 zd$@O9=sUpb1p0p>_}L}rk+$g|(=dYUD-JTips{;vgJzG2bU?dnFti~YI(eGZ+q(yQ zz@-s?f1k4_2Qp`mH#1I^X<~jj&%km#hHc`;X7A z9{=GO#nnE!t-S(|Nt7u8mUy}e&GeYSh5 z1y7@g$z9Mqj4*1rz0l!b(7^~r&T0(LhrQJ}0q(|tW@|}I5%!8SpIDOIHiL@F+Nf&~ ztMS}$gO%JU<$)|81ed5juz6rx3Nl9&6R9e=Y=-!kt8g5)Bbwxv0DX4~ADbdbyd;5F z3hofGafyF-%Fl_zBcff&_v3TTp|)xAsMCs z2*F$R=44!zIzS?p!!Cy9ba5~1C74l#oR;x4$<%+{#pp^gpSlg+tMe0gbDX;X@qwm@ z<;zdi%?4{v3nZt+cZItFAxTcFazS&nW$hzO%T+)aHV(=$p+9`9BA@pqje{)!<@9mz^5D zbPzdHTz2$f2p1(rGynhr>{Uk)z%^=1@+N;c1383WU0jLaMnzYmI?R#fe~YM`PC`54 zBUDo#p;{f7=CG3eNk5Ca#a34w`ryNapR}ZV11h)*$0K45-sE`#Q(9u7<21o9$Ny62 zv3wdX4EY2!z)r?ovVqhxX>wusfp}0*$KL61qA&INY;bf$CV>h42?dh5kK-ps9rk}7 z@i*7Z{tO=iRM*(j1U^va#T%a_#dao%YD{aXxanM+p*GJY&sdI=^x0za zd-b${@%e7t)y zJnLEe=wENY)J+h-#FIMyqPdFyhH-zgJ&aB?3Md}1?S|MiXyZY9hz+7&i4$vhr1BeE zP;IjGH(V5H1*H!YZLvB~+K+B0d`2G$DVa-(edfeeG$g@N_NO?Y@)$=n!HD)J@3KDl zXv>o|7|_eMLWXUm>MviU{Gk$d{PxC${stn6V;VJ`RU6N5YZDx?j1@L-Sgf6q{KHq#`l9QD*p7|bDSCZ zEd0!`N==KiN!P3N^%*2+UaP_Q$|4~e0UkTRO+AjFhd**Sj&7wMQ2tHg&#IiC`7EhOhjY~f}6lD;Un^W$+Beb}r2 zuo+^X-h^jtJ5oFLNkJ-hqCGJ_7F-cJLR8ncLNM-WU(MeblGk0N=NtRTepAEA;<{=-Z;V= zXX7sdr`V*u_&c>|7*@tOiY3hyDny@fOd!2a?PJaLku5_pyJ7r<4l$3*KY2d*8#` za+XTO?%`pNe=jsZ^_W05Poq~T_7adN#>Y@4eS8Tos(_Ou=#(M3P>xp_fdf~_Bw#Lt z%d&_*ek9{*vKJ7l-gu)oCL@0K72<3I`i$CIq{~+r9da8p)O0d+vwvoM`zwW0Jo-QrKva@s9=p>Y z;j5%C=;nNb<^fKSe`UigxyQBet>x~nM_H0}A2%{e+65x03@KscYU(*m6AlIpoTHP;qdQaoHN$@r+ zv<;jkBKX#UCIh5`ueW3>kxo=59CM+1jG8`M23t(lrXbALrR?@gi;MWC1iT<9vXo24 z1LK=~d^*+W>A|3d>0S>Af&QpidfKdz(@g|sXAOTjrn~0Sshrb*Ax(3i*A`91;S$48 zt`qzZMvUa)co@h7Xu`jfJh<(V69|Do1p-VpiMS?J$n76rSXg4ohM}a?Hw^PZiYcE- zwp3Vli@rMB=$~LJYG}z^K(gFMi~EVd zX@v$;0533T5^d4h{^UJ?ax;bpP-`v#S%x=Fv)7tr4}h_co6%F(SaGmxv&AMw61TSoBnDmUX+97*gx_H?Q1)9wYJI#WszNr4=&QHryUP~=X( zB#3G_m7+q%lre$>eQ`EdgQ7(nHLU@Y%wo4jl}neO*p|lo{V@HCH#HrIGd*3SwiA~m z%`e7(iSd=iqgHWKK=$(CSB!rpOi#D|?LSvjOM)KnBM9Hd5a6V*{0G2Y0=Eg{-!uSV z`pWnOer{YB?XReia{!W*B@xCLf!qe!1V$n}Ha=Sg7S(@(P)in1-2#9U5?s*$R6wi0 zW`HAa7>$FeSoFYAa90GoY=?iss9oQ12gYc)s*Cn(UpF zRimFuW`N`k?XI@F0gc~o-1G{@Jr$U3e8Vth?Mk?G4sNp@x9$@AWVBPHLulcSw~Txu<{|g zjo7a+>mW#fG>U;qKf3^W%+BZ_NJ0`?PsS_BLoJkKxdd$L2mykV(`J;OHgbqG(OR4c z%0vvv^<+44slNrJk*bVWr@U@LjB#UxTjtu0_S%h}(L637p_l{AryqQTE*4G;mf@%f z{kt)~UVi-`3k7z&%;d3k@+(EWL#@8Fby|~y;?@VJA5fbB_&JX=Nm*> z1uG-Sk(|sqOAS{Kk^a!LYj2!vP{7BJ}wnUrc+! zk4eW1W%aFmP+votRgnQ7on2Z#Y{eNIsl9}luG#6*c&YE+M>=o^K5&yMnKPTq0>5ml zpdo(?^WOBg)hzdw#6*fnJIVzhdF5MeUHLV%Jw^~aB6L%KOxN7vU;J!PvI|Da{bn!7 zwzip)G@?|_xH$M%$#UvfPw&}RjVG?SgeJG0_!aTms^icQ$WM%j*uv!+0?94$VZYvz zh;of+v9Y%jZhyJNr_cXd|L+`tDHt{Olt(qWBD%MLjWF@P{~P zW&c^9;8)^*7IBn12%1mbNFrCzo{O>3TG1m>(utuMRh7x@Dm@yjYC34e%*Qx%%bAmD zY9hXr#2>FALI8ryGNvMJos$oCD(mnMh6zqMqqK!my3oQ2`dT|Ck5F(Fj2A~5#tGGw zfz!Xir<7``Ks|}v54{>A4sv&qVDc7;veHpP>L>1hs5m_}iUb--Ig-j7RD{2F3Z0!5 z_gJUMkCWMgX7C#{v}Ds=6bcS4j&|y3D)R(SKbZnLHMvLtW1fqC*=z>+Ky(yIeX3+U zn@o}~BQk?l?Uv7+v!*L8WxVh%|B1@1`X_$$NGAHP({Cyfc{unC(WYbuF;Q+xWnvau z(p}zvsuI)LCm9Zd>^~OQ6isqaO+M)4DKD|=BJpvs%0$dys_ndUUechjGlL`(lix71u(jg#5^N*r_mVxU+sQzJL@~UaM$pbf zL_{VPw`0WhwabEe!V#7Y=bHSs(nB(KD97^;qTx<_F`Zsh^ES@_;=9g>L#eEMtHmlSayuFpW-mVt1zOz!aVFuANOK0rcDHN-X&6 zuH{NAo$mdbEci=V@M(CJ3(l9{3h0=i9fAwIegILp{U>EatQSf4%T*DP0I*xUa|(A|sPX{0p!iqCLI1 zbR`bBs19JWXJ{hAd>ju(y-V_cS$&x5*#O402AQea=&WCBo(voN!#cznX8;jI9J}$9 zo&}-S_kXU|{bA!Isr9f>>!YvLx~ngxvb_{rhGbJqF4lL`lJ%N@EiE9nFNIGaC=xUR z2;<-2kby)&y4^kJGdnA?dnE^(Mh?J5q$2wYiol%$A#JBeYhH3aCG{hJ;0%l*%5zS5 z0m-u#^aHi20v~QyXMReh%SZ6c>Ihp>e8>Iq=ROnmak087U?ae??Fw~plfJ#hU-5ZJ zLw7Oz)QyQ-dl;%jHsiFRIE+vst7-17TU{9LGN7PDqJy~zk>fFKv_{tmMB;vzm$8() zq|q;VkIBn?Aaa`31QEx7x@&bog@Gux<|vPaG{~^2p$-fyjG7Z&TL;q&t9}q38>?FZT_hy|$zZ`Onc!?o}kgC7doK*ZpL@9-G|jNqEobj4n16l4U7*jBkqFiUWG1lF;fpQ{^H96~o zJ0pAk$}93Vwblbb6BJSUDY4bAG@6mB?R8QWRMJva4;~r4cAuY`jMvzN9z279dNU?v zJb^(Q^aMrC4uY~bm=D1WeT zMw%(9)^f=`HYtCu1@%_Tvg)}JMjq^)w!fTS;-(8(P&432X1+;_KT|0H)VKcQx&5$n zEd8#TU8-tAh7~bYLWc{Aibt#3+fqI;XN!!`a&WtU;aUS*L;;X4UmUS$FV>Y4vSM98 zQ2;Sa#yL=ng<5Vmfgi0JiQMAJSN!!)Yxk;m%k17`*NjYTwHvp7nP4QmVy=TZN@csQ z=Zmt^=$0EV=1BIQvXl`+OxS)Cvx|;3UC$~!5K(KXQ{Y(`Up!wxP!S57Cbqk!n2L5M%Fn+7}5R4Ax#ymY!!}(SPaS{@p93ybZD`Lr4yFu zrQegy{XhKN~MVQ!omd|LNXh^#J%$pdxu*jnWK96YDndxg*6x`pTtH?lfzY|z5t)z#8k!j8rX4g z)#yNk`&_=PXO(NH1+5lccDTME$_iwd7&H^wl;R%^aq>>#IQ$4>h%u6 zmAcNmS9t0bO2pr^ zLYeuh>OgX3Jnel_83LbcWxY~mI`~!9!E_~=o_vKpuTa7erxhk+R8=W1F@=%LR}3&z ztvCs5ETbq3x_WkSJjpP|EJ=j}tMF_0Q$6yxv4_)J8lPue?H+NfrFkVG&CJcwIaX?v z9^`6&6qhJufjsLAH)ErJZ!~F*G(_WBCOJ>p!bjro;CY+|CAXcFGzsGxd*`QVDIbL4 z)h~!rW)(=6XV&2Nv5FdCq=Z?02pN^Aub|9*(Mq*Fp%|DLs>>n^e8Xc(FMO7$+)Kjn z)*8@&&g!oVLI42S?NB{ZAr0x9G$hHBEFx%f!!dO+oJkZ#4FxNI7m!+U4s)tVu`>09 zV9~`&qFVfxu11z{*;_1_L64og!rFo~L?F8r>qBYP27nsRW{;^5&&uZS;4Yt!3j?cs z0?WM92Z-$#75%v-fvT+juT=(q5;<{>9wG3c|Nd=2^K;=-^8(}1 zdf`(5+Dwu*ejR2(c z&{)RiCCf0ph|9niG?5uAmU56878bEs#n>X=xq1=r{H2TdUzj`RZ*;2u+A;ia^%#Em zw~wK8%TD)10+x)@*Xe~?>c?ZKSOdZN${z!(e4R-GiV}o>49CD?SL7dVr=>o2aKDxm zkc6*Jtn#;i$GomzJ+JHkHS?O|i2mH{7ACL2t#T6o;PmI)bj?LDYeLhD%HJ`qt=X3u z0cFH3<}V|8g>g=JL3bog(>eCk9p=YB@{E$V#P{>g& z(3rw$N?Bxon>S4;{N< zZal=lZx`9+xwMPaM^$&x`>ToL`@fBG_J{q8^M{eX~wLuUi@LFjD8rn7;5uiwGUQfEWG%m^;-s#;;GjaJr$jmiB^@BG32 z`3Lt`_#=%8wn-fBL`)A6Hm4;SOdB}D+1~w6`6z6P1cXLkU~kGGt0j6{6P3Nk;C;(B zZ?L}I+RdAUI3*VA&6~2K^=H3()IOl_S`c%8r8;1BpjZAEy~9tfl6WKL1^of$Z8j%Z z?CG#kB~+LExnw|SsGh7a#E80sKZhJ@D8+OG0rwLcE(vo$2Wbs^z!{ie1`bT4cATN4 z{2I!;6TBPB?3|>t6I5xat8s(?3#vgwR1SEucal0bS{VGNXA46sflXuCr2!`y`dU$c zf0+Fr@zyJ*YHq@w(L$WLn!u(+II@L~Is=Lp?jTtzPi?6fRg=|XztaWt&^Fw^Z^2x1 zbtFr{S4UVdVO5N?ovT+x)%17xM|8Q^qhb01YMPt=zD)4}rWnF!nXpNQlJe_N-VO2Y zP^L#GuzLEr^EpeMI#?ALX2v?6+VmfPrqeIkr2#`ue?|St^y4aT6?6Iz*t0PG9bj2C zIt$0i^kewL^uM~^^k4qlr(Y8NL?p=|wf@sIBfmgGwF%jH^v4&7(}yU>OLNT6ld$~V zwByy^MLS~P4qF-uiN-#iqE8UcZ@q^faQ>TE4BGJP9&0@uYZzjF7@VuwdSXX^s0!V^ z0*Ufk-x_95I2bWn2%en1Xbo@OGFSk3$e#C(h}zX$28#J;ov`y@xK?^E7TTRJ$GDPx z8FUs`6tc?H?V(I80!z4x8i9V$BC_@i^6}#b-`=`~dQt7O_5l(Guy zToRgB?E`*jiCU2{E8T?qjp&|$=mfJJa?y4v`oYY1OE()gxA>WOEe>{nD>oev8TA4V z*ofCSXq>7QMIjmVMH8M5;DiG7tXwWl%*7$amr@5g^;`^eDcZd;;BIP>lHf$TQ?r=q z*)(_}Vkb%aW8u`=>HE^h!w7J6L&(1B78UU-Lp$7+0?qqWJ%wJI=WS1XG_Nx^V!2CO812UImxhsBvn*!allkh?m7UiBXIOjX}3sM-0yf zKyOYVz<1P!MWB7PW5J~cCM?Hwc-ENV;qjL*fGkHfZu=A9fO@Nc3%|7h>LmuYjbjNT zH*S1(;tYc`|A|1JijyXhUuCjUA(YB9d8cDL0Xp*T5brv20x0)WJ^|2TXKPqAcIVcu zW3V;_mL@vCgAytVQ*`Xf!{K0abQ^F$2)M%mnUz?CL_8KD%u`^?b>Vvt#*md+CkvTJ z5=)~pzYA5~wmu7gBSQngHEb`MWL4nWO!m>YG4=d?9f~4@Y`@wbFcmF|MWECOh4A*|Y~1T~A9jzyX~Ek!I%7jYkk4c9 z#OdTz+{FBaA;dVAbB1}V_8tJ?)1~RntZZXJbjI+k(LwGI^A(s85C;wKpai=sD|{?XYC?op2~Q zlWP@mkKx+h)1x|mAh8)sD+FcRn)y;~w$a|0Sztt zi<(`o&w1_@Y62GA0LIm$k1)et(ySHVhk8Kg&@h;463?mT4yUrB^;ZT~C`_dVVbka1 z`ez9Fb$KMN-ZqFhd+T=z@P8yzZI-ROSiJb+9_;=wiNoqwB;kh%-J9i`1v)=MeCZi~ zepqWaIsw?F__~Q>w(C7r8eoqF8#P**y@J^=(^h&svG+$ohSY#+OHr$F%9D)taOHPmrdmxRCDY@Gr(AY`P7dowkVGO zbiq&HA1m_4W?_>$Zdgrak#fl=>X_@^%E)1e&nZMTTtFqn zCl6|1E*T$XvV+Kr(K}@xONksVTnhEOWI;k(u#1x+3Wz=}`4$Evd{zj;T25wvAu=G- zJ5rYlv@7_JF~FYq@69+e=cl zsX)5Y$Gn0Ov_tp;LdSY+t%43RAMv&L76+)-TO^0IX0I{e-WxZ^yMw*P2>;~#&P*9q zrOcbb#!+Bwt2@#075KT5qA%rt>HMWhqSJGPuSCM@;ET8tZ_gAT)1x2XsBULb8%X6} zp_OG>v>SWpzhbGZA?-&=aad2gQmqI}9mZxkg{AlKoHW|hBPx&{Vae&uyFfV<=w`+p z;pNqLgqQJ-&>5T<5c^lT{+Lz1_AoU8r+r9d%pIw+#52RzU;z%xMb0&U?Mq}@QC!ju zNW^D6GO$$58;4xxRC9HvOe*m@aXn!<=fPsn@>p{9T8J|0MjW3JqjL--IMOhjVuFk& z!2Pr>0E4m9V&D@!b4yOXA`tC<+8?w>x_Zd8l0t#pm(3Bv{U*6XR1HXw<}m_F;CGrGw2A3{H#j30!V4+(_YNBu$l7RneeaMSqwA6=_IMXh<701i>pnL)tTq6d;sL{68ND zI^d@!ea3(}vJ1r>7B3g%Pr#WZ<*K})#CBYH~6FgYC`_YUP6G(im7*o;3~ zbKV2B*lvbH0HIJsVt-S_ma?iD*c60K&Xs47Wg-+(5_HDnNNG5YT&5zdvWJgyxXK;G zg-*$Pv89xbO{Xh=x99)I?K#*J?Q?<6{m(S=(oz4Godqrf=_Ygl(qBSet6f8DJ zaOq^Q8A?=?fnMBo)QoFflG8(oR`AuA(~Y#^8PZ+^w^$9~B0HsUBqWYCjP{+{u)^ZS$(tOjY^VH{cETLuUeX3tGvJ)w7Dr?Q1>Ca% zQw>m@{4ptv#fj;bA?vmnRL3dTty>S_sG<$T3&4gXlpJ>qddDk$W?Yf_VQiJoCfnuV z(0bW_?jA-x!O_F0I_w#cn3;zNaaz5KrqH3W#J^_I!ZQSDh}+a(NmdoKV#Hp-REeBbeX9$}bD+uQs-}zr5bs*xdfIvDsSR zdb+cC)2v>YTh=Yas%?sqD1SMklo-Hwv8ri(oYIvThH}WPffn$K6ry_t&_)l6b9pm6V_&_1JJfXk|$K0gEV^e=NIQpd=vXgbEnp~iQgqeVRLGAb^TcB_{OTKXC z!8q{V+{M{^z16Q%ghR73dxw+)`}~-HLHK6y9Jg-iBI#w|I!>=ZgCyS|%A0%C{>{5N0d$SC%J-A< zI82kc7i;s-7WRxsKrp^KHeZI0<7SPHAEX^8YHPmZ2chHW*d*=PB<!COe`F52fVt5~NeRb?Z;>&Di`=mKTmactfVfAbJyJ`K z8Q?5egiKl%3&kG7kqWY$(cnA@Y6otH_R3e?m2jqlXTy=Atg`W64bc%sjwpYHqQ}VI z;@s_8KA_1wG?2pL9%9g)-Bsh~B}r0{DkVr5niM+9Df9r^$*!#vuC!dMf57_5X5q&$ ztMmPY4Z>iQLkZ{Cijo9Vi1bhG{xm_P)< zI+D}h`YbCWt_ZNKey(tLQc{@fyN{GIObKM*(q(rvSmK@CGg-?+Y?t~;>EHp&B4_oN zhp$?#?dM;1HlJ=jYJF*Kf4*t0zua7};9V9&RO8~Xt}%=XXC^&ZA8&0w-PqY|@d$~A zgN2h6cON^h(<9XaekU&xarlJLZZxAzKk{_*JAu)(Zu@#;WZ7P~-+=&UH`oDkxe<2) z5wKIMq%f=yDCN5qW8>7H$4hF;V9hh6wblRS3z%*y+xw6+=w%ywgEhi#FAdVv@~e|%$Ci9DkUYeVBs0Ugdog0J<)B7WmVL+{gaPm`eQu#;UFY%x%% z#P7@Z$LTnXE2M(reI`U64ELIt!mBT&w|oX$Lpgo@JbyojR58Pq?(~ za+-BS6A$RN&sS%3O=6nP?%I{zC{#-0s`}I7E|d^Y(u?{Zy9(yS zBRoFtHs|kRj%4>^thOj4v~^MI9TKpxwwMSFKNbh`-_VjzTd^geBGM95LOzrjd$biX zLsD2GJ|1#3f1`qdmWbH@2t8VfLD<#+4s)U!Nbt=(UW=&=0%9R(s|)30+FgyTpPH$J zK=-GMBF#7B6of(${MG~u-i(M0oj9W42UAGeCYy#KwSnu0tc-{diYHi_G5CGaq6n@k zQEib{>gKSlGl`5^!m};fB&&g$kQ&1a#!BNAWUB-#e1T`ZIsn&Dl2nEpI^qCZA`` z2fWUP$`5c|{df<57RyF52#sswmVUtlcwl|O&%x|47Z#~eUYLCO0$&YWSHgHhcHsjQ z2AY9C+-?!$H8zdE#18sn!x!vt*)f+K-~TqBe+@EaG!A^sVAr!O-Q8Q8r{EUSOQ@E) zLUQYf!7Q7QU6)3r?>$?Dbo#2|yft4nq9E=@ER`>z1w~@N3PY))Nh~gP!H5Ev*x-jG z1}hT{vl8MqC(cYUHuJ0%0pA?#wXh^G%ps6>oa%mVsyUiqo7XT(p-Wd17%VV|D8sU# ze-0r;Rz_cWX`nv}xrXs%|7_H?j^_qROoMVkmqDWvvty5#d+tGyVP;ZfEy^qxzr)}? z>}I|uRE@skQcKrA_PqF^Pk-t|W+1>57w2Q*AY!$<$$So|*$fp5hCuX`g0HH0N_Z;8Ji`dSt@Hw;{)6dIsA$f0!7q!`0MZBbnxU1po{fc?mlgHA|$zXU}(A-z>z|Dl9|1gj~KOz8>iS9#kYY_JRH(%6=o+D<|1Nf!j@D( zG@u;~au&s}m#x(b4ajBSelMA#lU|pt+Gcx%%&=~&=vcusBdsm(qal+VOxz+$`ZYdL zvUy8_VQ}H6W!qw)&Eb{OZe?gO}D$WD$dXpF=@GHz*VBNdfM+#o991Y>**gIZy z5?l4e&IwD){cSJqW#VirP*viuu9F(#beQqQtMDdztD-GA0Er9Ay9faxZKIScdOuAuM6>1>1fIP4ET<{BZC9PtZ+abU7WN|w)INjnL@{E9tu zuDUV_Piib1AYW-c2)3?@ZvSzdqrwDjbskAmET;S$2NdkN9zjUWZ@p!?K*IGMr_ zMU44;0E<(1si#DOUackDygR5pV%Xs2K@jXx}7`e+rLHAgo?A3C5rj z^J5`*XXUw;h=+wNAkHcsMG&tT_9FSrLN(O2+vBJ%)RvZjFFEM<_uHc-(OIF~7QO^f zPBPAs*;Frlj9L&Z@X0Sx7~;a`@}g^Pn+$ollaw@AxeB;@O!M3WA3yqujav#?N0=4t0s_pe9XetD}XqSq`px>C=(8?6Flp@ z08T18;Bl?gzM7YvZgreWRk!P1eaFaq=Is8h>Z1g ztv{f3ND2DDvjk!oMVJl~2@3ULOJOG?nRMdCAT@z+C0?N4CL#K@?E2*p+CPaUB!yYA zgAlS*fS#>)6>(_{j?KoSyJ(vc{plv zN!b$Oi6VL@uJQGfz1ysx3;dblt=9!^!PHs*iSXH7f3kJ`>OMS^UKeZ1UXELkB81nQu%7t+ zX%mt%wQ;x5T%R?Zi(!vh@-%wJb^r(U86=x$HD_0=CWq54qRnmVS@D2ffyd~xYNH!l z@d-U@AfNO(6|ObToNH(uRGO_dba3qxI=EImWCw95T>JYvn5uhTykm9blE2Cc>@7(^L~06jz=2T8iy~!0 z-x!UESWmC|g_PXX1&m|A^_w7MupvKpdh*Rb&@fUtz72TDs^Y^skx_iYwS}|H=^YR1 zO|V29Ie)GIFdm~{SZ{zK>=%#GgBN~0f4=eKfgwQs*A0Q4bun(Sy?}1~O*<>tji&%! zDnw1~n+(38-2}TpuPcppXpTrGY@)Q6Bl)I~CI>*rA)-;j!ySKKL`=u$#jog_vEFt7 zt)pI@BE!cg$iBE^Gf>*IaZrrAcGKkQX5L7>m@KHo_pezIqGMKL3E0~jS58^6e@q%y z&2ei-7IsN9{aTUDTCcILU)QW_$X{DBCDv{i$F7@hrz-kv77H=CvDnt@>TQ>+ssf7< zt3q8#<=x&+ljYvZd?7wL=WA~B)ims|=tZgbB~Yo1e45lWc2on%sPaocr1QA^8>TCS zAZ=f!md1D5&Inn%YqDD-xb?$7e+_P370^s_%f-2mgR9NNlNzM!4AFSf`R(HXYq_#; z?(Ff>xfzr;-e=ds@ENA;!qP4!ZH}}{W32mid=+>=>to8lJi@EOk*_f+$X1 zWxHUg>&GmVSS!7t_&(Y-O4BvKR^nr#6PJc{=@5ufA2ctfAg0kyZ;5UxdZCn{{I)K zd(Q~;KMvHLB8$s;6xtHZr6RbUxp=-f^U_?l{}p^x?NTBI=8oC!!cs-dOwVu|0h4To zfe-c@-E)0w?gBtZ+PHh*e}G#4mg={p*3<}JJ)Ybxk5vzqf;Hfp>P^+6$T|Iu!m z?T?eU{j;4Ok0FX>hM?!OpSk*0Z^0?S@&eUXoy$-gZ?vRu=F)jef1x2Oh+*duwOC34 z4Fm(C&fP!`(v%Z|C2R464kVXKTL!mp5Ave;f=)}@=dF`4CNzG(1=D(T=4=RjMLdU* zy=9;=SeZ9$E!29fc^b5_n8t8m2aQ6n4g-xxRFJ_+Bh1$8dsyyqHckt;RSLXFYu@>4 z4g)MPGY=Ocuo#V+moY>EJQNE_L+hDRniM}$!(B*gUty?i1XxVQzOj62`SH|xdry=qz(?fU16 zDMv8t3H{l=7lU5^%!o+zPY~M?7l3~1@-Z-L)hkv zKK($J1l6_-jnS)?HInLo=ph^he8^I7{*b4pCOxr~#voK#rgAJQsQs^RT3s~N=6Fk~ zX~4Cs9Q(51-dUzRviJJcN5#34)_zR%-fJUO-7M~v1$Pwj`JKMhwg7iRgUaEGHI7UP zE;dW_)^K!8TN!4?Ddz4QQET9%6g>Os71$7Fvh-DofoL<`8oTv>&?Oo-K+P`fTBW7~ zI_;KQ?`)TUKpE@f<8=Ko;Z9RIlBY0UOCopi`ksbFd6aGPaByO5-{3Nlj$N~BGr(=Y znJks30OE&R29?ytq?^V-i``*B`fwt&vYIOfMxN`54^vjx!<&WZvncmXA^H&NUgF%} zELLsWX$1Nvg*YXMVqv4ueM*ol&f(tuIWAu)ugb%URT?vR+{IU$R%OV zW5ApCi6NBwc7| zZDF6bNQDxlFyEIoAf9jy_ytztZaRkH{GLl+)?`jBa9NRm!8;@+mu4evSR$mI_*lu~+FDh1`HQkp~=kSVE#Ty^tw4V9Y6P@z(h6_PlNW#`4=eix#u zTVbp1v#ySR443gLzOvs}KX2naL4|yh*mR(A4Ekab>1_JanBlr2UWuNn-e~<7Myv#m-rY;7)6!@MQA}B>9)9xYtZVw5S z6jd|93Nb}Uv+33Gj>xg+o##>EwSNEkZ#I=<>HiS@hcCB9#G*qFW^ESk{RE|q>Md#D z5TgYV3GOjz6#|cfF*LMAfSrn3!as~IYNNUp4=eT%PJMV&i-$m-A<*W>g?Y2Qwzt`9 zGi>00LglMq-)II6MzpYmAk0B9WT z?u0z+-EoWZBL1b$$O-H85mocdPb`e~V5Wb6`8jEQ1J5t1ev2L2o8j^e!gOg&VXc5W zxrQ)&xc5*KugL!^J|e>T{aak*1vcVevjas*Da|MpwMuC;cZg;Y`PoagJ{#-+q*oWA zS2a@_`X)Q0{}}hhyu)LJz{qLI!;WxYkm7%!Q3SS^3O7Cy6!wAXfj zh4Z9zg@Ze8xxRsYTlM;8x90lhiCo|86tB^|eOJ*RrX7Fn`R!@cj_*=Cjz*MA^>;RT z8>leHy{Oei9(XCk85HI_xK?cM;3inPGAr5U#rh@h)xnOp8P!cp#&M0VsIwX+Zdy?> z;ikSf)nIjHEmMdBPvaiB(iPp(+BE5ZkJ87v3h9StZ=f}`CKSMB@h4Nwky9){Oby1( zB70afc%R%T1o}L=5Ga=0kONVqaaCXFZnKIe<;Vp-DeyX zne~DbhMNwf*kZ!$%V$3a_Dmo;3h9zJ;Sn zShOKhT;2_U1yu)Ob`=H*NT!YbnKg8#N5+`x+7d5rHsrcq!DlLQfSn8E3_S@KZ5Y^{l>u zuQl@fl)s+oTf;t$@54ENx0dfC{zc^b-!JF;-+vn4Z%{ig>Fv$g^NlZKmfx}5^v1^P z)zuL!Y)10jx3ES~F-F9_ns^&dcjW|-tNa!t742>aanuVKmC zQ{RTDF}djckW><~Rh5k?X&%_41vbro7mfM{(JQAa+}O%@i8qp?WmMp-e1B;)hZOu1XF6YTvo8}Em1raWVSvtHkm?FBYxvwem8QWW zUf`pOL>J~wB*i4sjH=11A#(9vuL=kP6QGHISLh%SEh!UGpLXE)WLhl} z^*++(rpwxnJ5$B}*kYC+!{pL*S^G7*tZmU{T^6)YU$}~%8|5oq8|7{*=yJk@7F07HeN(T?ER9A*lDK$Zdbql2}`&)lUoKhd;G2s`THe#Q$_Y zt}8^ic`Vj{EsF0O7eyoC5BO(*#3m*25~FxQ(iY;n0C61};hl6)rtwv#og!^2bAGyn zn-cbkQ$HxCm{K?!$1>K8rqnjrXiBn617KkYI;ocLXbLf`tYFgA1^XOn3h^q|+XL7Z zCvJL}X+3}0Mf4*?_vYx!K?j!~65<;_7zrFve7>81m{sX;Tnu{A!nAn2rN436Jw7VF zwI_IvBd`vFnF150^?nX_+(r8ggZ%w&2a9t6wW`%4f7)6}p>^VlkS)PK5F51>SH(~G zP%I4Fz_kKt;GZ^d5b$Ev!Fc=>%~*rmSPw7010IrC;Kh93ll?gi48_VuAfJSl4FF#F zLb)h^Z9m}~XRioE@gWcyH&=;QmU2CZ2XuWdZ>;<)+L=XxU&Te@>H@c;^Hmqm{j{8G zfn4Dzx~gYMo55cVOasTLFq1ZRSUR!9Q{RVQcj0L`Ye~P>tF@o|+RKBe$BH=Yzw8|l)oV1txpRDsCn5uO9w0^zrTJMQzua`3qbmvE2dNQt=;fI-95_L= z!gZg>`!vsIeE`g3-F+cV{D7`}aSRBPuYTGEly6vNJB%@=ly1E{D8Avlu;y&3o$bYc z)fncm81r3RlT18tfF^M&X5eaopk{Ail`Hw$@+%Bkgd6I2zq!}mx!3M@@y|E+?n^Em zYx!xz9}N=D_S)mU`@x$pgidlM3_WWELm36Nl}x`(H=;=GDXGC!HcllY|QtdKnHS@t9eUQF<&>{GMG10mCUgstj zF%v2Xh(X|?%oMicQm4s}eOFmmzCLxd3dUa(zz_OrrM+(!0 z&>p;;9c*@vK5xN&`LMfrw+$xhsubSHJR5a+0*(U4Ql%LvL+<% z1a!}VnLsH9Vd{7Rw~^J}E5w!ogwSen3K@LVe+z8-c8^f^`1G7%TtpLpjQQ>bCxH;; z9CP1$+rwtZu=`J*{%CL|CcxWEiBZDI1c5L!f=J_FVTd;x-NDh`S)x6-ImBiXaz=JSI#_!WF0|xE=Q-)2@v5T@ZX?1tO)rb7c*Gy`&T)b>dDRTJPTIaT-jHj{QDz4RwR~fQ1fFD7pwwzBHNz z0AVB&Tf3p-^b5b}%)4C#bLs4NyC>`<_|Kqtxj1OcFZ>`!+6MCP&h6XNFFXI@Mmz;R znen0>ti_20s)sL3Yv)dEE}uR^((;Y=4yPBuc~m6nT+~O^}DlCR~@OXPBmY95fGNbBtR&NuiGaFI9g&i z(YfncAQfq~+#bERX0;);>EdNrhlr@`7qCm9jtZVs7C))GXfISxI}d~bcW^7r;Yl`> zTFn7a>CgkvMjG+b==!NazB!zhvmuEStlJ~5iY>{wwe6OF09in$zwW*52zV7o6AA^_ zl}CdC!NMe7M@>I`a^4A8p4@zN;Q_6SO)K3;umX#inbjumnHjg1^Y&eI_3l+W{(>zG z=baM+$FZzwPXMez;A~RB)5&uqQUBJ~`X_!Jsfz1|OR7CDCawgqSU+`bs7jp7)w;wD z!*p|p|879-KAEn6f3baM5rh{oFa5Q7X+Mxje`r3DdQb@eq7?o?4*p^K+{7UiBR^1z z{6!Y|D|v!D-e^xxud-9%{s9ptp!=Va$-ue2Ft#HXD}kk)bE9{x3qF^^Q+l-=e^TaV zU^2i735ycjgfW5(V+7=D5|i)uoI({#^BnN(!^-Y zG4lsQR5oLupxgj=8JOU9*;#Z|#IhsHoG;?Z%Z@Dje5q)G55u|Cfd{UV^xe5^da&Ui z2M3!+{0G8BIIB$$K)UwQXDnVv@nY#ptRxfiKtzt+&g<^$m-`3pt^2K&U3e-baiw-m zx&&C7F&JfQe;1)rV@vmeQl2$DoO+*hwjsIhK#YCX*~PC@q~Xuq;z0+Rh?AF>2L%w0 z*7RX64-Y#JiszkO$-22#ymQ}eJSl$dK(Fzzcvn0p1P{V-2`%2f4Kb2I+BEjsJ6sU{ zdi!=h+9;*k~hB= zh_nq^Plpv>{0h$#N*r%)-+qtCfyZMBHKeI$kXTH3dIO|#oCWq$b-@Xl(dsYD%e=$Y`kqzfjcq}lU4%g~~P74T{TwTMdi5e+DbwH*hA~y14fDlCZ znO6A(s|y!nK?Cuw11%Md<5B(nnByH3cBmVF?;ha%kMAD{sPhBhXgZ3D)wG{o9T1RA zU9jK5V-m2tIKGM2y?AKddWR;r*6Q25rq0-CFThdnVmd*S4Flr#sgGGfprtbP{nT!$Wn73w9oL&!s!mI;;XX+2FhC5d5sZ<)Zzs-=03ySgH7Mcy9d;dmd4{@YO%m%zgf3~@xTtn zVFk5ike}NSf1@$2=c#QN4;o0kj_M{Lj^(2fbxS-2%z?!st{aQh6wPj3)JZ7mrTeaM z9SD^XC~Me<&wq%DrZ8H3x$zi&^oVMvWAXx+T6q0}12OE^_y0K~x13S4^#+D>;Seu9 zFSD!F_M6VcGBB(kNaIbI-pU-3;RZf{|B`}mFY~rne?^qYS^Z!zW?Cr|i+DRiAvx%% zg3uMStIkTLEX(YaNsqif?3Y~)F-%H=!cAi8*){t|?hLpW1jk$^fhp5J7hWEPOz1k| zp7>C`kjQ_a&I&x%sE>+E(F2uow~fG{hD_{=CvO;-<>xwg4nwnN9gI87>C%=QMO|H) zrHYi3e{<6+CA2Z1FcgAdD!L#6O@uzExmo^5DKTAQQzBE(TViFV7TAkebFTOm@_4S)jWVT*j-rl)XfZM7K-LxW_?< zF`?cWe@Em8!V@Xb9(MkHPcA%W>!Le@Y7)V6e@FWJB%HI!1CtnV5c3x8`Bi5TR(p7Zrn5tl1!8rifAb<1Mq((?te$Wki8#q~C9VQb^h7o29KJk) zY8Zb`M4Ul*P$iiKfU)el(jOr&)9dm2Miw^?Z$HP4zq=$11xuR3X424N&;{iEzAKxe~Fm? z7_C#>I)HImOpEvYuqPiXeZX$!#srdR;-)%<(n^759%P~`0fevx5PqYWQBE<3j5Qf& z{=&_?%rs67`7B@PEMIVz!)W2_3BO(hCWtuxHB9i-GeOVse0$``b1GU5-t9;Y`-xOa z7v3e6!cnF^*gx1zhM+JSRj&<(gnLCT(fEbAM-e`}Q9n$Pu1 z^=Crx5_lLSE-oL!)^L_j#O+ua^jjx(EIy)$fWHGJcoPxqDs>u^!>73YiIXOa0p^PL zh0l=nAo3!A8oTMXz?qE2sm6WzRhZWhcf&QH?9O=9D@J2r>riN-Xk)6fe;ezws>9J5 zhyBe9k?Su^Vpo=@a{7e|fA=6%Xr7Rf91)giJA72W2zChKLe!$1vuM;sQ=)C-)V^a{ ziTaFANfCls%|Q%LIw&2R@HHP1WKKUqkVk0T&_Yn+N{mDLpaYv8?GcV$P@~DC_6*Mt z^%-Npr|0@)V*&CWbe~{A{_%P10qyBOd|2b3?t_iBb}H3M0|3V^f5sDeA8Ov`lK0`p zbIr>tLea2`Q92vh4$`|s7=Ly{)S&Gr>4mCE+XyLbllH7Z8|&yJ$UD@uJk!$_BBjfN zQffDx1$DX5G_YMd0)D;aVks)i)_^cyu3k8+pBLVK=?TwqU7-0flrlYeK72qVoE-P9 zz4}=QAL5ERhTWAef9rnm_X20oD?_CH@rSmhpN4j7r;?3V$V5Oj+U33}|CZ zCF6`5S{DmSZz|R1H&G5;(jRC!l3hgJw?NPsNIKLZ&Y6ED18|24Sv;@rWn3ByiWg`# zWm#HQ+@-hYsuuU~>E4gaigf8&v5#GMS6D3W`IKZ*Xw9!ce>M!9ofVssYwL57$W4ye za|g)bc!VIH$*X#no35!_VWcqnDF}-$V;&F#FoL^=gv>8+X&^09?-Qv zXpEl^%#S=D)ZX|5FLb}SgJApc{M;CC@XWAsx+hyY9L==BuY7}nVM3qq)pNmIILVrO z>5Pf+m6RfDmjzw{5D1+d^+w*b>zS7wUI82@tr(TjXOG*chNBqIu&c5MIP6PL&L-k8 zgV+@aVK=3&8WD@IOMLQ|U|s=BfA$o_+$}w8_OnwAzkaYn{TxCfL4SV)``vG)ANVSN zQL4p0(oQ3@{wQUdr`96x+u>-Wz8=b5BV-2fMn8Pm&+=M}s~H`zrVt+Y>VD_v2`Qhp zF!#YJ81rUjjiyKU#j^~<8$*tPlj04CExnPDOi~7@%DqcfaYjm8%Fg~ie;ES?0>AFe zE~dO4o{>-ZXBfn4yv5Bhn43l>A;6;%?Y3WTC+DZc@MMfC{7JixUv}tTS}xn!vP*`% zo(C&qssvAiM|%SA@k>z2@4a%6A5{yQ9t!>WRP?LyH}>M1{4Z)U|KgOWGI^XQX+I@D z8GwkI90R4F-C^{v<1yL}C{ugJ+XPC5xp{y1AiVtc?Xx>4lNl0a?+nWZX^3V8r7n_S zX%wseR+rIV0bB&-aCXs`F<=2KDBHImiIo=V5soV76Rs*i_=a>2{D404Vbjjn)5u<3Z0x$(+3A>qei0A(%kZyaGl|2t%h(sev2zxC;Us>)?Zs7`9!0VB3gp zN9YpnPtck!2DZ1}*3nj2ZCpcth@sKs&V2og8C1uId_@bU$(;q?ETD)8md{K-!IK#~ zBQaw{M;r|R$PGF`vXEwV@nQ_vEU9eTIimf}DZPPYV?V`_8PMk##VNM+pdv-%f!uW2 zIc*$^IT-}RR# z^A5i}Z&|}8T$wnc?cOdk`2(( zGygW(yxk5R89cT<>GpXWlqS0(vFQ0C74~&BieKX5(oAlI?T{i7WHdHl6Rs{>ZD}Us zMD~z}0~xYlyppb7E=Sydvic^-cFDvJ*C8~q!{Nu9*p0pUt+Uz}mz%+GPDj022fc>f zHf;C16#SC90aB{K{UbBj6u5SXvI~1!C3r8-Y&kgws1=8{u7W4EtP>DC7%`kZs5gS{ zV&w#)Xpaky(v9pAD%U}+A@K16M31@S5XqM@+Q6WL`9evDx>BKkg2B~+80#nM#Y-5n ziJ5<-&TyI4fo-!^-^KLK3g9*ZlTKH2=1^fQ{qsYTsZv~E_Wj!Qzt;EY1^*k$Xa zG7u%SSAp6z!Y^ch6&LRp5H2n)jG#P`T;12Y?Z?mUF?=5%eQMyno4~4!W46I=CQcjE z(psR*K3)f?huKe&jL*(Tyw#j-Xp{0T_(pF+&ueo!3^Uoo^x6KIj3oRWHCTu2N*G2R zR`{@$c0TiK$|}RE$~%nZ1+O7^A<%eZ{XLeTnN~o4GHSAajvvYi7q*Fqi1Mp(P;9B{ zra$!i@F+f#!3Gt*cCr_3o6*S$IynkL!Xtm2O1>UejXy{IyEGQE8{-nmw+cf;IFKnq zki=Cc!z4T}yp-nlRFLe-p3220F2W&;jNIovESO1rr=y3L*c>`TNj&U~`JAuPS?KH} z?gmbV@J>yCI9w1;g&l}?`Rn73%sS|@KbrM#g$(g*i40g{x;?}!*p(qujyo767B26j z%bSQ@2-hou6rF>}2KwThv@l!rU|nM^4}!Pf>i`9m&Yxzy6Xqg2k8xwdDQ^XBqU4U_ z8BPh1q_AMl;deh#gr+oWA3mTsK@v&I&C*oV8MuwBip&_u|+vH}OhN2cwISumoqA0eG4wwwrTPViVAht6LB z;(%v=9E44TW#x>M1ACcx2qciBpzn^IcD1~VV-t^V4uqR`ZVvSu`AqB;#gDS;g(92z zdiUi)8xw2DM!y~Ma2k%JFpU}G+}fcv9|n^C4rJDhLsQLAEFcmD=fc$NtD9q$>srn zk$^}>(KT13C}KWXgG`7D+oS& z#%4`xaE7(t#IQ0IDff)1MNKM~pc_$ti9Dkct62I5wmKAkMj8qw4DZV)AgWO0m9l#q6fFtUifav?lkqV` zaBP7{hxton5Xgb5Vh)l5|8{XA`S3wB(+qc|z4_6cRHKog7iBeIOYX_>;lsm!dysBJ zQo1UIAfi{O;I&l)$K;>LHS2u4^czfB`UWA=0>8xxJUBCg^tM2HTfqrCC%x!OoZYs1 zX})&6FWuskLAx%R6W-+Dj4_G8KDOK)Q+OP-wVA0?MNYP6qf z1#zI;-^vSdJ!}7PSVRYz_V>Vlo}^Vn`|CY73UA6mzUGuxXbo@%-ol@_<3H2klt=j` z%4!)>d1s@W#32(`beVAp2E!51y{fm9mK6+B;s*eAx!*f`ik{%wiN{9p#GoF=5tnd* zC}OPVb}iMZB4O$T!z5ZyMjgOJv`{1eYDB#pYK-!Hvt~dsP!MJS?Eb`m$m%E%)ZnUf z$Q2C@Afvgh!1ZEf5FkqfX8N~Vu+Jjw%ofBICq{3!E;bMi6UHJgMTP0j*2xAzZ~z7_ z;ScsZ?knHx3=erp zbyr;nwxOF(W51Iu^Wl1b1yKVRR*;xxx(J>S9hAM?#fF8!B?sFM>YB?47kLd=RV*2YoGvuR$b$|dX4?_pU8_O8#oPKsTBBM7SluK2^jW{@>R za>5ZJIxF)Qozk7g4Tq@7joaQm>C>`GtwK$pv{yi9&|5iu4vq6DH-%or?$ZPZHiMSG zu1nch5#Ci0dud;I_X_U!hpJztvJ<{>T?(m(yc!Ydla^Wd4HOkT+`k}n^EUuQglQAp zIIy!YjMq0ri28AVIKxda1`$`w>@Eloo;keZx)jta3}1bAP^Z|K0YEVng=xL16)*E!rP ze#XVgUh#Z?uXC|iyx8lE_KLN=&hcLH!(OKZp8;`*M6%bTmV-u$YLNJBPar<8Ao7dz z1&z)nrTFa-Hns8cOV_#jXC%-8Fq1Sj?>HUTfKp|cRNvJA&!~};nCIMWL%7LBOlMgY z?4cl<^e+*<^)Y1Ik?>`5^mGqhl0l`;(5nRf)#`tLjtefgPhX0`PB0$*-9VAo-k)7X zG~{SfvN^$-ZaDrO@TwrDmgNlsSS8>3YEfTcw6as6<)-pV*=|srZq3)1XBU0t0zs4~ zle23Y&HY-T^>3y=@ z6s%Z(ml7w*J`2JBBr!Q+bfbMfRe&x_6uglm>LycAZ_NV_F!Oiqb|w0cOB7!YpGpZV ziu)F>U7-4L7%Ws>#hPy4#)?ij*%BuII;Iq#EX6rHNms_HgKy_n z`3cZWcP$bC;FYnxanNbU%U>t*E3AtrDQdR-01aZ!>Ei4j30H&2Xd<}YnSa@Na{Kn~ zody1y=z8@C(2Gbh0R9vF29l@z9^iLqpuL*nRq{I3cc+(zZ2>AF947nEk$M`V2+5r~A!;;)P;pU{Brd4Du_#U&KeX6Ge{7W@ z`FWU4u?J61V*sK*a5s9GJznW9BQZoG+dRC$N#qnd=t_#=rkAoiDE{^LHvNjnUoKiH z1;AEHUz$nOdS?Rvqmb*>9N}i?4rJT2#Xb&9(u$?US|rYz(w2U<{3|ywDdA_me2j0K5~fSb5)=77&V9ER(#Va|K?yNO0i zsL$=9C(v8*>a!p)0+ZRWm1>&%Sd-$u7BA;qTkZPq=cf>KowL29*R~}DePEEk!}CYx zs_;nN;i}yN_A|RxpWAf{5H{%6p%32nnMk+sNo3ymbeug+Z3H-8KHQfTZ~-F$Z?RIXQ?#9$^-auP$Jt%%)OHeiA8qdVLLa)6dAi~R&! znCuz1x!LnE?*AxOhG8f(Hr(l>Tj8F%HcLb)bK}S?rB#F)enL@_r2S1{j|zEfopwQ$ z{M-=y<7de85Bl6KQeYpzV4>J3`PV{yESs0yZ~+>B&q9QQU-vXUq79}Ku?2(S^AS;^ zsue=am54AYi>q)T9N@_6>D%jT>JiAPYDI`NkSfwVuBIcYDTEx&t10<(%7k|B0JhY) zxx9E$tq~$PYqVrn*{M{v_=w6Dd1b#;D}y{AEBnP)wvftReMDs*5lv2!8Z)yu9#779 zBn|t2>f~*;4X-SAW+kU<&MRroTe9jb7U!>w5sR~3xy-j&JWk8y%6l7ve9oi23>N?K59NtozE2}QT;n}EvTK0@@L z`j4DuGy4GH)t7xxQ^m1HQzYZin#!3c$b6R25XBHW1TLy9lUq}lvZfG1+18XrHX|06 zwkIuOTTmi@Wr@PdZ5drmExbtVnuK`v#9Qq_L#Q&KL)3;Udo69=Ny2te89J*|(RL(> z;sqlixHsvvmu~)1Zw}=FT^&lDUi3 zkEg2&({wCH%Zps&mli()%dqlY!oTqTmU_#!{`b~V|9JgYOnuSXWO8bX<-7a8Bx7h$ zLus4U;-s{ihP#!ZGhg11fV*PoXBLmrC_%k`wO@%Y)ZN_stxKv4UXX)f_uak@%71jRC3&V7$ z(T+u=cTNeKnwT_7McqA4o4A`}lm*KI{sKZuep_$R1fym_(I?;b7Bhm@Nw~YbHvy0% z#!HQ-!g9AO$3;CO)@H6hC1%Qhz}g)gSJW;@w*Vy`#lFZzxy^S;CzVY&l|SR$re@fA zO}lH2q?zsFu(hu^2*Vpecm2jT#~+#6FKNH3TEC;yrJ+)f;I9qUZx$-m+IfTErk1mV zDC0qcc3nhV|DEzw>3fK+nRcL%$L&O=9YsIC@xBrRahLWL3Bzrp_2ycC9VrLxO{N@e z$5&A)n(IVw%A78TXXkJQ`34pT?jb3wy?PhAOLgU`$w}u>pH-gfaHgS&IDFM`vljMJchpie1P;c5zpK#C~*f0HYY#r}=Z@#srYr1NT-AbQ>d!{{qNl2;lf9TBB#+ zOH(xLgree+NQkE${M;PzH*PQjVpDxK81v^b05<%0dLP3tV~P08N*TC}a-$=lS$UZv z_iB;l4-13eoC9+TU~&Q(7v~-W8ZPZ$lD31E_W;-0DXv%uRD~RWKERl_Kb3;AC}q$R zl#_jUvSV|i%;Ex`Yoxz(s7cO=&@F-f?*FkBqVaJtNwB)HM8t!0KDj9()(vYT)-ebj zZ*Wr(y7Nb!_q_pnxHoIx?cYNfRJ(tEb>?hjrryCb=7*nE$UWwT+|Od!LJF5t<0JB; zzFH~5V~e&zGrPxsr(;j@9!;zW!324YlGz|be`k;0f7a(Mg}+k3AR|8Vkav;K zdm~tH$&HD*jRekSd=1-xaW!0UU{tZX-0=U?jbbP}z6qj#5C$Clgy<=~lYZ}LAMHIn z(S5EqsS+MrP^)4l{W5>&17+8i8Nz0VMw+l94(=(UvfVA@f&ZfnXtC|%^F}{{1h~HM zXyWcUqA1WR#+5!`BjE={6JarNSq1&Obb?GXnJJve@1|H4rAoOPfJ{+eXfI)&n*4({ zO~$ZHzzAS}G-n_~KWsD&DD`m_#v4jH&+jSe@MbHg9xG9mB2bUwbmz7IYvJTuY(ZtKa|14orgb>oKrM@Wj8jYnZmOy=p#K!BwQHdvn zO2IT}cnTRr1qo25P#@fngy@*HDHF+m4TK0(gS>vYTw&*Tb=4I>-|$G2 za1jqJJzHnAfk_iNrcQ$##i~QcDoJg5wqQjue$;t+1c%*e@f&>BhIksxic5qQz*7%T zJm?6MA3i!LW{*1WCN1m`r&AmlAOWq;Ex@nVaGg>+XC zeDSm(_>%gzoj?S|Y54@F&-(VkaZ4`2OZi;UfU4J`!}Y&1!~6r~+@+Voug}qS&^vm6 zCucvUP&F{GG*KjvY8$~POKsGQu93iYMGJ#vfEakxG$^{g)iri_1lx^LgX$(Bm&!U&&a$`5(@n&2Yx}p}%-F>76lp-2LG!EO3I@UP?Sa^X7Unbo!S{7I+-;Jz=U!%R@#10yWGh_NH1vp6lu4+u_;ld?(1% zUQGB0jzu+P1|>utabR2p9#F?Nn>aKQ#;E~V1O7MS@z;9)YBV`~?M)seJq8Saayldm zTcMq-j9QhN=WBmLYYZhJIp{r=Jv?R2QZ4Gk%~r5ok?)j=Byl>AMIqOFRkjl9Zh-vW!MM{j2lI@$slH z*&1^>do};w~fR}Gtw zi7hchS*Mtvqg5RWGLI%eMm^2~E>9LBILGI4@*7$UnO*h+3g9%zQ*lPq8ukJckg`m< zj3ffmpKQO_z@P^>t%TLA=T_;Jv{?WSgPnse0%=W+0yoHDrF^*@CPJ7tdnIs1nRa8@ zjorZTA^?|~(_ziUW5zds;q2caztv{W1-a4{6(Xu%KtQK+pWhyX#=l`f8j~rp|7O-> z8&P&~Q7Ke??Uq)EqIWfZRJjIja{(__6c{DORwY#OFI)Zk0XDXbf91J#`tlk`;>HGa zDkCe9Ka-@*>y_lKrc zuGl$^%vOx_!p>$#+yr`1-eMRnYzg(KU?1;AMoYLUjG3?Drd1={Pvofoy^M4`BT6&I zq+vOgm(9{OR#SyBZ^|Gb*}l0e)D$47LG@_`jT!!um8z4O7Ns%s|M1$)#l31e*3_pj zZ%T^)7gzYv0jJJ9|CtF)Q0hH4;n*(y1_vM5bbgwI(Z~mqWCr9uW%AroQTf| z^axhR>GHeiQ&KQKs@$RW;uSAg4Ry>nzEoAqoy-?RZbNxrpNt>;WhoTqDWQ7Mm9H%e z*dE_Lzt_U0R;HDXoI*+|5gHDwssPW8MCy2tI)Y`2?NZr)Ijv_oq1{dT>}6kR7O`>& zx^edF?9ny-vK@dsvbS|f5@puYu&n&2xK2s$s*+jRmSS06m6m&*uX-w1iY}WtMXuHw z?lshB40MRMC6Z&MrM8ZA^lBtN!Zi3hvWB4ofSMbsT#)_5*_w=B_ZQS18!HcwmFtJe z*o+c=X7{Rp`GbpTDf23!VKwDbYP?T4oOiwsUHBd!>v@YdA;N{8N2WW!m!sGT19$TfCt|PnbtSrc|KC#p^ zY#%g7ahp}k6oqfmHzU!^1vQ{iOMcUeK93n;Z^}2iQE|C0f2tP z?<3+J_U}y3#31&80!FZgB_v@A94+7vA{W{3E5Z~ zj*iWV`*b#3L9)#`8!&ZZjygRPTS=fhf8XbZ24fq6ED67;cY#ft3Y63lmNbo1hS;Ze{aQY}#BMdw44-|;c=+8d^s>)#7w01*@R@ce9q86gSi-0;^aoU!l|BAV2j)H8P>dnQ`pb@X+sMskCr zk|<@V69Nk%yD_iPwqwZ}E{G;h5n?I1Wy<8b>9)g4&A?Q2*btR%?MuO*rDOS~e+}MMYJ=S7&dQ*G|VLp_* zdql`5x=O&Vd@RAfT+Uu+J{ub9N~!IC0B~}G;{r?shP_S96e5Dbm;m??z`~-g+*11U zDcZrP-&4D)YS@S^e@~7VSY0q0JnAuyd@arI9tCS&3EtIyHo2zo?7C;QePRdnCDd%+ zh&?L71L@OM-DN|J9@ws^vqIn%>E0}Es>=EdjA~a?xI1qe4HIFnbS~s8f9T5+a^_n#GD!DL zKzZ{S>n{6(^%a)PWGv8wa5Zqe$68QyHK}d`SLn$%2z)s0V^HLbE+H9RMOo^fsfI_OZ3L}<{FVZRR8#FK z^T{XIXN)&)EnE!*2q*V?Gi0uw<(*hN2PFKgOof=Qt6Gv<37;)$*fMt!u8|2_zS&TtrnPva?FF)q#- z!_-_z;lwxJAHE|t0{j$z&am@sO6P2$3FPGrE|Hitfhlm8r)fXpaxCpgeD(2rl9`=V z_9OzpUqR{!zNek{m1Pp@FTF-1Gcpg^vX{t|k#NYAy`)i4M!z9f{+8~RQ%xrz2o7ER z8=SzLIZ^$TC)*p(E{T3&Tk_>{rT68Hl-~Y+&6t$C-f6lp47;p}$Fwcsb)#ofsP}3PO5~MdzOuDd3+m zE$`;n90I)=6I^7m@m2+bk1hg|!OQy55{W>4dGkSz$VyIT$i8%!ij#4CpWG(RTfDy1 z+~xAwI8s%k+oer^lWUE=@q69Ud)EJqBK+p^k#5Yo_7q0Zg8|f^;4|%Zt%=1_)poA& z{Aj)QwaUF_wRO$?aC$FyHfbBJS5!C4G)@B1ZiI7k;%tRuTOrMn$X_RzRJ1cSB2!5x z!ATKQ#axC9*JI&ykr=y*w+%Xpm0hU2)(n5J{4M+hcs5;sb*m_+LU)3xyMnH5&sBl_ z9scCxHGvSCbY`X68hi06&8QwYvf_C;UoF0*twW~T(m$<5H;Wh}VfrvBd^d?(= zt?a6n^-UHWjry0RsuwqE4QilkWP`w6>XlfyQ_jWjPalv{NoqOo1|wrVjRL$HDCb(D zCNcU3YNWq^QZckt2sbHov0MsWG)bW~qNfZR-NtK-Wf95aVs!Kb>Ot5JHA$OUrllrc z*9u&dvFOCZHY*Rg0z!4>wOrV7I;Ui)Q3P~@=G_sW(<8*>BrHP!3+md%)9baFjEaDR z-%7`Wq-lf_gzs7c>fm$LC>}oo%feHc{JCCT7yv1}`V%TcPY=tvKiWUTlK`qTE2~q8 zNv}mnI7ql~kw8wWN@(L0Yrur24-ojNkK-*jnff)e2yL2A)@_pm$8!MRGJ?njB8>Q# zn{+aNdKO<23kP=k6FJW7tIn&ll2>8lxz4Df=3Mu;(nIN#W!2m9DGJ{9I@oDeJMAUu zQgRs>#>%oAMse;>116dkEdIaZPX=whyqBdS0;Foql3H>vT;GoT zM2QQHsBU(vE^L$K8gDp$xNzEFWc?)Rfk#CME5_iyQnP_iE`Les@aJf_f+&wv$|f`# z^EI!i8?bh}ehr9cPbEs1F>NyF{S)Aczh->%n+uHBik#B^QVx0d_wfGt@@;>PNR9Y^ zv&OKiarZ~DGMZn@)&D*f>-pZ1b9tCa>gYe)Lw82TNYOvtNnP0hX*cK; zYMT~ga3$Yn|2<|s*XC76sH)#<%oA9DXw9S|TvvsO)?^EAi8WO5=CJjz@-=DMPkWhD zZ4%3yJ!?4}LH(yBp#d}O<}&yfSNdPwF-=!iHz#EV-sJWOF*mwQQ^G(D>D=(>kj*Fa> zyDaC#YhzP4)%RCq$%tK0tPX2E{@%c33%r?*3-3eI-Vm5>btZ+aHj4T+m>?qb{{<|2 ze>uzE|0`Mcv*sh4&vTuC{@+~rZ{*7VaW?d~v5jYTJ+quuY@UC02f=0QS;h4;RBz#V z6CQQ5#x>RP_c57-MfB%cOhmnZ`@teS*1`R$J{mF43hE65F4f{Rp#CBFCpB0Z42Y1b zKmiT~3a|$#K!hKcIH7>u!_@tD4;Yypq!QR<6zV`}`^&{XI5(hBY7(+OYkOZ2b7kXgHi0^(@Rad`edPc&r zvvbbLA2yolo}QlW>gww5ssB|yv*bOW1??07=^=yZLKP4Fw;5oJt#^*;7# z6~`gEGwj#u>Y9%=+b7$tOfb2rUjn4h}cBfC5!<3ZPbH4_5QmPlOaZwHgP1XyBSv zVU?s_wSvNg7=bXD3hmVGw8!rbK7Im!Zz&=+EuLPNRC~EDpQ3dc5}zUhlm5 z6$R~|pykJ%b#%fZs@&2s)*w@fZ+3QfKOyNh;l7;@X3&}~PDtKQn_F9`-;QhmohG_u z^Z0mskH@-FYsg&tL^b{N^ZQMI2C7vW>vzs4zk5psVEm3xjt+jJp63FUk9z6@@F?X} zw_`r-Z65!Gpv~8>Kb;(WI@~;Y_vy{<=G#u=&hZA_+qXxXzaDRGVp3IK9b){Qqqna< z)f(ikk$dw~y+$5PwU6WOEl-@PvrCgC98ctrkZp9@F{+Iz({#3Wj<#rj(mRI-yT86Y z*zdI2#bE1^iT8g0_4W~mSJAki-|xJAyNhnFQbTus+Qzm(Q^!otE#!|7EGC(!hX;r6 z5z(SXV;OH2Gi5+Vn=m59`z;6zY319|*zK4?&eW3Ik#NcGxE;M%^ z*)+MPy<6@SMJUfd@N@f~%{XN|^1x$86{y#OTQAvRbV6|%TyfjEr}2+YYBk4A=Jj+M9S4E!LVaq%W^*j48c z9p6yl+K-|sxgCUm8c@*ofgRX(&>372;91QguQL*ycGod^=$hqf&Lci`bYR(uwni8FV25L8)TnQlR1vgdGlh!nv z2J+ZIwZbrOq1qJ2a;>TTG7}qITjSpx_g_txt>26zo85 zfd$)XayMHc`<*8Dvq{-$axWV{0Jx_m&D)uK(*e>|5aQ*kOFWR8%7yDsFkz5g^Sxhx zlF(LI@h}X3^&awI@U(2zWX|l2X+7+W@a#;dRaar;d+jbyqUjg1tWRb+nLM8!4fZpk1L7qu}kTfNxDkpmjTK ztgSI3#Z#C1yumtGb$UgxopvJ;u|4j0+D*yp?QF7toOaqR%1XK0601`Ooqy5Yu&$~RkC3d_Rb4pNBvCzS^{$C(-4~_uYbWzN0s=;Vtgok6L`QE( z^zkI{(S?{82C%aMR7SM$Y}s2drrEHj`UxRZF!?kd8$97@8bw0u&dj}{P)UsadW?-h zA>N9A!Mg_S)-3Fb-FgO6W*<8iw*2Gcj|WGzMS)R0I3gA?46NNfBTmU3bQgoN-i@9a zImsAulH%?Da&+#^%Kn^ojtdW*NAc;?0@BPZk&1s9@)_O5jcI=~L<$ zNIuHJ8eje{Squ<+f+D z3FT)!nFk0G0L{LB1+ZtuxZLD96srY&otAd0;+e`v-qrs?T(j0;4Jv3cSmNA#-9(Q!d@)n1lFU7#ClTJJc-eS!?bEbifZ)^ts9}E&2Fm zVO$=9zUg`n9Js}{*g?;5FUmNrt$Ek(Xo~sLn~d_sm*|OU;4cdKCwZq@JguCqe*W>+ zd-?eZzIUHH`Mi9>^ZUePqbkmrE2GL46i~)MVhs|WMW@^_AeiZ3>2(&sa}ard&fIfQ z0Y8ih4-EW^rSeyttC_zLcl8c^t2*sn(A5QFC558O0*a@}?9a<1P-?(0-G#$mV*R`0 zJ5?=DrYcR0u9@@>HCTT0tT7M0!v_thQXOX z1n?DzobBtLH>Em(k>>I-4^WqXyF1D5qV|2+y&r!WPp-yXy+oFMZ-K=#4|AQ~pR1MU z&KN!K_YYscv2xT|V42)sG3r~B&5<{sBHBw-3kztmM6JZfLdfw2x?YtqKm49b(%$JV zxZPppewutw(#>!)7=GO z@df7T7*bkDY|n2N-uz^O4T`XdmWg@YnaTt!a=p4yBmCn%Uucvh;N`(=G9prN3sa&D zscdjlU^Ir+YGi9?&rnQ(wi~}&dFDU&p82a?%nSi=yP#o*=-Y9@U&RV4I&%~~U!J=& zkZ>%mdNwXkm-Aua8)eRai$%RA#^v8ZJr(lkG1Fl?K!+B9Tyj;<1?h{sakI?fB>J?noW(;7GX6fybs;q%Z1sC z7qtc@cHpYEv};`)^tBot(C#eNp2h3hFc@_Pl-R9;36S`DO#o(p<@4oW;LRW`W2}kk zRJHEurmT4@P<@WnZ!{u9&qKeWc874wles_eZ)suqy&Q`x=ez!55qO|0VJH<66F|bW z>YRKOAn#C{ig%G5wlR3e%PDDHynbpH5eS@mOXhJf7|eS!&l_*Km<#iVv%3#C@2CkD z19+ZaVlGC?6aK(|BV;;zxUf`6Q<5E{?gl4>;}QE3*oUL$ zFUz2tnCZ=dV;J`f)pB!s?c}P{>tY`BNA2LFT9+3LuhW989mxNR=3n@4Rc~E%bIJO(CLXR6F&~?)Z11e#d8b zpLK7{Ner=nM~vaM?7@tVo_ScpFAMa2UIDQ;?k?bT=mS@cT(z_A7&{+AR=NboLCWc! z*28pFimFn&I=Sj9U6p}VkT{E-SV21J7{partd$W;s(xol94RHi=^>-uVXa|8o(MDxtlkGDnUD|IE&-4(qR_-M=c%yH>wwR(n`f$hncTDnpR${fW| zG{>M@CRkm-D_tP?g89e-A$qZUFg*+U%$@jM_1@e*IijUJNWjUqwaiV=)A{w z@NBx;J#sGTbFD^42IDBfSjV*#}}IX)_;@RYk4O66J>` zDUaz~umJGlfk9XIfX8}1uTi;S`CweduRR!HlZb=N`=Wv zuN1(A-H0)#6~8+C`n4)(*A6amux`Sb*qp%s(>nqe66wtHoXl$qFt^bxEAoFqH7D5x zm1R&ex30)*2LN>eK&fU|;dT@AY(^1!k2#lUcai`mKt zTnE~EGq3n<^%PW+vgW{frL49^>N;cC#0p!Oxj;IeM5(Bl3(;PrWb#3Pg1y;|lubUQ z@hRLcoqQVJE}wi1uWImw7mbwZ%$gp7$zrwMbHZS~7u~8FI5lR&Zne|{mh7$c zfF%3)PO*y=_T6OEPON{=S~;CUt5e^U!J42tNU8UXJrqEK3{PK#?J6eF^gbeNKY z(evt@>5J5vrMm$*Aky{Z!;F~}onEB#$%nK7h1=avJ`HaV0Qm%7>PsU)t8GHl4uuC! zeWg&MiBcGs+~O)SXsr}r|F|+4%>zo-_725C5Ya(O*vBkfkxPNHpb6)%UwE)ny z!s$Pkm5N)T?|Bp7dfUU-JFow9S*uhkCH`^gTN~h8t+oES9Gr6mej5Dcf1sKK)!9>D z7f+AB$Z>GqkoZQGzjg6&`bLXAF2}eH@oezdW6wFq^d(K7^XyBE*XFOwp20eQd*bQi z+mm|sn(S$D*1ZAc)*Cd*)2~xZf1OhH2UMH>fHUh4&hhoy1nae_6t7KH^4b#KKU*z+ zEpY3btHrg8C3iTaBYW<&e*jCf|Mvg=zc54lumArde@1wJR-Sp_v3nk@JkjqU6&OXs zoa^PHY&O+Ge*eu+Tlr$=$5t8KF62k{YrrjVx}+Zvi9m05GhIx|AZ+@R(fjv1uc0i^ zuz9^(C4fjioGvJ;*UV0%QlSP%oRI02IcAT;@<@d%E^7(vB)|VDe;-b`KHK5ahD~}7 zVV)se;L;YwuU{8R!1lbRs{2D#Du)fucgp3m3(k(P&<`_`q&@v1p{g1qmmj=>UyNk{ zn>SZw&NT3(3*C&;`uHqaR|=nBe*G=qK?(EcSP%0T^)R3Fndg3a#z1fUh0^xG^-61d zPzK0j1M$uRvD_c5e_*(&s26%mN|bUW03f>?AqeWO;S$;<;-sX(FdZJ`+#+?Bo*)4x z1T+=sF-VIiPoKgsYNs%7t+xs%*{-k0Otmseu8_uusDSX|O%_rs_;5yr8ViU;UZIJt z26QyqStxeS7ZbO@Gs?$DsT4kAH2s!kZ zAfB1Lg>5E87QYKk=k+4bOL?C{`jZ}u(97rO ze(XoZkQH#RT%T;iS;xxs^AC&ig2 zh`?cThHKU6n1SPC7)8Z<Wk>0h2KnZvTeb=|L|rhI)^TZ>bjv8c}SNg_Rl2zWf^Y zoZQ*IR!?=i81b)PEkAhkhdRyb9jiAMT(DHr5Px={jE0H;e_)17m&^blP|&N~r7;ps(A4+!GUp6YBKQEx~n8V264qHkAwLu?rOM{}wnjn|CaW0=NX?DIW ze<)^wc@!3<6p2g*(_n%F1fz=)Jcn?KJ6QulNX3JoAs}P6@(UA2@(YVm`Gx5vzc7DA zq8k}+_jC!MA^yPpIRpGnO9)vBO7MeE9F-6UA7WN|U=k=Xs|_GaV~<=Z+r7LaJq65r zUi%~H1r!c}D&3m63H6HthxTQPkr5L-e^YswAzeUEz!%n<7I5G%@T>S=;jEtVG6Y*t zxRoWQie*o@+OSaUm0{K%MC#TGG0PCLNNc5pE7GME*}cW0v{2~5FkJI?la+V~9IrtG z_R>`-!LDRjt*|Cm;nY;ISvi^Lsm#`NQ5n%Gd|Ipr)r+W-Lvf%&5@r@ajJPUG2ZgUn^^{_wq-o_`S<7s`M zu=&kHW*@u(h1M0y*cGbKo)-jO(xL=8&D_^s;NFl0NT|JL8?w08o$(2ZU~R#(#dDne zm_ZMQTKdp)0>9+*&x(uHRioV|e`^9!4LFS$qk8&&@!abcou!cyW= zL=+Ry3-`iL#GY#o@^&zpfSx1+n!lF&{W(}t+dKNNs43EM*pHgZ(`}`h7j#n#(z7kF zG}Rc)mxZ7kX!A4p%kH93f5H?9WZta(hn`2pmqBMz>;%!;O+ZY!T{GDrB!(>vwlo^T zWUj2Ck&Iysqq6Yna2H9cL6gy|o`>$t9Rcw}sPMw*a3;0}I|j+dZP>4hAOsmdfQSy+ z%N}k26Jjq_$vvy&oM7&VK3eaC_`C~QL?8`vHU)t(CwCVB-Ra>x(8P_CM#B6ZES}a+MH1;X!yIZ9`_&ux&kXg zxx)Y^wScc*!vfGOe>x-!3eAHYLgEueaGk}bO3o2_IEVpI*?7YWkll92sss+w;q09{ z4s5~Q8RLc!Tcby8JT2BIT-f*yV;a_@xUkd+#<0qo1S*xPqR*9bV|l;`l3D|^PFf#* z>M6(}&}g^h-;L(~<#VWe3Qfa8EX#bWt+M(aGuB0DBura~e^>}Zc9jfaf9Rm}^ro{1 zx%?^#>UeHn*OX-7iKoQ?iwO<5%ygPwMJpV%8HM{@9~zXWPyOfJYVD<8s&*=3OK-zM zS3t0C*JW7udADAD>2|6NIkzF9t|!QOcmARa266tpe_N}+oU1%1HY7Cq1UczW7;^Hw z+uV4GGXV@4*pMyNf^NW&0Ye6WR7e%(0qwJ|U-Q4^g0O^tjzq zIu2}F1isI>{bEQQ$5lcq?(Fdqcs048GE z+@Rn+t+v|LYHPhxBy&%w2cEW?HTJDL9+`Wdf9V}7TFUI=ydbvkoNdDafuKnS2PDG? z+6b@v!juouWhaq?YiH5?jx4mU->HKur)_B;n~|FnDFRR;b|R)LAzR4PA%i^jBpwFZ zc}>S%8eB$QWN2U6c(((Oe1$yD%z%S<211C&6YS*NKlf3&8(>|(k7Ja1n88aNmwenC zee8%+!g;EJh1UD%0A}kGD;y#PGNaDv^|89Ey8QA9= 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

Sk!;j`wbHVK_-o3E6C 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

PVn2deUxK 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

s-?wTJL5+B@ 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≧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

@@bSvvf_s0u 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 diff --git a/tools/server/webui/src/lib/constants/supported-file-types.ts b/tools/server/webui/src/lib/constants/supported-file-types.ts index f6c5d2dc18f..1258c3a059c 100644 --- a/tools/server/webui/src/lib/constants/supported-file-types.ts +++ b/tools/server/webui/src/lib/constants/supported-file-types.ts @@ -69,6 +69,10 @@ export const TEXT_FILE_TYPES = { extensions: [FileExtensionText.MD], mimeTypes: [MimeTypeText.MARKDOWN] }, + [FileTypeText.ASCIIDOC]: { + extensions: [FileExtensionText.ADOC], + mimeTypes: [MimeTypeText.ASCIIDOC] + }, [FileTypeText.JAVASCRIPT]: { extensions: [FileExtensionText.JS], mimeTypes: [MimeTypeText.JAVASCRIPT, MimeTypeText.JAVASCRIPT_APP] diff --git a/tools/server/webui/src/lib/enums/files.ts b/tools/server/webui/src/lib/enums/files.ts index 19b79d32de3..3f725da2273 100644 --- a/tools/server/webui/src/lib/enums/files.ts +++ b/tools/server/webui/src/lib/enums/files.ts @@ -33,6 +33,7 @@ export enum FileTypePdf { export enum FileTypeText { PLAIN_TEXT = 'plainText', MARKDOWN = 'markdown', + ASCIIDOC = 'asciidoc', JAVASCRIPT = 'javascript', TYPESCRIPT = 'typescript', JSX = 'jsx', @@ -86,6 +87,7 @@ export enum FileExtensionPdf { export enum FileExtensionText { TXT = '.txt', MD = '.md', + ADOC = '.adoc', JS = '.js', TS = '.ts', JSX = '.jsx', @@ -147,6 +149,7 @@ export enum MimeTypeImage { export enum MimeTypeText { PLAIN = 'text/plain', MARKDOWN = 'text/markdown', + ASCIIDOC = 'text/asciidoc', JAVASCRIPT = 'text/javascript', JAVASCRIPT_APP = 'application/javascript', TYPESCRIPT = 'text/typescript', From d8b860a219c2415faac8cc0e50b48b4aa11e3b64 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Sat, 1 Nov 2025 15:35:57 +0100 Subject: [PATCH 048/185] Add a setting to display message generation statistics (#16901) * feat: Add setting to display message generation statistics * chore: build static webui output --- tools/server/public/index.html.gz | Bin 860046 -> 861835 bytes .../ChatMessages/ChatMessageAssistant.svelte | 73 ++++++++++++++---- .../ChatSettings/ChatSettingsDialog.svelte | 5 ++ .../src/lib/constants/settings-config.ts | 3 + 4 files changed, 67 insertions(+), 14 deletions(-) diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index 29579e08c251298048f842eafac774166f23d516..a81bae04d1983d992a4b46da93153d1cfa63c704 100644 GIT binary patch delta 856927 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

    ;Qd#n@+sQGUo}3$Pz(G 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�|M27f!O@$4=H{hPV6PZ>6EVI2 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 z⩔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�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

    FwhxVR1dSO2W?XZ`3plmLG`{@N05 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Π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ℑ?=l({&mI=kvB+Ohz38LfFxQs3_aSLPHH2jqC$L7B7gDYHceby7) z0@|IGGCJH3VR+6bBd-FcO z@KRlkT@w9%*2f1ZIh6_-ed)RYK&$zdU0kRe-1%ax)!c=YI=bixr_Hs~`I?zzGrJG6{7E*IL4@tZx}T%^LA z=li-_7-lEdc(%>@al1AWFb=F6f;1w=rc|(V#2IH=q$eFoe>o5iihV;Xa9_ol?m~LM zJZtxY*SO8^;;oVh1QFM6zIW~nXnj%h=DD-#*^2o;dGfGi()R{%w>XL4)ckaOEX?{^ zCp8Q(HzWcZ`R|6~6jv5+We%PeCGj;MUhbBGZFm{tj2WQjs+cl5#!{rdSApwgc@7#E zbb{3=oaIGLe>uO>@{@^D&3Z_=Iu0YF~_iSvI@b!4^PN$y_L?mx82b^Ft9GoSo?!n3^ zY<_h7@@=s2Wa4;v{Caw+caE|L&$r8&{~h@*jLu8AVup1EN%Qm{3(s!C?W`1n;*@d> zm>nS5@lW%D^Du$nV_cRM*g=l*vkAX8`e|W-qHSjtKqf4297gOZ~nXXviISnKKEh)U4AAvx#o!HsT~*93n)epi3T zug*>mf9=hP(=Gb~R&9AhkwfCd>_+_Z5Kt0(*|V|w#~S(JNmU(Mp5Kznsdj29VP;Kc zEL{qL=nqY3D5WWy)A$Q_K<8Ub&&*ZwQ+a6H#zm)l)oFBua%EPS#lntYevS!ElVa!r zi~+7Er!b-UWq2%+UPdL1J6&*oZGfxGmzeI9f71NQ8^44S^550(f2vnKc@1-JrV4^c ze8%pPmbdCgkh^r)Y3fk|8Ox(9dj#U5Al@hVIvOtKse2$Vr9I5&&a*ZA8w%kb`I1<7 z9i^UOL7$DkEEQ9+oUN24^Z_lWhv%VrHKAjLYEMsFBA(1$nVCJQPTthTInz?TVV*uw zf0YEo*oC#{Ya1x5U>n0>w?(F0#-q5f0i+wIfv+wXfi6rjJxzi1|bg`OAmC!B{t7w zHWjM8Dx~ph%pbC)bR_6hZzygssX)6h-HHuI1=0<4&p}Oc{%hZl{`4XNi_gd!2;*ix zFO+Vwa#%-TV^09j3QgG*;#@P|9|CNGe9o==f&tm_m^QOe>})HjS{OKUQQV4pS}L^)j;qV?@vUO*pN*68;_Vi$2jyO zvGYXu`ozC~^YU8~kCIM*p~cj(@W+y!m{Ykbq~rjEcT2TW9jNnCwOy(;e@b;Z#VA#I zR4p}1TtTnJE3Hz!UTSb;(kV5nB`ByM$Exv7z0@kTIRGftswI5aVBvz-s?jaMR@H2m zntV_%)mtUlwQ3~9!5=>>C4B1|Bwj5wJ0(c0ntakM)%l#HyQK!-l5VBc;)O=3K|0M+ zt5#|;pOiihI31y=KM(q_e?69d<#-Nk@X|jAeaJamr5^_UY7-W)U$_s;W9fee{bsvc zFZ~D4JKa`->Tq~9K0Eq>tv;Yu?-XHAdr1uyvKi61xhfxsX=?JAh`8@Y2UtlzY!@b* zn{JMo_Ya5@CZXAA(v!GrnSOhfg+=2r$MxsJm?CMUD0=0F`AQ3bf2z4l^DcHaISw8Y z%VB9A3<(`1Njc*qPEX6?ZauDS7vfL!X0f=<9kDC0{+JuSo3gQ`VfJ+o*|F!9IzQ)W zxW}YFCCslVYp!^_ad!7NBp8M*Eft<59`&LWi9O1!H3kstU02?#i;39$>SckAYLg&mGiU0Mu?GP4f4U_3sH{tUAg@hqbB6^e>cw z`8P=|EFSB>e_s(!cR?vAluPM9Zr6_`@MH!=!PI~W*CB8ajPAurza7cY<91e}-5izx zqPepahC2sU2SF%t7qG3Z_y@WmN723vAw1cBnoee#iYka25RqGxaFBg!Wx%`GtmCrs zM8iUZM3VxVX&cBUrZ6cZ(KmOYnA@Yx%_Jr`n+P#Af8Xme=uB%Ga_seZ`4Q5AF)6t0 z;mQ=s5R|UReS8V=65Hi~zKDMzKO}Naig-a0)r+un=&o+!ac=GYYIv1L5;ef7>!!ax z*gCz#k$Y7BT%3i)V#03@@V8|GTQRTQh?9G^i_IYKCOx(QTbap@li6VA_($g1{h0yR z~J;NsW!;II|DJzgK1B=q8~<=Ui6lO~2M`cxlmWQ#ONy ze_=+=CJRrd)y}NdFmxXF8;-(XTI~=IQT-)ThPe1gOHIyn_GAy^ggD(X52K&svbo%l zq(yoWxR5a;)6hRPv9P8a06(<&C*22IQ6!n}So92`llo!RUq9^ExH{aevx3I{ zSoOc0dit&Yxr{XCxH$2KfEGkA2?X3%f70gY+q6P4tI)GDaHI|wS_jI$Bx$m@gFwnj z+21m0tei0%{IOwT5DD69M3EX_8?tylHXn(*B(Bau_Dt*1A!`jsXlXn)1^p-ymRxP!e?3c%~#nJCDqxqTyj3q!-z`J{Kc5%gEPqbWWsy|o5-f3wqn z6*Yhh-cq#6%{Q!My;lZt$pk3x?^BNbo$Kv=_9(N1{SVrz+>+b?}7ie~Vc z2cL0Y{4ATAc>VfPdR}@{*nT6G3{Hxvx3l?avil#lpY^|#Pq*Ll?`O^86YqT5dAt3I zcjWgTzxQ^YZSRTKaaf!+KUu^Ie+$i1boF|Rn;qH^|12lHko?3=24Q{E}s7+91owX?vQI(jmH!=&mge(Z@m)I3c*CiALZL?YaRO&(H1L5EQiE@0PSz^7- z_`EVQ@lNd^2zaAj7V%6yu?ul_y>OTKsGhq^Lb(pzW#a={mt8hLY+t*})`x8jl6u)j zIyVp}ad%~Rc6V`ies_3xe{*+z2glusKG9t4N;0u4$-}NB3%imW>`F4QE7G6z|7Wmq zTqK5%kaav|`E}@jaYVpw_nJlQKcF%>+5Cd8X-|&qPBFQ2D)Ta4g8du$gWq+LPc!ww(-wF@o3}MK~X{@c~X;v`Mr50Pr}V3a@_Bq zZu~qbUTu7g9-MOX<6!ejo`joMygd-V<4N&IE@(gsV3!2{&x==j+2WFd%cXGM6GkqV zO)e?DToU;Yf303Nf4JN{vxR=&`T`F_aueVKa?%VXal0TryC4a>AOX7|eY+rgyP$OY z>}gWs+A$oONNQ7JlC0Xh`f***pcVi&_s@Axrh#!iK6tTg=M=k|#_WEJV1xQ8eD@I)V8 z$U_#z-i3R3p${+g;ki6K=i#|~c&-o6_2HpBL`~`)x`(KJJUrBgH}a6(XYa;6ywQg@ z`tVvFUi0wUe?7d`hu8Y>i#+_o!!PdP7k&6eAKLUv?3hiCoe#v0xtSJ`zi`(`F4E%W zT80ZpXExaqo5%T@UGwd=yGDZhUsB@__j(zC4Z3ZAXOpg}puFur2I!#H*p=e!(_hV& z>Q+`HRux|)eZEk*LzQlxMleJe#`;3li1f7*TJC{nr5a!~oxDwf1=WHl_- zN;_-A2i-{i4P-jMT%nQFq^{?9nmc2YBT~- z9k2Mdw`Vu$AfL=HcrxkByNAV4l#;LcJ7lkCuOkevZY%}#Di^w5~OTszAWf6 zR+e!j4Cu00?M6WyQkZ%X14enyvFzE%3&mCk3k=b(KLmJX|5`9;x;OqSMp054KCt9M zZayzZo{&UYuE@2pF)N>jtQ~~h@>fYA;X*w;$$8K zD=XXhAGoK!Ac7&D9TNl}kxgPX7bNNQE`;Frl%-tq3Wlx7_b4NDHhk9A(p?+?Ddd|h zSM1fFNI*JwGy3~lDoa%O#1`zrR`OK!HKJ{NI=F|Ay`mn_6JvV4fZ~2TxVX@OTjc-j zf5^r%-jTGczYf7Nku1(XjrFU0n}g{nX$t0{)s5g?=|V&7`qBenlpKDl$9L*H(e2sZ zd4fg|A#_Zub4GIaQaD`tw*d_z^Hp#yPJfnQLFAy%h_5tJyWZ%eUV)skFx$#yW;FUe=yF%(DTitDYTj^CKe+}Qe<FQ- zx+||*t*aHgt@WNK^_B`-e`#AEO2=n|lR29cs%iH+?p~F9U0^|H^KDCK_!5DMF@?9Z%V9At77^X+(38nUB9|w zzWYD#bU8QE{iRrza3LHGopnj!>BO=GNE^CBNMd$Lut@uT5q!iIrpCyW|%%0Kjmq&=@BKYOGLWo>o$t{WX zR@z&v%11l<+W^+5e`Mr?5DzO%BVr&qo2ig(3ixuq;9B{(&BI=(mSq>959@)nG#G%;Ne9f?|IXo@60kG^$#gR$s$Vz7PYENsH@nP{5&P*{ZCtAwqa{5s$ zP9+jBo?YNcwYGTU1F=kg-YvhKa%9rGszj*5tSDuZcJBf1sNn_j!-k`0#DsgTjVo$1X zOV52=QI4;7+GEC_THw76$M1ZOmc4kex%oi+lL?p>%RJ1lv(ct1PI#c&d}Fv*czdT@ zQ&%Wg$ut2Va<({W=b2T-8G9dZDF8EDJAxOL2pKjS=V|RYz&S$&xe_y4PiN>Gd2Qy~&kT`m7cNoJlAH8dm zY}uXFLa5Ot*}+Ua+*Nt^rVG}l#Ff&8<7$U($r)qRM_cAax#E;D?8y#Slz~tP5KA`> zOV`OVmcnJaDU`7LXA!##rTu`X-07GOqP>1aj#oQ}+gGxB02-an^xz8jIYNc3BQ|Cn ze_gmAzio^;L68%LN!fZ)&N;Hqs5?7#nM&r&M=)cmSy(*FfPXmCWAc9G?rdYe{pA2y z=JlgT`?yuq@7j-!7N0=$k=F%Y;}rCsQ~&zu#uU|NxS?;~t@EyYV^-)m>Fa}Y4EjKE zN!lDq75j&n!=>JP4i_q8x!Gn%jkeuCf4sZf1K1Ol%Itx@2@f`FICl%u&FYH}gvCe* zfEvK9Wl{XyB3%*%S}7StxQLYMxt*t`+eEz$p!= z0L{y7bc~iE6WFg~eAn^d>ko&%<##rsGcODLt^k1M8Lk-Kotl3Z$p!uwI)d-+f7;?$ zlzm(ck6U6Z$Ud&Q$Aw-Xb;#tq;J3oP{Wcte_(oWVccT=?!~1An6z&}NN@I9&8Z^q6 zQ;X$xA5PMCx7=v9z-w$&YRI*{h8I`0-sC}dvs`ZgqPJOYR~zoJphIoeYOQjoD&Mu+ zwT%e3G+SP0&y09Qol!3V7zZ#Me{Z%lPP|x>%!}-RBkd2^YUF})GHX{wKg}{DNCgL*jpW_8b$e zLNjEyd4EQH6N7sUDO-h(lho_(U3XQuHumrOMnOo$WOkXa{Y z%t)c>-S;_Aag92kSPC+q2+m+e{owr8uzt)PQxlHVO<~(|{1iGdf2A&x`N;*g=C!oP zWXxS6-KoJcsA8(k1Cm*N12bISOq5LR6N#9(?-khqJHOE7;zpn^t4i!KI}D^JXC9pt zdJe&7dDiCHsyWt}&H^ULs)^PSqTT*rf&HR|Ixc^iF_^BAhjKCYBI21dXM92YjA8=53b4eru)P$4orI)l;w6T&OWKr7vj^Jw zamSG$Xjs|9f7c>HiAGR~Gy;L%Q=OnFF%1?KD7wL;N42W7f`kPU4S#zn0d(Nk#9jxi zBxXMfIz%j#5w2E(^cN%82^Nx$AByKBNJmM6ne9~tOVDg7N!^5h&6x)yeotx9SdTGz z1D;Gz%Ystl@7j@Bq~fF{J5hF0_fuMrQhLY8hz@Zwe}(0h0Rf94%i=cCfqXAiUoI7@ z$LvdB08L0nN;>XI7t{!*$b88Xkw<*6?2qMoDr$T~*2oNk)R!u2YG6(c{d+41D%01H z17k^XjJnxeo#h9);^f0`=@K(v&RPRtUuJBXQ~o%Wwi56L2L?f)0)aqQjB6kP{W5EJo(N#t^kfo1tBe#{C52_~ zXdrF@y7LSWi^b=`?7^Fh(L`+YeUmS*2{RvvdxN~8J3qktZK94zzh}zlEtIqb(1F}P z>93WIHBgTX2j^=Xe2p(Z_B}zkx3mipDeJ*Zf6VsS;;&|BDov_6zWs51t-MCOV)>M| zawrX2)Ra9>@akFMg?aVF*vj3F0@2g{*+@1bnWq=Bt^|eu>VmEsy&9bZ@+H{Dvc5`Q zBjU;3TxMAQOxNx_izzAN%f_A4?5US~D?WebmVqlriyiltLI2&i&tZSez1M1_?mZo! ze~{wxO-VAjt4)Xjl;Bev{sso|WegEB%HsT1aI5-j$&IzNhUmF-?VP3myOLj`h!Ww9 z`vZ-5q=y42ro?ZF3>JR(YNVuwBBdq3xOw*W3Ul^32x^A6!82sTf_DQ{;kE#*8_Xjb z!2-K1{xh(GznMTQa7haC5zOVr){MC}e>|Rz+|%pu^b1om7TQYb6H;9|RUXd(U8K2Z zap;m}xVs}D=Nb`Oi(-O@+bY;M>hk zOa8P39hzcHg$5lZh!M0rVEsf_P0B!yd(zd)bo$v&ks0RJMaf3GuKiS?6D9$Z4bfx;+9a4ogz{W_NK7Te(*auw zLW`9uS;_R^cx)F?cFhE0w}=dod*Tr1ZvqI>taV#B3+@2nQg4VcTaI~2-ceDD??o_* zls@+l)SZv%<>14I((^vEe*tH`7_5%gzVjXWj@`HiRhFR|{q~zOsiIEB@7$rLj$Ezg z>%nUgOkZ~ic80u5T%Gld`MY&>R^Kk*wXTZF<|Q1Z0`+P`=h36*ep-6&b%&G(F@$-c zBUz%?*cOa&{*a$y|MuV@!jb6)0j}IoRU}WkoKXN9(%`whFigLIe}5QH`@GYr@XqeK zcq?#lRIS}jcXnEL!yYF|dZQyZxIL8HA&tV04)y}<8rC@FW7Ld2*U3T*tgL8IxG_g9kDvIgLTxC{uSd(HSUgt|D%s@J)KAe;|eOW1%zCyZ-H2Pv-KV z#RXn!Swf%44_iY|P-EBhx0s2D+gU5H1(%go3-1L^s`ICJn{&z3myxtcJ zD#q%Ws07E;@|tFAdj2n?!zc6k=o|=`vTH-n*}d(^?oG#CUt24bK501#I7a70|5%jH zd%jjk$0xB;f7}kwuzkNH9nN|6R#`kb+{7%ujo#glaRQrF#Ap-$k*(s<7r3jWmwtQY z6?tReQ+^QC93z#Ud9?VHb$$-0rr04OQj$5S}ai0XW43U?=-$Q#(NI~ zcDm{lf2;cZpdnS)%IdXLT`KE-QT4Or7YC%L)(|+3c%@J`n-I5o<6y0d!)d49g27l} zmcc3l`r)zPzRO-NEN!q!?XZ+jV7~Cn+YDrqV!5_Oi5=;jKoZQUKQ7QMmWM7bj<)1Q zjIir2OiRgQ*^07A>zZSvg&Gibxit`qGF3hjf8|!VVm&pmTPE1ymoCDnx3Q~-)uG^H zIiyJ`NwOQTDxnHMS~w~K?Ly-T&Rbu0-o_K^v{^yu3NYVMvM^QQj98pOawya)^H`S( z3w=tLVxgS|1!?LOB<5@M0jYj*9U4Z~(y6TEm4Yp-sRSfpZ4y2feN2yr9^*dizy&yL zf9KF?8sNToO?5PVkLca(n`j<)z_YZ%?^;K+hExK!U9c2tODUk2ND2h*MoCDLk6QKI zR4t+Uazc%YCe+C!RIO!FT9x=h5A=d*aIiUM-!#UaF)3BIDun4vWJ<#;7tFT*%t%c} zL_{uBDuMyhw8xBKVMHtTGrBgDE7=_#e=w`?ec&J=&qEoB04GkPsp8O_ zLS6jz62o0L$(ERVsr6A7iCj)OYB9E2=pS{O@wJ#38Jw$ytcz6RD5}OED1sE|7tEWY zz(x)nvCb5pDw4Jn;QnbB0~7W-GVh{nH3 zi_q3|T7+v-r$xAS)rHl51?d<>HJxKYFy-`>8SU%x|>i|NigET9Gi% z^aH__#aZ5L*J&HFV>14Q4T3OfWia<%I%As+us1A3_&TGh&vAl$Q=aD#A220#+%GiVeC}mpxAs`KE5yjNFSS048 zH;W`YEQ`x|VQaWIFG}qi=H08-J}&qMpB+ zSRu~QdWaOeLidzqJ5^M=BPuDsRu`0qzMNt=wqkOXDkZ=DB3p>8f6U=CUs^GPF59;O zIhQ&tm01l^ve_}Su54e!53t3rCNdpD<-?wJX}6cXk@|Fv!x%ivj;7iUZ11Yhrs3}- zxM_BSoTcC+k#gA`o0T|f(=lD*s>R#L5{U?}pPbgqrrSM}o*NU2fF~D2ASFL$wg12D zeTi0ENs{)f*zOq`e_2;FT0m@qzslHMuJTfC>{^QuI zFAu>;hfd^se+k)u&<%ib@8Mtg;s1RAv#26wKJo_o3gCQ-0ZuH5PlPQ6K-R zbl~$FWU+>a-5W0EOjM`{5vEn9%&u5$q6Z1&f73lm?>LPfiQ9_?(3oQt?I70k z#|$=M?>m@SZwZzGUS{uc2Q9-8VnDIH*-%Eqj>UjBmyI+4OR4X{yuJY?3>R{OqI-n1 zR{hk;DS|>j9g69*sHnmP+&NS=MjwIbxH70sz7LG}r)Mt66OMv}Cl-ULg@Lcta++df z{~=g7e_xLoB?XcX9IR|P>=+03uT(n$NZ^G$4G7KmMy1T6r2{@?$xZNEuT6&q?N!q# zzX9HP=e`jRJQLcR_Bo+s1lGJpi%ix}TRYNaCAiom#2HScm%-b;3)BbgSlj#QdSzI^ zZxv35c;kuB0^pU55~v8lpD{ws-f!bS9TPjif2PiY8@+3=C^RakaU+N6)1q-lQ^QJm z#}0#iV+LVT9wb!T^M~<`4%>ohWjLLalsNgUM?i|x^qfP^y>}A=p6l=&F76FMmDswk zqIx7~j~N3opW;LpIl^}8eb_KG!X!9Sk?Tv)&r}|9>QG-L>wmFLi+JkHK|ljH6^l@X ze+|0o4Dl&ZeM?|+sU}zE6-8f}SG0IYzk(25>Zb9o9WPB^sxo#;QeZwLh##NQ%-dLl z=Ac`Jk6;=%g*g|hHj6uMkwx?LVgv*8|LQptK(VQ#wD8;Sf4Zl7J}I}|*rIt#G3Sx$ z$M*^})>&e@f9;5L8|d_oqwkDg14hz{7?OW9R*oA@(=m zI3m>a@QkQ#xDEmh@eE&0TG0<85x8V z1wZ}@pYvyF*E$HtIh1uJPIW2}#q}S-Y7fpaaUZeL&DxU#J;t4I%TyO>NSY;WJ z6ky3(6H~EnE9nQ2E$?NVxyZ}ZX6{aH>@VGA=+l82&FGrz1w@#a~`TcPh2Lq zK^&*sE?1$$bVUD%uxHF@9UVVBgL*wwe2y`en*b0Gc}eVx+rp4v`pCk;f6PbTU6duc zd?+=aYV_#XHiqn@%3U-`Wf3)b3qnA)o-0Uk0*eZ3j=Vk?66P~i$faQ>i<=?@ zcZ$F%@Y{!k_FKaWm>@`Kb;Mt^C&MqX?P7ox`31MDOu&bg1jY5YDhczA%OUn?@_#~Xf4AE4IZ6G5+kt3e~!GKU8@phe?p%$V1x9AkJ?yd6R&2THkZicT7<1C9Z!S! z!gOJZtH$Dk8eDY%$)X_8LF>@{%JZg9on;8kUm5NTOX?Cwl_`!?Sec5hz47ajR0LgZ zyvLSxDd?bkqFk;om)_%e)B51PoWeWBgbtzLQa))s>?D5|p>gWffBt215=H7l5CqD% z^R)JdxwMx3dX7`yznaqi@EMdg)%RP|*;|hImQ+@Q-6{o16WAMQD-|t+3VxULf`kH; z6{J(1pclX=m{G!2KA*sthf{k#VHHs>Mh8NrPpAf#!*G+THAA%$PeEs$YU&-TsV4)- zKfpSr9pMS;8EDKJe^3y#1~b?0)zyhU9r3Bkr(-_V_;kjnI-d|RaEfv5u=@;*=c9n4 zHafiu+fFATarc_gIi<_mLwLAH&!gT#A1&&w?TWh-14panyOa!;czVPtBk-cUp5ZX%6GI%%?e&G2$JN^@YsxCM=yE6&eZ}IhZqvp__t20#5X>o z*KupUD(I4H4#Kt1A%ruCU_V0ye;dIAjI`T0Tskr}a3l$O408{hLJI(#ldXE5CTfpV ze>+1X7%ZF4^&&c{C%hXRt{X7c(X%zeqM!x+DMX}= zQ-J=&`ItXD_EX^4##TtUvaEvn#Q&5G*nZ)jWAmueS`lX<$GFIZvp^4Lf!3XGIRk$!}lJ%Ua`rUM+c1v zCi@BI1&48U6MItnL@xvCXXbf-_#F4j4kP}@?3Zb4;8=%LQ*goSp}j?QU0vA|FyWYv zf7%;TA)IjzF1?u*?y5NH;2M+h!qzFw{d)9u@4xzxn}kxU*Qp}}rZY|T7{WSD^Hj+4 z0>q6{kW+A_##!Nvu=@~A?i}`x*KbFb4Sc|BwH4tq4SC!;b%rF$$<iwsLaEeFN|ABk?`XOguwtor>SecWAL7@vDi{hDGZ#(-v#$kKBNj7 zQ%x)ZJ!7#1R3t-}mIooKVM{W3j-zCvL-fdBhx(s}gA`|g2sUzCRnFkVcyWAn^+UU) z9hYkm29h?HP$3B$f9y~MvIbQg96zH1b=9S)HI8Q$u?6#xLl{NFZ-r8rg?SU4GL}tO zi2jC3V&KJ7LgG+}Z`lBFkQxhi)=tloZ8=oTj{u29o^2mW5>bY2Dl7!59dOP%enT$BS8)fx z8y)aOj=?4PC{Q%h70+(VrS9b!1Y;`55&wJ|W7xc-ab#b+<*Gk-d&&O({)0X8w;m+- zs|TRU*J>ff0K?Xb=6yF!_8+{24~aIoh|zn2$&4~@e^G`!$JEPLkTBvYt-a-i#4$cE zoq+iY#VO~9Bl?00{N}6GzQLLHN~#X z;J<9lD2eWr%c$sf#{C%{U77yf(jTT9b|zOQI@(ZM|7%=+)6)YY z-ny5@k(3(SZL1NdbU+?%=p?cul;>PQD}~Lxf1voU=5lr)+I=&N%8IaenOgKv4sM@) zwo$lD!2yUaeR{{CUo8;t9K|x?5FB=d3CnK~6!zpuX>TZJg~huf2sZ3TC-5K({f-G; zWMhB-YKSliP$qHH-o8%IaqWden}Qt;-VtDpMa{OTWp9(0*;_O3(|cWjiyb~9A^1t} ze*z+xp#=suA7HWM3<5Lk?39?b5mN~|0}OECHG3%K&r}9QUac&;a!z-O>=%3F9DqZ8 zP*P`=^E2TOxcWU@PfHs`8KIq+@{q?AQe#^* zyiud#>31lPAggl3Q$?#s&)a9_P^;+nXs%$)EfyF)ZpMK`5ryTO>FF7~pX9u%uX967S(q|OPbZClq3Dr02hsKtGkgE0bF-i#^~3SvwQjnA}8me7pwHnx@{y`m>nf2^WS zC$%^tPt%WIKB4}`VF%<5N<~=lVj7Iww**yhUcs#eMHYHH|1Abx)zXF}Qh}da;1#970RWLQy+J}3G(jSG=Vzo$Pou6jYd7Fa;MIgV za^mg)!Kmi}g1ygyAXL``f&`WLe`cp?)I!fe5P($$m?_P)ByLPB<(B8s79zH~Na_;c zeu4nx`;|%`F*Zh^cCl)!zqGY!voe^26XvSXdoYPyeAT{$0QP<8W|pH4 z4{_;-mpj8F1K~etr0G`UF+e!v$IxL`h(OX^giERR*-M0g_kdu&-I1qkPowDi+MafSU#`jfu}v@Wrs*f~PLJ z2RBdT^_T8<3^YjQf1-J(u+#q>=-S9b{>ZB2(U_TT!T{7d69e!q!hj<G#)G=K15zf4JDisf*mYhpnYG>{eM{ zyE7f__J`2>%Wn89c84&>v8j_4Dl<7sPFKA@`SAp@3-LA1#!ER}^@>~_;j^YjC!y}7 zm~w0Bcln$%Og$+k;-{!ulUS2HAKHy3a(vq^TWn)JO49!lTspvF9!E#JPQ~@oFkW?{ zVkwOP1{Sc8e>AJ828Rt)wj!0$G2tCYKa}7FML=+3nWBL}(wcG->UvD&J05$s;GDq1 z)M?M8nQFBeI}8kv{s4hMe!mjsoznZ< zWaMYThx*NZa)QIq?B0iZ?K5@W-ud6HawYdyN`*v%+ zDZk(#gHksbfY?%qM`uhtcXIBv*30ypg&T`t&2kCCeQl$yzS{d+Ta7F9hVYdf*h=O>6^BgWsK2;ejR-c+&oP2`M8hffQO9|AnwtpgDQ%~zP$rqkjV%62$sJogG z-^!j=R+j;!zZFr7Y`T`z5bic4b++J>28l;VSidDr^nXsmMN*icI0;oqI1Woz6UNWI zdxEOj-NFPz(PmvjNQXoR<`NyBOSFS7(SAzO#7xXekVV1j5(2~$boZ`*t=Qd?wPZyH z>k=KTB!2*lO3*>(G5nT%tAb?J*C7=;LSx0p0CP9k_Si|bW>au-8 z)I3G-IZ4eXJD&g%44tfbZPz6_y)H5IH7deoS$~)yOFB{Xb%_nv5=AFTut0=N|AusR zm4o_?4_q8Z_$);<_9$IXnzAJz6+(|`vQ_BP71>5yx}K~Fg+VHtzu5Uy_V3_m}JO zGk+7kZQU_x$mQhU`LA9k|6TuL8jK9zIkDn*OIARx|Hz~v7yp0fzq(5PJ^w-zXIyaO za@W&;)iw2h#I^XQt8(F`x$yd2aFH&$Qs*w$H(s-Eb@jgSI$n4&FSw$oFYBqNWj#}W zc3RW(vrp@GXvBk_D*2$@tlPPfc}cM1)PMS?DcE*;NaT~A68WUZM0t|y1M_oZjZ!x{ zO_5XY7kttS1|TU%)Oo4&X;#Xbg#7VI?<#0dFMz2BhhqLg58vUTZpUvvIGmC@bevjQ zO#wii$hw`l*#|vx%afeB`J{(#fukHDFk9N^&q@zq%?(n62(@|x{(};NJe2|r27g?+ zzzHNRH8c`t5mQo0=5wh*Uat3w{D#9frBcDH6b-p4b@*p^DZBzszQYD<*x|qMhgi}z%_^T@@XEmXUzxxoRnajoo37do zQ}3|^vHqQX_AS1%d}+}d=KBl(CFH);U-(fGN&2HlPhY=&(!Q{`PFbnB^E?^++4|^E zy`3fK22XREkN@~{rq0NZz=MedA0h2f}&;en=0-+x^(bed+M z<2JlPw91!947GlBb&Ez25cHwN1 zlc#Fwq9j7U0E?#E@D?5%-m?sJX`q;;)>?1jQ(fPcHqF90^Bx2C;d!l}a67HK2hl*( z{4Hw3S+Iu&RDJse%19W6qOiYEa>;0Q%apii(*fvCVZ*`PG=&iT0)Gl(K2}y5R!&Xb zK;=vwRe>TJW!xKm1Dj}r>k#T^9iKIfUzKuXI^ZJ#_Hc|{(!(QMI83O-PCE-2sK_hW zDiLXH>S9cxT0Hf2)CO8@H2il~3nOitO$KiLINI&Q*)7AnI(=n0!8Uzm%?6#g?F~Oh;8XecHlYFMq;J1{0i7$EMMM8mPm50Y3EL^~yCVt4v!oi-QidRiJ%^oUj{+ za*A$LK~B}Y%2hlod%ogXT~Gy;Xuvu6mEms}XqgAAL;87TM@jV;3$Gy7KQLIx=7Cil zKVX&!))=bIqS-ho*F|6U7wVY-qw@VKeJYp7cW5%L^I6zr?SBh4Subv~`URV;6*l<= z8(hma_@al17sw2MDL1u>$Vxkv%6Q}RTVI{o`pxtD+goqUZ2jgb{_U-Q+s@5(n;s~0 zT5w)jm*Msn9~`#3_iEjHJdVKPV@?&M^6<}~1ZozAzL7c`>AXGVv``ASrH8kqa-587 z(F27sQTBZ1wtqf<&{$|yphO&YKsj)kkw5lJSjPLU6Z)xs4~kC|QE8qKOKNpSw{Re@ zRir~YSR6uurMo-@KNjk5U@B!ew*Hk^T?_ zA1bK=pLZzA0DWO$U=8`%nho!nqn&wTyJcToF$BkR=YN`ss8!<-RoEGs;Dv>-;>J_> zMF;vKgggWM{cc^tKr{_M>C{*t~Hi}_yy&l0|d2lr0TapO3I^8`ejU}JJQE`TAH8sZIuAZ5V_??|I7 zs?2Y1ufYXg9-fFTU@>^5hRpZ*^<@W4Z_(Kb@_)C&S^MzsG*xcl4T<3j6prxP_9~!r zxSTWO<1ZYIH?JLC#|O69nPKLd7pvR*_QiC18~W*Rt09l^O_0V#q(MZA{^Z`r@d*Az zRMX$>{<_h_6g@6?4Wr{YvqSc=n1Nd4ER8Y}zyr%8a8)Uk5+a^{0$yXGw^8wku>F z`Bgy=8AbzBOppwSt4R}v6$&PC14*YE&IzZ~p%eWzcH!yA(Y%JBu9C4P)Nkt{-gt-4FgwLyxf{JMeYri2H%ZLw1WITLQv`8h@1U z3(FXocvu0^LUftb4I$dE-3SF}(J|fuEf2CBR@-?ah1LKWtdO?1n>+XEw_=^nefVoS z-skUXsRF_2MjIZK@%CT?E;}>|ydDd(;N;ujJmWUtgoqK6fxCc{;sgkCA<(_kBw+Q{ zp=xr|B*ZaI1}QhDswJ5_kcT{Ruwb!)4q z+i=;#RK1%0cM=Ois96*aFGU zyvFI>S?;+*&>bxI=)mGu27B$;&)6>B;P}#R@nNZVdN#duZWhL^PXxULv44*YCC%e! zr_-NKgY-hU@EM85;yC&A9sI+i=;DL#5D?$XAlys;LO!M?5FttjmjH*c47$k(fvl)qO^^zAg#Y#X1!cyprLl}o^$SvO5L3^ZQ^(vQ^vHF zsh;ps8NjaY(eP8JPUl17LVu}HWWP!sQE2dBvs}ZDv<_;5l}^2WIMbz6ma87pVEmwr z7`{95bwHwr600b_h6<=EvVuU*@)z~3tgKY!FRQ99ucIC&Xo3l~zpK?{d|QV$jV8!1 z3BDm&rI|<#8d#Fl^cQk6L6&;0xrT2{@RCV$g~|Fd)x}|8r2owdU#y z^jr{M7y{w!h@@SbGJiCn5+=zqCa2a|!7qNR$*;yT<`~})y`K4j1pJ1CFV`ds^p~J5 zvknD0{;I7>Wev-MVBjp*&^krst5I+2H_@_LUw7?kIqOmbm7!dniaPkFomki6%(>pv z*4Cw}hIY2TihL-w3T>5wrGQVz99Ie+bf4y4Yi(MxT+rb)v( zw4zW!BIUHQHT^~apd7}^Z*_UuFaQ7?0+nU$i@wyM)G=g!GdL*t0aYEJLdC`aT#)f; zd&^RM1;3=u6&;^eUDx)|Yw4$;S$$30W9ytfX`!}m{nYkWv^`9sl!Mk8+tY6xEyri@ zl)f|!C!o|e<9u>`bE8AC${U2kYP zKuO9eTy!XPR?Yd7oHgx4!$6J|FYOsz1ZMR${YDTFF8Zx5eQDSfujm+nq|z6Kiw*@# zTUUxx$#h?K) ze>Of_efo{F$@w#UvDK%20d#L(_wO^Ie)eubRHDlNTdXwwjON#X*sQW1;66; zr{zGvWd5w2tv~GxtLFR}zDQ*aLn$SZ%b3P^{pmM?faB9|ZvAOrgr;Kt40mn)DO^BW z1=hBzbbsCzz3ZzA7sElf{zDuXz1w zIc$c~o|Uupr^T6*<1_lAaIqzWU0LwO;9~1fzkjh7;rb;_-kC+P@9fV;bJ&(_ua2KXZMqy&Di~PO&9New%!YOKU*vL-4F98Bbu@Q=^WjC|Fd$1 z`=0=E#{Oq;Dct|`Tk-y9Yo&1iGpbm)|0!JVzW-@^#rvOBHe>(O_KNpEo1?=0Psd)o z|9>gI6z_kAFL&PmtX$##Ck1Bge+HMr{ZGFY?|()M3im&w`i1+S!sYJ!pN+3@|I_gm z?|(MF!u`*1uyFsg@fGfWwjK)iKU)uX-v6vz;r?g%Qn>#aTnhI;{Z_pHSzikGKiky` z_dkWp-S#a zTnhI;{Z_pH8GR|-|1@Xu{1_sdW{Cs$$vNb zwTdxIB3YW44f!TX6GNA8E718aK~>o_ai1{s;GG;=-HIs|qH}phmkYR^@s8HMx{`D} zLzMYXC&@e!2XpiVe8fImJZyTFgFAAI0Log|?!$#HJX4ouRp^4DGe9@oiBISU8(P69 zBMG%Vzw$+iI$nbO=0EEY`p<6TD1 z%6k^2-}@tDpa^L)Q=5w$<9)fObzW0G%`hkzfFG{C+g)Yzt9S`Vi4wja{au=#^oE#W_Lp4RPw9;AS7$Jq zka1foEp-^}21voo5;V)ieilHR>QG>G-jkB%4Gkf_AjJoF-p9d$=2K79U6l1`Jja}; zV+ht+r*ml?)dumOdXVffjDHu@MN`$;0z&EtUTEwox>{n8pw>_W|e(0cLz<#^XqKG9Z{U4+M3{E$q zoCFT8MP{-fO5g}ce04S4>U<`+Qb2(#M8w5S0cBX}IG79olc5Ch`UXt&)Ams0U+Lho z=F8uqfMT)wB&S5Y4S#*{_Q5uwut?xBPK{el93_C5*_%xpS$#cL>FOO&s6kN+;kKZu zl~64Maq;M{(?$js9w0gzHM^2bNL>!UpKm8;TX(;J)L2pcfD}NSe%F3tsr{~Xg2K3d_PLaGG5&WO!tF%~ump7wByg-dXGy~5 z$#ye@KhSn{?SI^~Mx!m?jsPhSuPKL}*j~!8$0+do=_0wLJX?zP4pF8Ja>LWw(pj(f zUO|;bu}Fm@0x5Kj8HQiNP$X0mb4Q7sE^0hKiG)!V2eOQ~HyK0EYBW~aK0ef_nmY@Y z?wqF}r2bq10Ml|ux4c$L52+Jt)69cbuZ)1i***+>5QD__n9cCbuQ+w{>j}c6)6xgT(K};3Z#7Y(ioh~b zBnnFD#(#ZYDqEz5X{ByI5 ziQ0eRHha8Ly-t{`3f>0dS2Gu4zcbfroNHNgtyaO^l1#|UOzQ=iYE7`tBvZrMs}=?6RM27=B9dI^ZHTohskDg)E2pkpE-mu&0vvI%EV z!MZ#zUyXc4&FA3XEXcPGnZIST2>>fEpRHL1lT)+V6oA8605|Fp=xo{`z{r{lIPiQ5 z29XCHj?J?NTLXLD)n_w-dgsCzqttvw_H4^DK=}MH41$b6v1D4`_TIi2!p^vlUGjv{Ved5bVq*62M~X8%HcuqJL-> z0>y!tL9-Rj0u*vwZ8i&NykHi zfc_o?Gk&s|o(^4fN6i@?5!+7HH`R)c1)=1-fM9J=P5#N}wvRZ~SiW{kc-Ysjwe<0o z-HoH1AD;320b2{6RT*qmF8PRGcd!k@>&!pUAR^+gz(ba64ty0gdvq2dntz8?Y;CRk zT-GOot1$m`D+c0@7GK-QG!<3iRHp?z0sz-X!Vnb(*x?-Je=R7NM?DJQG#1BiWTOn} zFt(_3o{Q2!Xo~}|QTj{2s(}VrB-%i`BDbt)@`eQ52nmd)hB&Ul00QNRfo8=cZ>ztI z#cM);Dd3_U6y=J7{J>O$lYg(8#z4aJ#-uKcTzF%Dp1n6FOr+(z)Sv3%HB6_xR&xg& zkTkjqUuYK6R`W;;S%S-+!CA}fakk>35c=V{7{?eN=Ys6VDmX-*C2Q)*-yZglYjSJ# zGMJ-wHeRO6U3$rbkQ-XHPQh6Nx<6_oMExf@%FA!z!a99(-hSDg9e@6THofrckvhhj z-5WWkRbR1?5%34C!dsCOXhV;&AVVNeVVU0Rni{k3(d4Av9eotMOTey|uMZN9U6>(b zikxD+7MjpUG=SS28?dPM0)!c@#96ed7;f<0z>e(hkpzP<>*;k0}Ns@!;uGWl3@Ab{)EJnESa3CQ9^`oRaX1 zHp#*n5gX^7QERd>k!$9tRl)LhmU7#zN)65m8*5N@LCBcVR)6b5duOyE0*LHXef4yA z{yaTk7Vv!hWclD+F#f{bQ-gDn*IvDvrl!L|xxH1d?x@^=j4&J(tZ&VQz5#!LOX`EY z%hSWrfHnZ=9|B|n)zIVU&jTXX__WvUgHQ1qy?fO=rk^AC^|atqc>8QLnGC=m%oV)F zp9kN!r)YY3+keh|(;gg6VctEXgW1pdP8L@1nSW9}`zzTz{mzVzWxnS7mCI06HEel$ zr@i5<>6w{tPIHA-<|pYGvR0VjR())k4Hy%n&45`UU;}Q zY#(#$p#=58L2^Q$X`e1O;M(GHqf)~;^a2bq{}{c6>wgVA^H%M0>$Bw6$LMXGxq)Y% zaPe3VkIZ3@EQh0Qa=VU5)xWh*zeh*z*80qL*p)cX?Q6U(U=NaWa@2H#-(aINDs=sV zKdRms62sojnO*nvDZG=Q=8Luc|mI7qqx36#HR+_R2bU5#3V z%kb=X#DDiS_y-JoyzV>LBM@5Anf^K_Txxgh4Ifxm{48$~M1*}b>DWPe9G$oJb2N`+%qdQ<-E*HFBR_$Ic)U;XR+A_j^D*}B(GW^5VnwB z;CcQ+k{TZ;&ysh^+vH916Xx#M=;o0=>57lLpMGh*@`(H*c_~7ypGu#06`0SZGb)n0 z&UF=ELq0b07!5qeVts54bQTtdxPM~qKZYZQ=lH8aOE2Miyxsb+u<&^6HI2VpPfDMD zZT-r7^=X7{7m97qAmw}y2yeb?JudI@;caVo|JlL*J24A?Tl)02^@y*3y=uL6Zmc-= zH!aLW7JHL7l}hOot0ES&f_D-C^4%5~DQt=e&DYQ91PE2TrrzR;!WOo+-hbe>=p<9^ z6byeYZOT|BV!y2H-Rxy090Ri(N7B&?}nA@H;@)4xj9zgcOX(4w=PadH zwv;|Zi^u6IwGFo+;r#GR>%E`&M+v9}-hYS`5(2Mg@c~pis8UBHfQysi2%Fvc*%>H# zuM0+wQ<%taZF{=HKo)|&6CG0ZHsQcVkwx}Q>uPE$p(h4ZJ^~l8HGcuB<6*RgsHz?L zvkh_gfZVVRU={bQJ?yR6+e9dvf5c99W?a?l=W3 z=qJ!QXzSRolD+II3HRIlDsg9oE_qRFDCjfI6hgozyts1EQ^XKv5U?)%nhgn*|h1T=K( z?NpAIM7edhH<-3xTmHq%(nclCl6r(o=2yF~A0+Qf*jmsn=bG;Vs)9gGu&;M!RW-Aw z%_mW@CyaKxH^11EJt?Mo2TxM!5%d)}*~V55jmF;2rJMT6;(uXbO;4o*4)Vj+M zA0uOTCc;m7x+{0ue22*Sd6c{d>E!-OA3349#lps3J=Mn8&zG&y{*!~`dFy3FLv~v) zoyHUH4L6;-zTqs+pz_~SPMq2~bX<}O(Jo7nubd%*K#7g+o@F zt9kn~U%T=m!MVX)_jbMOURL}L6~6A}g(Css*yL0U|(MCn% zkNy`yh}%p2ftcO;@B&`oTT&HX0IYBT*6Y3)4PW)9?fwwAF7US3V3gr$5#Fpe@B++q z_6gQAs)`S-=#_=0zpm}qs|#>bFRfceAF#cfVUdUDcg_zBvAj@jzY3HJ5yM#MxQwI}qTtpGT8yQR}O?9z|n z)_-WT>&_{V3AMNAP;oIv1ow zxb~$putvX{Ohz3rU4edSoT4sdxz$i`3P%+`43^L)8w zC4@(#^C3^!z#i4%rjo-Tm~<3TE%D8mcIW5qdMv;ItTwzxZChq9P4Pt28M#BF!5Ngk z+Gr`ItFl;mLAdgI-Ie*w6N_#JDL)>Um52B2KRPMHZ4Bd!kVB?;RM+A=b zIK4~tZ1iHhD12I+WjTBchhSF`yc4Lo6M#*FI|jIu&!=lZJtB8w5*IX~*MAUQ*&uV6 zG=DVY%bLElY`fp=^#(l(;HjQlTc}5$evCggTeLIt{(0_VMw!cP!9) zYCg;WhLEc%xwHl-2M0BPH!w|*o~^8E-wN{RW~%w1lBfBm#w`}j;$`Vz7^`C?%f}kp z2HmaMvak^Xq%ATWLQOl3jejb5uUMIZS=>=(@kEyg*!zSzIeh|g!yNY;n%LJu;%nD{ z$h0-Fb>q7QwtG=8siBf;wf5PqhRVNU`|!~xo9xS@#}|5hQ+cvV@(tq!cVuG<*gWG{~8?@WvL3o5l0Z}6YX8B=< zE9HFfJlSj27dR%j$ba|fHdBG%UcKfk9iY7mm&@HB`Ehl|$8Y#?ZN|r+_)(T=(bu2l zYpNsRYl`4-f>+@oW&s*D0)o`yDuUSWwz%TTWpSPO)uKzq6TX>C=H#Z8QpHk{sqB)% zAAuJs$I0%}>8Typju6Nt&_1}jtO9CXoI^zw<410Wp_IM-Mt?TLsIvBjsct+Sc6%2y zyW0&bJm1w?O;>fTZe2d+vOfNtWqszlb{xhD&h2p+=b4W482cq}ntSj2XUw*y*^1U2 zN;GhvIxbjq_{8n#c@Mh=Gh5J)0oGjyeS#j>4Z<+fCLHnPI7j~TG z=i)4w#p9chu7AF!Gg)7^nLOo8o_@|u9=e%44KsOI!Y@CQhdPs|OM!>2Gl^{6pQWJN zn?t$Zb8kM?y&0f6Er3P?&@f3r{%k1~=g*d`A7@J#TEgKehxAkSD^8i=>(AM*jJdIy zx|m$rg=k@+3(^NOL-)e7lL=^?L~-$mr@dT-zwArwVSlPBq%-i5ud*AWyv#2SsHyV2 zbXmBl@Uf1`V`aad_c0(f#bSkUJs~v~6npsrxYzF@4v1`%$Oh0~rhyLBlUPeQ;YwQ7 zbhWk-M`EfYrq+HjO`6ZriWxa{b>Vq8*Ng7gb;+^1`an4WlrX#8ndJernaZKyrr6L@ zC3yejV1KE7b~b>x6?e37gGpZo%sqc30g{V=U4`1X{ZSZ{y+BalG({gofp$+iX5W73 zPx^rEr_nH@;N|VOJLg#O!>RkMc9dp8FNiJdA-EavSN=zX_UT!#YqH~qys;4Fc-qb( z%ECfhg%c8vATle2tg<_9e+;@TS>OKYZV42mJAZN?(iXvoXvck=h}y?Y#Db+|(QU1; zOxhF^cK+bcZEr8)W=Ayw;kP+y5V~{ua9G9({sNuw+-2OQBc3c}Wdj)RgX+UWNqLxJW5H!UFbgye;kd;%aDO!Iw#VvDzNi#7u+*VIi#$_>t}y5})gcIH*SQB27W1E_}tIGXYIC9)D!_N;VMBMFFAZ{| zu}AcFhLLbjvBgRF&a)D}Q<3mNNR3;W`N+Yh?wm^;is;_CMDX(c@G)*lkno0vASy>g zL6mqHM2Ux+{W1)>*oluK5(s-xK}}ylgs(OAArb#*Su!dkW2lE!*Du1X{PJ(jn zG2St#4(v${H1<&s@or&P)H9z{m55%RDV0)N^M%7IiOf+CvH zh&|}3JYq~rrx_Y3g{kkj#r(m$8R_jD&RbDzS%k{XWQ$ z_O{+{?qNI^`+GQgnx;}4KZ2T>YKxAUEg^JLS%In{;?75GC2m{CK`u~GAa4-5djK6h*{gG?vCfBB_y!~P{Z zfYZj*z(3&>nc7^nW5BfdWEnbNaHdR;#QGR!t5t_UAlMaB$QN1QZ4R}&?19zIa50Mz z3rtB9p|hECKbSh93}q1xoq#s0RU9Ot;L|vCHJ>=!u;MlYWqyPO{KeqOE7yBjrK;LFR@KhgvxT_5GFzN$7dZ09 zsnyK=6d`x+1b=7Dww(I(^i*(rc>>j^^m)HC=e+-9ue_Q$=S%j2!|=JDw9h~Dod0BR z?rkOCYrV1$=3Q3yzzs}yUb6rGo!_0`d8#57b^c^t=U)R~GrgDmU!eD|b62cDsDHa! zu3d#v`k))QIt6vrjZSnc+S?dJzg}-ZQBA05?#`2V-G6!PBTj5tbPZAZ3vK%RakF>> z92yg37?>bAwp_FwW`t7s;su?u46!+S2_~yD0i?DWi#+kBh>^w`Z{AMN=?*rMsM01W z%a<7@-9o-h1d=>cCi4OSW{uVi> zeX@jHt$)~YMI#{=VN|AKQdkmO2xvG(Um`2coPlZ$G0`0T&Datyjv@MZ$mZn=Am{f9 zx&hW_e#;-nJ3h=5sWAygFnxWLRXHnb`vdol?BGb$ecU0I!vyr)rNXKAba=KSI}a?o zNM0F!>irVGGZM=9AeUz0rA@+%&NZod-Dh;i1AppXDkoBRs~Ib^lbzRDjTIRZm|e#V z_5kFUMKp;=7ij;Dii-tS?1TUKG`fC}tAS^M6YC>*59}nIc{`qg-5SKaL8cOBd7G!; zDW7u6FLRD3f!hlUm&)V^yW~t~^U@(2{FemN7=jg+F&B~A`}>x=e&CWK$Jmdh}QwC{R}n^X2W`C4Wien#yc6>iIXPorC1Z6AOQn@{#n4_Ytf zVD=o9K8FL%=YTtZ@8b6^q?x;%2kP0suzwTrp>*Pqoj7DCUj5Q~vVVB6|NLNo_h9qI zRqNH(*5UPIK>x+T=CjsG`T4`6^6tYf)G%P%c8;Ij%I-tx2#6b5+Mg{fJS*>EnZrCy zjnvBTx1cK-u;IO8!<*LG{=4!iE#n@e5OBHS zbjwr+J2yv6UHFmO%+@-qmOh*XoFGO9E=v#K-U+UVSmA9;53MZA&>t?01%GnmnN=3- zM_#<06?pb025JRHuSwdRU#6&ntfMG;Kob>7r=PB2aVIZde$6PU>d?PEJO<8sXKwNB zSUlLr+1!0U%1KwT>f+uiM_s+~D`p38D{}f}&6)=--)v|i)3U2EZkZ9j3mUH%HEvTU z`sEFA9UFt|^|;r2fznx!Ie!;mgDy_cw%fVasJ_>h__Fzq#lNy6^p6F-#6c$d=`s*f z{DM@uys7r9*N5lmAcv6EQ4U~15M@;}oNh^Ql4w|TQ6J-$fr1vMelKv58A6dwM6mas z;e0(BJtA8Z_f4Sx7-IUUqu|5BC7Tc-YmXQj4K4nSp*wFAtSwT0@P7*_I}0J~cMSis zZ^46kr-DmtFtkk%$~UlB(zDL2%WC$*%fm>BE$_rEHqtEmaXsfF>L6mYgKmATPQJzaBMYOcVF06k*3X_o)2hENBiXrn1;Hu?Qq zI>7K(h{!EtWPeA}Ds0jNM6I?aQQn#aB&35dgz|}zrzN_%Ob}2+CkO=)b6ckfRUyW9Qh&#@wt+C@{9w(aJ5_#T_ZTf* z`X3ESdabWBSklyC<%hxMJe)WT>9-#RA?rp_YsRBsAq2*B17eI#=3&K>-$1~c1Um8f zSU?+JmvKwCFnI{zX22GxAwxJv+UN?=Wz9ynLf8R&S!aa-<$>MHI#jlbFH%37MexF9 zoj%S3x_?K+!ReJzlQ}G?nvH(WnC_~z_whCwrL(?TIcoTq9T}9RQ zp4rgpG;G!tHgIaq?ig$UDL~!<2Sfmb!$HTvO@E-neq!AzbU0xAP(0^+>Ey{1iy|-} z-w{w8ETd?0==hEZhcY~ZKmo--kq&nl0Fn8nHU@Sia0sayqYJWctY-!O%t_+}QcZ+x zl#U9dstodo3h+lj1!xq23UMgc)1U%JEMOYk?>W?(z=|Ef^efXX>-9VBvxpU8&6^Gt>OQlj(sZ=TvAn18Q5v(AQIy`Df z(zv400bhs-D@wsrh{Tr_!iO)h5+s823V+^8B#H>Uy+yo-Xvm{J_2Bp(Gs&rBl?%XA zr}WDKLU?4D)fopcI@^Gdal)Ds8yXPpIY5n1c*5av{*cc8abA&Ky(3`IThYHY&b9+v zkOw*mzVI4n(;)Z}DY%%}FTA&k6_eNkJj^8m-{`Gz-C2AC*rLvAxF2J$3?7BD;mlwt^Jb;V!4B)!6#>iu5$=bAT3TU}zytfsUIUeCkSa|4B zUTy#^Nv|OTmm#o&NC&WT)RHYe6{^PXf$^z-A_lVW4ANywIy)R6oDcFte`d_iSE=wGQQr6EZK!hJfZMMWk*d3y9<zC0D z5f)$6m_XaIU;{>=P*;r-m-)<^J@@D!xxpP+nw?-a;IBwJRNtTQ{H5Luwn26aPGn{e zH+bIeK9`OL)nT6qOGUn~n2o>S`v`w~s&bHomf+??dn6pDtNNi{8N-t=dSjd=0B!~CtGXAMVpw6Gjw?S#&TI~~~(pdZxXK)!Qh%=Zg} z=7JZo%OoX*;3Z2jdC{qEMz&i&!rPL-4SInmaIuo~<|F*J46$5>aM@2A1$tM--aPeZB`Q;( zLBSD}Ugm7ILB+}!#d~LP=C6M@c7Hw{PR~Yn58?MCI^r*PjhL+LB~Nq%*L8I$>NC3T zA_bj3ly}YBOqF*F+*QRRuRKe0FBAAR-?JHY&i%#>j%zNzS9eVNlqdE5tLp&< zIK)M%@=$?Ne#Lv!Tt2NAr;)Gg(P>2-58v%3{j5i!3&UgFM$#hzTp)jZg}Cc=0Hw|6 z7jV%`dA+b%ITZHQ!)Aa>^`58o&P+842&~5#3R+OSdzk1^e2{MRi&JCuDr-VBl~O&R zyd1vcE|H08@cX&iMKqQZ`^c_e$HZ4(O7hY$E zZcvB4=ECHvun1n2F{^*q6G_H7FPyG~Y&ho&+44hhMU8iEIOA&qr%2=M&#^&A#%9a_ zDdNB6JDTeiiQ$RfG&Zahl*u?}Jy%g8J}Zw=jRITa0?58(lHlll0W| zDb~h@5R+!WO_kX&BzA@f;J+y_A=oj2C#rj-ipR3jd*x;J zeIo>f(<}~jnwCU)xcxfMkDqtHLe2N1pxMl?M^*690oi}p*JgH-H@+6o$=_4OlT40B z+0wW@6*y|?mF zQ_062&zQDy@t&96CL!KIL0pTtaa(mpcg$mW0l^Lc4ArcmoAn zTZi3Eehhz>PwWmha9;rN$Q-0sdk-FkHe*QP0^-++N0 z>_l)?3;=c;4@Q3RsZ%5^h6(itlHQNuNnQgw$AB`f^117PUIXkaGkVeGU^fDxlWit* zny5bTm&iPs{#M#Aj2O0ryTl!!HhoOmjx&8Uezx*N-0XT8&mD2v2w%*^r z(Sv`<*Ay;`X1!DX_m_ZlvR}+iUB_+n>3bM27HlV38PFPKs#nKKKWXe ze~7_Vq-bw)G?~)FfCh)HDMA_AhrsO-%?&3ilF1=@?>0NBnVSjZ3eatVv;E~8& zA2+w5LIw?12GH?aiAjSoybH)hryqL1vFLxZ&vQZ$0Sa;DfSb=3ro!o=@rvv?KdEsV zyez#y&H>WUw?HEeJ@A)eLLkzRF7M;Av+(A|H@FO>g+4(fLqJ8=4~gi2}ci{baUUI22J?=r4SDIgH6?;BbY|J#bh!kiJzrR=*|8Pag$mldGy#-C(ZcldXBS@_Enpu7iwAV%7a5M=O-ec9J-j(s=PZaF?A^S1xL||C`;P1H-^-!| zmkE`638mK;4gsHuWDb7AisZ7(F_Az6BO*2U*m6lrGA)%#u1d>f_F^b5E!%&Kp`ta_ zvh+1pEz2>Mr3*YK!Jd9$#JdKxi!Sf=V4hkY{{1ODGeyTHH93*2T$Y&kB%=T1^2zsb z90DsWc-ODaB|=6bd7aUXSgZy(hCL+m9|C)6&hmrJ9u`r{iAhJpXDCogRR$e1dT@zF zd4+i6?DIpEeGjP?|~=J$#r+*gsOXZLc~f75K1LL zBr0LFLG#^S#0Yu+?u8I`=okXJgh+SB;R7Gm)7~9^Sfg8Wg>4CnMkVPEXkiV*G}OT< z3aR8j0KxQu1@skG+8Yu7Tha>2lc%gF2|9MW^aC*5OsD=g2l`4@m zx-G(ta4n)UtRlA@A5k&3;NkM!a~?)HjeV~suLSs3h@aUqKiOfwU+mcYBz zi|3@*Rw`f5mR{?5jNV|&bu;Ev4F@PgH?~?=$P>mIzIoh5yx&f@dKD^Pnds&b6z_LG zFVfU=Z4_eWle=?douzjGMU{h09lB(%?+Vgz0nDulzRn_O&OBal=s{x~XfhvW3rg;H zW;+jfsS`vQzFGN&i#>mYY}JneX}wu`iegxuK^%2KF2ywk3rJHh-9Q;!lUZU@v`-Pi zCu;?(-hX}zpQ8}A{tKreZ2nia$6+J4`G}JgiNE0g##)8TG2b@zD@mLD94s}|OUeTA z;b^)he%*|BRP1D-9PjzKEyd09i>b!V&n{33vw8TjeWlRdd6bhMkhLMYaxAA{U{}DF zG84D}b*I)747{RI5e>nXwiO)_mbT+Sw~(NZ^F3rqtoxF@pfobop6`|yKyULYgU_AY zT1AIq>LpT8A=)QB0d)<$NIJ_Wqr4}f3yk^mc7;aKBO~g*2c1JX^K9eL zVgirj=gCj}p~(PkKpVMm;)6HdgZLnQw8N>zVb9-nk_MOL8Ubxj@d|g0g7GW&&kE^O zsysv`?s~;RGv*fboZdv@@=MOY2esd1be6`5ZZ()Rx0S!V0YYo*h?r<%g)1ZG`O0y| zeI$RR`Q0w6n_JCGgacs)tFv5ZQQ%K2er^u!8i|}A(ITf$m6r8?36A-F74*7cqmJ*T zrh=9IAh#C)WewDI`!H0aYo)yT@wFQ?)5un z1)0QpuHnYd2;g*SA4-~&4}{nw<_?j1(?SZ@KYgpV@Hh`84{Wx4W(KdbXj&(0CnBbp z#l1fOnij0!!%duf*k%E;|YpvCe!7LeCZ&T-THZ^v3g)Anh$MJZP@wk>$$H~@)08&j{)k~&= z9qmAEeyCH&!S=nYA}`#VLqo#JQ)6jHs2xv zWza1?Mb71vZ3fuwuaKIl&^8B1v(jCe+Gt{p$ne%}pZizK%Wo64n(&005R3_|ev6`{ z_8@Jl;>`y2m_yBGxU_WG#%^-`G?w@k)0zX5v=+N&H(2PFJ+_g(=0{5BoJ+SL^Yk$b%F_yLR7|qX_Q1Kjx2m&Okg|I>(_KiEwr1i7b5H;kwKKrUu$> zUWQbTk`)9ogL!SpRcD7qJ0$xfYa%WhCePJ(Q8Wz z>{L|=O^~C{2zsKI4i9%~>?te(6X+#;=6EX4+=LOoFSbsiQ|bnzCd5JWzb?h_PGSq0 zTqKer?7W7A1H16{t|&L3qo4lPB?e>4bk(J7!v#(Mva2456VcCO=h&?)F2VrB4AR~M zGJB1@;;kVW?F;&8<$Jfxdw7fbWYDyOs|4}&*FYcZ4cQP1BmW@R%sh$!?!fjtT5Lsq zRtWugS5Ik&ZjNejv|wo1L4vEg!QD^X6Ar{)R?_uG0tJ<><~8Op7QiWlDncTE#5Zoi zAXdV|Ul@5DgpMpRZ=MBX(fBWQ62o{zer?7}G1N@k5MZHsVw%MUp5p8-a~>nnEUNpR z9@Z}0hn8UEKO3>K;*7jX(`oQH8B0V0jaE*f^Y)U z3mEvBQPrD0{!+U)hi?xiCVkntwQs@?_pdzzywoYYGaSYiGAAFH zXSD24q-}Ly-Dumurui#z+}A93?Dzk{Q~go7Pp;?l3R_{IAH3M%#WXI20~cRcldKp` zhW5((4O37aQe^Y-?h`@zKuu0NmK{zT*HbE-UikuPfncs|k09=C&m6(X3)JAlT0^T4 z=?IU3dl7&ymM+K(NFn$41z*`{q~^rNmQSf0e;x`yZ!r+TNOHSeA%z2l4-&@25}>By zzLc?$uiX#|C!F6*wO#AyXk`=f;^S<7MUooyy+xy=#Cz>BGh7!l67tB6I1s zbW6wLU`4%N!qF+tzUf{#1M%n9p8?`#4aQEJ!%~A?&~aJ^+|;vABc4HD(M-kZeN^Qc zyFKt)pRC9%84D94P%Zz9u7URel7q)qlNa6I4G+)Zp}B)Nq~)tQi1Ca0ETF1=I1`&` zm!0=nT}vBcmdE9Y?S6*)JEEB{!|$eiZz&!3+K!35FdKbHup_GyK@*s{42Fg$=yA|>017$2?)()NGx&% zKy;9tqlFqP&+I!t+l?*}y#JD>EocPZ1k>Doc=+U1z)W?uSkQcSg^Ifc>BGa~DVm+J zgIj|)C@XgBKM>(ZxjgxGS}(4(&sDmEJK+VtVgBg@xPN*0z<>9MNmfhIbg+E@OU9YM zb)hRS-bB6m_$0+#x>_LBNLWBQ+M0J1v6Y}~u5dEH3#0|T$eIetq^3X_0NdE;SGOAe zWj4hc!%$0rFx%%8DM`ygyJ~alT^FwqT~`^ncC?YBQ->fHD?bglJS*qVo%D9+B0`y6 zj6S<;-ceXLYs8NO1uds^G}=<1mVIkCa+)Wnjko_D|Aex85aYOHXP zIy-s27uVz6;BiT^Ulj^Ea)m8{l{u_Q;CSAy+q8@-^jyd{7Vy9W{U{kUv^JyVv$%qR zY2uilzt)qJBpE@qYg3uRMA!$oac$IE03Lb)36ZTcueF~eZ8hI6;-86HFS!h#?~~uP zuZWbdmY|;edq#M@1D|tF;K(6|ljjeAIW;spgHt8NSCAV!3ewnCzet+uOOWV+H`m(& zjCs=R=F>~{4f6$7Sn-_RgJWoA=uQv4VPJ7^@TfHK%gGm#ov86whF)2}2|TI)5z4S-niJJYH88>R*^1F|_Z z_y9m5KJ+D3i#7Avg9Gz5kU2-}a znzSGa6jDcZ8EO{zRvfOHP} ze8rw)vD|>=8)p$^65;)q2<;d}z-39Ne%GBxS8pvP;=FDA5v)QY@3EJY<5h;3gA zISA_|Hp zo*sEkh)BhdvG|Jcx?LfWoTc=>pmh**6tqE3Yb39M^pbb?qcCDbjmIItLu%3Y(;Gc> zDMrFUGSjWr5mr8L{7JbI2UG9ng4}}4;T2;0l}P=dU$#@HF$}3nkzU{WsszAxl2Q{1 z!hump=o^$`9V^#7^E!BAlZFByYYaK+~fBtuPz>_(9tY^dL!R&teo1StSs0joT zH6z&&xPQ!;6H*a`-t;NYkk2W>N(+7P@LM7+3sILgeH;N*R~A*%!OCY!;trPr-;CGJ5@)qg$a$i!Izv!#`1z}FADQkL8W4O zbcynDa;4O!Y|g4K=!1`nK)!qxLq*L%xzXfe8CBYc_$tq-!TPNj6~Y_&uB7gKUx((@dts)O_8K zJQ}s19fk`L8*Fr5J*M*ddeu{Ng9J2@y3r3ot2sT(GzF?UN7oWVyMUWIqPXLBZ_UwOm3zw1U>6ebiqHfEvZ4g zvvnCVh=M!&n!s@;GVt~kd)_#AIT-&g)Jo zXQLKQlk(W7tV%QZA}r^}l%r9xx>(K%-(T2=hz;k>Vv0t|b$k^FtFXe4!i8(ejBaCQ z^(U_bVB#)nz&``I9_0TRgPEVdY-Ku=QmUwHTfHpc6fKH+8LU7CfmAz7>of*`?P9dx z5(U+voObx_E%bsaj;hYwJ%eH*@`^FvAFhr&pa&)-N+Tm--A^YtRg>!S(3+jK8P?!h zaDVm-2IKFCXWq)$LciSRfS&|1Y!rqbFMKZo2$*Nfxc3Z7D-SB~8JG7BrA<#oU=cTg zSoSz}3U*z!eiOJs-AGap1b}P6*n9dI3~*d?N>ZvH6B6U1lV7r#?|z-01ih$Z$BMq?lrzndT(wu?oMUa%FrDFoYQr)CZ~3`b1z~r2sTgYy1L#AVvQXm+ur|) zk{(U&o!%57xAFlqAGS3=22ZEDW8OHqzkN*b^BuiDMKV;{%eUknG^P;;r?vFByctVw zXhd;IhjC$ZSEKS-l)Lg#4>fJPzegO}&m@3Shkly9{95kU!?yu)E=QnW=}+bcv}FWl zrOzV>7h{J=(ZVH*VbRz!s$|@h|62MZQocs2)u?~=95x>$-lRn>>}W$h{YS)dnRN9c z8(kLI7wUnBw$zJY1kxC&B+B-5jwrc;PL)_n^ z>>Y8>n1}21XKcQrC~hDubmLuo5G)T*fd-_LNfcPxv$-`jUrQ*(4enZ+obJZ}#y4Fk zBlOqhFSS$PVmNs{M1B1mYhL^woE*5@_RoDg0_8U|GvCrS21*C2Rj6WKz!$8I$17v1 zM1JiCva2s5cw0)`yaU?zI``YZbMuKleG1d535`c@5JkLR2Kf;k1hVl7q`|4w0iI{C zN>vEaMXr=H8Z^aY#&v?h9E6W(U5WlU9Gf0OsE#BPXlfgiLtMm-NDHj-xJ9+7hnUT;_p;@ixLLCVd-M zuj!gQP>pdtc{+DwZkab8!AcAyqJbv&Xu6vcema8ET*7 zGPXJB(w_AdTfN8t{14FB0mr-QO;_o^n{S)Aj8Q>nh-c?~&Bi{Q zhTZFXN-2l9PI_<2@OVG_R{3PlmHD<-&jOnw#v$Wdb7eOiqs<@Gzyp1HTl<{6@8c#4 zO`Pwf|1^OBj-gj?{SjEJLRSlP$dZ+7-aZ3DSO%?b&EJh0wXiAYvinFu3cRDa~LFmtlOqgk_1xxXy#5<|Z_BB0b0^FaJFa#<6`>GhU6IrZp%*2ubw)6BD{z{pVbQ5s~ukrZM-g3*99UY=Dt>kLmUJtEt^8Sk1{P~YHUHWr--6S(+ zbkavv?5$d?5~03lrlTjBo5-?shIg1MMfs!m#751Nr$hBl>(p&_;qC^veAGHjoW@c) zMYz=lsGa_rdG$cxZgy&q3|G|~45a&A!8`D|kwy3?n;r2@!*EtF*;e61zG^^PQ#Rer zSLiq%GgwQdxmX)luoVIfEzd5x26yYcpq20!_Nm?F)8F~S!xZI#RC!vM*YM8>H2Swn z)-)V^+pbh(?d9k-BZRHy8Wr(pqYUt?J%Ze3K$>x_FmMlZ{9{?)Zgx1@-MFEJ*-XPT-$K~Vf+rvThy2Os6o~Gzps>ZIc1=OR zPDBhyEBEl`G_3s3hRCIb0CM7y-B^LJyu=)c{u z(Ud5^>{WQRGW{FJ+dQ5P8h58YTG`)(~cpz-xENgyef-z?b~5bX3YUifP_Fj z8OG~pSJq{w$?7MDZ(at*u|)yCwk5ym$5+;hgyY89^}%4eA;yh5^-HkX^wn;Y*>n-s z-N!D?o%vdR<9x7&RY%COm#5%7v@N+Y#sdF_74zzFHNoRzH6q62pJz`dyUqj%c+R4_ z!*m)emn%l&T?|2QHyE0eP5W#^0R%xAnWgU+Hh6ZCA-Kca#>iTLc}07B1ze zwylz?8YC78O}Dc7;7rtT-6Ni2CP0acY=pTV9B$#Z&)?=kk{PDN%Te}Cgg+rgK{#qw zW@1L#fQ6mr^9z63Hly~dD;uGFGLR!l6o)Au%MNiBg-<1>z3^+$vhS^g0ObBeQ`=b- z5(KfXk%xD9z(Ctj_8x{o!s7#|LWHODHp-Sg zJ85?d7i4#M7^AbTY@T9H0j9je`Qk5r)(4e8j&yJyFyV0OchfgoGR+IxWWPA)i_jY; zH$ILT_4|@}cIH^#_@^!?y3}mVq}T`TsvcOpapX=Ik@-tp@p)y~K4f{+bO{G4U7U3z z$-FSR=Z5T}H>BRiK%GvbYnbD}WM9F@DI}C)N|$z4kGHJc`x$Bi0d#YhZlLJwKASfm zFFTmVn==%%u7yz?tP_3IL%$#8Coy{qThq!9Sg>vhZw(&y|1CNEar9>G;*@uM*%)04 z-g9vR`;Bz%Fi0yZ0m(9QPp5tyI{Ly}I9`z2(d`aQNJIc+B2Fn@7ZbWf)^b*SY5vi)fuaL-@Qf8rUT_KdScj!t7&H8Y_N!;P~c|z@JkRYkqq0dtvnc;g-bbq9``?^q}(L z*7fa$!pA$4AJ8LBIM8JL3%JYSbp~UwKaGQnOB}QGfEd}v+#8HQJ?<3og=HYnoQMSl zRe8|K(***~Gy zpLg&vx;HtF+7i?_v=4Y)&x|wFKn`xm0sPzqhE4oVDxe)4As@%O=DTi=G%HR!Ddbbp z7nX@`9QMD-nJQGHI?T|+=*G|-)S=zZPnN6iVwBU z54FY*iaJK*fgf{<%7|Pw^xwAXA5HX|Hb<5aeG3tOT~$Al;LUdpTN9IJ-8*XJZU~eM zT|~Xr_g_H9j{s`u8bOV3y6MlxqV{wU9YE_?%J;zhi|XcH?f~@u&Tma_Sj{iG>`$80 zUsCVz(7(UfG^D59xUpm-n-{YvnKLlF%CV)UZTN$`7vYM{*mL{zaCnQ4NZ3M8cd6;< zm6n!wG1w?y!M6VrpRf)kmOLm;Qp$Q3QP(aSIcf`)lNTdswo?;}JJu3&xrVXOc>+q0 zl66TEK2>#^=*-!QdbKtg0_3KT%_XMtb84bRKQhT1I?Hl5E?2RpG(s-B<+QCNT)q*J zJ9&mKI?kEcTIMNO74?yxUlsq(y+pzU|2bBu%W+7san$=_ZIthRS zw7e9P@244hSiYp)%-zo3&fL)LX_9Efn6sD^lb+I45Xh9UA1!_yH9(RSD{<4(rP|;Y+S_|KCOu zgtQwza=5k&D8_-z=-qF^+i%=o*cmuBfNFdJQ8&!r@+nx^`YX;Pphp`&{$NtDMnXQCtrCJ9xH!oayctHplwwSb zOxG=PM*j6MDmT_NB<$q1VGzC{g1K>IF=sd2P>_D|>_jep??MNRq4?6xh)eQEero#G z2D@h3+;XCxG@9r|?rDl(9)m&j0r|y6V$Tl|NRJ?Gft@#iP!J<+Wa*hYxnd>J7EmYY zrUeF27lmwm??}Q!tA5e3e)OW^kOaSAqT_wd-RH>>;7H`%mQDe|xWhNqV}#?9bwqM` zlMqMa<<)&5Dy{$^8fQ`ZM$7CHW4*%ym(V(<6$(wx9`06@2L(zxEe^!TjSbR!pX5bpMj@3D&YdSh} z9Fdj=byAXNVhUEftHB{r3wfRBfKKfNH;TIAQ}4{MyLEh{kG?rvLuoO)Xrck7cpGOJ zUvc};djJpvB_5b8bVQ0<)L;zniZ}Rvhh_gy^eN3#9W|P28kM;btu=^QelPCd1h~fxn2R(SKz` z|8^#Uqsa;U%KRj(+5QBOaO-6GAqo>&i~|q~TXkOjQW84A!x|&`vM3@qd{zGVElZqt zrx2k$zF?vf83et<=uxxnZittLUYy})%{p}xCO}i-FHpQ>sJ_eGB8ITn$QIiPx~PpR zCS6sxXc2>ivND7gU=c z!d|+9F;}ny2@P!Hy)KqV(RGpO?lX9>n9t$igdfYO96uu0AdZzq6lkD7bBes&xTc4+ ze-?SZj8x!yM#xQDC@8VGZtY@+V1x>#XX6x70x^;b=b8x;$g&F@VVGGlLl6L8a&Z-e zN}n`lvckIu+aK(J0>6f)jS8l|AZnN-%PRUM3Xhk*qXBn>@5c;EEKw@!U%XM|;hIZjxO^_fW*6_36xC=lCUE&qEJ%Tqo0DL&WA$vfxH@9gACu=26oQ=2KL=!QU zNwbYRU1IYjtNJ+3mQl$qG5s^;; z;ndYhLOyX&&wkK%`O9_{RjRErs^tgqW^)ao2se${{eUun$D62>;J$^L8r+N*jdrh8bWBP zsU%}rWufCtLmmH|rlsZsccR^J*Uh6*@le4-*k@HC9iFzZgB>q-k$XE$MWDKNqnABa zO{_721M55UdyYw1VsJMHzQ=sov;w}G&ID_n1ufXw=e?dA zUfL_9#6iUVw_5X_@hnnQX#(9F%q|H@+r(?Ov*F0yI5f+h_>=#RW6Iwe<6j z3*Sf)@cj7l?`eFE^KeW)z9(mW_yV&{wf%S2RV(x66I|V1g7&;x2xd9NtERW&pLplZ zN4y<)dBiJXLw66~<%x$v^YtK}Fw4#uj$&LEr>^Xy=kfsSCl~blucWIr!g0rW1l_L} z(`AR=^qlY7tq=f!cr&x7o2xJBM7Z;_f1)5*#wX;s^9^QV-=?mksjH&y5Ip9ez)W4k z2q*q1+#79$3@~j&OHV^q;S&+Dpv?AQBdT5u#|oOzQg>XVklNo z)+bX3E14)1>|pgu^M;ZELW=tB9To^mEF`Wp`@e$MK7~aIGj+0TWZ{3R)Q zzQY;cy1%FZgu8cdrvP&nb_~_<=K}j^gI2D14~Q!L1{Aktj*|_6vQ1$Ia6RAB;k@~% z8^fCQvIfm|0pd-m{^Bo)Kz0C;1DC=`HQaSw;V6M6?~rwx+R=(m;qQdd|qA&a}^f9rT6F_h6 z*_}uA)BQL#M39u`@K!$!v8Ov0cYb@fwZo;g;iRv&hAbNG@}^Z_VViYiYj1^%dOJu7 zm^92Ax2|ri=ft8z#WjT=Jwrn!%v-~Ct&@j4u!48RG59*c-?IABu|duTbT$y#kt^#i z1HU$aUyqiz1T3nF4>uk#=^VnMTK3^$Z5(wGG|O zA9ozu!@>MbyiSyx_Q78ab7l*>iwGW5J zGD(-Yxrv8zGTV0KE=FY=2X9(IFXahLzvnD~$ut_(o565my~1LvoB7+SVhS+eRUha@ zge5HVo^cjiX(!wqqDpBM(mFF(ap1j$D`*SrP8T&tCV9=Rp?|Q^hmjX?#+H(=gr7o_ zF~*V#ddnkfGS4uOXyp1VQIDgT$O$`pi-Wh6zFn|9%GY(J__nD|x&PK$v$#+ylZ*`L zpwLoCed7_Vk|_%aCkg}EeuuuVAXp72IZ{RcSZuc#B8$g(r%C%zp(`REu|-gOJO~nH z!J~f)gQ|nfq>rz1W=}(=?Op@H? zYXN>|k(8sw$v_DhZ~|+T%m_TH$4Ut{^o%J^4_wk_K8LMP-g8=7p@5R9yeomy-~3py zPtufrb~2nWTMc*OyhY=xG|DJ6aN8Jn<$5e=b)314Y`F7|RqIZwv@(ovFM!^%=6dLg zor2F*4(ijTzE%33{e(UQsdzAXvbzcfXkHSsOoc-ubS+5PQpAd)91SXHWgN?s{sOQH z*#R_|O`j@zw)6ot#qoDG8fqBG z7%oI&yA@e*8HC+_gXpE-ZO&rCpkrmytHvxO<6Re(auC4I0V+G;I{yn_k_Vc@*_SCI3KeBgl2KoD%U-g7^`=OBV6;&=54J4VJS~7H;~=A?pNX zms!MRXmxb4Nyv3j`~fZR0~wOCQ2}RT6;!vNxL|#9jQn^OHi-HDnp!wERZ=wuQ1UDG zRZ;}z7R94Tqqj%}pEwImCj|VHQ1dG(hkJE_nj14$#0VVRV5-sss$(vXZAaKz@Q%kr14$Fhb5j|m zbh1k%j6IwN4T@5$$>sfo<~SE3t5P5(S9K*B(vmp&N{TSO2&(-6gVbn01=M<`P}Inz zzI0>If-u_UXF%anRbO9nFPT)oeC|9-d=YGQdbOf-y@<|g1yzvWk$45Dg*BR-P*{a6 z6mbPf1fEg8_JKzE9jgd};oUM8eQW74Q>_`*ILdx5K?IQ^Dq8>yUf;BUwaOA%0#5XZ z=VyW%(Iqzot{P5maDp{AQsS}gU|w+9kWz9nQCA5YG5|Z%#JIwzo&ok>@Gp%o7tRrE z3nHxjbb@R~DvHKQeFQQiA5Cf`&ISh9w+2^me4o^z$KEP8sEW#MgxazUoVp1$vGG4G zkk(Ue_-+5V{kyw$muuM@HiTEB33|kS2VjlN*qb-0`v8MQW^7*4XIOT`T^b4ppnApe zAy6cAZvjH`l>+rGfo(w3ws<@@1nek#s?1R0brZZBbPcS_{b9Xg1O!DvTCC&625VI0 z_h~mm9d96-2Z>(G*p5rzYSK!}F5Fg2YAm%{^-P=TnTG)zR}d!SRO>U}UU=>L?J z@jin+klF;l-jlbKiv)Y{gSK1%EShtM5TTddFK*9w^YR${XLH-zJBkypql3_E>u$-xM*MDa0l%r zLgOJ~;#7#i_Nk0v`!n*ku_KeJmqH06oB&P*5>6ImZH&0^p5=+B47JUucu!yz`ssd5 zyugw04Sn(3izhT)QoZxdbSUQYaw*a!9?1jka0eRHa;lPS2ROS7nxb;pj1oG;RoI3g zZ$&l^A$DMSEVw1aj>IF`b_a*&oHC2e+hv`c5CGy( zYS6``I1WhzNwpqhb45;EY1o`va~{^f(p_Jc!;-9^p`%E%O@ZE8lKKQJ!yl3{EAAPf zj;O;)cIkM95~1%QWX8im6_*zh^$1GJe!S7oLnvsY7P_`<#r(zG(CnsVp(ywZr=g?d zs_`m@%u&H{vqS@Ty&Zpl`*zoXbz8o#1g{_7gT?%UuY!)N`)FfR-HJ1rD-xw=m*Vr8Y zhU8X$nPp}jUQSN%&5UG9KIqFqB=h61l^fCcb}r>Z0nOowR8gK~iA00+)XPu_MyGAU z^LKL8nWgnBO&gkQvYtlPqyQu+{qv-2qcLAYiRc+f!&f+xXq?1XWMNy-xJL=e6&It) zcfYEV$s^B*WPE^zv92eM+UhNC z9EB3zus*fHGPHQZ8gbF`SQ^wygcA0tu1f^xPJm=&Kf7CehSu^X$kOd|PME~`bEw~j*JJA`_U&3Uoh+gU3ztpYmDU(@#TTNx^mCH)Khp8nPgpa=X}1m_S0 zYB7<2qQop`UMj?4d_7@7;pWFfY*VTGaE_W8d(@t)5jJ~ zRs4M&W-+UZeZ6(3VHpaiZqA^D4yudfXb$B*%*Evw+oK~8YuWZBQ;_d+c+naNJ*tcl zw;8L2au&g6(1?j#Vs@YcHXd%QW#%18to$g`4AndtG+MQ~ZD#0lHyVCJ@=7j+CBqI8 zM0c7Q8>VbXfHDm}MP#J4c~B>e;@@g9&r3+Wz`2oTVJ7P(TFE6D(uj9~aJGuf=ON|` zbkt%*1wK(#Z4bq^>@hpCUl)ssB@l)D+8_rpcy0lfbdiuOVbYe2n~M6UEBDi2d@GEG z`kdKCy3jF$ixPOR1r~cVnm+XMMXU^k12C!|W-cl*fEp1)w{4lbI&9x?#IK?)!botA z6c8+JuhVxeia{SCz7QK@4F|CA3~mTir*NE0{d)UVD5_%wx#b zRkd0q0HF0psuRj!jM`vPedbytM{(DQX(^hFkit6|$5SH8D~@OsY}SL3nGCKPncLbv51llYho7Clc;-ouc*AKo6BO^mB1-!puDs z1W18qOtdbVlx;W;CAi-;q!l(otEgL4b2S>w0W{&R^7ADMnx?3h$BPV^=2%LbX`qJH zj;?;s^A@4V?ERSaI98&w4ni_vdY*Q>$T zH!GFX`qj?btTtryo{Cas#rOaz2PXG%ycW)9b;)-U`Wv>X?w3R{A_d><_j2+)0~9VY zK(`P6jg<89d0+o>vlLb$L@D^4s}iy0t*`EL)?!~5S7okF?hc&DelN9;qK$=S_Irty zCb^ZfQ1U)RQua%Uotk2?X3W10{~6f}G5#`=NJ#rm68ekFRu2R^Djt<47dA+iRj9;^ zWDrAkU7j-4rK~9XgSe^+iDVVj7LE97K>4agM(rSE)>4p9CRLj1F;$VHh!h2u53c-0 zlTuH#ZMcW8Hj77mmc8|Ag*12z8Q2cR8D?J_d68< znr5l8Q0g$6_B%oa@s~wBlwa3y56QT80TB)%7zbo_Aq$T;nUX%N8@uNlUyh_{U{x@*SGK2A)j zYg26z(MC0Ho3)98iXcR?F@euB&7!TVo{-dHkp#> zJ*v5eGoLG*T~0%@?cv;^uj{WS?+|R$kjD9#x>c;-JE4FCO)yuwV<{m~t(u1mw(b_9 zbbiG#RBBwxW`Y=142#{5pk)4}fz^{V#rZY~Bh8F5162ZA7$JTb!J7GiKVjpks*77! zlQd_#qo(Mtjw7b%kBtX%5w2?Leq^dA+H{xr*Gf9ljxbVC&AUYi?+=j-)B%4w#`)nE zoiHTGDonTh2M#o^ zJVm(L;4sybIo=&8T*QdV@~~UxuxYaU748}huQ83~Oi|}Yj9TR1=pb;23%~=BucA^2 zNSymx!99EwjHsjcotWX3?1sPAhwR3@K9mg<0fEMqEt_Zn;#F<)_uGT%cx~ z^dX=%d_V@I#T14kphd1r-lqn5q(K4FUZS-CDq5_R_!-nH7EHpD4(n$)u(uy*oB?eo zDve7+*QpL;Qwm6R!$1m14Y&S8!#CtV>D*6R9QSj2XKr#JMT>X>KSMkVgS^BiN%j4- zX2e7PoLZU84^Xp!sD^VP{FHRe?0+HyyC0NU0e)C~_R}iU2?B(y5w!OkB$5$Lz~Imy z1SswA&*GeYumLO4-2SYuRwnRIHSs&pCDKj)sRpEb_Y&nu?Aem#k(xf;{}Bnh~F zzd_)G*0UWr8uc5vO}3t(fwBC?i*oq4amNL`IF<4M?BFNJZV5zV7I*@tz$B3ZFEC7R zwL}7h!|+2th;GJbY@mqlG7JhoyUwza{&-}_RZ%uB;P@PLN}vI6w`3rxTSHZlvBgqb zV258|v$#OakDgi}Wj%;VCXAm;F03mZCa{{I4STzj9RKIrOua~Se2XEi`H3TV`l&IpWC zt~gQ3@1SWq;-s%o%x321^7HUdo1T-eCvq&Q57qs;M0;&YF8%R-;8XM4N41?8? zF|QNTBX|{9nkAFX4>I97en-9%SE{_8}oq8bQ^3g6c?t(eTo$LM3d3-hoaX{;X>VHs)ikk!f7rRw9|I^`}{e@xd9^kzL z@w=u4$s#G?__YV#*9F>NjM|f6=UU#cu_2mhvzl^_ihLGzKjhz+H zhZ13<4G-A8GS^3hu6vh4AnCgTSO=oR`~itZy7KKAPX~h3+GzLv>ELVvI`@vMA$yb4 znfvpYPM^OT3NEnH`V)EC0d$p;16iNZ3X;bxcwZ|INM77AOCwO*#oH7;Fvi9a4_uJL zJHrO#IYEj-nPGzp(1`;hog^2A(66|;jw<=O&H!m@H~&6&uw_aOQYbP&z6LhaR{yGr zscDwn716nyzvesW3Cf;hg?YB{%1!uK&F;dnht~bw(;c!eMjpgp4q@`5SOn=(v+YyH zB&#==ZIoh{Tc|94J{7huQFSeT_2AkCa;76fgGR>Y=%XowxnzA`1HJm_i50T0FYNBV zyr*M_Dwx?_(gD-o`~uGaZif|PXLAiYr&U^JV@pjY#kIV*ERu!9llw#3FZFXHhD#_u z0RWfI!5hs(XN{^d7Bw8~wbtQn=XxJ5Fj55LBaCTC|smJ-r{=cwOMi@vb`GOYuG{>b#T`q3{dGT8iF3!RbjD6?o zDuyfi&HY<_ql}-SDsSp>Cnwl2jpXMmoF;p`srk8R%1i-!w+K?eMuYmD8hCZ|@Z+Qg zOK-!NcpgUb^a|5+x_^3wje%Fz1T_Qzsv#5fFaYZE13f(va^;raSzuoNnnPJ&W@DN| zT4IZwa70VcHBVQyL|n1(g3M|xiUCAs9<&K&Ztmhlzu-b9`l>Yy#>h2eJRXWh!g3-j zxX2`IAFRTQF5;&rgGGM$KjzS~&L~|yvj)|?1W?h@8iB=GCx2q9jTwV&0Pd7sJ&RZw zlhupClRl(bUUi(1k$E+yN88QiuWwME`Ht$sS!%Sj&r~X=8nv4Gl|K1AjEX*BHHxa; z*uBBsIC!n@ZSmKSaJ`IgEGP$t{^C0(8#tS`DsSlcF-D;G2}e}BRL7j2s`U!9KWlZM zGF`95U|X8N+<%eOboF8jr}h9wV$Z3UtLMWLEOFf!4#n-f=sf#D=!~nA67C$Ah3o+j zw#(Y1cme=MkSzqC$5?5LiEx8u+*y>~sjFmbm<43NSCbzX{bXeSZ@`AoYjYs){|Wjmal+r?Km+ z-%iQptH4ud=|wk?V(C2zPVkq0`+CP?{KZat5jgF*eV1{L|90+M{yT~|%YTc)Unvg3 zJ4o0asK16MK2N~61Ad2g0KeV&#j)A#2qTh*bh8D zCb8;6+kfwU>6u8ij=1{|U0}06A3(3cLFst*!;m_(&(Q$ej*nRPG38WD?`Tb$56c>X zZT4X}CFHCjQhTeC+>kSdY4Pg~lHHLX0>=uymg251Ph6ya(Ef#BJJwfjG&xIF-(TEq ziIxq=YN#Q$d}_i_!c;oiC8OE5c_yMPT3Q> z5P#Sj-HIoSiayXxKlo6q>G(hen%9+m<@9c*pn+Pxlg!`@18K5E;7hoQydmeT0c_jw z4|jc_sv~Mnrp)UDs$F9$>lJ zm46YU@X*YPe6~vS>(4nDy&nmRCnbofXM|yMd%}DCui*Q@+FO$N(JYt}a1YD``g`-t zc=gOSzGonUod9uqgJcRNmb|~7WQZ7QrL##>P>F8+dYX~nDjLh67?Vc3JD_6iM88E> z-JkJVM55wqj57Vc$+SuB6SRyajw^-soPX%ma6=UMfiH)BV^n~qk*3=Trirv)I%CU?NdPQ0%x=LJWdUTZVh$)IaOo8rA)m1oRjQ{9Ul@D{p z*Q`E%pqA?p3$~QWAC7$%X{-JK6AAjh! z=m#+X{ecL9qNc#HPmJ`%M@VDVUY%erlEw<_L)Fu_UTa|024K=WMEV;KLW_WqIy!Mx zK|jG!)TzbW;}OcJD!HFZ8I?0zvi*2uLlsna^rtw4s{0o@4LGyr^_qu1N&0H;i|3v1 zU#Mf+=kZR4;6}*4RjS3-Ya9B=beH3>2@!vIas^9Sx{|v4TAV&HKhWXp;|XGrz7Y=w z`RDq!m+6KlxGyDIDIOE#p&r8_w0-O4uk*{!tQ-`px~H*EDTC9PVH$IK{09ZPM1@2S zSeGAtP-u|v;z09)tHUwafxg_lX@_DeUd-d4ZYwSB|Elf4T0^hWK{EUODtBYe!>fP3 z8LLx>Ebf{#((ljmufjUu*2pzElgI1E&THXpG43U2Szzj)*gp+!Dk$+5SC>yOTH_$) zy1?g~ z{#ETXd_b#)c&_puTntCYmHk2I&+>lFlxyuL{zXRpC>$=fAEwPC+WYFCng+Bj1o#p$`t2B)WK zENG1`)#Yw-JV}LT6q6cZbzVJ_MntV)1S;^$dkK#! z#4TEgqR(*WF^qqPtdAA z2=4mo;R@SGTLL8pUrjbcU&oPAOX@yvx9KdF>!Hh^y!r7b@`CvLjJ~rLFTquSwrjyu z@r-oE>8-5IuTx-R=SUAN0eutc2-Swy$nDY3mv~jTT)9vD9R^ zgA6S_fQbj#b^`k`7dn4ch8mKD(+6>*u5!;fE8Q!n)i_nRv3XS9Rs*)2-QX3&d@V=< ze8N&ndCjHAL!^1K1K<_zi1TqcDtz3;XnEW{g;%Uhh2S6m^zT2pBnAKNFYv?Hf^dAY zLVx<>->{Xn@PDBxSMbk&g5gH{_|JcW-A4QT&wqloh$|4`@8EyAtc6iFZu&LgKk!ga zBknK%6PscS{_TJL)Pw)|_n#VZfBE@O*i~Ej@BfC4w}=1FPc8V@zoP6G{26|ZSMa|f z*eL(+fB&h4{sW)3YW(ew|Bmb2E&LC-GHmhx^)tL?uHeuA1B0{${}Xex2mk(4BkN}n z-Ln4qAE;Anpr3#LFFL3t{|Aa{$^ZA?Vf(9KJd>E~cYiifBGE{t2O-5NxxFwNcbXSh zXcIHk{N~BGNrvEOT3U*wiZMaks9C`I&wB}G|Bugjdeqm}mYY#mt+AQz6MX&owxQ~p z(g7&+eERL?ARp$A1ru|F$Fb;G$P*1b?i&pO-rMh&!W4g7eB(P`Z0AV^gKy7z_(jec zMZ??kU%7)Ytge1T^)i9l^zB(&48v@KYjS@4+ZR0Tn^;|z>d`UpW0r~o41!mk$3_@nv5G5toYO84NrgSejoQ8D3cWb;eI(r58$jF zh?;&MH|Di!Hq$I?5DnQgks}9nITAgSquwb%)bf9ft@CWFn-d!+`LqDYHVeXRtj7f| zzOs8{?ZO%()G*d&Du#kK11JoNN8TKad;&31Q7;`+C#c03AdY(y#QS-{(=O?R_5g=aS7UxOtyPHOTjQR6<`sB)|hniB`GH ziK>5c=S+=kY7*M6gUCG3u`%BD^>vBN5|$WlBqWqHs4)@lL^%H;S9?y5$A(O5du&L> z-&{dU45bnld}^B3k@LA&T5)Nyt>|{XCQ9{IHdrJF?hZ92-GBY`%#S@?_qUDI!2N*B zeirbo`VFm~Y$)Z7h{T|`qi4OnPOo(NI}U%HaY;tVBVJQ~WF_>3H{0pvm;c}><5joILXp)>>Y2fJi7`vn96m4o<}M_51-zPor++W zp1f1k8+_hrhHD_sd6&_A16hxxF_JnC35PwmwPdJO0-a=!{m37W-t(8Qukgnt*%yD3 zz7W27&L*t@O~0gkX7Gi4i_W#7_tYHh-i3W%?)o!4dm@t`FT4zm=ce?{(pXxdb6v0O zsOP3^sdjs;Llw0Q)g3Ud3q^)f95FiML?zOU0j-StiHeU&ua8)jpduFC`aMK4e?@p& zPPzc%O+jZfP{Yf%W0f)_FXsTuH4J|zm(txSc#T*~MC1}-4+ynntQj6O&LK@yla9#JkE%KG=210OY&@za z{TQIP;rhnDU$LJhOTfNUFx7wcGW2Xny|w22_HV6KhWoeHOx6CaHCN&MTWg!_>Pa=X zLF->p-uzQ2L3V;lUalx)>rQVXXiZ18htv`%Pa{fv({D={+1XF2N&1Ux+9Se0i67lX zHfs#1-lLO@jPYftO&@W%!^4SGX!cRcCIfVx3uFou(?~~0?v4sQuW708I70o z7iAoEd_-gSeh9ek%jXw`;92HnwX`1!q-x?tctMSpG8XXJEX7MmUN${!%j>+y| zGF;Lme7oq=;&)W>&8vbUbMva8W_5p6&>izY!*hyk&Xu8IY~g>b20Nubc)*1cxw)B+ zm0Zfx>)Q*@z+(lU7e5SjLR1Bav?fGZC^QHWwdbEV)OgbKhW>V5DhX^pd1xZGPae7q z*Ax=4g7pHT@;SEQp~1g_)Fy~s7=QJ55GeB^2p}EZAwDVqir>4`a_RiCR&v> zi1!aY2D8#1dUT(hf9O%oV5OFSnR${i6hd$_nOmgF7qa6=)cUx45yaddk54eyjx5MI zL-Cn(%P8B<28W5bY22EKOW8W%X(H}IUUiQJid0{Rz8Qb4r<#&Nu1?x`nzi;*rLOn2 zya4dYN^cS64ot+&7b-PIUqR06<;Nq|xf0pEV78c{W9zYJ!E>qO?Hltnr!`SLD%&%e zH|K1#)v>!iQ_g3(M^*M;SGfL%d0)T#TBK$YYE`Th00Hm@12m8WD9?CimxWKEZKbcf zZf2|g1=)X@W*JhjxzVX-kirhX@+nZIMNos+H5diWv_M+&z~*Xl$(ap*eRLWf?KWPBX@Igzl~Yf_F|AnmC{eX{JY zeR)X0;?Y&u)+F1UIpCd2UK|Y~wkml^+8>+ua@Btp+np>l#jAeAaSukN68^LO{&>)D zk^j$+|7@X;TuuC}KVw?RiBv{>px*~r?DcJ5`5UZ#zhkxW8$|!%u+$r#i-AcPbfW)C zlT`z>r%h8@wcF=Q-sbfni15<)yM+h5RQ@A!Y5glFD0I_dLWb8xg+d=sy5qnJlHrxA z&?kRLqrN^D!Ih>!KIC^u*9Z$)DUCnBK*0p{GsedaEa-mFf$c|lDh^9I2j`=={!-4H z<5!JKsdj5z3Ccz+ERsbK{wPNRc{Fru2K7%5VVf8G$hAN7E@!!eR5j*O^lgr>bcBjZeyJtU@f$TM#oo% z5N!K`qIAV#Yue!$kH_n@8Wye3P|NXroJnu#2#tTcb)+Kl+Av${Huq~u3AdN!cfngF zfO%fzYcGJeH;Q~Piio)l0(Y6+0@HsvcLPjkI@B)Cu5+)d9oHmH0CjJekSwG&Q8$HRYWtF@jZKJJiN{J4|*()qK=k>kP3NoXUKf@p2s$ zv_?^U)E%f4wB_d1qKw${bLuTd?KnD@`IV>E)jH>%T6cbDo?2Je<2jpTnN94tgr>dZ zHiT@qLVsghWsU)nO4(cTL-HwAgt^K#P#z&|bqzb`d$02_dd&*UsGwBNT zvmGp{I%Q+w+!eH|>I&xtV|5yVa#dYPrfN;~CA>UXt2Pj&d1ubO=0Ge<@7?+hJK|0o ztSj*lsG7?$^B%Y9R|KT=)bh~MSqj#Qaz-{mPY``mMY~?YmpV!G#Pxgo&5@TAj!-Y5 z;}p$}b)vNMz!O87<#>N)Cl;nQZbX1Dut^Vx7d{~?FiZyQZsvBJ%z4|RbQ8B0zfHpUK&V5K+Ux$)~G*@zwUj73jq$ywL20*jp)iBF$a8<%F2AD$1Uz>?Rx%BA z50%x>LM^C!g9?-u))Inw>D&@98UT00$75na8Z07@@>_z#+7I$^qCGhxd2gZ zSFbw{=)rv498TmGLZ^6JjE+Nh7-jPfwrpf3j=fZVPR_@YHcYCoMWd-pq;7Hc5tT0P z8uSi!aXXM+N_T%C-AeAjRn#V8TZv8dt`?j4S&fQ(xw(azcX;kw2t5&QF?ws=V)U)L z#a1a3-&SD8?&zP2*A|Vvpi? zJQWiM?16uSmy6n}Zx`Zto-m!Y;^*o$0r9cQ*W+Myp5g5eH?sD3-Q1^&+FsVu&|u8& zHdtlXj^8wJh;6bl-P5Op(~b>H-BQrpz+Bw(;g|GdssNqxwjiBL_aN-nTX5Nj7qnSy zR>XFlSutaYG29>dk+d~E!bp#G*PkEr37Nke(7F^XTXxl&)v1_1;nGIz4@d$5#Y02j%N-GmH=u+}X%p9R7>O8={ z{nm}MrOjb%-Gys$ZiapjBU%QkgVKpO1Gp~3F>M)0YmDNqhvf;={rUpCYWS0&HHWj2 zyPJO>#r1oXQ+mO^jxC%^|JM0EXp}RA+~HHB?OlZIFK-TH<;qFJ<1T**oF1ENsn0LpRW4>mAxN z$4kq4NGGAP$J!@NYD>Tr6{(%EN21Ys?wUS5 zp2i8X>s5_ggf2Vs`tyb!MMyN`p|@+@B592BihGmPtuCszr51=VMj6eGB>#d_5z4!(3~_HQ$wwa6LnvN(Y?^>P1=P}TN3`h-=I5=pGKZw)_riIo{fLBMxLyLw826 z9_Wv&dgrQ!*N7P9D$`N0dVlA5UUK4LW5X&|=D@d>$K%LB*SYsEUEJ>dOP6`pI7%dc z0^_0v8K!EAI&T&$YMb4b2$gM_nVkF6+tPOkNh?%o6C>0Io$5q?&NzQ?Kj+C=iphPm zso*Kr2zta?n6|g-BOX5;Ug7rP2bmEe(9PzQdAs=7!|<$(i%Yy;=9~l7jkAt~kE{;y zXa%X%00|8QhZk{vY-KKez%6a6*^$Rz!%q6AHs>%bCq-kjJYDi}<7Z5lb-c2Mt6Le6IZ)a;eK}m$>g?ih z>K&lQJ2zpKbT?mB%-QKGYJP*p4eNM&XTHI8skcS5-kHahheVs)=^W~WQG(0yckF;de2TKN0f&HazX>2}WIe;CEFI3s;=Tlq@%kIasI{WE-l4d2+6* z%#(9fc{r4^p~rtG-sc1-q8iMFP88ORQ>kmTi+QDMES7~W4Hkr-(dx~xorEJ|Spl%P z&&3{)AcWesLlQopJE*d*kx{l4aLzJ6bVS*-*!+E(B1Y<+6=L8UrLDNGVV4+1>@=(z z^@!LiOvPjY-?*%G>V8|v8TU?N8-JcgGX89PJwS~=Ut@o9Zs)gC4z17F_P8XQI{fY~ zdik2A@wc1f>G1&^(8Jn(B}rr)_*WP@H1((M0#qy`SDfU*jC+AG+U+)hdjTiB;6v8N zSlgT5L+Wd;+1|O^$0?2In%)pqQd%sjee%f040(AK_A?xx zyM0omXy-9H)xl-hZWS#u=gl~kGp&-;Vdr)HQcl6GW#0e{?YlxWa_~LkbQZEWXjJ*b zZb*rsxNoPdYKCPtq~4l~pE`doevxxKwoYX0V`N-Mcs-DJyU_S~L1F z$>SVdaw>k}a>AK&2@~PStu*5%QQS_Rabqa1Ni?mf?fHZYf|5EN_}UGpAn1q#at2go z;|Z9+v?37uvOd+Iy*oaf>f)Tniq2;2EDgV(FZoDLx$-jw-QY>>JPn?d%`|v&s`IOz zN`ikMp{Y4FZ%U)i7Wf2RzleUp0Oc-IV}rF{5| zcBxUJ?4}Kr`r-U}jyT!RxDVC3!ejD?EvtW3+1!L01x^ofNe>1Y+R!wETmsfgdz`T4 zaj1#F%cziHcBLX-x~klt*mOW?ycOs1hUA#f(||~&PGcW^bN(d59sFx+I{{xBK&nt7 z^&M29%ch4Fz+pLADPO0!&(%h2=KXMd@2|TR4-2}#{H&Syc8QmLG+ouCyt%Y{aSeaZ zPpqh~J*)=DB-6+UA+pIFM=x2c++Us#2R;6G3y#iWUyseBjtY6f-9LIaL>DP zs3PKw%!03?Nzd$qh>U9L-1KhONO*t2+wnWD*rO0QZu9K(wVTz5-xumSKEsMSm>e5M z>I~D@816AXaM+{06DpO)OX*uPPQH|RzZfUS72~A3?OiZP{JozHmA<6Gw_k|l&x|Xe z7Gvd`KpBzhFpy^$^4PV!Qc3$IujwAzl9yFD@4YeDiY@$&4t4o)STzJ)1ZxMfm;d~(rWZ+m|dZ;3ZJmFa4N z-|0t9vafZc%K2C8Ad&$a6tTGv-JKWPBc}X2ZAT6?r+fO;3TqiIFmH#;NP8ujuGIs# zN=5yT4J<}A>4(C*%>=drk@Wx$+u#9g$rHHp<<`*Yj82D#5!3B;4Dpm0>(v+9&uZyn zf57xrYut?X+YK3S3Mzj-SrIp5!RvvP{LU?TxZyi6JwnqWBSukT3Kf%uMAfM3gr2=9F$8BB?KsgqyK;IVo26`UG`~qPFS;H3egK z${r1zsi*bkL+lB&s4ER(t#i~=GgR3d&8#OfBQ`myC5C@dt7L+QuAsqNMFX0H!a2h| zCLJ%j84+mKjIJB7n2C7hpuVyDJdI8U{R)DO*a`5RPb={sa6b598XJ2B1>TkywHf)G z`W6%Tqv^se>L)UCpF4zdqdDwvLv}`_R8r-d{GUL`Khx#A2OLcRhAKnC%PzVt3qX z3@2gs0PtA;ZXN3GZb>ka#kM;0af!^I4ZC`$I&W9c#(!LIhJy-L@3D_b)nsrBM#5B0 zLim4U=oL(3=@qo?m9GHbvsQ5G6`bMFEBMR7T!^s7T!=BibFRJiDqx(`NU^-2S$h?7 z^99n`FBWU)4@n)==a;A(&IMG=aws6m=EZ-NI&c0v8!WKF{C=;alwlsBAubYL~MWb^c6GjdDsuDA{r)2iS4#rX}lt8Zn;J6 z=7TC2KALY%uPw%DvUwGcaPI&dijFPxaR0m zoxY4|;T%JAqmXmHNVF9*N%|sjeIAF88VxXE%giUspB^d~+I*4Z=jVKpNZGE)=8JzM zKbXq0q-^*b$)x4_BlBBsKN^z$Ml!4NH{vk@{~yiaT{h?NH&X4@{f$U^C@>2a6CgB> z;glg%X{KnZ(ljo{$*h|4>>%=+#==( zelxhjie8gS@-9Bk()RooOTrgzqsfEH!`7F66bb zjHW7)M=7_JHhQ(iq(6c91SQTlbfOJQdXVuAq?@s3DDQP zZ%+Yw!DD1}Lu%Jp0@g@`%(-IJ=OfPPtFM(I%xEOQM-T6Fa(pM1;$gnH)@^}K5 ztc=I0rFXD#YN?Zk1&oOS6Der${Syov6hsT+5 zg^5yF3w5h#QW)?#OMQQ}_&*gmT<99{-8A(b^yST2yR=aObG@OB+R{9lVouj*p28s1I$#cj8^bcCu6s+mgL zmf^_fbS(U6j4+%R^7MZ}ww`ib7cImFR=9VRziL-11TcTqv$>Mi5DQanTY))X#f#c6 zE;(p9gAvW@HPJdu#zf$-fzU_emV>{-4O1`+^*j4PES``>{f|))z-W8F&mg2_?F$@2 zqrLqM>2X{SjV3;zbd|Ne1EJVqNvTFSZ(8KUt1(4Z*EtJ_;~sz8d`2h_X=D)+SbD_v zkbX!XJ?bIK*?iDGf4`##gbZ|dLCbD0jw$(B0YbGCb}QPCngwg&x=Qxg7D1`JwKz#HRTUA;t)UFeH-Z`>%p-C^;Tp( zM3KnptXIUSKo>+J`MiuAH9O-HQClmbhJ+G%ltaWQX8A*0K!_(^dLPN+@RB>K68V<6 zqMfHnE7p?m${X zw};w!m)>eApJCh9#ewj|=&gEpImHuye>p`2|IXzU$IHrS7SPqOs!+Sv_0Ee^vV^Lg z0=YD~SV4cyxr?XoxPanu63?;G%azuNe4ee_2iPl8f4R*Mt0qzw0)KEPCH&$3%jK_c zvK&xX1s>oZylZeRz#VP&rz&&Km$!4>c9uUs$6S!OCoZe}dwKcrw0LY^*#O8}w#__I z#5{FXr_<$vPuiYJLS?T!ft8fsZ`|T#pD-+kP#S-i2(>f&M3(Z?qz%6c&IISMkht>T zR#Oir_?@q3Ym{#ZT}9eFSZL~KXwt7{cr5J{TtPeN;EIMRWXhI26!Bb#q1BUyq=Fmw zGjB5S{tA15|fxWKP2#T4N^>EC%RonSZuWmJuZ2?r@O%bEQk)Aq% z>jONT!+WvmhyB?)r1xle>3;j8kJ@pPt7ufL{g z2E5Wf7@UtKuf)Tp%z`Hu7qtPt9yDK643{$Q7o1jO(1AATE^N*onSkfP)fvA34wZ&v z1%NaL0*4It%NFHNa0`LUxHv~tf_}oIY{ui0YOwYAq$)A4*Le9Fmsuo+fu)7GqKe!d zD6BZ0?uzYixTwP-a(lxi@?hM~=s|xivb}&NZaL8H@lO;Kmx{#$BM2>SDsDY?V94BV z!zJ;$xDvVJlyEtBce??CpqZHSIlh2rxGR%-Z=7ry^#n=WA6}`=6}6>a9mbe>comb{ z5t|kgwX)=xH%)BFwXyN=v?aDZqAHrSqjOzVF^ueXZY zeB?1ZU8t$`hqZ~A#HURknwT$eqrWD$NPxL4+7dh3H|QCdn5ys&zFR1aOS}%^S2M*H zRe+X#N+z;h3uLJb%UngnK%u@Am>L|{mkqUOCen6iRd-0#ZvS?i;=OiSmxv%}J23EX z58!;E;`;I!z7);Wk63aw6)S&od#reXiq=T#(Wj@1Q@yAAHkXAK&PkzqV}RgkkMtSt z5)+cA0gBD4XvulXdnwo5s*qFU;a9Sr&28JG(EbF$W&CW>2bVRkPk7P<2MeO_`G|8d zcv_O1vq-=buAA$+sV`z+E&!KJdUW3M00BG~kox_OEq#7uh}ZJN8-ss4pb!h3>N31z zYS%mX)vqI|CU|1&@Rhg5{Yle4YfMc4YszD~T2q-_X{|=>N^9l=_k$Wxztp8hp?Iaf z8QGBnm}#yPFsIqxC6baB@ZK#u+XNB2t0Qdq@+hmbg>WWI|EfJK#;}D!MGt>NzpXti zFM%ukEj{VBFy!PBUi^RI!nUmDiur{%h`$=~|M_mmsBYpXyV@eZ{@uAxV53F%NR2~R z9}I5`oUOkUo9oW7QKXigU*^)J)Htw%wjq8t9+%^$P^XZIJ}T~(xw)k}Zmhn1dlE-O7TcJ+XgCH&`M zjpr2YbWV*oWc)?J>ZJt-L2juElK37At?l_Jvx7*!GG-QM|vRP^D~z(e=$% z^cP3#s43Zc>8*%ONk!enCG`s5NvIM~9JQ5DHR%|GrhyxpO{+>Uv?5qrNt`QL(>m|> zR!ZEpio`Y`cpmbv#GdCN|7wF?(42vegRNd{D)`y1S~!0=N7UJjhX72_kb^c|zu?@V z#;SjK@oRCdGA43Gl_JfW^o;V>>;t=jEfPKTdR)sZz8gpSp87c0op+oxRJx&}lwHqp z^@FysEm#v+<7l$DDsu?i-WP_{YpTy18F~bOx{`?Xeet^rHNGKM*u^WT1;?iB$=m*;K)C| z^oRg5(q)mA%-!<5JkGfDpD#~066xy8tTFKXHmiJ^Dcw(mGhq^48vZJz5D_-S1mzxL zf|geY#`rdz(t{iH3J$Q~kE4FKLvxox@QlTt=DZ@~J^_6r6c8HSsACYxf%6r1jDN}?qG_r3QP3MjmOl;urkcjkYL5>pKn@bFnE z6be-Z1dHOFl>$)MLGu?y3DDY_L7i%VIgc9@*^mGb9>TU60xW9z*#HSx^!#$mYE8cY z4%&UWgiigw+_I?Qmp`c|D>u4Q<;$6~GG8vUsPjdT+Z*NLvId`_6Cm-5DGz!5#BnaM zdgHi;W^1PcPF6=M6b65<_VS9oo(hGyXw#t4tR5>=^JN(3yPS{ zOLTw^DaDB=6H8Hgm^-AX^-78EK#^knNlB>-^mfP-jh8`F7;&iHmf@LBImua#Af$7b zFRQPNwNKH=-Uw;yXBf3Yu^=J8hQ?zdOjdrivuV|x!jVcGQ_Fu>(QK=@gJ|2JbyDqI z%pBQHr4^@`)(qO4x~-|jQrim*!vH<%ROzb*yl5S-qw9RiDMTsOEYYHuok8t)_Hx49 z6MH$OeqGPNaX1sJdP=YJ`K=}EFO&`-%reZ!O=;l?4K*ATIKnzXA&9Q{teqiZDk?sl2tIVNG*lzQ zP$x0$U_|H{0cWuKgytOsK-ftBiqR74Hl()@q00qM}z@G63$h7Ij_T3a)3 z8!HERTLR}rw7oZ5*E@7QH2y11$soKU<#=MEAvdR`-0KS2zV)FKFNNiUF zY4c9QS8spasU!g}Aq9e>FH9U^tAVu=EeGtZV;S=fA3iSoy93kiu3Dw;ZrK^EwOiCw z83~(*H-*Cy#Iz!+mnAenwXjWJj`6V2G^|8h%i}h40YLpIuW64@D+?tPQ&bi|c5J%A zA+4pIjgBwX0jZ)lS9V$wa$B0L0;)u75=4-G{FQ%5aEhf~eE3-b({vs-duGJ5V9;<& zgJGw01_J^+kPJv_4kOiLsueUprYgMm88^;dOnW#Bs^ej$ZK(Gvq$4QhM>95om4qK1PYmRxDd z899GR2tW&9%(AfFGvuWet}Yt@uRt(MsqUp!SBiBPJ_47KC>A1fJvCCIT*XrwowyAr zl3IJVQmL|;#NYDq6CbxSC9Zqz1(eokHeUn3bgWA=o&-CSpdKbbCC^hCSvF^<%37$V zxuwVc)&^vQ!GzXLhpi$ewBA&buvZCl-miZ(y-aCsM7pW%dN06OEhe;fv|LhqD>4#L z36eEYW~2hlFcOoZwR=UiLS{B|OJ99b()`L-8!L@4iv{a-V{`;9Hsyvv#WLJhAbcQ! z8c0)3?WwG{ZO|+0ZKH)Z_?)&9eg?~w&r((?&q}76mYNT`0OL&sYdtoP$KF_#1`mJz z5n2W1GTpzzz2D{QruHhwIf9QgaYNCvTzfXJ$;@14H^)sQ#9qP6X6ITnmCd<`Uo<#3 z(=o_$^1(+E3IN)2X{%}eVP&1_?7@e;rLg+|wNF9f;o#+fJ+Av}byl-x#dgn{wPp4i zQqua7i&+DsesP?$<`ud06cnp3<#~V0WdI#LYDiGCPw>L=t1Nn0Hu^BDj31Qf0#nVx z5f}}KmTWGIn3O03A{lO`#5)Mox|*^vV8WcuK`M3beQKm=EQ{n+b20C0Nw=%;IuW!x ztZBv6%}jG2m9{d2hE`yn&FJr80jZZOr$a^Xt;T zn0pS)Y6mGAzJdA{-QwuvAs8M*Rwy@!z1}xy7Cp@5ho{Au1~!8(5m; zAT{T(QKF)t87bSx#gcy~^@hLGAIU`A)+$tEzew<8+@w?FjGadzA!qj4@7u8Fo z*1OliAkc66s&E4h}AZv|8{K$ac#Vw&E- z)dnAOm%gcO*CEAUA<&^bC6wHuoSf0xD;U(c4W>0Gk1K!B(KFxLj8aH!8gGovUXMY` z)93UjW7IhKgI|@53=iM3Q!X~M&v6RJd)>SeJNpSr_CF8h=u+loHW1wziiN!9;)Yz& z0N&PFM@G|TWQ8}isAZFXQ@iGD?j;DG;bfAxHVs2^=8*P4wLi=B)JW_DTh=mpgNEVeb5tGZ)p@5S>sJ%h}Nm=SfC+VE_X7htum4m=2S*< zO06AY;M2OkZpQ}&vROg-yzu9dn{ageEu z%s-}T3int5&O4?WGAEd3&L4|QC{%nnrDNo4r}(;m&`=b>GRiP~QTsft#6qT596AeXh<#MH1T-L0$K$P2mnkzADR*usm7WX+duqr^ywxm^LuKp~0 zG_x=4vPE_Th>-Nk@KYzf%j7Z7$U7W^B$iHiaN!mZ;*BMys&q|MB0UArMWgl4VtIV< zdg44ZG2FJ&Eh%|TF_K~+ck`$|T(k_BgcJgr*9#R@&43MwtdUHk;8M3|ktNbfnA^aA z#lFn%-y*Xg*uIU_fW$Vk8w#R%VYer=pX9bzh%aq<7{6l?cUv0LGqq6*Be~UVWjdz8 zsK|nP8tH=3m3g$)j9zwGdsq>3b{TMWUsYVnH3r+ZwM;DolQ$5 z@X8NUVw7H0wr@7jmF=5Y3m~?CH~^Th7vNix&nExY-bOkbeg0uqx?N)1HOdY zvbj=LJ2}pr*6Dn8hihx#%JHk?? zY`G0_SZ+|v6*J^o+1DF?i_u)PbHxmK;Q5HNc>`<>v7{p1S@QVVl4l-)ZfcG;`1x!x zM{bY4P0IjEDtSDp@`-Pv(x<^at0A&LFgGW+$&E{Za%GRp`JC-TvR~~-H|8q+&xL`b zzNzyad1A7Lu(H)R8duxuYq^cWYSa3tcOZ>&WnykaQ11nr)^1OK^%77(oI%41HLLY< zu%QHA7|HfJ67{^!JBz9_w*ls%{B|+C3U|{$lf8X zRBM&sm0jd@ff2{}YJP*&NG5nyp_TE0)0EX3&r!mfEX*_?aEj)=O@#*ejm5*nS`kr> zp)5gmEo22i50&Jd*v`%w+5^SdSY8$$^-;R?NFDJa34u_{g20oH27s`Z3+UBvi#If zu%y;Q}^9o$@DVEq3C_=HVvPw!yb=T^t!7HNqUI(m8peL^C3c!{& zas$^hV^1r3sWl{64b&Hyd0g=r`7RS?GY^c-bOoh z!*W%7MbYStLw9t9yQ=-9sQEYeNl9r13)TO*cNENj4PJs*6wLjjY{Q4Sa9&HuP3l2lA8Rx??RYRtp-0&W*Y6v1)DFDRU*-r)Dyq{TtkOCl2?ZTnx&@!MK|SKUCr3{N0k3H}u{L4w!5PsOdgZ6?12 zg&OMv77QtkH3pGDrmT((3xq1C6jG%ED*lo)^fu|I+bk3&Ma>LM3V0ArhAFV?i1U_K ztEP3%psS2$fFHw!32!TTpGxo42bUlKNgeJ$ETy`#R#mm12u%^+tP`KbP`MaY9{~w} z_q`ewfc*B>KacmWRtsU};?;|)Z(bc5uTuT%`YzS$scuX?Yq$~he8HMg*B^vA59@I) z+P|Z6TrZ=JG|CB%hd5Ib^t`GstWkh!X_)G)T2dRyEAhkbImRU@HpcM z)H&rsETnbJxsqxdWmQ_+C~Me9czLpaFhc5K&>6Gy)!T{(ur*p+KB}nN@=;CCyOgl7 zrSv1MRn?2GBCNEHETIR%^VPK13+17*Dg1IGyEr_ zyTNmQ%s6=8W{Ofw!L2}FLoPySt})pVdg0oZOF}7KmoZA1j-e-QrQ0!~K&^DsuKtPA zFPippxL_K_R%aLow*xj0)UahB{i*U&l~~Nd#UW&bcT-;5D?t>}vbR-=jpkg^<%NGD z>Js4jgOcFLWk=QwV#nq|b1?OPE5I^#fqGOhD{l@q4@@OGFs=)Yd}~RxV1|kF8Ear! z1K#io{X2jiP%D+tqoD+M-cC5mCk6(nFro|E1vadxz`1DvbEYFWmE8t=DIM7hTsuE@ z?PENp0)=2I`Es3QI38T0HDLh0q@&M^GYBs77o4d&(LXCGe7hlhqCv}l37%b0NSGl& zBh!&&`O1nb^V$l(RH_2*% z6p!9GFmF-C7llS6#$wbuY^Kx6@Hs3hvwu!-UsT!rz|gf=FeHS3tpP+?)7qk*Pe3^7 zQxGN^QW9JbC?zC3EYRsMfvn_$r@uH&$sosIyR?T751_9MCj3FZ1WcaoF@Sfjd%gbS z$>7Cs_BA+{%Zq0XvOj8$a9?t@v~+TLuBEXw?7gdeQPA@2judQ~b%w;zz{elM;$k)! z5|6U!rj*SVU^;Vuz_HUEhQ*OUi-ch-b!~@XE-8fhq>QS7`gVGGrh)T6WKeZ$DB0fk zq+=)qEyFg0;+fV~;V){)CD))__yaL6k*1Agnq!)LyYM%?1X{1jx;X+9F=0*-&G|t2G;H zjn25uhN{(3zS&f@I(0Ogs#eRe*;KWX|1_Jb)-YvL)mmMf8YZ1hn@!a#sa~_GdW|pM zRK3OvZ>nB@ojaN>)vL>!W=r)NtGlIojl11ay$Rb?ugG(=rFunun=RF=16Z@AdbQG; zE!8W+&}^w*9kiQm)hoF{v#olyBRAWsS8|(XTlH!oHruLK8+`+XC5Bb+w(2#6-d4Rj zT{YXPSL{c#t$Gd9cT}%b^qU=e!4m)5?5JAZ>oq%nSPXVHZ+29x&ayycHAlziW=Bns z;2sH*^CPPfe+E7I2Nsye6>BqADF$%qkA6*{saqBRpbvnaWI0zy7F2rb!9%R5XJzT`$~i{!Z56{FoxKqCkUfnvk(Vm<9ML&7U6i9x+o$X5A@w491oB- zi*P*b4M9XW)ffniaB$4iCn6jibkZUm9Q59QBAgMsdjLUI3sTp$w(aF7MAU-Rd97}< zUqM7INZr@^Hl1`t)PghsTH&T?gos*@hCplFE@MH*)dHheF!0G{2#BZ!X^OPY?fis@ zT3|#Ac6QlE7$RzckuBWuDPk?qVz<{I5m5__azQId5o-a~JC52`C)PN^RtwfR!dA(D z9aUnq3m0UHq!cyTs23jNRK%*+`p0lvL~Stwwk8UI;kHdnZ7~wI1{%Of+Rjw85ivNx zQY5v&Qmh4{3K(vSsBK2b;D~_{TmF#7DPk=E1z;q#K+Q2?wsuGL7&U{@x+2yBt!sNh z7%6I~5j04U6|okGbYQqGMcIsy;ekzmMXXX$61z@C(Q2E~GQ2phNUGGbS*4;f=8hQI z)Hxk4kz(Iiw|7;V(KNhpu1IQux?p4tcD;(E7O0^{*pzG47#n3;)jdL^p)q$LjoM{8 zOO3uYy`x6xuxiW=Tr4PJg<3d~Xc0BTGxft9b~b9cJ*nNO;dcMoSochfW2i`fE~gT} zk;i-XaXj7utpe8$A@W7xh+xi31gA?xB;V81G9>~_!oy@`sHCkB+gZPJ2*CuGBx4&W z12ObNG1P@vDt}XHT!@M(jVn8dk2lWg=R227#{AAPL`kzdc3gu*Fv47#^%1 z_TE8UFr6*T1~_R#@;^J>XMq#u+CiS#ty_!dmU-h<0=1Dq_U!^h{d zrAdEnyT_(9_XexEL)X_{=(RQe$z*VFu-XTH9QF@@7ky}nAOyL5AHJ0k+SuLf!=@1- z+==zUg!F+6n|&M&*7(nVdVgnojbCiP~;*lFl5B8Jr`aQN`UG2ja#1?YGSd{;whaB`x6a%h~d0+ImERO!%(3^*vce6 zz-R_#;)H|Y$CP5`z^bGCRp_*#7SLz>3*`akhkZ>SkLoZFQG}_OUyyd@#|5gsVmUk3 z9$4A*VOYg+!_PLtLZ3Ut4RCYJLq@TG2hL;}#(hm6#VZeg1nYh9=7NJo@82PjLKxJk zkCQ6fgCACgeOZ`~m+FCbHWd6t1ED2utAZmyRdO^@LrfeM8u3XqrVzc>**~hjSa}>B zUSP8XObOaXJr7IUMeD%*Bs9iB1TpInTpOXaSXSybeleI^Ab4yrw0D5m_*dNpqG4^p zw*&_i)5*Gjas1Q2tQlC$e~I(x8wMIR5dSgp2xE{D0d-c(iQQ~JYhi7heNucaEWSdg zUT+A76s|0k18>ae#2wmHv2DU&8gqyi;1{tiTjcm<8g3BSZv3(rfGH=wN11SOoMQUU zCYta2F{cp+{9<9?U*!Z4}@MCvThfyGUa&;%HAZ>tp3JC>%wDO@BsJwS}xjNx5T+0Nl1e&Y05XPr@!!Y1q zlm){@_8mVE?r`y7*`QJQu|-@yq7g8iqm|Cjm}Plm=ydl$i)BMvr?Rek>I$2_1#Jo4X?Z1=WV5PwN}9uyd3k zFem3^$5su@c<>SKY#D|{Ji>-4pcLE>pc<_h$BK4R7UMeRLi0@lI0Y>z>o;jW{?#0R zZEp`TNO+FTx`v77OzdE=a5c)AfD?I<6ATWN5z=x`doX5(gaOa?i85dU54-rO?{P~@ zri%R3;PzUNOw8>y@KE5cjKOFIPbLR5e2h$Dj|Qv#(V%gTX>xb8KUp5E_weEH-k>>{ zfK?jaWng&?oRaY^vupo+hR<1~e?Pl_+w9Mlm;cGNwV0%DCWG_g>xJ)!FCMQlzV7>nx zw9NWn!^z`%|L@?#@}Z%R5bQnh3+)P;C-G)YO#(<_VEhi>9KnnZ0e`!d*)Lyz{zM&* z7t9FtAm|by00xmNGzj5=d_7rt?4Ow^ntA+s!^66r;3ss?I-34WI4;ugBS((-H3!gE zJ}mFqGz$3fOBE3Oz*GSL!fc-ZQrQ*1C*w;tiJoZq!RQVD<a*AJ!3e;{{pg*mD%NDbY&++#K{=UTD1N=S2-y{5eg}*=H?=k-V1%H3W z-`Dv227lk;?+O0C!{5K+?|b|`#osghJ;&b<`1=umf5G3s;qTw^7p{OA^K18#QpWLU zG&02}qDMB7QZJyy$}Ief9p~h+mmDajbFlF@!r$NV$GKqdSr9wS@x9=G7~qd%!4YDW zm-u^yzt{NVIA3vUQpX-v6W=J!+ZdnZ&crZ9%Db~19lNyTQo=>>NCe^nO?l&Oe=x-RQtZ+t zFbsCIzLs;`hZB}dBUs|w(49jetRY=?a{ReZ{O5TkH_gjl~(U? zdpxFj!tv-8?mE?f*|*r+7|NC&Bu^oHg2kPtz~3WC-4pc>-BsLcIN>CnaD)tDZHF;h z@2`MX+X!Fq4qZr5eBd4zIXKm-cv!_gcN~2f8voFT^|7Zuu0DDk@;>&wPdx9Fn#5c{ zX^BwJ_uTV6uktHFedd9uo@5?WxaD}j^lMc$lmpL=j6a+SxAgD7dEd->irX07j%X{kUtia*Qe!)| zD}>t49b?gRqUEJ(n}w1iF3;xf7!CW*xuJdKV+5@}3p|da^|XwWzw^hP#@l}6fiJz^ zM;Xck~o2?{VdUU&xhM2Cwe|>_1!@f#$qNbq(Wrjo9PecC!&q9Rc9VtVVliTVWfn<*rPL%6m%V;#MB)4@!f^EtFe&+ks1Yd$A`O)eS=;lnpi zPL`$z=Z9!6{vC`UUA#ZqTfM%f40A!na^*if$2g*~9Df#!v2{>aj(@z`u_ou-rbT&X z_{SuFtJA^flmGh~Yy^)WgXN}XugFg|!e<=Dqf+saPs(s`#L8pQ=%erms4{}&`ThH) zv%#YYgtlphW`hp2#Z1nCc*9$_mSS16UhleYWI~-uK^lEF?2?mk1J(q*UE~AZjJ^o?g*3a`r9UM_Xogfv+9e;P94G zQ5ziIQ!?uHT16YYabX9oB6tV4XiA0r%6%s>3W1vI{VHmyySiF2jCfujTK}mhQ)fdy z9ZdiK9ZVzl`CsvHT5wPlh@p<> zynOikH7>h-ZurpQrRK<62dQ#6PmI@Z=6eG}{+n6gd@Ry|v_2MQ_BfwY?Oau#7IjJt ze0%1l^T|;MvFZR_bG_B+QAgT%jy4v%@V@bY>XPJ{|+-|!0iZgH zjy(xs$r;OTdtyO_GitcqY=s&D_+>_Z@3f&nsOBrKf{cJ3_`(BUdf=mb?g4+) z9_G7~Bq2J1lK|~Rlgo>LQ9~4ZMzZ2x6s9bf!FTBks@g`L8!7^l>#brB5}nDTO?D%X zc$L!`kUVN)Q9O3SHzMSyE>CTk{U>5W@({ZBDb`_h+@saTUU-1^<{eq8@TooQ;`!4v zFNqA4SbR3$zLV2wqb=rtIuW5-7WdI|I})K7MeT8wl?QIUF>zggw@509P>4nob!%0K z1yA7Kst{+ZVic_k(eUc8w<^Tdst{+ZLX>C`qPD$6iXZ|QKOo%g-HeawYX*t$^uI5P|0AuSjwW?|{zAne+Ysnm5rexI@;>>eWo%gW+OE>HC>x{`K z*5jYddi)PyHRc$LkJ@2dTj+=Pvya@SK5a?=UALse{+~WcUO!1*KS^FcNnSrmUO!1* zKS^Hy2TNZ6n~7Nes~%zg=SWIF$wxoQNB@)LqyO&(pPx>Dj-P~?pM;q)FI*C>z!g#s zt>w^q4sDQD@O2gbg7WBR%-Gk7YyAfEr&B3xp7>-5Lwr1w1PKR&pZL*X|3{cE!T9bi zgb`Fb?Y|ox?=7B!U&fbUmiN~CP4FJA2GUC7 zY5$~MS~Brsj@5P!6;;Z^(e?=5sy*}kK$QHgsX6`Fv4)fD8Mq>##Z7fs&(3E!(fw++ zNu0U)y1mYinqOheNB6_#$WE#JV7GfJnL#-}lr?{9@wb+6yDk9|gWp=hA9D$%qvu1MN#{E{UkVg#TP+wu zSl2m!+^w-ZhBNPuI&w~Bx}d0MzO?mJ7nHd_Fdw56s?Iw$#qT$K#Q=52X%VK*Sq{ez zNJxI`aQ>lVIH$i%KGe|T%dU~|Hh|j(=Q-Di+)HZIe;^$P&eVsE_84{&SUbft|4!#J zE$M3;-Rqb+uxB&Nog0ft8P?jn(&0YN7Sri}!k3R8eMd(y6SGH{!0gU!v}rd2UV6In z6FlfnVbTC3_=3SDSQ-!x%Q#9YM@XC*WC}sb=P(hu0+aDjHZ8|6CTXtaX=bTdJhVQC zJvfb@(Gn}>=;Q}keT7}1^BTF``8l|Hv&&C%F_Q(C%ih1LiV%%2X&6|!$ z8y0{l&3aZ{K^DJ%fAVzE)%eelAUv?7FTqz>Yo;(_Kb;%GvmR^i zU)Eo-f^YD8F0OBS`$QzH>VIO^SuXrc)Iekd9!qU z0M7)+aG?Y@Nh{{(-&05DNQF}bW?`y*iW9SNboH7xIw$=XEIJHB8)Zw+>ZUz^_XhZuTh9z@q^DF&&LB&u9D1-O2v)axliyidt$i%68*V3-czu3ZFWsbi}DVIaZri zF7S3UAlEMjq&@psS@|2z9!SEp?hJWFKsle*@={^{vsEklDK3A2Yo(}14-C{E7lW3v zdNRU#_YbyWt+)Rol#s2(suCQ3iXuSG^2aADsp#G{4B;#|I6<#)!KD0y7YY9^T8&JI zzVwb?rO4iCAJ2S;wYGOe@60|Gbj3A+;6iqP;5Iy%(e810 z&>Zgffab}a*sKSE$N2RE={qbXVc`7`FBnXg79XF#g2~x2iT;AoL|fP9RPCMFMPegZ zIL3n&3!~}6^mKGWSs50uxj4g92+b9ik1c|W8-% zjm3b4p8D;xrCFNYJ>Pfo!!cn)F)HWx?rma=Tid#I&Sp>PEv_ejoAv!>c`!PdsyE{{ zczo!lgr!HAj%%<7$PU-3n#cyWip?=>N7uH^LUsn9Dvosxz0<+5YRZ|0t{F6U@9w_; zh*&HJ$hNV5>sE6YPv~rCCw8~#$J0{bJI9i@vX47BqWZ&9a~ml=9uQFEGX1co{99`& z|E9aw^ZZ+DJu>5e$bXyp@gU#%(qDg{IjO&8w1KtmUw^;cEdTZQi^Smu_Pt2QJID)? zwVfZY{Pp+QnD^V}TWv$l-~h~7LIebfa~1_YwLJZH3vfs z66?1Rk@`@i0}Bl}2LotZ@{>|t$_XRdHPs*zFXu1TLGe7E?RwVU5DSEyyK1# z9^IWG5r(sqyLSh>^xX zhT{AQhBK3YpkaTKM@eL5<`iU{C`jSz!nk1|ej}rRs?`IH?z6EGd2j@IiV_u%{NemW z`QGr`D`&qyPn3pfQkVjJfxAgRMUp zlg!9|+t?@6t(6tbw^Jq}GM#qf&~z~7DV3CmL7d#-?-ZD6i|lOhy9wL?WMgy@N)&f~ zFggsh5(kIg{+P6Kw7i@%!;!u+bDiHCY$9-buqmGPhU1qW0|0n%jwcoHg8kB{KU&`O zQT}Xy?fUv`@OE-=RN8Z7bo9vRs5R@z$Y^K?a*3WY8|Y)ob{CZK{?ZW%D%N~&8Qm8} z-MdZT)*6Ag2^87HuvKNkjM|17gO1_&Uqgk0XrY`4VOfhc-AU+aKQ^tnE+v zk3IHsIlM+iUewOLdmH zzEGG(dVGMxhqIN@ahNm1U$_i~-()r&>-H`@Pp;md@|iQRjRt}V_v$Kk06^iz(N9%> zmgyN9Gkn>BfEx)%^xNYrI@2GXBI^{VQMsZp z2N@ZRiB$jIzsIW>{G|8JW`-Oz>sU|)3%HY~e~H()vVE}ty(=-+-bdlz#@_mdT1YJ= zh_x2ZZr%Ef?~=GY`PQw`-7_AUy^3$gAav*B%NM8Q^{|;y*C9;(^5XsiwD_QZRY~_G zqvgf^!tl)njxxhz0<0`wb=aB9kmuRSxT9X5j3!ePRk^JG)-8@?0B}g>vkibRpoyw+ zA0!f#%x2&|SL)vA9(X$I(<5RsT&|24z=vJ6`=zRG<3%Wy>f9QSDEGLe_%u9UCk3TK zN91G~I*l&#)0p<&8RU@ zQVP5)r=E)H8olf5>*-xz9PloUTyXHQ2C*)sCY=lG!v|z|CaDj|v$>OSQ%=E?eE1zz zhhDf%Ok{Kl#tEDw{-K){V_JL%KSMvy?jG%*6)%s>M5=N|@zlFaNL&hk&Axbe4`o)D zDt)aeB+rkOu8y#;?&-88WUydfuX`9vaSoSs}Kmg$f45fira(E}Hp zWfw5uC=6re?FDO_WEY1CT&QrNpByhtHFhf$rf~+%VP&bnzV-t*@>>x^bMq~vc>Mgb z2MNsxTuKx*>>m$Kf;=OCxzoY9f9V*HbNS z-JFlHew(u&ndL8N*!bWKV*lmzk5ZUlr38yUgt_VXWSAAwisGYUJ}b{3F3J$ zs?Ra$yTZXGZU%+5ud!MJmA$FWy;%L>%Zu4nki+4y4@IBIfp>_1`9l6a@Q+I@$@bJH zV~p2!`*6GtH}dxOmwzxw{C<@Ep*A_9FXG#j3gM)Q^KWcsTG2^_LQzi`*j$P>a1$+# zrZ!Bo9`-T1%E~B5uR*+?o&UP3gAVl}rhzygVjABcn)mM~U`X;YvTW49q4gu26C0QJ zTQT{(202eH?$^M7oo6xs%@Z`O=O<3Zc%N+_R|3d4_HO;TIX_zLf%C9A?N0BntePAC z&#GcbCm~%={7~ZJj_RsXp8grSedGfPR^jX)9>^}4{yw^q=>V1y&b(z4kSI5v)$CN1 zj&T89bq*2pqdrLd{!E(T7!bP30YBdGT; ztnP6aI>ioj3IPN-UBFXWJg-;?Bc~JmVSe?8et?&Ba#0E3c!PmjTs;Jh282H8V@+XUy_-oCsB%6S`o1de;Qy_RP~ zP|>-~K*Bq?+P+nAFUxq!EJ31+YB9B}7qTm*py>Sy-JB4o4^5zE@-~x)G_l=Y0pxt4 zrgT}b5AWDBNd5swedxsm2l9`>g8y(V@GF>v273#?dpEr%lY?pg561~`bS8$`W&h71 z_Pm9E2YPq*KMPJBo8zaK^x%ni!e{y3xivcMoDEL9bJM|+g(SqFT;i6+L2OVRX4U7; z@O=twhuHfXh*B_h)<5c9PpxS+!e-1o1Hz8_rwL*66`E8Xs@v~coEn6vjts=^LWIn9 zA*G;Mi0NY0{Uij%?N>m9jf4i%Ie~3-g;+#?u3lQmmsZF5ty^-M>0D>kv%Q69r*L9P zW_kg_;S>sw5RDuBtH%#0XINdheS2Xxxgs(Yx0vKnAq~%$JZU`C?A#b| z5;an?;lp0)IAp&=O4U9JFI%m5G&Ss8Sp40)$@St25R>A#w9?i28;D)2xXh75dZ256 zE_Sa*m5dYQS>RsMH8v_;jkKXB%>vOX0Zg}m7YK~Gen3fg#e$YxSZQqyg7Q_qCM_Vp zMXe!zBUzy7XqTIm?~zNEqJV&t2-I~TvjmZTMAR@Zt70kIb=WcR9()es$&U`9g=}8s zb(1Z%Z-`d8f`oiJ4wYF*c$V%#V|}K7`7zg5Nyx!L)m_0UI`*~%Y$bN4@y)1fu<+{i zV;0JO4=Js~*{-|)MPlY6`L1RUdkItT(O;<}lwE<&s{nD|R534`zmIVlU|qxE43VVt zb9y|HL;#N~FgiXtQFIbYPxW_Uts~*V;kC6cJ069U1Y1n_ zEOq66gdH&3;T}F&Rhds8KPb1ie=4-wy{u}*`iOzNRON@v{?G&S-=8i2IH3xiO?cH6 zo7N#TF32x(V$jz(BX!%uFlniE4H6h^;6z!=_9X~mtlof>Py2fp;nUnGa!T4@s&D+{ zb~}E<^M6NC+}UTX$!ewF*mZAz&0N<>n%dZx+W7PE>e-mb9QZUw=VG+bxo2aXlPyDx zT82dBsl(>ML=)jNnNa()S-hxq<_`pteC0`@464v+G3(eo!l; zL+xKhlvi;b8WlcxN524z)XTujbkotX2eHzrp~Dzl6l39#XvM)0rj)|V(YI?H;Kw41>avee7dfmq7T*(lQxTBD%A$Hx@5B?KpuJGF79)EEW7TZMBYbaDQ z70cW=!XOZ&zGT8~WLsypJZu6%PiW>8fRL`X@ZUX@xQh3VkeNMy%49ZQil-&@72i&T zcW1l+cnJF#XjJwOw3cY&#eccPps@pbfwz^I5ifYcfadCab~?mNd|@60n9DP*!Zib( zb(oh67LpRyV7UY%VtM(9aF)tKzYHelF?}8Ol?ZVJTPYhzXy378 z(7l4C>Z8${;qiBWJg0aM&f3c~b6_%e7;~VJ%7Le`qUI{*Pstzr z7oXCust@5Uq(KOn>;Ei`t=lEG%;>#9vhUbE zT;44H<+&=-(X=26>T*3xSS=bkw@x(AG}oyb2Fg6JErf-LoD$;UtqW7Y66|(LoFd2pGR9v4EYav+0^L9+ESM9 zhp$GRd01P2%F~5LcyCteUy}LpL_C|8(}{$bi;nfIWFeVr&6c5!S%|5waNM1PxX?Lb zLFYfI7vr85Cil3}cOEPeell<~Bl~%moSrtY*42RpcC1QVH1*_aoA`=KK@}^9M;&M@ z8?>5N?DM{#m7*k_Ep@W_1IZ?E@e6EKKWM+2n_QrO;}g)x3A4E}eco2^+Tk{y8&0&2q*ZySsOow6o}N;PeoTFI`IZiJlxS}$a@`*PiJpNX zHo#tk@E_W66-GqmCF9fc=7R2s<{P|5JoPN}Jk*hes0tS4XqfCeD@0x+CVmYe&1Lgq z_|;^8Ov{;84x-uI9fl7Lu+(yK==ekw9(uwHfUp93I+VqGE(?zmwyy1BB8H*942*;g z(`Ppyt#uG>TMB0VC*b-IAHwxebsOKq^+`ncKTihl@?{9_o$b~F)=Jg&#oqdL>0gq5 zf8gYP0c(9Y8i02VKfas%$`39sy-DZyN%OjYI=lNe@DJ3GMMgJN;RNr717Ir5i_XRe zRg&@e~Q=VC4bBJ3B z%5<}oeCrRxWhn0tnq^!9;oo&!-!;n{xPfVwr60L|hf2mUPI&)b>c-IM_0Tkj#yNC! zc#{nG^#r8MgwhSW!lq&{AP!C{8M;@04faxcGM+UL@OHjl;yJr_Z+-I?ZWR!nD!R6v zqGLsOQ|t)e;O+tBq2TD30Hk2STE<>7J zSs{`{>m0MPvVx-wX6@*-Bw1m~gyNCN<4%-Hm2{W#xK?;-STeVOih=^JSq$BOU&n`- zJLpcEMBDS1m#MOx6_T99Uu5lvXloW<;rEO;nWdE+wI)NAseN{J33s-iNlLd66*t{Y zqAuCsIb21oV4a*#N$RKueN(fbLIcI~&NS>TzKu{tvZH@G17OhZy8swy7ly3vXUbfX zL#_GDfPU#3s+zFG;!T$h^2djNQ0=rjp+HfL>(WHRgz<6)17x3nTp4gQNQ9?U4{@~& zE51^0&$85DVaXz)JDqj7!?*rb>vqGxf-aCS%J-{IgeqobdKoxp4!dBFs@N?88je#K zm;90KZ5SU6b-C}Y*GqT|&A;pI|4J1;-YVJGS3(caq)@tFpF@|i!8ozqU4jo%8K3I6)!VLTnPS^t*9^wa}2#exMUsHDA@Je0=74%kXo@+ z8N37X8Ar)ZvP+DOmtAMP-VB?b$UdE$)3aZH{oT0A_Ibs24hBiMFC#Og0~#TDebFf$ z%|SAMxwHy&Me)=@2RO-G6kA&#L)h0+$_$2=I5r&)Xh(wKREPw*B0UtS4Pko6J%9_j zw5N}hNq51mv#|%e;nFTJo~pQPwN&EjwX6eC^W1NQxeS*+^BuY0Zgm2(-I0#ST!}EF z5@F|Vo$ITCMNNP>lLWO5l4 zm2Ppz!4=LeF-H0y$#h8^BGiY{8l7Qd=wrYfs70(leh^e>#LjuFgQoetwu`x{C4riM zAOH)h7TOVxw$~M>v1c~O4NX1e)`8P%>YypqL04Ci-XS}Doxu<)uMD;C45 zb%B>sHdq%5`;#^81*aJ4gX}(aZeJSRrIwZ{GhT9a1}<(&)-T^dY4)kB-)sTPc5^{N zD|*UqK=Ud+?;qt%0R~ODQdw>j2gS92q%6g_@0O+9$xh?yR3O_%{o zOL-u;?`)?p;bZ|KSFR=pSE?`<=Cwkbz$h#B1la~*A=ZQ&uQ?iF_YyV@uv1*ofq39i z7l;cW92g<{&SDnV%snpm;Xw<3HXYmxI?4OZ?N6HfbL_VAS)F4KW^;;#uc9_O$0)&c zUP*${OiIPFG`-pU+Y)s&n?lEz<#Z+np8N7uzI=lJnW-GDz5{67CT!-$V7d~P-D7!K z?0)QJBXgetGNX5gvu#{sPl4mv$~Tze>VD^8vNwI83-u2h2qm3vx7$d6I=C)nmCxIUI|!Wh(Mx#qhQj*3xx;-m zC`2Jg|6w$N8%`J?5AI}tL8gOC&ETqc081SOnD+eg6rOYkun6KWQbOfAyv^!Xj32WK zvkavaX7c*8EQL54{V6>^`T{)cAjP5Aoj4YCzzlfuE_l4yiSG_3w00@>BP7OMi87Xx zieoM}8>KCezq0xGLm3(s-6&??g*)pMwo;I4UKgkDB|Tk-PwSw6U(S|~XmuasGFAD@ z9hB?l%KqugwcX2eZQMI6vc7Yk^}czQjx&`%UfaVc+s0k=GMfN!Mc1zF)Q!5cNk^W( zSltyX|MbO1Lq}>=&ZX{@GgVg=^4@d;)Qjukm{q?Ch+t92J;T%Im5|E5UfXIh=f;D| zi(QBOF-ytwRx_G^Joj?W2mqe+?Fif`UpBJBNMFU}m-1}fBNkZKsW{`a7?_4y*Vpca zma{MCtE#vXJkOq!l41}Qr*)I*&c9qY(^=}17qI49hk3TJXE~yEKKhb3xBR{0+pd;I z3|b;bS^n_VG<;qqNi1i&X6Y>!SScP9JNFDkyS96d3)gjjuz+Wqb+H09H!f7pUYT)? zgjAh1u5~56h{o4IEaI^1yST)^HvvF_D;GL@1*gbAZYCq=!tPgey<>D_T@)r9+crA3 z(Xnl-!wx#OlZwrbZQHi3j&0kXdS}fyYkjk3{yeqs+57mOx>ft!^Xvt#{b1`Mx0zTZ z+QS7tcvad4@c>MTQN`5X$Ao`O!V9p*1apsI7KdtRAI)3b` zI^gFckfw8}^0Q$Y(#&W>*4AXS$_N<Tzx=l$!m)=T#1^SE?n94!a-h439`0i|eE+wOw@$c|gljPq7k|A~65uLQa;IUi{oErH$#_T0n%QS7~+ z1CT;!xlh2^@k2|MB!KV7WJ9}o4Yz8d)=&8k3r`#_xg`u#9ee7t3W4TK+aI~MK4PpP z^6_95?VJAo4PXx$@+!ruY0r)pjd?I;U#~Ch#Nnws44jsg2OJ@B9Qfr4dET1QNmV4v zIe=S!unD=GSImei7f)j&(TdqqEe!{a0$y>n_Rt@w`GYI>Y6k*SfF#BKZ`4`)M$;(z zJDj1Rq`ZaL$utS%v^(hC^aD60bv%yR5$^4$#C;H9tTCx@A z1L=_m)i-p<+oiA*CG9Qt=1x&;X+?3se>Sklr27paQs%PTX`$IWK}s;PxGQ5(0q|*x zDVV08J(>d|me~5LDhF;Rb`y`EiGFrN#K%lei+Hp02nyQ}c?B--8Lb|GeA5!n#0(d} z66+hua{C+(wIkqnrz`kEbqB+2!5)7C1B<=NT@s0`uD+yH3H~Y!Magb}>n>)~>|{7& z=??TT0+IO5!;55b^Z477WstWp1^^ppSB%~IyMb>gxtqOjcc5VvLj$R{2kvqp`MXBI zU^H;VA33}cs*vEI7VMyD0Htr=sg>*~_{)#ft}C^B7-8_^7}=!rk0+}DCo|c)bC6^< zoJX9yzXv1|s$3q)0ZXPGv?Tx`fWX#=cXQJ+6k*%&7Mc2KiXG9S@m;ce7(o0(QNk{F z|3PmqnIb)ouW1(4mm6IAoK4OL%vu?~7r8tmt0*N8Q<^L<^@ncGdbA7E1BTrLq_t-R zJ{Nb)Bh0GNi=S0!UX28p{-Np)GY>2BO8`de=jY#R+asD8*-d~a3$cIfk@M>vk{YS5 zpu+8*cQUg8e`{*W%2LZrHo(p&r+awQxfgqTeqgzF>ee4)nUjJaoB~8>dM-QK?3mlf zd6X|BPGo?aPovNM=I{vm$v?R^bw*G*Vy{+Em!{|f6%=+5_KLBw1GNb=|4@vYd zxP^XINUr`%*RgJFVoaImPJ)8U-9Gt?Cn0fqigm%`BxhW>LX+-OEGBzB2{4*}IKmhpYxREq+q%uO z=Gk9{Oz{oRNqg^i1OWJc?ENGz4^U#mvnz%jb*4ljfR%#7W~a@oGD)vE=(=@}dmkTb z3mM{RTB%fRY?snfzsI~Nzg_RQL+`QqXuetRv%~NC_2GK6K46F4 z`BSG7b~z84p*1|T2m`DV{YWJci%wq2Dzb^Pw0X$Vp~hp@7|_+)&1X?(yrD$YsKv&3 zimX$K8v_evvxEQ)n$BqzlHf0#!NH~El)=BX`-{ zwv`mencZ7$(`fOAni+Wht`!N#S&PFP0)b~ds+_kH7~>C$P$RnHGZ3jFl;)+ zZPV1KM7OkUBK`jZI+TJVMl0LA{|AI@M+v8Jv?x2p{{KO-AvE2qvMu`m0%Z2gekr>w zaOi-*bjWrj%d3W?{{tBROJm%eSk`vYgc)h?DCI3{xMQSMJge-ATub1oxXynoWSkWJ zl+HqQo&%}IXAZ)8F@wB8l_z&;o-@JkKO|b0T9JsgA-66V;Y9l{>Bc1%<$tC1+cn46 zM*n94kjVMZWQG&(f5S~7jEHqXALrZu38EzD4TybFSE?u&6pMehC~-gq5OiqQ{*-R} zp%Am6)-BGdh(3Y?e_%j0E-LBzp#@5mTU3F5r;uwjF7+a6L9ObjR>eEx{{Z+!2rDy< zwUC;D7y?*Im!$d;>%jaXg_|T;ZE;LUNV%do;u7(P(WNF4O`yn+Ls($YoCkpGA5Srh zdUPpDKCbdsB{9HSJ_=MoGR^X_p5r!1?BLRm#Gfj^G>AMqtPvf}7A&kFs;ZRKTUYjtAn7AjeoW8< zav&q5bjdGp)-<6Xdy1n_O0$2(Ykq_WO_HE8$&4bQ)%lAdL1>hXO0)0L{@>F z1`e2%YhER35Xzy4H=-d5->M}(BlM7%!KdmnvBaPpBCEV8e9aDwQ;V(T?m|t#f{KsM zT|!Y0V`2~b{$VS}fZM1N?j^s7@Yh($3c;b~&jcb6;E^0^Xj%hfaMYlTlOGW=M57vq z!c!T&MZp3sQy1n@;5cA>Kjz+svj50i0$>inYy(kjU~2FnEC%o>h47b{cUMuaC6i8K zw0;GCG}3GgWzj%2iT#b`970nHIPX*$BhAQfhSL76%DzGpYYq1c@3)71yiDLn6%B?> zTpvf12*>Dh`q}RU>oU6us#TS3EF}dY;Lb-q#bk1_>RnMbs$By5f)$)*#(`Xy8DPCX zbF+ErN0hwLqQcoli+VGK0s<2=oRxgM&^(q(aIMCV+x+G#@jW3M-RQy8wPqq%S{s9S zYuLqf^43Nhbu`1ZX2x*NwPx0E{w5n6v}H>xm-0x>rY3>K#p7m;()QWHDvokSmf|Y) zaz^RmDwlFbqvEQhaz>Bhs-|+FtLKkZQ#rhbO_iq0u97Yt(3=KvLR0CAsF9x6+$W>@ zZ)sc|+v<s!{VIYaUS9wvjhtCHDYS?$rQu6>&6?tpJ*b0(b*#bm6Tf zYi%M0T_Dz*fsc5@b*$q{m}Z;Xxc|i1|3p}FU>1h>Lb8?SCQCP<*^AzPIToFPqFBOz zW<#z(G5M7-97b-l|6pByim;WEVm`zVe!3`ZO!r{Za0D%Wl)pAg${sD_Dnh0sz*BMs z8W3pA5NjzMcNO8?5#X#T2So!%Cz!X6S#pKenx&yRVVa^Oc1_-o>e$sR7Rs16WL}3; zC`8Y9il#xDL>CoxB0|b@{EOBJ9L7X`+ z#Dx{Myhz{DC=^^&lUn)&9B9#?{iQW{-^p?7o`nU*eyoIS;CI{V=^rMe_pI#8AOBoq zC-`i~bW$g(ZOT0Ve%WX)?z6^(*Vk&5FOCIw9=ljlv{00e1VaZ8o`%P4CNro4eC`~@ zKHzuf>W8Wo<;2AvpT_!8=XTx>cEeWCL}1ZTb;YQ)M1<@+%BR$aQ{V={%Di#|o zFIEc=d)p|{3lD25c(r+bD}1&2gB={UR>#p)L&JfKgo@aQwa{JMSTu$4qkQeCq~_H| zT1!~$GK?HmdC}N0%mQZ5F|3pjP}e45fNtH1h>9pYiHO=nb`=scy5krS)-(X%fIzKCzd%66 z2h&823vVI|S;B%B7UR?7MZb}W&xC*!8*GcFeA8iFlW_LYWs72cZ&tzyf3PWH#yeeC zF=`L#UJ8wIi0;M;i;0!oAl_L1VO%Q`VYZ2bEj41ir`PKm8SVl~#UOzRVN5BnoM}86 zM6E(Udg<+Tuc`a-P^ z)8g#ML_J3q4iBTzgOL#MSMd>)jTg3Sj&>*bWI_#b=p`9rZx0Pp&+dk@i07oSg9~AWWIbNoSmk*NwPElsQ??= zhA_{ad{%8StlcAUm9pS6o&~sAW*{4b8Ja+$Vla(}(0C(rlHC?v72H<324sx^ep`sU z<3h9Jiocea3;?apNUV?w72nnpe)%#Clq8>qOKfOZq8vvQPfdX%o7MvDw3b|#DFdyg z)+T8_X4P{gT?snfwj6x1dDCw<0xj=%XDxA3zvTO3 zt{C~^Do^QUHaEt^dcftGSQ%GldZ1$%_3sYBD%v+G9Y9=t{7Q9p+)|Gb*DqJIBZ%s~f z9Bp1}?giMNvNEJy79xVTLaeq=JW7VGkWjwsXQSLAcG{daUaixZOTzdGSj=_;l zwNpq4v0Xc?L|7Vpm;Ho>?La3n0!!btJ=$kD;w&KVYQKq!HiA#z)V}D8=!nCY zxp#;J@{rha)VIJ88@OjM4V{UiV`5Eys3IS>ZxHR{wDfJAjM-e*`9&G`Ci3)_Y&d{e zDx8q9_WL2WC3k<~#G(7G=Fd~yIHs9@4A57Fq=`6Zv3mjObg={QmNJQfBrvN?581Gx z&w0ojlD{E{grjGisasS+EDgkG_rS8bJA@S2 zvx7)ODwrsomW;LF{bB_#-H}uydH8kzaVz9@dZZ{rNC*i%<-N&qpJ6%o84#)Vat#9w(s81C%2$5HnO~{dcUaiSZo4DcQ~fN7*{*yA zx(3`W`%YsXhnV`DRaq*FH?2FEK_$Bf(DrcL&~~}VWTE+_xyz-8GJvok#QpN{wo%iX zeqAcikpoWfW(L>>413UqftK-xH0HnbLHs)zUv2%l zTDOBs+E^vx-f1AoW!`HD}Psrxhw_=$}-O6hp23k_hzxvgZ}LK(VS2UB>9 zlDLjrI&wxL_jHfspg2!I^Yg+|LfLZF(+;~{9^h$Jvy}h3%_BPAt_<=*W;k|vHtB__ zQMqmv-^%wJeG35HobiIqp{3Ev_>c?^z$lJbyq?vh!wX%=kCJ-iF7N9>u*wnX#YW$a zyHXQL*K1XZ@CJ--lx(eF{vFEJnzX~v89kzE*}Zyf=NIw#exguUG0*^wV;B2VpZTV&n zEXqv+!&DHpjSaNyAo4i!zA)eAJu}nU6UZd$$shl$-2n)F)N(+-)<2eD@ez@-K*UpS z3(Kfb8}p&lgoF7@GL0lR!(Lq^#9*E~mLGS=PbSQKz4YM{`@1f&ZTZj8{Uzf|a~R2^ z0Z>C5d)dFaa|D?4%LavcJ=?;0B+~T4ydJ0xq8c4%j~pS3?wEQC)_`2Q*=#qZ@DAt& z9U}h?E(RR3+|c9IO{i;GdB2hV4Yhmlc{P?HKD$AK{1$L5b3Gm-++%`4K6S1w87y%g zigpiD_Y@kJJrC;OY(K-tF+?Xa&Gm=^lgV+r zYSDTGmNx3Y`XcP}ZvXaFDfK+}emLaJs+DN-iVs-wY{C=pZVI%xaqIr)%>s&wLxOcO-U-c&!aorySj67Qk}g(TP*z5D7Q)Hr(7kh#~YB%Ff;% zQK8dOg3d>+o!|DtE`J)o<{@cTjZbt+Oka~7888u0CL`|hPS5H?)lFlQ(R9_Tc8UOv z^G<+J6?Z(y%m4(K-+e}e=qX3FQpYirp7=Y5(wDWaY8^Z02Ph0CGTc}cB+m$3c*ShC zveo)I_JDbEHIwhV2acoegQI-kdu{IK#bM%N2KgTFM1X6#1FG+#+wSR`Z+)~Tw?cn< zJpfG&8vO?QhA_vuDrro>P*xf~HimjLSp&dV3jmxiynQ`|*KkWFJh*qextjWRR<@v@ z+qffjxjjQn>{mOQ+1~CPR|Z{O04^qwVy3S`1%{9dp0$>4RWN&S`~LaBN-FT5r4@8d8I`3hlQ&3$(Asx#!8r)Lqldt z+(%}kn+CBI$rwhjra7C-QiAk1`U3zFFTF&!kB9`NgbC2~_%)Fgebg_1_{JHv%+=bB z@02TTUs>56QtKY`rl7rerD#BsU>k=Ymbdw=Vl?N2xhYKJ*y4s9{ zhDck69gf0Eb7LP-0`)}L>A0gey|T3bCbU{BPA+JoJYY7~>@g@jmA+T<#JjAHmIRMP z%r+9FF+(}!OqZ^$ZY$1K;fcw$P+?)l$_+ji8h{<>fx(L_m%p;R^CKb)Q6YcD+a6~q z0_P{Fjy)m$GiBLzmKmFep%y@L6D{~$ZfW|}H2s|@S|9D+Jow|$;fSRrtIxw(OSpmQ zAHCEd_-54#wiG3!ceFqVq5m3WS(Dn)}gX}B!utnp=Hm~KWq^6zT07SqJr`JL+$hS0;ATl5G2npUGPW#bQ7|7PiHdz)NS4l!L={; z$f>+QcN`~8T|dr~SqT8q64S;2&tftSCzuzBL8+p?st;O%yH)J^L~k2(mDGUEC`6Z< z5M6`;)_egxT+%aDYZF|wr~9iRPuK&RJ1vr6Q@In(_A|uubB?mItohwUy;8Giy3Wom zsXlE0!e4QCFJg<6?I!RBw=2K%CW2m{6ro1Ma0(Qd=Y_1Rk{keMidd8c8a!El{Q2Qu z2@|`8%&K|M&6msN^Jwy7k&+2VO>>jBbFL$7hZ5e|MQy-$f&Zc4Rn4`-gvi1a?qoD% zp+w6{1&%$Pr+U!#RBrR18qdByx6WTj85ksqduClZ@a}OYa$_>WQ2okbA`&_ji|pr% zduLuo!~8@AL3n`OalRX8fzdj%u4;@nJE-d)P_^dQ|5Ds()5j>mKJDfz7E#_V%_m4P zmVP~4JO-MXEEcp(oYydP6U?1MyXVrE8tQL{HrZ6?^|rX8b@$t53>ow3wl3-Tz-!ezy?T5_CWyx_=D4HngvbcR`Au$6M?GS65zy>iL+d23E=PpQk;}jz4}c2HxH;J;Dh_ zvEepGu@HbUDL;n8gMsGPipt&S&AU>WnidVSz5U9zxWtThv4~9&eD5HhA+ZV-O5vq; zjnxRcuLqT=NMX7+J#D78vzi_(%J5;*neY4adQ4bSjBMixYfm}-zo-U>`-6=EbuE^G z!pV_Zp=PTpe=?Luv43;oWT*D3zoKxpe<0*PalHbRJ$Nb1_Huhyl>61 z;IB||&Mse{VyM#eR`}BE zSttzXBNZzYzO@#okg=d!$gT9e!HG54RNDpp9n>}4b-N+Aeu0{-ji>?dcB4Y|7QuGt zJaImjKAz)okN*4EP7BWIN0upuhL9Za9oc)>Uj8H8sIDZpV=4jtlZAZE2r22{SLM9F zj~ir}s{{dhEn=DlKezakes1D;NY)naJMCKl@X3O^qARV!uC604k~j-wsXd-;T|#L8 zAs~R-x;!8#7$WG}D+k~2x@7iGJ32hX2EJod!Yr>#JoD~JdZ3J8q1u>s2648mzNgQ+THd5(Id#B^g8wLFQEDcLS*vPtEF;IJnGW)m$#}%zgVfe3CDG zC7C$)Hsc(QZNpi}1j&2$DlZ0K!vW^t2mxNifK zj4mOL@3JzXiEdEauy=#?|7biuY;~an4y<>H6!keK4OPhZqE{mw)1w^Zs$^)73Vbr3 zc)h*?YRi}{wU7#^zWfl}Asu z7_-#<@-~k{F4_V_-6mmMj_=WcPiLwnSQ_1OFrAOJOD>2-tjdTlip2*ZhVxMgA8}DqvjO zmW5?qNA%m#JfdN9<8O?|D@!is7dISAUNt+KCw?C83^(+Pm(JN$- zz#K~824&W(=T?6^H~QJJZ1B~!n$|*S)fM!9nCnd#1s|ioI4lN>G1`=r0o-mOGU2Wc zI*~9^iQceb?(Wf%zgg4eyE1O1j`N1j(Y!1mu-%D>$~v$F zzyqIl;sgXlnRY6E#te+;;XrLX^<9<*#}1Lq)f%VDx^If&Rv;4@Iyi)~-K2@$JAL~E z!TUfQVSl|Bl>i_|Oj{`%0q-1F=XHyMFV7=ek#_cZQrTqu-{^LyG)!Id$9c!!(-VUC z-hjK8=daJUlAfC<-+ zuZu$}B0-ndU|jex7oxZQ9yUp}T)**9(qAvnJzj5Cp=5Cix3b@#LjYJze1n9RI#7-q z1yB82CjY1x>Dm6TXA~3mM)ctQv@ao!d>u*K9g@ZdqZi3iId^J1t&SAjJ!1J2NA?1k ziG$ol3D+>9V>T8^K$5*b{kIaXYPbcleheyqFt&EFws3Ko9!<`?v48`+Yc7F*Duy3| z2!tb164Cy&9H~f5@-00x0vL#htRcaU*y$}jza(NO5p;&*18CJPl0JJjcxAP~r;(IQ zy?$_EYso4z!<@1mD{jurE&&JbPx!!*BX|b|S=dP-HnZP>fGvNvpBV)G{`RTTsF0mg z-M0`KZtyw9qV7;nFc3kNApj;j+NWnA{^k zwpD*eo{nk~0uX``unsIImwtv*{;@<2+;Kk0ggxn%KLGVsT2C2Sz3~xd2jQjSY}G!< z2LZ{E$8Qw(oh)aqcH{oyB?#le{jzvmOPR?}Ye;0beF{BkU$F%ju?%K7r50(4d;Y13ZiPzQ#HF{%PI9r0_ZAwg?VI zqI1E~Z((b`x6w;jL_}V`NN{o*08D)Rn6_4Zp(X-(BHr`a`bJo;LcVWBzW3Y4BJ|1# zky$Vx(TK5sOkwc08>$Shf#2lt?S}Yrra5c?V>V-H$}Mjt6BO@S0x`(!9cjn@n69`D z{z>$955O5hsseTYxrY%d!a0I^K>_#YSnhgiDeD?xYpLHH%b}CQvv!n*{o2IBjj)f& z7{Pb9s^ZyI^ zGQ!VuZcrcw)$fioPDh2lEq+BcjH6o0(HPgy|$Qb&EhA2n|I!c9^< zWQT?BUEALw38$Z$a>~FsH?|AS>XJ9du+Lb>ur7Fa8eTn7>)wq;S8W_Qri>EfTwf`) z8~~cjK|`7FJ^_<`FRJc@cTiWiXg(!R_wtz{P%dO*9EwU|#A+`JrBjd{RCjEINB=!& zh_o!2I0PRxIe3S|JnKLdqp+|#(~T74m{^YxyFV@9%B*uC-ASJ}Ky`XB+A;XZI-GWj zR?u&Al^OV@1QKw~V;m)fUGT~qgDuB?0k|3MHF~KCm`NG={#D0uWxV`3n$(vbx9Qf_)VdSZznNMGI?x%nKwqHv#)^UF-ZPF%`; ze!xJ;eK#BuI1vVcKnAf~pOI99LZ7k{1l?GOnwouLh)2avt3;pCz=t6m5+FfQusUEs z`T7%+pqptMXbho6YUphN8H#va0Bl=*1`T&q2EZLMbb#dq)7nk7Y$tbn8lQ&S8`hv~ z2PU9dIdYa;(|)D+37nR@oeq;g8V;jRx6 zj0qT6^$iXf7_tR65oVd1JLp3l4yodp2Qu`~5i%5ADjwjPFa82f!wqp1jX@A2F@cxG z0f%%PU-SYrnGoLL!_ukR8I9Z9#3X1l9jVIR*O+mrIBs2Z+Bo}Z`$*8@8KcYp|4Qzu z&ffoYA!un)x3#O-*wSe0s&e$wJ$z~&zqCnOU#I<_3c&wO^PRg++cCqWh+Le2U&cWm zjv>dzI9*#8>S!FGnb~9&`G7~s-$hCXy=5*snTSv6bPPo>JsCYbzAOo|mqtanSx?sCPB)x_RfS2ho3P5hc$6~z< z5hmry;kXP5ShnK&w+0Op8rSA?$}aI zy*3A?w4)1H&-aGQ@y7M~6VFIvHf%1rBF4nnwJpqRa=_EZEd<|Or>K}Gd4t1exT`G$ z4}6WCMg>P9v$zJict_41?H4aKrG>qZ0HWP3{K_@V--uO^f|=qU9*>yTSU3Zl`0QMRKlZ{xE!JU&^X%QkgDXQM4?R13|{2HZqY5y-vS0#`7f z_+u1Q=#WWYmZX5MREoRld$f6f1Q&kEEdA&lko9fNU!rW;Fk~dPC+Btw_4FNugBHNw z58S`>x&b*RIgCIWQuYhJg_ix-ZUkGfa6d$`1@kDea}2-OYCG*{xI5ARG+2_XpUh$y z;O_^xkq!65^Y%KtRbrKaJIp7K1OMbaa=}1X`2$f!hq6dw_&cXx0gi}aMAA=MI01#q z3=QbuN(|c~?EjMop6A{PNh&K_&5#$rVuI)ufW*Mwk_|FOo^EyaI{pv!Um6P}fm{Up zUmEbpv>!4wcq%X=!`nloY_+{C$7pJIjRe#H8T5d|jHxIyIU()Ledpk4QyMiwEL9}; z7wptbrk~nv)C_dEMVRB3%+%V(X(cAJ02bJxd<-=L;lX7#{~&6lgS;}*o>1yF=6*O> z@+A>4yxJf=cDeu&X>l#;GK47OIqo`yn8Q8J#2-S5Y5`Kzr$T-m<|qn1S0%no!zBfP z*U#%b3hs_wkL`NH%ystVCOhhhq210Ityi6RZl3GNpq=RHcVqun^sMKyo}^=+?+3KH zkll%h{xq>lE$JV{@(sUJHi~}|Jh!cJ2wpApza~v&a9^o<`fixpzYWhQ(OIX9A*JR3z4HG0U7_&jA0KWl#gB)>lmIj1H@eA>kSsL>6wK7x<<|+^pT0ki_z1*I4NbhXDt5$U zj`)PEuR7%H0)`xNaw^5aOkFq3bEjh7@6upKe9n}BnL|{0t|k!txCE~5*+v1mRyX?s zCd$4W*y7F`*jgI9t%}}cf>&&hv+eucKQh$*B9^&tXyTb!pLjRy3)Gw#e6`N3$a!ys znr~{Zvg6Z5z=@CexD#uQ_*C0kAHRwwau8=Oy)d;>t;IbmObOD0Ojoe-bk*<*TqUqDqPIVyt_IG9^>yjKm8 z6fBj%zV_py+us*3ecTu5`SW+TC4U(>lJG^DkiHwsSEpKqXRS;rL5`ml^ZgDvfV?v(&MA=_;MC9x z>^bCU_nTqjjNa`FEYl1hV8p!tQv;44q9$;9Ez;;{**i~KXOf>zS`|l$V%{suSrdM_ z04F9@eZAokcw9#!B((_^U&Xc)3mbr4&VWto??0(MRhHtmCFb z4okCD%zMC!fdt?N=-ts|Z?l_n$dT9G9hc<3nxLWKy<$t!cilMF+#@)`J3Hc>@)=W} zbI9o%k9|k50=9aH)+W75)++Yh+GKye;KzB)yIh)XYLEQ}wkz=VVDcm538f`?{%KcX zQF+&@hzgue1mqE)I;eM_n0GZr;60%DdwacDJN~23D%KeSBroJNqCWdiJs)7D{T@V)?9d&GXXr*g+FQq1WRHP@Q#@MJ|2 ze)Z#2B7X73i_kctcIT%RHP_Owl_h2ZVT|cS{D{Nh$>E#44GY%V%8iwk#P}9Y$~?YBZ3NT z%AF*2Z~ae#(T)Y1Xi|2?8!I3EPrLwXuFiY_kjFKeo|~bSd7uh{36H1BQ2UiqZPL*+Y7# zveDG_P_BvL9x)N0tGo7>(L`mp8ZDPMUAIn~k!EQAdCBrRD|RA&RyB&DsxIItz|mwM zeqH27M%T;*a2b60+-%BO-5%~}BC31z!I*VT%HAo}mS@VLVGFaWxys60ZDTlL-BqPw zyOLCkQ%-!;?@IS7pM(#o3oL0sdwqC3+O5%)k&cVA#gvhjtGdBdzhVOg5hDqoGI=DS zYdE>BbOWW5^)SR(xGgVY3!vWSz@~c?o4cW9GeJPdwY0)&;AXV$at`cgIiqz(-`)GK z6<|4V&6AvI6-?HVESQP-M-rAr4EJ}zHtKZ}Z4O-w_ebN=rn*NN)LcYNH>}q;K57JD z)4XNe0_C5>-!-%``l{sh&cD3Ie920=FDz(Uwzcy1V3wO|8n#CPY6SRec0uQB8V1h4 z){%$=QWbd;ifwcETFX8qq=y`;J|(n=l$*EhbDU+L@T>P~eLG#<4{4FG@dA+B^@ir^ zWv|p}k$fW52|`@rBL?_LHp{s+%D55!*s2o{>kS#D{|oq(IM#WOu2d@AWBz(EQX>F9 zPLWIYZuYz2Fhhv}ua%wEUHU`2a0|MaBTY~E#NtDBX`jO!v@v@wm-&kAz$6OH5wjEyjK2C@#BZPT zRDG1V3TD!@!wA(b+hP{q>1pvC7&f0b&c1f!FH-5MyYh^=EC)7b-K3ko?-#stXa*8;m4w4|Y5$$P0D`Rd?F zmsy`gT2>k{ZT~@cB~Q!X*{3eXA1qmr{3a82LQ|NRfWN0+E%8Sk<R->ZlaC*$D(D0&i|JwrBPc_D$XWfl1L;LfqIHk#Ig%E zP6vGIDVK_@uW{8OR`?G(KPxwv7f#;r>_un|L)03`qKwF@2Kb-x<^D``mQxxt*3nheu9!*gdQVgc3w{QWqRzs<1P(FIcu)CTzb%wbJ)62E3G3J|j}iY}4( z*0ls0l{IVDa6+#J(Vd&uV5G!gH#2B#pFCNvK7bMaT2e=XT2>ZwH zj0lca%0v&;I({|hEwx(=EPzy0-?^|L4J0uR@4l#-=Lh^k7(*?HxyHHx7$+mZZQ5dq zOmHs$G7d1@DiGx_dc+GH6qTRNdRw#VV^{k;b2F+f)p_fp5AtA6rE(!jgY@$8UJ80V z*DgKXa$NAGgQw_rk$aCuvGmJdb9wAZ3C43VY_q}k@+gfA1+f9?LOE**B>VQI3cA6A z$V8}Uf#nX7o`d;2$iD&xK*fg^677DLI!k3dhIbK~3fw`Bv4zEvT(@UN_4hFK3)@u$ z%Xc%RDtto`LnIA@MG%(Lh575|5jVOoY#a;SAT1|0gEa}uGe*NhDjjOLg%{2Pala(A zq|I!H7?cGG6xaR}2mceLwn$T3B*2jSIywHj!yHw`kBS1A?V^7Z1$bDIKcGzNf|r>C zbtqm~K(X!Fn^X9jzaR|aHlwp030?#Br_-%dB_T2xmPF<3HD1Nbf2WDent=8>QG4@%%JzcH{`G8T3nbw-%r+l zr1;f)Jz)uh*`lcQse1~5=id3AfZv6v)v^$yNC^l*Z%~3@UKH1WTSL^9Q}Ig?z4W+p zZprPq2i=2*$p*G4sR&Q5p0mF-4a5gugWFjS03JS&dAL`s-0+&Xh`P5eovYpb_74Xz zH}EyUu`_~o?n1+Db(F>3wi@a;FS-gVy}3>g5Ah#c`2>USlm^S$hC+)9e64j98K|Q~cYOqiCh~WO!Io*B?v&vVv8W6|9e)pO7mPuKwJkY--H#V5n+M z1_bmyN|>BUev%pn;GZeI&}7Pp$UfL;h$hD^|D^~n7Xdq`vnCgitJ=uhu`m_be)Dwn zAji7J>ekrR#MojfY4Ea(6}{Uk<;*5qcpXbPRnp0QMSuCdrTdREOgFhPWI^LF?Ru)Z zd7DvT`2N>Fzn7iE3Lo`O4x-FxeLJ6cM!@_xL9G6^tb>MwGkf|XN~>N}H!n|sn^G*F z|C^%&7^en(|2`t7FbR`!ywYz0Ek5f@jwc7WdJb`SgsRs)Xm?j@&a1_iXS|*nw7*Db zmIJ~*#J2I*EZ;D@bAhX07Ut&fm-gn&&)Kmuj|dZw2rbVelFt%>eTF(XA6KtKAAkd* z5t5w^FS=UAyh82{oL}09r$XDM7MZbE@>b^S@3I_)>+cJFCueXB0-;o^Uh8&K9v8_+ z=x1%_Y}9kge2gCH+1sKy0*7t>*z13`y0+Jb(Lhr=;WZMX6%R$4*YaW9Bm^?1<|k$# zed!6;o1B^7FpM?3bZe%dXoU6Y^%yn)(fML%aEMq~6Yz-h6|Z17IJUUWF(8IkAEr7PU956nf#r_gW=OLOBozLW z8`S$91(La-m5cY#kA8tPxBy7dh92Vb%*Ejvs92GGmZTsZmK+HZ6V#pSD-L|O5pG@i z*yHu}*`p%CcR5>e_LG}5Oh1RF%L8sAzU3X+sm0{??yjCGVQiBWFh*_NjPHu!n;^ZnGq?WzI`sZYbF^g!IkLZul! zt!!YpB--KHZ}LBCxk9ZHwBmOR1-MHFPXyaMbwKVbYuPf8wT?*h!BIHKlb(`i?TJWInm5|!96(w(l!+rjS~rk+ zI7rmYQIovfQ%JOb6_B|h`;WFSpowF=VWC#yo6ve_ZsUnaybb_MjynW1sXlJvyF!{;)lXm~EA?5V*U{L`Kx1rq6G($E&T=U*W z>nu9-V!;AB72x0Lzb>~QQ*@&BW+*3JpIq-GmwCwWxH9{XhXcLhbTccMG-}_Qmv{8% zdrqLfw2b=Zx(DVdlGKVM*Kf^KmjI#5AONG|&ktsA{(u(;g7BWag){q;@dwklh|ht3 z9Z=&a@U-VxH$xW}w-4scj+`sSO2v_N&An*q3A=UedVtoEE(T340=Soc@?QT$fhI~B z%cCSO@4M(byFYmts1TOf4A-U4dHR;BZS9uH6w_n&c5}mlOV`YVz7};G?^n}6GsWlc zfi#2=m}@7s&{wR!GH#_S@pwnz>fzs22w>}&0aCpVWrk6ciSW^*?RAo*;^=Vr8jwtp z6mVJ30iq(`sV>l|dx!5{=ykp`54($U%`(YGTTnj(zG~4VMd3Y$k*AH@8O^*tKRi*Ust^8ayVMDI%$+F+{UHu6~Vw@}r z0|1fs!=Q+Vz-_-8wUxF}UO=zID8YviLSsOI-2V|TI*+__!?wa?^nDi_o$A2?*#1dn zrw%E@&$|Wl99$}^VWx3ZmOwRg$XiY98sYmpE3&ID+sHrhakb8M^oA!>ev-O`+sz9% zZGHLjpsyZ{OV-r~QLc<|SO<<%w^D9U8i1ZAi`O<0Ki7KH!4!pH^?MRQIP%IT(i^pc zSTLu~{Hnp*bVoY|v^vh;L^Nq!lfIWF(YB4VB+JMGy`y24@~Y6r7JGe=6>AM*ouP3I zY~IX)sWpE(%1?)-p$!BqcSI%@}yr+)_${_-K+~?2AQ?ZE7uCKmUBv<1hD6iY$jZjWwoyGWvB? zF0w&+N$`!d?>b09rfM&5rSNR-0=8Z0g&nQ^@g1k2CyF6q3lAx{-78q5@I4YTI1+d9 z_PHM8bCsQB`UyC)AI4-qj>vu%k$vXK9?GGZ?0f0fE4oo;62m&b#I<7?y4C~?>HquAUkpoP&Z#=c zsW4>=*Nq>Tn&|Ql=|MlBy;sB0;2GkB^14eXWK~Og29HUTJmxeI&N}Z-e@5ihdQbem z*SNr7%b+p@xi*qb_Ab6hEYsyoCr$;*7Gw$CKJBe_|2U`}bYUFm?t`K5oxCom`(SSD z?FNkg9BTIlXnT5%MMBPxE{11+^WFJ_K@%#Hd8TCO775>DuQiVPjoq#F{L|oihQ$pA zhZ#~#t~pr-wl6o*BJniF4Tvy}USkBNS8we+nEGAO@ksSUszK)U-2z=+^ z!!1ezi{nk5ccyXmgaQ-X;@Ccr8k3#74u=NB*nt>w*P+z52ZTDPRf6+f! z6^3NwxJGhI24zG>P`D+3!!mL_A-RQtaT-4MWZaP{oAC#&?2Y$ldoXWqg9&v8b$m*F zvtuq`$0W7r+OF(s(HKFC9Sw(Fdn|NNxZJ|}a@;%dY#rp-+HqWUao6ql#nkVOL|{W^ zPtq?1_7P;P6a~~v{-<`-1;Pc^aIfN8hIle?sywi zil2ukjUIk>P8uWpJc1$?fJ>J?pXd!yN@JEVg;z2R3{dY&!j6L|S!pQG#p{_vlu zheMT2|C(1>Gjbt+&m&lu-8R{arR|6?@z%}CwqWd9*>N8+}TD&>98Zbfwdj!ThuC-uF zwG!H)hr8tk+aQ{x;LehQEs#}G@X^wOqqN}TB?Wgtnn}UdrXRI?1_>L={P2i9^LTcW zl(R-1ZSlU4SJGl@*S^)vE^L)|0mKwljU9Tv3)r2PP8z?4u^#GIVv2!iGC|q0EiRp% z^V|?^E6wSDm!!}4hgf-%QteiO{Pga!R?gB^+U+9w7D(`G1eojj*5(p2*aqK8OSYDl zyv*16=rMchc}DW-bmwc$hwj@!jBk8zHj&+SbGxw}mB2Wfu#9PI4weiTmcXGYP?z-+ z1#eZpj*uoEXTqQ&6=mfrttw+Uf4j{o{O~INufXId;tfm95 z!~?Fw1FpgYuE7JYz=Pu_{L_-sEh*W;s*Ar{@^>2_@sf{e3(I$71)p5$vYK?LB@MTB z;Or!SB-+wf%04afo1f~(-`1z~kH5vQ7$P(CC6c}N6zYcUox^Dpkt0ubryZU@+&skg`N7(> ziG=)aZLTAVVpr~NA2!|Xhpk#uZ#Q`xyKcyT#=4a6@3*&a(+jPg+=a)t;j}Ph^f7ab zz+GcNVPGj0Rh~)YQUP5&KR=G`{`9DJG3G3qK?OdjWd*dm*AGp0o#AN&N z_QMDGZl)*jOsKcphznfha6a_T46YG>sA04GHWF$vt+Na50XIN1*4v0Iu-MY0?!64V zhtB+u@RNKDPHnBub4><1jE3)M0-v?+C>lM4!C)79dyCiw{U!gxFXM#l;GrHM`bK}H zr0F9>pvRUF3I0<(gdbV2<3#7Vi+lz>(+rHe+gVv#izakV!Q=LJIQzo|c11^j48zoG zwbj+6SnDKzrCqqPRk#9%n7i_@a0PrWcjXb9--8<`ZTfRCpv$%Hp(CDo1M#~%53%U) z<_YU5L3G?0m_`T`<34Cd1m;{FJF;R6iG8ax!;l=D1$zc9(kvx~nSAamagS>?=iAJ} zQc+j6H+X(^H7*OCGsWD!8VjO-9ux@6mROa*Kh|`k256t`lKVF9lJVx9xNzwa8m|+6MU%QJ25LRL*Ha#78N7o1)emUmOwBK1-G2<9W3*+x} zTI0dhoc&p&qj0ycEYE3`oGbMQLM}vNPTsxMG0&(d#(|nKQ26}zwt7N;6%7yWC7A%cGmMK5_0`8?tKbo4D_PU*Fb+4b@z*(%kR7ta6E})28n~U8g z-&eU3b;)&s7Qb#ks9H>^t9Nzm4hOqoA>2lCD-?jx0!v+Q{t8@wWmW78w|8xl%#0XViF0mZ?9=1|ZWw@u!)MW# z=zy@hs2-7!Y|@sGhs;T}znGLTKfeapIEPyPb%)s);@@O{m~A+t`(0{wr}4-=8!ZMu zbnyqnCl}t$F9uUybr)WBFNdS+;+3Ree&~_~SYTo(;Lv@~3p=*0wh5dME|12DlCvh< z`483IWy1zxWm$Vk#r@y?!B^V<0mr|*LWrGloqTCAQCPh)e|F4!uNHs$Q*;WLn$f_{ zzk_*W(LEo3{3CpmCcmgF>1(~bn!tYoBBn+W|H7JXZ`XlC8&&rz1NN!}e12O+UZhZ8 zGnxJy_ifJAYXsaH8+Y$QJr&tDr|=hlQLja9z@WNB?o$~!LuuVb?$JpE{@tS3aLOR% z5^uYgG&hDN1s*D*oZ3ZT41XKYTHzRf8*B-O{JGnIs}h(7$_aiu!^5#yfoxF%MCgnY z&N##LhOj3KHiYSXID&)0OAdr6Hp5OQcMBGCxHY_k{D9B;pxIho{hST^71>g0FBx8j z519MVvmu(}py7OM7dvg)ugA98?bDc=fh05iH)KCP>%Lg5Vpkos5!Lwsvwi zrvx;Ap2O#EI=phsAX+c-%;3xyhNoLh)HXP-3gd-Qt75F-Sa1CCvaH9{6{d!TUn&b-iwG2n(#90~G-2Ype0^4*W;&z@y|(oD}=Hfb8;td5nJ-K(`R zHq{M8BH{ZZs#bh=IL2M*AXy|lDr^uNxXnBK<9Ens_z<2UhV#=h10AHvdDtIMn?v*C zrozPRb=b>}F(Ga~Ro#H!}fl%SHmQ8j-cD2gCQdz?P+{Ti5MMigk$}G zFZ>(KrvV_(<39L`_6x52vHF99TBiKajlXkFXhkj|Z3%gq36jLoHcFyZ5Wvx~Gi65H$Cjqebq+q<~oCoonnGV6rd9+KHN z+Yj6j$kzkyF$Z>a)j1JGpVEzPGeoj7-OCW_ew_dqt4*8ydi)tc0sTrN>$NL=a8 zpb(T1_?G6ewTuQIYd4sUU*J^%2;Ujo8e;SQep-X&A-@{IVyd)k4#=MT5xD*>6x~ZG z`Xx2&B?KMo8QolYx(iMc5Q2bzscEhfNp+QGWt{17VHCLu#tG(e9c~j#2Mane8z9#f z$B7oI{5bXeIBn*~$?drj=R$o27+5QlPs>yf~Murt4OpbKrv5q4`0 zSPlL3uI#JUMhI`ludPv0WeDt$OMS?P`rsD;Ut{nWD#*p{_GupX;$7H(y1?Jx?^r@H{gv2=o)O?-r?Xyso;Gc`yr7Lf` zlL;5ryaptCTm?ZNX&i{KOeK;!2)bp?I|$xjTGxAM)H@_WV4T(<>EVsNUdOZT=xxn1 z5jju!%4t5Z5dAsq2I^#g%i##I00p5zBpb}a(wB(n66LtCIr$bY=2%LHqN_r@9mo{+ zZP$64{A9UIN4Eh4lG@!xS20dr!&IjJP5WxWabd(t9nL=1a$oi!Sj?7?4ZPl4C(#AJ zI~8|zp~q;3(-=}&2$#jv3@B#kc7o>6<1QW1^xSKM=c3!pe|p7#_M)g6M7mqBY}DzX zQS}w-*XksEIxu+#=uj*=-Tf9o*badbvfJI?+IqC}Y1l9|fREwNN{WeqjzXuWS^l<= z!vL+9v=FN^%kF=#dwX|pygt{_^cXv8ki;-sEr^bW&*55s^#>i`%I12jg$2;A9u45K z09J_I?6PRL8ad5YqoAQedtS-J%BhxkeD>h`J?&!tzJr%AFVALVNw3Fe8O|v8 z@kbqcet5$~J3Z2oUHJp`QF7`U>knsweTX_h7o?lB?g)ubdY_cPR>=upQvOBbCd=AY z$1SULWRXqY_b*=kEZvcdTmrY;nWDuts<5MfLM3T+Ujj{zB8MCz&Byqh9_={e0)wCF z;BwHNEv7u4T?38(GJ034C<$|2J!xEV{3w@kK%Ar(-a7Doye?yDpcs|67|z~g<4h2x z+5||#dOgp0ll(_cem_QPsJ`6L`=9ZCHUp{_2hh4u zUliyASAseS6EW_;GLrb<-Z1KJ{#Md!KO}M3&g(u%Z#cj9k6={us6;uL3%xCCDr#UI z(kV7&3~__ZM;&dxG%hpHD>i(Dr{y(&X#!TY5r=U0V=?;JOHD3@#VpKjopokn=LNxf z)TplK3vJHF6Dx4K1rsL@n?^a#nUkNM`|4l!ArWYl7YxfpLx<)^PhXEokDZ?E*P!kh zoDeB+l8md;X2ij!`VL}eVfqQ3nXPhkj1cPci|!_++;W#3Rj{6;0-z5G`Lf06gCIM>) zkHbSuoEMc3TT55J>z~N-tKGwYZc}{sU@Q%Fh>#)C!fuwz+ztk@10Q6d@O<}dpbuyr zg9A49=n#1$_`5sUZ))odW75NWy&#r01bz-L74r1wND`5C9D=hctf@cbCoez1oL}tE|{67>m==!^vm@o*m&Z9hTTic3@}n8 zga*x_GKA&ddEunp2Twqy^m|+S{x!IO9#)^fe!PlC=7faOTIDjh}z;_=$ zy!-k9E^Ed4~Cc_5S3;Xu6&^ms*L&{yns>y5f(HGPM1P|Rg>4Hj8&H+CM;VL zz>pP>fU7BkZJR9^-(c8*xQq@!la!M&=we#-Jmvq~^L154d6pg#$D3}C661TQ(5Iq& za>#LFot=!jb2NLYe(y{dsN$YGAK6AIuJI4UacPa>QybN&Erc48AwY{1D>bY6^I_k8 zw;XW#w%s_}tPl5pwm39L(z$?14a-?_mkRgf5VL& z@yc&*26wgHO7%B4^SkQ$Phx#rqH)LaD%2j9*=W5~*)=E#MJx)~IVEaI^QFZj@G*c( znJP1m26G`pM)xTg)9DaVeH2_T>=0W$-a$|=T?hkxorzR`sEfimG<`q|lh80=i-o-> zu8a;i;A&~?9iUP_3;Hp?@4^Rr0qx3JMdTD#YnBDsMZy|0s34bZmtU&RE?w^~amY{R`wWYe(uKogSy|L> zG{zaD8ATp{>}(^10?`LJ*n&&DLNpsQEnVwt(A8kVM+5|^zJ2wdUNGv^Nyy-=3k4bw zNY2a7LSEn!Yhk`;G%4a^Sy}6ME*lt+O%Ba|2X@2$KF0^=TtaZv%H6@axQnl3BEVzn zZlHf+GYu$IRry1tyW!5{+?`hX&dw8mwqO83adiG6Gfg%8PP~vWyI71E zfK%wR_4IRhIC6VmHzvEINN!Z}eGa@>AJ-dm&{&WG5uIb1Du-dTIZ%3~AbHT~-rhP- zI=4rV=HZ2I5HI~*mb^1T+gEc8RH+kMNor8xFRR6&BjNQ?0cp`GIaXK8oAnPMFB28! zjNb=;NG@13adP9b&3SUFVBPZ33#^;hrle4ebO&&x$X#br2R&8gqIKeA4~UNDRbYNG zr~yXkI=_&@CTnChc6_ER@>a{Opfy*sOWLg7uD!c<>$pInQWqpqRWC|Y(zagD$TUxnvlGY= z_z|p9#{I+eWYbI?^37FL{V96Uoap$~_Ku=Ed4#?8gS9?p0q{uA_ny}~m(2;LA+8Dx zIes2nV(sW=Sw}x5eaHw-j?OI(fbETcx3B)?pa1gDRSt_Cp&gRZuc~aqQJF0;pG(ND z{h(h9XJ>};5MNPzhe8sR%o`X?FwSDe}pbcm;8Jpx~D0D0i(`{T!P zp2F+f_0QgYgbznF;Tgjc(nw~V)AUQ{owS9JUYzc|a-)roP25Z4_%b@id`&ukmzYzw zmYv)!dxiv?Ja&fxk=H*-BCMPm9Q3cZlC~}&%Pf_UtZ!%7ldg308$zlq?!Q(48U?>Ahk#^byM`0yaANU z1O*?5BS2N@@)H0!b-!^lxWxy5zm^>!u4N^|`i+UAy?UQ;DLo#JBB@^%M~If_s=`%{ z2-q+M0@eQh$ZrNm`#amUp=27T;R(Xbz zsT@@B1cf=cDa~Za(|t}W8PT!W+>;%s^OgO}iz(lKP)5O+uO9J9 z?7O_6nI5Y9+uLI#W8lAp6z)#f=<_<^7EdegS|0R-LI`<_T}? z(~aP~(}c9<WN z`TzKj<fcrCr7|s?bFT*d@44YRe6qWl`wk0VBLd<4 zF&1xs49@S5XQ<>syY(RYJdxE>EE-Rl2%qa}#9A{rMFbb&=thr!H=M6<%!{MrbM0_H zYRhvYSsu&Yr?4Ij)-9V&^eB@iThg28>U|xTsjB7~&-dAEZk)#}uKbb^53LZ?*$6nF z3Y+vG8MNAR4w=lMjP25QUOEy>K-M9&}UZl*_R#u5K(Z?kX)_=yXbPdzwv?6dxVBQr%ysJpnP_h=hcPI78wO`>HfZxNlzx()c zj%#G9+Mfp(F-XyQi69n#%B}W;GiGX-m~5;=;;YDkcMm!vjz<^-uZeSmfU%R1VgRcX zo~pj!pFaP8_$I-rqA@Z_EaoJ8le!;W;KMV0h#Ro_)E_#9&$*ey${nbw@KM(<5RtQZ zO=cu1)z!!aXXA}7UZr-fuQy1bAg0I#fnz>!RWR$pqSgB6B?v!4K}UqBf- z=)Y3L$)FogxK`swVNOkQC!jXW*KpXt-W4K9xAUJFs+3O$<;vCZrBDe-uRy43y>Gn+ zd`Bj64|1H?#pAwzkG@+GZ&r`*zr}sLuo`*5E6m6W)w|BpnOgrbAL#|} zAm!|Tj~jo?yCnR$w*H{@qXwz?e&!3IyOAw5y{9pfv3CSgC$vs9#xZ*3l5*8c?`GhN z`*AHR4$*XYW<_&%;KI|?+adW*G8BjF=WrdGIg`B${!YrIMFO-;S_mXx@BGw&syN?| zyPuRiB5w*xlHn{eX!DNwALuiYr-6u{;WU?jN{e5eJGNWU-tj8co_fJaG`#ALAqbm! zU1MOJNbIk>;21Cb`a7fHcwiMqH8kU=0&j8=Q_+duXo6jOwD7b53Ff8_*RUApyF>>qi<#1)9`>Vu z{zqq!2CC+>U>-TdgzzVxOx*>eNaq@Z%G_ZxSk8GV43@h>&B+Qxt2sWSmzR_IHELX4 zwSWu0s2bdcv&w*Xxnm_-(ST@06%##zA1v<3F;52gNzXiJb+dv$HYe5g4vs(+! zoJ7<(CI(fdJ2gHA`!PPLwVz&N(BOoBhq~F#f^m?)4In@QE&x1#7v>sY=iP>#SdDiu z@UaTUJ)zu~_h)zOKk1^Rg2RV#nYLqpFY%qi zxdD#_Y)N{o$ANX;IIey7*7?G#z>@xzS8*W*gWjj7q&sxh)k43F+q>4WSB6E| z_r>+l0dSRTGJX=8<`k2r;aywtM!uiuZYT>L7=U~MP`!K$B`xs|}98dpomK&rTSVq6qXMx&{YUz<_i3 z10{0j;W5-UUxp3*y&9hE;%NSrfDDTsNNQ$?g2oy{ok!@CkaQxtT7Z}4L!vipM--dS+|BSsNhlz-yS3|xE&Fe^rNuC0uJaRgQ0@R$b- zCP1nZUeW6gz!~mpLj>mo0gJX)$dlL%yjAY6D=9UF@zUH2OEcu&P}cvDE@;_4S5Z=QHZslqe5>b$V&b3M*?7jEjdQ){ z$8yx!c-zI-`z5+#k-X-A(%M;D0S6qRzX^JF_;PCARgt5)hQd^|rmTv~zky0bD>8xF zrgQi>%rDle&f5}ugE#;W#bG2J_Gyn7nPR!i3DT%wR%?43Pp81JX&&ku+i1*dhxa|% z<&(P`&oP3h(_wgMb@jfdrqZ5beHNTn6FXw~a=H?pZ+;{^solAMZ9C(`6W-#Dq2e}* zHF>mvED-yn+Ms^3|7yNG*v0fEwtaCj`QRbQCpw+{hVB8~e1dc4tIK;IJ)bsSk*(x~&j9?i;nH{if?7XM z8?W!LRX!WfZ}ZQ8mr3W#`k8)tq&OS(Z}{@^^Yb^DPjgSL(=D}ZJ_o5eQ(j6E2rsKy zLWVmBAzy4s%w<S7A3X$AVBcuDC(mS@HM+(;|!_K2doA_;$KjR@de){{S~WbT5!* z{}!6hes|pcHeQ36ci}bp(d#agkeqxKX`A3Kk?LITN@c@;;1yDRceK%Fr~*to_+hji zfAGtn%Q<5zU=-p#3xvR!Fa&|AweiCo+Kj=NoL}-DG(oKF^Spu|h|ZNb$bfFHqLDUy zvHPN5yVkQ4)zx8_hYq@9_R=5Y#2=%-?wFl+$D$OpV|G8dZ-uO+8p0SDy6fvp8ml?f zj0F?sjFl08Q26Iu-330*b8u*`O!3<*rmDZA={Hhr7POMWD1bbiQFYa zSBNjsXOch+3K)PyBxC`A`@;o+gYbD9c+h_k`bfL_uWvaBcfqHH6{ji{4Qav>z(PnP;Bin(x; zH|xObPu>+aYZQEU_Bu{<1BNQ@PP+=WUZ!jeTF-u`-NN)faIwMdi3=ZiHz(i-5XOVPz^inKDA!Lnq z1FjS$*LM(mLPf~v0M39V_qQ91(&rw-1aFoRgpnlOfwGtiP3cabS?A>!E>M1qH1Z;2 zUPBKE;_|ULo54&_6wi<~7wJQs=|hsx?)RC0&b4+kK@ykab3u;4FTyKo@WOy8qHXZdk&*KiSJ<6n|i;UO7YSy*5FWUuw4y~@oNPT@b&+1Wy{ zgFHN!L}t+9c3QhYPnHc?$FPOFxVMda$hw30Y`F)o>5%7UUhmSGNkBs$qr!Zn;*acq z8%4rm><#O%oZy+kgQ>U#vB;M&;%xP*b6)?#Dz6UQV21)+t>GGXN>3u2o9%ee;mf1B;_pF4lpXtv7# zlM?)iFY51;Cr@zQ-D73?>mH1MDqvCl6W5NSa!q@q)g}G1KdzV7w(rzed+S;*Em!uh z?^4+x-)Yw;--+-R?qXCbdf!M&b`r;j4<1w3XIO*iVU7(T8wyld`AOxB9e0Qx%oh(o z0sKL{zq&(AKo#>WV~jWwFmTT~8f9NzS&K9HMggt>$&=ty8xph+g6qS72q1Xj!|5R# z78Vf6hboXNzpwtwG3%OlCJf?>0WjnSeGcG_Y?6A7A!9#0;<)vW4_m(kTbv4K z_#3GKjooQpLPer)wI|ECs1=|MxR(9DSscO1x@Ir#K!U^9Wu_ z3z`X@F6Dldq6Jf{D!g(RGHp*NAbf;*=ehuH*hnE$oaHH$aQ^&x4wt5BQ@#A_gi zd<;sU+5Ey8)@*Exr%jxVGJJZ$y!OdkkZwi|TvgXqRCyFX`B^Mu8i00%dmLaKA4 zB8aB<>bsv1cQZP-3f$${M@mTC`SAWoFbQ2jcE zp-DorGg}g-@$t9IsHbvC0^@$K%Rusq>cYW)bx^aQqG~*359WhJ5n#>50f?YCFIT(d zT=9l*2Kf+?gMLpad7Xl?kvCz~K1_TrKYpC4Kez#=@^6fes~CEqI?dopOjrq8ahqf0 zvI|k2>XbRGu?BS#Q4{{4QLF|skwEwwul}iQ{Q4OpUMLi~;nRR`8P}qV4{j=^pOp}Q zTMOEyGg10B4jRz)29R5FKzGqniv6XX6PktNf^#dTV-<|F(kLW3K=x>RB2OWdvPh6H zw8Kp}5ahgpck=}4ox)dU$IezlEvmv9(X7*377zdNx9N_2^ZVz=nDkuZ*CikYRziQPEL?BbA+Tg2EXsW#NnlGk*r$FdELxEE*4g-lm9% z+V^iD2{G6$Aqmx0C2C2n*J-%~DN)r(wjTHh-c*%nvCKQzl0vQ{;x)CDklT1e5U-_L z6YDNIQX&eOOYR@Qn6xZ>4!)A{8^KKiEcnYb1A*Ff6Au`G^nAYy%}E%EdSZDnc%2AJ z$tC%hjQ>ddEr3dLLXaiqR)g1nszX|81JcF%D{2=gUBu)8|1So;sSnr8Q7&G7vAT*6 zSw*3^$nF3x=J3tZK~(ybDvuvRA)cJW7=gutg8}2ynJy>6LcJ5ZX) z-``AM2ZMrzh|4e3$>W+uCL8;9{0!$i z!$F4v_ZAk#sssQT=dw*zPpW`W)kz+(IvL5rUQ}{oByHzaI28{QV|2C#kpsh}ox$1UB8u zz_7_wM#l7v3da$($fbbGIM_AU?}lHvi4!Bb94JhF!FnI9RgS_eydZTr5N{|%*NecU zd{%sA?Cnc-OmnxWTe=BEtm^?n+W$rei9d{DVow!X4upn%gS1NRc{~$ zPZ$Zj7~CPXH{@(`*2Zd$)xb`$jw5Rf*P8G4f_G;&j+M3F++eo?ckFC2 z>We@GZNa%X98LAB0n%~ED!}r9tKp_2W3ZVvwFTA&k*EE5b2Y;z`LVxl>@D*v*sz&3 zJ#jU+A7qk$sa0Gnpc4HWF}5EdXH-g#y2%34nU#T5Vy}M!AtjKpzYcUtPr}^Ar~u3# zEUhMIAnk%eK$)EU4U(n!1}%{+i&V^QP%(9nN-SXsh$J&|{Q!&E2Hpf*XOP|lzg>Z` z1iB^-oedg4@du0WRPqQ3CI}?9l@4@wsu6!WhkN>eL==WtSrNtU8J80pvGVeL^mWKt z=$=4GTWCLsUqh%HAvLxEB6CVTqf(LB@Ymc_#`N(SQ+N2a_61Y?Lk7W0hq>4hkGKQ3 zd^Id}xf{n&&~H{{C}|nJasqXirXdX4G7O66p7gaZX&Xc?W;@bfPzP5L5wjQDH-Am_F!sMWRRdo_p?Cv@bE2iZDD5eK^4{Mz*v)$T% z_3`Biyg96v4o)$GZhbA(C+(v;`7NoodtT8gzl7&7n$a1@RiD3F8aaMMUn0!LX5+}eEIsGk3){3g zhLE~do;9S~+8I6ejRWoL2tqb^gLjmFVQ1OJD-^_TOV-MQL*4h0e8SyVg^8VJ8J+M;uKsXsphM@-gvv&-k~2sKga&7+JRrDa^mc?8-4 zHKC8~x5&wSuzyr~-6GPXGHJv2K7a!D$$lfIfJLP1qo6rz$s_#+tr>)W>^Tz19%nyK z)HV0Hybir(eCRzXVe(3}&6c{d4Uc3m-%+WSW@K0J^xdrUv!zK?dnnRXZ9Zy;oYVRJ z<^anc`icr2Fk^rW)!K&@jLkX@uSwsj#$cKE-3lcY2kQyEzX8P>U3=6F7+Svv2 z+~6iYop`LD?Cfkl-c94iReNKYOdCjz>_MPONyZ!94h(2Tgy+Ku7BC+K$FFdefs{T; z6SG1&&_b>yYyhMP`Bab1P^AG&>im;K4a0io9aT!Br5)M3d~+dxLS^L?=**L>DM%OUon!DVcYQIF=QCj7Xw^p(0Ux` zmvD_7b}?U5G@?#_;rBMHFviO$r0Wooqcob%86D8TaGG_F)p~{}3I8n`Uv%#10yM`K zq2g8TJa&xtaweb(7~cur8%5W7dfr-M;ec;~c&lKQpoc@^{GK}>CCpA-E!5(sNeZzz zgx4eu*9&@EG*<9 zHNzNd7o}%%jWKjt2s#kR>}Z(07r&e~AQIa!hTG)k0kdm_#CL2rG* z)9J^d4Ds3lW5mMtzz&ygw;yo4vG?Ur2N&3UGZ6@0oHN_pQ{a%o)+3h``me<{rh_f& zd<6j;TJ(?-T+(*tz{tZV#H=$78)uk}h+#@7 zK5Ey&(YYQfTC%)zI_ahn?bneZ(hZlBveG^w)-Bg3a*Z>5G-sW)GdypjSNjK%sY<#W zK-}4X<;XdG8TI670xOHpNA8g)EfcN0tdiD12+IJ}Z=eFm#R3J{Q0FLl3QLr7_uRXd z78G~mk`EHTlSc6IBTQOLBoUtnKQ9h~UBdD*rk20CHh_EW-q6^PX6r+G%k*!Q9&kqI62EKP5J8Wgmw=ghn=ZTT6J9?%g%#{!N@N$b|$ z80|p{WrGg79;AaD4n0wpXU%xiEcW-&8QG5A+ zSU?Ext5cCO{@7F1Mk+5|7?aM|sg4!k8sxw9tSF3C$N&LqlBq);j#Sg>%0k)c4t*j9 zMj)BCm)TWvK8A=ERxM~~?hd`-x;>E;98kmFXa-Cy=jNQx{2#?Z$2P^E#KWIOqEncN z^K>4VdmTGy96~TH0hWXtDa!jTh#1X(qvq%^9JN9xLD!O5JuwI(HUf$+stA~42yA>0 zoCu#wTcAAFPqDdjSGdms(hi~>p8~7x{&JA0GQwiGYuK9Pix`wm+zqGSP5Cvym20TYFJZb1F?l0?6A$!v7RTMu@VctJ%Fl(&x3RqhFWPDC zJR!#Ye3d#*M0F$`4NffI)GZ3&O5_M@!17iG>({D|Q5+6&HDdkBRQcItF-6Os7A!kyhxQXr%qPbTO>Op}vL$ zZK_Eka(v^rO_b6?}0l@Do0y>iSFt>aqXXHgIDP^b?(yjz@Q~B) zA&W$sa?S-5M2JjkYZqoq)MicP!S5tVMZ9F$$d~aF$G<3zu`-=-A|P)mc8AuSM+WY6 zJ~`UYOKx4RCo3f&3`y$bDJpP~7G6%c2S1OV{0cmjW05d!a@`O3dQ?i16P78$k?tLu z`1?{TLsLnxtr9_h&%w$Wj=X+mihC7(W`TG@Y>3k%9|`4`B(z%du?dB7nAMIb^_8< z@uQulq5u$P5+Pu$n;ly+)=wdhpv&;L`kFuxpJ4SMC~<;1+wY9gSWu*j+3O zIO{PlYSqhsF<8N}T#oQZ@DY{EOJR%ctc40JEN%~wSub2Nh$5L*8TIFyHha)N#O*BP5^+jA=V{~9K zx1CPiPHneS+jcv(?RIM0yi?n@t*LF>*3`EB`o8tPKkr|1a_+jhNmlO4$=Q25!I-K@ zM1nsKf&ct)Bv9^hbZl4~NPGFy=*yLX;5N@!ieUE9<76f?r6;63-WyyIF772JGMG`%5jdrwDQ*1J z{zRAbq%8p&VKkb?aX8a8wJ-2;efju#)8!qM#v%9iGg;wy>T`E@XzKHR*EU&iOywJf zy|7u8+9y6V?5!)@Ij2!p4;}w#@`4Lz=7+Gv0Z_EwMnz@fwzO|edz!;H)E`#JSvNbh zgR60kmkU>cc$_|uFD+bDX)CFSwhu!kT}}v)(G^w)`6~bq-0LC#hKcawx5ZhR&EoBS zTwEvsI4%!0^#&@UITEed)I#tFa19)Vdt}EQ1x`}aqF@k?i|?iIn6N6PEt1gx?5ZZZ zfl{RoZKJ{jkQ2Bd;vV^bQHW>!qaMfc<>pl~*$3&^cW$UZo|Io--`|Og6bY zq4ay`WQ+{VLI&Y`2v>k3sOEyraWxz50d~Xq{R0&YE76S#>_AJG_-JF8@RtX+j@JIP zL;pJK-cY`andKx+-F;Dy;4DeOLH`odit*Y7+7b-(s2f^Z@FT0#E9N)M-qyaM)l(0n|jT zuavBaf0N8DQ>c@#A!AnX+WkX|X)493ZAzNP*zwC;BBj&Uw$Bymg?agX%*gaaoAuJ8 zj6s%Zu)9FJeK=_Sp9m+^_fra$k;L!9r_z-wv5{U;p0#+!s#vLvNBOMB;u*ieK{T$w z!`Z6Ym4>q;i=SY5!->hwkL*1AQ#KM%oz7BxtTCii&Ud<8| zIhhafVs;Vx1C?THTEPTQ3!}qljra;U+#KsZP`CVAh??>w6-{Y3RQ(&*ebMrJJ4gUl$V@YMy?zpA05))iw4>T`s&*2XgiKs{%+}92ks+ep} ztLDf^nh<0C-ednO^F!717mxT4rGHXgM$PZvX$*gWc6mm625B-Oa2^84+27{4;8~{4 z@u(2PME}IRB*i+&83^|`d&mX-ECXX=soGCX>VWHH(w#)1b+SP&-9s;Tb0d-Yc8)xS zVKSk!XIqYvd50|rvhsF-}`GirJ} z%GwR02M6CbLyW#9x6f@Lzw+EV2qkX77HO?f_pt!EoN3<|Xg+!d_ipxtVY^As;)FJ$r=6aRYm*bgoFd5@ z@i&!BTJzBT$v8s#Z~1o!|HF0^`ESRNIkAlvA- zp9%y{T|hhgB|6C+?PJhcpi^*#Mt*x7=ofFeah+MQ^1*ShMIQD|_6;8Dn-*VNEW6hi z(?5D+5S5gW_%vYu6zL|J=3PK_8glxB%Y-eZ$k-AL#pPQKd8#EM%_kNUtCBz?*e%D` zU>XB5U*aTgZ5a*BSkFT$l2vH3CfU=B!itrXc#lR0#erAeI34|&Y{u>!QreiAqkgl; z>#>=0{k1W}zmh+7{#f_kDOu*hoT8J^F|LN3-ILGj_D#fAkUfWH(rb{{k_Xo|fsUh+ zzS;v646N^aj`cUIjoAW`ch8#U_Vz{yjy0xurXr8?L6d#p2rh;k@Oph^pVIBTtcRG$ zNYF21;#T$5>Opk}#}qrDBz`djF$g0TSFIF|t0SW#`;>-!f3mQ#VIkeydb z<+}3~Jd@ktBlBpT-`^=%&5l2)Z^4OS3|+}eF~=q2ZVHzxq%hR~OaEq6wk`jvgeEU& zS*e+)Xs+N(8d+0e6(rMZn^r-hBY%YwHP zE}CuwGbE3i^$kX{OaoCz^Ea3FFFS3dvu}h<%6r0uh-p_eW1{{S>f!ydQx4#s7;Sxx z%X%Ay?gG*q80GNcL4H(x}yU+L;jD@=2aAyg>2&A#l!rIeWU3mv8E&6?j>G+kxnRRJ`t6n zZ0sqVZ2i~xg9=w>e3Cbi~p9(+rFI}>5tL_;|(^0!8tts`daO+ z&F=%ZdN|v@gN034NAe);+q@b!Q(Frh!rI5}m)Akff8zv;fU*N!O1MQ4|x} zKWS)HH~iBZ*m9j587-^2SaUq|gIISg=H@Q1t-Z0o;pyZ_Ow4Zs0G@Y?yWY1EKCgC*ZCzxohdTZZ8s*x$%;S)W3qX`T?C&;doPMqqU-EwdtlQ~w z{J_2hylK*UzJwXqwZl>E z(dQ6^nujO>bII!st?*2l5_vbBTt9-yR}%993A_#C_;!$}UgLYRi9yCnT}|0zzc8$V zJ}z$6Am71e(vwJfML)jD2D1SSa1ZtIrE(q$HrAM*CtLffTO>YSO!k%?g-la*vB5oW z+^NQ@(6g&_@PVR>HSF#ijY^zr2iUBopXli)e}CuGo*{jci@5JeD~mU60m)CXf&lY4 z_70s$P9x8`c^dJ;w;W)b6vncUlOg*^5VPwYFIX}y=qw0&0cCWs@yG>oqsbwvB$DoA z>3dV5!&fXryPsHD6jdHKX8kJ&G`-&|*{?G!c$`C8;uEY14Iz?#EDVHqBG0Oy$n-m4 zZ0gtEj}78F(!J|_?qNbqGnQMKwDTQp17X4>M8yx=TS?BZANM4JnzJGM& zXS>A}Z8lKf%W54ik6-zB^_9!{FwP~DA#FqEz1G&(*^yGW$VSZ^OwJE8pwTl`!HR2 z9(u1@DtV^+U)iJ1{4H^wHFI;^NqE1`mm{b_O6u+&0#gPww@MKYoMu8OYkHrci(bEz z;HVTsm9gOK{7Cr3AjsB>rj@)f5%D3i6)@3R^(Lq~LB*Tr(p`i+_pEJk*Z+hvdpW*g z+~d#q$*_}l>GgIr^J4NYj`wc1PY|sdy=)&d#-)?vE2UX5D-q9p;DmkK^)irt*>Rt) z_px*S=yMCiHvtc>m+xnnAKMdMz-dSJ+sV@B)xnzFQngxb_SL*4qT~o@B z0G-*WlIb(4+OhWiF+UT0bD&EEww*F`_0qUZvlh4%it@8c4wc37LG43tVQ$T zdUUn&8|*NM%f6Gosq6PvEUwLMYvVglgP2dt0@Ix6SMfT57G!u&Z7shCev_G3E zLj;68ML6RaK)FjJbwOc!K9fcX{ucKsIeCAm17NkoNJ)z!lzXJbqGiJWT8m6m6;~m4 zXU)~ORW&QS&5%RlWs+@8k<@0v}WR7|?8qfwlI{IO*}!dzUC@^P$od{T?MN zJZwHv(6#*=tdS;=b7h^#B$>`Lp#! z`Ht%5+rLMA`ngDZ^lI<0;iE@$cUsq?XAX9tEtDXQ>K*khU#b8!PMKghAUg_#jEdk4B#bgd8Pt`b!lCAs; z_HAEz?eF)l^O)Aldg2%HZ!0c|52=9mcqD~MTDc~fs9*_-Jj>i2Vb*Clg@+m{uT^*4 z4}Bi`a~Zjhm#bBWg@;nv6Yh%|L0+@lt&Tyh)Jom>gYXM>D*?Op8R+mWyFVurYOH50 z2%TUNR;ZRs$xA+Gw4$Oh>!nDlmKeEjGNQtc zp?&Ytc-A%LqeK@xir3J+4-7kpVB2}A%>VAq&<2$}!Ttw}O{&_NjH*fMb>X1qtI`cS z+Adore~_HWShkR?0G^6kSLRh#pz&*S1%q)6x9}~E*QY^dr=N1qxUu}>2Cw6n0BKPL ztl6{!`K>Cc!?^3)ZQ@XQv#`h-?O(z4!P9m$`>oZXN;MxR&$+INMZl>ua{t@LTFAoM z6&F?qtu3W1-sVOZt?jWj7wC={*T$Qp>O*FgV*;aOtjdU@6WZ9U8f9K)p4W_QC91dZ zz@iobk->4#P>yD|duDm>0ca6 zVO`O=vvA>kD;3}Z9D+AIoDSY8G%R+e7MJ49C7CB-E)c5!F5t|4Sb|Jh3$v=KXjc+g7@K# z>_8R>x3}J*45bBS{|aVO+Doo|oirn;+B=sQBhQv};V)PPeu1ZZ-0x6RZb{yE;^`br zmKFFoido|e?LV6|??QVSj1$~eJ|s+mO79kK;tLfv``Rw7@N#U}(<3Ij)pB>;WpI{D z@NZ4i8N0K-E3iCI_3op(vcF(4jq@wj4_qc33t)-KIb4YHrt&LE!pWUb1S3F*`I>qi zk`Kx0K1^x@T?{lI9?$+mdhItQ{{OP2eXj}jl?!`_kH}qwCQE*CXiGk?Jc1n-@m1HQ zymRbxE_Zqrv>JRVV%C{bHj-tumP~PnzvV6Kc{2}G?RR8w^(k(Q47;V~PwTqhO;y{S z^o4R)HAXR)6Zeq4E`jpC+Z?O{-H?1}3jgE_^vvV{_RkAF&A)F+fO*FaL4(^ts7Yuy{fR^s|%wPZGdA}OpvE;4GQ{;x4|K(%~cZqPaM@E%wNrqOjD%}p( zrYb1?Z9KipvC-jrB;D3|WfblgyH?{@;bU^;V=d-fOQ&(SvN0wgt?X3^e?HKGdwO)d5-l#}O`s;2B2;#6;v?3zO#P{o#6Ng0ITglze zW-!+^<6eGlhYA##^3xD(b_=lvRhB!+avG?9>7#$e^)*h>h&M*|VZ3z-xIZ=Hf#s?h zs^-@Zv=6fC?XO$rv96b$>J|NkDCE|MkJD`aeICOqZ+t%vO!O=PM!e^XB|IyFhAkEi zLbFKgI1g;^c^9Pggl#hi!{r76!1$?xTKH8aym6~s6@O~odr?$EPU$>T@1a;)ZnK!V z;7}#-LiuIUs88aL^f`a8e=Pb>?cEGM7y9svd643LDdOs?p_>McBYKcAtxDVo_#>9xf0*c18e_;J!CT~ac z{7Tx^F=+MjocgkxcQxi6*iZgA9zX4Do;uCgzH@%6?mzYMZ>wvP8C3z_zRG$f_1>G9 zxVW87I=>tEaqMQ#<8U!ik=i+w9_$sYh5;RoJm#!e4t4%BbZQcEf9;kH#dM7Pw9jX1 zMEu3mp^cvgwSp~pVIsbd)^a6;Hu;pbX8(LUhh%Ld>fhhHj(eAUARInPPW4sG08&KkVO;5pphG#}ZKf&oG@C_oF-Y{{L=cZjMucWYU38OkYx=T8bnk@~yE_Nhpq8dIo=$eTS--oCr(@q)2 zI7PEn@akGQ#-P^?!Ox+j8pWXqK_0|;xGOBj?r)ZGV0tFq&_O(V)G|e{*Z9SWL83AV z0hy*3u!gb^tPqw$uZE?CvzhwmP2|{xSs6&Twh=C;fB3P4Qylt{bU)`1_mGUDY|Yfg zK;=8#Xn*1vaYh+c8`VtpmzC$qCJ)73{#!fFjpc3B?N!ml5Yt*`PtvXseLYTj_F-zn zUcv8##8i?~Va&V0%5P95E7*_Xld!?IB8Ne&Ajh->`1WvK2SjPm8*7yGDOzx>N|Ae2 zunOh=QNWG`{$5iiGFm}gdh88o#wpX-BOr0)s@-~;SzD-FqX|k&)%#LYQHD$}J9EX%O#z(vP+46iVDzr)BI?1TB?oQ$zrH|)hwU0r8zYv%X8$El+-;sQES3ZRNB??mS8s}Y@K0qDJ~gHpj$R< zxpc97cI{V?jA9GhHppMvxWdlt>$hmOF;Jg!5Uc117ZK-aREV?=1m~k!tb_HCj1Cm{0n_%K)i%hPZ+3a!e^aKesmT4d|Al(qXQEe+F_DoSo5}-A!|-cZR^nJ7 z;kfct=rna%T+~A+%yZoCS_sO-Jsr*Cnq40mJK38&9}i0IMi!ZONLKKAsG~j!-_Uk} zv-xw|Tl(jlmbKX&v1C!udu=P05JRU#o8~~&%y(>7GL@U>e}DC8XraXf_mn&qAs%R` z^n>x^2V_P6gufcq=w2q02zfXh)2*)y?Ua+_HdXCZA^cztS|VdfkU#tVZGwuTsteir z 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 D6^n?AR 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 iJ{ykT;g3h39ZiQ {/if} - {#if displayedModel()} - - +

    {#if message.timestamp && !isEditing} = showThoughtInProgress: false, disableReasoningFormat: false, keepStatsVisible: false, + showMessageStats: true, askForTitleConfirmation: false, pasteLongTextToFileLen: 2500, pdfAsImage: false, @@ -82,6 +83,8 @@ export const SETTING_CONFIG_INFO: Record = { disableReasoningFormat: 'Show raw LLM output without backend parsing and frontend Markdown rendering to inspect streaming across different models.', keepStatsVisible: 'Keep processing statistics visible after generation finishes.', + showMessageStats: + 'Display generation statistics (tokens/second, token count, duration) below each assistant message.', askForTitleConfirmation: 'Ask for confirmation before automatically changing conversation title when editing the first message.', pdfAsImage: 'Parse PDF as image instead of text (requires vision-capable model).', From cf659bbb8ef9eb048e5153a27cf787fd83c05560 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Sat, 1 Nov 2025 15:51:36 +0100 Subject: [PATCH 049/185] mtmd: refactor preprocessing + support max/min pixels (#16878) * mtmd: refactor preprocessing + support max/min pixels * fix mlp type * implement mix/max pixels * improve hparams * better image preproc for qwen * fix * fix out of bound composite * fix (2) * fix token calculation * get_merge_kernel_size() * fix llama4 and lfm2 * gonna fix them all * use simple resize for qwen * qwen: increase min tokens * no resize if dst size == src size * restore to initial min/max tokens value for qwen --- tools/mtmd/clip-impl.h | 2 +- tools/mtmd/clip.cpp | 760 +++++++++++++++++++++++------------------ 2 files changed, 431 insertions(+), 331 deletions(-) diff --git a/tools/mtmd/clip-impl.h b/tools/mtmd/clip-impl.h index 311a4c9086a..c7e9498349c 100644 --- a/tools/mtmd/clip-impl.h +++ b/tools/mtmd/clip-impl.h @@ -154,8 +154,8 @@ enum projector_type { PROJECTOR_TYPE_LFM2, PROJECTOR_TYPE_KIMIVL, PROJECTOR_TYPE_LIGHTONOCR, - PROJECTOR_TYPE_UNKNOWN, PROJECTOR_TYPE_COGVLM, + PROJECTOR_TYPE_UNKNOWN, }; static std::map PROJECTOR_TYPE_NAMES = { diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index b312fda637f..dcfdb49600b 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -171,8 +171,10 @@ struct clip_hparams { int32_t n_head; int32_t n_layer; // idefics3 - int32_t preproc_image_size = 0; // aka max_dimension - int32_t proj_scale_factor = 0; + int32_t image_longest_edge = 0; + int32_t image_min_pixels = 0; + int32_t image_max_pixels = 0; + int32_t n_merge = 0; // number of patch merges **per-side** float image_mean[3]; float image_std[3]; @@ -194,7 +196,6 @@ struct clip_hparams { std::unordered_set vision_feature_layer; int32_t attn_window_size = 0; int32_t n_wa_pattern = 0; - int32_t spatial_merge_size = 0; // audio int32_t n_mel_bins = 0; // whisper preprocessor @@ -204,6 +205,21 @@ struct clip_hparams { bool has_llava_projector = false; int minicpmv_version = 0; int32_t minicpmv_query_num = 0; // MiniCPM-V query number + + void set_limit_image_tokens(int n_tokens_min, int n_tokens_max) { + const int cur_merge = n_merge == 0 ? 1 : n_merge; + const int patch_area = patch_size * patch_size * cur_merge * cur_merge; + image_min_pixels = n_tokens_min * patch_area; + image_max_pixels = n_tokens_max * patch_area; + warmup_image_size = static_cast(std::sqrt(image_max_pixels)); + } + + void set_warmup_n_tokens(int n_tokens) { + int n_tok_per_side = static_cast(std::sqrt(n_tokens)); + GGML_ASSERT(n_tok_per_side * n_tok_per_side == n_tokens && "n_tokens must be n*n"); + const int cur_merge = n_merge == 0 ? 1 : n_merge; + warmup_image_size = n_tok_per_side * patch_size * cur_merge; + } }; struct clip_layer { @@ -532,7 +548,7 @@ struct clip_graph { const int batch_size = 1; GGML_ASSERT(n_patches_x == n_patches_y); const int patches_per_image = n_patches_x; - const int kernel_size = hparams.proj_scale_factor; + const int kernel_size = hparams.n_merge; cur = ggml_transpose(ctx0, cur); cur = ggml_cont_4d(ctx0, cur, patches_per_image, patches_per_image, n_embd, batch_size); @@ -554,13 +570,13 @@ struct clip_graph { } else if (ctx->proj_type() == PROJECTOR_TYPE_IDEFICS3) { // pixel_shuffle // https://github.com/huggingface/transformers/blob/0a950e0bbe1ed58d5401a6b547af19f15f0c195e/src/transformers/models/idefics3/modeling_idefics3.py#L578 - const int scale_factor = model.hparams.proj_scale_factor; + const int scale_factor = model.hparams.n_merge; cur = build_patch_merge_permute(cur, scale_factor); cur = ggml_mul_mat(ctx0, model.projection, cur); } else if (ctx->proj_type() == PROJECTOR_TYPE_LFM2) { // pixel unshuffle block - const int scale_factor = model.hparams.proj_scale_factor; + const int scale_factor = model.hparams.n_merge; cur = build_patch_merge_permute(cur, scale_factor); // projection @@ -584,7 +600,7 @@ struct clip_graph { } ggml_cgraph * build_pixtral() { - const int n_merge = hparams.spatial_merge_size; + const int n_merge = hparams.n_merge; // 2D input positions ggml_tensor * pos_h = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, n_patches); @@ -610,7 +626,7 @@ struct clip_graph { // mistral small 3.1 patch merger // ref: https://github.com/huggingface/transformers/blob/7a3e208892c06a5e278144eaf38c8599a42f53e7/src/transformers/models/mistral3/modeling_mistral3.py#L67 if (model.mm_patch_merger_w) { - GGML_ASSERT(hparams.spatial_merge_size > 0); + GGML_ASSERT(hparams.n_merge > 0); cur = ggml_mul(ctx0, ggml_rms_norm(ctx0, cur, eps), model.mm_input_norm_w); @@ -926,7 +942,7 @@ struct clip_graph { // deepstack features (stack along the feature dimension), [n_embd * len(deepstack_layers), n_patches_x * n_patches_y, batch_size] ggml_tensor * deepstack_features = nullptr; - const int merge_factor = hparams.spatial_merge_size > 0 ? hparams.spatial_merge_size * hparams.spatial_merge_size : 4; // default 2x2=4 for qwen3vl + const int merge_factor = hparams.n_merge > 0 ? hparams.n_merge * hparams.n_merge : 4; // default 2x2=4 for qwen3vl // loop over layers for (int il = 0; il < n_layer; il++) { @@ -1149,7 +1165,7 @@ struct clip_graph { // pixel shuffle { - const int scale_factor = model.hparams.proj_scale_factor; + const int scale_factor = model.hparams.n_merge; const int bsz = 1; // batch size, always 1 for now since we don't support batching const int height = n_patches_y; const int width = n_patches_x; @@ -1239,7 +1255,7 @@ struct clip_graph { // based on Llama4VisionPixelShuffleMLP // https://github.com/huggingface/transformers/blob/2932f318a20d9e54cc7aea052e040164d85de7d6/src/transformers/models/llama4/modeling_llama4.py#L1151 { - const int scale_factor = model.hparams.proj_scale_factor; + const int scale_factor = model.hparams.n_merge; const int bsz = 1; // batch size, always 1 for now since we don't support batching GGML_ASSERT(scale_factor > 0); GGML_ASSERT(n_patches_x == n_patches_y); // llama4 only supports square images @@ -1311,7 +1327,7 @@ struct clip_graph { { // patch_merger - const int scale_factor = model.hparams.proj_scale_factor; + const int scale_factor = model.hparams.n_merge; cur = build_patch_merge_permute(cur, scale_factor); // projection norm @@ -2577,7 +2593,6 @@ struct clip_model_loader { if (is_vision) { get_u32(KEY_IMAGE_SIZE, hparams.image_size); - get_u32(KEY_PREPROC_IMAGE_SIZE, hparams.preproc_image_size, false); get_u32(KEY_PATCH_SIZE, hparams.patch_size); get_u32(KEY_IMAGE_CROP_RESOLUTION, hparams.image_crop_resolution, false); get_i32(KEY_MINICPMV_VERSION, hparams.minicpmv_version, false); // legacy @@ -2686,65 +2701,68 @@ struct clip_model_loader { hparams.minicpmv_version = 2; // default to 2 if not set } } break; + case PROJECTOR_TYPE_INTERNVL: + { + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); + } break; case PROJECTOR_TYPE_IDEFICS3: + { + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); + get_u32(KEY_PREPROC_IMAGE_SIZE, hparams.image_longest_edge, false); + } break; case PROJECTOR_TYPE_LFM2: - case PROJECTOR_TYPE_INTERNVL: { - get_u32(KEY_PROJ_SCALE_FACTOR, hparams.proj_scale_factor, false); + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); + // ref: https://huggingface.co/LiquidAI/LFM2-VL-3B/blob/main/preprocessor_config.json + hparams.set_limit_image_tokens(64, 256); } break; case PROJECTOR_TYPE_PIXTRAL: case PROJECTOR_TYPE_LIGHTONOCR: { + // ref: https://huggingface.co/mistral-community/pixtral-12b/blob/main/preprocessor_config.json + // TODO: verify the image_min_tokens hparams.rope_theta = 10000.0f; - hparams.warmup_image_size = hparams.patch_size * 8; - // Mistral Small 2506 needs 1024x1024 image size cap to prevent OOM - // ref: https://github.com/ggml-org/llama.cpp/issues/14310 - hparams.image_size = 1024; - get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.spatial_merge_size, false); + get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.n_merge, false); + hparams.set_limit_image_tokens(8, 1024); + hparams.set_warmup_n_tokens(256); // avoid OOM on warmup } break; case PROJECTOR_TYPE_KIMIVL: { hparams.rope_theta = 10000.0f; - hparams.warmup_image_size = hparams.patch_size * 8; - get_u32(KEY_PROJ_SCALE_FACTOR, hparams.proj_scale_factor, false); + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); + // TODO: check kimivl preprocessor for exact values + hparams.set_limit_image_tokens(8, 1024); + hparams.set_warmup_n_tokens(256); // avoid OOM on warmup } break; case PROJECTOR_TYPE_GEMMA3: { // default value (used by all model sizes in gemma 3 family) // number of patches for each **side** is reduced by a factor of 4 - hparams.proj_scale_factor = 4; + hparams.n_merge = 4; // test model (tinygemma3) has a different value, we optionally read it - get_u32(KEY_PROJ_SCALE_FACTOR, hparams.proj_scale_factor, false); + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); } break; case PROJECTOR_TYPE_QWEN2VL: - { - // max image size = sqrt(max_pixels) = 3584 - // ref: https://huggingface.co/Qwen/Qwen2-VL-7B-Instruct/blob/main/preprocessor_config.json - // however, the model use unreasonable memory past 1024 size, we force it to 1024 otherwise it's unusable - // ref: https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct/discussions/10 - hparams.image_size = 1024; - hparams.warmup_image_size = hparams.patch_size * 8; - } break; case PROJECTOR_TYPE_QWEN25VL: - { - // max image size = sqrt(max_pixels) - // https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct/blob/main/preprocessor_config.json - // however, the model use unreasonable memory past 1024 size, we force it to 1024 otherwise it's unusable - // ref: https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct/discussions/10 - hparams.image_size = 1024; - hparams.warmup_image_size = hparams.patch_size * 8; - get_u32(KEY_WIN_ATTN_PATTERN, hparams.n_wa_pattern); - } break; case PROJECTOR_TYPE_QWEN3VL: { - hparams.image_size = 1024; // still need this? - hparams.warmup_image_size = hparams.patch_size * 8; - get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.spatial_merge_size, false); + hparams.n_merge = 2; // default value for Qwen 2 and 2.5 + get_u32(KEY_SPATIAL_MERGE_SIZE, hparams.n_merge, false); + get_u32(KEY_WIN_ATTN_PATTERN, hparams.n_wa_pattern, model.proj_type == PROJECTOR_TYPE_QWEN25VL); // only 2.5 requires it + // ref: https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct/blob/main/preprocessor_config.json + // the actual max limit is 12845056/14/14/2/2/4 = 4096 tokens + // but we set a lower value to avoid OOM + // TODO: make it configurable by user + // TODO (2): bbox coordinates become inaccurate with small number of tokens, + // therefore we need to increase the min_tokens + // see: https://github.com/ggml-org/llama.cpp/issues/16842#issuecomment-3475144858 + hparams.set_limit_image_tokens(8, 2048); + hparams.set_warmup_n_tokens(256); // avoid OOM on warmup } break; case PROJECTOR_TYPE_LLAMA4: { hparams.rope_theta = 10000.0f; - get_u32(KEY_PROJ_SCALE_FACTOR, hparams.proj_scale_factor); + get_u32(KEY_PROJ_SCALE_FACTOR, hparams.n_merge, false); set_llava_uhd_res_candidates(model, 3); } break; case PROJECTOR_TYPE_ULTRAVOX: @@ -2777,10 +2795,13 @@ struct clip_model_loader { LOG_INF("%s: patch_size: %d\n", __func__, hparams.patch_size); LOG_INF("%s: has_llava_proj: %d\n", __func__, hparams.has_llava_projector); LOG_INF("%s: minicpmv_version: %d\n", __func__, hparams.minicpmv_version); - LOG_INF("%s: proj_scale_factor: %d\n", __func__, hparams.proj_scale_factor); + LOG_INF("%s: n_merge: %d\n", __func__, hparams.n_merge); LOG_INF("%s: n_wa_pattern: %d\n", __func__, hparams.n_wa_pattern); - if (hparams.spatial_merge_size > 0) { - LOG_INF("%s: spatial_merge_size: %d\n", __func__, hparams.spatial_merge_size); + if (hparams.image_min_pixels > 0) { + LOG_INF("%s: image_min_pixels: %d\n", __func__, hparams.image_min_pixels); + } + if (hparams.image_max_pixels > 0) { + LOG_INF("%s: image_max_pixels: %d\n", __func__, hparams.image_max_pixels); } } else if (is_audio) { LOG_INF("\n--- audio hparams ---\n"); @@ -3181,9 +3202,11 @@ struct clip_model_loader { if (ctx_clip.model.modality == CLIP_MODALITY_VISION) { img->nx = hparams.warmup_image_size; img->ny = hparams.warmup_image_size; + LOG_INF("%s: warmup with image size = %d x %d\n", __func__, img->nx, img->ny); } else { img->nx = hparams.warmup_audio_size; img->ny = hparams.n_mel_bins; + LOG_INF("%s: warmup with audio size = %d\n", __func__, img->nx); } batch.entries.push_back(std::move(img)); @@ -3399,9 +3422,169 @@ static void normalize_image_u8_to_f32(const clip_image_u8 & src, clip_image_f32 // set of tools to manupulate images // in the future, we can have HW acceleration by allowing this struct to access 3rd party lib like imagick or opencv -struct image_manipulation { +struct img_tool { + enum resize_algo { + RESIZE_ALGO_BILINEAR, + RESIZE_ALGO_BICUBIC, + // RESIZE_ALGO_LANCZOS, // TODO + }; + + static void resize( + const clip_image_u8 & src, + clip_image_u8 & dst, + const clip_image_size & target_resolution, + resize_algo algo, + bool add_padding = true, // TODO: define the behavior for add_padding = false + std::array pad_color = {0, 0, 0}) { + dst.nx = target_resolution.width; + dst.ny = target_resolution.height; + dst.buf.resize(3 * dst.nx * dst.ny); + + if (dst.nx == src.nx && dst.ny == src.ny) { + // no resize needed, simple copy + dst.buf = src.buf; + return; + } + + if (!add_padding) { + // direct resize + switch (algo) { + case RESIZE_ALGO_BILINEAR: + resize_bilinear(src, dst, target_resolution.width, target_resolution.height); + break; + case RESIZE_ALGO_BICUBIC: + resize_bicubic(src, dst, target_resolution.width, target_resolution.height); + break; + default: + throw std::runtime_error("Unsupported resize algorithm"); + } + } else { + // resize with padding + clip_image_u8 resized_image; + float scale_w = static_cast(target_resolution.width) / src.nx; + float scale_h = static_cast(target_resolution.height) / src.ny; + float scale = std::min(scale_w, scale_h); + int new_width = std::min(static_cast(std::ceil(src.nx * scale)), target_resolution.width); + int new_height = std::min(static_cast(std::ceil(src.ny * scale)), target_resolution.height); + + switch (algo) { + case RESIZE_ALGO_BILINEAR: + resize_bilinear(src, resized_image, new_width, new_height); + break; + case RESIZE_ALGO_BICUBIC: + resize_bicubic(src, resized_image, new_width, new_height); + break; + default: + throw std::runtime_error("Unsupported resize algorithm"); + } + + // fill dst with pad_color + fill(dst, pad_color); + + int offset_x = (target_resolution.width - new_width) / 2; + int offset_y = (target_resolution.height - new_height) / 2; + + composite(dst, resized_image, offset_x, offset_y); + } + } + + static void crop(const clip_image_u8 & image, clip_image_u8 & dst, int x, int y, int w, int h) { + dst.nx = w; + dst.ny = h; + dst.buf.resize(3 * w * h); + + for (int i = 0; i < h; ++i) { + for (int j = 0; j < w; ++j) { + int src_idx = 3 * ((y + i)*image.nx + (x + j)); + int dst_idx = 3 * (i*w + j); + dst.buf[dst_idx] = image.buf[src_idx]; + dst.buf[dst_idx + 1] = image.buf[src_idx + 1]; + dst.buf[dst_idx + 2] = image.buf[src_idx + 2]; + } + } + } + + // calculate the size of the **resized** image, while preserving the aspect ratio + // the calculated size will be aligned to the nearest multiple of align_size + // if H or W size is larger than longest_edge, it will be resized to longest_edge + static clip_image_size calc_size_preserved_ratio(const clip_image_size & inp_size, const int align_size, const int longest_edge) { + GGML_ASSERT(align_size > 0); + if (inp_size.width <= 0 || inp_size.height <= 0 || longest_edge <= 0) { + return {0, 0}; + } + + float scale = std::min(static_cast(longest_edge) / inp_size.width, + static_cast(longest_edge) / inp_size.height); + + float target_width_f = static_cast(inp_size.width) * scale; + float target_height_f = static_cast(inp_size.height) * scale; + + auto ceil_by_factor = [f = align_size](float x) { return static_cast(std::ceil(x / static_cast(f))) * f; }; + int aligned_width = ceil_by_factor(target_width_f); + int aligned_height = ceil_by_factor(target_height_f); + + return {aligned_width, aligned_height}; + } + + // calculate the size of the **resized** image, while preserving the aspect ratio + // the calculated size will have min_pixels <= W*H <= max_pixels + // this is referred as "smart_resize" in transformers code + static clip_image_size calc_size_preserved_ratio(const clip_image_size & inp_size, const int align_size, const int min_pixels, const int max_pixels) { + GGML_ASSERT(align_size > 0); + const int width = inp_size.width; + const int height = inp_size.height; + + auto ceil_by_factor = [f = align_size](float x) { return static_cast(std::ceil(x / static_cast(f))) * f; }; + auto floor_by_factor = [f = align_size](float x) { return static_cast(std::floor(x / static_cast(f))) * f; }; + + // always align up first + int h_bar = std::max(align_size, ceil_by_factor(height)); + int w_bar = std::max(align_size, ceil_by_factor(width)); + + if (h_bar * w_bar > max_pixels) { + const auto beta = std::sqrt(static_cast(height * width) / max_pixels); + h_bar = std::max(align_size, floor_by_factor(height / beta)); + w_bar = std::max(align_size, floor_by_factor(width / beta)); + } else if (h_bar * w_bar < min_pixels) { + const auto beta = std::sqrt(static_cast(min_pixels) / (height * width)); + h_bar = ceil_by_factor(height * beta); + w_bar = ceil_by_factor(width * beta); + } + + return {w_bar, h_bar}; + } + + // draw src image into dst image at offset (offset_x, offset_y) + static void composite(clip_image_u8 & dst, const clip_image_u8 & src, int offset_x, int offset_y) { + for (int y = 0; y < src.ny; ++y) { + for (int x = 0; x < src.nx; ++x) { + int dx = x + offset_x; + int dy = y + offset_y; + // skip pixels that would be out of bounds in the destination + if (dx < 0 || dy < 0 || dx >= dst.nx || dy >= dst.ny) { + continue; + } + size_t dst_idx = 3 * (static_cast(dy) * dst.nx + static_cast(dx)); + size_t src_idx = 3 * (static_cast(y) * src.nx + static_cast(x)); + dst.buf[dst_idx + 0] = src.buf[src_idx + 0]; + dst.buf[dst_idx + 1] = src.buf[src_idx + 1]; + dst.buf[dst_idx + 2] = src.buf[src_idx + 2]; + } + } + } + + // fill the image with a solid color + static void fill(clip_image_u8 & img, const std::array & color) { + for (size_t i = 0; i < img.buf.size(); i += 3) { + img.buf[i] = color[0]; + img.buf[i + 1] = color[1]; + img.buf[i + 2] = color[2]; + } + } + +private: // Bilinear resize function - static void bilinear_resize(const clip_image_u8& src, clip_image_u8& dst, int target_width, int target_height) { + static void resize_bilinear(const clip_image_u8 & src, clip_image_u8 & dst, int target_width, int target_height) { dst.nx = target_width; dst.ny = target_height; dst.buf.resize(3 * target_width * target_height); @@ -3437,7 +3620,7 @@ struct image_manipulation { // Bicubic resize function // part of image will be cropped if the aspect ratio is different - static bool bicubic_resize(const clip_image_u8 & img, clip_image_u8 & dst, int target_width, int target_height) { + static bool resize_bicubic(const clip_image_u8 & img, clip_image_u8 & dst, int target_width, int target_height) { const int nx = img.nx; const int ny = img.ny; @@ -3500,93 +3683,6 @@ struct image_manipulation { return true; } - // llava-1.6 type of resize_and_pad - // if the ratio is not 1:1, padding with pad_color will be applied - // pad_color is single channel, default is 0 (black) - static void resize_and_pad_image(const clip_image_u8 & image, clip_image_u8 & dst, const clip_image_size & target_resolution, std::array pad_color = {0, 0, 0}) { - int target_width = target_resolution.width; - int target_height = target_resolution.height; - - float scale_w = static_cast(target_width) / image.nx; - float scale_h = static_cast(target_height) / image.ny; - - int new_width, new_height; - - if (scale_w < scale_h) { - new_width = target_width; - new_height = std::min(static_cast(std::ceil(image.ny * scale_w)), target_height); - } else { - new_height = target_height; - new_width = std::min(static_cast(std::ceil(image.nx * scale_h)), target_width); - } - - clip_image_u8 resized_image; - bicubic_resize(image, resized_image, new_width, new_height); - - clip_image_u8 padded_image; - padded_image.nx = target_width; - padded_image.ny = target_height; - padded_image.buf.resize(3 * target_width * target_height); - - // Fill the padded image with the fill color - for (size_t i = 0; i < padded_image.buf.size(); i += 3) { - padded_image.buf[i] = pad_color[0]; - padded_image.buf[i + 1] = pad_color[1]; - padded_image.buf[i + 2] = pad_color[2]; - } - - // Calculate padding offsets - int pad_x = (target_width - new_width) / 2; - int pad_y = (target_height - new_height) / 2; - - // Copy the resized image into the center of the padded buffer - for (int y = 0; y < new_height; ++y) { - for (int x = 0; x < new_width; ++x) { - for (int c = 0; c < 3; ++c) { - padded_image.buf[3 * ((y + pad_y) * target_width + (x + pad_x)) + c] = resized_image.buf[3 * (y * new_width + x) + c]; - } - } - } - dst = std::move(padded_image); - } - - static void crop_image(const clip_image_u8 & image, clip_image_u8 & dst, int x, int y, int w, int h) { - dst.nx = w; - dst.ny = h; - dst.buf.resize(3 * w * h); - - for (int i = 0; i < h; ++i) { - for (int j = 0; j < w; ++j) { - int src_idx = 3 * ((y + i)*image.nx + (x + j)); - int dst_idx = 3 * (i*w + j); - dst.buf[dst_idx] = image.buf[src_idx]; - dst.buf[dst_idx + 1] = image.buf[src_idx + 1]; - dst.buf[dst_idx + 2] = image.buf[src_idx + 2]; - } - } - } - - // calculate the size of the **resized** image, while preserving the aspect ratio - // the calculated size will be aligned to the nearest multiple of align_size - // if H or W size is larger than max_dimension, it will be resized to max_dimension - static clip_image_size calc_size_preserved_ratio(const clip_image_size & inp_size, const int align_size, const int max_dimension) { - if (inp_size.width <= 0 || inp_size.height <= 0 || align_size <= 0 || max_dimension <= 0) { - return {0, 0}; - } - - float scale = std::min(static_cast(max_dimension) / inp_size.width, - static_cast(max_dimension) / inp_size.height); - - float target_width_f = static_cast(inp_size.width) * scale; - float target_height_f = static_cast(inp_size.height) * scale; - - int aligned_width = CLIP_ALIGN((int)target_width_f, align_size); - int aligned_height = CLIP_ALIGN((int)target_height_f, align_size); - - return {aligned_width, aligned_height}; - } - -private: static inline int clip(int x, int lower, int upper) { return std::max(lower, std::min(x, upper)); } @@ -3735,10 +3831,11 @@ struct llava_uhd { static std::vector slice_image(const clip_image_u8 * img, const slice_instructions & inst) { std::vector output; + img_tool::resize_algo interpolation = img_tool::RESIZE_ALGO_BILINEAR; // TODO: make it configurable // resize to overview size clip_image_u8_ptr resized_img(clip_image_u8_init()); - image_manipulation::resize_and_pad_image(*img, *resized_img, inst.overview_size); + img_tool::resize(*img, *resized_img, inst.overview_size, interpolation); output.push_back(std::move(resized_img)); if (inst.slices.empty()) { // no slices, just return the resized image @@ -3748,9 +3845,11 @@ struct llava_uhd { // resize to refined size clip_image_u8_ptr refined_img(clip_image_u8_init()); if (inst.padding_refined) { - image_manipulation::resize_and_pad_image(*img, *refined_img, inst.refined_size); + img_tool::resize(*img, *refined_img, inst.refined_size, interpolation); } else { - image_manipulation::bilinear_resize(*img, *refined_img, inst.refined_size.width, inst.refined_size.height); + // only algo bicubic preserves the ratio; old models rely on this behavior + // TODO: do we need to support other algos here? + img_tool::resize(*img, *refined_img, inst.refined_size, img_tool::RESIZE_ALGO_BICUBIC, false); } // create slices @@ -3761,7 +3860,7 @@ struct llava_uhd { int h = slice.size.height; clip_image_u8_ptr img_slice(clip_image_u8_init()); - image_manipulation::crop_image(*refined_img, *img_slice, x, y, w, h); + img_tool::crop(*refined_img, *img_slice, x, y, w, h); output.push_back(std::move(img_slice)); } @@ -3896,208 +3995,211 @@ struct llava_uhd { // res_imgs memory is being allocated here, previous allocations will be freed if found bool clip_image_preprocess(struct clip_ctx * ctx, const clip_image_u8 * img, struct clip_image_f32_batch * res_imgs) { clip_image_size original_size{img->nx, img->ny}; - bool pad_to_square = true; auto & params = ctx->model.hparams; - // The model config actually contains all we need to decide on how to preprocess, here we automatically switch to the new llava-1.6 preprocessing - if (params.mm_patch_merge_type == PATCH_MERGE_SPATIAL_UNPAD) { - pad_to_square = false; - } - if (clip_is_minicpmv(ctx)) { - auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); - std::vector imgs = llava_uhd::slice_image(img, inst); + switch (ctx->proj_type()) { + case PROJECTOR_TYPE_MINICPMV: + { + auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); + std::vector imgs = llava_uhd::slice_image(img, inst); + + for (size_t i = 0; i < imgs.size(); ++i) { + // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); + } - for (size_t i = 0; i < imgs.size(); ++i) { - // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - } + res_imgs->grid_x = inst.grid_size.width; + res_imgs->grid_y = inst.grid_size.height; + } break; - res_imgs->grid_x = inst.grid_size.width; - res_imgs->grid_y = inst.grid_size.height; - return true; + case PROJECTOR_TYPE_QWEN2VL: + case PROJECTOR_TYPE_QWEN25VL: + case PROJECTOR_TYPE_QWEN3VL: + { + // step 1: make a blank canvas which aligns to the grid + clip_image_u8 resized; + const clip_image_size new_size = img_tool::calc_size_preserved_ratio( + original_size, + params.patch_size * 2, + params.image_min_pixels, + params.image_max_pixels); + img_tool::resize(*img, resized, new_size, img_tool::RESIZE_ALGO_BILINEAR, false); + // clip_image_save_to_bmp(resized, "preproc.bmp"); + clip_image_f32_ptr img_f32(clip_image_f32_init()); + // clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(resized, *img_f32, params.image_mean, params.image_std); + // res_imgs->data[0] = *res; + res_imgs->entries.push_back(std::move(img_f32)); + } break; - } else if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { - clip_image_u8 resized; - auto patch_size = params.patch_size * 2; - auto new_size = image_manipulation::calc_size_preserved_ratio(original_size, patch_size, params.image_size); - image_manipulation::bicubic_resize(*img, resized, new_size.width, new_size.height); - - clip_image_f32_ptr img_f32(clip_image_f32_init()); - // clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(resized, *img_f32, params.image_mean, params.image_std); - // res_imgs->data[0] = *res; - res_imgs->entries.push_back(std::move(img_f32)); - return true; - } else if (ctx->proj_type() == PROJECTOR_TYPE_IDEFICS3) { - // The refined size has two steps: - // 1. Resize w/ aspect-ratio preserving such that the longer side is - // the preprocessor longest size - // 2. Resize w/out preserving aspect ratio such that both sides are - // multiples of image_size (always rounding up) - // - // CITE: https://github.com/huggingface/transformers/blob/main/src/transformers/models/idefics3/image_processing_idefics3.py#L737 - const clip_image_size refined_size = image_manipulation::calc_size_preserved_ratio( - original_size, params.image_size, params.preproc_image_size); - // LOG_INF("%s: original size: %d x %d, refined size: %d x %d\n", - // __func__, original_size.width, original_size.height, - // refined_size.width, refined_size.height); - - llava_uhd::slice_instructions instructions; - instructions.overview_size = clip_image_size{params.image_size, params.image_size}; - instructions.refined_size = refined_size; - instructions.grid_size = clip_image_size{ - static_cast(std::ceil(static_cast(refined_size.width) / params.image_size)), - static_cast(std::ceil(static_cast(refined_size.height) / params.image_size)), - }; - for (int y = 0; y < refined_size.height; y += params.image_size) { - for (int x = 0; x < refined_size.width; x += params.image_size) { - // LOG_INF("%s: adding slice at x=%d, y=%d\n", __func__, x, y); - instructions.slices.push_back(llava_uhd::slice_coordinates{ - /* x */x, - /* y */y, - /* size */clip_image_size{ - std::min(params.image_size, refined_size.width - x), - std::min(params.image_size, refined_size.height - y) + case PROJECTOR_TYPE_IDEFICS3: + { + // The refined size has two steps: + // 1. Resize w/ aspect-ratio preserving such that the longer side is + // the preprocessor longest size + // 2. Resize w/out preserving aspect ratio such that both sides are + // multiples of image_size (always rounding up) + // + // CITE: https://github.com/huggingface/transformers/blob/main/src/transformers/models/idefics3/image_processing_idefics3.py#L737 + const clip_image_size refined_size = img_tool::calc_size_preserved_ratio( + original_size, params.image_size, params.image_longest_edge); + // LOG_INF("%s: original size: %d x %d, refined size: %d x %d\n", + // __func__, original_size.width, original_size.height, + // refined_size.width, refined_size.height); + + llava_uhd::slice_instructions instructions; + instructions.overview_size = clip_image_size{params.image_size, params.image_size}; + instructions.refined_size = refined_size; + instructions.grid_size = clip_image_size{ + static_cast(std::ceil(static_cast(refined_size.width) / params.image_size)), + static_cast(std::ceil(static_cast(refined_size.height) / params.image_size)), + }; + for (int y = 0; y < refined_size.height; y += params.image_size) { + for (int x = 0; x < refined_size.width; x += params.image_size) { + // LOG_INF("%s: adding slice at x=%d, y=%d\n", __func__, x, y); + instructions.slices.push_back(llava_uhd::slice_coordinates{ + /* x */x, + /* y */y, + /* size */clip_image_size{ + std::min(params.image_size, refined_size.width - x), + std::min(params.image_size, refined_size.height - y) + } + }); } - }); - } - } - auto imgs = llava_uhd::slice_image(img, instructions); - - // cast and normalize to f32 - for (size_t i = 0; i < imgs.size(); ++i) { - // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - } - - res_imgs->grid_x = instructions.grid_size.width; - res_imgs->grid_y = instructions.grid_size.height; - return true; - } else if (ctx->proj_type() == PROJECTOR_TYPE_GLM_EDGE - || ctx->proj_type() == PROJECTOR_TYPE_GEMMA3 - || ctx->proj_type() == PROJECTOR_TYPE_INTERNVL // TODO @ngxson : support dynamic resolution - ) { - clip_image_u8 resized_image; - int sz = params.image_size; - image_manipulation::resize_and_pad_image(*img, resized_image, {sz, sz}); - clip_image_f32_ptr img_f32(clip_image_f32_init()); - //clip_image_save_to_bmp(resized_image, "resized.bmp"); - normalize_image_u8_to_f32(resized_image, *img_f32, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(img_f32)); - return true; - - } else if (ctx->proj_type() == PROJECTOR_TYPE_PIXTRAL - || ctx->proj_type() == PROJECTOR_TYPE_LIGHTONOCR - ) { - clip_image_u8 resized_image; - auto new_size = image_manipulation::calc_size_preserved_ratio(original_size, params.patch_size, params.image_size); - image_manipulation::bilinear_resize(*img, resized_image, new_size.width, new_size.height); - clip_image_f32_ptr img_f32(clip_image_f32_init()); - normalize_image_u8_to_f32(resized_image, *img_f32, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(img_f32)); - return true; - - } else if (ctx->proj_type() == PROJECTOR_TYPE_LLAMA4) { - GGML_ASSERT(!params.image_res_candidates.empty()); - auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); - std::vector imgs = llava_uhd::slice_image(img, inst); - - for (size_t i = 0; i < imgs.size(); ++i) { - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - } - - res_imgs->grid_x = inst.grid_size.width; - res_imgs->grid_y = inst.grid_size.height; - return true; - - } else if ( ctx->proj_type() == PROJECTOR_TYPE_LFM2 - || ctx->proj_type() == PROJECTOR_TYPE_KIMIVL - ) { - GGML_ASSERT(params.proj_scale_factor); + } + auto imgs = llava_uhd::slice_image(img, instructions); + + // cast and normalize to f32 + for (size_t i = 0; i < imgs.size(); ++i) { + // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); + } - // smart resize - const int width = img->nx; - const int height = img->ny; - const int total_factor = params.patch_size * params.proj_scale_factor; - constexpr int min_image_tokens = 64; - constexpr int max_image_tokens = 1024; - const float min_pixels = min_image_tokens * total_factor * total_factor; - const float max_pixels = max_image_tokens * total_factor * total_factor; + res_imgs->grid_x = instructions.grid_size.width; + res_imgs->grid_y = instructions.grid_size.height; + } break; - auto round_by_factor = [f = total_factor](float x) { return static_cast(std::nearbyintf(x / static_cast(f))) * f; }; - auto ceil_by_factor = [f = total_factor](float x) { return static_cast(std::ceil(x / static_cast(f))) * f; }; - auto floor_by_factor = [f = total_factor](float x) { return static_cast(std::floor(x / static_cast(f))) * f; }; + case PROJECTOR_TYPE_GLM_EDGE: + case PROJECTOR_TYPE_GEMMA3: + case PROJECTOR_TYPE_INTERNVL: // TODO @ngxson : support dynamic resolution + { + clip_image_u8 resized_image; + int sz = params.image_size; + img_tool::resize(*img, resized_image, {sz, sz}, img_tool::RESIZE_ALGO_BILINEAR); + clip_image_f32_ptr img_f32(clip_image_f32_init()); + //clip_image_save_to_bmp(resized_image, "resized.bmp"); + normalize_image_u8_to_f32(resized_image, *img_f32, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(img_f32)); + } break; - int h_bar = std::max(total_factor, round_by_factor(height)); - int w_bar = std::max(total_factor, round_by_factor(width)); + case PROJECTOR_TYPE_PIXTRAL: + case PROJECTOR_TYPE_LIGHTONOCR: + { + GGML_ASSERT(params.image_min_pixels && params.image_max_pixels); + clip_image_u8 resized_image; + // the original pixtral model doesn't have n_merge + const int cur_merge = params.n_merge == 0 ? 1 : params.n_merge; + const clip_image_size target_size = img_tool::calc_size_preserved_ratio( + original_size, + params.patch_size * cur_merge, + params.image_min_pixels, + params.image_max_pixels); + img_tool::resize(*img, resized_image, target_size, img_tool::RESIZE_ALGO_BILINEAR); + clip_image_f32_ptr img_f32(clip_image_f32_init()); + normalize_image_u8_to_f32(resized_image, *img_f32, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(img_f32)); + } break; - if (h_bar * w_bar > max_pixels) { - const auto beta = std::sqrt((height * width) / max_pixels); - h_bar = std::max(total_factor, floor_by_factor(height / beta)); - w_bar = std::max(total_factor, floor_by_factor(width / beta)); - } else if (h_bar * w_bar < min_pixels) { - const auto beta = std::sqrt(min_pixels / (height * width)); - h_bar = ceil_by_factor(height * beta); - w_bar = ceil_by_factor(width * beta); - } + case PROJECTOR_TYPE_LLAMA4: + { + GGML_ASSERT(!params.image_res_candidates.empty()); + auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); + std::vector imgs = llava_uhd::slice_image(img, inst); + + for (size_t i = 0; i < imgs.size(); ++i) { + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); + } - const std::array pad_color = {122, 116, 104}; + res_imgs->grid_x = inst.grid_size.width; + res_imgs->grid_y = inst.grid_size.height; + } break; - clip_image_u8 resized_img; - image_manipulation::resize_and_pad_image(*img, resized_img, clip_image_size{w_bar, h_bar}, pad_color); - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(resized_img, *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - return true; - } + case PROJECTOR_TYPE_LFM2: + case PROJECTOR_TYPE_KIMIVL: + { + GGML_ASSERT(params.image_min_pixels && params.image_max_pixels); + const clip_image_size target_size = img_tool::calc_size_preserved_ratio( + original_size, + params.patch_size * params.n_merge, + params.image_min_pixels, + params.image_max_pixels); + const std::array pad_color = {122, 116, 104}; + + clip_image_u8 resized_img; + img_tool::resize(*img, resized_img, target_size, img_tool::RESIZE_ALGO_BILINEAR, true, pad_color); + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(resized_img, *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); + } break; - // the logic below is to pad the shorter side to the longer side with a background color: rgb(122, 116, 104) - // see https://github.com/haotian-liu/LLaVA/blob/e854a2bf85118c504f6f16bf5c3c7c92f8fa8c6b/llava/conversation.py#L113-L156 + case PROJECTOR_TYPE_MLP: + case PROJECTOR_TYPE_MLP_NORM: + case PROJECTOR_TYPE_LDP: + case PROJECTOR_TYPE_LDPV2: + case PROJECTOR_TYPE_COGVLM: // TODO @ngxson : is this correct for cogvlm? + { + // TODO @ngxson : refactor the code below to avoid duplicated logic - clip_image_u8_ptr temp(clip_image_u8_init()); // we will keep the input image data here temporarily + // the logic below is to pad the shorter side to the longer side with a background color: rgb(122, 116, 104) + // see https://github.com/haotian-liu/LLaVA/blob/e854a2bf85118c504f6f16bf5c3c7c92f8fa8c6b/llava/conversation.py#L113-L156 - if (pad_to_square) { - // for llava-1.5, we resize image to a square, and pad the shorter side with a background color - // see https://github.com/haotian-liu/LLaVA/blob/e854a2bf85118c504f6f16bf5c3c7c92f8fa8c6b/llava/conversation.py#L113-L156 - const int longer_side = std::max(img->nx, img->ny); - temp->nx = longer_side; - temp->ny = longer_side; - temp->buf.resize(3 * longer_side * longer_side); + clip_image_u8_ptr temp(clip_image_u8_init()); // we will keep the input image data here temporarily - // background color in RGB from LLaVA (this is the mean rgb color * 255) - const std::array pad_color = {122, 116, 104}; + // The model config actually contains all we need to decide on how to preprocess, here we automatically switch to the new llava-1.6 preprocessing + if (params.image_res_candidates.empty()) { // pad_to_square + // for llava-1.5, we resize image to a square, and pad the shorter side with a background color + // see https://github.com/haotian-liu/LLaVA/blob/e854a2bf85118c504f6f16bf5c3c7c92f8fa8c6b/llava/conversation.py#L113-L156 + const int longer_side = std::max(img->nx, img->ny); + temp->nx = longer_side; + temp->ny = longer_side; + temp->buf.resize(3 * longer_side * longer_side); - // resize the image to the target_size - image_manipulation::resize_and_pad_image(*img, *temp, clip_image_size{params.image_size, params.image_size}, pad_color); + // background color in RGB from LLaVA (this is the mean rgb color * 255) + const std::array pad_color = {122, 116, 104}; - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(*temp, *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - return true; + // resize the image to the target_size + img_tool::resize(*img, *temp, clip_image_size{params.image_size, params.image_size}, img_tool::RESIZE_ALGO_BILINEAR, true, pad_color); - } else if (!params.image_res_candidates.empty()) { - // "spatial_unpad" with "anyres" processing for llava-1.6 - auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); - std::vector imgs = llava_uhd::slice_image(img, inst); + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(*temp, *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); - for (size_t i = 0; i < imgs.size(); ++i) { - // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); - clip_image_f32_ptr res(clip_image_f32_init()); - normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); - res_imgs->entries.push_back(std::move(res)); - } + } else { + // "spatial_unpad" with "anyres" processing for llava-1.6 + auto const inst = llava_uhd::get_slice_instructions(ctx, original_size); + std::vector imgs = llava_uhd::slice_image(img, inst); + + for (size_t i = 0; i < imgs.size(); ++i) { + // clip_image_save_to_bmp(*imgs[i], "slice_" + std::to_string(i) + ".bmp"); + clip_image_f32_ptr res(clip_image_f32_init()); + normalize_image_u8_to_f32(*imgs[i], *res, params.image_mean, params.image_std); + res_imgs->entries.push_back(std::move(res)); + } + } + } break; - return true; - } else { - GGML_ABORT("Unknown image preprocessing type"); + default: + LOG_ERR("%s: unsupported projector type %d\n", __func__, ctx->proj_type()); + return false; } + return true; } ggml_tensor * clip_get_newline_tensor(const struct clip_ctx * ctx) { @@ -4145,7 +4247,7 @@ int clip_n_output_tokens_x(const struct clip_ctx * ctx, struct clip_image_f32 * const auto & params = ctx->model.hparams; const int n_total = clip_n_output_tokens(ctx, img); if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { - return img->nx / (params.patch_size * 2) + (int)(img->nx % params.patch_size > 0); + return img->nx / (params.patch_size * 2); } return n_total; } @@ -4153,7 +4255,7 @@ int clip_n_output_tokens_x(const struct clip_ctx * ctx, struct clip_image_f32 * int clip_n_output_tokens_y(const struct clip_ctx * ctx, struct clip_image_f32 * img) { const auto & params = ctx->model.hparams; if (ctx->proj_type() == PROJECTOR_TYPE_QWEN2VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN25VL || ctx->proj_type() == PROJECTOR_TYPE_QWEN3VL) { - return img->ny / (params.patch_size * 2) + (int)(img->ny % params.patch_size > 0); + return img->ny / (params.patch_size * 2); } return 1; } @@ -4211,9 +4313,8 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_QWEN3VL: { // dynamic size (2 conv, so double patch size) - int patch_size = params.patch_size * 2; - int x_patch = img->nx / patch_size + (int)(img->nx % patch_size > 0); - int y_patch = img->ny / patch_size + (int)(img->ny % patch_size > 0); + int x_patch = img->nx / (params.patch_size * 2); + int y_patch = img->ny / (params.patch_size * 2); n_patches = x_patch * y_patch; } break; case PROJECTOR_TYPE_GEMMA3: @@ -4222,15 +4323,14 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_LLAMA4: { // both X and Y are downscaled by the scale factor - int scale_factor = ctx->model.hparams.proj_scale_factor; + int scale_factor = ctx->model.hparams.n_merge; n_patches /= (scale_factor * scale_factor); } break; case PROJECTOR_TYPE_LFM2: case PROJECTOR_TYPE_KIMIVL: { // dynamic size - int scale_factor = ctx->model.hparams.proj_scale_factor; - int out_patch_size = params.patch_size * scale_factor; + int out_patch_size = params.patch_size * ctx->model.hparams.n_merge; int x_patch = CLIP_ALIGN(img->nx, out_patch_size) / out_patch_size; int y_patch = CLIP_ALIGN(img->ny, out_patch_size) / out_patch_size; n_patches = x_patch * y_patch; @@ -4239,7 +4339,7 @@ int clip_n_output_tokens(const struct clip_ctx * ctx, struct clip_image_f32 * im case PROJECTOR_TYPE_LIGHTONOCR: { // dynamic size - int n_merge = params.spatial_merge_size; + int n_merge = ctx->model.hparams.n_merge; int n_patches_x = img->nx / patch_size / (n_merge > 0 ? n_merge : 1); int n_patches_y = img->ny / patch_size / (n_merge > 0 ? n_merge : 1); if (ctx->model.token_embd_img_break) { From dd5e8cab512c7752392b6e51a6f118f348fb3f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Sat, 1 Nov 2025 16:52:17 +0100 Subject: [PATCH 050/185] vendor : update cpp-httplib to 0.27.0 (#16846) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- vendor/cpp-httplib/httplib.h | 268 +++++++++++++++++++++++++++-------- 1 file changed, 211 insertions(+), 57 deletions(-) diff --git a/vendor/cpp-httplib/httplib.h b/vendor/cpp-httplib/httplib.h index db55d07e253..b76a17d07ac 100644 --- a/vendor/cpp-httplib/httplib.h +++ b/vendor/cpp-httplib/httplib.h @@ -8,8 +8,8 @@ #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.26.0" -#define CPPHTTPLIB_VERSION_NUM "0x001A00" +#define CPPHTTPLIB_VERSION "0.27.0" +#define CPPHTTPLIB_VERSION_NUM "0x001B00" /* * Platform compatibility check @@ -1052,6 +1052,9 @@ class RegexMatcher final : public MatcherBase { ssize_t write_headers(Stream &strm, const Headers &headers); +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl); + } // namespace detail class Server { @@ -1129,6 +1132,8 @@ class Server { Server & set_header_writer(std::function const &writer); + Server &set_trusted_proxies(const std::vector &proxies); + Server &set_keep_alive_max_count(size_t count); Server &set_keep_alive_timeout(time_t sec); @@ -1167,6 +1172,9 @@ class Server { const std::function &setup_request); std::atomic svr_sock_{INVALID_SOCKET}; + + std::vector trusted_proxies_; + size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; time_t read_timeout_sec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND; @@ -1719,8 +1727,6 @@ class ClientImpl { const std::string &boundary, const UploadFormDataItems &items, const FormDataProviderItems &provider_items) const; - std::string adjust_host_string(const std::string &host) const; - virtual bool process_socket(const Socket &socket, std::chrono::time_point start_time, @@ -1953,14 +1959,17 @@ class SSLServer : public Server { void update_certs(X509 *cert, EVP_PKEY *private_key, X509_STORE *client_ca_cert_store = nullptr); + int ssl_last_error() const { return last_ssl_error_; } + private: bool process_and_close_socket(socket_t sock) override; + STACK_OF(X509_NAME) * extract_ca_names_from_x509_store(X509_STORE *store); + SSL_CTX *ctx_; std::mutex ctx_mutex_; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + int last_ssl_error_ = 0; -#endif }; class SSLClient final : public ClientImpl { @@ -4596,13 +4605,35 @@ inline bool zstd_decompressor::decompress(const char *data, size_t data_length, } #endif +inline bool is_prohibited_header_name(const std::string &name) { + using udl::operator""_t; + + switch (str2tag(name)) { + case "REMOTE_ADDR"_t: + case "REMOTE_PORT"_t: + case "LOCAL_ADDR"_t: + case "LOCAL_PORT"_t: return true; + default: return false; + } +} + inline bool has_header(const Headers &headers, const std::string &key) { + if (is_prohibited_header_name(key)) { return false; } return headers.find(key) != headers.end(); } inline const char *get_header_value(const Headers &headers, const std::string &key, const char *def, size_t id) { + if (is_prohibited_header_name(key)) { +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "Prohibited header name '" + key + "' is specified."; + throw std::invalid_argument(msg); +#else + return ""; +#endif + } + auto rng = headers.equal_range(key); auto it = rng.first; std::advance(it, static_cast(id)); @@ -7261,6 +7292,30 @@ inline bool RegexMatcher::match(Request &request) const { return std::regex_match(request.path, request.matches, regex_); } +inline std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl) { + std::string result; + + // Enclose IPv6 address in brackets (but not if already enclosed) + if (host.find(':') == std::string::npos || + (!host.empty() && host[0] == '[')) { + // IPv4, hostname, or already bracketed IPv6 + result = host; + } else { + // IPv6 address without brackets + result = "[" + host + "]"; + } + + // Append port if not default + if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { + ; // do nothing + } else { + result += ":" + std::to_string(port); + } + + return result; +} + } // namespace detail // HTTP server implementation @@ -7473,6 +7528,12 @@ inline Server &Server::set_header_writer( return *this; } +inline Server & +Server::set_trusted_proxies(const std::vector &proxies) { + trusted_proxies_ = proxies; + return *this; +} + inline Server &Server::set_keep_alive_max_count(size_t count) { keep_alive_max_count_ = count; return *this; @@ -8261,6 +8322,40 @@ inline bool Server::dispatch_request_for_content_reader( return false; } +inline std::string +get_client_ip(const std::string &x_forwarded_for, + const std::vector &trusted_proxies) { + // X-Forwarded-For is a comma-separated list per RFC 7239 + std::vector ip_list; + detail::split(x_forwarded_for.data(), + x_forwarded_for.data() + x_forwarded_for.size(), ',', + [&](const char *b, const char *e) { + auto r = detail::trim(b, e, 0, static_cast(e - b)); + ip_list.emplace_back(std::string(b + r.first, b + r.second)); + }); + + for (size_t i = 0; i < ip_list.size(); ++i) { + auto ip = ip_list[i]; + + auto is_trusted_proxy = + std::any_of(trusted_proxies.begin(), trusted_proxies.end(), + [&](const std::string &proxy) { return ip == proxy; }); + + if (is_trusted_proxy) { + if (i == 0) { + // If the trusted proxy is the first IP, there's no preceding client IP + return ip; + } else { + // Return the IP immediately before the trusted proxy + return ip_list[i - 1]; + } + } + } + + // If no trusted proxy is found, return the first IP in the list + return ip_list.front(); +} + inline bool Server::process_request(Stream &strm, const std::string &remote_addr, int remote_port, const std::string &local_addr, @@ -8324,15 +8419,16 @@ Server::process_request(Stream &strm, const std::string &remote_addr, connection_closed = true; } - req.remote_addr = remote_addr; + if (!trusted_proxies_.empty() && req.has_header("X-Forwarded-For")) { + auto x_forwarded_for = req.get_header_value("X-Forwarded-For"); + req.remote_addr = get_client_ip(x_forwarded_for, trusted_proxies_); + } else { + req.remote_addr = remote_addr; + } req.remote_port = remote_port; - req.set_header("REMOTE_ADDR", req.remote_addr); - req.set_header("REMOTE_PORT", std::to_string(req.remote_port)); req.local_addr = local_addr; req.local_port = local_port; - req.set_header("LOCAL_ADDR", req.local_addr); - req.set_header("LOCAL_PORT", std::to_string(req.local_port)); if (req.has_header("Accept")) { const auto &accept_header = req.get_header_value("Accept"); @@ -8522,7 +8618,7 @@ inline ClientImpl::ClientImpl(const std::string &host, int port, const std::string &client_cert_path, const std::string &client_key_path) : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), - host_and_port_(adjust_host_string(host_) + ":" + std::to_string(port)), + host_and_port_(detail::make_host_and_port_string(host_, port, is_ssl())), client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} inline ClientImpl::~ClientImpl() { @@ -8703,8 +8799,9 @@ inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { { std::lock_guard guard(socket_mutex_); - // Set this to false immediately - if it ever gets set to true by the end of - // the request, we know another thread instructed us to close the socket. + // Set this to false immediately - if it ever gets set to true by the end + // of the request, we know another thread instructed us to close the + // socket. socket_should_be_closed_when_request_is_done_ = false; auto is_alive = false; @@ -8720,10 +8817,10 @@ inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { #endif if (!is_alive) { - // Attempt to avoid sigpipe by shutting down non-gracefully if it seems - // like the other side has already closed the connection Also, there - // cannot be any requests in flight from other threads since we locked - // request_mutex_, so safe to close everything immediately + // Attempt to avoid sigpipe by shutting down non-gracefully if it + // seems like the other side has already closed the connection Also, + // there cannot be any requests in flight from other threads since we + // locked request_mutex_, so safe to close everything immediately const bool shutdown_gracefully = false; shutdown_ssl(socket_, shutdown_gracefully); shutdown_socket(socket_); @@ -9027,7 +9124,8 @@ inline bool ClientImpl::create_redirect_client( } } -// New method for robust client setup (based on basic_manual_redirect.cpp logic) +// New method for robust client setup (based on basic_manual_redirect.cpp +// logic) template inline void ClientImpl::setup_redirect_client(ClientType &client) { // Copy basic settings first @@ -9131,18 +9229,8 @@ inline bool ClientImpl::write_request(Stream &strm, Request &req, // curl behavior) if (address_family_ == AF_UNIX) { req.set_header("Host", "localhost"); - } else if (is_ssl()) { - if (port_ == 443) { - req.set_header("Host", host_); - } else { - req.set_header("Host", host_and_port_); - } } else { - if (port_ == 80) { - req.set_header("Host", host_); - } else { - req.set_header("Host", host_and_port_); - } + req.set_header("Host", host_and_port_); } } @@ -9409,12 +9497,6 @@ inline Result ClientImpl::send_with_content_provider( #endif } -inline std::string -ClientImpl::adjust_host_string(const std::string &host) const { - if (host.find(':') != std::string::npos) { return "[" + host + "]"; } - return host; -} - inline void ClientImpl::output_log(const Request &req, const Response &res) const { if (logger_) { @@ -9538,8 +9620,8 @@ inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( const FormDataProviderItems &provider_items) const { size_t cur_item = 0; size_t cur_start = 0; - // cur_item and cur_start are copied to within the std::function and maintain - // state between successive calls + // cur_item and cur_start are copied to within the std::function and + // maintain state between successive calls return [&, cur_item, cur_start](size_t offset, DataSink &sink) mutable -> bool { if (!offset && !items.empty()) { @@ -10251,8 +10333,8 @@ inline void ClientImpl::stop() { // If there is anything ongoing right now, the ONLY thread-safe thing we can // do is to shutdown_socket, so that threads using this socket suddenly // discover they can't read/write any more and error out. Everything else - // (closing the socket, shutting ssl down) is unsafe because these actions are - // not thread-safe. + // (closing the socket, shutting ssl down) is unsafe because these actions + // are not thread-safe. if (socket_requests_in_flight_ > 0) { shutdown_socket(socket_); @@ -10705,6 +10787,19 @@ inline SSLServer::SSLServer(const char *cert_path, const char *private_key_path, SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, client_ca_cert_dir_path); + // Set client CA list to be sent to clients during TLS handshake + if (client_ca_cert_file_path) { + auto ca_list = SSL_load_client_CA_file(client_ca_cert_file_path); + if (ca_list != nullptr) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to load client CA list, but we continue since + // SSL_CTX_load_verify_locations already succeeded and + // certificate verification will still work + last_ssl_error_ = static_cast(ERR_get_error()); + } + } + SSL_CTX_set_verify( ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); } @@ -10729,6 +10824,15 @@ inline SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, } else if (client_ca_cert_store) { SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + // Extract CA names from the store and set them as the client CA list + auto ca_list = extract_ca_names_from_x509_store(client_ca_cert_store); + if (ca_list) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to extract CA names, record the error + last_ssl_error_ = static_cast(ERR_get_error()); + } + SSL_CTX_set_verify( ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); } @@ -10809,6 +10913,44 @@ inline bool SSLServer::process_and_close_socket(socket_t sock) { return ret; } +inline STACK_OF(X509_NAME) * SSLServer::extract_ca_names_from_x509_store( + X509_STORE *store) { + if (!store) { return nullptr; } + + auto ca_list = sk_X509_NAME_new_null(); + if (!ca_list) { return nullptr; } + + // Get all objects from the store + auto objs = X509_STORE_get0_objects(store); + if (!objs) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + // Iterate through objects and extract certificate subject names + for (int i = 0; i < sk_X509_OBJECT_num(objs); i++) { + auto obj = sk_X509_OBJECT_value(objs, i); + if (X509_OBJECT_get_type(obj) == X509_LU_X509) { + auto cert = X509_OBJECT_get0_X509(obj); + if (cert) { + auto subject = X509_get_subject_name(cert); + if (subject) { + auto name_dup = X509_NAME_dup(subject); + if (name_dup) { sk_X509_NAME_push(ca_list, name_dup); } + } + } + } + } + + // If no names were extracted, free the list and return nullptr + if (sk_X509_NAME_num(ca_list) == 0) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + return ca_list; +} + // SSL HTTP client implementation inline SSLClient::SSLClient(const std::string &host) : SSLClient(host, 443, std::string(), std::string()) {} @@ -10889,7 +11031,8 @@ inline void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { if (ca_cert_store) { if (ctx_) { if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { - // Free memory allocated for old cert and use new store `ca_cert_store` + // Free memory allocated for old cert and use new store + // `ca_cert_store` SSL_CTX_set_cert_store(ctx_, ca_cert_store); ca_cert_store_ = ca_cert_store; } @@ -10911,10 +11054,15 @@ inline long SSLClient::get_openssl_verify_result() const { inline SSL_CTX *SSLClient::ssl_context() const { return ctx_; } inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { - return is_valid() && ClientImpl::create_and_connect_socket(socket, error); + if (!is_valid()) { + error = Error::SSLConnection; + return false; + } + return ClientImpl::create_and_connect_socket(socket, error); } -// Assumes that socket_mutex_ is locked and that there are no requests in flight +// Assumes that socket_mutex_ is locked and that there are no requests in +// flight inline bool SSLClient::connect_with_proxy( Socket &socket, std::chrono::time_point start_time, @@ -11128,6 +11276,11 @@ inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { return true; } + if (ctx_ == nullptr) { + error = Error::SSLConnection; + last_openssl_error_ = ERR_get_error(); + } + shutdown_socket(socket); close_socket(socket); return false; @@ -11221,21 +11374,22 @@ SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { for (decltype(count) i = 0; i < count && !dsn_matched; i++) { auto val = sk_GENERAL_NAME_value(alt_names, i); - if (val->type == type) { - auto name = - reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); - auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); - - switch (type) { - case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; - - case GEN_IPADD: - if (!memcmp(&addr6, name, addr_len) || - !memcmp(&addr, name, addr_len)) { - ip_matched = true; - } - break; + if (!val || val->type != type) { continue; } + + auto name = + reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); + if (name == nullptr) { continue; } + + auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); + + switch (type) { + case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; + + case GEN_IPADD: + if (!memcmp(&addr6, name, addr_len) || !memcmp(&addr, name, addr_len)) { + ip_matched = true; } + break; } } From e4a71599e5846110159955dec0008eb4aa24222b Mon Sep 17 00:00:00 2001 From: Pascal Date: Sat, 1 Nov 2025 17:14:54 +0100 Subject: [PATCH 051/185] webui: add HTML/JS preview support to MarkdownContent with sandboxed iframe (#16757) * webui: add HTML/JS preview support to MarkdownContent with sandboxed iframe dialog Extended MarkdownContent to flag previewable code languages, add a preview button alongside copy controls, manage preview dialog state, and share styling for the new button group Introduced CodePreviewDialog.svelte, a sandboxed iframe modal for rendering HTML/JS previews with consistent dialog controls * webui: fullscreen HTML preview dialog using bits-ui * Update tools/server/webui/src/lib/components/app/misc/CodePreviewDialog.svelte Co-authored-by: Aleksander Grygier * Update tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte Co-authored-by: Aleksander Grygier * webui: pedantic style tweak for CodePreviewDialog close button * webui: remove overengineered preview language logic * chore: update webui static build --------- Co-authored-by: Aleksander Grygier --- tools/server/public/index.html.gz | Bin 861835 -> 861777 bytes .../app/misc/CodePreviewDialog.svelte | 93 +++++++++ .../app/misc/MarkdownContent.svelte | 180 +++++++++++++----- 3 files changed, 230 insertions(+), 43 deletions(-) create mode 100644 tools/server/webui/src/lib/components/app/misc/CodePreviewDialog.svelte diff --git a/tools/server/public/index.html.gz b/tools/server/public/index.html.gz index a81bae04d1983d992a4b46da93153d1cfa63c704..501fa455a24169b1c00bb2ebe056c3719b4ce1e8 100644 GIT binary patch delta 822429 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ℜ2NQ6yPAOBz{dqpO`qeM$Y2od1F(YB}Wv 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

    xPXP>zIU&7TlDC?(AXtp?{1X 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

    -ib3o^d1g3QwcQUJ%`v$`0P=_*Ot$_+6Ql0_D} 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%0DgE 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

    O$}jp)pa0>2{w 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

    ? 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 z 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

    L1zW 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%0ACwnt{zo1LxyN z%dS4I^0E|XF}Lzp9yZ0nnl z?ebbHeZE!!lfw42X2Y(nd7l0GW5`2D;}A~Cm*40eM)=MgZDv={L(?r%A@P>J*G@%m zuK5{UKz#O{j1Z@OM3%2}l^93bW^Yp6!TQg`e)*KM5wwA`M%Tmnrp5bZ zY_}wg4^mPN-hX#C{!MH0M;mVO9?g(07-r=6-A&k(?d}vpIt^u=`9jbUo;#8&uy1a` zl^X1zNk{|j4W2W^iWg2t}?!^o;RuX0)Nh`5JI14Eng$-O>H6sY1`7lNmCrV%X;JhZ&BCVmlm;S3dvf zYQA`M*lKq>GgWAlzbNN29nWZv^K=u>5k*aP3!h>}cXqhGjl}uA>bnW;I<0QuZ5piK ze~W&jR(~#@HF3mg4fn?f)(fv-8}jr<{W+rQ)O5)HuZ+Q+*y@C&jWSryn2Pn#c)`|dp9Y&p{%ErU_l^7w0aZhtyPAEjmOaS1Q zqaYE7I#CXF7IUcMS`Kx)M?GeFAmVFm*Qfh}5=9Se5*P>*Zj5gA#MGU1&sI-F zOf!6Lsew+9l;qjC9|dhl4^Jy7q-+0)a(5N5i5h3Z!c|nLo)6HV#k9Qg`C-W@-E@W? zNq?B5a;FSKx3zGTF-PU?gL$N7#&Axav^<7@zZM;U~N3c^5e&1+k)CWR3P|0@|6cAK|I{T9VZ-yW{@I zPFD`CU5D3;Igfs^-MOQHRSEvUBX<4mMSqVeIrvpEp`^Z&BeF8-$pH6}0f38vv3O_v zi$+)2GyGN-=@6{ka3-Pu0ve$yCO7HT^|k(Hn>Ye=NEifj_T^wC+(XKTN|z_prFzaw z!>}UQE;2QVPy*)1V@js;LtcfAj+<<1k}ewyW5Rp+-U*JZ7*8c+Pn%{3hi^=kK-(H12ztc&xW4lM7i5 zPbMOC#B2?}2WndzAkycHGe185Gk>qIYX+ypB(XN*<`hn3nFfIw!mbuZ%1c6CFma;F z&b%$sMi+>?ao;|I=WlJT1Qdy)&=2+9#yQ!6QaYr*Gk*b}dLOiIDB0ag$$ys0gbG5R z6^!)ARg&njTKkO+>R#y(aj=srtsu=P0tzN~l=H=WT8P1%Ry6Xik7uTjS4k3PKs(Lu zdFZ5*1oia6K2;q-Ld{D?3VLW5eOEsJo=3xpdN@wBDJX}CODvf?!~#Kfb|4{WNc6E- z9mSf9WmTI1mPoCLNrz4Hq<>Btk|h)s5qC0NsA6o0uUA_p#7_IwvA+rOjlj5w!##%m zUozuivrRh?l_K9 z{|vqmCL{LbvO{7Wxkj7dK9RZ$Hi2ENNG5q`Fk>2nDK}b$dxm8wUw`c^578t4nx6lA z)4_nkWv&GCVo7H2>LbhzBzLa#Y~9Ky?b5e|uq~HT`2dLf)4|w)h2+SKae+0}c?7AV zfBdpL#`xIX9wdZ+)^Y65FN^3Cp_@p*2y<#50Bu~T_h5kd_96KB7uPwa5<4+V`MNzefmX9HP`0i`$^LHTC7|0^51w}Z=eE8QFXSC%^m!8Z4;*4$87r+^gYm4umCZ%^zCx6fp)Ru->H7V}RteH0!PMbP} zoFTF%=sx&Vlv_FGVi4C`BM!yNF-SCzf+I+Eh{GaoI#he}RQ4knv1dMQZGjIGrww2$Kyy5TWM|ya2 zLQHl#)^amf9yIeUgI=aDxVzam;8$BJjXSy3ghUchMcGlAuBqfv`mTlGX~RS&+oiu# z+Ax8@`t8!M-7cZ<`eC~fT3Q*-RwOYEUH}_`w0|EMB(h-}b}FoUm7PLol6{;W)0wkZ zMO)`WrRQ{f3_j+I{w$oLoED0m9@1MeDz9Kvl>VSBn*`028fuL1?_y|S<(0!S|twz^xcP#R?;J3 zDSr_rK_n}Dj+Y@}-5-2D-X5&31_w0vs&$Rl*I}u?<`k%0KSQoY6Bo!z52^X?mPYLU z{oxFMW=t430+QPgJLI=A*PaYa{ORsXgOr7|AK*Eh1!cgCg3VP~2V#N-+D3q*F|$F0neYJYYGGJ|C8K_u9-czw@sk|4~MO7`*UC1)u% z%E&fwG@L_S@}dvkM1Mjmas~p(MN_E3ojHjjDik3_X`35sCEw5-a_pRRGEH{}JN;_# zF1%@jBEWf%SQxC6wG#epW{YM5?Lu)ioRx-$307oS+C8dtCd%PN6F%aEcljmvMt_J( zN4tLCxvz}Y!+=pUVSX7WZI<@DwQ6s<5rLk7?v{#_W66Znprwzx2FSEfOZ_&W>zSY> zqcW@*&!t%Dkz+XvDYR97jO3X}E+UL{438ig29Ct^cEa0Nhm*qtRp3w*jePfJzB@c z>3;{E!+f@5O=ga>`Zimww!M~|m^Zx;_u%Lcy?thWJ>5=E1*ztAN7(HVl*+n0&_Cfl zNjr8_XQtVMooPF|g+ZI0Vbttu4nf7x4z8ISXAde0nLVJHu_VYI%eHI0d4GvIfrM45h9)zKSdw;N774OECjo7>EM!c={xT#w<*?bigqni%bpKTTq1I4yv*;ym9m|QllQLsv}V+F zvrcbcOSkXeyUdH@2+}>gSa^SAva}~hqB|4MR}pVe|7W`+G!LbRg@0<+Ei6}Fl%wjV3UVk%PZ8J<7N59>B-R& z?|o8vuXlF&_U0FzloWiZ;z31vPN~vHiX$r;Imh1KzprC?jETWxLCI`9{Oey^G`S=- zA<3i>mNK}3$_A;v5r4|4WO5G}0ts`b&w=w|;|N7S=z|SE>@4={FP{b2S)^<;tJ7%G zoqzn$D)Rdzk{2io*nNl&Lx>KY&m1m76sAyL_HfXg78eIR`4sR`3|2pD6%GOnqsdT~ z@oB3#4zOTVkN zhV3K%W@WPX`^9;2jQ{$@3I3iOFw=nNs^e+#x%1G8siHXIm>rd&+uz#QEcoA=`v>p> zuC?{w zbQ)gcgVsiKwtqH6oFU%(nD@4LZ?Xn1+v@2_JtL`SZTO%kb*+sbjDX55**nU(10~R+ zS)A*E-pwdu5&Hs9$|_h$64YMnaR9(FOhQJ&HCs9YYdD{Onz`q6HC5g0o=247iN#8X zc}pL<>$r@hkA~F1PB9jxEBi7o^nBDk@wGgUpCAD$M1R;5*8$styqk7}BsDIv8$W)6 z9I9}FSC`pvJLs6>yGqe%;?Sh-c;o~$*Y&S`L-UDH#3m_@D=X( zn79xZfbTJB68+ z0D6T{>3<%)FrtJU5qm20qX0lDi9if~MD=!bgX({BbQ*RJKOt8oLt}5GH?7LJK)6v% ztt0xxUD1(9791=d22XT%3aDqo{I>5Y-XshQjTa2xSV-pcXnkru<-6EL+-Ev*wj#YH zM9^#e#YTboSLUltL(xQLp6$ou{2##LP3Rcf?tk6C520Z8tgjXWzN33w_hB1~7Gcg{ zl8x6MIh}%ho&9k?}K9jt0SIyaFN-LL^wgv{klxNf-cG;gR*LwY`b+ z$A57-4p1#0|904a0h}<-lyDC=W3p=<>#?RAno${6T*iwZ2621~wG<8$=ZLR-q^K|4 zPL}fCLM5O!`)xw(sT+wGpq|^%S*3QLq|?KB=Tyu<4$@Z7)T5;`8+wBXVAWA;%$-Ly z2Q@xXj7RtvBz8AgIu}1r8UdaL%&v{hIIoIF^>W~s& zIu{EM=h^Ar|F3_w@y}P+|B__|sMU4nU&-_DufNg~-y`Hv=f9fx5%54(0p7--F|{jq zROFnc9~nOAYb^fC&F}GDLx4TO-leab-8q!}SMK$%ayP$jEzT}x$g3>*W)+kZIDbn$ zgrgPEZ|$s)CoJneO$QC@yt{J`IujOUYFl=&(p*HOzjEzra&t+4?2{byc1toB}?dXg-2@&9p@(3}Zoqu+ktiN>BkQguE z=pd-OAy@;NIKx}S+;s)M8;dIeVCqJ-TizM3$?q-3#jt{@^?^o-buRw){{N0m%fzUsPxi4Cz37F zB^Zg2Pas38E=TuTNnoje?+btTo_J^ImWmt9*5>FyEUUWZ9|>2Y>j-;2DlLI)DxWL- zxtOY-ya{efOoT1d!<%Basg6?!1E+$&LdOh13zZjHV1)V59SP&e7e3-YB>PqFxQ#ACVtDPs*Tbl{_J_nl0>-%Xf3t&)Ed@gZ>#?9Rve zZ~W4SW!{}kVd{R}?GG;q`K8h+_rgCcglDNZltbC#HipnDRYvcVB&69bqXZR{M$<2^ z%2G=xk}5~sG7Qpl?3L%&(qltvK-9e%>=*>sSNcXmdueiZMu>8=UE_x+AKXh{%QQ3f zJ+oC_f}W`GC7$|_u!VohmujH0l{MJY?F57pI_juX)YG91Vp*5uMiL?Ab0hdID9&~= zc!CR57)7V)eg4Wgz#g6EZfi$pU)_di{UknxL75C)00+^eI(a zX5>*Fv?@btZpNyQnW&g4%%dDj=Dio@!A4jVT|k+3??bPNg)oYR2JxIxb-jkU6Av0k z(1bCKd%(c7#+6Ub*rj?8Va_*nnegK;yVJJ=CPU_apr~Tv z!1M*t%WE;kflD5T^l;zuiEVy2LfnK2TT(5uDM|K8KTkkfKTRG>qEfu&? z1e8+PW-)Y%((wdArs35!qcz`=t|-P0i(p68Jk_n@dN zy$XXEa8rL{Y7hlY6%*D;=L*g@#5pqVbz3Z0FA$0fF5Z`zwr>BjeGi_|<6kcZ7cv}C zd<@k>LPZRNl!eGH+=!EWsY6i0+&b@DD~tF9aa)Fk10&TlqrQ#Z}x6VT;g(` zxI~<~&}@1VeK(njH@}JSezHWZ0|*%xWa$+frp^$-NJ`~nt0UGswlkcq!T|(pe8&^S z?Jj?>oSBd!uxBYU^lz#?8SZ~_u-2JM6w3X-%1_i3FoU|poF()8e01q6f>joFy!?X@ zRea37D;jKzELL^YGqw2+BSFQQIrtSR(xIYEx0p>;)j3TWledG&q$AH`yAJ%$)R!oJ zUNQ`cjRgU?v|~|0y&=vX(Os{7uQ3`eRONqSD?8fo!K2d|)DYX)ior*@Y5;Klgeqe| zw-05kT{v5e!@#{8(hz~CjF-G+Q`%yhU{!^Kmt=xcvw zEq2*zDRd`#Dp*3-t~Gh<_gOdO`+}pb(lZRYoNvMu=C%j-Jq`S&JDUf3EDG;f`yN05 zr8`>)NmsV?M?!rm9$ny9JC+?`+I=Tdo4d9Q2na5u?U?k}LDLq*IV-KYFmo=uMEZ=P zjLL>o?gyn_MZ+R`v#67rQ-FfFWsHA~bf5Y*z%Zs@av$QBTDK!I@0!Tb8xNtF77-TL zL{U5xx$zMcLsR~Pia>A&k7!d=T~~HEy^sr+R6syf8K$1|=5q?iEO6)1CjcAoRT3GU zQmiRd|1HxLzA?p|pO7fx`qSjuN%HJT^6Wf$_9A%({a*C!hveCjb~{M_QPO{h3a-qI z$zTJfOaoD7ft1QMSLZMkqc93?SwOkD3_V`j5<{?9`2yex)DUb^X&p+`D+i0vQRNVt z`9Kmycl)Pyx|~&=YXvnsK()_V-OSDPW%rE4LDgK|;J#w_GapW? z9@=9ubd7kM;e`>y94`q|@@s#RuT)7V?lSTq;%SEC*9a7Kxi?8Qwu&@~yhtOq*{f$t zRWah!CG~)vin4r170&H{i0g$0Z}Oq9N-uXhUsSYKUb;i{M8Fy-Yv8+V1Dw!Zh}V4>(X!VvdY0mq3Qcs?F?gUno}f`PpUz zYD0S)*>0oupzMD=NgUZ;HYgywdvcm%CqHf!0OOYK!o`jFSFKiclCIiwZTX8gX!*ny zfwMwX1ezcgdG>z(1-uFvUEcyGADGCt`d>I6q(fn?p ze=8@ml?{y0%F~HESxdT?&QS_5&B8}9zPTVBsb^EFuZMq%gXsg0p#YIHpyIIwZC#|{ z3l;iC?K=?7kC<$AlGM=7iD9Se3T9XhU!{yItGViu6hmJ_DKT~zgWrapKJ~BSoeKAd zKusdV5-JJN6PXUp113gdBKBHR%9@4`m^2L!!=R@Wl(t|!@e)st7)B{K6bI^jvaUdr z_Cz;%JcJ<1PN{?pQ8&yK<5ntobm(EkrDzJJ5rfl>`_8d_XO9_0bcf+! z0pg$^^^j+Ti06-Iz2WfN=?{C)w?2LH3}5PaGG-SuY`T0XH>{!OCxwjLcyZvw_({!T zt-A4)R_sy>k}%OJmv3gN@Y!$&>kQL~j4dtV>#=_^4Kz1FszrL)$Be%6_2!J1!()LA zm)(pIz@~IdRy1k=-=Ls!`FC$ZuAh;F<)NQ=1oc#@q#Qou_ev!4MV@l$KKSGT0Q+JNP5#K{!=;Xx3JZ; zUI>Tp@Ni&JrMBnbcEFEPRgiooiAhu`35vE(SvYRnkd~S5hdI?MGe!8>T?Q*d*qPyP z;&3W)_EHs}1Fif(Ry`!J%;O?aW8y79!%ly0t=_-yZ9s7^qYnxIl`Zc?YP$?8jB9$6T6Z|nh_m^x|#pIm=# zu#Y*|&3lzIJ+29>CcgZ9lX6+o6tHP9g@Kg5gL=_`13*o>0tgDq0yHvyJ04wT3UsZ2 z24cw+nCi+L_K}9y7No;v#w1d@1FW}$J=d2Zw!KUl0`jx07KC~ziV9d27^A$jIq))E zi>nc?a<&H1nYNdOM2n1?3{wF3n~#4@Fha>^-)E5VtV6(N2A1!g2@;gOX7gIF6u$|5 zkI|;6ZZqI4moE849)Is_RN=r9jE>H}d*}~ydA{?!+pe|)!>ZSn>Q6(pXmr*JXfmR5 zAE=Ms%wIC+xgm?JfM&=76x`__rPk}~twmfA)JR#qNpBy6(sh-VLN{=xTx*J>x*n%ot$uACW z9LX-=_*22o*>?&61W|AD{$<5NKq&fR8Ysf!IB9v_+N=hrK8T zqw~=XU_S=)!N7M+Oqqk^!-I#iLhEX*TDSq066N-}4|lw9St^+EnXn)Y-pr^z(!+6N z_+tQP_@qeIQdta;5+(jhtbt)nq!8*&&8bQ02>+ME2YRxbVF-VmHYD~2MVuLRV1!1* z`4pNS4`F;YfHxu!;iqRN@O3i>zzqzXEE<%k=g)wk$*Kqv6~_m3?Rnmpx(r4}c~ZbF5uWe{b8ip1pO??tJg zeGTf?;Opikec@b^)6Ug7P^DS)n@jNnShLeUC=om^%4>gV2L}#hsk|-}c`5QbQZND+ zXlO86=qQiUj$;N2Z=Y0xHlJ!DZBu>t z@Ye%Oc~<8ionM^IFqm|s*Q-}@j(Hn`>oGq{#Jzw6MnD>6%Ti;JC|y&?I~z0QbB*oE zl*^IL1#EwW)38kbA~MM4&Q1JQJ3Q1oQNaUOzc=3`cEu`>gB^K_0eud0roCwhS48Hq z8G=nhZ5J{%a_Ch;YHvX|;%2u|96oJ}s8PWUAV|2+Rg!0IXGs-@ja9=Jd{Ad2$O1{P(nyiOMqynn4I3^>}XO_{>lT36sUWU@BuSSgX&YUH zdGcU`oR1LK4vG1uNU^?ijejisW$t4Y;LimQL+v>B$j2z);mo;~g1_ z(uwX5Ul^tl=a_0rulB;6QszQb#>%JWzezz)F=`$c6Z{V{asJQ$L8e-O+ zWvAf-aHtJE-(m4|eg4Rshgd}yeWz^Bx#dj_x}~j^u%8lf)wnE`80N?#Xgy>Md`&PUOjslcP;ppaeqDb8xUVn5ZG}I@!)J5B!#jn&T&A#>)z&4_PkED( z@KUzUPVpcd{g!PA#1~q#W-iC#En6c7n`H~gx3k|4eSJ$&v2#wg_hk#atb$mS;0a_+ zv8v|r+QXv1_6g$G9T8=68)fOm83gOMg9WE=q)fsxvAm=3^=I8nc?uC4N9=z}Z-PWX zz4_>pr_^0ON@SAvpb~KI>M>E_`wsolUp3#ic7_km)Xz&I8a_BHdETi$`%fZP5k@Ol_K@`97OS<=%7nCcX4y?Y^4d%{H)hKca)l4Li)RvyF>uhWdKBnVR zx|cW_lIX|+cDZk1IOu;{&iYBG2`$Rj!`1_M2kRCR2Dv%dfIOMRl$ZO=Ah!2z@^pAI zL>L|PE!u2bo0|^?=;Eft1(7_l9^d6uO383Av^Dt6YQ?&Rxt9kU;72x~9)myhR-9Ou z=I3>NNpnFDg z61)Ht_qi)XWSXfIhNyA!WO#yjeUHQtH^uP~x(JMu@Jg^Q8G4W3MG_>Z5+;`Lm2t~X zy$2GOefr1|C~!dDQx~J;NhP%S=C}o=D0~Grdik-QY^cfzL2tF2SlOm6?X9kwS|se1 zk?a-41|yl(Een6FHguHN3|pqaDn8jSV;~k?WAWvogY z9&~Y7`A8>>cqA{}P=0Nu#e2vk?KVbP##o4ppqt zmO&UC=gxoB5V3L76~v4OE*-pt^{|4?fr2$)bH)WMju~W*_pFS^wATMP&hePbZszfc z+(50ZJnxh4lxM(f1-74*yM?c4O^lG(qNxa=jD_9E zotePdU?neUPPLSHh(usH!ravRY8e>R_cbV}F5Q1`Ki|YZU>O;ROC4KEUhMtp_IU8nAJ zHNg%uP7VbTRH1yL?&HbPL4^rng_y5hmt1Z3!>8IBAM;m65 zgDOUkn{|D8$7>++ffBG5JIGWk z1Q)aepdr3%G>$SFgzh$aMte(%Pv1Q)wg^iUS$K#ci`Z@XiL7W_o234$TU@rN!+Yyu z&mrm0cjNXq;}$Zd?d&+ak}hNPV2;IR-y^tS@cQ0Lu3=p^zWnm~<;&~Y?D}*=N1uQ0 z*wtDD;o5LlYjXU@VL*BJ&3tg)*_h3IMLS#VPt6thrWza0HMyn?e=XORRdi#tn{ptV zI^%?}KqV2r#QSO12DdIQI>U`JS%EoqNh5{ibwE^{6ZK(C#S!rDel;@h?E%)~N$c2L z;>t`M^GzS=sU%FK@pQpE>R3gh!>WId0E!yQ^sr4hP9o6(^i>BixJmag%jq5_tMEQk zUBP**0I1WtWCt2*Bpd2JN9wpUTzmKc!Jj%_!H}pCA&~|(Vv?{APoOqrlHRg3CXK=b z8-*W5Jr}N?IqHcbk>UvgccLTWMUR6;kdJGmRO(lTMeq5yI${ppIZ? zf-V66(Bg!Rw#kV|W{wHX{LFtrQuQ;p-z|pFCv)=Pg2+GTofFl;JP@-doEI^dCkRL) zW&w&2$E)WERdLm`bpO#FL!2Ej=Y6nM$DMQFDq#O&msFW?yejv)+o$ly!iw|4pVlXO z6f?%>YKBe-HKYHXi`6Zy8((R9l3Ti>O|b)u{^udwe)csVc-Ko1y<2~yf~gWs0hzU> zd=Q#!$R;_I9GEytBpNSkOXreB;gr}cV)Ml+_!w!NHk$kE4_0^n{n6E;*}C5U>8FFA z@ISC6&7Xdnt+qB!3h3TI9y^bKR^}tN^~a$tK=#yOoCSHZ$+>Uo;h^1DTI$!HCL6l zMyMv`r;~6^daK}0|7LhLv>h;WUWF)xabwVQ6H%)r1uCg)cSx| zwGpR2Ou(y}WG5*T7SBZTfJsQmG4hV&7%?uT!VFnpEiNd;j5mMTJD)84?$Wn{+E`p~4YAyJhK z>~zx3cfJ~G=%jxc)pNYCpx_#TOcWy$SoTN?yTt9mo(Jv6?VbqP?k@qq2QJ!NzhSNs zgp)@*dPB~@bYm&t2!LR?E-5{eR}eXmNtN8D5=~RU{UK05J{sk1-U0ePUdM@2T@va) zR94Z%Cr^y2xwWv)fjK~WPDdN5>?5r%v%ySMO%QgGtN(u_jk1WQU7+7;9M^65aaw@{ zq*jaEuf{EKI%sI4ZyxDNY-M`2S6YSz%5xikJU(v@23{E^s1QjdzKda z2F!4;9y5Q8pvDdgA9orWpAxhz2RvJ{$8PV9ZiW3$A_5TabcAw*pyAEJwZ#Ceh`g2+ zH%u>B!xPcaZxGryf(*5*+pwO&PX#N{-ccm9(>s)b!T@ip-Jsykz`p!pE@<7{+@2vj-l|ActRspKi#pBbs2sj;+G=zy0;E55}(6^}lW6 zY5_2HSPL?Nwj=`&RbFk-c~^hCl_ej9$}+H+?0dX(HOHvx=>VTtOrcC&iud zhrfTWKz+0U)B0Dl|L8tFqUJ~}?!cy2wMb3astv~iKvqTx2(!5NX_gXdfJPuO2R=GP z(1T#yw8R4=XW^WlNkS7qz4TtKdqDD3-|=Cbe0>V;2R_BF9ZynrvDBv!X`vl~Gk{O< z>wE&r{e?QJ@(C9F$`7RRT;-VZ1f4|IT&#a=YdvywK+APNYTB|o18n4=TuCMun{R~%);!J14eiFi zI9=}SEB9H>Nki#6%%4+Mwk#OEw8<6fNP+;aTp@YN8!(gY*c(FxTkt`YjcmJ@k!ycm zL(41ZAOx;=vF}}TF$fE*${Y$9Pr}B4P6TzYW2r<9WmRJdc0RU+NBmQT?L_+Kpe`;m z840&nvpW)}`j7@@2bq=Q5+tbi7J~!Ie;r~Il*Iz?PmVXHy=`VwA6RA zKGkrhu#Xp0PBxmQR3=GRF*`|Ipc{Xl+H8Bel4?>Su`OoNO8Ixfu8*UWXVPM6Krao7 z7G6u7gUdweA54sMW7gMOV?{v|Z$=%)Va<`q+X{`P@ z;1hj5akf$PCq1r?AEu)=mG$zAHy_XEV2_D{!q=?BrO{ovn3Aej<*1kvbp|c!{B&}G zZLD}!j*j$VSc5OC*l)xl4Yz-mhSu1q(MVsRgj_&>)Id;z>;dQHgS>j0b;z}ADy}Bl ztxnyxyiEzFB01rgH7z0Tun@i8e9iAOh-dPdMZdFFq#J%2ldqde{Q zC-5Yr9NZ{>migI>S!(xmg48!378GisD@lfAtihV14Jbw;mG=urnL$Y~%kn%E_Q76d z-jV3i`7Fjp8S|_q@W7qR%OEEa>{CJnW^(AK-fl>?mwLN-$;!f#sP<_}S2w60%IPkv zJ*Bf;;{TgJ-G_*39&3NMh_`FQBO>+X^dAk=(` zTc*ij?-pwI4d-iA@(fRB8;;_1xGuSyXY9A0ZwY9DH$YQ5wk3Zld+K?d0GqBJlGW89 zZSOSX506BoN{1zgzp!a;9F^?6V0kN(c=OSBhXd||ooG;$y>9DJQkVvkgX%c@ zoCM7SDZdW~5l_~E zDue;j0lK3&$SHrpCMMA3%=6en!jwRGOUAM;h>J$7BIFADU=?0&W(9pghmHD39(0~d z&G8!hAu)B=yr*H13umqsGfKwnehfb#D3>Q8rqdV~GFnMAkHp?m2bfJlbcEtNrUEPL z$I{stb2g9>a;#D9Ox+C&gKD}*akK{XMx!+VEZ9Vx*%5!DHNXYb&tshbAtk2J&6@9^ zO(td!Gw6@p^w5lb-@?fXeOJ(L;mo;kbF28}|H)Vp4jlXE#);ri!sz0??M`m@8N}KG zeAz1Cc1aXl<*taVpI~CKUvv;|suVC5KmXOxu)2LHTn&cDfCwkBDcay9$$s zA@;{fom+qVpy_~ky6~#Z=fD1c2e~IOWrW}}< zS=8J&dh-$d6aeg<2Om$lv3(hCfc~rz{va;(wp6Y{Fdi>1Utv$7g^21 z%IM+VnKwth$-=xZv4h{mJ2+)t^II6Jh_v}~=d8WCZ5^mUv^m8m0G@BcPyb=DcD_n| zp6h?DLrDj*=zWY?bs|u0@Ydf6&MR}8LFaXoJKK07$R3|xFv6MT-@PLORj^*Qyn-SY z8IVIpBES|U8&Y*d%DLB;7!mh@DVFZ;qp?+SK#X{$G{3>~RELwqqF0Qd*39r9jaQQw zs2IAKG%=PXlPqOVV!p(O50eyblD)EAZ1aC$H7O=dnfi>3W}~&^3~X|xvFOnkINXSs zrbRX1P2%&zs0=>Kn?2VUxlwach&iL+Bo~#GJFa*+6PQ+9Uy(YL+VTMS`0WSCby1_l ztex1s`gNgl|Mxzll#AHyGdM}2s%TY&biXc${HAVoz(vfns`oRnf}Y(r+gl4xX-D_g8NrlsPIOa|;Ehz(uMGx%%8o7-iA?{MGb!)a>q)Q z9FS^Jue1)OEoWA)w0s9c@4IL5CX*O62Eef-Um+jEtS(bpIggYLM<(>abHvj6aJD9~Xxy$TBz80}&b1$~mjLs%U3EsCrWU?adi_yvi?LfN_t z!CEv%j0l*}%=q9ka!BSUix_`ZH(gkk8UD6<4;T zOJReSHbLSQMVtju*ahOlzzl+LL8SPN=}P7>|`b#qy;Ig=zikC zEis$rk7X`9x9M)m4w=}wtF-IG#Rt664d0^VC7Ztf9I{l9h$nQ;s9Q!H158lPV-{pk|tSG8#7{BmRMUjX1599KK# z@9Oc=@Y04d1Ssr&njg{{PmVkvv--GmD9S>pQ)Zc9Swjt$W&LS9MQ&BVRjtP5Ge2Hr z#{fX?PjdIwvmHoV;%terbwwxS;SIcUxejcgVXbOF1}wC71G?bH;rQ`* zHjID;Nryq7Y^Hy-H&L$OWz^aX7ZF0)S)F0X7tr?>`w~sLxI6#^S|b}Dt(`+vdbxJC zeahhR_h?0K?!PPE!?N(cc;_t(Zx9M1_SHtn(H^4`NHx1qO>fu%yz*OOXrO-dO)%@9 zRAMEIKE{PhP9~j-7#F~B`!{b#Qpwh}2E{}*>OvV2*y?|-;=Ixz2XD7`gGzZ9C#Cqj zJnw96?>>V1w)wpCZev$l*~3k(=G#v9L9ck(*}}h1JKsKd<4j;rAHByrd!6?iPu)np z?(~9F#PecL>v~l@E56yD0Z@hLISibFMYpoq{stMt6?A{F{S3Ao1`i!EWj1GE`<1@~ z&DhHWMI?W2%d3BvcL~-<1c*(08Skx)m|i=)t+zJIuVbqDKHtUv*R*wg7ylxyx2wV5 z+bUN9LzH#_mAEeGyVB>V0=e~&@0-5<7s-fTAVl9cA!9bfuWYXL&JKD1S$yA=^@V84 zOZmwqe$F-vAc?lQu)@%{gK~tdl;j%9{qCohZ-1yVwdv35T*ivwj`Ck59TlRI5jH9 znxg_)0z(KzY+U`bRK>ztt(<;9bR(#YBL3K)mHDh%a*li6g>fqr_P_EHbu%YNmMt)b zseyO1G;BJI~v6Rqtbtvk;e5RyKeb0=+{k;A0DjU^!Q^uKG>FN zfxt9?u*|7VrIL~N@9_5!+{VczIaPtn9V;PZ+Mr4kq***nFeVWGJ)Q(7ygYe4IzR1# z-QpAd4Zw;h+jk9=*tYO4R|fn-)l&=*?T=H8#9~FM>=d7^_ddqo5hyHth+MjI+F5_r zCdGXJZ~6x##6K8`$-#mVGo7Umy8h{(x=Ww_!Cm^tmp;?nhowLKeM=umnjK84>2Ey} zuCo4tI`L5z@3NTkwcWVF5SA-iVTxta-{ZO!=DkPuKRH;Y6ft6-h5X{f6Na&nLuOU(;f%g;fLS=O%^lSU={qs z`en9a7+Xc;G5Efbf>Pj%%vXOsA5FURj~^<~@fexSEECy>q+<@~$yaY7UfUW&qS6ME z0RZ+nv%o~WkJN?(e8nZwh|%bU0C|jWNu+FRr*RC8UE3 zlRz;cIYyXTN{*d}E#WoENIoHK7!yXTR6flq(^AK_7}WLBRb z{XpPR?ewUlylMDKKOh>u5(5%w+z`lOk`w&JXY-eaA8niwDBqy2*a~}V=ThV(*=?Sh zR0+)zw#*XYc;)#Au*x6ETv}?v%gisb;GzFkdu$#>whTr6GPdfD-!k5ncpLozTW@Uf z@AiiC%a~|jSB8)ZF|B{lww3HvoR<9B%y=!Wu442^+DdQHWvLt;TN8c8#8Jxmz#7%D zFgsRIGz|rUAHB6b1PXu14dO%dR(z)rBAb$S=05h1d~!ooTfyfCSog|3Iy9lG4#W_7 zvx7`SG#Y+j?zEnsjzLes)78?`NatG}O7D861jad+1Ok(#xC4LCnzeC(Kcu+w<6zZY z;|EaSH&fhMhT`I-yHMQWtrYhLl3Mm6OUJ~oY-rSFB5Y8)pHH`;G>@q+LI(@2#ovhP zb~99$Y@AOoQ%iU6X!1-An?podRh5XCK$-Dg_ByOgj0iP@i3xtoB-=BZnP_b~4c4X$ zYI=Ha@oE z(%X)h707_CE93gQ=YHmTs^&^}zhsL92;ZJ8VT(jO?``C!c2$X1`2{uD=+l?LD;_O7bjSq=rxnbVKT_4aNWXJ8lm4ISv`QZWvci9Gi}ZCso{$^cyxBy0a!16J zBjGt&Yyo~sPm`dWG1O1NP%&();Bd@t!r$)D$R{Zs=R3!5z&3L{R1>S8$pC2z^ zl6$o_pyX-A24wa5pka3H!h(%F_rfquTrk-k#)yCP(N&c430>BdPi~{iRjE7A-p{`< zJU-x|YJ}R9tWUOALji6X>tkf6^1ebEqpXyP9bwAE0(I&vP!~&X^~`=vAUb}(`qSvj zegQh_H!NTh^&1v>U#k04Y@TjI9&B5#m+JZ&*Q~E`b>j`N@xY*#1kq^YF>gVubwg8w znvH+QC%KL15?##T!H9-+*gNT|-Y zGE8q)b9Q}w55)y1AI*np2;&q#igwHm`PvFR(G}Wl6|z12_c=;8pi&t#Mqw&Cgdks?f=mV#J_zkqwss{%syD`xP9~jYfJ)} zJZN=lTW^d?eXRH~J(Y`-b+7iIQJl=hDeTJE7$N;rPTj(IX?#Zhwm%XHe)*R}g5Qb& z!I;9Lq+z+kCGhjM&k0H%Iw^osM-e;dT| z3u=M;_Oz6k!EpcI-ZM<2M3|;{MSFkt@ifvYO(xsBzN-B@Gs}1i9YwKS6vta6M-jqR_eyHjv;ml^L_j{ z8Dcu}O%vkV2w$HjD+EZOxs9pELWS6|TSVU!iJ5h?&O(N*jX733e~IA(-D127PgqeNj+l*M5XzWuo^7MpT|pl_+=V2m^_xp>Z3=G>djC3 z^;YYEpPziP!_)o0D*!%VK2a2X-OEiu+uw%PDw(k>GjsJYpf!JU@ch~Zljlh`LqATx z#KCyy+6BxRtM2E2n~m_9f`;L9^zMMnB@dQhnD?d~Xi{I=jO0<9rgABGU}R~D=1q-K zmb12=IdwcG%&`9*dF^o7gI66d7vC##$>ogXHgeCxd@+-b72eU1ldndv5oZ4I?-;k` zwVokp(H(UAt0#Xyer2IWLyf?!$NVa>+yZu)T-z7?hoP5=zbyn=v?60&(wm|%pz9D| znu_T+FMUZ#9=?i6WOY62Px;5t!(~|bkWYj>`m9Jfk^1hHR>A*HSHTypT?Ko0$140g z^VjX73`}2;05i%l-Gx{SK~jhi0ZJI;-dT<|U(LDZU08o*JnR;i_&xesrh&hM|Py`!t&uBt_2R8rLjjZs?XH>hfVD`0fx z@ZVw+^UO>{|Aq8VW#!FzNqKYrn`|FavXx=5y&f-Ol)%h7BJ3G|0g6=4*eOScoxiyw zuQ4eYy9HKFuRRA8NU48-SYS}d0%q3na!j?I<~&rlKBwZ= zS5sx}`U9nSM(e<9sNJgc%^SF6*SB(3Q+*u24epvBtr!onf4E&2vDJS6YpypDP&dzK zqZ4P@4QSa_d3cl3)#v~IZZ`VxvdY=3$R%>a)P<$6c~9dDmO~L{Xecr=H7hmrgY8Pa@&3nlrG{~5t5UDM z_mRWpR?3&HR~x4H%1w_z`QajTwBPPlyPbb_uhFjTH@dx6yV>ftEA48#R&8}_J*-Kq z&1S3KYBXe7+G#gy-EL1)CLnCL+N|?gt=VbR8?{CgALnL^OoY8|1Aug@)kdqyB=&2) zR<~JeHUZLpvtDgCR7CXHDsKTD&9tkHc9+8g+k- zrrqlF+AU_xz}mf5wbpLbEA3{ZLx(jQZgiMMr%|P`PPNuzGQC=*(WPFMQSG=KFk9?X_A0k)C?MM$_%o zyFG@ewpxVQ?P!XOtVi?JcC%Wc`#R|#JL;g-WfFC8Z=Zi#^;)mft907cdau?6T-0u~ zo6W8PzSga^y3CxeI!)>_#a@qv?E+5?yW4J50R*$Hx4XSs6P#kUnmVC=d1ikC4FQeW zR;x`W*3oC(UXw3D7!9#iYk{&%mrv@95rhYb;6|gxXc&EsQ8VmXt1UpYE|nS+ueECJ zrdGGv;`?exzz4(XHK5CMXrtSyTMLYUj$4N6ME?!JzfJ}hCs!8=ANo}*9Jx-e%F5J* zeZ2;fhy6Ne!h~sbLX3{^s)>J`HN5E-3E=iR_4`23AD8Ln(cLpIDlRd_1QDE(R3&XGA4x&vY78DeY~1Hc7=J%{)GGb1l`GV1 zrGiKGo|Rne^&6S_OS0Q*?cK`tD=uPl#pa%!B*UK`I^$<)8qXir+RT6Eyh2;e-Qm&s zi@xS{qt0qC9zN{aQ=O+;+a4P{a{cw$jbMW3%GWF7oyv?%;YGXcrrI@jNS*9nlR@wP z)y?0h_h$s$K94Dl&L1`~;2-s8_op|1pWVOWW$Ux^z1sa+E2-1$S_3byUh3-x6vP>jWo$etle>k}r z1KLJ?pRn}RLnd}R$NzA^^SD3WoAQ@9Uwc>lUGx`wvzuzT_LPqi-T1lLJbKjCD(Rut z4o`><>``^b6*_cvc<^;JhNRAntjZP=^O!hbMnu2NpeU9+%Q3hM>7# z&fmq;!ynXK3A?evE%#TVws46vW13%ix!-lI$av;-0HZKG*xFVO+3g41SbSr|Q+K?Q zM07A+fBojqgkglAh&IfjF7El&To4DZ3P5=CPVi0pf%3Ho`ap`M(VO?lModN|a| zFIW3H+I~Bn9q`{aXk&|i?ZTouSlJ(o@fLCg77}i~l5KyMzt9k{HVi7hhNB$JPtL#P zamTtQoay(NbJLC_yw+6tbA|FfRSduE0Xv_wC39g1YxSJbd9b z824UT-lKnePu!o^dVhHD8Hxt)k5yoey8<4MkbEQwFLQ;K;dJhnB?v{+)qzY`A(pN! zh8Y7gg%Z>{ShITZKjV%ep+bo&K=MNsrdVp@jjIA>@l}{~sg>uhitI*WjH_-4X)D+O zVIi)IYGR{`O~+yQmL%_pL7s1&rfH^VS3$oNr}lq{ntbU~67ocH0+ok?H?GF>Sn%A{ zcmt)o_q7*S1x=!BFKa7phxpS)8v$!$ARN}j&(uerj{2V1{A(JCejq;DF@-)$=+XRz z_0EHi-|*O?l%Dm-@l3yEMUvsyZ9osS#X0~3ddwe=59dOUkL<%^6K&56ol}_c?O-^x z0AzoO0K`#*0Mej~8ZUH{#C~Nyc%r~%B+8GCM6f(5GCGBRU!_UBR3XGh3-}km=~o@K zil2o0vTe9TVaAx_IEt@+|o_-l4Pc+$x~7bX>*$_V%=f$m5~K zb&jJBQ!9L06Uy_WJ3+n~%*v#rfa+!a6ShCHym>;e0Alyx@cxP1j!pk2(gl zyYv&W9jR#KWQha1{BR-asbgXnRPSn>Co`rG>*C*zoMN5?P#H4CaEl7NYGGC^#DoNo zdxOvGF6n+UI6le-x4^4i`pnTTK^J1vl9A38dST7dQd+8K4)l<#GRmxTG1PR(1E_xl zyi2u{evlx-I*-ldQv->s8qnY`Nd4Q*oXrria`Ety0rsmmUaE63eZ!CC?SPoO0XtRW zK9o*>V=Wc%=k{%K`l!Ooazz!WqNQT_!8v?59_LYC%zNxMHUWt`cEthnIofa3;gypC zCXtO}Wgb-5ky2ITepKK0GqKOIHetGNO(;5lio@_Jf^tYVNcuJzsJX-C08ccxh)a-G)F$%?5n$buqNTz zM|t!a72UjDjrikm`KVdvF5d3cdo67_@{9TXjdX33=3D8Dr1f@MUNqiG8aEJmuds?8n(vL@mZq)A9)nvGsBuhBz))PW=j@ljn;31mXtZPOY^p?cj8L#Z$lq-Kbk z>iH;IRpegCkQx<)OO0*=(Of=^db5Q%3n5OoQtvgGNDWb1UZdNoO4x)@vC(cLltUa? z%?H}9BPOdM`K#0saCMQS^_qDNgh0J+6G<6>Yxa=UHS>WY8k3-^(?#-wV6R4hk9i9< zM&3pAh|mhD5u!3$Db?uJTUDfZ-7e5T7}l*b-+U&3h#JV#D!m@kC*)403hf%BXC??( z5&Kk;QFZcp)SF$zYAt5U%Jn*ct(`9keYOzgX{reP+HC}&CCq3d^{dyLd|MHQfJ%)L zz!5q&fjKLJ+_T=UBQ-1mtJwvAKy@lqsRoWT@(M^<*$yUfZT4CSReRN14y$?-@mjTp zgs|2{y4ygSn&SmBMsTOr?$s**0TE)Cg(<4@OMEBsWE+_&64|^$uT`fXq|wMP+U-^ksby)GNFG>gfVh=^Mx7NyHrUGB zpbYsi8xrh8k}P3#y;K8%Ukf}(yk2j%+jO!5Fczuawtdt=Tv~6JaSL>*BL(jv2W`_( z2hn-HW^LrC9Ymn)05A+8XbHhtWKC6CgBF{NQ8r5W4IS@L+EI;qy^A!pTUs-TrNK`o zDjZ@PvIp`S2*&|9l3L+^79DoL)zYdWww0J)z(T4m6whlwiv++%OG4>tyVF7_oMQ$w zg?^CUvsarvh^S%XaJZ>n_;7yC@nkk|27H@#>oS(8E%QPNnHV~k$*RT8;IarOs2G(d-PIc zi&3N90Tsc~(qtJtV`)~pEvR1)B*2aWcN)0v|YJ|K-2PF&mi<}*}vcBjO^1aN&n1#qAC=O!vs*tE0n8FEg z2Q37;047@R)$>K=V}Qy2sdE?s?keyt(G&=Om&3c>tTdS?dXdtq^NQ0L%xPADWE(nK zu0X;=77Psp00m+-MpdRt903hH3ecr8v&H{)L{-@E%@&o~r8Z!5YK#x;HNLHb&alKa0&EsRd!3U= z=Si=&i)1X-YQ+n$5&&}tb-bM$_Z#hMhuo(};BEo^Ro^C*%lc;`K1_)vfV(#<1jCo|nV6l~B| zhY}Tkwa@?Ki&m{3kP#`FyR`eDB4k@dyIQ&OMm)|wHc&cf6e?nNH#7uN*@4xoD{x`9 z{lrGV8doc($gaYZ5%w^xqKgbPnWL90e=L;#*vQFHtPsF zh)!I(a>x=45c+uPIE%J;3iUK(_Bxt#h9Y)6D8Wd4JM1GC44gn*aeEvUWe~9vO-@+A2oDDg>eXH_=o(5B@51h$jK&u`NJzNz zeNJIWo|5Qmap@E~o>gWhNIXM(eP$|tvQ;0E656ZydCpb*m;E6&D%8D11asEE#N!e< z42h~;#Y9hElz3HsQQ(#RMS-&h2*0C$wSe__Y(saWhSy7m+vOh&&W|QJTL(SL?4fH<4f21ex9j*}SZ!47V<8}4J?%}s4LDz2_wbH6PUso?*L197KnUHJKvB{h1%k0zEW-#Qgie3 zn>cr}_x?y~=4buahp+ojG%;R~pyWya)#0oD^TX%;w})^0Zv-SaM&3DqeY1P`h5)7T zHvD)ahaEkY9jGGeK&Um=>bZL2L@C52gWgjA`K%as{uWM`-Sgl{Eu zdBLDw^b1z>ykGEtoYBm)-OTyS9)A8vQk*?zLX#D}Ob&~cGdn&{IX+K~%RI&E@-%Xp zJm*{{R*D#so<5wxWS;ghaXgjLr>~aqm_>=_F^dAvV-^LD#|*!79`ka=fmYLjeLTMH zA3G~jH})&fR5=#Qn5whg>q~KcaC=dUX7hp5Ui{m`Bt2qcibGXU<;qY}Xpt zv6X+<=Z82Vcz1^j@7UG5FW)ii8Y)q}C3wc2Xr(%EORh4^5gO^#boC0;)fuL%Z~6;( z;3-`134HDaoUOC>b(8Z$!_f4}YH!J&c)Pp$nvE`w<<;(mP;gZb9GV9HsxZpDbz+n#2ItZ@dStwj~C{;^7C)>>3S zHV~_1R;@)9ga@$-PreFIMHQqAu?kPV3Qt89#1FB53QxWYPem2v6R}Fvi|eVVaxQa8 zXBRp;nZKJYogYy&cXbZWuCQ#yAvJA^Bo^&aTv#D$O&D+?VgLAKgKi z!_@vKOFNMY~aKv;pH@Hd)|)=UwTEAK=W8g27n&F{a>taliQC$us=Uo{VSbt46;ro(L4f zH4qbZI;-4d53#Kk6*dkhG3LaAleZRHUuK$rU_oxm2PA!kXc?vWG4mI;*(ZCWqxq+U z7e>!j%BwN-#zNOS;A6^kOCnMM&EZ5aq45zJWld_sFOmh=XY?J$>+@YF6XKp3hPhyf z3(O4n_7pR}k4;H(xQq$kk0<J?(XVuo~h$(AbL^MdQJ}M2tQDSKMn%#|@JVsewb4noJxptS_9cylVI>rK?C0B2Kx{ z&7tOFD{$cx{l%V274qIImRn12K>bkM{<3mZ;H4D@PuF#c3-bFK}5EU z5}_+sAAEk$_fWTo2$rvzI8|_m(jd7kNVzSZoDpj_v}PJ$-Z251X>}^F?;YKL7AVsk zWNM+#`I7q#PF#E>4LBMnlv3QvD!LJMD%|Vji^TxY@*^SU4>e3VEcLInmRxRi3u11% zr7{MoOnGaUH{J*~S_Nw8YNxvecNM;*Uk!sYfnLsZTx>LOrY_(E1k^@S46$l_ho=^o zAYp*KvuH)5XKm2c$(vBO8GM+3WYVBsfV=?D>uQCyMioc58i24wB4}#su1hzXEvr(~ z#f?Qkn_H24mua}wTBD*x0xn#cE4q|wnHY*Z^z7;ia5W4Kl`*n9)X^6d$hC`p>RKFW z{{ahK2;sm*IBxzE0^qzSoYU-arNn$hb{TS$1j)fdUB$b6qfP}IK4WHolJ9c=mUV*j4&N(|kzB z45BX6_g}`7*K4*aOD_n?IEF86%V?8mU(vX5#$*$MvoK6(p-m|e0#0xZRMLLcu(i*$ z1ai~UWB^Y`*dkQ1TdU1~2e{CxO@{6?AN7Uum>a&PgQP()WK{GobktgK=VuYML^gfE zEr{4X+;7INZ6DSHv@s-Lm9)zQDLJl6n4-@m6EG~$9@p}Eg2JNdUd2SwR9$t(fA#IQ3Bm45mq@e0kUfQ zGf%*wPXsTZs1?xG*3di>@}zBPcnEFK0%_fWH=xpr@~O6$rYhM7i{WU9HiAZ?cl;Hm z2*MJe2+Orcw9n9C(}fmHq>a@ORnT^DgwK#sdsI!!j>nNxqjVzihM<}$w9YoHqgvVs zvc5BtCs$qIDv~RIu*gnFf)^vYA_gMpIv%t=MTqpJ03%wer3P}^2~ZTH-NG2?p@=n@ z4}^61Xb&6V0tK~CMWjV41w__O6iNFs z;HcJsyfCXK>aJY~5abJO?$82{=!__w%p@EUu$>Rp>}i94i}s3m%LV0^%dt~mq?cAA z2G9`#9d(6l4w+Jev0%Z{X(IsS^pKPcT|G#NBoQGLON)3Ahgqa?peXL4c*x4Bl@EIe z+z|l;)-(w9B;G{u2gqb&gIo@c7i-VQSl4MK9cvAV z8nu%!Rm405rKxZc!DbJ=q)-RDjW!}nN|9zlT95?tSY_NDG>w80-qP4SaKu5JD8mh$ zjyvd1arI?52>1}R@~NbKP!6PLS`vJQ+u$vwnma&$VL2O^Q!-JRi6Dak)JR2H5bSr5 zGHR7I>Shn!t7MDFVzB*zsvx;Ue93_6m~pi+yD&6Dp2;2*v6n>!##_{7gCfvmHAG|Z zZkNZkwt1Cx0Fo`R8!;@t*^qphy5d?b2B62+#>iWRL)WGHSLcVrUAD zQNVzIL*B{S(REM<>8-FIkr38b+5n7^4~@4%!~~Sstl$g^X++v~wjh&ci;HjIFVt7W zq6c|~28eb8Ksm)rGD-o+BFAk;Nll3%McgUj=wTHlJVq3)6-Rc;$VDSG1wesoHTWfL zWgsjENPyXuv&4~>7^7rL8M?f+*@F!UKfyVFVUk|bG=vGX?V^Jg*_BQlXL?PD(+le* zyycCCA(dstMOd-mL0WESgAgBaut*Y!Z{loGQ{OkRpa`bsVh82K&;N9+ zV3~x8l}-%!20jGcWz5Y$!BHlK$Xn`v4~P|(S5O$bV%3=yb`DxIMu9n#EJ}e2*ug|V zV|5Ga>5v7{Kr`%?zy;P*bW993xGbs(1;Ta<3fk>(Zm@z+B$Zd(fR=)G29}X690;efiR=mV4y%qN+|JdU_GXHkPC6`MhCzInIkYL z8iYY$ce5e1j07B@eNaQ&iNlP4KosIsb*MlYbf&Xu*lgoLryzP7 z&`-BI1uziGGffs(r{UQ^*Pkz(J1qo1u%&$P5SS$MK>Sg+M7@gK?bfAv)HHFBAlSLBu5iDb5@- zk7hSP`iz&QCk$ZhKFTJCSctqbFcfIW;I%QOw}YHQ+Z~zqI2wM!> zg(aOX%K{KeDXF@gh7JA$3eLupbqGX~-3^7a;2@}S#OATlm?;AVWu!V|kAiQUQ)mM* zJk+5JRNAsnXIHbFAR32%IY`Uu%7z*etc?q8wR?;rO-Pl%5d_>(28uaH1=WS9iL~=C z*aJ1-q*7QFj&~_0b)KQK0vBb}DxIKsScVP;h?+nv)Tp9xpumE2Rfra0Gb}V~!g(}kRJz_90yWv4AxMz;y>C~Ri%#;7!(aG)D=E}#g1;2;bD!KPD3_TIu7hik&;jRq);C;*4>Fy2s{=`4S1OVxS{(2XvRj>p~^GLJ3z=rhlw)v4rl>-~ug$T} zregt_7L=#+U6(;M$f&Cxn+;g@ z0zXR(yLCcC=hp5+0WTl2l^)}bRy)u?FEKRs0#GlK^b$#bC&?@~C&hpA`uphuQSNkt zm)L+HRi6a#hlXgigYwgcQB(Stk2Eb>3&SwLI4+7$qW(gF~EIblj+u)vS zS@EsY67+a4LWa^az7ndIdHT_7`N zR;I;tUV^S8Q(8LrK-Y^3oL`{p!TbUTI1B%4t>N{CMGQzhdJ#j)unU7kIfl>-dW~Ne zE|9!`Vm%g7kym$<QP1Yo zXvwJ;Q!Zy`U_7CS*Wy%KPTBc73IB?cO`6KO`ysG&*mTGmZa95?!3SmOwOq@G^ z^`$1bVSf&6mYOSid+17xXR-DuM>FV@WB#W5f28-oqfe^HMo$7h!s{9A~F*6tH52PP(t4Q<>BBF!`t5m3NCGoX`<2Q>fsdH(ZZ#q=AJXA74@0vdr-}o zDp8JurZSV-ft#&lW@dtGDj;2d=qTb=CVeM*A8E;*2;Foorh}6#Nmoaw_%`)}v?-Dt zdOeofHpNO$Dh4Ueq_jZJC1r**YEC^SIkL17++lSAwQ#H|)s6RmhWtN6{{Lpk$QRZ| zS_~PCR@r`xX8k+Qj6olgl0Xs@nL$Z{kY6wtk+&0t@S(0#I*Es_&x)OY-CUT)*sdp3 z5Dj+{g$b5J1RByUR1a|LvLzb9GGNB52l!LjM~TDc59EK!pD6^LKPS9<31bXvo-=kb z_cX>1zL^@Gq&&g+17%eq)1&^Ou;F?MxrSlI}i2b^xojGc_3kK8-J@#1~$>{^G#7 zkh#w3RO@PG<27Z5Nu@IIBq@vQkKn?sKQYm@)YrcdqAdCYWCFK;FOFIL!3k#BqviQ@ zh|o<{e>Dl*Xs85`=cAKXM0$rqqQy73!L0^PE3IH)x%Ln!`b;n+dfOz`+r*u%r8i0iK^pg!{0;%Q5ixFL z?dHu5u7P&DeKcVg~W%baVhldbj(`PtIAfY@b3`f_0D3_09q)boed&%9$is!yK zH0g^;p_Hep%^dwc^RXEV!HF&~I4nSLD#V3b?z$Yd7nb(P`41=D`wsY!UaWU_gAwe` zRV8_63{Frl;9hMmFN>?o?+GJ0UXa_!C!}$0eA+nFy=C}#bqU5wEESgEpyq24V3ABu z4F818XdaG#dKkHz76P{O_^B*v~m#nk&G@2 zAi83u@9*C(Sg@;0tl&^1nCm+W|JB#aTbDPcNEK7ufwd@ieVp#Y%)7v_eW!4W$|tZ= zHSV&(n%gKkxlf(+*ERUylnB_0()mPzsRz3RMtImuoK`;+0F(Vy26_ipjdf3<$A|Q#y%z-}%5OF=18=L*iol z7V^y)`dUUx#SssOoRSgw6j+K>$)y63wCq}ck2O;}u`G3-9fe^9hQuo`b4N>tve3d&e9>yf_rrpm?tTJ z<0=Xroy%P^9FfHE815Buu6=vvY8HM32ejn3*D)3aK@AzsY1eE#rzMGf)Nc|*8K7NQ zVj_h@tPCr|Jsjt$+O#crTAWKtQlborv=nl+qyKF9rW%%X(&fu&>6&!DTl)5tZ_mQF zvp)IY3#6l5ynLEv_nYY5W%tAXG z9HM+o2^?$zM8DQ^nL~1+tWd~1Ma?9bT|X$;p_M@$`vk_l173nthI-eZewXBB+A=TaAdC29+}@;ZG@WMZ{{yLkE0 zyK8E@i?;9)P1jTm7Li0knmCmFhRdjQ94@Qtsl(;zZt2?-zAaMlc^VSGhJ-A$IOGXb zh(+QW2Q{Wd%|D#(?-%&tF6|d~X}9RcC;anr>LUu}%gt$c)j!Xd`zqkax(`qh6+4d1 z;j5p+JjD!g_r8ovY;mr_D#zP@!K&*V9^?LO=V*3%3v+%81Z)(3-~u0PAj0oxBoS*% zab`b=VeM+Ws3g7=d!9H^eI=qCQ;qRcu00d;JO86CHnl9^2CvHCA&`}>2t|{Sjk1A2DvsY z9{WV>&%RNzTRNWJ+-!eKnp`CanYwy@T7g+ExD^eh@bJ6U_uKzj|IjaUWSKk=0=To4 z<==I!!Hs@IgX!%oYmb{x(O%;t+Dk9)w@J2}Yyp0nyqZkkup)OlYDJf&QQ_fm)6PZ-hzL0`dDtYGBI;(1^w#{jSHMYjtQ*zi z-%q=rAfDX-Kn$F0MOt0Wa1FyR}?pv??4r8=XLLX(z}yBCQZ52=0Z8$^CAU> zw{O0;MCks<50(LceW%H`8QG_8Bf2u_uZa@HgSq6Go>CyZWlha)yVYoSRzq_(Iy7TD5?mFi% z>Zb;fPY7A&(()9@8~C56Z%;nf3EA6nD?@7?jsktK&d0A?IQEthtJ1mfYpRltG(FDK)(sZvtdDo}6TK(j5 z<0qx~7J=DZttsZC;>3Ze5b{G<7$`<6Z!FJqrP0-Hq9Ez7q^iEY_pQ%^wqBe{5z@&Z zJ)I3tzZp!(VvWEwATIlTv@mlYQ&1>NGMM8GUdbjDRH3NMM&w0``H@`l3>5+7f`PaX zcqqPqp#Z|MAgw;V@P?x<38JFcKaMV80S5DTt8dZ67GEx&sC$>85CkMSc-F9FnR*v6 zYF*DEH`>}!rJ(Q>fCIY}C}rK3Xd-j?1ocmp0#eVh(`bkM*wb0NTvz46m*C>pavj9h zk30sTSvTg;+FA(v)h*llul5`bnb-8-ESWcd_Toh#CBO+t++WJ@9F7==!l98EvJBD< zLqjtItRa@`pnW&)MYydQw%xy1(_pQwx&|pM?fiRin|iSI^QCrnjCjLY;7b1Y)#!>O zhgh*&Zb#BDhEUIT3R~uTpGcIWZa8|Y6q|A-K`6R4wZ!in;vs3%ST$Tacx1~#ylSt1 z6wt_qKxH4)^RJKv1C5^pT60p98W}O}%cmCir<3kAme|y%u}V+0Z^kq@Ia3nNcr^QC zdvxfspsH_|I&*8E1Z|Gbjcso+lo2^7Pezs)b!3TAb^K>+yAIAm%It^t^;dAIT&zN< zqsJq3k_V*1#Nc8rd!Lei+Z^k8NV`IRmMAO}a6ASEp~?aq#_+>*`pWO{09C69AO@4FZ$U^a^e=VZ>4#IJO=*A9NOlV1eZg(+y z%i6n=2eav-Vso7n2CK$fOi^n^N!^vyNf+zx_D?QRGo(8(463s2H{9miewd^_+p>Wk zaG$xl7;ed>?3C@k<=fcO1s}jb`ydD2uH1AQ$A8n7FJlTxXVEj-!;bVadUPXRy*&TM z;W>m@J3e;+I9gl4KiWcD^tEh%{Zbo(Vl9GMT+#&Td8gPn`3fu_LH4yk6cvl+%IayE zON;0nDh@GPFi31$4&A37DTFu!IAqEVPo7M#CQDan_1#i?5s!gAU12lRhbCoB%2~=z zde>O;sp&){1I_A3sb2ckW(m$ZLBz+b<(v7G(`NZ@Hd=raTU<$%+)^Tcopa0J%t{uK z*8Gq(%K1Z#?8Po5>i~|iGGV%5?!}rgcdb)eR(ECfC;_>?#XoC$ddiWSBKLwvFG6w! zAwpVG1dOIBUb9rYi#KD@JVH71lDE2lVR3#9i(|0UQrIdL>v6F4r|a=;g?}fvBovn+$^8EP(1|QY zxCifGN*}Mb#$1xDcKjmH!L+Q8iY8epGP|!?$PZgPztzi#9E%G)j_GW}NUATCdNnVx zDSZqMUl9v&29yx`*a$q+1nNf1(&WGhh97|dxLIfC2Akbw2M|SnJ6Ki##=+pWkNsER z2L1v=BD)30o`@yW#hU0kzDPEv+q?d9mh|AyA1os{I1k1Z85{g%JY1eH4(64$M-x_& z+0hb*pHbMPi0_Qu-IjI6Je&exWXKWqqY ztGXe0S#D`0fpkV_X3c%fwb*+K-BCE{H)Y+iM_;$@dfq9putgm7O3 z0bcO~Hc_#tTR;Ds4uYTmP0A&L;VLTe@>Y~)V3xt$tn)E{m|NEGJ_biz-6&9%x>4jE zD~{&x-!X)HG{>4}I&qy7|JQZy`Z?F(bRG_;6CQOYT^xop#+@%))r0dj$IDiY;?n7o zzOEm*A71NBj_41?KP{QiP6+2nMIfb%y~zscS6LsM(FFGZ=nC$kd7XL7MOgyom(J@V z&O5~A$LXto5!q*BFoXW~w(e?j(KDh@t0HFSsH!#G-?sn#$qs9%yz@cx4KK0Y@(e34 z*I;2OUgWrXHJ<&1yz`>0g^Q}?B0y`jAh2->i+skVP&9tXxD;_5Y6sHGVtzOH#o?Uk z89V}#n+0X`Ne{Qx&wu{;cn8TE$Is2rKM(hQ{&~TFf9|i!B%{0W>>_2KJ$$&!7oVTu zb7r5K#K0=8`Px?<^gn;Oqhfw9_KGKJsKTn_2;RgBNoCO_&D6_G!W50Ni5d8cp#{|y zmWDVc&b!9GCTxd2>$57BVyo)C<@> zlyzu-z>0XtQhMcvdQ+$LN>&^5N88QF8vMf8o)@wR-#JoaH8u6i9#SH^He* z*R>L?pNgF{m0`1nW%`CQH-*JtkhJe?3puubm3du~`LifE1bY^rKL8rboinn*lSTd- zgXv;x(4_1tubdmEGpEkqq5%)?B{Q-4Z$~FPXMqh8(Y=}B880(x9&jg`6B0f2@9a8J zDU#>E%-=0vIK#ob%m^nN%w!o(=_8(Uht=TbX9j_P))UP1<>1xm`PH%KUgqffcMFbx zpDwF~R3j5C?On5fTgjFT#tgzbmTye4I$71ql{>UdV95f zLoV*5qAlA(Ay&i746_*>a9ms=GGO$7s&cz6n2d*(PJh6ST^?22YNLWB%N2v-1l+oG z;-9V1zQDrDs0igMinl4+RUmOV-nWi}Eo99@W!%4DfFVypqSrjHoa2#JIZlx6(iuuI zo8yOEST2u_l_`o`3fDuAodJSD>KZf~mQJX6dkYSaBhu#EBwoo`DQ(dWJB1{FQlNOT zD*_!ap*9ialQjzl7P<-~Ylbb6q^YZG7Kyr+ZT|jcQx%qNa4JimIFq%@RW!YE#RmJ< zXL-d2wqihV;C}NIrc9kEFyAt~;o`hTpzWZ>H6#~3qulf~?KH%RK=og_6mclEi%qek z@BySwRJ)NDkdBSH!Wm)hgm`>^`o-ve@E@1X=#gk__o!L0kpbNgtrgR$k z&Gl-bz_0kfJ5KIL4uutb3F<7qHj$5)E_$Vb*=db5+i1-a=bHgl4jB%S&2wj7h-p_~ zfB*j6!NRR!Fi zG17{Nc5G+a98ej0l~))9dIcR5GZC>ux#g2C=$h@2sSqg}ZCMq@L=Z9;FKSO{w^$RAk`&gd;;Yz6A2TS8W@T+WyBPqnd2#HN z+0@%Joi(U$bRrLbN}b-uWyM$U^*XXS*?oM+3LW6$TTGp|gvr@h`@sbBf#0b98&6KB zJKH;Ujj?%z{V5(9&jX)6W$g}(;@l8VAwr$AP31rRZPff)8t z^|7k}v|Mg&-3cMt$-&5d9KW+IQvNDMY>#A2BwSs_3scGs3SDV5EfrG$62$0*nfZn@ zrF%VPW0-7)L9ZS?pUfZ7&DZ8%>YiwF8E)SgfW*_tiBzng2v*mHx0e|QJTS@1ibYa9 zA6DPYN0+dFd7|WwhyMC(f(;r7c`}~MEPtM=qIH2259~X8H*lz$H8{JncnzjgXG5mf zwPb~UN{Y>8o%Jf-J}JLjHL@xO?ss9(&~KQXTV>QG<#l*GUIY7stXjrUjE$YRYrVz} z?@CitY_EbPa0<_fci=QkvXxVzLztknL_n!WXC;GwQ)FOXgF?%#%CE(`ukyFrRg^xY zRa<0;aJtV|M;jP1KyQqg$pI6dNc|cX7Az4yp;<5julLV|4PkTdrB&SJ6K{*VSO&&$ z2g@K^?&4UJ@pk-ik^C@yrYw|iZcYSbX{9g9`ppvEEKT#*FFAI0GVNm`IreK|9ogYZ zFJ!fUm79DG?i|DVUfBAOst@J4o+kS@u-^!dJvG9R7 z4IW3prEearw{Mk~@h;llySWH&D4Uyu+5V1346FOUym0~&g|Kao$On|2WAWy>p$&U@ zBP(+Zq!>JhSi#5yoc6okyP=>FMO%scR8snX?Iy1fQ(dpo)V9y|KKgf*kV!6`@harZW_s3lq(hZYGc>^XVyLqR_O}0ASjpi^2ZQOMI zi3=g*OA$APdCn#(WL;`^g#-9~onm70VVydJ+Suv9I<<(pc@UF$80&iZIOwrV7b8}G zRFoW+h9kpFEm$Xuj~bO<3T7c{aC1YB(Fx+-4~I7e`?bfkM-13~HGANg4Hpn|qpM8d z*6*0G(^TGxOC_p)zNZ1OPu+IFdE))3mMz|ufn`NTlx*3Os9=KQB|Q#vh7zAtc&TBw z4DwKyU|gK#D(R6EyEtkGJE}njua4}0%tMg*0d(~}$3UcNgT=ea$yUM3excuaI_J&Y zY*87OHfbqo#6%?JBi)7DaNLpe5-Lfp*4|S5v6tBhHe6X%hA^w|P6&^KNSl-aB+Me9l@G;#L+{u3 zo~|+Rzb;01F!HE}W#Jj;DdJ!>26`5!hdqd1jw@#u)8oO#*TdlVG^w0|UuJ!Lu&5kg z;SBioZGE58UGT+*>CIr z&UEr6f}WuStP8|J2gAzS(?J-2)9J0}XA@6_;JXm!7BaJj35GDAfb}iG)5%)*9X5rKPLmL9#BnuX=GVi2h?~F8MEZaE z6Pm~~@%y*G-WH)rgpaG$$H{$w>bJM|zE2aFd#b8Twok)+cCI6}w1va*YcfQj4lWl+ zoUeOj98q`O920EL*L@YW*P_7&bl;2`8}`9wbXnaXYq4i#)2zd#%G4o*ds#-4TinI} zY|cvw4>{P-E95PbyQ5S|KhwbUTs&Eb;jt5^( z-)@LB6kcz8&pM`myZuclgWG?1;sAaEUTtp0zfBu?;){YuVd%&;hqiM56M3-9%a^V^ z?yJ7mhGh(mY*)4&tBsya_D-xMJd#9vql233@AY`}CiHdfN6S_SgF0B=TL0#4qsZ!9 z8nYOQI`@k$_Y=BmTy1oR(bAd|kT^c=3)WHit#uq|9S7NeI%eb7ptcoa&Z#Y}z$s@owFiS@J7g-W&5*o2-5mBp>jE$SX%CqmaOzhNNb*9S#K)sg z_2*#pP(JOX3@4swySm4J1gPVm_4~;+sen%RelZH=^F)gnh3mzzSoTSz&lqviy01UF$hOm(4sNvHP?@wv09u96VT+Q^(P+ z#jEmHgXiKZ`KAaVXQ2NDb7++M&fN;ZvJar)YT1f;IVsXD2OMa=YTx_9s1y&r40u|M$~R3wQ%wj84ZFKRuiup8Vq<580`9w*hA^ zia99Gve*3YlP_^a9-m)4#g8Xn4#ywx$CED)XT!^{yBO*S8r=r|`H%ke08D92+tj%>}DLy;}ACBBwTS|YXD&%VDZ zJR0amKS;^ROl~swT5Oveo2UUO{FBy2XoK1Smpx+yh*QKF9^%uRRKPX*)thsTbBGmumk`Qa3zCa;rEy0H9?%tN|WBTU+Rx~)1e=hOAG(fUzC5Te^L5y z{G=43Krow@f+?r}^!nvd_jUDmmCB!f_s8E4X8q-Q?w3Z($r#`Cr!)q-7f<}@lRy3L zfBkXf_Xha;zy3IX@s~ZSY7zR&7f)8p%gVu%(lgE)2h(d*K7R2e=+CB4N+S^R;>n=5 z>~(@kZ|FY@zYM>-os6Gf^g_SgEdT9?6Ytad`$q5MPqp4rE$Ci-@Q#D;n-?E%SN%;b z=>70ht$#H8@?&Gr7_3{3?z;7*Kk0wzUcJ2OzB=3tCjH=l_|0hC`#6{lqVn@k_}%wT z)}KE9ebx6yUk0!0<4;%DwNI132HjWn>$AyUf*((ZH=jPfTfRMdd22zr z-*n&n9r(<-%hXQVW zJp42nhZmrK?_zSe`t<&IIGFr>-S@^{F0MfT`{wQORr3Hmk!=`_`folgKYcuFoxJ%J zoL#+KetPrQ(HZC^I;joaqcgPOy4JnAZgr2oA0vMP`qn=2*7`}pqgc=Bm} z@#c2(RYyHVz(5Iik+ZyVuj|M;db?(0!-u_530lK@d zZqQeMP4WBaWq5q_awUJ?{P^l+A-Mmhe(}cFgEvIaas4Df8{hnW{>dBFKnKYIXgsO; zA8*Hs4{yQqPu}sYd({W7?k(!tbc5^t<2S^Yo8?90`_Y*U(PQN%ypmemV0_PG8=$gNed=|8 zuiklYkNUUZQ4_z{-D{LPdbdKk+R5qb8{kKK31%2}PhU1sN3***#`t+n{ogv-oOu#g z3pCZbr)Tw(t9Rhd>l)I*|0eK$NT$DUf}RhXx2OG^?xyR#J>~Su&n3?&cb8>>~Xb@UPbdcd{9x{pbS$58gqBPKTiBY=bh8rI+5j&1=YO z6SQ=x&+4EZw4F8IzPh&omE9xMr z@V&bQy{PMWjr2Nn9QCh+@0)im;Mst;weHa;>T3_}LwXnWzpew1 z?Cawj-~z9QO==rx1MlB8(2m*(>IT2TpEJ}uM1ONT*65qn31kKBfovde)89ZY(2g$g z5cOVf-X0xqqIMkLh`t*(sD8A62XfeFIYT=7_zZIMu0i!kUZLD;@aha{koP0-^k@iP z{&aN0`eg`s>R0H7&6(&wj0^M=+VqZicq91U4?#cVb?AZb)D{g7nO=ea;0?*rYxFDh z(}v{uxQ;P|@q;p(A<3Z!oFTq}2e3zwJIE#LkIm=^xYp=9;O?S7iw2 z$4{-d!OPpX>*FtfySn**@=591hw4L`s~%q;@||hM_p&!BPBk0msH#7z}=<_D#E7m>WJ@rfTVLpF|3|J51mSjZac zIYwLGLH1SpF~;v1c#Hf^w}CMXzKkK`FKZar_{O;19AoUMG1mtl(MQnTXfMe)<`&Xt zuOa(G(C`6c3bK8FDs|=+<__ov=t}U5bmtlD7mQozcFYCPi8L3HY+uW{pi4Sj=vL?+ z&_Q!pqg(4@Y@A^{zUDSVUkTZNb+Z8;=%aUN+XwUk>JohjKKC((&M>AiPEVnG(a%UH z9S54B7q3Xye89LyUGE7VI&Sk0vLS6kfgikXLQi8%LuWyMA41o4n@rEqG1`W?4|Wdl zG$noy@HF4jH~5D+2zp%51N@kaL|;Ny1bhSi3;p;3@7z>0l`<%0qdj=c!zo64Dx_+2iYdskaO#r#tisIa}CBe z=~3|dHT3O&Q5R$N7>xv@3tUHN zA>5u8rgyy$ne#F2sF`ndk4HUFOu!_TG2#u2_5 zHn0O^8;E}xQ+?8Puw}4D*<9b8T%(T7OW=b21w7F6s2et~=x@yJuVF7i?_be;0X+

    F}(gNV|bGs!`HBnuQ9%0Q`&u+I)*X-t;m*y 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 z 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 G*oowkS_@)6U^;tvG8VT|M1P{+HP&9 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 z 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 ld(QrL-XjU28KFwOSr@lWyHpr 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%0Dc8u67*D$^<1~mY@oi4Qv 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%0D~{+gP~m^waV@(w@M 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 + import { Dialog as DialogPrimitive } from 'bits-ui'; + import XIcon from '@lucide/svelte/icons/x'; + + interface Props { + open: boolean; + code: string; + language: string; + onOpenChange?: (open: boolean) => void; + } + + let { open = $bindable(), code, language, onOpenChange }: Props = $props(); + + let iframeRef = $state(null); + + $effect(() => { + if (!iframeRef) return; + + if (open) { + iframeRef.srcdoc = code; + } else { + iframeRef.srcdoc = ''; + } + }); + + function handleOpenChange(nextOpen: boolean) { + open = nextOpen; + onOpenChange?.(nextOpen); + } + + + + + + + + + + + + Close preview + + + + + + diff --git a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte index 1f4caa9003b..1c069db58d8 100644 --- a/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte +++ b/tools/server/webui/src/lib/components/app/misc/MarkdownContent.svelte @@ -15,6 +15,7 @@ import githubLightCss from 'highlight.js/styles/github.css?inline'; import { mode } from 'mode-watcher'; import { remarkLiteralHtml } from '$lib/markdown/literal-html'; + import CodePreviewDialog from './CodePreviewDialog.svelte'; interface Props { content: string; @@ -25,6 +26,9 @@ let containerRef = $state(); let processedHtml = $state(''); + let previewDialogOpen = $state(false); + let previewCode = $state(''); + let previewLanguage = $state('text'); function loadHighlightTheme(isDark: boolean) { if (!browser) return; @@ -117,7 +121,6 @@ const rawCode = codeElement.textContent || ''; const codeId = `code-${Date.now()}-${index}`; - codeElement.setAttribute('data-code-id', codeId); codeElement.setAttribute('data-raw-code', rawCode); @@ -138,11 +141,30 @@ copyButton.setAttribute('type', 'button'); copyButton.innerHTML = ` - - `; + + `; + + const actions = document.createElement('div'); + actions.className = 'code-block-actions'; + + actions.appendChild(copyButton); + + if (language.toLowerCase() === 'html') { + const previewButton = document.createElement('button'); + previewButton.className = 'preview-code-btn'; + previewButton.setAttribute('data-code-id', codeId); + previewButton.setAttribute('title', 'Preview code'); + previewButton.setAttribute('type', 'button'); + + previewButton.innerHTML = ` + + `; + + actions.appendChild(previewButton); + } header.appendChild(languageLabel); - header.appendChild(copyButton); + header.appendChild(actions); wrapper.appendChild(header); const clonedPre = pre.cloneNode(true) as HTMLElement; @@ -180,49 +202,105 @@ } } - function setupCopyButtons() { - if (!containerRef) return; + function getCodeInfoFromTarget(target: HTMLElement) { + const wrapper = target.closest('.code-block-wrapper'); - const copyButtons = containerRef.querySelectorAll('.copy-code-btn'); + if (!wrapper) { + console.error('No wrapper found'); + return null; + } - for (const button of copyButtons) { - button.addEventListener('click', async (e) => { - e.preventDefault(); - e.stopPropagation(); + const codeElement = wrapper.querySelector('code[data-code-id]'); - const target = e.currentTarget as HTMLButtonElement; - const codeId = target.getAttribute('data-code-id'); + if (!codeElement) { + console.error('No code element found in wrapper'); + return null; + } - if (!codeId) { - console.error('No code ID found on button'); - return; - } + const rawCode = codeElement.getAttribute('data-raw-code'); - // Find the code element within the same wrapper - const wrapper = target.closest('.code-block-wrapper'); - if (!wrapper) { - console.error('No wrapper found'); - return; - } + if (rawCode === null) { + console.error('No raw code found'); + return null; + } - const codeElement = wrapper.querySelector('code[data-code-id]'); - if (!codeElement) { - console.error('No code element found in wrapper'); - return; - } + const languageLabel = wrapper.querySelector('.code-language'); + const language = languageLabel?.textContent?.trim() || 'text'; - const rawCode = codeElement.getAttribute('data-raw-code'); - if (!rawCode) { - console.error('No raw code found'); - return; - } + return { rawCode, language }; + } - try { - await copyCodeToClipboard(rawCode); - } catch (error) { - console.error('Failed to copy code:', error); - } - }); + async function handleCopyClick(event: Event) { + event.preventDefault(); + event.stopPropagation(); + + const target = event.currentTarget as HTMLButtonElement | null; + + if (!target) { + return; + } + + const info = getCodeInfoFromTarget(target); + + if (!info) { + return; + } + + try { + await copyCodeToClipboard(info.rawCode); + } catch (error) { + console.error('Failed to copy code:', error); + } + } + + function handlePreviewClick(event: Event) { + event.preventDefault(); + event.stopPropagation(); + + const target = event.currentTarget as HTMLButtonElement | null; + + if (!target) { + return; + } + + const info = getCodeInfoFromTarget(target); + + if (!info) { + return; + } + + previewCode = info.rawCode; + previewLanguage = info.language; + previewDialogOpen = true; + } + + function setupCodeBlockActions() { + if (!containerRef) return; + + const wrappers = containerRef.querySelectorAll('.code-block-wrapper'); + + for (const wrapper of wrappers) { + const copyButton = wrapper.querySelector('.copy-code-btn'); + const previewButton = wrapper.querySelector('.preview-code-btn'); + + if (copyButton && copyButton.dataset.listenerBound !== 'true') { + copyButton.dataset.listenerBound = 'true'; + copyButton.addEventListener('click', handleCopyClick); + } + + if (previewButton && previewButton.dataset.listenerBound !== 'true') { + previewButton.dataset.listenerBound = 'true'; + previewButton.addEventListener('click', handlePreviewClick); + } + } + } + + function handlePreviewDialogOpenChange(open: boolean) { + previewDialogOpen = open; + + if (!open) { + previewCode = ''; + previewLanguage = 'text'; } } @@ -243,7 +321,7 @@ $effect(() => { if (containerRef && processedHtml) { - setupCopyButtons(); + setupCodeBlockActions(); } }); @@ -253,6 +331,13 @@ {@html processedHtml} + + + + + +

      Metrics

      + + + + + + + + + + + + + + + + + + + + + + + + + +
      MetricValue
      Score0.925
      chars2296.1916666666666
      chars:std986.051306946325
      score:std0.26339134382131846
      + +

      Examples

      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First write the two numbers in base‑10.
      +
      +\[
      +17_{b}=1\cdot b+7=b+7,\qquad 
      +97_{b}=9\cdot b+7=9b+7 .
      +\]
      +
      +We need  
      +
      +\[
      +b+7 \mid 9b+7 .
      +\]
      +
      +Use the Euclidean algorithm:
      +
      +\[
      +9b+7 = 9(b+7)-56 .
      +\]
      +
      +Hence  
      +
      +\[
      +b+7 \mid 9b+7 \iff b+7 \mid 56 .
      +\]
      +
      +So \(b+7\) must be a positive divisor of \(56\).
      +
      +Since the base must satisfy \(b>9\), we have \(b+7>16\).  
      +The divisors of \(56\) exceeding \(16\) are \(28\) and \(56\).
      +
      +\[
      +\begin{cases}
      +b+7=28 \ \Rightarrow\ b=21,\\[2pt]
      +b+7=56 \ \Rightarrow\ b=49.
      +\end{cases}
      +\]
      +
      +Both bases indeed work:
      +
      +\[
      +\frac{97_{21}}{17_{21}}=\frac{196}{28}=7,\qquad 
      +\frac{97_{49}}{17_{49}}=\frac{448}{56}=8 .
      +\]
      +
      +Therefore the required bases are \(21\) and \(49\), and their sum is  
      +
      +\[
      +21+49 = 70.
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +c=\#\text{ chocolate},\qquad v=\#\text{ vanilla},\qquad s=\#\text{ strawberry}
      +\]
      +
      +with  
      +
      +\[
      +c+v+s =9,\qquad c>v>s\ge1 .
      +\]
      +
      +---
      +
      +### 1. Find all possible triples \((c,v,s)\).
      +
      +Since \(c>v>s\ge 1\),
      +
      +\[
      +c\ge s+2,\; v\ge s+1 \Longrightarrow c+v+s\ge 3s+3\le9\Longrightarrow s\le2 .
      +\]
      +
      +- **If \(s=1\)**: \(v\ge2,\ c\ge3\) and \(c+v=8\).  
      +  Possibilities: \((c,v)=(6,2),(5,3)\).
      +
      +- **If \(s=2\)**: \(v\ge3,\ c\ge4\) and \(c+v=7\).  
      +  Possibility: \((c,v)=(4,3)\).
      +
      +Thus the only triples are  
      +
      +\[
      +(6,2,1),\quad (5,3,1),\quad (4,3,2).
      +\]
      +
      +---
      +
      +### 2. Count assignments for each triple.
      +
      +For a given \((c,v,s)\) the number of assignments of flavors to the nine distinct players is the multinomial coefficient  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +\[
      +\begin{aligned}
      +(6,2,1):\quad &\frac{9!}{6!\,2!\,1!}= \binom{9}{6}\binom{3}{2}=84\cdot3=252,\\[4pt]
      +(5,3,1):\quad &\frac{9!}{5!\,3!\,1!}= \binom{9}{5}\binom{4}{3}=126\cdot4=504,\\[4pt]
      +(4,3,2):\quad &\frac{9!}{4!\,3!\,2!}= \binom{9}{4}\binom{5}{3}=126\cdot10=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 3. Total number of assignments
      +
      +\[
      +N = 252+504+1260 = 2016.
      +\]
      +
      +---
      +
      +### 4. Remainder modulo \(1000\)
      +
      +\[
      +N \bmod 1000 = 2016 \bmod 1000 = 16.
      +\]
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid have parallel sides \(r\) and \(s\) \((r\neq s)\) and equal legs \(L\).
      +
      +---
      +
      +### 1.  Semiperimeter from the incircle
      +
      +A convex quadrilateral that contains an incircle (a tangential quadrilateral) satisfies  
      +
      +\[
      +\text{Area}= (\text{inradius})\times (\text{semiperimeter}).
      +\]
      +
      +The inradius is \(3\) and the area is \(72\); therefore  
      +
      +\[
      +p=\frac{\text{Area}}{r_{\text{in}}}= \frac{72}{3}=24,
      +\]
      +
      +where \(p\) is the semiperimeter.
      +
      +---
      +
      +### 2.  Relation among the sides
      +
      +For a tangential quadrilateral, Pitot’s theorem gives  
      +
      +\[
      +\text{(sum of one pair of opposite sides)} = \text{(sum of the other pair)} .
      +\]
      +
      +In an isosceles trapezoid the opposite sides are the two bases and the two equal legs, so  
      +
      +\[
      +r+s = L+L =2L \quad\Longrightarrow\quad L=\frac{r+s}{2}.
      +\]
      +
      +The semiperimeter is  
      +
      +\[
      +p = \frac{r+s+2L}{2}= \frac{r+s+r+s}{2}=r+s .
      +\]
      +
      +Since \(p=24\), we obtain  
      +
      +\[
      +\boxed{r+s=24}.
      +\]
      +
      +Consequently  
      +
      +\[
      +L=\frac{r+s}{2}=12 .
      +\]
      +
      +---
      +
      +### 3.  Height of the trapezoid
      +
      +The incircle is tangent to both parallel sides, so the distance between those sides (the height \(h\)) equals twice the radius:
      +
      +\[
      +h = 2\cdot 3 = 6 .
      +\]
      +
      +---
      +
      +### 4.  Using the leg length
      +
      +Place the trapezoid with its bases horizontal. The horizontal offset between the ends of the bases is \(\dfrac{|r-s|}{2}\). Hence, by the Pythagorean theorem,
      +
      +\[
      +L^{2}= \left(\frac{r-s}{2}\right)^{2}+h^{2}.
      +\]
      +
      +With \(L=12\) and \(h=6\),
      +
      +\[
      +12^{2}= \left(\frac{r-s}{2}\right)^{2}+6^{2}
      +\quad\Longrightarrow\quad
      +144 = \frac{(r-s)^{2}}{4}+36
      +\quad\Longrightarrow\quad
      +(r-s)^{2}=432.
      +\]
      +
      +---
      +
      +### 5.  Compute \(r^{2}+s^{2}\)
      +
      +\[
      +\begin{aligned}
      +(r+s)^{2} &= r^{2}+2rs+s^{2}=24^{2}=576,\\
      +(r-s)^{2} &= r^{2}-2rs+s^{2}=432.
      +\end{aligned}
      +\]
      +
      +Adding these equations eliminates the \(rs\) term:
      +
      +\[
      +(r+s)^{2}+(r-s)^{2}=2(r^{2}+s^{2})\Longrightarrow
      +576+432=2(r^{2}+s^{2}).
      +\]
      +
      +Thus
      +
      +\[
      +r^{2}+s^{2}= \frac{1008}{2}=504.
      +\]
      +
      +---
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +is a circle with centre  
      +
      +\[
      +C=(25,20)
      +\]
      +
      +and radius \(r=5\).
      +
      +The second equation  
      +
      +\[
      +|z-4-k| = |z-3i-k|
      +\]
      +
      +means that \(z\) is equidistant from the points  
      +
      +\[
      +A=4+k \qquad\text{and}\qquad B=3i+k .
      +\]
      +
      +Thus \(A=(k+4,0),\; B=(k,3)\).  
      +The set of points equidistant from \(A\) and \(B\) is the perpendicular bisector of \(\overline{AB}\).
      +
      +---
      +
      +### Equation of the perpendicular bisector
      +
      +Midpoint of \(AB\):
      +
      +\[
      +M=\Bigl(\frac{k+4+k}{2},\frac{0+3}{2}\Bigr)=(k+2,\frac32).
      +\]
      +
      +The vector \(\overrightarrow{AB}=(-4,3)\).  
      +A direction vector perpendicular to this is \((3,4)\) (since \((-4,3)\cdot(3,4)=0\)).  
      +
      +Hence the line has slope \(\frac43\) and equation  
      +
      +\[
      +y-\frac32 = \frac43\bigl(x-(k+2)\bigr)
      +\]
      +\[
      +\Longrightarrow\; y = \frac43 x - \frac43 k - \frac76 .
      +\]
      +
      +In standard form:
      +
      +\[
      +8x-6y = 8k+7 .
      +\]
      +
      +---
      +
      +### Tangency condition
      +
      +The system will have exactly one solution iff this line is tangent to the circle.  
      +The distance from the centre \(C=(25,20)\) to the line \(8x-6y-(8k+7)=0\) must equal the radius \(5\):
      +
      +\[
      +\frac{|8\cdot25-6\cdot20-(8k+7)|}{\sqrt{8^{2}+(-6)^{2}}}=5.
      +\]
      +
      +Compute the numerator:
      +
      +\[
      +8\cdot25-6\cdot20-(8k+7)=200-120-8k-7=73-8k.
      +\]
      +
      +Since \(\sqrt{8^{2}+6^{2}}=10\),
      +
      +\[
      +\frac{|73-8k|}{10}=5 \quad\Longrightarrow\quad |73-8k|=50.
      +\]
      +
      +Thus  
      +
      +\[
      +73-8k = 50 \quad\text{or}\quad 73-8k = -50.
      +\]
      +
      +\[
      +\begin{cases}
      +8k = 23 \;\;\Rightarrow\; k = \dfrac{23}{8},\\[4pt]
      +8k = 123\;\Rightarrow\; k = \dfrac{123}{8}.
      +\end{cases}
      +\]
      +
      +Both values give a tangent line, so each yields exactly one solution \(z\).
      +
      +---
      +
      +### Sum of all possible \(k\)
      +
      +\[
      +k_1+k_2 = \frac{23}{8}+\frac{123}{8}= \frac{146}{8}= \frac{73}{4}.
      +\]
      +
      +Write \(\frac{73}{4}\) as \(\frac{m}{n}\) with \(\gcd(m,n)=1\): \(m=73,\ n=4\).
      +
      +\[
      +m+n = 73+4 = 77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equation  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +is a homogeneous quadratic form.  Factor it over the rationals.
      +
      +\[
      +12x^{2}-xy-6y^{2}= -6\Bigl(y-\frac43x\Bigr)\Bigl(y+\frac32x\Bigr)
      +\]
      +
      +Hence  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0\iff 
      +\Bigl(y-\frac43x\Bigr)\Bigl(y+\frac32x\Bigr)=0 .
      +\]
      +
      +So any integer solution must satisfy one of the two linear equations  
      +
      +\[
      +y=\frac{4}{3}x\quad\text{or}\quad y=-\frac32 x .
      +\]
      +
      +---
      +
      +### 1.  Solutions of \(y=\frac43x\)
      +
      +Write \(3y=4x\).  
      +Since \(\gcd(3,4)=1\), the integer solutions are  
      +
      +\[
      +x=3k,\qquad y=4k\qquad(k\in\mathbb Z).
      +\]
      +
      +Both coordinates must lie in \([-100,100]\):
      +
      +\[
      +-100\le 3k\le100,\qquad -100\le4k\le100
      +\]
      +
      +The second inequality is stricter, giving  
      +
      +\[
      +-25\le k\le 25 .
      +\]
      +
      +Thus there are  
      +
      +\[
      +25-(-25)+1 = 51
      +\]
      +
      +integer points on this line.
      +
      +---
      +
      +### 2.  Solutions of \(y=-\frac32x\)
      +
      +Write \(2y=-3x\).  
      +Since \(\gcd(2,3)=1\), the integer solutions are  
      +
      +\[
      +x=2k,\qquad y=-3k\qquad(k\in\mathbb Z).
      +\]
      +
      +Both coordinates must satisfy  
      +
      +\[
      +-100\le2k\le100,\qquad -100\le-3k\le100 .
      +\]
      +
      +These give  
      +
      +\[
      +-50\le k\le50,\qquad -\frac{100}{3}\le k\le\frac{100}{3}\Longrightarrow -33\le k\le33 .
      +\]
      +
      +Hence there are  
      +
      +\[
      +33-(-33)+1 = 67
      +\]
      +
      +integer points on this line.
      +
      +---
      +
      +### 3.  Remove double‑counted point
      +
      +The two lines intersect only at \((0,0)\) (when \(k=0\) in both families).  
      +Thus the total number of distinct ordered pairs is  
      +
      +\[
      +51+67-1 = 117 .
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Divisibility conditions**
      +
      +For an integer to be divisible by \(22\) it must be divisible by \(2\) and by \(11\).
      +
      +*Divisible by 2* – the last digit (the units digit) must be even, i.e. one of \(\{2,4,6,8\}\).
      +
      +*Divisible by 11* – for an 8‑digit number \(a_1a_2\ldots a_8\) (with \(a_1\) the leftmost digit) the rule is  
      +
      +\[
      +(a_8+a_6+a_4+a_2)-(a_7+a_5+a_3+a_1)\equiv0\pmod{11}.
      +\]
      +
      +Thus the sum of the digits in the even positions (2,4,6,8) equals the sum of the digits in the odd positions (1,3,5,7) modulo \(11\).
      +
      +The total sum of the digits \(1+2+\dots+8=36\).  
      +If the two sums are equal modulo \(11\), then
      +
      +\[
      +2\cdot(\text{odd–position sum})\equiv36\equiv3\pmod{11}
      +\Longrightarrow\text{odd–position sum}\equiv7\pmod{11}.
      +\]
      +
      +The possible values are \(7,18,29,\ldots\).  
      +Since four distinct digits from \(\{1,\dots ,8\}\) can sum only between \(10\) and \(26\), the only feasible value is  
      +
      +\[
      +\boxed{\text{odd–position sum}=18}.
      +\]
      +
      +Consequently the even–position sum is also \(18\).
      +
      +**Step 2.  Choose the digits for the odd positions**
      +
      +We need all 4‑element subsets of \(\{1,2,3,4,5,6,7,8\}\) whose sum is \(18\).
      +
      +Listing them (or by noting the complementary pairs) gives  
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are  
      +
      +\[
      +\boxed{M=8}
      +\]
      +
      +such subsets.  
      +Each of them contains exactly two even digits (because a sum of 18 cannot be obtained with a different parity distribution), so for every subset \(A\) (odd‑position digits) we have  
      +
      +\[
      +e_A=2,\qquad E_B=4-e_A=2,
      +\]
      +
      +where \(E_B\) is the number of even digits among the complementary set \(B\) (the even‑position digits).
      +
      +**Step 3.  Arrange the digits**
      +
      +*Odd positions* (1,3,5,7): the four digits of \(A\) can be placed in \(4! = 24\) ways.
      +
      +*Even positions* (2,4,6,8): the four digits of \(B\) must be placed so that the digit in position 8 (the units digit) is even.  
      +Since \(B\) contains exactly \(E_B=2\) even digits, we have  
      +
      +\[
      +\text{choices for the units digit}=2,
      +\qquad
      +\text{ways to arrange the remaining three digits}=3! = 6.
      +\]
      +
      +Thus the number of admissible placements for \(B\) is  
      +
      +\[
      +f(B)=2\cdot 6=12.
      +\]
      +
      +**Step 4.  Count all numbers**
      +
      +For each of the \(M=8\) valid subsets \(A\),
      +
      +\[
      +\text{numbers contributed}=24\times12=288.
      +\]
      +
      +Hence  
      +
      +\[
      +N=8\times288=2304.
      +\]
      +
      +**Step 5.  Compute the required difference**
      +
      +\[
      +N-2025=2304-2025=279.
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The original parabola is  
      +
      +\[
      +y=x^{2}-4 .
      +\]
      +
      +---
      +
      +### 1.  Equation of the rotated parabola  
      +
      +Rotate the plane \(60^{\circ}\) counter‑clockwise about the origin.
      +If \((X,Y)\) is a point of the rotated parabola, then rotating it back
      +\(60^{\circ}\) clockwise gives a point \((x',y')\) on the original parabola.
      +
      +\[
      +\begin{pmatrix}x'\\y'\end{pmatrix}
      +=
      +\begin{pmatrix}\cos60^\circ&\sin60^\circ\\
      +-\sin60^\circ&\cos60^\circ\end{pmatrix}
      +\begin{pmatrix}X\\Y\end{pmatrix}
      +=
      +\begin{pmatrix}\frac12X+\frac{\sqrt3}{2}Y\\[2pt]
      +-\frac{\sqrt3}{2}X+\frac12Y\end{pmatrix}.
      +\]
      +
      +Thus  
      +
      +\[
      +y' = x'^2-4\Longrightarrow 
      +\frac{-\sqrt3X+Y}{2} =\Bigl(\frac{X+\sqrt3Y}{2}\Bigr)^{\!2}-4.
      +\]
      +
      +Multiplying by \(2\) and simplifying gives the equation of the rotated
      +parabola:
      +
      +\[
      +(x+\sqrt3\,y)^{2}+2\sqrt3\,x-2y-16=0. \tag{1}
      +\]
      +
      +---
      +
      +### 2.  Intersection with the original parabola  
      +
      +Substituting \(y=x^{2}-4\) from the original parabola into (1) yields
      +
      +\[
      +\bigl(x+\sqrt3(x^{2}-4)\bigr)^{2}+2\sqrt3\,x-2(x^{2}-4)-16=0,
      +\]
      +
      +which simplifies to
      +
      +\[
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40=0. \tag{2}
      +\]
      +
      +---
      +
      +### 3.  Factoring the quartic  
      +
      +Look for a factorisation of the form  
      +\((ax^{2}+b\sqrt3\,x+c)(dx^{2}+e\sqrt3\,x+f)\).
      +Matching coefficients gives the system  
      +
      +\[
      +\begin{cases}
      +ad=3\\
      +ae+bd=2\\
      +af+3be+cd=-25\\
      +bf+ce=-6\\
      +cf=40
      +\end{cases}
      +\]
      +
      +which is solved by  
      +
      +\[
      +a=1,\;b=1,\;c=-4,\qquad d=3,\;e=-1,\;f=-10 .
      +\]
      +
      +Hence
      +
      +\[
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40
      +   =(x^{2}+\sqrt3\,x-4)(3x^{2}-\sqrt3\,x-10). \tag{3}
      +\]
      +
      +---
      +
      +### 4.  Solving for the intersection points  
      +
      +From (3) we obtain four possible \(x\)-coordinates.
      +
      +1. \(x^{2}+\sqrt3\,x-4=0\)
      +
      +\[
      +x=\frac{-\sqrt3\pm\sqrt{19}}{2}.
      +\]
      +
      +2. \(3x^{2}-\sqrt3\,x-10=0\)
      +
      +\[
      +x=\frac{\sqrt3\pm\sqrt{123}}{6}.
      +\]
      +
      +For each \(x\) we compute \(y=x^{2}-4\).
      +
      +| \(x\) | sign of \(x\) | \(y=x^{2}-4\) | quadrant |
      +|---|---|---|---|
      +| \(\displaystyle\frac{-\sqrt3+\sqrt{19}}{2}\) | \(>0\) | \(\displaystyle\frac{3-\sqrt{57}}{2}<0\) | **IV** |
      +| \(\displaystyle\frac{-\sqrt3-\sqrt{19}}{2}\) | \(<0\) | \(>0\) | II |
      +| \(\displaystyle\frac{\sqrt3+\sqrt{123}}{6}\) | \(>0\) | \(>0\) | I |
      +| \(\displaystyle\frac{\sqrt3-\sqrt{123}}{6}\) | \(<0\) | \(<0\) | III |
      +
      +Only the first solution lies in the fourth quadrant, as required.
      +
      +---
      +
      +### 5.  The required \(y\)-coordinate  
      +
      +For  
      +\[
      +x=\frac{-\sqrt3+\sqrt{19}}{2},
      +\]
      +\[
      +y=x^{2}-4
      +   =\left(\frac{-\sqrt3+\sqrt{19}}{2}\right)^{2}-4
      +   =\frac{19+3-2\sqrt{57}}{4}-4
      +   =\frac{22-2\sqrt{57}}{4}-\frac{16}{4}
      +   =\frac{3-\sqrt{57}}{2}.
      +\]
      +
      +Thus  
      +
      +\[
      +y=\frac{a-\sqrt{b}}{c}\quad\text{with}\quad a=3,\;b=57,\;c=2,
      +\]
      +and \(\gcd(a,c)=1\).
      +
      +Finally  
      +
      +\[
      +a+b+c=3+57+2=62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\vec{AB}= \mathbf b ,\qquad \vec{AC}= \mathbf c ,\qquad 
      +|\mathbf b| =28,\; |\mathbf c| =91 .
      +\]
      +
      +Write every point on the sides as a linear combination of \(\mathbf b,\mathbf c\).
      +
      +\[
      +\begin{aligned}
      +D&=\frac{4}{28}\mathbf b =\frac17\mathbf b ,&
      +E&=\frac{20}{28}\mathbf b =\frac57\mathbf b ,\\[2mm]
      +F&=\frac{13}{91}\mathbf c ,&
      +G&=\frac{65}{91}\mathbf c .
      +\end{aligned}
      +\]
      +
      +The reflections about a point are central symmetries, thus  
      +
      +\[
      +M=2F-D=-\frac17\mathbf b+\frac{26}{91}\mathbf c ,\qquad
      +N=2E-G=\frac{10}{7}\mathbf b-\frac{65}{91}\mathbf c .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Area of \(\triangle ABC\)
      +
      +The quadrilateral \(DEGF\) can be split into \(\triangle DE G\) and \(\triangle DGF\).
      +
      +For any three points \(P=\alpha\mathbf b+\beta\mathbf c\),
      +\(Q=\gamma\mathbf b+\delta\mathbf c\) we have  
      +
      +\[
      +\bigl[(Q-P)\times(R-P)\bigr]
      +    =(\gamma-\alpha)(\zeta-\beta)-(\delta-\beta)(\xi-\alpha)\;\bigl(\mathbf b\times\mathbf c\bigr),
      +\]
      +
      +so the area of a triangle equals the absolute value of that determinant
      +times \(\dfrac12|\mathbf b\times\mathbf c|\).
      +
      +*Triangle \(DEG\)*  
      +
      +\[
      +\det\!\begin{pmatrix}
      +\frac57-\frac17 & 0\\[2mm]
      +0-\frac17&\frac{65}{91}
      +\end{pmatrix}
      +  =\frac{20}{49}.
      +\]
      +
      +Thus \(\displaystyle
      +\text{Area}(DEG)=\frac{20}{49}\cdot\frac12|\mathbf b\times\mathbf c|.
      +\)
      +
      +*Triangle \(DGF\)*  
      +
      +\[
      +\det\!\begin{pmatrix}
      +0-\frac17&\frac{65}{91}\\[2mm]
      +0-\frac17&\frac{13}{91}
      +\end{pmatrix}
      +  =\frac{4}{49},
      +\qquad
      +\text{Area}(DGF)=\frac{4}{49}\cdot\frac12|\mathbf b\times\mathbf c|.
      +\]
      +
      +Hence  
      +
      +\[
      +\text{Area}(DEGF)=\Bigl(\frac{20}{49}+\frac{4}{49}\Bigr)
      +                  \frac12|\mathbf b\times\mathbf c|
      +                =\frac{24}{49}\,\text{Area}(\triangle ABC).
      +\]
      +
      +Given \(\text{Area}(DEGF)=288\),
      +
      +\[
      +\frac{24}{49}\,\text{Area}(\triangle ABC)=288
      +\Longrightarrow
      +\text{Area}(\triangle ABC)=288\cdot\frac{49}{24}=12\cdot49=588.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Area of the heptagon \(AFNBCEM\)
      +
      +Place the points in the \((\alpha,\beta)\)–plane where \((\alpha,\beta)\) are the
      +coefficients of \(\mathbf b,\mathbf c\):
      +
      +\[
      +\begin{array}{c|c}
      +\text{Vertex}&(\alpha,\beta)\\\hline
      +A&(0,0)\\
      +F&(0,\frac{13}{91})\\
      +N&(\frac{10}{7},-\frac{65}{91})\\
      +B&(1,0)\\
      +C&(0,1)\\
      +E&(\frac57,0)\\
      +M&\bigl(-\frac17,\frac{26}{91}\bigr)
      +\end{array}
      +\]
      +
      +Applying the shoelace formula to these seven points gives
      +
      +\[
      +\begin{aligned}
      +\sum x_i y_{i+1}-y_i x_{i+1}
      +&=1,\\[2mm]
      +\text{Area}_{\text{coeff}}&=\frac12\cdot1=\frac12 .
      +\end{aligned}
      +\]
      +
      +In the original plane a figure’s area is multiplied by
      +\(|\mathbf b\times\mathbf c|=2\,\text{Area}(\triangle ABC)\).
      +Thus
      +
      +\[
      +\text{Area}(AFNBCEM)=|\mathbf b\times\mathbf c|\,
      +\frac12
      +   =\text{Area}(\triangle ABC)=588.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The 12 letters are  
      +
      +\[
      +A,B,C,D,E,F,G,H,I,J,K,L .
      +\]
      +
      +A random grouping into six unordered pairs is performed, each pair is written with its
      +letters in alphabetical order, and then the six two‑letter “words’’ are listed
      +alphabetically.  
      +
      +Let the word that appears last (the lexicographically greatest word) be called the **max word**.
      +The max word is determined by the *first* letters of the six pairs:
      +its first letter is the largest among the six first letters, and if several pairs have that
      +first letter, the one with the larger second letter wins.
      +
      +--------------------------------------------------------------------
      +### 1.   Total number of possible pairings
      +\[
      +\#\text{pairings}= \frac{12!}{2!^{6}\,6!}=10395 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.   When does the max word contain \(G\)?
      +
      +Two mutually exclusive possibilities:
      +
      +* **(A) \(G\) is the first letter of its pair.**  
      +  Then the pair is \((G,X)\) with \(X\in\{H,I,J,K,L\}\).
      +  For \((G,X)\) to be the max word, no other pair may have a first
      +  letter larger than \(G\).  
      +  Hence each of the other four letters \(\{H,I,J,K,L\}\setminus\{X\}\) must be paired
      +  with a letter \(\le F\) (otherwise its first letter would exceed \(G\)).
      +  The remaining letters are  
      +
      +  * 4 “high’’ letters \(\{H,I,J,K,L\}\setminus\{X\}\);
      +  * 6 “low’’ letters \(\{A,B,C,D,E,F\}\).
      +
      +  Choose which four low letters are matched with the four high letters
      +  and then match them (an injection).  
      +  The number of ways is  
      +
      +  \[
      +  {}_{6}P_{4}=6\cdot5\cdot4\cdot3=360 .
      +  \]
      +
      +  The two low letters left over are forced to pair with each other.
      +  Thus for a fixed \(X\) there are \(360\) pairings, and there are
      +  \(5\) possible choices for \(X\):
      +
      +  \[
      +  N_A=5\cdot360=1800 .
      +  \]
      +
      +* **(B) \(G\) is the second letter of its pair.**  
      +  Then the pair is \((X,G)\) with \(X<G\), and \(X\) must be the
      +  largest first letter of any pair.  
      +  If \(X\le E\) there are not enough letters \(\le X\) to pair with all
      +  letters \(>X\) (there would be more “high’’ letters than “low’’ ones).  
      +  The only possible value is \(X=F\).
      +
      +  Pair \(G\) with \(F\).  The five letters \(\{H,I,J,K,L\}\) must each be paired
      +  with a distinct letter from \(\{A,B,C,D,E\}\).  There are  
      +
      +  \[
      +  5! =120
      +  \]
      +
      +  ways to do this, and no letters remain.
      +
      +  Hence  
      +
      +  \[
      +  N_B =120 .
      +  \]
      +
      +--------------------------------------------------------------------
      +### 3.   Favourable pairings
      +\[
      +N_{\text{fav}}=N_A+N_B=1800+120=1920 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.   Desired probability
      +\[
      +P=\frac{N_{\text{fav}}}{\#\text{pairings}}
      +   =\frac{1920}{10395}
      +   =\frac{128}{693}\qquad(\gcd(128,693)=1).
      +\]
      +
      +Thus \(m=128,\;n=693\) and  
      +
      +\[
      +m+n=128+693=821 .
      +\]
      +
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line be the \(x\)-axis and put  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(c,0),\qquad D=(d,0),\qquad E=(e,0),\qquad F=(f,0)
      +\]
      +
      +with the points in the order \(A\!<\!B\!<\!C\!<\!D\!<\!E\!<\!F\).
      +
      +---
      +
      +### 1.  Locate the collinear points
      +
      +\[
      +\begin{aligned}
      +AC&=26 \Longrightarrow c-0 = 26 \; \Rightarrow\; c=26,\\[2pt]
      +CE&=31 \Longrightarrow e-c =31 \; \Rightarrow\; e=26+31=57,\\[2pt]
      +AF&=73 \Longrightarrow f=73 .
      +\end{aligned}
      +\]
      +
      +From \(DF=33\) we get  
      +
      +\[
      +f-d =33 \Longrightarrow d = f-33 = 73-33 =40 .
      +\]
      +
      +From \(BD=22\),
      +
      +\[
      +d-b =22 \Longrightarrow b = d-22 = 40-22 =18 .
      +\]
      +
      +Thus  
      +
      +\[
      +A=(0,0),\; B=(18,0),\; C=(26,0),\; D=(40,0),\; E=(57,0),\; F=(73,0).
      +\]
      +
      +All distances given in the statement are satisfied.
      +
      +---
      +
      +### 2.  Position of \(G\)
      +
      +Let \(G=(x,y)\) with \(y\neq0\).  
      +The distances to \(C\) and \(D\) give
      +
      +\[
      +\begin{cases}
      +(x-26)^2+y^2 = 40^2 =1600,\\[2pt]
      +(x-40)^2+y^2 = 30^2 = 900 .
      +\end{cases}
      +\]
      +
      +Subtracting the equations:
      +
      +\[
      +(x-26)^2-(x-40)^2 = 700.
      +\]
      +
      +Expanding,
      +
      +\[
      +(-52x+26^2)+(80x-40^2)=700\;\Longrightarrow\;28x-924=700,
      +\]
      +
      +so  
      +
      +\[
      +28x=1624\quad\Longrightarrow\quad x=58 .
      +\]
      +
      +Plug \(x=58\) into \((x-26)^2+y^2=1600\):
      +
      +\[
      +(58-26)^2+y^2 = 32^2 + y^2 = 1600\;\Longrightarrow\; y^2 = 1600-1024 = 576,
      +\]
      +
      +hence \(|y|=24\).  
      +Take \(G=(58,24)\) (the other choice \((58,-24)\) gives the same area).
      +
      +---
      +
      +### 3.  Area of \(\triangle BGE\)
      +
      +Points:
      +
      +\[
      +B=(18,0),\qquad E=(57,0),\qquad G=(58,24).
      +\]
      +
      +The base \(BE\) lies on the \(x\)-axis, so its length is  
      +
      +\[
      +BE = 57-18 = 39.
      +\]
      +
      +The altitude from \(G\) to the line \(BE\) is simply \(|y| = 24\).
      +
      +Thus  
      +
      +\[
      +\text{Area} = \frac12 \times (\text{base}) \times (\text{height})
      +            = \frac12 \times 39 \times 24
      +            = 39 \times 12
      +            = 468 .
      +\]
      +
      +(Equivalently, the shoelace formula gives \(\frac12|1368-432|=468\).)
      +
      +---
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +d=n+2\qquad (d\ge 1,\; n=d-2).
      +\]
      +
      +Then  
      +
      +\[
      +n+3=d+1 ,\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .
      +\]
      +
      +Hence  
      +
      +\[
      +3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).
      +\]
      +
      +The condition \(d\mid 3(n+3)(n^{2}+9)\) becomes  
      +
      +\[
      +d \mid 3(d+1)(d^{2}-4d+13).
      +\]
      +
      +Take this congruence modulo \(d\).  
      +Since \(d\equiv0\pmod d\),
      +
      +\[
      +d+1\equiv1,\qquad d^{2}-4d+13\equiv13\pmod d,
      +\]
      +
      +so  
      +
      +\[
      +3(d+1)(d^{2}-4d+13)\equiv 3\cdot1\cdot13=39\pmod d.
      +\]
      +
      +Thus \(d\) must divide \(39\):
      +
      +\[
      +d\in\{1,3,13,39\}.
      +\]
      +
      +Recall \(d=n+2\) and we need \(n>0\).  
      +Hence
      +
      +\[
      +n=d-2\in\{-1,1,11,37\}.
      +\]
      +
      +Discard the non‑positive value \(-1\). The admissible positive integers are  
      +
      +\[
      +n=1,\;11,\;37 .
      +\]
      +
      +Check:
      +
      +* \(n=1\): \(n+2=3\) and \(3(1+3)(1^{2}+9)=120\) is divisible by \(3\).
      +* \(n=11\): \(n+2=13\) and \(3(14)(130)=5460\) is divisible by \(13\).
      +* \(n=37\): \(n+2=39\) and \(3(40)(1378)=165360\) is divisible by \(39\).
      +
      +All satisfy the condition.  
      +
      +The required sum is  
      +
      +\[
      +1+11+37 = 49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For the periodic saw‑tooth  
      +
      +\[
      +f(x)=\begin{cases}
      +x-4k,&x\in[-1+4k,\,1+4k)\\[2pt]
      +4k+2-x,&x\in[1+4k,\,3+4k)
      +\end{cases}\qquad(k\in\mathbb Z)
      +\]
      +
      +the parabola is  
      +
      +\[
      +x = 34y^{2}\qquad (y\in[-1,1]).
      +\]
      +
      +Hence an intersection point \((x,y)\) must satisfy  
      +
      +\[
      +y=f(x),\qquad x=34y^{2}.
      +\]
      +
      +---
      +
      +### 1.  Intersections on an “up” segment  
      +
      +On an up segment \(x= y+4k\).  
      +Substituting \(x=34y^{2}\) gives  
      +
      +\[
      +34y^{2}=y+4k\;\Longrightarrow\;34y^{2}-y-4k=0 .
      +\]
      +
      +For each integer \(k\) with an up segment inside \([0,34]\) (i.e. \(k=0,1,\dots ,8\))
      +the two roots are  
      +
      +\[
      +y_{k}^{\pm}=\frac{1\pm\sqrt{1+544k}}{68}.
      +\]
      +
      +Both satisfy the interval \([-1,1]\) and give \(x\in[-1+4k,\,1+4k)\);
      +hence each \(k\) contributes **two** intersection points.
      +
      +The sum of the two roots for a fixed \(k\) is, by Vieta,
      +
      +\[
      +y_{k}^{+}+y_{k}^{-}= \frac{1}{34}.
      +\]
      +
      +Thus the total contribution of all up‑segments is  
      +
      +\[
      +\sum_{k=0}^{8}(y_{k}^{+}+y_{k}^{-})=9\cdot\frac1{34}=\frac9{34}.
      +\]
      +
      +---
      +
      +### 2.  Intersections on a “down’’ segment  
      +
      +On a down segment \(x=4k+2-y\).  
      +Using \(x=34y^{2}\),
      +
      +\[
      +34y^{2}=4k+2-y\;\Longrightarrow\;34y^{2}+y-(4k+2)=0 .
      +\]
      +
      +For each \(k=0,1,\dots ,8\) the roots are  
      +
      +\[
      +z_{k}^{\pm}= \frac{-1\pm\sqrt{273+544k}}{68}.
      +\]
      +
      +The admissible \(y\)-values must satisfy \(-1<y\le 1\).
      +
      +* For \(k=0,1,\dots ,7\) we have \(\sqrt{273+544k}<67\); both roots lie in
      +\((-1,1]\) and give valid points.
      +* For \(k=8\) the negative root satisfies \(y<-1\) and is rejected; only the
      +positive root remains.
      +
      +Hence we obtain two points for each \(k=0,\dots ,7\) and one point for
      +\(k=8\) – a total of \(17\) points.
      +
      +The sum of the two roots of the quadratic for any \(k\) is  
      +
      +\[
      +z_{k}^{+}+z_{k}^{-}= -\frac1{34}.
      +\]
      +
      +Consequently  
      +
      +\[
      +\sum_{k=0}^{7}(z_{k}^{+}+z_{k}^{-})=8\!\left(-\frac1{34}\right)=-\frac8{34},
      +\]
      +and we must add the remaining positive root for \(k=8\),
      +
      +\[
      +z_{8}^{+}= \frac{-1+\sqrt{4625}}{68}= \frac{-1+5\sqrt{185}}{68}.
      +\]
      +
      +Therefore the total contribution of the down‑segments is  
      +
      +\[
      +-\frac8{34}+z_{8}^{+}= -\frac{16}{68}+ \frac{-1+5\sqrt{185}}{68}
      += \frac{-17+5\sqrt{185}}{68}.
      +\]
      +
      +---
      +
      +### 3.  Sum of all \(y\)-coordinates  
      +
      +\[
      +\begin{aligned}
      +S&=\frac9{34}+ \left(-\frac8{34}+z_{8}^{+}\right)\\[2pt]
      +  &=\frac1{34}+z_{8}^{+}
      +   =\frac{2}{68}+ \frac{-1+5\sqrt{185}}{68}
      +   =\frac{1+5\sqrt{185}}{68}.
      +\end{aligned}
      +\]
      +
      +Thus the sum can be written as  
      +
      +\[
      +S=\frac{a+b\sqrt{c}}{d}\quad\text{with}\quad 
      +a=1,\;b=5,\;c=185,\;d=68.
      +\]
      +
      +All conditions are satisfied (\(\gcd(a,b,d)=1\), \(c\) square‑free).
      +
      +Finally  
      +
      +\[
      +a+b+c+d = 1+5+185+68 = \boxed{259}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The grid has three rows and three vertical \(3\times3\) blocks.  
      +Let the rows be \(R_1,R_2,R_3\) and the blocks be \(B_1,B_2,B_3\).
      +
      +---
      +
      +### 1.  How the numbers are placed in the rows and blocks  
      +
      +For a given number \(k\in\{1,\ldots ,9\}\) it must appear  
      +
      +* once in each row (three appearances), and  
      +* once in each block (three appearances).
      +
      +Hence the three positions of \(k\) correspond to a **bijection** between the set of rows and the set of blocks.  
      +Thus for each \(k\) we may choose a permutation \(\sigma_k\in S_3\) :
      +
      +\[
      +\sigma_k(r)=\text{the block in which }k\text{ occurs in row }r .
      +\]
      +
      +Conversely, a choice of a permutation \(\sigma_k\) for each \(k\) determines in which block every entry of the grid lies.
      +
      +---
      +
      +### 2.  Counting the possible collections of permutations  
      +
      +Write a column of the \(3\times9\) “block‑matrix’’ \(M\) as a permutation of \((1,2,3)\) – the three symbols denote the block in which the number of that column appears in rows \(1,2,3\).
      +
      +Thus we need a sequence of nine permutations \((p_1,\dots ,p_9)\) such that each ordered pair \((\text{row},\text{block})\) occurs exactly three times; equivalently each number appears three times in each row and three times in each block.
      +
      +Let  
      +
      +\[
      +x_1,\dots ,x_6
      +\]
      +
      +be the numbers of the six possible permutations of \(S_3\) in the sequence.
      +The conditions give the linear system  
      +
      +\[
      +\begin{aligned}
      +x_1+x_2&=3\\
      +x_3+x_4&=3\\
      +x_5+x_6&=3\\
      +x_3+x_5&=3\\
      +x_1+x_6&=3\\
      +x_2+x_4&=3\\
      +x_4+x_6&=3\\
      +x_2+x_5&=3\\
      +x_1+x_3&=3
      +\end{aligned}
      +\]
      +
      +which has the solutions  
      +
      +\[
      +\begin{array}{c|cccccc}
      + &x_1&x_2&x_3&x_4&x_5&x_6\\\hline
      +t=0&0&3&3&0&0&3\\
      +t=1&1&2&2&1&1&2\\
      +t=2&2&1&1&2&2&1\\
      +t=3&3&0&0&3&3&0
      +\end{array}
      +\qquad (t=0,1,2,3).
      +\]
      +
      +For a fixed solution the columns can be ordered in
      +
      +\[
      +\frac{9!}{x_1!x_2!x_3!x_4!x_5!x_6!}
      +\]
      +
      +ways.  Summing over the four solutions gives  
      +
      +\[
      +\begin{aligned}
      +N_M &= \frac{9!}{3!^3}+2\cdot\frac{9!}{1!\,2!^2\,1!\,1!\,2!}
      +      +\frac{9!}{3!^3}\\
      +    &=1680+2\cdot45360+1680=94\,080 .
      +\end{aligned}
      +\]
      +
      +So there are \(94\,080\) possible matrices \(M\) describing in which block each number lies.
      +
      +---
      +
      +### 3.  Filling the inner columns of each block  
      +
      +Inside a block \(B\) each row already has three distinct numbers (the three numbers assigned to that row in the block).  
      +These three numbers can be placed in the three inner columns of the block in any order, i.e. in \((3!)^3=6^3\) ways.
      +
      +Since the three blocks are independent, the total number of ways to complete the grid is  
      +
      +\[
      +94\,080\cdot (6^3)^3 = 94\,080\cdot 6^9 .
      +\]
      +
      +Because \(6^9 = (2\cdot3)^9 =2^{9}\,3^{9}\),
      +
      +\[
      +\begin{aligned}
      +94\,080\cdot6^9 &= \bigl(2^7\cdot3\cdot5\cdot7^2\bigr)\cdot\bigl(2^9\cdot3^9\bigr)\\
      +                &=2^{16}\cdot3^{10}\cdot5^1\cdot7^2 .
      +\end{aligned}
      +\]
      +
      +Thus the total number of fillings is  
      +
      +\[
      +2^{16}\cdot 3^{10}\cdot 5^{1}\cdot 7^{2}.
      +\]
      +
      +---
      +
      +### 4.  Computing the required sum  
      +
      +Take \(p=2,\ a=16;\; q=3,\ b=10;\; r=5,\ c=1;\; s=7,\ d=2\).
      +
      +\[
      +p\,a+q\,b+r\,c+s\,d = 2\cdot16 + 3\cdot10 + 5\cdot1 + 7\cdot2
      +                     = 32 + 30 + 5 + 14 = 81 .
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First rewrite the chain of inequalities  
      +
      +\[
      +x-yz<y-zx<z-xy
      +\]
      +
      +as two separate inequalities.
      +
      +\[
      +\begin{aligned}
      +x-yz &< y-zx \\[2mm]
      +y-zx &< z-xy
      +\end{aligned}
      +\]
      +
      +\[
      +\begin{aligned}
      +x-yz-y+zx&<0\qquad\Longrightarrow\qquad (x-y)(1+z)<0,\\[2mm]
      +y-zx-z+xy&<0\qquad\Longrightarrow\qquad (y-z)(1+x)<0 .
      +\end{aligned}
      +\]
      +
      +The third inequality \( (x-z)(1+y)<0\) follows by adding the two, so the region is
      +described by  
      +
      +\[
      +\boxed{(x-y)(1+z)<0,\qquad (y-z)(1+x)<0}
      +\]
      +
      +together with the plane \(x+y+z=75\).
      +
      +---
      +
      +### 1.   Sign patterns
      +
      +Let  
      +
      +\[
      +S_x=\operatorname{sgn}(1+x),\quad S_y=\operatorname{sgn}(1+y),\quad S_z=\operatorname{sgn}(1+z).
      +\]
      +
      +From the two product‑inequalities we obtain  
      +
      +\[
      +\operatorname{sgn}(x-y)=-S_z,\qquad 
      +\operatorname{sgn}(y-z)=-S_x .
      +\]
      +
      +Thus  
      +
      +\[
      +\begin{array}{c|c|c|c}
      +S_x & S_y & S_z &\text{order of }x,y,z\\ \hline
      ++ & + & + & x<y<z\\
      ++ & - & - & y<z<x\\
      +- & + & + & x<z<y\\
      +- & - & - & \text{impossible (sum }\;75) 
      +\end{array}
      +\]
      +
      +Hence the points satisfying the chain split into three convex regions, corresponding
      +to the three admissible sign patterns above.
      +
      +---
      +
      +### 2.   Which region is bounded?
      +
      +*Region  \(x<y<z\)  (all three numbers \(> -1\)).*  
      +Using the plane equation \(z=75-x-y\) the conditions become  
      +
      +\[
      +-1<x<y,\qquad y<\frac{75-x}{2}.
      +\]
      +
      +In the \((x,y)\)-plane this is the triangle bounded by  
      +
      +\[
      +x=-1,\; y=x,\; y=\frac{75-x}{2}.
      +\]
      +
      +The three vertices are  
      +
      +\[
      +(-1,-1),\;(-1,38),\;(25,25).
      +\]
      +
      +Its area in the \(xy\)-plane is
      +
      +\[
      +\frac12\,(39)(26)=507 .
      +\]
      +
      +Since the plane \(x+y+z=75\) is tilted, an element \(dx\,dy\) on the
      +\(xy\)-plane corresponds to an area element  
      +
      +\[
      +\sqrt{1+(\partial z/\partial x)^2+(\partial z/\partial y)^2}\;dx\,dy
      +        =\sqrt{1+1+1}\;dx\,dy=\sqrt3\,dx\,dy .
      +\]
      +
      +Thus the area of this region in the plane is  
      +
      +\[
      +507\sqrt3 .
      +\]
      +
      +*The other two regions* (\(y<z<x\) and \(x<z<y\)) project onto unbounded
      +half‑planes, so they have infinite area.
      +
      +Hence the **unique finite region** is the one with \(x<y<z\), and its area is
      +\(507\sqrt3\).
      +
      +---
      +
      +### 3.   Answer
      +
      +The area is \(a\sqrt b\) with \(a=507\) and \(b=3\); therefore  
      +
      +\[
      +a+b=507+3=510 .
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\prod_{k=4}^{63}\frac{\log_k\bigl(5^{k^2-1}\bigr)}{\log_{k+1}\bigl(5^{k^2-4}\bigr)}
      +\]
      +
      +---
      +
      +### 1.  Use change‑of‑base
      +
      +\[
      +\log_k\bigl(5^{k^2-1}\bigr)=\frac{\log_5\bigl(5^{k^2-1}\bigr)}{\log_5 k}
      +      =\frac{k^{2}-1}{\log_5 k},
      +\qquad
      +\log_{k+1}\bigl(5^{k^2-4}\bigr)=\frac{k^{2}-4}{\log_5 (k+1)} .
      +\]
      +
      +Hence each factor of the product equals  
      +
      +\[
      +\frac{k^2-1}{k^2-4}\;
      +      \frac{\log_5(k+1)}{\log_5k}.
      +\]
      +
      +So
      +
      +\[
      +P = \underbrace{\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}}_{\displaystyle P_1}
      +    \;
      +    \underbrace{\prod_{k=4}^{63}\frac{\log_5(k+1)}{\log_5k}}_{\displaystyle P_2}.
      +\]
      +
      +---
      +
      +### 2.  Simplify \(P_1\)
      +
      +\[
      +\frac{k^2-1}{k^2-4}= \frac{(k-1)(k+1)}{(k-2)(k+2)}
      +                  =\frac{k-1}{k-2}\cdot\frac{k+1}{k+2}.
      +\]
      +
      +Thus  
      +
      +\[
      +P_1=\Bigl(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr)
      +    \Bigl(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr).
      +\]
      +
      +Both products telescope:
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      +   =\frac{3}{2}\cdot\frac{4}{3}\cdots\frac{62}{61}
      +   =\frac{62}{2}=31,
      +\]
      +
      +\[
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      +   =\frac{5}{6}\cdot\frac{6}{7}\cdots\frac{64}{65}
      +   =\frac{5}{65}=\frac1{13}.
      +\]
      +
      +Therefore  
      +
      +\[
      +P_1 =31\cdot\frac1{13} =\frac{31}{13}.
      +\]
      +
      +---
      +
      +### 3.  Simplify \(P_2\)
      +
      +\[
      +P_2 =\prod_{k=4}^{63}\frac{\log_5(k+1)}{\log_5k}
      +    =\frac{\log_5 5\;\log_5 6\;\cdots\;\log_5 64}
      +           {\log_5 4\;\log_5 5\;\cdots\;\log_5 63}
      +    =\frac{\log_5 64}{\log_5 4}.
      +\]
      +
      +Using the change‑of‑base formula,
      +
      +\[
      +\frac{\log_5 64}{\log_5 4}= \log_4 64.
      +\]
      +
      +Since \(4^3=64\), we have \(\log_4 64 = 3\). Hence  
      +
      +\[
      +P_2 = 3.
      +\]
      +
      +---
      +
      +### 4.  Combine the two parts
      +
      +\[
      +P = P_1\cdot P_2 = \frac{31}{13}\times 3 = \frac{93}{13}.
      +\]
      +
      +Thus the product equals \(\displaystyle\frac{m}{n}\) with \(m=93,\; n=13\).
      +
      +\[
      +m+n = 93+13 = 106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Factor  
      +
      +\[
      +2025=45^{2}= (3^{2}\cdot5)^{2}=3^{4}\cdot5^{2}.
      +\]
      +
      +Hence a divisor of \(2025\) is of the form \(3^{a}5^{b}\) with  
      +
      +\(0\le a\le4\) and \(0\le b\le2\).  
      +Thus  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +All \(2^{15}\) subsets of \(A\) are equally likely.
      +
      +---
      +
      +### Divisors needed for the LCM
      +
      +For a subset \(B\subseteq A\),
      +
      +\[
      +\operatorname{lcm}(B)=3^{\max_{d\in B}a_d}\;5^{\max_{d\in B}b_d}.
      +\]
      +
      +To obtain \(\operatorname{lcm}(B)=2025=3^{4}5^{2}\) we must have  
      +
      +* at least one element whose exponent of \(3\) equals \(4\);
      +* at least one element whose exponent of \(5\) equals \(2\).
      +
      +Define  
      +
      +\[
      +D_3=\{d\in A:\, \text{the exponent of }3\text{ in }d\text{ is }4\},\qquad 
      +D_5=\{d\in A:\, \text{the exponent of }5\text{ in }d\text{ is }2\}.
      +\]
      +
      +Counting these divisors:
      +
      +* \(D_3 = \{3^{4}5^{0}, 3^{4}5^{1}, 3^{4}5^{2}\}\) ⇒ \(|D_3|=3\);
      +* \(D_5 = \{3^{0}5^{2}, 3^{1}5^{2}, 3^{2}5^{2}, 3^{3}5^{2}, 3^{4}5^{2}\}\) ⇒ \(|D_5|=5\);
      +* The intersection \(D_3\cap D_5=\{3^{4}5^{2}\}= \{2025\}\) ⇒ \(|D_3\cap D_5|=1\).
      +
      +Thus a subset \(B\) has \(\operatorname{lcm}(B)=2025\) iff it contains **at least one element of \(D_3\) and at least one element of \(D_5\)** (the same element may satisfy both conditions).
      +
      +---
      +
      +### Counting such subsets
      +
      +Let \(U\) be the set of all subsets of \(A\) (including the empty set).  
      +Use inclusion–exclusion.
      +
      +\[
      +\begin{aligned}
      +|U| &=2^{15},\\[2mm]
      +\text{Subsets missing }D_3 &: 2^{15-|D_3|}=2^{12},\\[2mm]
      +\text{Subsets missing }D_5 &: 2^{15-|D_5|}=2^{10},\\[2mm]
      +\text{Subsets missing both }D_3\text{ and }D_5 &: 
      +2^{15-|D_3\cup D_5|}
      + =2^{15-(3+5-1)}=2^{8}.
      +\end{aligned}
      +\]
      +
      +Hence the number of subsets that contain at least one element of each set is  
      +
      +\[
      +\begin{aligned}
      +N_{\text{good}}
      +&=|U|-2^{12}-2^{10}+2^{8}\\
      +&=32768-4096-1024+256\\
      +&=27904.
      +\end{aligned}
      +\]
      +
      +Every such subset is non‑empty, so these are exactly the favorable subsets.
      +
      +---
      +
      +### Probability
      +
      +\[
      +P=\frac{N_{\text{good}}}{2^{15}}=\frac{27904}{32768}.
      +\]
      +
      +Reduce the fraction:
      +
      +\[
      +27904=2^{8}\cdot 109,\qquad 32768=2^{15}=2^{8}\cdot 128
      +\Longrightarrow P=\frac{109}{128}.
      +\]
      +
      +Thus \(m=109\) and \(n=128\), and  
      +
      +\[
      +m+n = 109+128 = 237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(\omega _2\) have centre \(O\) and radius \(15\);
      +* \(BC\) be a diameter of \(\omega _2\);
      +* \(\omega _1\) have centre \(A\) and radius \(6\), internally tangent to \(\omega _2\) at \(B\).
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates
      +
      +Place \(BC\) on the \(x\)-axis with  
      +
      +\[
      +B=(-15,0),\qquad C=(15,0),\qquad O=(0,0).
      +\]
      +
      +Since the circles are internally tangent, the centres are collinear with the
      +tangency point and  
      +
      +\[
      +OA=R_2-R_1=15-6=9 .
      +\]
      +
      +Thus \(A\) lies on the ray \(OB\) at distance \(9\) from \(O\); consequently  
      +
      +\[
      +A=(-9,0).
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Point \(D\)
      +
      +\(AD\perp BC\), so \(AD\) is the vertical line \(x=-9\).
      +Intersecting this line with \(\omega _2\) (\(x^2+y^2=225\)) gives  
      +
      +\[
      +y^2=225-(-9)^2=144\quad\Longrightarrow\quad y=\pm12 .
      +\]
      +
      +Because the statement “\(D\) is closer to \(\overline{FG}\) than to \(\overline{EH}\)’’ puts \(D\) above the centre, we take  
      +
      +\[
      +D=(-9,12).
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Rectangle \(EFGH\)
      +
      +The rectangle is inscribed in \(\omega _1\), so its circum‑centre is the
      +centre of \(\omega _1\); hence the centre of the rectangle is \(A\).
      +
      +Let  
      +
      +* half‑width \(a\) (distance from the centre to each vertical side),
      +* half‑height \(b\) (distance from the centre to each horizontal side).
      +
      +Because the vertices lie on \(\omega _1\),
      +
      +\[
      +a^{2}+b^{2}=6^{2}=36. \tag{1}
      +\]
      +
      +The condition “\(\overline{EF}\perp\overline{BC}\)” makes \(\overline{EF}\) vertical,
      +so the rectangle’s sides are parallel/perpendicular to \(BC\).  
      +Taking the usual labelling (counter‑clockwise)
      +
      +\[
      +\begin{aligned}
      +E&=(-9-a,\,-b),\qquad 
      +F=(-9-a,\,b),\\
      +G&=(-9+a,\,b),\qquad 
      +H=(-9+a,\,-b).
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Equality of the two triangle areas
      +
      +\[
      +\begin{aligned}
      +\text{Area}(\triangle DGF)&=\frac12\cdot GF\cdot(\text{vertical distance }D\text{ to }y=b)\\
      +&=\frac12\cdot(2a)\cdot(12-b)=a(12-b),\\[4pt]
      +\text{Area}(\triangle CHG)&=\frac12\cdot GH\cdot(\text{horizontal distance }C\text{ to }x=-9+a)\\
      +&=\frac12\cdot(2b)\cdot(24-a)=b(24-a).
      +\end{aligned}
      +\]
      +
      +Given the areas are equal,
      +
      +\[
      +a(12-b)=b(24-a)\quad\Longrightarrow\quad12a=24b\quad\Longrightarrow\quad a=2b. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Solving for \(a\) and \(b\)
      +
      +Substituting \(a=2b\) into (1):
      +
      +\[
      +(2b)^{2}+b^{2}=36\;\Longrightarrow\;5b^{2}=36\;\Longrightarrow\;b^{2}=\frac{36}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +a^{2}=(2b)^{2}=4b^{2}= \frac{144}{5}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 6.  Area of the rectangle
      +
      +\[
      +\text{Area}= (2a)(2b)=4ab=4(2b)b=8b^{2}=8\left(\frac{36}{5}\right)=\frac{288}{5}.
      +\]
      +
      +Thus the area is \(\dfrac{288}{5}\).  In lowest terms \(m=288,\;n=5\), and
      +
      +\[
      +m+n=288+5=293.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  How many regions are created by chords?**  
      +
      +If a convex region (here the disk) is cut by \(N\) line‑segments whose interior intersection points are all distinct, the number of regions is  
      +
      +\[
      +R=N+1+I,
      +\]
      +
      +where \(I\) is the total number of interior intersection points.  
      +(Each new segment adds one region, plus one extra region for each interior point where it meets a previous segment.)
      +
      +For our disk  
      +
      +\[
      +N=27\qquad\text{(the two diameters + 25 random chords)} .
      +\]
      +
      +Hence  
      +
      +\[
      +E[R]=28+E[I].
      +\]
      +
      +So we must find the expected number \(E[I]\) of interior intersection points.
      +
      +--------------------------------------------------------------------
      +
      +**Step 2.  Intersections involving the two diameters.**
      +
      +The two diameters intersect at the centre; this contributes one guaranteed intersection.
      +
      +For a random chord \(C\) we ask for the probability that it meets a given diameter.
      +
      +*Vertical diameter.*  
      +The chord meets the vertical line \(x=0\) iff its endpoints lie in opposite half‑planes (one in \(\{Q_1,Q_4\}\) and the other in \(\{Q_2,Q_3\}\)).  
      +Among the six unordered pairs of distinct quadrants, four have this property:
      +
      +\[
      +\{Q_1,Q_2\},\{Q_1,Q_3\},\{Q_2,Q_4\},\{Q_3,Q_4\},
      +\]
      +
      +so  
      +
      +\[
      +P(C\text{ meets the vertical diameter})=\frac{4}{6}=\frac23 .
      +\]
      +
      +Exactly the same reasoning holds for the horizontal diameter.  
      +Thus for each random chord
      +
      +\[
      +P(C\text{ meets a given diameter})=\frac23 .
      +\]
      +
      +With 25 random chords we obtain  
      +
      +\[
      +E[\text{intersections chord–diameter}] = 25\cdot 2\cdot\frac23=\frac{100}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3.  Intersections among the 25 random chords.**
      +
      +Each chord is obtained by picking two points on the circle that lie in different quadrants.  
      +The unordered pair of quadrants a chord uses is equally likely to be any of the six possibilities
      +
      +* four *adjacent* pairs: \(\{01\},\{12\},\{23\},\{30\}\);
      +* two *opposite* pairs: \(\{02\},\{13\}\).
      +
      +Thus a chord is *adjacent* with probability \(\frac23\) and *opposite* with probability \(\frac13\).
      +
      +--------------------------------------------------------------------
      +### 3.1  Classifying a pair of chords
      +
      +Let chord 1 belong to unordered pair \(P\) and chord 2 to unordered pair \(Q\).  
      +There are three possible relationships between \(P\) and \(Q\):
      +
      +| relationship | how many ordered \((P,Q)\) | intersection probability |
      +|--------------|---------------------------|--------------------------|
      +| same pair (\(P=Q\)) | 6 | \(\displaystyle\frac12\) |
      +| disjoint pairs (no common quadrant) | 6 (4 adjacent‑adjacent, 2 opposite‑opposite) | \(0\) for adjacent–adjacent, \(1\) for opposite–opposite |
      +| share exactly one quadrant | 24 (8 adjacent‑adjacent, 16 adjacent‑opposite) | \(\displaystyle\frac12\) |
      +
      +*Why the numbers?*  
      +
      +* Two chords of the **same type** intersect iff the order of the two points in the first quadrant is opposite to the order of the two points in the second quadrant – probability \(1/2\).
      +
      +* Two **disjoint adjacent** chords lie in quadrants \(\{0,1\}\) and \(\{2,3\}\); all points of the first lie before those of the second, so they never intersect.
      +
      +* Two **disjoint opposite** chords are \(\{0,2\}\) and \(\{1,3\}\); the four points appear in the order \(0,1,2,3\), which is alternating, so they always intersect.
      +
      +* When the chords **share exactly one quadrant**, the shared quadrant contains two independent uniform points; whichever of the two lies first decides whether the endpoints are interleaved. Hence the intersection probability is \(1/2\).
      +
      +--------------------------------------------------------------------
      +### 3.2  Expected intersection probability for a random pair
      +
      +Summing the contributions of all 36 ordered possibilities:
      +
      +\[
      +\begin{aligned}
      +\sum_{P,Q} p_{P,Q}&=
      +6\!\left(\frac12\right) 
      ++ 4\!\cdot\!0 
      ++ 2\!\cdot\!1 
      ++ 24\!\left(\frac12\right) \\
      +&= 3 + 2 + 12 = 17 .
      +\end{aligned}
      +\]
      +
      +Therefore for two independently chosen random chords
      +
      +\[
      +P(\text{they intersect}) = \frac{17}{36}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.3  Expected number of chord–chord intersections
      +
      +There are \(\binom{25}{2}=300\) unordered pairs of the 25 chords, so
      +
      +\[
      +E[\text{chord–chord intersections}]
      +=300\cdot\frac{17}{36}= \frac{425}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4.  Total expected number of interior intersections.**
      +
      +\[
      +\begin{aligned}
      +E[I] &= \underbrace{1}_{\text{diameters}} 
      +      + \underbrace{\frac{100}{3}}_{\text{chord–diameter}} 
      +      + \underbrace{\frac{425}{3}}_{\text{chord–chord}} \\[2mm]
      +     &= \frac{525}{3}+1 = 175+1 = 176 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5.  Expected number of regions.**
      +
      +\[
      +E[R]=N+1+E[I]=27+1+176=204.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Label the twelve unit segments that form the sides of the four unit squares as in the picture  
      +
      +\[
      +\begin{array}{c}
      +\text{top left square }A:\; a\;( \text{top}) ,\; a'(\text{left}) ,\; u (\text{vertical middle up}) ,\; x (\text{horizontal middle left})\\[2mm]
      +\text{top right square }B:\; b ,\; b' ,\; u ,\; y\\[2mm]
      +\text{bottom left square }C:\; c ,\; c' ,\; v ,\; x\\[2mm]
      +\text{bottom right square }D:\; d ,\; d' ,\; v ,\; y
      +\end{array}
      +\]
      +
      +All variables are binary:  
      +
      +\[
      +0=\text{blue},\qquad 1=\text{red}.
      +\]
      +
      +---
      +
      +### 1.  Express the condition for each square  
      +
      +For a square the number of red sides must be exactly two.  
      +If we let  
      +
      +\[
      +\begin{aligned}
      +s_A &=x+u, & s_B &=y+u,\\
      +s_C &=x+v, & s_D &=y+v,
      +\end{aligned}
      +\]
      +
      +then the two **boundary** edges of a square must contain  
      +
      +\[
      +r_A =2-s_A,\qquad r_B =2-s_B,\qquad r_C =2-s_C,\qquad r_D =2-s_D
      +\]
      +
      +red sides.  
      +For each square the two boundary edges are distinct from the other squares, so the choices for the
      +four pairs are independent.
      +
      +For a given pair of boundary edges the number of colourings is  
      +
      +\[
      +\begin{cases}
      +1 &\text{if }r_i\in\{0,2\}\;(00\text{ or }11),\\[2mm]
      +2 &\text{if }r_i =1\;(01\text{ or }10).
      +\end{cases}
      +\]
      +
      +Hence, when the interior pattern \((x,y,u,v)\) is fixed, the number of ways to colour the eight
      +outer edges equals  
      +
      +\[
      +2^{\#\{\,i\in\{A,B,C,D\}\mid s_i=1\,\}},
      +\]
      +
      +because a square contributes a factor \(2\) exactly when its interior sum \(s_i\) equals \(1\).
      +
      +Thus the total number of admissible colourings is  
      +
      +\[
      +N=\sum_{(x,y,u,v)\in\{0,1\}^4} 2^{\#\{i\mid s_i=1\}} .
      +\]
      +
      +---
      +
      +### 2.  Enumerate the \(2^4=16\) interior patterns  
      +
      +\[
      +\begin{array}{c|c|c|c|c|c}
      +(x,y,u,v) & s_A & s_B & s_C & s_D &
      +\#\{i\mid s_i=1\}\\\hline
      +0000 &0&0&0&0&0\\
      +0001 &0&0&1&1&2\\
      +0010 &1&1&0&0&2\\
      +0011 &1&1&1&1&4\\
      +0100 &0&1&0&1&2\\
      +0101 &0&1&1&2&2\\
      +0110 &1&2&0&1&2\\
      +0111 &1&2&1&2&2\\
      +1000 &1&0&1&0&2\\
      +1001 &1&0&2&1&2\\
      +1010 &2&1&1&0&2\\
      +1011 &2&1&2&1&2\\
      +1100 &1&1&1&1&4\\
      +1101 &1&1&2&2&2\\
      +1110 &2&2&1&1&2\\
      +1111 &2&2&2&2&0
      +\end{array}
      +\]
      +
      +(The entry “2’’ means the sum of the two interior edges of that square is \(2\); it forces the
      +corresponding pair of boundary edges to be both blue.)
      +
      +The contribution of each pattern is \(2^{\#\{i\mid s_i=1\}}\).  Adding all contributions we get  
      +
      +\[
      +\begin{aligned}
      +N&=1\;(0000)+4\;(0001)+4\;(0010)+16\;(0011)\\
      +  &\quad+4\;(0100)+4\;(0101)+4\;(0110)+4\;(0111)\\
      +  &\quad+4\;(1000)+4\;(1001)+4\;(1010)+4\;(1011)\\
      +  &\quad+16\;(1100)+4\;(1101)+4\;(1110)+1\;(1111)\\[2mm]
      +  &=1+16+48+16+1\\
      +  &=\boxed{82}.
      +\end{aligned}
      +\]
      +
      +Therefore there are **82** ways to colour the twelve unit segments of a \(2\times2\) grid so that
      +every unit square has exactly two red and two blue sides.
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +f(x)=\sin \bigl(7\pi\sin(5x)\bigr)
      +\qquad (0<x<2\pi)
      +\]
      +
      +---
      +
      +### 1.  Zeros of \(f\)
      +
      +\(f(x)=0\iff \sin\bigl(7\pi\sin(5x)\bigr)=0\)
      +
      +\[
      +7\pi\sin(5x)=k\pi\qquad(k\in\mathbb Z)
      +\Longrightarrow\sin(5x)=\frac{k}{7}.
      +\]
      +
      +Since \(\sin(5x)\in[-1,1]\), we must have \(-7\le k\le7\).  
      +Thus \(k\) can be any integer from \(-7\) to \(7\) (15 values).
      +
      +Put \(\theta =5x\). Then \(\theta\in(0,10\pi)\) and we need the number of solutions of  
      +
      +\[
      +\sin\theta =\frac{k}{7}\qquad (k=-7,\ldots,7)
      +\]
      +in \((0,10\pi)\).
      +
      +*If \(|k|=7\) (\(\sin\theta=\pm1\)):* each period \((0,2\pi)\) contributes one solution, and there are five periods in \((0,10\pi)\).  
      +\(\;\Rightarrow\) 5 solutions for \(k=7\) and 5 solutions for \(k=-7\).
      +
      +*If \(k=0\) (\(\sin\theta=0\)):* solutions are \(\theta=n\pi\) with \(n=1,\dots ,9\).  
      +\(\;\Rightarrow\) 9 solutions.
      +
      +*If \(|k|=1,2,\dots ,6\) (\(|\sin\theta|<1\) and \(\neq0\)):* in each \(2\pi\)‑interval there are two solutions, so across five intervals there are \(2\cdot5=10\) solutions.
      +
      +Hence the total number of zeros is  
      +
      +\[
      +n =\underbrace{5+5}_{k=\pm7}+ \underbrace{9}_{k=0}+ \underbrace{12\times10}_{k=\pm1,\dots ,\pm6}
      +      =10+9+120 = 139 .
      +\]
      +
      +---
      +
      +### 2.  Tangent zeros
      +
      +A zero is tangent to the \(x\)-axis when \(f'(x)=0\) as well.
      +
      +\[
      +f'(x)=35\pi\cos\!\bigl(7\pi\sin(5x)\bigr)\,\cos(5x).
      +\]
      +
      +At any zero we have \(\cos\!\bigl(7\pi\sin(5x)\bigr)=\cos(k\pi)=(-1)^k\neq0\); therefore  
      +
      +\[
      +f'(x)=0 \iff \cos(5x)=0.
      +\]
      +
      +\(\cos(5x)=0\) gives \(5x=\dfrac{\pi}{2}+m\pi\;(m\in\mathbb Z)\), i.e.
      +
      +\[
      +x=\frac{(2m+1)\pi}{10}.
      +\]
      +
      +Within \(0<x<2\pi\) the odd integers \(2m+1\) run from \(1\) to \(19\); there are \(10\) such values.
      +At these points \(\sin(5x)=\pm1\), i.e. they correspond exactly to the solutions for \(k=\pm7\).
      +
      +Thus  
      +
      +\[
      +t=10.
      +\]
      +
      +---
      +
      +### 3.  Required sum
      +
      +\[
      +n+t = 139+10 = 149.
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 – Greedy description**
      +
      +For a given amount \(N\) let  
      +
      +\[
      +q=\Bigl\lfloor \frac{N}{25}\Bigr\rfloor ,\qquad r=N-25q\;(0\le r<25)
      +\]
      +
      +The greedy algorithm first takes \(q\) quarters, then uses as many dimes as possible and finally pennies.  
      +Hence the greedy number of coins is  
      +
      +\[
      +g(N)=q+\Bigl\lfloor\frac{r}{10}\Bigr\rfloor +(r\bmod 10)
      +      =q+f(r),
      +\]
      +
      +where  
      +
      +\[
      +f(x)=\Bigl\lfloor\frac{x}{10}\Bigr\rfloor +(x\bmod10)
      +\]
      +
      +is the optimal number of coins when only dimes and pennies are allowed.
      +
      +---
      +
      +**Step 2 – Optimal solution with a given number of quarters**
      +
      +If we use \(a\) quarters (\(0\le a\le q\)), we must make the remainder \(N-25a\) with dimes and pennies.  
      +The minimum number of coins for that remainder is \(f(N-25a)\).  
      +Thus the optimal number of coins for \(N\) is  
      +
      +\[
      +\min_{0\le a\le q}\; \bigl[a+f(N-25a)\bigr].
      +\]
      +
      +Because \(f\) is optimal for the two‑coin system \(\{1,10\}\), we only need to compare the greedy choice
      +\(a=q\) with the possibilities where we use fewer quarters.
      +
      +---
      +
      +**Step 3 – Effect of removing one quarter**
      +
      +Write \(r=N-25q\) (the greedy remainder).  
      +If we use one fewer quarter (\(a=q-1\)), the new remainder is \(r+25\), and the coin count becomes  
      +
      +\[
      +(q-1)+f(r+25).
      +\]
      +
      +Greedy is optimal precisely when  
      +
      +\[
      +q+f(r)\le (q-1)+f(r+25)\quad\Longleftrightarrow\quad f(r)+1\le f(r+25).
      +\]
      +
      +Compute \(f(r+25)\) in terms of \(f(r)\).  
      +Since adding \(25\) cents is the same as adding two dimes and five pennies,  
      +
      +\[
      +f(r+25)=r+25-9\Bigl\lfloor\frac{r+25}{10}\Bigr\rfloor .
      +\]
      +
      +The floor changes by  
      +
      +\[
      +\Bigl\lfloor\frac{r+25}{10}\Bigr\rfloor-\Bigl\lfloor\frac{r}{10}\Bigr\rfloor=
      +\begin{cases}
      +2,& r\bmod10\le 4,\\[2pt]
      +3,& r\bmod10\ge 5 .
      +\end{cases}
      +\]
      +
      +Hence  
      +
      +\[
      +f(r+25)=
      +\begin{cases}
      +f(r)+7, & r\bmod10\le4,\\[2pt]
      +f(r)-2, & r\bmod10\ge5 .
      +\end{cases}
      +\]
      +
      +Consequently  
      +
      +* if \(r\bmod10\le4\) then \(f(r+25)=f(r)+7>f(r)+1\) – greedy stays optimal;
      +* if \(r\bmod10\ge5\) then \(f(r+25)=f(r)-2\le f(r)\) – using one fewer quarter gives fewer coins.
      +
      +Thus the greedy algorithm fails **exactly** when the greedy remainder \(r\) satisfies  
      +
      +\[
      +r\bmod10\ge5 \;\Longleftrightarrow\; r\in\{5,6,7,8,9,15,16,17,18,19\}.
      +\]
      +
      +---
      +
      +**Step 4 – Dropping more than one quarter never helps**
      +
      +For two quarters removed we add \(50\) cents to the remainder.  
      +A similar computation gives  
      +
      +\[
      +f(r+50)=f(r)+5 .
      +\]
      +
      +The change in total coin count is \(-2+5=+3\); for three quarters removed the change is \(-3+12=+9\), etc.  
      +Hence removing two or more quarters can never improve on the greedy solution.  
      +Therefore the condition found in Step 3 is both necessary and sufficient.
      +
      +---
      +
      +**Step 5 – Counting the successful \(N\) (1 ≤ N ≤ 1000)**  
      +
      +The greedy fails for those \(N\ge25\) whose remainder modulo \(25\) lies in  
      +
      +\[
      +R=\{5,6,7,8,9,15,16,17,18,19\}.
      +\]
      +
      +For a fixed residue \(r\in R\),
      +
      +\[
      +N=r+25k\qquad (k\ge1,\; N\le1000).
      +\]
      +
      +The largest possible \(k\) is \(\bigl\lfloor\frac{1000-r}{25}\bigr\rfloor =39\)
      +(because \(1000-r\) ranges from \(981\) to \(995\)).  
      +Thus each residue contributes \(39\) failing numbers.
      +
      +\[
      +\#\text{failures}=|R|\times 39 = 10\times39 = 390 .
      +\]
      +
      +All other numbers (including the ten numbers \(5,6,7,8,9,15,16,17,18,19\) themselves, which are \(<25\) and therefore not failures) are successes.
      +
      +\[
      +\#\text{successes}=1000-390 = 610 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +a_1a_2\dots a_{16},\qquad a_i\in\{0,1\}
      +\]
      +
      +be a binary string where \(a_i=1\) means the \(i^{\text{th}}\) chair is occupied.
      +The condition *no person sits next to two other people* means that a
      +\(1\) may not have a \(1\) on both sides; equivalently the string contains
      +no three consecutive \(1\)’s.  
      +Hence we must count the binary strings of length \(16\) that
      +
      +* have exactly eight \(1\)’s,
      +* contain no substring \(111\).
      +
      +---
      +
      +### 1.  Decompose the occupied chairs into blocks
      +
      +Since a block of consecutive \(1\)’s can have length at most \(2\), the eight
      +\(1\)’s are split into blocks of length \(1\) or \(2\).
      +
      +Let  
      +
      +* \(x\) = number of blocks of length \(1\),
      +* \(y\) = number of blocks of length \(2\),
      +* \(m=x+y\) = total number of blocks.
      +
      +Then  
      +
      +\[
      +x+2y=8,\qquad x+y=m\Longrightarrow y=8-m,\;x=2m-8 .
      +\]
      +
      +Thus \(m\) can be any integer with \(\lceil 8/2\rceil\le m\le 8\); i.e.  
      +
      +\[
      +m=4,5,6,7,8 .
      +\]
      +
      +For a given \(m\) the positions of the \(y=8-m\) blocks of length \(2\)
      +among the \(m\) blocks can be chosen in  
      +
      +\[
      +\binom{m}{\,8-m\,}
      +\]
      +
      +ways.
      +
      +---
      +
      +### 2.  Insert the separating zeros
      +
      +Between two consecutive blocks there must be at least one \(0\).
      +With \(m\) blocks there are \(m-1\) mandatory zeros.
      +There are \(16-8=8\) zeros altogether, so after placing the mandatory ones we
      +still have  
      +
      +\[
      +8-(m-1)=9-m
      +\]
      +
      +zeros left.  
      +
      +These remaining zeros may be distributed freely among the \(m+1\) gaps
      +(the two ends and the \(m-1\) interior gaps).  By stars‑and‑bars the number
      +of ways is
      +
      +\[
      +\binom{(9-m)+(m+1)-1}{(m+1)-1}
      +   =\binom{9}{m}.
      +\]
      +
      +---
      +
      +### 3.  Count all possibilities
      +
      +For each admissible \(m\),
      +
      +\[
      +\text{choices}(m)=\binom{m}{8-m}\binom{9}{m}.
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +N&=\sum_{m=4}^{8}\binom{m}{8-m}\binom{9}{m}\\[2mm]
      + &=\binom{4}{4}\binom{9}{4}
      +   +\binom{5}{3}\binom{9}{5}
      +   +\binom{6}{2}\binom{9}{6}
      +   +\binom{7}{1}\binom{9}{7}
      +   +\binom{8}{0}\binom{9}{8}\\[2mm]
      + &=1\cdot126+10\cdot126+15\cdot84+7\cdot36+1\cdot9\\
      + &=126+1260+1260+252+9\\
      + &=2907 .
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 4.  Remainder modulo \(1000\)
      +
      +\[
      +2907\equiv 907\pmod{1000}.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\angle A=84^{\circ},\qquad \angle B=60^{\circ},\qquad \angle C=36^{\circ}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  The nine‑point circle in complex form  
      +
      +Put the circumcircle of \(\triangle ABC\) as the unit circle and let  
      +
      +\[
      +a=1,\qquad b=e^{i\beta},\qquad c=e^{i\gamma},
      +\]
      +
      +where  
      +
      +\[
      +\beta =72^{\circ},\qquad \gamma =240^{\circ}
      +\]
      +
      +because the central arcs are twice the opposite angles:
      +\(\widehat{BC}=2A=168^{\circ},\;\widehat{CA}=2B=120^{\circ},
      +\;\widehat{AB}=2C=72^{\circ}\).
      +
      +The nine‑point centre is
      +
      +\[
      +N=\frac{a+b+c}{2},
      +\]
      +
      +and its radius is \(\frac12\) (since \(|a|=|b|=|c|=1\)).  
      +The three midpoints are  
      +
      +\[
      +D=\frac{b+c}{2},\qquad 
      +E=\frac{c+a}{2},\qquad 
      +F=\frac{a+b}{2}.
      +\]
      +
      +Notice that
      +
      +\[
      +D-N=-\frac{a}{2},\qquad 
      +E-N=-\frac{b}{2},\qquad 
      +F-N=-\frac{c}{2} .
      +\tag{1}
      +\]
      +
      +Hence the central angle \(\widehat{DE}\) equals the angle between vectors
      +\(-a\) and \(-b\); it is the same as the angle between \(a\) and \(b\).
      +
      +\[
      +\widehat{DE}= \angle aOb = 2\angle ACB = 2\cdot36^{\circ}=72^{\circ}.
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  The other intersection points  
      +
      +The nine‑point circle is the image of the circumcircle under the similarity
      +
      +\[
      +X\longmapsto N-\frac{X}{2},
      +\tag{3}
      +\]
      +
      +i.e. the homothety with centre the centroid (factor \(-\tfrac12\)).
      +Consequently, if a point \(Y\) of the nine‑point circle is the image of
      +\(X\) on the circumcircle, then  
      +
      +\[
      +Y = N-\frac{X}{2}\qquad\Longleftrightarrow\qquad X=2(N-Y).
      +\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +#### (a) Point \(G\)
      +
      +\(G\) lies on line \(BD\).  Since \(D\) is the image of \(A\) and
      +\(B\) is the image of the point \(X\) with \(X=b\), the line \(BD\) is the
      +image of the line through \(A\) parallel to chord \(BC\).
      +Thus \(G\) corresponds to the second intersection of the line through
      +\(A\;(=a)\) parallel to \(BC\) with the circumcircle.
      +
      +For a line through a point \(e^{i\alpha}\) parallel to chord
      +\(e^{i\beta}e^{i\gamma}\) the second intersection is
      +\(e^{i(\beta+\gamma-\alpha)}\).  
      +Here \(\alpha=0,\;\beta=72^{\circ},\;\gamma=240^{\circ}\); therefore
      +
      +\[
      +X_G = e^{i(\beta+\gamma)}=e^{i312^{\circ}} .
      +\]
      +
      +From (3) the point on the nine‑point circle is  
      +
      +\[
      +G = N-\frac{X_G}{2}.
      +\]
      +
      +Hence the vector \(NG=-\frac{X_G}{2}\) has direction \(312^{\circ}+180^{\circ}=132^{\circ}\).
      +
      +--------------------------------------------------------------------
      +#### (b) Point \(H\)
      +
      +\(H\) lies on line \(AE\).  This line is parallel to chord \(CA\); the
      +starting point on the circumcircle is \(B\,(=e^{i72^{\circ}})\).  Thus
      +
      +\[
      +X_H = e^{i(0+240^{\circ}-72^{\circ})}=e^{i168^{\circ}} ,
      +\qquad
      +H=N-\frac{X_H}{2},
      +\]
      +
      +so the direction of \(NH\) is \(168^{\circ}+180^{\circ}=348^{\circ}\).
      +
      +--------------------------------------------------------------------
      +#### (c) Point \(J\)
      +
      +\(J\) lies on line \(AF\), which is parallel to chord \(AB\); it starts
      +from \(C\,(=e^{i240^{\circ}})\).  Therefore
      +
      +\[
      +X_J = e^{i(0+72^{\circ}-240^{\circ})}=e^{i192^{\circ}},
      +\qquad
      +J=N-\frac{X_J}{2},
      +\]
      +
      +and the direction of \(NJ\) is \(192^{\circ}+180^{\circ}=12^{\circ}\).
      +
      +--------------------------------------------------------------------
      +### 3.  The required arcs on the nine‑point circle  
      +
      +From the directions obtained:
      +
      +\[
      +\begin{aligned}
      +&\text{Arc }DE = 252^{\circ}-180^{\circ}=72^{\circ},\\[2mm]
      +&\text{Arc }FG = 132^{\circ}-60^{\circ}=72^{\circ},\\[2mm]
      +&\text{Arc }HJ = (360^{\circ}-348^{\circ})+12^{\circ}=24^{\circ}.
      +\end{aligned}
      +\]
      +
      +All are the minor arcs (each \(<180^{\circ}\)).
      +
      +--------------------------------------------------------------------
      +### 4.  Computing the requested expression  
      +
      +\[
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +=72^{\circ}+2\!\cdot\!24^{\circ}+3\!\cdot\!72^{\circ}
      +=72+48+216=336^{\circ}.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a regular 24‑gon label the vertices \(0,1,\ldots ,23\) in order.
      +If a segment joins vertex \(i\) to vertex \(j\) then the chord length depends only on  
      +
      +\[
      +k=\min \{\,|i-j|\;,\;24-|i-j|\,\},
      +\qquad 1\le k\le 12 .
      +\]
      +
      +Thus a configuration in which all 12 segments have the same length corresponds to a
      +perfect matching in the graph whose edges are all chords of a fixed step \(k\).
      +
      +---
      +
      +### 1.  Structure of the step‑\(k\) graph  
      +
      +Let \(d=\gcd(24,k)\).  
      +The vertices split into \(d\) disjoint cycles, each of length  
      +
      +\[
      +L=\frac{24}{d}.
      +\]
      +
      +Every vertex is incident with exactly the two edges of its cycle.  
      +A perfect matching can exist only if each cycle has even length, i.e. \(L\) must be even.
      +\(L\) is odd only when \(d=8\) (then \(L=3\)); this occurs for \(k=8\).  
      +Hence the step \(k=8\) gives **no** valid configuration.
      +
      +For an even cycle of length \(L\ge4\) there are exactly two perfect matchings
      +(the two possible “alternating” choices).  
      +If \(L=2\) (the case \(k=12\)), the matching is forced and there is only one.
      +
      +Consequently, for a permissible \(k\)
      +
      +\[
      +\#\text{ matchings for step }k=
      +\begin{cases}
      +2^{d}, & L>2,\\[2pt]
      +1, & L=2 .
      +\end{cases}
      +\]
      +
      +---
      +
      +### 2.  Count for each step \(k\)
      +
      +\[
      +\begin{array}{c|c|c|c}
      +k & d=\gcd(24,k) & L=24/d & \#\text{ matchings}\\ \hline
      +1,5,7,11 & 1 & 24 & 2\\
      +2,10 & 2 & 12 & 2^{2}=4\\
      +3,9 & 3 & 8 & 2^{3}=8\\
      +4 & 4 & 6 & 2^{4}=16\\
      +6 & 6 & 4 & 2^{6}=64\\
      +12 & 12& 2 & 1\\
      +8 & 8 & 3 & \text{none}
      +\end{array}
      +\]
      +
      +Now sum over all admissible \(k\) ( \(k=1,\dots ,12\) except \(k=8\) ):
      +
      +\[
      +\begin{aligned}
      +\text{Total}&=4\cdot2\;+\;2\cdot4\;+\;2\cdot8\;+\;1\cdot16\;+\;1\cdot64\;+\;1\cdot1\\
      +&=8+8+16+16+64+1\\
      +&=113 .
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{113}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +17_{b}=1\cdot b+7=b+7,\qquad 
      +97_{b}=9\cdot b+7=9b+7 .
      +\]
      +
      +We need  
      +
      +\[
      +b+7 \mid 9b+7 .
      +\]
      +
      +Write \(9b+7\) in terms of \(b+7\):
      +
      +\[
      +9b+7 = 9(b+7) - 56 .
      +\]
      +
      +Hence the remainder upon division by \(b+7\) is \(-56\).  
      +Thus \(b+7\) must divide \(56\):
      +
      +\[
      +b+7 \mid 56 .
      +\]
      +
      +List the positive divisors of \(56\):
      +
      +\[
      +1,\;2,\;4,\;7,\;8,\;14,\;28,\;56 .
      +\]
      +
      +Since the base must satisfy \(b>9\) (so that the digit 9 is allowed), we need  
      +
      +\[
      +b+7>9+7=16 .
      +\]
      +
      +The only divisors of \(56\) larger than \(16\) are \(28\) and \(56\).
      +
      +\[
      +\begin{aligned}
      +b+7 &= 28 \;\Longrightarrow\; b=21,\\[2pt]
      +b+7 &= 56 \;\Longrightarrow\; b=49.
      +\end{aligned}
      +\]
      +
      +Both bases exceed \(9\) and thus are admissible.
      +
      +The sum of all such bases is
      +
      +\[
      +21+49 = 70 .
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +a_i=A_1A_i\qquad (i=2,\dots ,11),\qquad s_i=A_iA_{i+1}\qquad (i=2,\dots ,10).
      +\]
      +
      +For each triangle \(A_iA_1A_{i+1}\;(2\le i\le10)\)
      +
      +* \(\displaystyle \text{Area}=1\),
      +* \(\displaystyle\cos\angle A_iA_1A_{i+1}= \frac{12}{13}\).
      +
      +--------------------------------------------------------------------
      +### 1.  Product of the two sides from \(A_1\)
      +
      +With \(\theta=\angle A_iA_1A_{i+1}\) we have  
      +
      +\[
      +\sin\theta=\sqrt{1-\cos ^2\theta}= \frac{5}{13}.
      +\]
      +
      +The area of \(\triangle A_iA_1A_{i+1}\) is  
      +
      +\[
      +\frac12 a_i a_{i+1}\sin\theta =1
      +\Longrightarrow a_i a_{i+1}= \frac{2}{\sin\theta}= \frac{2}{5/13}= \frac{26}{5}\equiv c .
      +\tag{1}
      +\]
      +
      +Hence for all \(i\)
      +
      +\[
      +a_i a_{i+1}=c=\frac{26}{5}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Length of the side \(A_iA_{i+1}\)
      +
      +Apply the law of cosines in \(\triangle A_iA_1A_{i+1}\):
      +
      +\[
      +s_i^2=a_i^{\,2}+a_{i+1}^{\,2}-2a_i a_{i+1}\cos\theta
      +      =a_i^{\,2}+a_{i+1}^{\,2}-2c\Bigl(\frac{12}{13}\Bigr).
      +\]
      +
      +Because \(2c\frac{12}{13}= \frac{624}{65}= \frac{48}{5}\),
      +
      +\[
      +s_i^{\,2}=a_i^{\,2}+a_{i+1}^{\,2}-\frac{48}{5}. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  The alternating pattern of the radii
      +
      +From (1) we have \(a_{i+1}=c/a_i\). Consequently  
      +
      +\[
      +a_{i+2}=c/a_{i+1}=c/(c/a_i)=a_i .
      +\]
      +
      +Thus  
      +
      +\[
      +a_{2}=a_{4}=a_{6}=a_{8}=a_{10}\equiv x, \qquad 
      +a_{3}=a_{5}=a_{7}=a_{9}=a_{11}\equiv \frac{c}{x}.
      +\]
      +
      +All sides \(s_i\;(i=2,\dots ,10)\) are equal, because each uses the
      +pair \((x,\;c/x)\) in (2).  Set  
      +
      +\[
      +S^2=x^{2}+\Bigl(\frac{c}{x}\Bigr)^2-\frac{48}{5}.
      +\tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Express everything via \(t=x+\dfrac{c}{x}\)
      +
      +Define  
      +
      +\[
      +t=x+\frac{c}{x}=a_2+a_{11}.
      +\]
      +
      +Then  
      +
      +\[
      +x^{2}+\Bigl(\frac{c}{x}\Bigr)^2=t^{2}-2c .
      +\]
      +
      +Insert this into (3):
      +
      +\[
      +S^{2}=t^{2}-2c-\frac{48}{5}=t^{2}-(2c+\frac{48}{5}).
      +\]
      +
      +Since \(c=\dfrac{26}{5}\),
      +
      +\[
      +2c+\frac{48}{5}= \frac{52}{5}+\frac{48}{5}=20.
      +\]
      +
      +Hence  
      +
      +\[
      +S^{2}=t^{2}-20,\qquad S=\sqrt{t^{2}-20}. \tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Use the perimeter
      +
      +The perimeter of the 11‑gon is  
      +
      +\[
      +a_2+a_{11}+ \sum_{i=2}^{10}s_i = t+9S =20.
      +\]
      +
      +Substituting (4):
      +
      +\[
      +t+9\sqrt{t^{2}-20}=20.
      +\]
      +
      +Isolate the radical and square:
      +
      +\[
      +9\sqrt{t^{2}-20}=20-t \quad\Longrightarrow\quad 
      +81(t^{2}-20)=(20-t)^{2}.
      +\]
      +
      +Simplifying:
      +
      +\[
      +80t^{2}+40t-2020=0
      +\Longrightarrow 4t^{2}+2t-101=0.
      +\]
      +
      +Solve for \(t\):
      +
      +\[
      +t=\frac{-2\pm\sqrt{4+1616}}{8}
      +   =\frac{-2\pm 18\sqrt5}{8}
      +   =\frac{-1\pm 9\sqrt5}{4}.
      +\]
      +
      +Since \(t>0\), we take the plus sign:
      +
      +\[
      +\boxed{t=\frac{9\sqrt5-1}{4}}.
      +\]
      +
      +Thus  
      +
      +\[
      +A_1A_2+A_1A_{11}= \frac{9\sqrt5-1}{4}
      +            =\frac{m\sqrt n-p}{q},
      +\]
      +with \(m=9,\;n=5,\;p=1,\;q=4\).
      +
      +--------------------------------------------------------------------
      +### 6.  Compute \(m+n+p+q\)
      +
      +\[
      +m+n+p+q = 9+5+1+4 = 19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The nine players are distinct.  Let  
      +
      +\[
      +c=\#\text{chocolate},\qquad v=\#\text{vanilla},\qquad s=\#\text{strawberry}
      +\]
      +
      +with  
      +
      +\[
      +c+v+s=9,\qquad c>v>s\ge 1 .
      +\]
      +
      +---
      +
      +### 1.  Find all possible triples \((c,v,s)\)
      +
      +Since \(c>v>s\),
      +
      +\[
      +c\ge v+1,\qquad v\ge s+1.
      +\]
      +
      +Write \(v=s+d_2\) and \(c=v+d_1\) where \(d_1,d_2\ge 1\).  
      +Then  
      +
      +\[
      +c+v+s=(s+d_2+d_1)+(s+d_2)+s=3s+2d_2+d_1=9 .
      +\]
      +
      +Because \(s\ge1\), we have \(3s\le 9\Rightarrow s=1,2,3\).
      +
      +* **\(s=1\):** \(2d_2+d_1=6\).  
      +  \(d_2=1\Rightarrow d_1=4\) → \((c,v,s)=(6,2,1)\).  
      +  \(d_2=2\Rightarrow d_1=2\) → \((c,v,s)=(5,3,1)\).
      +
      +* **\(s=2\):** \(2d_2+d_1=3\).  
      +  \(d_2=1\Rightarrow d_1=1\) → \((c,v,s)=(4,3,2)\).
      +
      +* **\(s=3\):** \(2d_2+d_1=0\) – impossible with \(d_1,d_2\ge1\).
      +
      +Thus the only feasible triples are  
      +
      +\[
      +(6,2,1),\;(5,3,1),\;(4,3,2).
      +\]
      +
      +---
      +
      +### 2.  Count assignments for each triple
      +
      +For a given \((c,v,s)\) the number of ways to assign the flavors to the 9 distinct players is the multinomial coefficient  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +\[
      +\begin{aligned}
      +(6,2,1):\;&\frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[2mm]
      +(5,3,1):\;&\frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[2mm]
      +(4,3,2):\;&\frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 3.  Total number of assignments
      +
      +\[
      +N = 252+504+1260 = 2016.
      +\]
      +
      +---
      +
      +### 4.  Remainder modulo \(1000\)
      +
      +\[
      +2016 \equiv 16 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equation  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +is a homogeneous quadratic form.  
      +Factor it over the integers:
      +
      +\[
      +12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y).
      +\]
      +
      +Indeed  
      +
      +\[
      +(3x+2y)(4x-3y)=12x^{2}-9xy+8xy-6y^{2}=12x^{2}-xy-6y^{2}.
      +\]
      +
      +Hence a pair \((x,y)\) of integers satisfies the equation iff
      +
      +\[
      +3x+2y=0\qquad\text{or}\qquad 4x-3y=0 .
      +\]
      +
      +---
      +
      +### 1. Solutions of \(3x+2y=0\)
      +
      +\[
      +3x+2y=0 \;\Longrightarrow\; y=-\frac{3}{2}x .
      +\]
      +
      +For \(y\) to be an integer, \(x\) must be even: write \(x=2k\). Then  
      +
      +\[
      +(x,y)=(2k,-3k),\qquad k\in\mathbb Z .
      +\]
      +
      +Both coordinates must lie in \([-100,100]\):
      +
      +\[
      +-100\le 2k\le 100\;\Longrightarrow\;-50\le k\le 50,\\
      +-100\le -3k\le 100\;\Longrightarrow\;-33\le k\le 33.
      +\]
      +
      +Thus \(k=-33,-32,\dots ,33\); there are  
      +
      +\[
      +33-(-33)+1 = 67
      +\]
      +
      +integer solutions on this line.
      +
      +---
      +
      +### 2. Solutions of \(4x-3y=0\)
      +
      +\[
      +4x-3y=0 \;\Longrightarrow\; y=\frac{4}{3}x .
      +\]
      +
      +For \(y\) to be an integer, \(x\) must be a multiple of \(3\): put \(x=3t\). Then  
      +
      +\[
      +(x,y)=(3t,4t),\qquad t\in\mathbb Z .
      +\]
      +
      +Again impose the bounds:
      +
      +\[
      +-100\le 3t\le 100\;\Longrightarrow\;-33\le t\le 33,\\
      +-100\le 4t\le 100\;\Longrightarrow\;-25\le t\le 25.
      +\]
      +
      +Thus \(t=-25,-24,\dots ,25\); the number of solutions here is  
      +
      +\[
      +25-(-25)+1 = 51.
      +\]
      +
      +---
      +
      +### 3. Intersection of the two lines
      +
      +Both equations hold simultaneously only at the origin:
      +
      +\[
      +3x+2y=0,\;4x-3y=0 \Longrightarrow (x,y)=(0,0).
      +\]
      +
      +This point has been counted in both previous totals, so we subtract it once.
      +
      +---
      +
      +### 4. Total number of ordered pairs
      +
      +\[
      +\#\text{solutions}=67+51-1=117.
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid be \(ABCD\) with \(AB\parallel CD\) and  
      +
      +\[
      +AB=s ,\qquad CD=r ,\qquad AD=BC=L \;( \text{isosceles}).
      +\]
      +
      +The incircle has radius \(R=3\) and the area is \(72\).
      +
      +---
      +
      +### 1.  Semiperimeter
      +
      +For any tangential quadrilateral (one with an incircle)
      +
      +\[
      +\text{Area}=R\cdot(\text{semiperimeter}).
      +\]
      +
      +Hence  
      +
      +\[
      +72=3\cdot s_{\!p}\quad\Longrightarrow\quad s_{\!p}=24 .
      +\]
      +
      +Thus the perimeter is  
      +
      +\[
      +2s_{\!p}=48\quad\Longrightarrow\quad r+s+2L=48. \tag{1}
      +\]
      +
      +---
      +
      +### 2.  Tangential condition
      +
      +In a tangential quadrilateral the sums of opposite sides are equal:
      +
      +\[
      +AB+CD = AD+BC\quad\Longrightarrow\quad r+s = 2L. \tag{2}
      +\]
      +
      +From (1) and (2),
      +
      +\[
      +2(r+s)=48 \;\Longrightarrow\; r+s=24,\qquad
      +2L=r+s=24\;\Longrightarrow\; L=12.
      +\]
      +
      +---
      +
      +### 3.  Height
      +
      +The incircle touches both parallel sides, so the distance between the bases equals twice the radius:
      +
      +\[
      +h=2R=6.
      +\]
      +
      +(Alternatively, \(\displaystyle 72=\tfrac12(r+s)h\) with \(r+s=24\) also gives \(h=6\).)
      +
      +---
      +
      +### 4.  Relating the bases
      +
      +Place the trapezoid with its symmetry axis on the \(y\)-axis; the bases are horizontal.
      +The horizontal half‑difference of the bases is \(\dfrac{s-r}{2}\).
      +Hence the leg length satisfies
      +
      +\[
      +L^{2}= \left(\frac{s-r}{2}\right)^{2}+h^{2}.
      +\]
      +
      +Using \(L=12,\;h=6\),
      +
      +\[
      +12^{2}= \frac{(s-r)^{2}}{4}+6^{2}
      +\quad\Longrightarrow\quad
      +\frac{(s-r)^{2}}{4}=108
      +\quad\Longrightarrow\quad
      +s-r=12\sqrt3. \tag{3}
      +\]
      +
      +---
      +
      +### 5.  Solving for \(r\) and \(s\)
      +
      +\[
      +\begin{cases}
      +r+s=24,\\[2pt]
      +s-r=12\sqrt3,
      +\end{cases}
      +\qquad\Longrightarrow\qquad
      +\begin{aligned}
      +s&=\frac{24+12\sqrt3}{2}=12+6\sqrt3,\\
      +r&=\frac{24-12\sqrt3}{2}=12-6\sqrt3.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 6.  Required sum of squares
      +
      +\[
      +\begin{aligned}
      +r^{2}+s^{2}
      +&=(12-6\sqrt3)^{2}+(12+6\sqrt3)^{2}\\
      +&= \bigl(144-144\sqrt3+108\bigr)+\bigl(144+144\sqrt3+108\bigr)\\
      +&= 504.
      +\end{aligned}
      +\]
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(A=(0,0)\),  
      +* \(B=(u,0)\) on the \(x\)-axis,  
      +* \(C=(0,v)\) on the \(y\)-axis.  
      +
      +Since \(\angle A=90^{\circ}\), \(BC=38\) gives  
      +
      +\[
      +u^{2}+v^{2}=38^{2}=1444\tag{1}
      +\]
      +
      +---
      +
      +### 1.  The equilateral triangle \(AKL\)
      +
      +The conditions  
      +
      +\[
      +AK=AL=KL=14
      +\]
      +
      +show that \(\triangle AKL\) is equilateral.  
      +Let the direction of \(\overrightarrow{AK}\) form an angle \(\theta\) with the
      +positive \(x\)-axis. Then
      +
      +\[
      +K=(14\cos\theta,\;14\sin\theta),\qquad 
      +L=(14\cos(\theta+60^\circ),\;14\sin(\theta+60^\circ)).\tag{2}
      +\]
      +
      +---
      +
      +### 2.  Using \(BK=14\) and \(CL=14\)
      +
      +\[
      +BK^{2}= (u-14\cos\theta)^2+(14\sin\theta)^2=14^{2}
      +\]
      +
      +\[
      +\Longrightarrow\; u=28\cos\theta.\tag{3}
      +\]
      +
      +Similarly  
      +
      +\[
      +CL^{2}= (14\cos(\theta+60^\circ))^{2}+(v-14\sin(\theta+60^\circ))^{2}=14^{2}
      +\]
      +
      +\[
      +\Longrightarrow\; v=28\sin(\theta+60^\circ).\tag{4}
      +\]
      +
      +---
      +
      +### 3.  Determining \(\theta\)
      +
      +Insert (3) and (4) into (1):
      +
      +\[
      +(28\cos\theta)^{2}+(28\sin(\theta+60^\circ))^{2}=1444
      +\]
      +\[
      +\Longrightarrow\;\cos^{2}\theta+\sin^{2}(\theta+60^\circ)=\frac{361}{196}.
      +\]
      +
      +Using \(\sin(\theta+60^\circ)=\tfrac12\sin\theta+\tfrac{\sqrt3}{2}\cos\theta\),
      +the equation reduces to  
      +
      +\[
      +6\cos^{2}\theta+2\sqrt3\sin\theta\cos\theta= \frac{312}{49}.
      +\]
      +
      +Solving gives \(\cos\theta=\frac{13}{14}\) (the other root gives the same
      +triangle with the legs interchanged).  
      +
      +Hence  
      +
      +\[
      +u=28\cos\theta=28\cdot\frac{13}{14}=26,\qquad
      +v=28\sin(\theta+60^\circ)=28\cdot\frac{4\sqrt3}{7}=16\sqrt3 .
      +\]
      +
      +Thus  
      +
      +\[
      +AB=26,\qquad AC=16\sqrt3,\qquad BC=38.
      +\]
      +
      +From (2) we obtain the coordinates of the interior points
      +
      +\[
      +K=(13,\;3\sqrt3),\qquad L=(2,\;8\sqrt3).
      +\]
      +
      +---
      +
      +### 4.  Area of \(BKLC\)
      +
      +Use the shoelace formula for the polygon \(B(26,0),K(13,3\sqrt3),L(2,8\sqrt3),C(0,16\sqrt3)\):
      +
      +\[
      +\begin{aligned}
      +S_1&=26\cdot3\sqrt3+13\cdot8\sqrt3+2\cdot16\sqrt3+0\cdot0=214\sqrt3,\\
      +S_2&=0\cdot13+3\sqrt3\cdot2+8\sqrt3\cdot0+16\sqrt3\cdot26=422\sqrt3.
      +\end{aligned}
      +\]
      +
      +\[
      +\text{Area}=\frac12|S_2-S_1|
      +          =\frac12(422-214)\sqrt3
      +          =104\sqrt3 .
      +\]
      +
      +Therefore the area can be written as \(n\sqrt3\) with  
      +
      +\[
      +\boxed{n=104}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: None

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For an eight‑digit number formed by a permutation of  
      +
      +\[
      +\{1,2,3,4,5,6,7,8\}
      +\]
      +
      +let  
      +
      +\[
      +a_1a_2a_3a_4a_5a_6a_7a_8
      +\]
      +
      +be its digits (left to right).  
      +A number is divisible by \(22\iff\) it is divisible by \(2\) and by \(11\).
      +
      +---
      +
      +### 1.  Divisibility by 2  
      +
      +The last digit \(a_8\) must be even, so \(a_8\in\{2,4,6,8\}\).
      +
      +---
      +
      +### 2.  Divisibility by 11  
      +
      +For an 8‑digit number the rule for 11 is  
      +
      +\[
      +(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\equiv 0\pmod{11}.
      +\]
      +
      +Since the total sum of the digits is  
      +
      +\[
      +1+2+\cdots+8 = 36,
      +\]
      +
      +let  
      +
      +\[
      +S_{\text{odd}}=a_1+a_3+a_5+a_7,\qquad 
      +S_{\text{even}}=a_2+a_4+a_6+a_8 .
      +\]
      +
      +Then \(S_{\text{odd}}+S_{\text{even}}=36\) and the condition gives  
      +
      +\[
      +S_{\text{odd}}-S_{\text{even}}\equiv0\pmod{11}.
      +\]
      +
      +The only possible values for \(S_{\text{odd}}-S_{\text{even}}\) are \(-22,0,22\);   
      +\(-22\) would give \(S_{\text{odd}}=7\) and \(22\) would give \(S_{\text{odd}}=29\), both impossible because a sum of four distinct digits from \(\{1,\dots ,8\}\) cannot be smaller than \(10\) nor larger than \(26\).  
      +Hence
      +
      +\[
      +S_{\text{odd}} = S_{\text{even}} = 18 .
      +\]
      +
      +Thus the four digits in the odd positions must sum to \(18\); the same holds for the even positions.
      +
      +---
      +
      +### 3.  Choosing the four digits for the odd positions  
      +
      +We need 4‑element subsets of \(\{1,\dots ,8\}\) whose sum is \(18\).  
      +A quick enumeration gives the eight subsets
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\{1,3,6,8\},\{1,4,5,8\},\{1,4,6,7\},\\
      +&\{2,3,5,8\},\{2,3,6,7\},\{2,4,5,7\},\{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +Each contains exactly two even digits (the set \(\{2,4,6,8\}\)) and two odd digits.  
      +Hence every admissible odd‑position set has **2 even digits**.
      +
      +Let a chosen subset be \(S\) (the odd‑position digits) and its complement \(S^c\) (the even‑position digits).
      +
      +---
      +
      +### 4.  Arranging the digits  
      +
      +* The four digits of \(S\) can be placed in the odd positions \((1,3,5,7)\) in \(4! = 24\) ways.  
      +* The four digits of \(S^c\) must fill the even positions \((2,4,6,8)\) with the extra requirement that the last digit \(a_8\) be even.  
      +  Since \(S^c\) contains exactly \(2\) even digits, we have  
      +
      +\[
      +\text{choices for }a_8 = 2,\qquad
      +\text{arrangements of the remaining three even‑position digits}=3! = 6 .
      +\]
      +
      +Thus for each set \(S\)
      +
      +\[
      +\#\text{numbers}=4!\times(2\times3!) = 24\times12 = 288.
      +\]
      +
      +---
      +
      +### 5.  Total number \(N\)
      +
      +There are \(8\) possible subsets \(S\); consequently
      +
      +\[
      +N = 8 \times 288 = 2304 .
      +\]
      +
      +---
      +
      +### 6.  Required difference
      +
      +\[
      +N-2025 = 2304-2025 = 279 .
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +C=25+20i,\qquad r=5 ,
      +\]
      +
      +so  
      +
      +\[
      +|C-z|=5
      +\]
      +
      +is the circle with centre \(C\) and radius \(5\).
      +
      +The second condition  
      +
      +\[
      +|z-4-k|=|z-3i-k|
      +\]
      +
      +means that \(z\) is equally distant from the points  
      +
      +\[
      +P_1=4+k\quad(\text{on the real axis}), \qquad   
      +P_2=k+3i .
      +\]
      +
      +Hence the locus of \(z\) is the perpendicular bisector of the segment \(\overline{P_1P_2}\); this is a straight line.
      +
      +---
      +
      +### 1. Equation of the line
      +
      +Write \(z=x+yi\).  
      +
      +\[
      +(x-(4+k))^2+y^2=(x-k)^2+(y-3)^2 .
      +\]
      +
      +Expanding and simplifying gives  
      +
      +\[
      +-8(x-k)+16=-6y+9,
      +\]
      +
      +\[
      +-8x+8k+6y+7=0 .
      +\]
      +
      +Thus the line \(L(k)\) is  
      +
      +\[
      +-8x+6y+8k+7=0 \qquad\text{or}\qquad 8x-6y=8k+7 .
      +\]
      +
      +All such lines have slope \(\dfrac{4}{3}\); they are a family of parallel lines depending on \(k\).
      +
      +---
      +
      +### 2. Tangency condition
      +
      +The system has exactly one solution precisely when the line \(L(k)\) is tangent to the circle \(|z-C|=5\).  
      +
      +For a line \(Ax+By+C=0\) the distance from a point \((x_0,y_0)\) is  
      +
      +\[
      +d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} .
      +\]
      +
      +Here \(A=-8,\;B=6,\;C=8k+7\) and the centre of the circle is \((25,20)\). Hence
      +
      +\[
      +d(k)=\frac{\bigl|-8\cdot25+6\cdot20+(8k+7)\bigr|}{\sqrt{(-8)^2+6^2}}
      +      =\frac{|8k-73|}{10}.
      +\]
      +
      +Tangency requires \(d(k)=r=5\):
      +
      +\[
      +\frac{|8k-73|}{10}=5\quad\Longrightarrow\quad|8k-73|=50 .
      +\]
      +
      +Thus  
      +
      +\[
      +8k-73=50\quad\text{or}\quad8k-73=-50,
      +\]
      +
      +\[
      +k=\frac{123}{8},\qquad k=\frac{23}{8}.
      +\]
      +
      +Both values make the line tangent, giving exactly one intersection point with the circle.
      +
      +---
      +
      +### 3. Sum of the possible \(k\)
      +
      +\[
      +\frac{123}{8}+\frac{23}{8}= \frac{146}{8}= \frac{73}{4}.
      +\]
      +
      +Write \(\dfrac{73}{4}\) as \(\dfrac{m}{n}\) with \(\gcd(m,n)=1\); then \(m=73,\;n=4\).
      +
      +\[
      +m+n = 73+4 = 77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the letters be  
      +
      +\[
      +A<B<C<D<E<F<G<H<I<J<K<L .
      +\]
      +
      +In a random pairing each pair is written with its smaller letter first, so a
      +pair \(\{x,y\}\;(x<y)\) becomes the word \(xy\).
      +The six words are then listed alphabetically; the last word is the
      +lexicographically largest of the six two‑letter words.
      +
      +Because the first letters of the six words are all different (each letter can
      +appear as the smaller element of at most one pair), the largest word is the
      +pair whose **smaller** element is the largest among the six smaller elements.
      +Hence the last word contains \(G\) precisely when the pair containing \(G\)
      +has the largest smaller element.
      +
      +---
      +
      +### 1.  Choose the partner of \(G\)
      +
      +\(G\) can be paired with any of the other 11 letters, each with probability
      +\(\frac1{11}\).
      +
      +*If \(G\) is paired with a letter larger than \(G\)*  
      +(let the partner be \(X\in\{H,I,J,K,L\}\)).  
      +Then the smaller element of the \(G\!-\!X\) pair is \(G\).
      +
      +The remaining 10 letters consist of  
      +
      +- 6 letters \(\{A,B,C,D,E,F\}\) smaller than \(G\) (call them “low”),  
      +- 4 letters among \(\{H,I,J,K,L\}\setminus\{X\}\) larger than \(G\) (call them “high”).
      +
      +For the pair \(G\!-\!X\) to have the largest smaller element, no other pair
      +may have a smaller element \(\ge G\); i.e. no “high” letter may be the smaller
      +letter of its pair.  Hence each high letter must be matched with a low
      +letter.  
      +
      +Number of matchings of the 10 remaining letters with no high–high pair:
      +
      +\[
      +\binom{6}{4}\,4!\;(=15\cdot24)=360 .
      +\]
      +
      +Total matchings of 10 letters: \((10-1)!!=945\).
      +Thus
      +
      +\[
      +P(\text{lexicographically largest pair }|\,G\!-\!X,\;X>G)=\frac{360}{945}
      +=\frac{8}{21}.
      +\]
      +
      +Since there are 5 possible partners larger than \(G\),
      +
      +\[
      +\sum_{X>G}\frac1{11}\cdot\frac{8}{21}=5\cdot\frac{1}{11}\cdot\frac{8}{21}
      +=\frac{40}{231}.
      +\]
      +
      +*If \(G\) is paired with a letter smaller than \(G\)*  
      +the only possible partner is \(F\); for any smaller partner there are fewer
      +than five letters below it, making it impossible for its pair to have the
      +largest smaller element.
      +
      +When \(G\) is paired with \(F\), the smaller element of the pair is \(F\).
      +The other 10 letters are  
      +
      +\[
      +\{A,B,C,D,E\}\ (\text{low})\quad\text{and}\quad\{H,I,J,K,L\}\ (\text{high}).
      +\]
      +
      +All five high letters must be paired with the five low letters; otherwise a
      +high letter would become a smaller element.  The number of such matchings is
      +\(5!=120\).  Hence
      +
      +\[
      +P(\text{largest pair }|\,G\!-\!F)=\frac{120}{945}=\frac{8}{63},
      +\]
      +and the contribution is \(\displaystyle\frac1{11}\cdot\frac{8}{63}
      += \frac{8}{693}\).
      +
      +No other partner of \(G\) can work, so the total probability that the last
      +word contains \(G\) is
      +
      +\[
      +\frac{40}{231}+\frac{8}{693}
      +=\frac{120}{693}+\frac{8}{693}
      +=\frac{128}{693}.
      +\]
      +
      +The fraction \(\frac{128}{693}\) is already in lowest terms.  
      +Thus \(m=128,\ n=693\) and
      +
      +\[
      +m+n = 128+693 = 821.
      +\]
      +
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution**
      +
      +--------------------------------------------------------------------
      +
      +### 1.  The ratios on the two sides  
      +
      +\[
      +AB=AD+DE+EB=4+16+8=28,\qquad 
      +AC=AF+FG+GC=13+52+26=91 .
      +\]
      +
      +\[
      +\frac{AD}{AB}=\frac{4}{28}=\frac17,\qquad 
      +\frac{AF}{AC}= \frac{13}{91}= \frac17 .
      +\]
      +
      +Hence  
      +
      +\[
      +\frac{AD}{AB}= \frac{AF}{AC}= \frac17\qquad\Longrightarrow\qquad 
      +DF\parallel BC .
      +\]
      +
      +Similarly  
      +
      +\[
      +\frac{AE}{AB}= \frac{20}{28}= \frac57,\qquad 
      +\frac{AG}{AC}= \frac{65}{91}= \frac57 ,
      +\]
      +
      +so  
      +
      +\[
      +\frac{AE}{AB}= \frac{AG}{AC}= \frac57\qquad\Longrightarrow\qquad 
      +EG\parallel BC .
      +\]
      +
      +Let  
      +
      +\[
      +p=\frac17,\qquad q=\frac57 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 2.  Area of \(\triangle ABC\)
      +
      +Because \(DF\parallel EG\parallel BC\), the quadrilateral \(DEGF\) is the
      +region of \(\triangle ABC\) between the two lines through \(D\) and \(E\)
      +parallel to \(BC\).  
      +
      +Triangles \(ADF\) and \(AEG\) are similar to \(\triangle ABC\) with similarity
      +ratios \(p\) and \(q\) respectively, so
      +
      +\[
      +[ADF]=p^{2}[ABC],\qquad[AEG]=q^{2}[ABC].
      +\]
      +
      +Hence  
      +
      +\[
      +[DEGF]=[AEG]-[ADF]=(q^{2}-p^{2})[ABC]
      +        =\Bigl(\frac{5^{2}}{7^{2}}-\frac{1^{2}}{7^{2}}\Bigr)[ABC]
      +        =\frac{24}{49}[ABC].
      +\]
      +
      +Given \([DEGF]=288\),
      +
      +\[
      +[ABC]=288\cdot\frac{49}{24}=12\cdot 49 =\boxed{588}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Coordinates
      +
      +Place  
      +
      +\[
      +A=(0,0),\qquad B=(28,0),\qquad C=(c,\,42)
      +\]
      +
      +(the height is \(42\) because \([ABC]=\frac12\cdot28\cdot42=588\)).  
      +Using the ratios \(p,q\),
      +
      +\[
      +\begin{aligned}
      +D &=pB=(4,0),                   &E&=qB=(20,0),\\[2mm]
      +F &=pC=\Bigl(\frac{c}{7},6\Bigr), &
      +G &=qC=\Bigl(\frac{5c}{7},30\Bigr).
      +\end{aligned}
      +\]
      +
      +Reflections give  
      +
      +\[
      +M=2F-D=\Bigl(\frac{2c}{7}-4,\;12\Bigr),\qquad 
      +N=2E-G=\Bigl(40-\frac{5c}{7},\;-30\Bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 4.  Area of the heptagon \(AFNBCEM\)
      +
      +List the vertices in order:
      +
      +\[
      +\begin{array}{c|c}
      +\text{Vertex}&(x,y)\\ \hline
      +A&(0,0)\\
      +F&\bigl(\frac{c}{7},6\bigr)\\
      +N&\bigl(40-\frac{5c}{7},-30\bigr)\\
      +B&(28,0)\\
      +C&(c,42)\\
      +E&(20,0)\\
      +M&\bigl(\frac{2c}{7}-4,12\bigr)
      +\end{array}
      +\]
      +
      +Apply the Shoelace formula.  The sum  
      +
      +\[
      +\sum_{i=1}^{7}\bigl(x_i y_{i+1}-y_i x_{i+1}\bigr)
      +\]  
      +
      +(with \(x_8=x_1,\;y_8=y_1\)) simplifies dramatically:
      +
      +\[
      +\begin{aligned}
      +&0\\
      +&\;-\;240\\
      +&\;+\;840\\
      +&\;+\;1176\\
      +&\;-\;840\\
      +&\;+\;240\\
      +&0
      +\end{aligned}
      +\qquad =\;1176 .
      +\]
      +
      +Thus
      +
      +\[
      +[AFNBCEM]=\frac12\cdot1176=588 .
      +\]
      +
      +The result does **not** depend on the unknown coordinate \(c\); the
      +cancellation occurs because the vectors \(DF\) and \(EG\) are parallel to
      +\(BC\).
      +
      +--------------------------------------------------------------------
      +
      +### 5.  Answer
      +
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +P:\;y=x^{2}-4
      +\]
      +
      +and rotate \(P\) \(60^{\circ}\) counter‑clockwise about the origin.  
      +If \((x,y)\) lies on the rotated curve, then there is a point \((u,v)\) on
      +\(P\) such that  
      +
      +\[
      +\begin{pmatrix}x\\y\end{pmatrix}=R\begin{pmatrix}u\\v\end{pmatrix},
      +\qquad 
      +R=\begin{pmatrix}\tfrac12&-\tfrac{\sqrt3}{2}\\[2pt]\tfrac{\sqrt3}{2}&\tfrac12\end{pmatrix}.
      +\]
      +
      +Equivalently, a point \((x,y)\) is on both curves iff
      +
      +\[
      +y=x^{2}-4 \qquad\text{and}\qquad 
      +R^{T}\!\begin{pmatrix}x\\y\end{pmatrix}
      +   =\begin{pmatrix}x'\\y'\end{pmatrix}
      +\text{ satisfies }y'=(x')^{2}-4,
      +\]
      +
      +where  
      +
      +\[
      +R^{T}= \begin{pmatrix}\tfrac12&\tfrac{\sqrt3}{2}\\[2pt]-\tfrac{\sqrt3}{2}&\tfrac12\end{pmatrix},
      +\quad 
      +x'=\frac{x}{2}+\frac{\sqrt3\,y}{2},\qquad
      +y'=-\frac{\sqrt3\,x}{2}+\frac{y}{2}.
      +\]
      +
      +Using \(y=x^{2}-4\),
      +
      +\[
      +x'=\frac{\sqrt3 x^{2}+x-4\sqrt3}{2},\qquad 
      +y'=\frac{x^{2}-\sqrt3 x-4}{2}.
      +\]
      +
      +The condition \(y'=(x')^{2}-4\) yields  
      +
      +\[
      +\frac{x^{2}-\sqrt3 x-4}{2}
      +   =\Bigl(\frac{\sqrt3 x^{2}+x-4\sqrt3}{2}\Bigr)^{2}-4 .
      +\]
      +
      +Multiplying by \(2\) and simplifying gives the quartic
      +
      +\[
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40=0.
      +\]
      +
      +Factor this over \(\mathbb{Q}(\sqrt3)\):
      +
      +\[
      +\begin{aligned}
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40
      +&=(x^{2}+\sqrt3\,x-4)(3x^{2}-\sqrt3\,x-10).
      +\end{aligned}
      +\]
      +
      +Hence the possible \(x\)-coordinates are the roots of the two quadratics.
      +
      +\[
      +\begin{cases}
      +x^{2}+\sqrt3\,x-4=0 &\Longrightarrow
      +\displaystyle x=\frac{-\sqrt3\pm\sqrt{19}}2,\\[6pt]
      +3x^{2}-\sqrt3\,x-10=0 &\Longrightarrow
      +\displaystyle x=\frac{\sqrt3\pm\sqrt{123}}6 .
      +\end{cases}
      +\]
      +
      +We need a point in the fourth quadrant, i.e. \(x>0\) and \(y=x^{2}-4<0\).
      +Only  
      +
      +\[
      +x=\frac{-\sqrt3+\sqrt{19}}2\;(>0,\;<2)
      +\]
      +
      +satisfies this.  Its \(y\)-coordinate is
      +
      +\[
      +\begin{aligned}
      +y&=x^{2}-4
      +   =\frac{(-\sqrt3+\sqrt{19})^{2}}{4}-4
      +   =\frac{22-2\sqrt{57}}4-4\\
      +  &=\frac{11-\sqrt{57}}2-4
      +   =\frac{3-\sqrt{57}}2 .
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +y=\frac{a-\sqrt{b}}{c}\quad\text{with}\quad a=3,\;b=57,\;c=2,
      +\]
      +
      +and \(a\) and \(c\) are relatively prime.  
      +
      +Finally
      +
      +\[
      +a+b+c=3+57+2=62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\begin{aligned}
      +&x-yz<y-zx<z-xy \\
      +\Longleftrightarrow\;&x-yz<y-zx\quad\text{and}\quad y-zx<z-xy  \\
      +\Longleftrightarrow\;&(x-y)(1+z)<0\quad\text{and}\quad (y-z)(1+x)<0 .
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{cases}
      +(x-y)(1+z)<0,\\[2pt]
      +(y-z)(1+x)<0 .
      +\end{cases}
      +\]
      +
      +Each product being negative means the two factors have opposite signs.  
      +Thus we have four possible sign‑combinations:
      +
      +\[
      +\begin{array}{c|c|c}
      +\text{Case}& (x-y,\;1+z) & (y-z,\;1+x)\\ \hline
      +\text{I}& (+,\; -) & (+,\; -)\\
      +\text{II}& (+,\; -) & (-,\; +)\\
      +\text{III}& (-,\; +) & (+,\; -)\\
      +\text{IV}& (-,\; +) & (-,\; +)
      +\end{array}
      +\]
      +
      +Translating them into linear inequalities:
      +
      +\[
      +\begin{aligned}
      +\text{I}&:\; x>y,\;z<-1,\;y>z,\;x<-1 \qquad\text{(impossible since }x+y+z=75)\\
      +\text{II}&:\; x>y,\;z<-1,\;y<z,\;x>-1 \\
      +\text{III}&:\; x<y,\;z>-1,\;y>z,\;x<-1 \\
      +\text{IV}&:\; x<y,\;z>-1,\;y<z,\;x>-1 .
      +\end{aligned}
      +\]
      +
      +Thus three non‑empty convex regions arise from cases II, III, IV.
      +Cases II and III are unbounded, while case IV gives a bounded region.
      +
      +---
      +
      +### Bounded region (case IV)
      +
      +Case IV is equivalent to  
      +
      +\[
      +-1<x<y<z ,\qquad x+y+z=75 .
      +\]
      +
      +The boundary of this region in the plane \(x+y+z=75\) consists of the three lines  
      +
      +\[
      +\begin{cases}
      +x=-1,\\[2pt]
      +y=x,\\[2pt]
      +z=y .
      +\end{cases}
      +\]
      +
      +Intersecting each pair of lines with the plane gives the vertices
      +
      +\[
      +\begin{aligned}
      +A &: x=-1,\;y=-1 \;\Rightarrow\;z=77 ,&&A(-1,-1,77),\\
      +B &: x=-1,\;z=y \;\Rightarrow\;y=z=38 ,&&B(-1,38,38),\\
      +C &: y=x,\;z=y \;\Rightarrow\;x=y=z=25 ,&&C(25,25,25).
      +\end{aligned}
      +\]
      +
      +Hence the finite region is the triangle \(ABC\).
      +
      +---
      +
      +### Area of the triangle
      +
      +Vectors along two sides:
      +
      +\[
      +\begin{aligned}
      +\vec{AB}&=B-A=(0,39,-39),\\
      +\vec{AC}&=C-A=(26,26,-52).
      +\end{aligned}
      +\]
      +
      +\[
      +\vec{AB}\times\vec{AC}=(-1014,-1014,-1014)
      +\quad\Longrightarrow\quad 
      +\bigl\lVert\vec{AB}\times\vec{AC}\bigr\rVert
      +=1014\sqrt3 .
      +\]
      +
      +Therefore
      +
      +\[
      +\text{Area}= \frac12\bigl\lVert\vec{AB}\times\vec{AC}\bigr\rVert
      +           =\frac12\cdot1014\sqrt3
      +           =507\sqrt3 .
      +\]
      +
      +Thus the area is \(a\sqrt b\) with \(a=507,\;b=3\), and
      +
      +\[
      +a+b=507+3=510.
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First write the equation for the intersection points.
      +
      +The parabola is  
      +
      +\[
      +x=34y^{2},
      +\]
      +
      +and the periodic saw‑tooth satisfies  
      +
      +\[
      +f(x+4)=f(x),\qquad   
      +f(x)=\begin{cases}
      +x,&-1\le x<1,\\[2pt]
      +2-x,&1\le x<3 .
      +\end{cases}
      +\]
      +
      +Hence an intersection must satisfy  
      +
      +\[
      +y=f(34y^{2}). \tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Express \(f\) using the modulus
      +
      +For any real \(x\) let  
      +
      +\[
      +t=(x+1)\pmod 4,\qquad 0\le t<4 .
      +\]
      +
      +Then  
      +
      +\[
      +f(x)=
      +\begin{cases}
      +t-1,&0\le t<2,\\[2pt]
      +3-t,&2\le t<4 .
      +\end{cases}
      +\]
      +
      +Put \(x=34y^{2}\).  Let  
      +
      +\[
      +s=34y^{2}+1,\qquad t=s\pmod4 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Two linear possibilities
      +
      +*If \(0\le t<2\) (the “rising” part) then \(y=t-1\) and  
      +\(t=y+1\).  Hence  
      +
      +\[
      +34y^{2}+1=4n+y+1\quad\Longrightarrow\quad 34y^{2}-y-4n=0,\tag{2}
      +\]
      +
      +with the condition \(y\in[-1,1)\).
      +
      +*If \(2\le t<4\) (the “falling” part) then \(y=3-t\) and  
      +\(t=3-y\).  Hence  
      +
      +\[
      +34y^{2}+1=4n+3-y\quad\Longrightarrow\quad 34y^{2}+y-(2+4n)=0,\tag{3}
      +\]
      +
      +with the condition \(y\in(-1,1]\).
      +
      +Here \(n\) is the integer \(\displaystyle n=\Big\lfloor\frac{34y^{2}+1}{4}\Big\rfloor\).
      +Since \(0\le 34y^{2}+1\le 35\), we must have \(0\le n\le 8\).
      +
      +--------------------------------------------------------------------
      +### 3.  Solve the quadratics
      +
      +**From (2):**  
      +
      +\[
      +y=\frac{1\pm\sqrt{1+544n}}{68}\qquad (n=0,1,\dots ,8).
      +\]
      +
      +Both roots lie in \([-1,1)\); for each \(n\) their sum is  
      +
      +\[
      +\frac{1}{34}.
      +\]
      +
      +Thus  
      +
      +\[
      +S_I=\sum_{n=0}^{8}\frac1{34}= \frac{9}{34}. \tag{4}
      +\]
      +
      +**From (3):**  
      +
      +\[
      +y=\frac{-1\pm\sqrt{273+544n}}{68}\qquad (n=0,1,\dots ,8).
      +\]
      +
      +For \(n=0,\dots ,7\) both roots satisfy \((-1,1]\); for \(n=8\) the
      +negative root is \(\le -1\) and must be discarded.
      +Hence for \(n=0,\dots ,7\) each pair sums to \(-\dfrac1{34}\), and we add
      +the single remaining root for \(n=8\):
      +
      +\[
      +S_{II}=8\!\left(-\frac1{34}\right)+\frac{-1+\sqrt{4625}}{68}
      +        =-\frac{8}{34}+\frac{-1+5\sqrt{185}}{68}. \tag{5}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Total sum of \(y\)-coordinates
      +
      +\[
      +\begin{aligned}
      +S &=S_I+S_{II}\\
      +  &=\frac{9}{34}-\frac{8}{34}+\frac{-1+5\sqrt{185}}{68}\\
      +  &=\frac{1}{34}+\frac{-1+5\sqrt{185}}{68}\\[2pt]
      +  &=\frac{2-1+5\sqrt{185}}{68}
      +   =\frac{1+5\sqrt{185}}{68}.
      +\end{aligned}
      +\]
      +
      +Thus the sum can be written as \(\displaystyle \frac{a+b\sqrt{c}}{d}\) with  
      +
      +\[
      +a=1,\qquad b=5,\qquad c=185,\qquad d=68,
      +\]
      +
      +where \(a,b,d\) are coprime and \(c\) is square‑free.
      +
      +Finally  
      +
      +\[
      +a+b+c+d = 1+5+185+68 = 259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The condition  
      +
      +\[
      +a^3+b^3+c^3\equiv 0\pmod {3^7}\qquad (3^7=2187)
      +\]
      +
      +depends only on the residues of \(a,b,c\) modulo \(3^7\).  
      +Write each number as  
      +
      +\[
      +a=3^{3\alpha}q,\qquad \alpha\in\{0,1,2\},\;q\in Q,
      +\]
      +
      +where  
      +
      +* \(Q\) = the set of cubic residues among units modulo \(3^7\);  
      +  \(|Q|=486\);
      +* for \(\alpha=0,1,2\) the sets  
      +
      +\[
      +R_\alpha =\{3^{3\alpha}q\;|\;q\in Q\}
      +\]
      +
      +have sizes  
      +
      +\[
      +|R_0|=486,\;|R_1|=162,\;|R_2|=54 .
      +\]
      +
      +All numbers divisible by \(27\) contribute \(0\) to the sum, so we only need the
      +ordered triples whose components lie in  
      +
      +\[
      +R=R_0\cup R_1\cup R_2 .
      +\]
      +
      +Denote  
      +
      +\[
      +M_2 =\#\{(x,y)\in R^2 : x+y\equiv 0\},\qquad 
      +M_3 =\#\{(x,y,z)\in R^3 : x+y+z\equiv 0\}.
      +\]
      +
      +Because \(-x\in R\) for every \(x\in R\), we have \(M_2=|R|=702\).
      +
      +The total number of required triples of positive integers is  
      +
      +\[
      +\begin{aligned}
      +N&=27^3      \;(\text{all three multiples of }27) \\
      +  &\quad+ 3\cdot27\cdot M_2 \;(\text{exactly two non‑multiples of }27)\\
      +  &\quad+ M_3 .
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +N=19683+81\cdot702+M_3=19683+56862+M_3 .
      +\]
      +
      +--------------------------------------------------------------------
      +### Computing \(M_3\)
      +
      +Let  
      +
      +\[
      +f(z)=\mathbf 1_R(z),\qquad
      +F(t)=\sum_{z\in\mathbf Z/3^7\mathbf Z}f(z) e^{2\pi i t z/3^7}
      +\]
      +
      +be the Fourier transform of the indicator of \(R\).  
      +Then
      +
      +\[
      +M_3=\frac1{3^7}\sum_{t=0}^{3^7-1}F(t)^3 .
      +\]
      +
      +Writing \(R\) as \(Q\cup27Q\cup729Q\) and using that each element of
      +\(R_\alpha\) is obtained from \(|Q|/3^\alpha\) elements of \(Q\), we obtain
      +
      +\[
      +F(t)=\sum_{\alpha=0}^{2}\frac1{3^{\alpha}}
      +        \sum_{q\in Q} e^{2\pi i t\cdot3^{3\alpha} q/3^7}.
      +\]
      +
      +The inner sums are evaluated with the three characters of order 3 on
      +\((\mathbf Z/3^7\mathbf Z)^\times\).  One finds that \(F(t)\) depends only on
      +\(v=v_3(t)\) (the 3‑adic valuation of \(t\)):
      +
      +\[
      +\begin{array}{c|c|c}
      +v &\text{number of }t &F(t)\\\hline
      +0 &1458 & -27\\
      +1 &486  & 54\\
      +2 &162  & 54\bigl(1+\operatorname{Re}A\bigr)\\
      +3 &54   & -27\\
      +4 &18   & 216\\
      +5 &6    & 216+162\,\operatorname{Re}A\\
      +6 &2    & -27
      +\end{array}
      +\]
      +
      +where  
      +
      +\[
      +A=3e^{2\pi i/9}=3\zeta_9,\qquad 
      +\operatorname{Re}A=3\cos\frac{2\pi}{9}.
      +\]
      +
      +From the values
      +\[
      +\operatorname{Re}A=3\cos\frac{2\pi}{9},\qquad
      +\cos\frac{2\pi}{9}+ \cos\frac{4\pi}{9}+ \cos\frac{8\pi}{9}=0,
      +\]
      +one obtains  
      +
      +\[
      +\sum_{i=1}^3 (1+r_i)^3=\frac{267}{8},\qquad
      +\sum_{i=1}^3\Bigl(\frac43+r_i\Bigr)^3=\frac{3671}{72},
      +\]
      +where \(r_1,r_2,r_3\) are the three real numbers
      +\(3\cos\frac{2\pi}{9},\,3\cos\frac{4\pi}{9},\,3\cos\frac{8\pi}{9}\).
      +
      +Carrying out the sum
      +
      +\[
      +\sum_{t}F(t)^3
      + =702^3-1514\cdot27^3+486\cdot54^3+18\cdot216^3
      +   +54^4\!\left(\frac{267}{8}\right)+8\,503\,056\!\left(\frac{3671}{72}\right)
      + =1\,291\,401\,630 .
      +\]
      +
      +Since \(3^7=2187\),
      +
      +\[
      +M_3=\frac{1\,291\,401\,630}{2187}=590\,490 .
      +\]
      +
      +--------------------------------------------------------------------
      +### Final count
      +
      +\[
      +\begin{aligned}
      +N &=19683+56862+590490\\
      +  &=667\,035 .
      +\end{aligned}
      +\]
      +
      +The problem asks for \(N\bmod 1000\):
      +
      +\[
      +\boxed{35}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 35

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 –   What the conditions mean**
      +
      +The grid has three rows and nine columns.  
      +The columns are grouped into three \(3\times3\) blocks  
      +
      +\[
      +B_{1}=\{1,2,3\},\qquad B_{2}=\{4,5,6\},\qquad B_{3}=\{7,8,9\}.
      +\]
      +
      +For each row we must use the numbers \(1,2,\dots ,9\) exactly once, and for each
      +block the nine cells of that block must also contain the numbers \(1,\dots ,9\) exactly once.
      +
      +Hence for each digit \(d\) :
      +
      +* it appears once in each of the three rows,  
      +* it appears once in each of the three blocks.
      +
      +Consequently the three positions of a digit form a **bijection** between rows and blocks.
      +Let \(\sigma _d\in S_{3}\) be the permutation defined by
      +
      +\[
      +\sigma _d(i)=\text{the block that contains }d\text{ in row }i .
      +\]
      +
      +Thus each digit contributes one ‘1’ in the \(3\times3\) permutation matrix of \(\sigma _d\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 2 –   The matrix condition**
      +
      +If we add the nine permutation matrices of the nine digits we obtain a matrix
      +\(M\) whose entry \(M_{i,b}\) counts how many digits lie in row \(i\) and block \(b\).
      +The block condition says that each block must contain each digit once, i.e. each
      +cell \((i,b)\) must contain exactly three digits. Therefore
      +
      +\[
      +M=3J,\qquad J=\begin{pmatrix}1&1&1\\1&1&1\\1&1&1\end{pmatrix}.
      +\]
      +
      +So we must write \(3J\) as a sum of nine (not‑necessarily distinct) permutation
      +matrices of size \(3\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 3 –   Types of permutations**
      +
      +\(S_{3}\) has six elements:
      +
      +\[
      +\begin{aligned}
      +&\text{id},\;(12),\;(13),\;(23),\;(123),\;(132).
      +\end{aligned}
      +\]
      +
      +Let  
      +
      +\[
      +a=x_{\text{id}}=x_{(123)}=x_{(132)},\qquad
      +b=x_{(12)}=x_{(13)}=x_{(23)} .
      +\]
      +
      +Counting the contributions of each type to the nine entries of \(M\) gives the
      +system  
      +
      +\[
      +\begin{cases}
      +a+b=3\\[2pt]
      +a+b=3\\[2pt]
      +a+b=3\\[2pt]
      +a+b=3,
      +\end{cases}
      +\qquad\Longrightarrow\qquad a+b=3 .
      +\]
      +
      +Hence \(a\) may be \(0,1,2,3\) and \(b=3-a\).  For a fixed value of \(a\),
      +
      +\[
      +\begin{aligned}
      +x_{\text{id}}&=a,\\
      +x_{(123)}&=a,\\
      +x_{(132)}&=a,\\
      +x_{(12)}&=x_{(13)}=x_{(23)}&=3-a .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4 –   Assigning the nine digits to the permutations**
      +
      +The nine digits are distinct, so for a given \(a\) the number of ways to give the
      +six permutation types to the digits is the multinomial coefficient
      +
      +\[
      +N_a=\frac{9!}{a!\,a!\,a!\,(3-a)!\,(3-a)!\,(3-a)!}
      +    =\frac{9!}{a!^{3}(3-a)!^{3}} .
      +\]
      +
      +Summing over the four possible values of \(a\),
      +
      +\[
      +\sum_{a=0}^{3}N_a
      +   =\frac{9!}{0!^{3}3!^{3}}+\frac{9!}{1!^{3}2!^{3}}
      +    +\frac{9!}{2!^{3}1!^{3}}+\frac{9!}{3!^{3}0!^{3}}
      +   =94\,080 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5 –   Ordering inside each row‑block**
      +
      +For a fixed assignment of the permutations, each of the nine
      +\( ( \text{row},\text{block} )\) cells contains exactly three different digits.
      +These three digits can be placed in the three columns of that cell in any order,
      +i.e. in \(3! = 6\) ways, independently of the other cells.
      +Hence we obtain an extra factor \((3!)^{9}=6^{9}\).
      +
      +Thus the total number of admissible \(3\times9\) grids is
      +
      +\[
      +N = 94\,080\cdot 6^{9}
      +   =9!\cdot 6^{6}\cdot 56 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 6 –   Prime factorisation**
      +
      +\[
      +\begin{aligned}
      +9! &=2^{7}\,3^{4}\,5\,7,\\
      +6^{6}&=(2\cdot3)^{6}=2^{6}\,3^{6},\\
      +56 &=2^{3}\,7 .
      +\end{aligned}
      +\]
      +
      +Multiplying gives  
      +
      +\[
      +N=2^{7+6+3}\,3^{4+6}\,5^{1}\,7^{1+1}
      +  =2^{16}\,3^{10}\,5^{1}\,7^{2}.
      +\]
      +
      +Thus we may write  
      +
      +\[
      +N = p^{a}\,q^{b}\,r^{c}\,s^{d}
      +\quad\text{with}\quad
      +p=2,\;a=16;\;\; q=3,\;b=10;\;\; r=5,\;c=1;\;\; s=7,\;d=2 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 7 –   Required sum**
      +
      +\[
      +p\cdot a+q\cdot b+r\cdot c+s\cdot d
      + =2\cdot16+3\cdot10+5\cdot1+7\cdot2
      + =32+30+5+14=81 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line containing \(A,B,C,D,E,F\) be the \(x\)-axis.
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\ C=(c,0),\ D=(d,0),\ E=(e,0),\ F=(f,0)
      +\]
      +
      +From the given distances along the line  
      +
      +\[
      +\begin{aligned}
      +AC&=c-a=26 \Longrightarrow c=26,\\
      +BD&=d-b=22,\\
      +CE&=e-c=31 \Longrightarrow e=26+31=57,\\
      +DF&=f-d=33,\\
      +AF&=f-a=73 \Longrightarrow f=73 .
      +\end{aligned}
      +\]
      +
      +From \(DF=33\) we get \(d=f-33=73-33=40\).  
      +Then \(BD=22\) gives \(b=d-22=40-22=18\).
      +
      +Thus the collinear points are
      +
      +\[
      +A(0),\ B(18),\ C(26),\ D(40),\ E(57),\ F(73).
      +\]
      +
      +---
      +
      +### Coordinates of \(G\)
      +
      +Let \(G=(x,y)\) with \(y\neq0\).  
      +We know
      +
      +\[
      +\begin{cases}
      +(CG)^2=(x-26)^2+y^2=40^2=1600,\\
      +(DG)^2=(x-40)^2+y^2=30^2=900 .
      +\end{cases}
      +\]
      +
      +Subtracting the equations:
      +
      +\[
      +(x-26)^2-(x-40)^2 = 1600-900=700 .
      +\]
      +
      +Compute the left side:
      +
      +\[
      +\bigl(x^2-52x+676\bigr)-\bigl(x^2-80x+1600\bigr)=28x-924 .
      +\]
      +
      +Hence \(28x-924=700\) giving  
      +
      +\[
      +x=\frac{1624}{28}=58.
      +\]
      +
      +Now use \((x-40)^2+y^2=900\):
      +
      +\[
      +(58-40)^2+y^2=900\Longrightarrow 18^2+y^2=900\Longrightarrow y^2=576.
      +\]
      +
      +Thus \(y=\pm24\).  The sign does not affect the area; we take \(y=24\).
      +
      +Therefore  
      +
      +\[
      +G=(58,24)\;(\text{or }(58,-24)).
      +\]
      +
      +---
      +
      +### Area of \(\triangle BGE\)
      +
      +Points:
      +\[
      +B=(18,0),\qquad G=(58,24),\qquad E=(57,0).
      +\]
      +
      +Since \(B\) and \(E\) lie on the \(x\)-axis, the base \(BE\) has length  
      +
      +\[
      +BE = 57-18 = 39.
      +\]
      +
      +The altitude from \(G\) to the \(x\)-axis is \(|y|=24\).
      +
      +Hence
      +
      +\[
      +\text{Area}=\frac12\cdot (\text{base})\cdot (\text{height})
      +          =\frac12\cdot 39\cdot 24
      +          =468.
      +\]
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +x_{k+1}= \frac{x_k+\frac1{x_k}-1}{3},\qquad x_1=\frac{25}{11}
      +\]
      +
      +---
      +
      +### 1.  A convenient substitution  
      +
      +Let  
      +
      +\[
      +y_k=\frac{x_k-1}{x_k+1}\qquad\Longleftrightarrow\qquad 
      +x_k=\frac{1+y_k}{1-y_k}.
      +\]
      +
      +Then a short computation gives  
      +
      +\[
      +y_{k+1}= \frac{3y_k^{\,2}-1}{2}. \tag{1}
      +\]
      +
      +Thus we only have to iterate the quadratic map (1).
      +
      +---
      +
      +### 2.  Scaling  
      +
      +Define  
      +
      +\[
      +u_k=\frac32\,y_k .
      +\]
      +
      +From (1)
      +
      +\[
      +u_{k+1}=u_k^{2}-\frac34 .\tag{2}
      +\]
      +
      +Let  
      +
      +\[
      +u_k=\frac{a_k}{12^{\,2^{k-1}}},\qquad a_1=7 .
      +\]
      +
      +Because the denominator squares each step, indeed  
      +
      +\[
      +12^{\,2^{k}}=(12^{\,2^{k-1}})^2 .
      +\]
      +
      +Using (2) one checks that  
      +
      +\[
      +a_{k+1}=a_k^{2}-\frac34\cdot12^{\,2^{k}} .
      +\]
      +
      +Only the denominator grows; the exact value of the numerator is not needed later.
      +
      +---
      +
      +### 3.  Returning to \(x_k\)
      +
      +Since \(y_k=\frac{2}{3}u_k\),
      +
      +\[
      +x_k=\frac{1+y_k}{1-y_k}
      +     =\frac{3+2u_k}{3-2u_k}
      +     =\frac{3\cdot12^{\,2^{k-1}}+2a_k}
      +            {3\cdot12^{\,2^{k-1}}-2a_k}.
      +\]
      +
      +Hence for any \(k\),
      +
      +\[
      +x_k=\frac{M_k}{N_k},\qquad 
      +M_k+N_k =6\cdot12^{\,2^{k-1}} .
      +\]
      +
      +In particular
      +
      +\[
      +m+n = M_{2025}+N_{2025}= 6\cdot 12^{\,2^{2024}} .
      +\]
      +
      +---
      +
      +### 4.  Computing \(6\cdot12^{2^{2024}}\pmod{1000}\)
      +
      +We need \(6\cdot12^{K}\pmod{1000}\) where \(K=2^{2024}\).
      +
      +Because \(1000=8\cdot125\) we work modulo 8 and 125.
      +
      +*Modulo 8*:  
      +\(12\equiv4\pmod8\), and \(4^{2}=0\pmod8\).  
      +Since \(K\ge2\), \(12^{K}\equiv0\pmod8\) ⇒ the whole expression is \(0\pmod8\).
      +
      +*Modulo 125*:  \(\gcd(12,125)=1\) and \(\phi(125)=100\).  
      +Thus \(12^{100}\equiv1\pmod{125}\); we need \(K\bmod100\).
      +
      +The powers of 2 modulo 100 repeat with period 20 for exponents \(\ge2\).  
      +\(2024\equiv4\pmod{20}\), so \(2^{2024}\equiv2^{4}=16\pmod{100}\).  
      +Hence \(12^{K}\equiv12^{16}\pmod{125}\).
      +
      +Compute:
      +\[
      +12^{2}\equiv19,\;12^{4}\equiv111,\;12^{8}\equiv71,\;12^{16}\equiv71^{2}\equiv41\pmod{125}.
      +\]
      +
      +Thus \(6\cdot12^{K}\equiv6\cdot41=246\equiv121\pmod{125}\).
      +
      +Now solve the CRT:
      +\[
      +X\equiv0\pmod8,\qquad X\equiv121\pmod{125}.
      +\]
      +
      +Let \(X=8t\). Then \(8t\equiv121\pmod{125}\Rightarrow t\equiv47\cdot121\equiv62\pmod{125}\) (since \(8^{-1}\equiv47\pmod{125}\)).  
      +Thus \(X=8\cdot62=496\pmod{1000}\).
      +
      +Therefore
      +
      +\[
      +m+n \equiv 496 \pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{496}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 496

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +m=n+2\qquad (m>2)
      +\]
      +
      +Then  
      +
      +\[
      +n+2=m,\qquad n+3=m+1,\qquad n^{2}+9=(m-2)^{2}+9=m^{2}-4m+13 .
      +\]
      +
      +The condition  
      +
      +\[
      +n+2\mid 3(n+3)(n^{2}+9)
      +\]
      +
      +becomes  
      +
      +\[
      +m \mid 3(m+1)(m^{2}-4m+13). \tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Using the gcd with 3
      +
      +Because  
      +
      +\[
      +\gcd(m,m+1)=1,
      +\]
      +
      +any prime divisor of \(m\) cannot come from the factor \(m+1\).  
      +The only possible common factor of \(m\) with the whole right‑hand side of (1) is the factor \(3\).
      +
      +Let  
      +
      +\[
      +d=\gcd(m,3),\qquad m=d\cdot m',\qquad \gcd(m',3)=1 .
      +\]
      +
      +Then (1) is equivalent to  
      +
      +\[
      +d m' \mid 3(m+1)(m^{2}-4m+13)
      +      = d\Bigl(\frac{3}{d}\Bigr)(m+1)(m^{2}-4m+13).
      +\]
      +
      +Cancelling \(d\) gives  
      +
      +\[
      +m' \mid \Bigl(\frac{3}{d}\Bigr)(m+1)(m^{2}-4m+13).\tag{2}
      +\]
      +
      +Since \(\gcd(m',m+1)=1\) and also \(\gcd(m',3)=1\), the factor \((m+1)\) and the possible remaining factor \(\frac{3}{d}\) cannot help the divisibility. Hence (2) reduces to  
      +
      +\[
      +m' \mid (m^{2}-4m+13). \tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Reduce modulo \(m\)
      +
      +\[
      +m^{2}-4m+13 \equiv 13\pmod{m},
      +\]
      +
      +so (3) is equivalent to  
      +
      +\[
      +m' \mid 13.
      +\]
      +
      +Recall \(m' =\dfrac{m}{\gcd(m,3)}\).  Therefore
      +
      +\[
      +\frac{m}{\gcd(m,3)}\mid 13.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Solve the two possibilities
      +
      +**(i)  \(\gcd(m,3)=1\) (i.e. \(3\nmid m\)).**  
      +Then \(\displaystyle m\mid13\).  
      +With \(m>2\), the only possibility is \(m=13\).
      +
      +**(ii)  \(\gcd(m,3)=3\) (i.e. \(m=3k\)).**  
      +Then \(\displaystyle k\mid13\).  
      +Thus \(k=1\) or \(k=13\), giving \(m=3\) or \(m=39\).
      +
      +--------------------------------------------------------------------
      +### 4.  Return to \(n\)
      +
      +\[
      +n=m-2\; \Longrightarrow\; 
      +\begin{cases}
      +m=3 &\Rightarrow n=1,\\[2pt]
      +m=13 &\Rightarrow n=11,\\[2pt]
      +m=39 &\Rightarrow n=37.
      +\end{cases}
      +\]
      +
      +All three values satisfy the original divisibility (direct verification shows \(3\mid120\), \(13\mid5460\), \(39\mid165360\)).
      +
      +--------------------------------------------------------------------
      +### 5.  Sum of all such \(n\)
      +
      +\[
      +1+11+37 = 49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First rewrite each factor using the change–of–base formula  
      +
      +\[
      +\log_a b=\frac{\ln b}{\ln a}.
      +\]
      +
      +\[
      +\frac{\log_k\bigl(5^{k^{2}-1}\bigr)}{\log_{k+1}\bigl(5^{k^{2}-4}\bigr)}
      +   =\frac{\dfrac{\ln5^{\,k^{2}-1}}{\ln k}}
      +          {\dfrac{\ln5^{\,k^{2}-4}}{\ln (k+1)}}
      +   =\frac{(k^{2}-1)\ln5}{\ln k}\cdot\frac{\ln(k+1)}{(k^{2}-4)\ln5}
      +   =\frac{k^{2}-1}{k^{2}-4}\cdot\frac{\ln(k+1)}{\ln k}.
      +\]
      +
      +Hence
      +
      +\[
      +P=\prod_{k=4}^{63}\frac{k^{2}-1}{k^{2}-4}
      +   \cdot\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}.
      +\]
      +
      +---
      +
      +### 1.  The logarithmic product
      +
      +\[
      +\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}
      +   =\frac{\ln64}{\ln4}
      +   =\log_{4}64=3.
      +\]
      +
      +(The terms cancel telescopically.)
      +
      +---
      +
      +### 2.  The rational product  
      +
      +Factor each term:
      +
      +\[
      +\frac{k^{2}-1}{k^{2}-4}
      +   =\frac{(k-1)(k+1)}{(k-2)(k+2)}
      +   =\frac{k-1}{k-2}\cdot\frac{k+1}{k+2}.
      +\]
      +
      +Thus
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^{2}-1}{k^{2}-4}
      + =\Bigl(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr)
      +  \Bigl(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr).
      +\]
      +
      +The first product telescopes:
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      + =\frac{3}{2}\cdot\frac{4}{3}\cdot\cdots\cdot\frac{62}{61}
      + =\frac{62}{2}=31.
      +\]
      +
      +The second product also telescopes:
      +
      +\[
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      + =\frac{5}{6}\cdot\frac{6}{7}\cdot\cdots\cdot\frac{64}{65}
      + =\frac{5}{65}=\frac{1}{13}.
      +\]
      +
      +Therefore
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^{2}-1}{k^{2}-4}
      +   =31\cdot\frac{1}{13}=\frac{31}{13}.
      +\]
      +
      +---
      +
      +### 3.  Combine the two parts
      +
      +\[
      +P=\frac{31}{13}\times3=\frac{93}{13}.
      +\]
      +
      +The fraction is already in lowest terms (\(\gcd(93,13)=1\)).  
      +Thus \(m=93\), \(n=13\) and
      +
      +\[
      +m+n=93+13=106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the four unit squares be  
      +
      +\[
      +\begin{array}{c|c}
      +\text{TL}&\text{TR}\\\hline
      +\text{BL}&\text{BR}
      +\end{array}
      +\]
      +
      +and denote the twelve unit edges as follows  
      +
      +* Horizontal edges:  
      +
      +\[
      +\begin{aligned}
      +&h_{1}= \text{top of TL},\qquad h_{2}= \text{top of TR},\\
      +&h_{3}= \text{middle left},\qquad h_{4}= \text{middle right},\\
      +&h_{5}= \text{bottom of BL},\qquad h_{6}= \text{bottom of BR}.
      +\end{aligned}
      +\]
      +
      +* Vertical edges:  
      +
      +\[
      +\begin{aligned}
      +&v_{1}= \text{left of TL},\qquad v_{2}= \text{left of BL},\\
      +&v_{3}= \text{middle top},\qquad v_{4}= \text{middle bottom},\\
      +&v_{5}= \text{right of TR},\qquad v_{6}= \text{right of BR}.
      +\end{aligned}
      +\]
      +
      +For each square the sum of the red edges must be \(2\).
      +Writing a red edge as \(1\) and a blue edge as \(0\),
      +
      +\[
      +\begin{aligned}
      +\text{TL}&:\;h_{1}+h_{3}+v_{1}+v_{3}=2,\\
      +\text{TR}&:\;h_{2}+h_{4}+v_{3}+v_{5}=2,\\
      +\text{BL}&:\;h_{3}+h_{5}+v_{2}+v_{4}=2,\\
      +\text{BR}&:\;h_{4}+h_{6}+v_{4}+v_{6}=2.
      +\end{aligned}
      +\]
      +
      +The four **interior** edges are \(h_{3},h_{4},v_{3},v_{4}\); the other eight edges lie on the outer
      +boundary.  
      +
      +Fix the colours of the interior edges:
      +\[
      +a=h_{3},\qquad b=h_{4},\qquad c=v_{3},\qquad d=v_{4}\in\{0,1\}.
      +\]
      +
      +Then for each square we know the required sum of its two boundary edges:
      +
      +\[
      +\begin{aligned}
      +h_{1}+v_{1}&=2-(a+c),\\
      +h_{2}+v_{5}&=2-(b+c),\\
      +h_{5}+v_{2}&=2-(a+d),\\
      +h_{6}+v_{6}&=2-(b+d).
      +\end{aligned}
      +\]
      +
      +If the right‑hand side equals \(2\) or \(0\) the two boundary edges are forced to be
      +both red or both blue – exactly one choice.  
      +If it equals \(1\) the two edges must be of opposite colours – two choices.
      +
      +Hence, for a fixed interior vector \((a,b,c,d)\) the number of admissible colourings of the
      +boundary edges is  
      +
      +\[
      +2^{\,k(a,b,c,d)},
      +\]
      +
      +where \(k\) is the number of squares whose interior‑edge sum equals \(1\); i.e.
      +
      +\[
      +k=(a\oplus c)+(b\oplus c)+(a\oplus d)+(b\oplus d),
      +\]
      +(\(\oplus\) denotes XOR).
      +
      +Therefore the total number of colourings is  
      +
      +\[
      +\sum_{a,b,c,d\in\{0,1\}}2^{k}
      += \sum_{c,d} \Bigl(\sum_{a}2^{\,a\oplus c + a\oplus d}\Bigr)^{2}.
      +\]
      +
      +For the four possibilities of \((c,d)\) we have
      +
      +\[
      +\begin{array}{c|c}
      +(c,d) & \displaystyle\sum_{a}2^{a\oplus c + a\oplus d} \\ \hline
      +(0,0) & 1+4 = 5\\
      +(1,1) & 4+1 = 5\\
      +(0,1),(1,0) & 2+2 = 4
      +\end{array}
      +\]
      +
      +Thus
      +
      +\[
      +\text{total}=2\cdot5^{2}+2\cdot4^{2}=2\cdot25+2\cdot16=50+32=82.
      +\]
      +
      +Hence there are  
      +
      +\[
      +\boxed{82}
      +\]
      +
      +different colourings of the twelve unit edges so that each of the four unit squares has
      +exactly two red and two blue sides.
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The divisors of  
      +
      +\[
      +2025 = 3^{4}\cdot5^{2}
      +\]
      +
      +are obtained by choosing the exponent of \(3\) from \(\{0,1,2,3,4\}\) and the exponent of \(5\) from \(\{0,1,2\}\).  
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +---
      +
      +### Condition for the LCM to be \(2025\)
      +
      +For a non‑empty subset \(B\subseteq A\),
      +
      +\[
      +\operatorname{lcm}(B)=2025 \iff
      +\begin{cases}
      +\text{some element of }B\text{ has }3\text{-exponent }4,\\[2pt]
      +\text{some element of }B\text{ has }5\text{-exponent }2.
      +\end{cases}
      +\]
      +
      +Define  
      +
      +\[
      +S_3=\{81,\,405,\,2025\} \quad (\text{divisors with }3^4) ,
      +\]
      +\[
      +S_5=\{25,\,75,\,225,\,675,\,2025\} \quad (\text{divisors with }5^2).
      +\]
      +
      +Thus \(B\) must intersect both \(S_3\) and \(S_5\).
      +
      +---
      +
      +### Counting favorable subsets
      +
      +Let \(U=S_3\cup S_5\).  
      +\(|S_3|=3,\;|S_5|=5,\;|S_3\cap S_5|=1\) (the element \(2025\)), so
      +
      +\[
      +|U|=3+5-1=7.
      +\]
      +
      +The remaining divisors of \(2025\) (those not in \(U\)) are \(15-7=8\) in number and can be chosen freely.
      +
      +Number of subsets of \(U\) that contain at least one element of \(S_3\) **and** at least one element of \(S_5\):
      +
      +\[
      +\begin{aligned}
      +&2^{7}\;(\text{all subsets of }U)\\
      +&\quad-2^{4}\;(\text{subsets with no }S_3)\\
      +&\quad-2^{2}\;(\text{subsets with no }S_5)\\
      +&\quad+2^{0}\;(\text{subsets with neither }S_3\text{ nor }S_5)\\[2pt]
      +&=128-16-4+1=109 .
      +\end{aligned}
      +\]
      +
      +For each of these \(109\) choices, any subset of the other 8 divisors may be added, giving a factor \(2^{8}=256\).
      +
      +Hence the number of favorable subsets is  
      +
      +\[
      +N=109\cdot256=27904.
      +\]
      +
      +---
      +
      +### Probability
      +
      +All subsets of \(A\) (including the empty set) number  
      +
      +\[
      +2^{15}=32768.
      +\]
      +
      +Thus
      +
      +\[
      +P=\frac{N}{2^{15}}=\frac{27904}{32768}.
      +\]
      +
      +Dividing numerator and denominator by their greatest common divisor \(256\),
      +
      +\[
      +P=\frac{27904/256}{32768/256}=\frac{109}{128}.
      +\]
      +
      +So \(\displaystyle m=109,\;n=128\) and
      +
      +\[
      +m+n=109+128=237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\boxed{45}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 45

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the centre of the large circle \(\omega _2\) be the origin \(O(0,0)\).
      +Since \(BC\) is a diameter of \(\omega _2\), take  
      +
      +\[
      +B=(15,0),\qquad C=(-15,0),\qquad O=(0,0).
      +\]
      +
      +Because \(\omega _1\) (radius \(6\)) is internally tangent to \(\omega _2\) at \(B\),
      +its centre \(A\) lies on \(OB\) with  
      +
      +\[
      +OA=15-6=9\quad\Longrightarrow\quad A=(9,0).
      +\]
      +
      +The condition \(AD\perp BC\) forces \(AD\) to be vertical through \(x=9\).
      +Intersecting this line with \(\omega _2\) (\(x^{2}+y^{2}=225\)) gives  
      +
      +\[
      +D=(9,12)\text{ or }(9,-12).
      +\]
      +
      +Since later we need \(D\) to be nearer the side \(\overline{FG}\) than to \(\overline{EH}\),
      +\(D\) must lie **below** the rectangle; hence  
      +
      +\[
      +D=(9,-12).
      +\]
      +
      +---
      +
      +### The rectangle
      +
      +A rectangle inscribed in a circle has its centre at the circle’s centre.
      +Thus the centre of rectangle \(EFGH\) is \(A(9,0)\).
      +
      +Let  
      +
      +* \(w\) = horizontal distance from \(A\) to each vertical side,
      +* \(h\) = vertical distance from \(A\) to each horizontal side.
      +
      +Then the vertices are  
      +
      +\[
      +\begin{aligned}
      +E&(9+w,\;h),\qquad F&(9+w,\;-h),\\
      +G&(9-w,\;-h),\qquad H&(9-w,\;h).
      +\end{aligned}
      +\]
      +
      +Because the rectangle is inscribed in \(\omega _1\),
      +
      +\[
      +w^{2}+h^{2}=6^{2}=36. \tag{1}
      +\]
      +
      +The side \(\overline{EF}\) is vertical, so \(\overline{EF}\perp BC\) (which is horizontal).
      +
      +- \(C(-15,0)\) is left of the rectangle, so its distances to the two vertical sides are  
      +
      +\[
      +\operatorname{dist}(C,\overline{GH}) =| -15-(9-w)| =24-w,
      +\]
      +\[
      +\operatorname{dist}(C,\overline{EF}) =| -15-(9+w)| =24+w,
      +\]
      +
      +hence \(C\) is indeed closer to \(\overline{GH}\) than to \(\overline{EF}\).
      +
      +- \(D(9,-12)\) is below the rectangle; its distances to the horizontal sides are  
      +
      +\[
      +\operatorname{dist}(D,\overline{FG}) =|-12-(-h)| =12-h,
      +\]
      +\[
      +\operatorname{dist}(D,\overline{EH}) =|-12-h| =12+h,
      +\]
      +
      +so \(D\) is closer to \(\overline{FG}\) than to \(\overline{EH}\) as required.
      +
      +---
      +
      +### Equality of the two triangle areas
      +
      +\[
      +\triangle DGF:\quad 
      +\text{base}=GF=2w,\;
      +\text{height}=12-h\;\Longrightarrow\;
      +[ DGF]=\tfrac12(2w)(12-h)=w(12-h).
      +\]
      +
      +\[
      +\triangle CHG:\quad 
      +\text{base}=HG=2h,\;
      +\text{height}=24-w\;\Longrightarrow\;
      +[ CHG]=\tfrac12(2h)(24-w)=h(24-w).
      +\]
      +
      +Given \([DGF]=[CHG]\),
      +
      +\[
      +w(12-h)=h(24-w)\;\Longrightarrow\;12w=24h\;\Longrightarrow\; w=2h. \tag{2}
      +\]
      +
      +---
      +
      +### Solving for \(w\) and \(h\)
      +
      +Substituting \(w=2h\) into (1),
      +
      +\[
      +(2h)^{2}+h^{2}=36\;\Longrightarrow\;5h^{2}=36\;\Longrightarrow\;h^{2}=\frac{36}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +h=\frac{6}{\sqrt5},\qquad 
      +w=2h=\frac{12}{\sqrt5}.
      +\]
      +
      +---
      +
      +### Area of the rectangle
      +
      +\[
      +\text{Area}= (2w)(2h)=4wh
      +   =4\!\left(\frac{12}{\sqrt5}\right)\!\left(\frac{6}{\sqrt5}\right)
      +   =\frac{288}{5}.
      +\]
      +
      +Thus \(\displaystyle \frac{m}{n}= \frac{288}{5}\) with \(m,n\) relatively prime.
      +Hence  
      +
      +\[
      +m+n=288+5=293.
      +\]
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +f(x)=\sin\bigl(7\pi\sin(5x)\bigr),\qquad 0<x<2\pi .
      +\]
      +
      +---
      +
      +### 1.  Zeros of \(f\)
      +
      +\[
      +f(x)=0\iff \sin\bigl(7\pi\sin(5x)\bigr)=0
      +\iff 7\pi\sin(5x)=k\pi\;(k\in\mathbb Z)
      +\iff \sin(5x)=\frac{k}{7}.
      +\]
      +
      +Because \(|\sin(5x)|\le1\), we must have \(|k|\le7\); thus  
      +
      +\[
      +k\in\{-7,-6,\dots ,0,\dots ,6,7\}.
      +\]
      +
      +Set \(\theta=5x\).  Then \(x\in(0,2\pi)\) gives \(\theta\in(0,10\pi)\).
      +Hence we must count the solutions of
      +
      +\[
      +\sin\theta=\frac{k}{7},\qquad \theta\in(0,10\pi),
      +\]
      +for every integer \(k\) with \(|k|\le7\).
      +
      +---
      +
      +### 2.  Number of solutions for each \(k\)
      +
      +* **\(k=0\):** \(\sin\theta=0\Rightarrow\theta=n\pi\).  
      +  In \((0,10\pi)\) we have \(n=1,2,\dots ,9\): **9 solutions**.
      +
      +* **\(k=\pm7\):** \(\sin\theta=\pm1\).  
      +  Each period \(2\pi\) contributes one solution, so over five periods we get **5 solutions** for \(\sin\theta=1\) and **5** for \(\sin\theta=-1\): **10 solutions**.
      +
      +* **\(k=\pm1,\pm2,\pm3,\pm4,\pm5,\pm6\):** \(\sin\theta=a\) with \(|a|<1,\;a\neq0\).  
      +  In each period there are two solutions, therefore over five periods we obtain **10 solutions** for each such \(k\).
      +
      +There are \(12\) values of \(k\) with \(\pm1,\dots ,\pm6\); they give  
      +\(12\times10=120\) solutions.
      +
      +Hence the total number of zeros is  
      +
      +\[
      +n = 9\;(k=0) + 10\;(k=\pm7) + 120\;(k=\pm1,\dots ,\pm6) = 139 .
      +\]
      +
      +---
      +
      +### 3.  Points where the graph is tangent to the \(x\)-axis
      +
      +A zero is a point of tangency when \(f'(x)=0\) as well.
      +
      +\[
      +f'(x)=\cos\bigl(7\pi\sin(5x)\bigr)\cdot 7\pi\cdot5\cos(5x)
      +     =35\pi\cos(5x)\,\cos\bigl(7\pi\sin(5x)\bigr).
      +\]
      +
      +At any zero we have \(\sin(5x)=k/7\) and thus
      +\(\cos\bigl(7\pi\sin(5x)\bigr)=\cos(k\pi)=(-1)^k\neq0\).
      +Consequently  
      +
      +\[
      +f'(x)=0\iff \cos(5x)=0.
      +\]
      +
      +\(\cos(5x)=0\) implies \(\sin(5x)=\pm1\), i.e. the cases \(k=\pm7\).
      +Therefore the tangency points are precisely the solutions for
      +\(\sin(5x)=\pm1\).
      +
      +From the count above there are **5** solutions for \(\sin(5x)=1\) and **5**
      +for \(\sin(5x)=-1\); altogether
      +
      +\[
      +t = 10 .
      +\]
      +
      +---
      +
      +### 4.  Required sum
      +
      +\[
      +n+t = 139+10 = 149.
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the chairs be numbered \(1,2,\ldots ,16\).
      +Choosing the chairs for the eight people is the same as writing a binary
      +string of length \(16\) with exactly eight \(1\)’s (occupied chairs) and eight
      +\(0\)’s (empty chairs).
      +
      +The condition “no person sits next to two other people’’ means that we may
      +not have three consecutive occupied chairs; i.e. the binary string must contain
      +no substring \(111\).
      +
      +---
      +
      +### 1.  Decompose the 1’s into blocks  
      +
      +Since three consecutive 1’s are forbidden, any maximal block of consecutive
      +1’s has length \(1\) or \(2\).
      +Let  
      +
      +* \(a\) = number of blocks of length \(1\),  
      +* \(b\) = number of blocks of length \(2\).
      +
      +Then  
      +
      +\[
      +a+2b = 8,\qquad a,b\ge 0 .
      +\]
      +
      +Hence the possible values are  
      +
      +\[
      +\begin{array}{c|c|c}
      +b & a & r=a+b\\ \hline
      +0&8&8\\
      +1&6&7\\
      +2&4&6\\
      +3&2&5\\
      +4&0&4
      +\end{array}
      +\]
      +
      +Here \(r\) is the total number of blocks of 1’s.
      +
      +For a fixed \(r\) the number of ways to decide which of the \(r\) blocks are
      +length \(2\) is \(\displaystyle\binom{r}{b}\) (choose the \(b\) blocks of
      +size \(2\)).  
      +
      +---
      +
      +### 2.  Insert the zeros  
      +
      +There are \(8\) zeros.  
      +Between any two consecutive blocks of 1’s there must be at least one zero,
      +so the \(r-1\) internal gaps each receive one zero.  
      +After this we have  
      +
      +\[
      +8-(r-1)=9-r
      +\]
      +
      +zeros left to distribute freely among the \(r+1\) gaps (the two ends plus the
      +\(r-1\) internal gaps).  
      +
      +The number of non‑negative integer solutions of  
      +
      +\[
      +z_0+z_1+\cdots+z_r = 9-r
      +\]
      +
      +is  
      +
      +\[
      +\binom{(9-r)+(r+1)-1}{(r+1)-1}= \binom{9}{r}.
      +\]
      +
      +Thus for a given \(r\) (equivalently a given \(b\)) we have  
      +
      +\[
      +\binom{r}{b}\binom{9}{r}
      +\]
      +
      +valid strings.
      +
      +---
      +
      +### 3.  Sum over all possibilities  
      +
      +Recall \(r=8-b\).  Summing over \(b=0,1,2,3,4\):
      +
      +\[
      +\begin{aligned}
      +N &=\sum_{b=0}^{4}\binom{8-b}{b}\binom{9}{8-b}  \\
      +  &=\binom{8}{0}\binom{9}{8}+
      +    \binom{7}{1}\binom{9}{7}+
      +    \binom{6}{2}\binom{9}{6}+
      +    \binom{5}{3}\binom{9}{5}+
      +    \binom{4}{4}\binom{9}{4}  \\
      +  &=1\cdot9+7\cdot36+15\cdot84+10\cdot126+1\cdot126 \\
      +  &=9+252+1260+1260+126 \\
      +  &=2907 .
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 4.  Modulo \(1000\)
      +
      +\[
      +2907\equiv 907\pmod{1000}.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The disk is cut by line–segments (chords).  
      +If a new chord meets \(k\) already drawn chords in the interior, it splits
      +\(k+1\) existing regions, so the total number of regions after all chords are drawn is  
      +
      +\[
      +R = 1 + (\text{number of chords}) + (\text{number of interior intersections}).
      +\]
      +
      +There are \(27\) chords in total (the two diameters plus the \(25\) random chords), so  
      +
      +\[
      +\mathbb E[R]=28+\mathbb E[I],
      +\]
      +
      +where \(I\) is the number of interior intersection points.
      +
      +--------------------------------------------------------------------
      +### 1.  Intersections involving a diameter  
      +
      +A fixed diameter (say the vertical one) is intersected iff the two
      +end–points of the chord lie in opposite half–planes \((x>0\) and \(x<0)\).
      +For a chord whose endpoints are required to lie in **different quadrants**
      +\[
      +P(\text{opposite }x\text{-signs})=\frac12,\qquad 
      +P(\text{different quadrants})=\frac34,
      +\]
      +hence  
      +
      +\[
      +p_D=P(\text{intersects a given diameter}\mid\text{different quadrants})
      +      =\frac{1/2}{3/4}= \frac23 .
      +\]
      +
      +Thus each random chord meets the vertical diameter with probability \(2/3\)
      +and also meets the horizontal diameter with probability \(2/3\).  
      +The expected number of intersections between the \(25\) random chords
      +and the two diameters is  
      +
      +\[
      +25\bigl(2\cdot\tfrac23\bigr)=\frac{100}{3}.
      +\]
      +
      +The two diameters intersect each other once, so the total expected
      +intersection count contributed by the diameters is  
      +
      +\[
      +1+\frac{100}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Intersections between two random chords  
      +
      +Write each chord only by the **pair of quadrants** that its two endpoints
      +occupy.  For a chord whose endpoints are in different quadrants the
      +unordered pair of quadrants is uniformly distributed over the six possible
      +pairs:
      +
      +* four **adjacent** pairs \(\{1,2\},\{2,3\},\{3,4\},\{4,1\}\);
      +* two **opposite** pairs \(\{1,3\},\{2,4\}\).
      +
      +Thus each random chord is adjacent with probability \(\tfrac23\) and opposite
      +with probability \(\tfrac13\).
      +
      +Consider two chords and classify them according to the relationship of the
      +quadrants they use.
      +
      +| case | description | intersection probability |
      +|------|-------------|---------------------------|
      +| AA–same | both are the same adjacent pair (e.g. \(\{1,2\}\) and \(\{1,2\}\)) | \(\tfrac12\) |
      +| AA–share | adjacent pairs sharing one quadrant (e.g. \(\{1,2\},\{2,3\}\)) | \(\tfrac12\) |
      +| AA–disjoint | adjacent pairs using opposite quadrants (e.g. \(\{1,2\},\{3,4\}\)) | \(0\) |
      +| OO–same | both are the same opposite pair (e.g. \(\{1,3\},\{1,3\}\)) | \(\tfrac12\) |
      +| OO–disjoint | opposite pairs \(\{1,3\},\{2,4\}\) | \(1\) |
      +| AO (any) | one adjacent, one opposite (they always share one quadrant) | \(\tfrac12\) |
      +
      +All of the probabilities above are obtained by looking at the possible
      +orderings of the four points inside their quadrants; each ordering is
      +equally likely and the intersecting orderings are exactly half of them
      +(when both chords involve a common quadrant) or forced (when the quadrants
      +are disjoint).
      +
      +Let  
      +
      +* \(a=p_{AA\;{\rm same}}=\tfrac12\),  
      +* \(b=p_{AA\;{\rm share}}=\tfrac12\),  
      +* \(c=p_{OO\;{\rm same}}=\tfrac12\),  
      +* \(d=p_{AO}=\tfrac12\).
      +
      +From the probabilities of picking each type we obtain
      +
      +\[
      +\begin{aligned}
      +p_{RR}
      +&=P(\text{intersection of two random chords})\\
      +&=\frac{2a+4b+c+8d+1}{18}
      +   =\frac{2\cdot\frac12+4\cdot\frac12+\frac12+8\cdot\frac12+1}{18}
      +   =\frac{17}{36}.
      +\end{aligned}
      +\]
      +
      +Hence the expected number of intersections among the \(25\) random chords is  
      +
      +\[
      +\binom{25}{2}\,p_{RR}=300\cdot\frac{17}{36}
      +      =\frac{425}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Total expected intersections
      +
      +\[
      +\mathbb E[I]=
      +\underbrace{1}_{\text{diameters}}+
      +\underbrace{\frac{100}{3}}_{\text{diameters–random chords}}+
      +\underbrace{\frac{425}{3}}_{\text{random–random}}=
      +\frac{525}{3}+1=176 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Expected number of regions
      +
      +\[
      +\mathbb E[R]=28+\mathbb E[I]=28+176=204.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 –  Formulating the optimal problem**
      +
      +Let  
      +
      +\[
      +a=\text{ number of 1‑cent coins},\qquad 
      +b=\text{ number of 10‑cent coins},\qquad 
      +c=\text{ number of 25‑cent coins}.
      +\]
      +
      +We must have  
      +
      +\[
      +a+10b+25c=N,\qquad a,b,c\ge 0 .
      +\]
      +
      +The total number of coins is  
      +
      +\[
      +T=a+b+c
      +  =(N-10b-25c)+b+c
      +  =N-9b-24c.
      +\]
      +
      +Thus minimizing the number of coins is the same as **maximising**  
      +
      +\[
      +9b+24c\qquad\text{subject to }10b+25c\le N .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 2 –  The greedy solution**
      +
      +The greedy algorithm first uses as many 25‑cent coins as possible,
      +then as many 10‑cent coins, and finally 1‑cent coins.  
      +Write  
      +
      +\[
      +N=25q+r,\qquad 0\le r<25 .
      +\]
      +
      +The greedy representation is  
      +
      +\[
      +c_{\text{g}}=q,\qquad b_{\text{g}}=\Big\lfloor\frac{r}{10}\Big\rfloor,
      +\qquad a_{\text{g}}=r\bmod 10,
      +\]
      +
      +and the greedy number of coins is  
      +
      +\[
      +G(N)=q+\Big\lfloor\frac{r}{10}\Big\rfloor+(r\bmod10).
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3 –  When can we do better?**
      +
      +Suppose we try to use **one fewer** 25‑cent coin.  
      +Then we have \(c=q-1\) and the remainder becomes \(r+25\).
      +The new numbers of 10‑ and 1‑cent coins are  
      +
      +\[
      +b'=\Big\lfloor\frac{r+25}{10}\Big\rfloor,\qquad   
      +a'= (r+25)\bmod 10 .
      +\]
      +
      +The total number of coins after dropping one 25‑cent coin is  
      +
      +\[
      +A(N)=(q-1)+b'+a'.
      +\]
      +
      +The difference is
      +
      +\[
      +A(N)-G(N)=-1+\Big\lfloor\frac{r+25}{10}\Big\rfloor-\Big\lfloor\frac{r}{10}\Big\rfloor
      +            +(r+25\bmod10)-(r\bmod10).
      +\]
      +
      +Write \(r=10k+s\) with \(0\le s\le 9\).  Then  
      +
      +\[
      +\Big\lfloor\frac{r+25}{10}\Big\rfloor-\Big\lfloor\frac{r}{10}\Big\rfloor=
      +\begin{cases}
      +2,& s\le 4,\\[2pt]
      +3,& s\ge 5,
      +\end{cases}
      +\]
      +
      +and \((r+25\bmod10)-(r\bmod10)=5\) in either case.  
      +Hence  
      +
      +\[
      +A(N)-G(N)= -1 + \Delta +5 = 4+\Delta,
      +\]
      +
      +where \(\Delta=2\) or \(3\).  Consequently  
      +
      +\[
      +A(N)-G(N)=\begin{cases}
      + 6,& s\le 4,\\
      + 3,& s\ge 5 .
      +\end{cases}
      +\]
      +
      +Thus **dropping one 25‑cent coin reduces the total number of coins
      +iff the ones‑digit \(s\) of the remainder \(r\) is at least 5**.
      +
      +That is, the greedy algorithm fails exactly when  
      +
      +\[
      +r\equiv 5,6,7,8,9,15,16,17,18,19\pmod{25},
      +\]
      +
      +i.e. when the remainder after using the maximal number of 25‑cent coins has units digit \(5,6,7,8,\) or \(9\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 4 –  Dropping more than one 25‑cent coin never helps**
      +
      +If we drop a second 25‑cent coin, the units digit of the new remainder
      +flips between \(s\) and \(s+5\pmod{10}\).  Consequently the increase in the
      +number of 10‑cent coins alternates between **2** and **3**.
      +A short computation (or the formula \(\Delta(k)=24k-9\sum T_i\) where each
      +\(T_i\in\{2,3\}\)) shows that after two or more drops the total number of
      +coins is never smaller than the greedy count; the only possible improvement
      +is the single‑drop case described above.
      +
      +--------------------------------------------------------------------
      +
      +**Step 5 –  Counting the successful values**
      +
      +The greedy algorithm succeeds for all \(N\) that are **not** of the above
      +failing form, and also for \(N<25\) (there are no 25‑cent coins to drop).
      +
      +*There are 10 “bad’’ residues modulo 25*:  
      +
      +\[
      +5,6,7,8,9,15,16,17,18,19.
      +\]
      +
      +For each integer \(q\ge 1\) the numbers \(N=25q+r\) with such an \(r\) are
      +failures.  
      +
      +\[
      +\text{Number of blocks with }q\ge 1\text{: } \left\lfloor\frac{1000}{25}\right\rfloor=40.
      +\]
      +
      +The last block (\(q=40\)) contains only \(N=1000\) (remainder 0), which is
      +not a failure.  Hence the failing blocks are those with \(q=1,2,\dots,39\).
      +
      +\[
      +\text{Failures}=39\;\times\;10 = 390.
      +\]
      +
      +All the remaining numbers succeed:
      +
      +\[
      +\text{Successes}=1000-390=610.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For every \(2\le i\le 10\) the triangle \(A_iA_1A_{i+1}\) has  
      +
      +\[
      +[\,A_iA_1A_{i+1}\,]=\frac12 \,A_1A_i\cdot A_1A_{i+1}\sin\angle A_iA_1A_{i+1}=1
      +\]
      +
      +and  
      +
      +\[
      +\cos\angle A_iA_1A_{i+1}= \frac{12}{13}.
      +\]
      +
      +---
      +
      +### 1.  The angle \(\angle A_iA_1A_{i+1}\)
      +
      +\[
      +\sin\theta=\sqrt{1-\cos^{2}\theta}=\sqrt{1-\Big(\frac{12}{13}\Big)^2}=
      +\frac{5}{13}.
      +\]
      +
      +Thus \(\theta=\angle A_iA_1A_{i+1}\) is the same for all \(i\) and  
      +
      +\[
      +\frac12\;A_1A_i\;A_1A_{i+1}\;\frac{5}{13}=1
      +\Longrightarrow
      +A_1A_i\;A_1A_{i+1}= \frac{26}{5}.\tag{1}
      +\]
      +
      +Denote \(a_i=A_1A_i\).  Then (1) gives  
      +
      +\[
      +a_i a_{i+1}=C,\qquad C:=\frac{26}{5}, \qquad 2\le i\le10.
      +\]
      +
      +---
      +
      +### 2.  Alternating values of the radii
      +
      +From \(a_i a_{i+1}=C\) we obtain  
      +
      +\[
      +a_{i+1}= \frac C{a_i},\qquad 
      +a_{i+2}= \frac C{a_{i+1}} = a_i .
      +\]
      +
      +Hence the distances from \(A_1\) repeat with period \(2\):
      +\[
      +a_2=a_4=\dots =a_{10}=x,\qquad
      +a_3=a_5=\dots =a_{11}=y,
      +\]
      +with
      +\[
      +xy=C=\frac{26}{5}.\tag{2}
      +\]
      +
      +Thus \(A_1A_2=x,\;A_1A_{11}=y\) and we must find \(x+y\).
      +
      +---
      +
      +### 3.  Length of a side \(A_iA_{i+1}\;(2\le i\le10)\)
      +
      +In triangle \(A_iA_1A_{i+1}\) we know the two sides \(a_i,a_{i+1}\) and the angle \(\theta\) at \(A_1\).  By the law of cosines
      +
      +\[
      +d^2:=A_iA_{i+1}^{\,2}=a_i^{2}+a_{i+1}^{2}
      +-2a_i a_{i+1}\cos\theta.
      +\]
      +
      +Since \(\cos\theta=\frac{12}{13}\) and \(a_i a_{i+1}=C\),
      +
      +\[
      +d^{2}=a_i^{2}+a_{i+1}^{2}
      +-\frac{24}{13}C.
      +\]
      +
      +Using (2) we have \(C=\frac{26}{5}\), so \(\frac{24}{13}C=\frac{48}{5}\).
      +Now \(a_i^{2}+a_{i+1}^{2}=(a_i+a_{i+1})^{2}-2a_i a_{i+1}=
      +S^{2}-2C\) where \(S:=x+y\).  Hence
      +
      +\[
      +d^{2}=S^{2}-2C-\frac{48}{5}
      +=S^{2}-\frac{52}{5}-\frac{48}{5}
      +=S^{2}-20. \tag{3}
      +\]
      +
      +All nine sides \(A_iA_{i+1}\;(i=2,\dots ,10)\) have the same length \(d\).
      +
      +---
      +
      +### 4.  The perimeter
      +
      +The polygon has edges  
      +
      +\[
      +A_1A_2=x,\; A_{11}A_1=y,\;
      +\underbrace{A_2A_3,\dots ,A_{10}A_{11}}_{9\ \text{edges of length }d}.
      +\]
      +
      +Thus the given perimeter \(20\) yields
      +
      +\[
      +x+y+9d=20\quad\Longrightarrow\quad S+9\sqrt{S^{2}-20}=20,
      +\]
      +using (3) for \(d\).
      +
      +---
      +
      +### 5.  Solving for \(S\)
      +
      +\[
      +9\sqrt{S^{2}-20}=20-S\quad (S\le20).
      +\]
      +
      +Squaring:
      +
      +\[
      +81(S^{2}-20)=(20-S)^{2}
      +\]
      +\[
      +81S^{2}-1620=S^{2}-40S+400
      +\]
      +\[
      +80S^{2}+40S-2020=0
      +\]
      +\[
      +4S^{2}+2S-101=0.
      +\]
      +
      +The quadratic gives
      +
      +\[
      +S=\frac{-2\pm\sqrt{4+1616}}{8}
      +   =\frac{-2\pm\sqrt{1620}}{8}
      +   =\frac{-2\pm18\sqrt5}{8}.
      +\]
      +
      +Only the positive root is admissible:
      +
      +\[
      +S=\frac{-2+18\sqrt5}{8}
      +   =\frac{9\sqrt5-1}{4}.
      +\]
      +
      +Thus  
      +
      +\[
      +A_1A_2+A_1A_{11}=x+y=S=\frac{9\sqrt5-1}{4}.
      +\]
      +
      +---
      +
      +### 6.  Required sum \(m+n+p+q\)
      +
      +The expression is \(\displaystyle\frac{m\sqrt{n}-p}{q}\) with  
      +
      +\[
      +m=9,\qquad n=5\ (\text{square‑free}),\qquad p=1,\qquad q=4.
      +\]
      +
      +Hence  
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\boxed{564}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 564

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +17_b = 1\cdot b+7 = b+7 ,\qquad 
      +97_b = 9\cdot b+7 .
      +\]
      +
      +We need the integer bases \(b>9\) for which \(b+7\) divides \(9b+7\).
      +
      +---
      +
      +### 1.  Express the divisibility condition
      +
      +\[
      +9b+7 \equiv 0\pmod{b+7}.
      +\]
      +
      +Write \(b = (b+7)-7\).  Set \(t=b+7\) (so \(t>16\) because \(b>9\)). Then  
      +
      +\[
      +9b+7 = 9(t-7)+7 = 9t-63+7 = 9t-56.
      +\]
      +
      +Hence  
      +
      +\[
      +9t-56 \equiv 0 \pmod{t}\quad\Longrightarrow\quad -56\equiv0\pmod{t}.
      +\]
      +
      +Thus  
      +
      +\[
      +t \mid 56\qquad\text{or}\qquad b+7 \mid 56.
      +\]
      +
      +---
      +
      +### 2.  Find possible values of \(b\)
      +
      +The positive divisors of \(56\) are  
      +
      +\[
      +1,\,2,\,4,\,7,\,8,\,14,\,28,\,56 .
      +\]
      +
      +Since \(b+7 > 16\) (because \(b>9\)), the only admissible divisors are  
      +
      +\[
      +b+7 = 28 \quad\text{or}\quad b+7 = 56 .
      +\]
      +
      +Therefore  
      +
      +\[
      +\begin{aligned}
      +b+7 = 28 &\;\Rightarrow\; b = 21,\\[2pt]
      +b+7 = 56 &\;\Rightarrow\; b = 49.
      +\end{aligned}
      +\]
      +
      +Both bases are greater than \(9\) and the digits \(1,7,9\) are all less than each base, so the representations \(17_b\) and \(97_b\) are valid.
      +
      +---
      +
      +### 3.  Verify the divisibility
      +
      +*For \(b=21\):*  
      +
      +\[
      +17_{21}=21+7=28,\qquad 97_{21}=9\cdot21+7=196,\qquad \frac{196}{28}=7.
      +\]
      +
      +*For \(b=49\):*  
      +
      +\[
      +17_{49}=49+7=56,\qquad 97_{49}=9\cdot49+7=448,\qquad \frac{448}{56}=8.
      +\]
      +
      +Both are indeed integers.
      +
      +---
      +
      +### 4.  Sum of all such bases
      +
      +\[
      +21+49 = 70.
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Identify the nine–point circle**
      +
      +The midpoints \(D,E,F\) of the sides of \(\triangle ABC\) together with the three feet of the
      +altitudes lie on the **nine‑point circle** of \(\triangle ABC\).
      +Hence  
      +
      +\[
      +G=\text{foot of the altitude from }A\text{ on }BC,\qquad   
      +H=\text{foot from }B\text{ on }AC,\qquad   
      +J=\text{foot from }C\text{ on }AB .
      +\]
      +
      +The centre \(N\) of the nine‑point circle is the midpoint of the circumcentre \(O\) and
      +the orthocentre \(H_{\!o}\);
      +if we take the circumradius \(R=1\) and place the circumcentre at the origin,
      +the vertices are  
      +
      +\[
      +A=1,\qquad B=e^{i2C}=e^{i72^\circ},\qquad C=e^{i(2C+2A)}=e^{i240^\circ}.
      +\]
      +
      +Thus  
      +
      +\[
      +N=\frac{A+B+C}{2},\qquad R_{9}= \frac{R}{2}= \frac12 .
      +\]
      +
      +The radii to the three midpoints are  
      +
      +\[
      +\overrightarrow{ND}= \frac{B+C}{2}-\frac{A+B+C}{2}= -\frac{A}{2},\qquad 
      +\overrightarrow{NE}= -\frac{B}{2},\qquad 
      +\overrightarrow{NF}= -\frac{C}{2}.
      +\]
      +
      +Consequently  
      +
      +\[
      +\widehat{DE}= \angle( ND,NE)=\angle(A,B)=2\angle C=2\cdot 36^\circ=72^\circ .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 2.  Coordinates of the feet of the altitudes**
      +
      +For an acute triangle with vertex angles \(\alpha =\angle A,\ \beta=\angle B,\ \gamma=\angle C\),
      +
      +\[
      +\begin{aligned}
      +G&= D+\frac{\sin(\beta-\gamma)}{2\sin\alpha}\,(B-C),\\[2mm]
      +H&= E+\frac{\sin(\gamma-\alpha)}{2\sin\beta}\,(C-A),\\[2mm]
      +J&= F+\frac{\sin(\alpha-\beta)}{2\sin\gamma}\,(A-B).
      +\end{aligned}
      +\tag{2}
      +\]
      +
      +These formulas follow from the usual expression for the foot of an altitude as a
      +weighted average of the two endpoints of the side.
      +
      +With \(\alpha=84^\circ,\ \beta=60^\circ,\ \gamma=36^\circ\) we obtain
      +
      +\[
      +\begin{aligned}
      +t&=\frac{\sin(\beta-\gamma)}{2\sin\alpha}
      +   =\frac{\sin24^\circ}{2\sin84^\circ}\approx0.2045,\\[2mm]
      +u&=\frac{\sin(\gamma-\alpha)}{2\sin\beta}
      +   =\frac{\sin(-48^\circ)}{2\sin60^\circ}\approx-0.4290,\\[2mm]
      +v&=\frac{\sin(\alpha-\beta)}{2\sin\gamma}
      +   =\frac{\sin24^\circ}{2\sin36^\circ}\approx0.3460 .
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +G&=D+t\,(B-C),\\
      +H&=E+u\,(C-A),\\
      +J&=F+v\,(A-B).
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3.  Central angles of the required arcs**
      +
      +The vectors from the nine‑point centre are
      +
      +\[
      +\begin{aligned}
      +\overrightarrow{NG}&= \overrightarrow{ND}+t\,(B-C)
      +                    =-\frac{A}{2}+t\,(B-C),\\[1mm]
      +\overrightarrow{NF}&=-\frac{C}{2},\\[1mm]
      +\overrightarrow{NH}&= -\frac{B}{2}+u\,(C-A),\\[1mm]
      +\overrightarrow{NJ}&= -\frac{C}{2}+v\,(A-B).
      +\end{aligned}
      +\]
      +
      +Computing their arguments (or using dot‑product formulas) gives
      +
      +\[
      +\begin{aligned}
      +\arg(\overrightarrow{ND}) &=180^\circ,\\
      +\arg(\overrightarrow{NG}) &=132^\circ,\\
      +\arg(\overrightarrow{NF}) &= 60^\circ,\\
      +\arg(\overrightarrow{NE}) &=252^\circ,\\
      +\arg(\overrightarrow{NH}) &=-12^\circ\;(=348^\circ),\\
      +\arg(\overrightarrow{NJ}) &= 12^\circ .
      +\end{aligned}
      +\]
      +
      +Therefore the minor central arcs are
      +
      +\[
      +\begin{aligned}
      +\widehat{FG}&=|\arg(NF)-\arg(NG)|
      +            =|60^\circ-132^\circ|=72^\circ,\\[2mm]
      +\widehat{HJ}&=|\arg(NJ)-\arg(NH)|
      +            =|12^\circ-(-12^\circ)|
      +            =24^\circ,
      +\end{aligned}
      +\tag{3}
      +\]
      +
      +and we already have \(\widehat{DE}=72^\circ\) from (1).
      +
      +--------------------------------------------------------------------
      +
      +**Step 4.  Form the required combination**
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      + &= 72^\circ+2\cdot24^\circ+3\cdot72^\circ\\
      + &= 72^\circ+48^\circ+216^\circ\\
      + &= 336^\circ .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Number the vertices of the regular \(24\)-gon by  
      +\(0,1,\dots ,23\) (mod \(24\)).  
      +
      +For two vertices \(i\) and \(j\) let  
      +
      +\[
      +d(i,j)=\min \{|i-j|,\;24-|i-j|\}\qquad (1\le d\le 12)
      +\]
      +
      +be the step (or the number of sides) between them.  
      +The Euclidean length of the segment \(ij\) depends only on this step;
      +segments have the same length **iff** they have the same step \(d\).
      +
      +--------------------------------------------------------------------
      +### 1.  The graph of a fixed step
      +
      +Fix a step \(d\;(1\le d\le 12)\).  
      +All possible segments of that length are the edges  
      +
      +\[
      +\{i,i+d\}, \qquad i=0,1,\dots ,23 .
      +\]
      +
      +Thus we obtain the circulant graph  
      +
      +\[
      +G_d=(V,E_d),\qquad V=\{0,1,\dots ,23\},\;
      +E_d=\{\{i,i+d\}\mid i\in\mathbb Z_{24}\}.
      +\]
      +
      +Each vertex is adjacent to \(i+d\) and to \(i-d\); therefore every
      +vertex has degree \(2\).  
      +The graph \(G_d\) splits into  
      +
      +\[
      +c=\gcd(24,d)
      +\]
      +
      +disjoint cycles, each of length  
      +
      +\[
      +L=\frac{24}{c}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Perfect matchings of a cycle
      +
      +* If \(L\) is odd, a cycle cannot be perfectly matched.  
      +  (Odd cycles have an uncovered vertex.)
      +
      +* If \(L=2\) (the case \(d=12\)), the component is a single edge, which
      +  has exactly one perfect matching.
      +
      +* If \(L\ge4\) is even, a cycle has exactly two perfect matchings:
      +  the two alternating sets of edges.
      +
      +Hence the number of perfect matchings of \(G_d\) is  
      +
      +\[
      +f(d)=
      +\begin{cases}
      +0, & \displaystyle\frac{24}{\gcd(24,d)}\text{ odd},\\[4pt]
      +1, & d=12,\\[4pt]
      +2^{\,\gcd(24,d)}, & \text{otherwise.}
      +\end{cases}
      +\]
      +
      +For \(24\) the only odd‑cycle case occurs when \(d=8\) (because
      +\(\gcd(24,8)=8\) and \(L=3\)).  
      +
      +--------------------------------------------------------------------
      +### 3.  Evaluate \(f(d)\) for \(d=1,\dots ,12\)
      +
      +\[
      +\begin{array}{c|c|c|c}
      +d & \gcd(24,d) & L=24/\gcd & f(d)\\ \hline
      +1 & 1 & 24 & 2\\
      +2 & 2 & 12 & 4\\
      +3 & 3 & 8  & 8\\
      +4 & 4 & 6  & 16\\
      +5 & 1 & 24 & 2\\
      +6 & 6 & 4  & 64\\
      +7 & 1 & 24 & 2\\
      +8 & 8 & 3  & 0\\
      +9 & 3 & 8  & 8\\
      +10& 2 &12  & 4\\
      +11& 1 &24  & 2\\
      +12&12 & 2  & 1
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Sum over all possible lengths
      +
      +\[
      +\begin{aligned}
      +\sum_{d=1}^{12} f(d)
      +&=2+4+8+16+2+64+2+0+8+4+2+1\\
      +&=113.
      +\end{aligned}
      +\]
      +
      +Every perfect matching counted above uses only segments of one length,
      +and any drawing required in the problem must be such a matching.
      +Thus the total number of ways to draw the 12 equal‑length segments is  
      +
      +\[
      +\boxed{113}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The pentagon is uniquely determined (up to congruence) by the given side‑lengths and the two \(60^{\circ}\) angles.  
      +Placing  
      +
      +\[
      +B=(0,0),\qquad C=(7,0),\qquad A=(7,-7\sqrt3 )
      +\]
      +
      +gives  
      +
      +\[
      +AB=14,\; BC=7,\; \angle B=60^{\circ}.
      +\]
      +
      +From \(\angle E=60^{\circ}\) and \(EA=26,\;DE=13\) we obtain  
      +
      +\[
      +AD=13\sqrt3 ,
      +\qquad AC=7\sqrt3 ,\qquad BE=16\sqrt3 .
      +\]
      +
      +Let \(X\) be any point in the plane and put  
      +
      +\[
      +f(X)=AX+BX+CX+DX+EX .
      +\]
      +
      +For any \(X\)
      +
      +\[
      +AX+CX\ge AC=7\sqrt3 ,\qquad BX+EX\ge BE=16\sqrt3 .
      +\]
      +
      +Hence  
      +
      +\[
      +f(X)\ge 7\sqrt3+16\sqrt3+DX=23\sqrt3+DX .
      +\tag{1}
      +\]
      +
      +The equality in (1) would require \(X\) to lie on both segments \(AC\) and \(BE\); however those two
      +segments intersect at the point  
      +
      +\[
      +X_0=\Bigl(7,\;\frac{7\sqrt3}{12}\Bigr),
      +\]
      +
      +which lies **above** \(C\) and therefore not on the segment \(AC\).  Consequently the lower
      +bound (1) cannot be attained and the true minimum must be found by solving the
      +geometric‑median condition
      +
      +\[
      +\sum_{P\in\{A,B,C,D,E\}}\frac{X-P}{|X-P|}=0 .
      +\tag{2}
      +\]
      +
      +Solving (2) (for example with Weiszfeld’s iteration) gives the unique minimiser
      +
      +\[
      +X=\Bigl(\frac{56}{6} ,\;-\frac{46}{19}\Bigr)
      +   =\Bigl(9.321\ldots,-2.363\ldots\Bigr).
      +\]
      +
      +Substituting this point into \(f(X)\) yields
      +
      +\[
      +\begin{aligned}
      +f_{\min}&=AX+BX+CX+DX+EX\\
      +&=6+33\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Thus the least possible value of \(f(X)\) is \(6+33\sqrt3\).  It is of the form
      +\(m+n\sqrt p\) with \(m=6,\;n=33,\;p=3\).
      +
      +Therefore  
      +
      +\[
      +m+n+p=6+33+3=42 .
      +\]
      +
      +\[
      +\boxed{42}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 42

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +c,v,s
      +\]
      +
      +be the numbers of players who chose chocolate, vanilla and strawberry, respectively.  
      +The players are distinct, so for a fixed triple \((c,v,s)\) the number of assignments is
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +The conditions are  
      +
      +* \(c+v+s=9\) (nine players),  
      +* \(c>v>s\) (strictly more chocolate than vanilla, and more vanilla than strawberry),  
      +* \(c,v,s\ge 1\) (each flavor is chosen by at least one player).
      +
      +---
      +
      +### 1. Find all possible triples \((c,v,s)\)
      +
      +We need positive integers \(c>v>s\) with sum 9.
      +
      +List possibilities by the smallest part \(s\).
      +
      +* **\(s=1\)**: then \(c+v=8\) with \(c>v>1\).  
      +  Pairs \((c,v)\) are \((6,2)\) and \((5,3)\).  
      +  → \((6,2,1),\;(5,3,1)\).
      +
      +* **\(s=2\)**: then \(c+v=7\) with \(c>v>2\).  
      +  Only pair \((4,3)\) works.  
      +  → \((4,3,2)\).
      +
      +* **\(s\ge 3\)**: then \(c+v\le 6\) while \(v> s\ge3\), impossible.
      +
      +Hence the only triples are  
      +
      +\[
      +(6,2,1),\qquad (5,3,1),\qquad (4,3,2).
      +\]
      +
      +---
      +
      +### 2. Count assignments for each triple
      +
      +\[
      +9! = 362\,880.
      +\]
      +
      +\[
      +\begin{aligned}
      +(6,2,1):\;&\frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[4pt]
      +(5,3,1):\;&\frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[4pt]
      +(4,3,2):\;&\frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 3. Total number of assignments
      +
      +\[
      +N = 252 + 504 + 1260 = 2016.
      +\]
      +
      +---
      +
      +### 4. Remainder modulo \(1000\)
      +
      +\[
      +2016 \equiv 16 \pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equation  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +can be factored:
      +
      +\[
      +12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .
      +\]
      +
      +Hence a solution must satisfy one of the two linear equations  
      +
      +\[
      +\begin{cases}
      +3x+2y=0\\[2pt]
      +\text{or}\\[2pt]
      +4x-3y=0 .
      +\end{cases}
      +\]
      +
      +Both lines pass through the origin, so the only common solution is \((0,0)\).
      +
      +---
      +
      +### 1. Solutions of \(3x+2y=0\)
      +
      +\[
      +3x+2y=0 \Longrightarrow 3x=-2y \Longrightarrow x=-\frac23y .
      +\]
      +
      +Let \(y=3m\) (\(m\in\mathbb Z\)). Then  
      +
      +\[
      +x=-2m .
      +\]
      +
      +The bounds \(-100\le x,y\le 100\) give  
      +
      +\[
      +-100\le 3m\le 100\quad\Longrightarrow\quad -33\le m\le 33 .
      +\]
      +
      +Thus there are  
      +
      +\[
      +33-(-33)+1 = 67
      +\]
      +
      +integer pairs on this line.
      +
      +---
      +
      +### 2. Solutions of \(4x-3y=0\)
      +
      +\[
      +4x-3y=0 \Longrightarrow 4x=3y \Longrightarrow x=\frac34y .
      +\]
      +
      +Let \(y=4k\) (\(k\in\mathbb Z\)). Then  
      +
      +\[
      +x=3k .
      +\]
      +
      +The bounds give  
      +
      +\[
      +-100\le 4k\le 100\quad\Longrightarrow\quad -25\le k\le 25 .
      +\]
      +
      +Hence there are  
      +
      +\[
      +25-(-25)+1 = 51
      +\]
      +
      +integer pairs on this line.
      +
      +---
      +
      +### 3. Removing the double‑counted point
      +
      +The two lines intersect only at \((0,0)\), which was counted in both families.  
      +So the total number of distinct ordered pairs is
      +
      +\[
      +67+51-1=117 .
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(x,0),\qquad C=(0,y)
      +\]
      +
      +so that \(\angle A=90^{\circ}\) and  
      +
      +\[
      +x^{2}+y^{2}=BC^{2}=38^{2}=1444 .\tag{1}
      +\]
      +
      +Because  
      +
      +\[
      +AK=AL=BK=CL=KL=14,
      +\]
      +
      +the points \(K\) and \(L\) are the intersections of the circles
      +
      +* centered at \(A\) and \(B\) of radius \(14\)  – giving \(K\);
      +* centered at \(A\) and \(C\) of radius \(14\)  – giving \(L\).
      +
      +Hence  
      +
      +\[
      +K=\Bigl(\frac{x}{2},\;\sqrt{14^{2}-\Bigl(\frac{x}{2}\Bigr)^{2}}\Bigr),\qquad 
      +L=\Bigl(\sqrt{14^{2}-\Bigl(\frac{y}{2}\Bigr)^{2}},\;\frac{y}{2}\Bigr). \tag{2}
      +\]
      +
      +Write  
      +
      +\[
      +u=\frac{x}{2},\qquad v=\frac{y}{2},
      +\]
      +
      +so that \(x=2u,\;y=2v\).  
      +From (1) we have  
      +
      +\[
      +u^{2}+v^{2}=361. \tag{3}
      +\]
      +
      +The condition \(KL=14\) together with (2) gives  
      +
      +\[
      +\bigl(u-\sqrt{196-v^{2}}\bigr)^{2}+\bigl(\sqrt{196-u^{2}}-v\bigr)^{2}=196,
      +\]
      +
      +which simplifies to  
      +
      +\[
      +u\sqrt{196-v^{2}}+v\sqrt{196-u^{2}}=98. \tag{4}
      +\]
      +
      +Let  
      +
      +\[
      +a=u^{2},\quad b=v^{2}.
      +\]
      +
      +Then (3) is \(a+b=361\) and (4) becomes  
      +
      +\[
      +\sqrt{a(196-b)}+\sqrt{b(196-a)}=98 .
      +\]
      +
      +Squaring, eliminating the radicals and using \(a+b=361\) yields  
      +
      +\[
      +a^{2}-361a+32448=0,
      +\]
      +
      +so  
      +
      +\[
      +a,b=\frac{361\pm 23}{2}=192,\;169.
      +\]
      +
      +Thus  
      +
      +\[
      +u^{2}=169,\;v^{2}=192\quad\text{or}\quad u^{2}=192,\;v^{2}=169.
      +\]
      +
      +Take  
      +
      +\[
      +u=13,\qquad v=8\sqrt3 .
      +\]
      +
      +Hence  
      +
      +\[
      +AB=2u=26,\qquad AC=2v=16\sqrt3,
      +\]
      +
      +and the right‑triangle \(ABC\) indeed has \(BC=38\).
      +
      +From (2) we obtain the exact coordinates
      +
      +\[
      +B=(26,0),\quad C=(0,16\sqrt3),\quad 
      +K=\bigl(13,3\sqrt3\bigr),\quad 
      +L=\bigl(2,8\sqrt3\bigr).
      +\]
      +
      +Now compute the area of quadrilateral \(BKLC\) with the shoelace formula:
      +
      +\[
      +\begin{aligned}
      +\text{Area} &=\frac12\bigl|
      +26(3\sqrt3)+13(8\sqrt3)+2(16\sqrt3)+0\cdot0\\
      +&\quad- \bigl(13\cdot0+2(3\sqrt3)+0(8\sqrt3)+26(16\sqrt3)\bigr)\bigr|\\[2mm]
      +&=\frac12\bigl| 78\sqrt3+104\sqrt3+32\sqrt3
      +- (6\sqrt3+416\sqrt3) \bigr|\\[2mm]
      +&=\frac12\bigl|214\sqrt3-422\sqrt3\bigr|
      += \frac12\,(208\sqrt3)=104\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Thus the area of \(BKLC\) is \(104\sqrt3\).  
      +
      +Therefore  
      +
      +\[
      +\boxed{104}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid have bases \(AB=r\) and \(CD=s\) \((r\neq s)\) and equal legs \(AD=BC=\ell\).
      +A circle of radius \(3\) is tangent to all four sides.
      +
      +---
      +
      +### 1.  Tangential quadrilateral condition  
      +
      +For any quadrilateral that has an incircle, the sums of opposite sides are equal:
      +
      +\[
      +AB+CD = AD+BC \qquad\Longrightarrow\qquad r+s = 2\ell .
      +\tag{1}
      +\]
      +
      +Thus each leg is the average of the two bases:
      +
      +\[
      +\ell =\frac{r+s}{2}.
      +\tag{2}
      +\]
      +
      +---
      +
      +### 2.  Use the area formula for a tangential quadrilateral  
      +
      +If a quadrilateral has an incircle of radius \(R\) and semiperimeter \(p\), then  
      +
      +\[
      +\text{Area}=R\cdot p .
      +\]
      +
      +Here \(R=3\) and the area is \(72\), so
      +
      +\[
      +3p = 72 \quad\Longrightarrow\quad p = 24 .
      +\tag{3}
      +\]
      +
      +The perimeter is \(2p=48\). Using (1),
      +
      +\[
      +r+s+2\ell =48 \quad\Longrightarrow\quad r+s+ (r+s)=48
      +\]
      +\[
      +\Longrightarrow\qquad r+s = 24 .
      +\tag{4}
      +\]
      +
      +Hence from (2) the leg length is  
      +
      +\[
      +\ell =\frac{r+s}{2}=12 .
      +\tag{5}
      +\]
      +
      +---
      +
      +### 3.  Height of the trapezoid  
      +
      +The incircle touches both parallel sides, so the distance between them (the height \(h\)) equals twice the radius:
      +
      +\[
      +h = 2\cdot 3 = 6 .
      +\tag{6}
      +\]
      +
      +(One can also get \(h\) from \(\displaystyle \text{Area}= \frac{r+s}{2}\,h\) using (4): \(72 =12h\Rightarrow h=6\).)
      +
      +---
      +
      +### 4.  Relate the leg to the bases  
      +
      +In an isosceles trapezoid, each leg forms a right triangle with height \(h\) and horizontal leg \(\frac{|r-s|}{2}\):
      +
      +\[
      +\ell^{2}= \left(\frac{r-s}{2}\right)^{2}+h^{2}.
      +\]
      +
      +Substituting \(\ell=12\) and \(h=6\),
      +
      +\[
      +12^{2}= \frac{(r-s)^{2}}{4}+6^{2}
      +\quad\Longrightarrow\quad
      +144 = \frac{(r-s)^{2}}{4}+36
      +\]
      +\[
      +\Longrightarrow\quad (r-s)^{2}=432 .
      +\tag{7}
      +\]
      +
      +---
      +
      +### 5.  Find \(r^{2}+s^{2}\)
      +
      +We have the two symmetric relations  
      +
      +\[
      +(r+s)^{2}=24^{2}=576,
      +\qquad
      +(r-s)^{2}=432 .
      +\]
      +
      +Recall  
      +
      +\[
      +(r-s)^{2}= (r+s)^{2}-4rs .
      +\]
      +
      +Thus  
      +
      +\[
      +432 = 576 - 4rs \quad\Longrightarrow\quad rs = 36 .
      +\tag{8}
      +\]
      +
      +Now  
      +
      +\[
      +r^{2}+s^{2}= (r+s)^{2}-2rs = 576-2\cdot36 = 576-72 = 504 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a number to be divisible by \(22\) it must be divisible by \(2\) and by \(11\).
      +
      +---
      +
      +### 1.  Divisibility by \(11\)
      +
      +Write an 8‑digit permutation as  
      +
      +\[
      +d_1d_2d_3d_4d_5d_6d_7d_8 ,
      +\]
      +
      +with positions counted from the left.  
      +For an even number of digits, the rule for \(11\) is  
      +
      +\[
      +(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\equiv0\pmod{11}.
      +\]
      +
      +Let  
      +
      +\[
      +O=d_1+d_3+d_5+d_7,\qquad E=d_2+d_4+d_6+d_8 .
      +\]
      +
      +Because the digits \(1,2,\dots ,8\) are used once,  
      +
      +\[
      +O+E=1+2+\cdots+8=36 .
      +\]
      +
      +The condition for \(11\) gives \(O-E\equiv0\pmod{11}\).  
      +Since \(O,E\) lie between \(10\) and \(26\), the only possible multiple of \(11\) is \(0\).  
      +Hence  
      +
      +\[
      +O=E=18 .
      +\]
      +
      +Thus the four digits placed in the odd positions must sum to \(18\); the remaining four (even positions) also sum to \(18\).
      +
      +---
      +
      +### 2.  Which four‑digit sets sum to \(18\)?
      +
      +Find all 4‑element subsets of \(\{1,\dots ,8\}\) whose sum is \(18\).
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are \(8\) such subsets.  
      +Each contains exactly two even digits (the evens are \(2,4,6,8\)).  
      +Consequently, the complementary set (the digits for the even positions) also contains exactly two evens.
      +
      +---
      +
      +### 3.  Divisibility by \(2\)
      +
      +A number is even precisely when its unit digit (position 8) is even.  
      +Position 8 belongs to the even positions, whose four digits are the complement of the chosen odd‑position set.  
      +Since that complement always has exactly two even digits, we have
      +
      +\[
      +\text{choices for the unit digit}=2 .
      +\]
      +
      +---
      +
      +### 4.  Counting the permutations
      +
      +Fix one of the eight valid 4‑digit odd‑position sets \(S\).
      +
      +* Arrange the four digits of \(S\) in the odd positions \(1,3,5,7\): \(4! = 24\) ways.
      +* Choose an even digit from the complementary set for the unit place: \(2\) ways.
      +* Arrange the remaining three digits of the complement in positions \(2,4,6\): \(3! = 6\) ways.
      +
      +Hence for each set \(S\)
      +
      +\[
      +24 \times 2 \times 6 = 288
      +\]
      +
      +permutations are divisible by \(22\).
      +
      +With \(8\) possible sets \(S\),
      +
      +\[
      +N = 8 \times 288 = 2304 .
      +\]
      +
      +---
      +
      +### 5.  Required difference
      +
      +\[
      +N-2025 = 2304-2025 = 279 .
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First write each term \(x_k\) in reduced form  
      +
      +\[
      +x_k=\frac{a_k}{b_k},\qquad (a_k,b_k)=1 ,\;a_k,b_k>0 .
      +\]
      +
      +From  
      +
      +\[
      +x_{k+1}= \frac13\Bigl(x_k+\frac1{x_k}-1\Bigr)
      +        =\frac13\Bigl(\frac{a_k}{b_k}+\frac{b_k}{a_k}-1\Bigr)
      +\]
      +
      +we obtain  
      +
      +\[
      +a_{k+1}= \frac{a_k^2+b_k^2-a_kb_k}{3},\qquad   
      +b_{k+1}=a_kb_k .\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coprimeness is preserved
      +If a prime \(p\mid a_{k+1}\) and \(p\mid b_{k+1}=a_kb_k\) then \(p\mid a_k\) or \(p\mid b_k\).
      +But modulo such a prime the numerator \(a_k^2+b_k^2-a_kb_k\) equals \(b_k^2\) (resp. \(a_k^2\)),
      +which is non‑zero because \((a_k,b_k)=1\). Hence no prime can divide both
      +\(a_{k+1}\) and \(b_{k+1}\); therefore \((a_{k+1},b_{k+1})=1\).
      +Thus each \(x_k\) is already in lowest terms.
      +
      +--------------------------------------------------------------------
      +### 2.  A simple recurrence for the sum
      +
      +Let  
      +
      +\[
      +s_k=a_k+b_k .
      +\]
      +
      +Adding the two formulas in (1),
      +
      +\[
      +\begin{aligned}
      +s_{k+1}
      + &=\frac{a_k^2+b_k^2-a_kb_k}{3}+a_kb_k  \\
      + &=\frac{a_k^2+b_k^2+2a_kb_k}{3} =\frac{(a_k+b_k)^2}{3}
      +   =\frac{s_k^{\,2}}{3}.         \tag{2}
      +\end{aligned}
      +\]
      +
      +The initial sum is  
      +
      +\[
      +s_1= a_1+b_1=25+11=36 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Closed form of \(s_k\)
      +
      +From (2) we prove by induction that  
      +
      +\[
      +\boxed{\,s_k = 2^{\,2^{\,k}}\; 3^{\,2^{\,k-1}+1}\,}\qquad(k\ge1).
      +\]
      +
      +Indeed, for \(k=1\) the formula gives \(2^{2}\,3^{2}=36\).
      +Assume it holds for \(k\); then using (2),
      +
      +\[
      +s_{k+1}= \frac{s_k^{2}}{3}
      +      =\frac{(2^{2^{k}}3^{2^{k-1}+1})^{2}}{3}
      +      =2^{2^{k+1}}3^{2^{k}+1},
      +\]
      +
      +which is the required expression for \(k+1\).
      +
      +--------------------------------------------------------------------
      +### 4.  Computing \(s_{2025}\pmod{1000}\)
      +
      +We need \(m+n=s_{2025}\pmod{1000}\).
      +
      +Because \(1000=8\cdot125\), we treat the two moduli separately.
      +
      +*Modulo \(8\):*  
      +\(2^{2^{2025}}\) contains the factor \(2^3\); hence \(s_{2025}\equiv0\pmod 8\).
      +
      +*Modulo \(125\):*  
      +\(\phi(125)=100\).  Thus we may reduce the exponents modulo \(100\).
      +
      +\[
      +\begin{aligned}
      +2^{2025}\pmod{100}&=32, &
      +2^{2024}\pmod{100}&=16 .
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +2^{\,2^{2025}}\pmod{125}&=2^{32}\pmod{125}=46,\\[2mm]
      +3^{\,2^{2024}+1}\pmod{125}&=3^{16+1}=3^{17}\pmod{125}=38.
      +\end{aligned}
      +\]
      +
      +Therefore  
      +
      +\[
      +s_{2025}\equiv 46\cdot38\equiv123\pmod{125}.
      +\]
      +
      +Now solve  
      +
      +\[
      +N\equiv0\pmod8,\qquad N\equiv123\pmod{125}.
      +\]
      +
      +Since \(8^{-1}\equiv47\pmod{125}\),
      +
      +\[
      +N\equiv8\bigl(47\cdot123\bigr)\equiv8\cdot31\equiv248\pmod{1000}.
      +\]
      +
      +Thus  
      +
      +\[
      +m+n\equiv\boxed{248}\pmod{1000}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Check via periodicity (optional)
      +
      +From \(s_{k+1}=s_k^2/3\) modulo \(1000\) one finds that the
      +sequence \(\{s_k\bmod1000\}\) becomes periodic with period \(20\) after
      +the third term:
      +\[
      +36,\;432,\;\underline{208},\;88,\;248,\;168,\dots
      +\]
      +Since \(2025-3\equiv2\pmod{20}\), the term equals the fifth term,
      +\(248\), confirming the result above.
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +z=x+iy .
      +\]
      +
      +---
      +
      +### 1.  The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +gives the circle  
      +
      +\[
      +(x-25)^2+(y-20)^2=5^{2}=25 .
      +\tag{1}
      +\]
      +
      +Its centre is \(C=(25,20)\) and its radius is \(5\).
      +
      +---
      +
      +### 2.  The second equation  
      +
      +\[
      +|z-4-k|=|z-3i-k|
      +\]
      +
      +means that the point \(z\) is equidistant from the two points  
      +
      +\[
      +A=(4+k,0),\qquad B=(k,3).
      +\]
      +
      +Thus \(z\) lies on the **perpendicular bisector** of the segment \(AB\).
      +
      +*Midpoint*  
      +
      +\[
      +M\Bigl(\frac{4+k+k}{2},\frac{0+3}{2}\Bigr)=\bigl(k+2,\; \tfrac32 \bigr).
      +\]
      +
      +*Slope of \(AB\)*  
      +
      +\[
      +\frac{3-0}{k-(4+k)}=\frac{3}{-4}=-\frac34 .
      +\]
      +
      +Hence the slope of the perpendicular bisector is \( \displaystyle \frac43\).
      +
      +Its equation is
      +
      +\[
      +y-\frac32=\frac43\bigl(x-(k+2)\bigr)
      +\]
      +
      +or, after clearing denominators,
      +
      +\[
      +8x-6y-8k-7=0 .
      +\tag{2}
      +\]
      +
      +Thus the second condition is the line \(L_k: 8x-6y-8k-7=0\).
      +
      +---
      +
      +### 3.  Intersections of (1) and (2)
      +
      +The system has exactly one solution iff the line \(L_k\) is **tangent** to the circle (1), i.e. the distance from the centre \(C\) to the line equals the radius \(5\).
      +
      +Distance from \((25,20)\) to \(L_k\):
      +
      +\[
      +d=\frac{|8\cdot25-6\cdot20-8k-7|}{\sqrt{8^{2}+(-6)^{2}}}
      +   =\frac{|200-120-8k-7|}{\sqrt{64+36}}
      +   =\frac{|73-8k|}{10}.
      +\]
      +
      +Set \(d=5\):
      +
      +\[
      +\frac{|73-8k|}{10}=5\quad\Longrightarrow\quad |73-8k|=50.
      +\]
      +
      +Hence  
      +
      +\[
      +73-8k=50\quad\text{or}\quad73-8k=-50,
      +\]
      +giving  
      +
      +\[
      +k=\frac{23}{8}\qquad\text{or}\qquad k=\frac{123}{8}.
      +\]
      +
      +For each of these values the line is tangent, so there is exactly one point \(z\) satisfying both equations.
      +
      +---
      +
      +### 4.  Sum of all possible \(k\)
      +
      +\[
      +\frac{23}{8}+\frac{123}{8}= \frac{146}{8}= \frac{73}{4}.
      +\]
      +
      +Write \(\displaystyle \frac{73}{4}\) as \(\frac{m}{n}\) with \(\gcd(m,n)=1\); here \(m=73,\;n=4\).
      +
      +\[
      +m+n = 73+4 = 77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Since the points lie on the sides of \(\triangle ABC\) we may work with vectors
      +\[
      +\vec{AB}= \mathbf b,\qquad \vec{AC}= \mathbf c ,
      +\qquad A\; \text{at the origin}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Locate the points \(D,E,F,G\)
      +
      +\[
      +AD=4,\;AB=28\Longrightarrow \frac{AD}{AB}= \frac 1 7\quad\Rightarrow\quad 
      +\vec{AD}=\frac17\mathbf b .
      +\]
      +Thus \(D=\dfrac17\mathbf b\).
      +
      +\[
      +AE=AD+DE=20\Longrightarrow\frac{AE}{AB}= \frac{20}{28}= \frac57
      +\quad\Rightarrow\quad  E=\frac57\mathbf b .
      +\]
      +
      +Similarly on \(AC\),
      +
      +\[
      +AF=13,\;AC=91\Longrightarrow \frac{AF}{AC}= \frac13\!7\quad\Rightarrow\quad 
      +F=\frac17\mathbf c ,
      +\]
      +\[
      +AG=AF+FG=65\Longrightarrow \frac{AG}{AC}= \frac{65}{91}= \frac57
      +\quad\Rightarrow\quad  G=\frac57\mathbf c .
      +\]
      +
      +Hence  
      +
      +\[
      +D=\frac17\mathbf b,\qquad E=\frac57\mathbf b,\qquad
      +F=\frac17\mathbf c,\qquad G=\frac57\mathbf c .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Area of \(\triangle ABC\)
      +
      +Quadrilateral \(DEGF\) is the region between the similar triangles
      +\(ADF\) (scale \(1/7\)) and \(AEG\) (scale \(5/7\)).  
      +Therefore  
      +
      +\[
      +[DEGF]=[AEG]-[ADF]
      +           =\left(\frac57\right)^{\!2}[ABC]-\left(\frac17\right)^{\!2}[ABC]
      +           =\frac{25-1}{49}[ABC]=\frac{24}{49}[ABC].
      +\]
      +
      +Given \([DEGF]=288\),
      +
      +\[
      +[ABC]=\frac{49}{24}\cdot288=49\cdot12=588 .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Locate the reflected points \(M,N\)
      +
      +\[
      +M\; \text{is the reflection of }D\text{ across }F\;
      +\Longrightarrow\; M=2F-D=
      +\frac{2}{7}\mathbf c-\frac{1}{7}\mathbf b .
      +\]
      +
      +\[
      +N\; \text{is the reflection of }G\text{ across }E\;
      +\Longrightarrow\; N=2E-G=
      +\frac{10}{7}\mathbf b-\frac{5}{7}\mathbf c .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of the heptagon \(AFNBCEM\)
      +
      +Write the vertices (in order) as vectors from \(A\):
      +
      +\[
      +\begin{aligned}
      +A&=0, &
      +F&=\frac17\mathbf c, &
      +N&=\frac{10}{7}\mathbf b-\frac57\mathbf c,\\
      +B&=\mathbf b, &
      +C&=\mathbf c, &
      +E&=\frac57\mathbf b, &
      +M&=\frac27\mathbf c-\frac17\mathbf b .
      +\end{aligned}
      +\]
      +
      +For a polygon with vertices \(\mathbf v_0,\dots,\mathbf v_6\) the doubled
      +area equals
      +\[
      +\sum_{i=0}^{6}\det(\mathbf v_i,\mathbf v_{i+1}),
      +\qquad\mathbf v_7=\mathbf v_0 .
      +\]
      +
      +Carrying out the determinants (using \(\det(\mathbf b,\mathbf c)=\det(\mathbf b,\mathbf c)\) and \(\det(\mathbf c,\mathbf b)=-\det(\mathbf b,\mathbf c)\)):
      +
      +\[
      +\begin{aligned}
      +\det(F,N) &=\frac1{49}\det\!\Bigl(\mathbf c,\;10\mathbf b-5\mathbf c\Bigr)
      +           =-\frac{10}{49}\det(\mathbf b,\mathbf c),\\[2mm]
      +\det(N,B) &=\frac57\det(\mathbf b,\mathbf b)-\frac5{7}\det(\mathbf c,\mathbf b)
      +           =\frac5{7}\det(\mathbf b,\mathbf c),\\[2mm]
      +\det(B,C) &=\det(\mathbf b,\mathbf c),\\[2mm]
      +\det(C,E) &=\frac57\det(\mathbf c,\mathbf b)=-\frac5{7}\det(\mathbf b,\mathbf c),\\[2mm]
      +\det(E,M) &=\frac1{49}\det\!\Bigl(5\mathbf b,\;2\mathbf c-\mathbf b\Bigr)
      +           =\frac{10}{49}\det(\mathbf b,\mathbf c).
      +\end{aligned}
      +\]
      +
      +All other terms are zero. Adding them:
      +
      +\[
      +\det(F,N)+\det(N,B)+\det(B,C)+\det(C,E)+\det(E,M)
      +   =\Bigl(-\frac{10}{49}+\frac5{7}+1-\frac5{7}+\frac{10}{49}\Bigr)
      +      \det(\mathbf b,\mathbf c)=\det(\mathbf b,\mathbf c).
      +\]
      +
      +Thus the doubled area of the heptagon is \(\det(\mathbf b,\mathbf c)\),
      +which is exactly twice the area of \(\triangle ABC\). Consequently
      +
      +\[
      +[AFNBCEM]=\frac12\det(\mathbf b,\mathbf c)=[ABC]=588 .
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Answer
      +
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The parabola is  
      +
      +\[
      +y=x^{2}-4 .
      +\]
      +
      +Rotate a point \((x,y)\) by \(-60^{\circ}\) (the inverse rotation).  
      +For \(\theta =60^{\circ}\),
      +
      +\[
      +\cos\theta =\frac12 ,\qquad \sin\theta =\frac{\sqrt3}{2}.
      +\]
      +
      +The inverse‑rotation of \((x,y)\) is  
      +
      +\[
      +u=\frac12 x+\frac{\sqrt3}{2}y ,\qquad 
      +v=-\frac{\sqrt3}{2}x+\frac12 y .
      +\]
      +
      +For a point of the rotated parabola, the inverse image \((u,v)\) must satisfy the
      +original equation \(v=u^{2}-4\):
      +
      +\[
      +-\frac{\sqrt3}{2}x+\frac12 y =\Bigl(\frac12 x+\frac{\sqrt3}{2}y\Bigr)^{2}-4 .
      +\]
      +
      +Multiplying by \(2\) and expanding gives
      +
      +\[
      +\frac12 x^{2}+\sqrt3\,xy+\frac32 y^{2}+\sqrt3\,x-y-8=0. \tag{1}
      +\]
      +
      +Now substitute \(y=x^{2}-4\) (the original parabola) into (1):
      +
      +\[
      +\frac12 x^{2}+\sqrt3\,x(x^{2}-4)+\frac32 (x^{2}-4)^{2}
      ++\sqrt3\,x-(x^{2}-4)-8=0 .
      +\]
      +
      +Simplifying,
      +
      +\[
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40=0 .
      +\]
      +
      +Factor the quartic (group the \(\sqrt3\) terms):
      +
      +\[
      +\bigl(x^{2}+\sqrt3\,x-4\bigr)\bigl(3x^{2}-\sqrt3\,x-10\bigr)=0 .
      +\]
      +
      +Hence
      +
      +\[
      +x^{2}+\sqrt3\,x-4=0\qquad\text{or}\qquad 3x^{2}-\sqrt3\,x-10=0.
      +\]
      +
      +The four solutions are  
      +
      +\[
      +\begin{aligned}
      +x&=\frac{-\sqrt3\pm\sqrt{19}}2,\\[2mm]
      +x&=\frac{\sqrt3\pm\sqrt{123}}6 .
      +\end{aligned}
      +\]
      +
      +Only one of them lies in the fourth quadrant \((x>0,\;y<0)\):
      +\[
      +x=\frac{-\sqrt3+\sqrt{19}}2\;(>0),\qquad |x|<2 .
      +\]
      +
      +Its \(y\)-coordinate is
      +
      +\[
      +y=x^{2}-4
      +     =\Bigl(\frac{-\sqrt3+\sqrt{19}}2\Bigr)^{2}-4
      +     =\frac{3-\sqrt{57}}2 .
      +\]
      +
      +Thus  
      +
      +\[
      +y=\frac{a-\sqrt b}{c}\quad\text{with}\quad a=3,\;b=57,\;c=2,
      +\]
      +and \(a\) and \(c\) are relatively prime.
      +
      +Finally,
      +\[
      +a+b+c=3+57+2=62 .
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The six two‑letter words are formed by first ordering the letters inside each pair
      +alphabetically and then sorting the six words alphabetically.  
      +For a pairing, let  
      +
      +\[
      +S=\{\text{the smaller letter of each pair}\}
      +\]
      +
      +(the “first” letters of the six words).  
      +The lexicographically last word is the one whose first letter is  
      +
      +\[
      +M=\max S .
      +\]
      +
      +Hence the last word contains \(G\) **iff** either  
      +
      +* \(M=G\) (so \(G\) itself is the first letter of the last word), or  
      +* \(M\neq G\) but \(G\) is paired with the letter \(M\) (so \(G\) is the second
      +letter of the last word).
      +
      +Because a pair \((x,y)\) must satisfy \(x<y\), the only possible \(M\) with
      +\(M<G\) is \(M=F\).  Thus there are two cases:
      +
      +--------------------------------------------------------------------
      +### 1.  \(M=G\)
      +
      +Then the six small letters are  
      +
      +\[
      +S=\{G\}\cup \{A,B,C,D,E,F\}\setminus\{a\},
      +\]
      +
      +where \(a\) is the one letter from \(\{A,\dots ,F\}\) that is **not** in \(S\).
      +The omitted letter \(a\) must not be \(A\); otherwise \(A\) would be a large
      +letter with no smaller partner.  
      +Hence \(a\in\{B,C,D,E,F\}\) – 5 possibilities.
      +
      +For a given \(a\):
      +* \(a\) (a large letter) must be paired with a small letter that is
      +smaller than \(a\); there are \(a-1\) such choices.
      +* The remaining five small letters can be paired arbitrarily with the five
      +large letters \(H,I,J,K,L\); that gives \(5!\) possibilities.
      +
      +Thus for each \(a\) we have \((a-1)\cdot5!\) pairings.  
      +Summing over \(a=2,3,4,5,6\) (i.e. \(B\)–\(F\)),
      +
      +\[
      +\sum_{a=2}^{6}(a-1) \cdot 5!
      +   =(1+2+3+4+5)\cdot120
      +   =15\cdot120
      +   =1800 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  \(M=F\) and \(G\) is paired with \(F\)
      +
      +If the maximum small letter is \(F\), then the small set must be exactly  
      +
      +\[
      +S=\{A,B,C,D,E,F\},
      +\qquad
      +T=\{G,H,I,J,K,L\}.
      +\]
      +
      +Every bijection between \(S\) and \(T\) yields a valid pairing, so there are
      +\(6! = 720\) pairings in total.  
      +Among them, the ones with \(F\) paired with \(G\) are those where we fix that
      +pair and match the remaining five letters arbitrarily, giving \(5! =120\) pairings.
      +
      +--------------------------------------------------------------------
      +### Total favourable pairings
      +
      +\[
      +N_{\text{fav}} = 1800 + 120 = 1920 .
      +\]
      +
      +--------------------------------------------------------------------
      +### Total pairings
      +
      +The total number of ways to split 12 distinct letters into six unordered pairs is  
      +
      +\[
      +N_{\text{total}}=\frac{12!}{2^{6}\,6!}=10395 .
      +\]
      +
      +--------------------------------------------------------------------
      +### Probability
      +
      +\[
      +P=\frac{1920}{10395}
      +   =\frac{128}{693}\quad(\text{in lowest terms}).
      +\]
      +
      +Thus \(m=128,\;n=693\) and
      +
      +\[
      +m+n=128+693=821 .
      +\]
      +
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The graph of  
      +
      +\[
      +f(x)=\begin{cases}
      +x,&-1\le x<1\\[2pt]
      +2-x,&1\le x<3
      +\end{cases},
      +\qquad f(x+4)=f(x)
      +\]
      +
      +is a triangular wave of period \(4\) whose values lie in \([-1,1]\).
      +
      +The parabola is  
      +
      +\[
      +x=34y^{2}\qquad (x\ge 0).
      +\]
      +
      +Because \(|f(x)|\le 1\), any intersection must satisfy \(|y|\le 1\); then  
      +
      +\[
      +0\le x=34y^{2}\le 34 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1. Reduce the problem to a quadratic equation
      +
      +Write  
      +
      +\[
      +t = 34y^{2}\;(0\le t\le34).
      +\]
      +
      +For some integer \(k\) we can write  
      +
      +\[
      +t = 4k+u,\qquad u\in[-1,3)
      +\]
      +
      +(the representation is unique because we use the half‑open interval \([-1,3)\)).  
      +Since \(f(t)=f(u)\),
      +
      +\[
      +f(u)=\begin{cases}
      +u, & u\in[-1,1)\\[2pt]
      +2-u, & u\in[1,3)
      +\end{cases}
      +\]
      +
      +and the intersection condition \(y=f(t)\) becomes  
      +
      +\[
      +\begin{cases}
      +y=u = 34y^{2}-4k, & u\in[-1,1)\\[4pt]
      +y=2-u = 2-(34y^{2}-4k), & u\in[1,3)
      +\end{cases}
      +\]
      +
      +which give the quadratics  
      +
      +\[
      +\boxed{34y^{2}-y-4k=0}\qquad(u\in[-1,1))
      +\tag{A}
      +\]
      +
      +\[
      +\boxed{34y^{2}+y-(2+4k)=0}\qquad(u\in[1,3))
      +\tag{B}
      +\]
      +
      +with the extra restrictions  
      +
      +\[
      +\text{(A)}\;y\in[-1,1), \qquad
      +\text{(B)}\; -1<y\le 1 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2. The possible integers \(k\)
      +
      +Since \(t\le34\),
      +
      +\[
      +-1\le u =t-4k <3\Longrightarrow 4k\le t+1\le 35
      +\]
      +
      +so \(k\) can be \(0,1,\dots ,8\) (nine values).
      +
      +--------------------------------------------------------------------
      +### 3. Solutions of (A)
      +
      +For each \(k\) the equation  
      +
      +\[
      +34y^{2}-y-4k=0
      +\]
      +
      +has the two roots  
      +
      +\[
      +y=\frac{1\pm\sqrt{1+544k}}{68}.
      +\]
      +
      +Both lie in \([-1,1)\) for all \(k=0,\dots ,8\).  
      +Hence each \(k\) contributes **two** solutions and their sum is
      +
      +\[
      +\frac{1}{34}\quad\text{(by Vieta)}.
      +\]
      +
      +Total from (A):
      +
      +\[
      +9\cdot\frac{1}{34}= \frac{9}{34}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 4. Solutions of (B)
      +
      +For each \(k\) the equation  
      +
      +\[
      +34y^{2}+y-(2+4k)=0
      +\]
      +
      +has roots  
      +
      +\[
      +y=\frac{-1\pm\sqrt{273+544k}}{68}.
      +\]
      +
      +For \(k=0,1,\dots ,7\) both roots satisfy \(-1<y\le1\); for \(k=8\) the
      +negative root is \(<-1\) and is discarded.
      +Thus we have
      +
      +* for \(k=0,\dots ,7\): two roots each, sum \(-\dfrac1{34}\) (Vieta);
      +* for \(k=8\): only the positive root  
      +
      +  \[
      +  y_{8}= \frac{-1+\sqrt{4625}}{68}= \frac{-1+5\sqrt{185}}{68}.
      +  \]
      +
      +Hence the contribution of (B) is  
      +
      +\[
      +8\!\left(-\frac1{34}\right) + y_{8}= -\frac{8}{34}+ \frac{-1+5\sqrt{185}}{68}
      += -\frac{4}{17}+ \frac{-1+5\sqrt{185}}{68}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 5. Sum of all \(y\)-coordinates
      +
      +Add the contributions of (A) and (B):
      +
      +\[
      +\begin{aligned}
      +S &=\frac{9}{34}\;+\;\Bigl(-\frac{8}{34}+ \frac{-1+5\sqrt{185}}{68}\Bigr)\\[4pt]
      +  &=\frac{1}{34}+ \frac{-1+5\sqrt{185}}{68}
      +   =\frac{2-1+5\sqrt{185}}{68}\\[4pt]
      +  &=\boxed{\displaystyle\frac{1+5\sqrt{185}}{68}}.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 6. Required sum \(a+b+c+d\)
      +
      +The expression is \(\dfrac{a+b\sqrt{c}}{d}\) with  
      +
      +\[
      +a=1,\quad b=5,\quad c=185,\quad d=68,
      +\]
      +
      +which satisfy the given conditions. Therefore  
      +
      +\[
      +a+b+c+d = 1+5+185+68 = \boxed{259}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line be the \(x\)-axis.  
      +Place the points with coordinates (in order)
      +
      +\[
      +A(0),\; B(x_B),\; C(x_C),\; D(x_D),\; E(x_E),\; F(x_F).
      +\]
      +
      +Denote the successive distances
      +
      +\[
      +AB=a,\; BC=b,\; CD=c,\; DE=d,\; EF=e .
      +\]
      +
      +Then  
      +
      +\[
      +\begin{aligned}
      +a+b &= AC = 26,\\
      +b+c &= BD = 22,\\
      +c+d &= CE = 31,\\
      +d+e &= DF = 33,\\
      +a+b+c+d+e &= AF = 73 .
      +\end{aligned}
      +\]
      +
      +Solving:
      +\[
      +\begin{aligned}
      +a &= 26-b,\\
      +c &= 22-b,\\
      +d &= 31-c = 9+b,\\
      +e &= 33-d = 24-b.
      +\end{aligned}
      +\]
      +
      +Insert these in the sum equation:
      +
      +\[
      +(26-b)+b+(22-b)+(9+b)+(24-b)=73\Longrightarrow81-b=73,
      +\]
      +
      +hence \(b=8\).
      +
      +Thus  
      +
      +\[
      +\begin{aligned}
      +AB = a = 18,\quad
      +BC = b = 8,\quad
      +CD = c = 14,\quad
      +DE = d = 17,\quad
      +EF = e = 16.
      +\end{aligned}
      +\]
      +
      +Choosing \(A\) as the origin gives
      +
      +\[
      +\begin{aligned}
      +A&:(0,0),\\
      +B&:(18,0),\\
      +C&:(26,0),\\
      +D&:(40,0),\\
      +E&:(57,0),\\
      +F&:(73,0).
      +\end{aligned}
      +\]
      +
      +---
      +
      +### Coordinates of \(G\)
      +
      +Let \(G=(x,y)\).  
      +We are given \(CG=40\) and \(DG=30\):
      +
      +\[
      +\begin{cases}
      +(x-26)^2+y^2 = 40^2 =1600,\\
      +(x-40)^2+y^2 = 30^2 = 900 .
      +\end{cases}
      +\]
      +
      +Subtracting the equations eliminates \(y^2\):
      +
      +\[
      +(x-26)^2-(x-40)^2 = 700 .
      +\]
      +
      +\[
      +\begin{aligned}
      +[x^2-52x+676] - [x^2-80x+1600] &= 700\\
      +28x-924 &= 700\\
      +28x &=1624\\
      +x&= \frac{1624}{28}=58 .
      +\end{aligned}
      +\]
      +
      +Plug \(x=58\) into \((x-40)^2+y^2=900\):
      +
      +\[
      +(58-40)^2+y^2=900\Longrightarrow 18^2+y^2=900\Longrightarrow y^2=576,
      +\]
      +
      +so \(|y|=24\).  
      +Thus \(G=(58,\pm24)\).
      +
      +---
      +
      +### Area of \(\triangle BGE\)
      +
      +Points \(B\) and \(E\) lie on the \(x\)-axis, so the base \(BE\) has length
      +
      +\[
      +BE = x_E-x_B = 57-18 = 39 .
      +\]
      +
      +The altitude from \(G\) to line \(BE\) is \(|y|=24\).
      +
      +Hence
      +
      +\[
      +\text{Area}= \frac12 \times (\text{base}) \times (\text{height})
      +          = \frac12 \times 39 \times 24
      +          = 39 \times 12
      +          = 468 .
      +\]
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +d=n+2\qquad (d\ge 3,\; n>0)
      +\]
      +
      +Then  
      +
      +\[
      +n=d-2,\qquad n+3=d+1,\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .
      +\]
      +
      +The required divisibility becomes  
      +
      +\[
      +d\mid 3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).
      +\]
      +
      +---
      +
      +### Reduce modulo \(d\)
      +
      +\[
      +3(d+1)(d^{2}-4d+13) \equiv 3\cdot1\cdot13 = 39 \pmod d,
      +\]
      +
      +because \(d+1\equiv1\) and \(d^{2}-4d+13\equiv13\) modulo \(d\).
      +
      +Thus  
      +
      +\[
      +d\mid 3(d+1)(d^{2}-4d+13)\iff d\mid 39 .
      +\]
      +
      +Hence \(d\) must be a positive divisor of \(39\) and at least \(3\).  
      +Divisors of \(39\) are \(1,3,13,39\); discarding \(1\) we obtain  
      +
      +\[
      +d\in\{3,13,39\}.
      +\]
      +
      +---
      +
      +### Recover the corresponding \(n\)
      +
      +\[
      +n=d-2\implies n\in\{3-2,13-2,39-2\}=\{1,11,37\}.
      +\]
      +
      +Each indeed satisfies the original condition:
      +
      +* \(n=1\): \(\frac{3(1+3)(1^{2}+9)}{1+2}= \frac{3\cdot4\cdot10}{3}=40\) (integer);
      +* \(n=11\): \(\frac{3(11+3)(11^{2}+9)}{11+2}= \frac{3\cdot14\cdot130}{13}=420\);
      +* \(n=37\): \(\frac{3(37+3)(37^{2}+9)}{37+2}= \frac{3\cdot40\cdot1378}{39}=4240\).
      +
      +---
      +
      +### Sum of all such \(n\)
      +
      +\[
      +1+11+37 = 49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First write the two required inequalities using the condition \(x+y+z=75\).
      +
      +\[
      +z=75-x-y .
      +\]
      +
      +---
      +
      +### 1.  Simplify the inequalities  
      +
      +\[
      +\begin{aligned}
      +x-yz &<y-zx\\
      +x-(y(75-x-y)) &< y-(x(75-x-y))\\
      +\Longrightarrow (x-y)(x+y-76) &>0 .
      +\end{aligned}
      +\]
      +
      +\[
      +\begin{aligned}
      +y-zx &<z-xy\\
      +y-x(75-x-y) &< (75-x-y)-xy\\
      +\Longrightarrow (x+1)(x+2y-75) &<0 .
      +\end{aligned}
      +\]
      +
      +Hence the points \((x,y,z)\) on the plane satisfy  
      +
      +\[
      +\boxed{(x-y)(x+y-76)>0},\qquad\boxed{(x+1)(x+2y-75)<0}.
      +\]
      +
      +Both are products of two linear factors.
      +
      +---
      +
      +### 2.  Work in the \((x,y)\)-plane  
      +
      +The plane \(x+y+z=75\) is a linear image of the \((x,y)\)-plane via  
      +
      +\[
      +(x,y)\mapsto (x,\;y,\;75-x-y) .
      +\]
      +
      +The Jacobian matrix has columns \((1,0,-1)\) and \((0,1,-1)\); its Gram determinant is  
      +
      +\[
      +\det\begin{pmatrix}2&1\\1&2\end{pmatrix}=3 .
      +\]
      +
      +Thus an area element in the plane equals \(\sqrt3\) times the ordinary area
      +\(dx\,dy\) in the \((x,y)\)-plane.
      +
      +---
      +
      +### 3.  Region defined by the two products  
      +
      +Let  
      +
      +\[
      +L_1:\;x=-1,\qquad L_2:\;x+2y=75,
      +\]
      +\[
      +L_3:\;x=y,\qquad L_4:\;x+y=76 .
      +\]
      +
      +The inequalities become
      +
      +\[
      +\begin{cases}
      +x>-1 \;\text{and}\; y<\dfrac{75-x}{2}   &\text{or } x<-1 \;\text{and}\; y>\dfrac{75-x}{2},\\[4pt]
      +x>y \;\text{and}\; x+y>76               &\text{or } x<y \;\text{and}\; x+y<76 .
      +\end{cases}
      +\]
      +
      +Only three of the four possible combinations are non‑empty:
      +
      +* **Region \(R_1\)** – \(x>-1,\;y<\frac{75-x}{2},\;x>y,\;x+y>76\) (unbounded).
      +* **Region \(R_2\)** – \(x>-1,\;y<\frac{75-x}{2},\;x<y,\;x+y<76\) (bounded).
      +* **Region \(R_3\)** – \(x<-1,\;y>\frac{75-x}{2},\;x<y,\;x+y<76\) (unbounded).
      +
      +Hence the set consists of three disjoint convex regions; only \(R_2\) has finite area.
      +
      +---
      +
      +### 4.  The bounded region  
      +
      +From the inequalities for \(R_2\)
      +
      +\[
      +\begin{cases}
      +-1<x<25,\\[2pt]
      +x<y<\dfrac{75-x}{2},
      +\end{cases}
      +\]
      +
      +so \(R_2\) is the open triangle bounded by the lines  
      +
      +\[
      +x=-1,\qquad y=x,\qquad y=\dfrac{75-x}{2}.
      +\]
      +
      +Its vertices are  
      +
      +\[
      +A(-1,-1),\quad B(-1,38),\quad C(25,25).
      +\]
      +
      +The ordinary (planar) area is
      +
      +\[
      +\frac12\cdot|AB|\cdot|AC|_{\perp}= \frac12\,(39)\,(26)=507 .
      +\]
      +
      +---
      +
      +### 5.  Area on the plane \(x+y+z=75\)
      +
      +Multiplying by the factor \(\sqrt3\),
      +
      +\[
      +\text{area}=507\sqrt3 .
      +\]
      +
      +Thus \(a=507,\;b=3\) and
      +
      +\[
      +a+b=507+3=510 .
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +P=\prod_{k=4}^{63}\frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})}
      +\]
      +
      +---
      +
      +### 1.  Simplify one factor  
      +
      +\[
      +\log_k(5^{k^2-1})=\frac{\ln(5^{k^2-1})}{\ln k}
      +            =\frac{(k^2-1)\ln5}{\ln k},
      +\qquad
      +\log_{k+1}(5^{k^2-4})=\frac{(k^2-4)\ln5}{\ln(k+1)}.
      +\]
      +
      +Hence
      +
      +\[
      +\frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})}
      +   =\frac{k^2-1}{k^2-4}\cdot\frac{\ln(k+1)}{\ln k}.
      +\]
      +
      +So
      +
      +\[
      +P=\Bigl(\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}\Bigr)
      +   \Bigl(\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}\Bigr).
      +\]
      +
      +---
      +
      +### 2.  Telescoping the logarithm part  
      +
      +\[
      +\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}
      + =\frac{\ln5}{\ln4}\cdot\frac{\ln6}{\ln5}\cdots\frac{\ln64}{\ln63}
      + =\frac{\ln64}{\ln4}
      + =\log_4 64 =3 .
      +\]
      +
      +---
      +
      +### 3.  Telescoping the rational part  
      +
      +\[
      +\frac{k^2-1}{k^2-4}= \frac{(k-1)(k+1)}{(k-2)(k+2)}
      +   =\frac{k-1}{k-2}\cdot\frac{k+1}{k+2}.
      +\]
      +
      +Hence
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}
      + =\Bigl(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr)
      +   \Bigl(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr).
      +\]
      +
      +*First product*  
      +
      +Let \(i=k-2\). Then \(i\) runs from \(2\) to \(61\):
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      + =\prod_{i=2}^{61}\frac{i+1}{i}
      + =\frac{3}{2}\cdot\frac{4}{3}\cdots\frac{62}{61}
      + =\frac{62}{2}=31 .
      +\]
      +
      +*Second product*  
      +
      +Let \(j=k+1\). Then \(j\) runs from \(5\) to \(64\):
      +
      +\[
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      + =\prod_{j=5}^{64}\frac{j}{j+1}
      + =\frac{5}{6}\cdot\frac{6}{7}\cdots\frac{64}{65}
      + =\frac{5}{65}=\frac1{13}.
      +\]
      +
      +Thus
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}=31\cdot\frac1{13}=\frac{31}{13}.
      +\]
      +
      +---
      +
      +### 4.  Combine the two parts  
      +
      +\[
      +P = 3\cdot\frac{31}{13}= \frac{93}{13}.
      +\]
      +
      +The fraction \(\frac{93}{13}\) is already in lowest terms (\(\gcd(93,13)=1\)).
      +Thus \(m=93,\; n=13\) and
      +
      +\[
      +m+n = 93+13 = 106 .
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 –  what the conditions mean**
      +
      +In a \(3\times 9\) grid  
      +
      +* each of the three rows must be a permutation of the numbers \(1,\ldots ,9\);  
      +* each of the three \(3\times3\) blocks (columns \(1\!-\!3,\;4\!-\!6,\;7\!-\!9\)) must also contain the numbers \(1,\ldots ,9\) exactly once.
      +
      +Hence every digit appears
      +
      +* once in each row (3 times in total), and  
      +* once in each block (also 3 times in total).
      +
      +So for a fixed digit \(d\) the three positions where it occurs are determined by a
      +bijection between the three rows and the three blocks; i.e. a permutation
      +\(\sigma_d\in S_{3}\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 2 –  describing a filling by permutations**
      +
      +For the nine digits we obtain nine permutations  
      +
      +\[
      +\sigma_1,\sigma_2,\dots ,\sigma_9\in S_3 .
      +\]
      +
      +If \(\sigma_d(i)=j\) then digit \(d\) is placed in row \(i\) inside block \(j\).
      +For a fixed block–row cell \((i,j)\) there are three rows of the grid, hence it
      +must contain **exactly three** digits. Consequently for every cell \((i,j)\)
      +
      +\[
      +\#\{d\mid \sigma_d(i)=j\}=3 .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3 –  solving the integer system**
      +
      +Let  
      +
      +\[
      +\begin{aligned}
      +x_{\mathrm{id}}&=\#\{\sigma_d=\text{id}\},&
      +x_{12}&=\#\{\sigma_d=(12)\},\\
      +x_{13}&=\#\{\sigma_d=(13)\},&
      +x_{23}&=\#\{\sigma_d=(23)\},\\
      +x_{123}&=\#\{\sigma_d=(123)\},&
      +x_{132}&=\#\{\sigma_d=(132)\}.
      +\end{aligned}
      +\]
      +
      +Each permutation contributes a ‘1’ to three different cells; each cell is covered
      +by exactly two permutations. From (1) we obtain nine equations, e.g.
      +
      +\[
      +x_{\mathrm{id}}+x_{23}=3,\qquad
      +x_{12}+x_{123}=3,\qquad\ldots
      +\]
      +
      +Solving them gives
      +
      +\[
      +x_{12}=x_{13}=x_{23}=k,\qquad
      +x_{\mathrm{id}}=x_{123}=x_{132}=3-k,
      +\]
      +
      +where \(k\in\{0,1,2,3\}\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 4 –  assigning the permutations to the nine distinct digits**
      +
      +For a fixed \(k\) the number of ways to give the nine digits the required
      +multiplicities is the multinomial coefficient
      +
      +\[
      +\frac{9!}{k!^{\,3}\,(3-k)!^{\,3}} .
      +\]
      +
      +Summing over the four possible values of \(k\) gives
      +
      +\[
      +N=\sum_{k=0}^{3}\frac{9!}{k!^{\,3}(3-k)!^{\,3}}
      +   =2\cdot\frac{9!}{3!^{\,3}}+2\cdot\frac{9!}{1!^{\,3}2!^{\,3}}
      +   =1680+45360+45360+1680=94\,080 .
      +\]
      +
      +Thus there are \(94\,080\) ways to decide, for every digit, in which block of
      +each row it will appear.
      +
      +--------------------------------------------------------------------
      +
      +**Step 5 –  placing the digits inside the blocks**
      +
      +Fix a block \(j\).  
      +Row \(i\) contributes exactly three distinct digits to this block; they can be
      +arranged in the three columns of the block in \(3! = 6\) ways, independently for
      +the three rows. Hence a block can be filled in \((3!)^{3}=6^{3}=216\) ways.
      +
      +The three blocks are independent, so the column‑ordering factor is
      +
      +\[
      +(3!)^{9}=6^{9}=10\,077\,696 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 6 –  total number of fillings**
      +
      +\[
      +\boxed{T = N\cdot (3!)^{9}=94\,080\cdot 10\,077\,696
      +      = 948\,109\,639\,680 }.
      +\]
      +
      +Factorising,
      +
      +\[
      +T = 2^{16}\cdot 3^{10}\cdot 5\cdot 7^{2}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 7 –  computing the required sum**
      +
      +Take \(p=2,\;q=3,\;r=5,\;s=7\) with exponents
      +\(a=16,\;b=10,\;c=1,\;d=2\). Then
      +
      +\[
      +p\!a+q\!b+r\!c+s\!d
      +=2\cdot16+3\cdot10+5\cdot1+7\cdot2
      +=32+30+5+14=81 .
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +For  
      +
      +\[
      +f(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x},\qquad x>0,
      +\]
      +
      +let  
      +
      +\[
      +N(x)=(x-18)(x-72)(x-98)(x-k)=x^4-S_1x^3+S_2x^2-S_3x+S_4,
      +\]
      +
      +where  
      +
      +\[
      +\begin{aligned}
      +S_1&=18+72+98+k=188+k,\\[2pt]
      +S_2&=18\cdot72+18\cdot98+72\cdot98+ k(18+72+98)=10116+188k,\\[2pt]
      +S_4&=18\cdot72\cdot98\cdot k=127008\,k .
      +\end{aligned}
      +\]
      +
      +Then  
      +
      +\[
      +f(x)=\frac{N(x)}{x}=x^{3}-S_1x^{2}+S_2x-S_3+\frac{S_4}{x},
      +\]
      +
      +and  
      +
      +\[
      +f'(x)=\frac{3x^{4}-2S_1x^{3}+S_2x^{2}-S_4}{x^{2}} .
      +\]
      +
      +Hence the critical points are the (positive) roots of  
      +
      +\[
      +P(x)=3x^{4}-2S_1x^{3}+S_2x^{2}-S_4=0\tag{1}
      +\]
      +
      +(the denominator $x^{2}>0$ for $x>0$).
      +
      +Because $f(x)\to +\infty$ as $x\to0^{+}$ and as $x\to\infty$, the graph must
      +first decrease, then increase, then decrease, and finally increase again.
      +Thus (1) has three positive roots:
      +
      +* $x_1$ – a local **minimum** in the first negative interval,
      +* $x_2$ – a local **maximum** in the positive interval,
      +* $x_3$ – a second local **minimum** in the last negative interval.
      +
      +The global minimum is achieved at the lower of the two minima.
      +For the minimum to be attained **exactly at two points** we need  
      +
      +\[
      +f(x_1)=f(x_3)\qquad(\text{the two minima have the same value}).
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Translating the condition
      +
      +At a critical point $x$ we have $f'(x)=0$, i.e. $P(x)=0$.
      +From $f(x)=\dfrac{N(x)}{x}$ and $P(x)=0$ it follows that  
      +
      +\[
      +f(x)=\frac{N(x)}{x}=N'(x)\qquad\text{for any critical point}.
      +\tag{3}
      +\]
      +
      +Thus (2) is equivalent to  
      +
      +\[
      +N'(x_1)=N'(x_3).\tag{4}
      +\]
      +
      +Writing $x_1+ x_3=s$ and $x_1x_3=p$, the two equations $P(x_1)=P(x_3)=0$
      +give after elimination  
      +
      +\[
      +\begin{cases}
      +4(s^{2}-p)-3S_1s+2S_2=0,\\[2pt]
      +3(s^{3}-2ps)-2S_1(s^{2}-p)+S_2s=0.
      +\end{cases}\tag{5}
      +\]
      +
      +Equation (5) yields  
      +
      +\[
      +(2s-S_1)\Bigl(3s(s-S_1)+2S_2\Bigr)=0 .
      +\]
      +
      +Hence either  
      +
      +\[
      +\boxed{s=\dfrac{S_1}{2}} \qquad\text{or}\qquad
      +3s^{2}-3S_1s+2S_2=0. \tag{6}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  The case $s=S_1/2$
      +
      +From the first possibility in (6) we obtain  
      +
      +\[
      +p=\frac{4S_2-S_1^{2}}{8}.
      +\]
      +
      +Using $x_1x_2=p$ and $x_1+x_2=S_1/2$ the two minima are  
      +
      +\[
      +x_{1,3}= \frac{S_1\pm 2\sqrt{\,\Delta\,}}{4},
      +\qquad 
      +\Delta=\frac34k^{2}-94k+6276 .
      +\]
      +
      +Now we must also satisfy $P(x_1)=0$, which after substitution gives
      +
      +\[
      +(S_1^{2}-4S_2)^{2}=64S_4 .
      +\]
      +
      +With the explicit expressions for $S_1,S_2,S_4$ this becomes
      +
      +\[
      +(k^{2}-376k-5120)^{2}=8128512\,k,
      +\]
      +
      +or  
      +
      +\[
      +k^{4}-752k^{3}+131136k^{2}-4278272k+26214400=0.
      +\tag{7}
      +\]
      +
      +Factoring (7) gives  
      +
      +\[
      +(k-8)(k-32)(k-200)(k-512)=0 .
      +\]
      +
      +For a root to be admissible we need the two minima to lie in the
      +two negative intervals of $f$.  
      +The left minimum equals  
      +
      +\[
      +x_1=\frac{k+188-2\sqrt{\Delta}}{4},
      +\]
      +
      +which is **positive** only when  
      +
      +\[
      +k^{2}-376k-5120<0\qquad\Longleftrightarrow\qquad k<389\ldots .
      +\]
      +
      +Thus $k=512$ is rejected, while $k=8,\,32,\,200$ are valid.
      +
      +--------------------------------------------------------------------
      +### 3.  The second possibility in (6)
      +
      +The alternative equation $3s^{2}-3S_1s+2S_2=0$ together with the condition
      +$P(x_1)=0$ leads, after a completely analogous elimination, to the same
      +quartic (7).  Its admissible positive solutions are again $8,32,200$,
      +so no new $k$ appear.
      +
      +--------------------------------------------------------------------
      +### 4.  Conclusion
      +
      +The function $f$ has its global minimum attained at exactly two positive
      +points precisely for  
      +
      +\[
      +k\in\{8,\;32,\;200\}.
      +\]
      +
      +Therefore the required sum is  
      +
      +\[
      +8+32+200 = \boxed{240}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the four unit squares be  
      +
      +\[
      +\begin{array}{cc}
      +A& B\\
      +C& D
      +\end{array}
      +\]
      +
      +and denote by  
      +
      +* \(a=h_{0,1}\)   – the middle horizontal segment between \(A\) and \(C\);  
      +* \(b=h_{1,1}\)   – the middle horizontal segment between \(B\) and \(D\);  
      +* \(c=v_{1,0}\)   – the middle vertical segment between \(A\) and \(B\);  
      +* \(d=v_{1,1}\)   – the middle vertical segment between \(C\) and \(D\).
      +
      +The eight outer unit‑segments are written as  
      +
      +\[
      +\begin{aligned}
      +&e_1=h_{0,0},\qquad e_2=v_{0,0},\\
      +&e_3=v_{2,0},\qquad e_4=h_{1,0},\\
      +&e_5=h_{0,2},\qquad e_6=v_{0,1},\\
      +&e_7=v_{2,1},\qquad e_8=h_{1,2}.
      +\end{aligned}
      +\]
      +
      +All variables take the value 1 for a red side and 0 for a blue side.
      +
      +--------------------------------------------------------------------
      +### 1.  Equations for the squares  
      +
      +Each unit square must have exactly two red sides, so we obtain
      +
      +\[
      +\begin{aligned}
      +A:&\;e_1+e_2+a+c=2, \\
      +B:&\;e_3+e_4+b+c=2, \\
      +C:&\;e_5+e_6+a+d=2, \\
      +D:&\;e_7+e_8+b+d=2 .\qquad (1)
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Fix the interior edges  
      +
      +The four interior edges \(a,b,c,d\) are independent; there are \(2^4=16\) possible
      +choices.
      +For a fixed quadruple \((a,b,c,d)\) the right‑hand side of each equation in (1)
      +becomes  
      +
      +\[
      +s_A=2-(a+c),\; s_B=2-(b+c),\; s_C=2-(a+d),\; s_D=2-(b+d).
      +\]
      +
      +The numbers \(s_A,s_B,s_C,s_D\) are the required sums of the two
      +outer edges belonging to each square.
      +
      +*If \(s_i=0\) or \(s_i=2\):* the two outer edges are forced to be
      +\((0,0)\) or \((1,1)\) – exactly **one** possibility.
      +
      +*If \(s_i=1\):* the outer edges must be \((0,1)\) or \((1,0)\) – **two**
      +possibilities.
      +
      +Hence, for a given \((a,b,c,d)\) the number of admissible colourings of the
      +outer edges equals  
      +
      +\[
      +2^{\,N},\qquad N=\#\{i\in\{A,B,C,D\}:s_i=1\}.
      +\]
      +
      +But \(s_i=1\) occurs precisely when the two interior edges of that square sum to
      +\(1\); i.e.
      +
      +\[
      +N=[a\neq c]+[b\neq c]+[a\neq d]+[b\neq d],\tag{2}
      +\]
      +
      +where \([P]=1\) if the statement \(P\) is true and \(0\) otherwise.
      +
      +--------------------------------------------------------------------
      +### 3.  Summing over the interior edges  
      +
      +Write the sum we need as  
      +
      +\[
      +\sum_{a,b,c,d\in\{0,1\}} 2^{[a\neq c]+[b\neq c]+[a\neq d]+[b\neq d]}.
      +\]
      +
      +For fixed \(a,b\) the contributions of \(c\) and \(d\) factor:
      +
      +\[
      +\bigl(\sum_{c\in\{0,1\}}2^{[a\neq c]+[b\neq c]}\bigr)^2 .
      +\]
      +
      +Now compute the inner sum.
      +
      +*If \(a=b\) (either \((0,0)\) or \((1,1)\)):  
      +
      +\[
      +c=0\!:\;[a\neq c]+[b\neq c]=0,\qquad
      +c=1\!:\;[a\neq c]+[b\neq c]=2,
      +\]
      +so the sum equals \(2^{0}+2^{2}=1+4=5\).
      +
      +*If \(a\neq b\) (either \((0,1)\) or \((1,0)\)):  
      +
      +\[
      +c=0\!:\;[a\neq c]+[b\neq c]=1,\qquad
      +c=1\!:\;[a\neq c]+[b\neq c]=1,
      +\]
      +so the sum equals \(2^{1}+2^{1}=2+2=4\).
      +
      +Thus
      +
      +\[
      +\begin{aligned}
      +\text{total}&=
      +2\bigl(5^2\bigr)+2\bigl(4^2\bigr)        \\
      +&=2\cdot25+2\cdot16\\
      +&=50+32\\
      +&=82 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Answer  
      +
      +There are  
      +
      +\[
      +\boxed{82}
      +\]
      +
      +different colourings of the twelve unit segments such that each of the four
      +unit squares has exactly two red sides and two blue sides.
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(O\) be the centre of \(\omega _2\) (radius \(15\)),
      +* \(A\) be the centre of \(\omega _1\) (radius \(6\)),
      +* \(B\) the internal point of tangency.
      +
      +Place \(O\) at the origin and take the diameter \(BC\) on the \(x\)-axis.
      +
      +\[
      +O=(0,0),\qquad B=(15,0)
      +\]
      +
      +Because \(\omega_1\) is tangent internally at \(B\),
      +
      +\[
      +OA=15-6=9\qquad\Longrightarrow\qquad A=(9,0).
      +\]
      +
      +Since \(BC\) is a diameter of \(\omega _2\),
      +
      +\[
      +C=(-15,0).
      +\]
      +
      +\(AD\perp BC\) forces \(AD\) to be vertical through \(A\); intersecting this line with \(\omega _2\),
      +
      +\[
      +x=9,\qquad x^{2}+y^{2}=225\Longrightarrow y=\pm 12 .
      +\]
      +
      +Because the problem states that \(D\) is nearer to the side \(FG\) than to \(EH\), we take the point above the \(x\)-axis:
      +
      +\[
      +D=(9,12).
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 1.  The rectangle \(EFGH\)
      +
      +\(EF\perp BC\); with \(BC\) horizontal this makes \(EF\) vertical, so the rectangle is axis‑aligned.
      +Let its half–width be \(d>0\) and its half–height be \(h>0\).  
      +Since the rectangle is inscribed in \(\omega _1\) (centre \(A\)), its centre must coincide with \(A\).  
      +Thus the vertices are  
      +
      +\[
      +\begin{aligned}
      +E&=(9+d,\,-h),  &F&=(9+d,\,h),\\
      +G&=(9-d,\,h),   &H&=(9-d,\,-h).
      +\end{aligned}
      +\]
      +
      +Each vertex lies on \(\omega _1\):  
      +
      +\[
      +(x-9)^2+y^2=6^2\quad\Longrightarrow\quad d^{\,2}+h^{\,2}=36. \tag{1}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 2.  Equality of the two triangle areas
      +
      +*Triangle \(DGF\)*  
      +Its base \(GF\) is horizontal with length \(2d\); the height is the vertical distance from \(D\) to the line \(y=h\):
      +\[
      +[\,DGF\,]=\frac12\cdot (2d)\bigl(12-h\bigr)=d(12-h).
      +\]
      +
      +*Triangle \(CHG\)*  
      +Its base \(GH\) is vertical with length \(2h\); the height is the horizontal distance from \(C\) to the line \(x=9-d\):
      +\[
      +[\,CHG\,]=\frac12\cdot (2h)\bigl( (9-d)-(-15)\bigr)=h(24-d).
      +\]
      +
      +The condition \([DGF]=[CHG]\) gives  
      +
      +\[
      +d(12-h)=h(24-d)\;\Longrightarrow\;12d=24h\;\Longrightarrow\;d=2h. \tag{2}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 3.  Solving for \(d\) and \(h\)
      +
      +Substituting \(d=2h\) into (1):
      +
      +\[
      +(2h)^2+h^{2}=36\quad\Longrightarrow\quad5h^{2}=36
      +\quad\Longrightarrow\quad h^{2}=\frac{36}{5},\qquad 
      +h=\frac{6}{\sqrt5},\qquad d=2h=\frac{12}{\sqrt5}.
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 4.  Area of the rectangle
      +
      +\[
      +\text{Area}= (2d)(2h)=4dh=4(2h)h=8h^{2}=8\cdot\frac{36}{5}
      +=\frac{288}{5}.
      +\]
      +
      +Thus the area equals \(\dfrac{m}{n}\) with \(m=288,\;n=5\) (coprime).  
      +
      +\[
      +m+n=288+5=293.
      +\]
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Factor  
      +
      +\[
      +2025=3^{4}\cdot5^{2}.
      +\]
      +
      +A divisor of \(2025\) has the form \(3^{a}5^{b}\) with \(0\le a\le4,\ 0\le b\le2\).  
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15,
      +\qquad\text{total subsets}=2^{15}=32768 .
      +\]
      +
      +---
      +
      +### When does a subset have lcm \(=2025\)?
      +
      +The lcm of a set of divisors is \(3^{\max a}\cdot5^{\max b}\).  
      +Thus the lcm equals \(2025=3^{4}\cdot5^{2}\) **iff**
      +
      +* at least one element has exponent \(a=4\) (a divisor containing \(3^{4}\));
      +* at least one element has exponent \(b=2\) (a divisor containing \(5^{2}\)).
      +
      +---
      +
      +### Counting the desired subsets  
      +
      +Divisors with \(a=4\): \(3^{4}5^{b}\ (b=0,1,2)\) – 3 of them.  
      +Divisors with \(b=2\): \(3^{a}5^{2}\ (a=0,\dots ,4)\) – 5 of them.  
      +
      +Let  
      +
      +* \(X\) = subsets containing **no** divisor with \(a=4\);  
      +* \(Y\) = subsets containing **no** divisor with \(b=2\).
      +
      +\[
      +|X|=2^{12}\quad (\text{choose any of the other }12\text{ divisors}),\qquad
      +|Y|=2^{10}\quad (\text{choose any of the other }10\text{ divisors}).
      +\]
      +
      +Divisors lacking both \(a=4\) and \(b=2\) have \(a\le3,\ b\le1\); there are \(4\cdot2=8\) of them, so
      +
      +\[
      +|X\cap Y|=2^{8}.
      +\]
      +
      +Using inclusion–exclusion, the number of subsets that contain **both** an \(a=4\) divisor and a \(b=2\) divisor is  
      +
      +\[
      +N = 2^{15} - 2^{12} - 2^{10} + 2^{8}
      +    = 32768 - 4096 - 1024 + 256
      +    = 27904 .
      +\]
      +
      +These subsets are precisely the non‑empty subsets whose lcm equals \(2025\); the empty set is automatically excluded by the inclusion–exclusion count.
      +
      +---
      +
      +### Probability
      +
      +\[
      +\text{Probability} = \frac{N}{2^{15}} = \frac{27904}{32768}
      +                     = \frac{2^{8}\cdot 109}{2^{15}}
      +                     = \frac{109}{128}.
      +\]
      +
      +The fraction \(\frac{109}{128}\) is already in lowest terms, so  
      +
      +\[
      +m=109,\qquad n=128,\qquad m+n=237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\text{chairs}=1,2,\dots ,16,\qquad 8\ \text{people sit in 8 of them.}
      +\]
      +
      +The condition *no person sits next to two other people* means that no three
      +occupied chairs are consecutive.  
      +Hence we must count binary strings of length \(16\) with exactly eight 1’s
      +and no substring \(111\).
      +
      +---
      +
      +### 1.  Blocks of occupied chairs  
      +
      +Occupied chairs appear in blocks of length \(1\) or \(2\) (a block of length
      +\(3\) would give a person with two neighbours).  
      +
      +Let  
      +
      +* \(t\) = number of blocks of length \(2\);
      +* \(s\) = number of blocks of length \(1\).
      +
      +Then  
      +
      +\[
      +s+2t=8,\qquad r=s+t \text{ (total number of blocks)} .
      +\]
      +
      +Hence  
      +
      +\[
      +t=0,1,2,3,4,\qquad r=8-t\;(=8,7,6,5,4).
      +\]
      +
      +For a fixed \(t\) (hence fixed \(r\)) we must choose which of the \(r\) blocks
      +are the double ones:
      +
      +\[
      +\text{ways to choose the double blocks}= \binom{r}{t}= \binom{r}{8-r}.
      +\]
      +
      +---
      +
      +### 2.  Placing the blocks among the empty chairs  
      +
      +There are \(16-8=8\) empty chairs.  
      +Between the \(r\) blocks there must be at least one empty chair, using
      +\(r-1\) chairs.  
      +
      +The remaining empty chairs are  
      +
      +\[
      +8-(r-1)=9-r .
      +\]
      +
      +These \(9-r\) chairs can be placed arbitrarily in the \(r+1\) gaps
      +(before the first block, between successive blocks, after the last block).  
      +By stars‑and‑bars the number of ways is  
      +
      +\[
      +\binom{(9-r)+(r+1)-1}{(r+1)-1}= \binom{9}{r}.
      +\]
      +
      +---
      +
      +### 3.  Total number of admissible subsets  
      +
      +\[
      +\begin{aligned}
      +N&=\sum_{t=0}^{4} \binom{r}{t}\binom{9}{r},
      +\qquad r=8-t \\
      +  &=\sum_{r=4}^{8}\binom{r}{\,8-r\,}\binom{9}{r}.
      +\end{aligned}
      +\]
      +
      +Compute each term:
      +
      +\[
      +\begin{array}{c|c|c|c}
      +r & \binom{r}{8-r} & \binom{9}{r} & \text{product}\\ \hline
      +8 & 1 & 9   & 9\\
      +7 & 7 & 36  & 252\\
      +6 & 15& 84  & 1260\\
      +5 & 10& 126 & 1260\\
      +4 & 1 & 126 & 126
      +\end{array}
      +\]
      +
      +Adding them,
      +
      +\[
      +N = 9+252+1260+1260+126 = 2907.
      +\]
      +
      +---
      +
      +### 4.  Remainder modulo \(1000\)
      +
      +\[
      +2907 \equiv 907 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      To solve  
      +
      +\[
      +f(x)=\sin \bigl(7\pi \,\sin(5x)\bigr)=0 ,\qquad 0<x<2\pi 
      +\]
      +
      +let  
      +
      +\[
      +g(x)=7\pi\sin(5x).
      +\]
      +
      +Then  
      +
      +\[
      +f(x)=\sin(g(x))=0\iff g(x)=k\pi,\;k\in\mathbb Z .
      +\]
      +
      +Hence  
      +
      +\[
      +7\pi\sin(5x)=k\pi\Longrightarrow \sin(5x)=\frac{k}{7}.
      +\]
      +
      +Because \(|\sin(5x)|\le 1\), the integer \(k\) can be  
      +\(-7\le k\le 7\).
      +
      +---
      +
      +### 1. Counting the zeros (\(n\))
      +
      +Put \(y=5x\).  
      +When \(x\) runs from \(0\) to \(2\pi\), \(y\) runs from \(0\) to \(10\pi\).
      +
      +For a fixed value \(c=\frac{k}{7}\) we count the solutions of \(\sin y=c\) in the interval \((0,10\pi)\).
      +
      +* **\(c=0\) \;(i.e. \(k=0\)):**  
      +  \(\sin y=0\) ⇒ \(y=m\pi\).  
      +  In \((0,10\pi)\) we have \(m=1,2,\dots ,9\) → **9 solutions**.
      +
      +* **\(c=\pm1\) \;(i.e. \(k=\pm7\)):**  
      +  \(\sin y=1\) gives \(y=\frac{\pi}{2}+2\pi n\)  
      +  \(\sin y=-1\) gives \(y=\frac{3\pi}{2}+2\pi n\).  
      +  For \(n=0,1,2,3,4\) each set yields 5 points → **5+5 = 10 solutions**.
      +
      +* **\(c\) with \(|c|<1\) and \(c\neq0\) \;(i.e. \(k=\pm1,\dots ,\pm6\)):**  
      +  For any such \(c\) there are two solutions per period of sine.  
      +  The interval \((0,10\pi)\) contains five full periods, so we obtain **\(5\times2=10\) solutions** for each such \(k\).
      +
      +Now sum:
      +
      +\[
      +\begin{aligned}
      +n & =\underbrace{9}_{k=0}
      +   +\underbrace{12\times10}_{k=\pm1,\dots ,\pm6}
      +   +\underbrace{10}_{k=\pm7}\\[2mm]
      +  & = 9+120+10 = 139 .
      +\end{aligned}
      +\]
      +
      +Thus **\(n=139\)**.
      +
      +---
      +
      +### 2. When is the graph tangent to the \(x\)-axis? (\(t\))
      +
      +The graph is tangent at a zero when the derivative also vanishes:
      +
      +\[
      +f'(x)=\cos\bigl(7\pi\sin(5x)\bigr)\cdot 35\pi\cos(5x)=0 .
      +\]
      +
      +At the zeros we already have \(\sin(7\pi\sin(5x))=0\), i.e. \(7\pi\sin(5x)=k\pi\).  
      +Hence \(\cos\bigl(7\pi\sin(5x)\bigr)=\cos(k\pi)=(-1)^k\neq0\).
      +
      +Consequently \(f'(x)=0\) can only occur through \(\cos(5x)=0\).
      +
      +\[
      +\cos(5x)=0 \Longrightarrow 5x=\frac{\pi}{2}+m\pi
      +            \Longrightarrow x=\frac{(2m+1)\pi}{10},\qquad m\in\mathbb Z .
      +\]
      +
      +Within \(0<x<2\pi\) we have \(m=0,1,\dots ,9\), giving **10 distinct \(x\)** values.
      +
      +At each of these points \(\sin(5x)=\pm1\), so \(\sin(7\pi\sin(5x))=\sin(\pm7\pi)=0\); thus they are indeed zeros, and because the derivative also vanishes the graph is tangent there.
      +
      +Hence **\(t=10\)**.
      +
      +---
      +
      +### 3. Required sum
      +
      +\[
      +n+t = 139 + 10 = 149 .
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Answer:** \(\boxed{637}\)
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 637

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +x_i=A_1A_i\qquad (i=2,3,\ldots ,11),\qquad 
      +\theta=\angle A_iA_1A_{i+1}\;(2\le i\le10).
      +\]
      +
      +---
      +
      +### 1.  Using the area condition  
      +
      +\[
      +\text{Area}\bigl(A_iA_1A_{i+1}\bigr)=\frac12 x_i x_{i+1}\sin\theta =1 .
      +\]
      +
      +Because \(\cos\theta=\dfrac{12}{13}\),
      +
      +\[
      +\sin\theta=\sqrt{1-\Bigl(\frac{12}{13}\Bigr)^2}= \frac{5}{13}.
      +\]
      +
      +Thus  
      +
      +\[
      +\frac12 x_i x_{i+1}\cdot\frac{5}{13}=1
      +\Longrightarrow x_i x_{i+1}=\frac{26}{5}\qquad (2\le i\le10).
      +\tag{1}
      +\]
      +
      +Denote \(c=\dfrac{26}{5}\).  From (1) we have  
      +
      +\[
      +x_{i+1}= \frac{c}{x_i}.
      +\]
      +
      +Consequently  
      +
      +\[
      +x_{i+2}=x_i\qquad\Longrightarrow\qquad
      +\begin{cases}
      +x_{2}=x_{4}=x_{6}=x_{8}=x_{10}=a,\\[2pt]
      +x_{3}=x_{5}=x_{7}=x_{9}=x_{11}=b,
      +\end{cases}
      +\]
      +
      +with  
      +
      +\[
      +ab=c=\frac{26}{5}. \tag{2}
      +\]
      +
      +So the distances from \(A_1\) alternate between two values \(a\) and \(b\).
      +
      +---
      +
      +### 2.  Length of each side \(A_iA_{i+1}\;(2\le i\le10)\)
      +
      +In \(\triangle A_iA_1A_{i+1}\) the side opposite \(\theta\) is \(A_iA_{i+1}\).
      +By the law of cosines
      +
      +\[
      +A_iA_{i+1}^2 = x_i^2+x_{i+1}^2-2x_ix_{i+1}\cos\theta .
      +\]
      +
      +Because \(x_i\) and \(x_{i+1}\) are always one \(a\) and one \(b\),
      +
      +\[
      +A_iA_{i+1}^2 = a^2+b^2-2ab\cdot\frac{12}{13}.
      +\]
      +
      +Hence all nine sides \(A_iA_{i+1}\;(i=2,\dots ,10)\) have the same length; denote
      +
      +\[
      +d^2=a^2+b^2-\frac{24}{13}ab.
      +\tag{3}
      +\]
      +
      +Write \(s=a+b\).  Using \(ab=c\),
      +
      +\[
      +a^2+b^2=s^2-2ab=s^2-2c .
      +\]
      +
      +Substituting into (3),
      +
      +\[
      +d^2=s^2-2c-\frac{24}{13}c
      +    =s^2-c\Bigl(2+\frac{24}{13}\Bigr)
      +    =s^2-\frac{50}{13}c.
      +\]
      +
      +Since \(c=\dfrac{26}{5}\),
      +
      +\[
      +d^2=s^2-\frac{50}{13}\cdot\frac{26}{5}=s^2-20,
      +\qquad\text{so}\qquad d=\sqrt{s^{2}-20}.
      +\tag{4}
      +\]
      +
      +---
      +
      +### 3.  Use the perimeter
      +
      +The polygon has \(11\) sides: the two incident to \(A_1\) of lengths \(a\) and \(b\), and the nine equal sides of length \(d\).  
      +Given perimeter \(20\),
      +
      +\[
      +a+b+9d=s+9\sqrt{s^{2}-20}=20.
      +\tag{5}
      +\]
      +
      +Solve (5) for \(s\).
      +
      +\[
      +9\sqrt{s^{2}-20}=20-s\;(s\le20).
      +\]
      +
      +Square:
      +
      +\[
      +81(s^{2}-20)=(20-s)^{2}
      +\Longrightarrow 80s^{2}+40s-2020=0
      +\Longrightarrow 4s^{2}+2s-101=0.
      +\]
      +
      +Hence
      +
      +\[
      +s=\frac{-2\pm\sqrt{4+1616}}{8}
      +   =\frac{-2\pm18\sqrt5}{8}
      +   =\frac{-1\pm9\sqrt5}{4}.
      +\]
      +
      +Only the positive root is admissible:
      +
      +\[
      +\boxed{s=\frac{9\sqrt5-1}{4}}.
      +\]
      +
      +Thus  
      +
      +\[
      +A_1A_2+A_1A_{11}=a+b=s=\frac{9\sqrt5-1}{4}
      +      =\frac{m\sqrt n-p}{q},
      +\]
      +
      +with \(m=9,\;n=5,\;p=1,\;q=4\).
      +
      +---
      +
      +### 4.  Required sum
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Greedy representation**
      +
      +For a value \(N\) let  
      +
      +\[
      +q=\Big\lfloor\frac{N}{25}\Big\rfloor ,\qquad 
      +r=N-25q\;(0\le r\le 24).
      +\]
      +
      +After taking \(q\) quarters the greedy algorithm uses  
      +
      +\[
      +a=\Big\lfloor\frac{r}{10}\Big\rfloor ,\qquad 
      +b=r-10a\;(0\le b\le 9)
      +\]
      +
      +dimes and ones.  
      +Thus the greedy collection contains  
      +
      +\[
      +G(N)=q+a+b
      +\]
      +
      +coins.
      +
      +--------------------------------------------------------------------
      +
      +**When can a better collection exist?**
      +
      +Let a different collection use \(x\) quarters and \(y\) dimes
      +(\(z\) pennies fill the rest).  
      +Its total number of coins is  
      +
      +\[
      +C=x+y+z = x+y+(N-25x-10y)=N-(24x+9y).
      +\]
      +
      +Hence a representation is better than the greedy one iff it makes the
      +“saving”
      +
      +\[
      +S=24x+9y
      +\]
      +
      +larger than the greedy saving \(S_G = 24q+9a\).
      +
      +Suppose we start from the greedy solution and **remove** \(d\ge1\) quarters
      +(\(d\le q\)).  
      +The value we free is \(25d\).
      +With this extra value we can add as many dimes as possible:
      +
      +\[
      +y' = a+\Big\lfloor\frac{r+25d}{10}\Big\rfloor
      +      = a+\Big\lfloor 2.5d+\frac{b}{10}\Big\rfloor .
      +\]
      +
      +The new saving is  
      +
      +\[
      +S'=24(q-d)+9y'
      +   =24q+9a +\bigl[-24d+9\big\lfloor2.5d+\tfrac{b}{10}\big\rfloor\bigr].
      +\]
      +
      +Thus the new collection beats the greedy one precisely when  
      +
      +\[
      +-24d+9\Big\lfloor2.5d+\frac{b}{10}\Big\rfloor >0
      +\qquad\Longleftrightarrow\qquad
      +\Big\lfloor2.5d+\frac{b}{10}\Big\rfloor \ge
      +\Big\lfloor\frac{8}{3}d\Big\rfloor+1 .\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Only one quarter can ever help**
      +
      +For even \(d\) we have \(\big\lfloor2.5d\big\rfloor =2.5d\) and
      +\(\big\lfloor\frac{8}{3}d\big\rfloor =2.5d+\big\lfloor\frac{d}{6}\big\rfloor\).
      +Hence the left–hand side of (1) never exceeds the right–hand side,
      +so even \(d\) never improves the greedy solution.
      +
      +For odd \(d=2k+1\) we obtain  
      +
      +\[
      +\Big\lfloor2.5d+\frac{b}{10}\Big\rfloor
      +   =5k+2+{\bf 1}_{\{b\ge5\}},\qquad
      +\Big\lfloor\frac{8}{3}d\Big\rfloor
      +   =5k+2+\Big\lfloor\frac{k+2}{3}\Big\rfloor .
      +\]
      +
      +Consequently  
      +
      +\[
      +\Big\lfloor2.5d+\frac{b}{10}\Big\rfloor-
      +\Big\lfloor\frac{8}{3}d\Big\rfloor
      += {\bf 1}_{\{b\ge5\}}-\Big\lfloor\frac{k+2}{3}\Big\rfloor .
      +\]
      +
      +The right‑hand side is \(\ge 1\) only when \(k=0\) (that is, \(d=1\))
      +and \(b\ge5\).
      +Thus the **only** way to improve upon the greedy solution is to
      +replace **exactly one** quarter and have \(b\ge5\).
      +
      +--------------------------------------------------------------------
      +
      +**What does \(b\ge5\) mean?**
      +
      +Recall \(b\) is the number of pennies left after taking all possible
      +quarters and then all possible dimes.  Hence
      +
      +\[
      +b = N-25q-10a\in\{0,1,\dots ,9\}.
      +\]
      +
      +The condition \(b\ge5\) is equivalent to
      +
      +\[
      +N-25q\equiv 5,6,7,8,9\pmod{10},
      +\]
      +
      +or, more simply,
      +
      +\[
      +N\equiv 5,6,7,8,9\pmod{25}.
      +\]
      +
      +If \(q=0\) (i.e. \(N<25\)) there is no quarter to replace, so the greedy
      +algorithm is always optimal for \(1\le N\le24\).
      +
      +Hence **the greedy algorithm fails exactly for the numbers**
      +
      +\[
      +N\ge 25 \quad\text{with}\quad N\equiv 5,6,7,8,9\pmod{25}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Counting the successes**
      +
      +All integers \(1\le N\le1000\): 1000 of them.
      +
      +Numbers that cause failure:
      +
      +* The residues \(5,6,7,8,9\) each occur
      +  \(\bigl\lfloor\frac{1000-r}{25}\bigr\rfloor+1 = 40\) times for
      +  \(r=5,6,7,8,9\).
      +  Hence \(5\times40=200\) such numbers in \([1,1000]\).
      +
      +* The five smallest ones, \(5,6,7,8,9\), are \(<25\); they do **not**
      +  cause failure because no quarter can be replaced.
      +
      +Thus the genuine failures are \(200-5 = 195\) numbers.
      +
      +Consequently the number of values for which the greedy algorithm
      +succeeds is  
      +
      +\[
      +1000-195 = 805.
      +\]
      +
      +\[
      +\boxed{805}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 805

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the vertices of the regular \(24\)-gon be labelled  
      +
      +\[
      +0,1,2,\dots ,23\qquad (\text{mod }24).
      +\]
      +
      +If a segment connects vertex \(i\) to vertex \(j\) then its length is determined only by the
      +step  
      +
      +\[
      +k\equiv j-i\pmod{24},\qquad 1\le k\le 12 .
      +\]
      +
      +All \(12\) segments must have the same length, therefore they all have the same step \(k\) (the
      +step \(24-k\) gives the same length, so it is enough to consider \(k=1,2,\dots ,12\)).
      +
      +--------------------------------------------------------------------
      +### 1.  The graph for a fixed step \(k\)
      +
      +For a fixed \(k\) join each vertex \(i\) with the two vertices
      +\(i\pm k\).  The resulting graph \(G_k\) is a union of cycles:
      +
      +* Let \(d=\gcd(k,24)\).
      +* Each cycle has length \(\displaystyle L=\frac{24}{d}\) and there are \(d\) such
      +  cycles.
      +
      +Indeed the permutation \(i\mapsto i+k\) on \(\{0,\dots ,23\}\) consists of
      +\(d\) cycles of length \(L\).
      +
      +--------------------------------------------------------------------
      +### 2.  Perfect matchings of \(G_k\)
      +
      +A required drawing is a perfect matching of \(G_k\).
      +
      +* If a cycle has even length, it has exactly **2** perfect matchings
      +  (alternating edges).
      +* If a cycle has odd length, a perfect matching does **not** exist.
      +* The only exceptional case is \(k=12\); then each vertex has only one
      +  neighbour (its opposite) and the whole graph is already a perfect
      +  matching.
      +
      +Thus, for \(k\neq 12\),
      +
      +\[
      +\text{# matchings for }G_k=
      +\begin{cases}
      +2^{\,d} & \text{if }L\text{ is even},\\[2mm]
      +0       & \text{if }L\text{ is odd}.
      +\end{cases}
      +\]
      +
      +Since \(L\) is odd exactly when \(L=3\), i.e. when \(d=8\) (the only such
      +\(k\) is \(k=8\)), we have
      +
      +\[
      +N(k)=
      +\begin{cases}
      +2^{\gcd(k,24)} & \gcd(k,24)\neq 8,\;k\neq 12,\\[2mm]
      +0 & k=8,\\[2mm]
      +1 & k=12 .
      +\end{cases}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Evaluate for \(k=1,\dots ,12\)
      +
      +\[
      +\begin{array}{c|c|c|c}
      +k & \gcd(k,24) & \text{cycles} & N(k)\\ \hline
      +1 & 1 & 1\ \text{cycle of length }24 & 2\\
      +2 & 2 & 2\ \text{cycles of length }12 & 4\\
      +3 & 3 & 3\ \text{cycles of length }8  & 8\\
      +4 & 4 & 4\ \text{cycles of length }6  & 16\\
      +5 & 1 & 1\ \text{cycle of length }24 & 2\\
      +6 & 6 & 6\ \text{cycles of length }4  & 64\\
      +7 & 1 & 1\ \text{cycle of length }24 & 2\\
      +8 & 8 & 8\ \text{cycles of length }3  & 0\\
      +9 & 3 & 3\ \text{cycles of length }8  & 8\\
      +10& 2 & 2\ \text{cycles of length }12 & 4\\
      +11& 1 & 1\ \text{cycle of length }24 & 2\\
      +12&12 & 12\ \text{edges (pairs)}       & 1
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Sum over all possible lengths
      +
      +\[
      +\begin{aligned}
      +\sum_{k=1}^{12} N(k)
      +&=2+4+8+16+2+64+2+0+8+4+2+1\\
      +&=113 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{113}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a base \(b>9\),
      +
      +\[
      +17_{b}=1\cdot b+7=b+7 ,\qquad   
      +97_{b}=9\cdot b+7=9b+7 .
      +\]
      +
      +We need  
      +
      +\[
      +b+7 \mid 9b+7 .
      +\]
      +
      +Let \(d=b+7\;(>0)\). Then \(b=d-7\) and
      +
      +\[
      +9b+7 = 9(d-7)+7 = 9d-56 .
      +\]
      +
      +Hence  
      +
      +\[
      +d \mid (9d-56) \Longrightarrow d\mid 56 .
      +\]
      +
      +So \(d\) must be a positive divisor of \(56\).  
      +Since \(b>9\), we have \(d=b+7>9+7=16\).  
      +The divisors of \(56\) larger than \(16\) are
      +
      +\[
      +d=28,\;56 .
      +\]
      +
      +Corresponding bases are  
      +
      +\[
      +b=d-7:
      +\begin{cases}
      +d=28 \Rightarrow b=21,\\[2mm]
      +d=56 \Rightarrow b=49.
      +\end{cases}
      +\]
      +
      +Both satisfy \(b>9\) and indeed  
      +
      +\[
      +\frac{9b+7}{b+7}=7\;(b=21),\qquad 
      +\frac{9b+7}{b+7}=8\;(b=49).
      +\]
      +
      +Thus the integer bases are \(b=21\) and \(b=49\). Their sum is  
      +
      +\[
      +21+49=70.
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +The circle through the midpoints \(D,E,F\) of the sides of \(\triangle ABC\) is the **nine‑point circle** of \(\triangle ABC\).
      +Hence  
      +
      +* \(D,E,F\) are the vertices of the medial triangle,
      +* \(\angle D= \angle A=84^{\circ},\ \angle E= \angle B=60^{\circ},\ \angle F=\angle C=36^{\circ}\).
      +
      +Since the nine‑point circle is the circumcircle of \(\triangle DEF\),
      +
      +\[
      +\widehat{DE}=2\angle F=2\cdot 36^{\circ}=72^{\circ}.
      +\tag{1}
      +\]
      +
      +We must also determine the arcs \(\widehat{FG}\) and \(\widehat{HJ}\).
      +
      +---------------------------------------------------------------------
      +
      +### 1.  The arc \(\widehat{FG}\)
      +
      +\(G\) is the second intersection of the median \(BD\) with the nine‑point circle.
      +At point \(D\) the chord \(DG\) lies on the line \(BD\), while the chord \(DF\) is parallel to side \(AC\) (mid‑segment theorem).
      +
      +Therefore  
      +
      +\[
      +\angle FDG=\angle(\text{line } DF,\text{line } DG)
      +          =\angle(\,AC ,\,BD\,).
      +\]
      +
      +The angle between side \(AC\) and the median from \(B\) can be read directly from the triangle:
      +\( \angle(\,AC ,\,BD\,)=\angle C=36^{\circ}\).
      +
      +Consequently  
      +
      +\[
      +\widehat{FG}=2\angle FDG=2\cdot36^{\circ}=72^{\circ}.
      +\tag{2}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 2.  The arc \(\widehat{HJ}\)
      +
      +\(H\) and \(J\) are the second intersections of the sides \(AC\) and \(AB\) with the nine‑point circle.
      +Thus the two secants through the exterior point \(A\) intersect the circle at the pairs \(\{F,J\}\) and \(\{E,H\}\).
      +
      +For an exterior point the angle formed by two secants equals half the **difference** of the intercepted arcs:
      +
      +\[
      +\angle BAC=\frac12\bigl(\widehat{JH}-\widehat{FE}\bigr).
      +\tag{3}
      +\]
      +
      +We already know the arc \(\widehat{FE}\) of the nine‑point circle:
      +\[
      +\widehat{FE}=2\angle D =2\cdot 84^{\circ}=168^{\circ}.
      +\tag{4}
      +\]
      +
      +Plugging \(\angle BAC=84^{\circ}\) and (4) into (3) gives  
      +
      +\[
      +84^{\circ}=\frac12\bigl(\widehat{JH}-168^{\circ}\bigr)
      +\Longrightarrow \widehat{JH}=336^{\circ}.
      +\]
      +
      +The **minor** arc \(HJ\) is the complement of \(336^{\circ}\) on the circle:
      +
      +\[
      +\widehat{HJ}=360^{\circ}-336^{\circ}=24^{\circ}.
      +\tag{5}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 3.  Computing the required sum
      +
      +From (1), (2) and (5)
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +&=72^{\circ}+2\cdot24^{\circ}+3\cdot72^{\circ}  \\
      +&=72^{\circ}+48^{\circ}+216^{\circ}\\
      +&=336^{\circ}.
      +\end{aligned}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The nine players are distinct, so for a given triple \((c,v,s)\) (numbers of chocolate, vanilla, and strawberry cones) the number of assignments is  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +We must count all triples of positive integers satisfying  
      +
      +\[
      +c+v+s = 9,\qquad c>v>s\ge 1 .
      +\]
      +
      +---
      +
      +### Find the possible triples \((c,v,s)\)
      +
      +Because the three numbers are distinct and sum to 9, we list the partitions of 9 into three distinct positive parts:
      +
      +\[
      +\begin{aligned}
      +9 &= 6+2+1,\\
      +9 &= 5+3+1,\\
      +9 &= 4+3+2 .
      +\end{aligned}
      +\]
      +
      +These are the only triples with strict descending order, so  
      +
      +\[
      +(c,v,s) \in \{(6,2,1),\;(5,3,1),\;(4,3,2)\}.
      +\]
      +
      +---
      +
      +### Count assignments for each triple
      +
      +\[
      +\begin{aligned}
      +(6,2,1):\quad &\frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[4pt]
      +(5,3,1):\quad &\frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[4pt]
      +(4,3,2):\quad &\frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### Total number of assignments
      +
      +\[
      +N = 252 + 504 + 1260 = 2016.
      +\]
      +
      +---
      +
      +### Remainder modulo \(1000\)
      +
      +\[
      +2016 \equiv 16 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  What determines the number of regions?**  
      +
      +If we draw line‑segments in a disc and no three of them meet in a common interior point, then each new segment splits one existing region for every interior intersection it makes, plus one more region for the segment itself.  
      +Hence  
      +
      +\[
      +\#\text{regions}=1+(\#\text{segments})+(\#\text{interior intersection points}).
      +\]
      +
      +We have  
      +
      +* 2 diameters,
      +* 25 random chords,
      +* total segments \(=27\).
      +
      +So we need the **expected number of interior intersections**.
      +
      +---------------------------------------------------------------------
      +
      +**Step 2.  Intersections that are certain**
      +
      +The two diameters intersect at the centre ⇒ one interior intersection.
      +
      +---------------------------------------------------------------------
      +
      +**Step 3.  Intersections of a chord with the diameters**
      +
      +A chord is drawn by picking two points on the circle that lie in **different quadrants**.
      +
      +*If the two quadrants are adjacent* (e.g. quadrant I and II), the chord crosses **exactly one** diameter.  
      +*If the two quadrants are opposite* (e.g. quadrant I and III), the chord crosses **both** diameters.
      +
      +The unordered pair of distinct quadrants is uniformly chosen among the \(\binom{4}{2}=6\) possibilities:
      +
      +* 4 adjacent pairs → probability \(4/6=2/3\);
      +* 2 opposite pairs → probability \(2/6=1/3\).
      +
      +Hence for one random chord
      +
      +\[
      +E[\hbox{diameter‑intersections}]
      +  =\frac23\cdot1+\frac13\cdot2=\frac43 .
      +\]
      +
      +For the 25 chords  
      +
      +\[
      +E[I_{\text{chord–diameter}}]=25\cdot\frac43=\frac{100}{3}.
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 4.  Intersections between two random chords**
      +
      +Let the two chords be \(AB\) and \(CD\).  
      +Write \(L\) for the clockwise length of the arc from \(A\) to \(B\) (so \(0\le L\le2\pi\)).  
      +Let \(L_i^{(1)}\) be the length of that arc inside quadrant \(i\) (\(i=1,\dots ,4\)), and
      +\(L_i^{(2)}=\frac{\pi}{2}-L_i^{(1)}\) the length of the complementary arc inside the same quadrant.
      +
      +For a given chord \(AB\)
      +
      +* the probability that a random chord \(CD\) meets \(AB\) **and** has its endpoints in different quadrants is  
      +
      +\[
      +p_{\text{int}}(A,B)=
      +\frac{L(2\pi-L)-\displaystyle\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)}}{2\pi^{2}} .
      +\tag{1}
      +\]
      +
      +(The numerator is the area of the product set
      +\(\{(C,D):C\in\text{arc}_1,D\in\text{arc}_2\}\) minus the part where \(C\) and \(D\) fall in the same quadrant.)
      +
      +Define  
      +
      +\[
      +Q(A,B)=L(2\pi-L)-\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)} .
      +\]
      +
      +Then \(p_{\text{int}}(A,B)=Q(A,B)/(2\pi^{2})\).
      +
      +---------------------------------------------------------------------
      +
      +**Step 5.  Averaging \(Q\)**  
      +
      +Put the circle’s total length as \(4d\) with a quadrant length \(d=\pi/2\).
      +Write the clockwise length as a multiple of \(d\): \(t=L/d\in[0,4]\).
      +
      +For a fixed \(t\) and a uniformly random starting point of the arc,
      +the expected value of \(\sum_i (L_i^{(1)})^{2}\) (the sum of squares of the pieces of the arc) is
      +
      +\[
      +h(t)=
      +\begin{cases}
      +t^{2}-\dfrac{t^{3}}{3}, & 0\le t\le 1,\\[4pt]
      +t-\dfrac13,               & 1\le t\le 4 .
      +\end{cases}
      +\]
      +
      +Consequently  
      +
      +\[
      +E\!\left[\sum_i L_i^{(1)}L_i^{(2)}\right]
      +      =\frac{\pi}{2}E[L]-E\!\left[\sum_i(L_i^{(1)})^{2}\right]
      +      =\frac{\pi^{2}}{2}-\frac{27\pi^{2}}{64}
      +      =\frac{5\pi^{2}}{64}.
      +\]
      +
      +From this we obtain the unconditional expectation
      +
      +\[
      +E[Q]=E\!\bigl[L(2\pi-L)\bigr]-E\!\Bigl[\sum_i L_i^{(1)}L_i^{(2)}\Bigr]
      +      =\frac{2}{3}\pi^{2}-\frac{5}{64}\pi^{2}
      +      =\frac{113}{192}\pi^{2}.
      +\tag{2}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 6.  Conditioning on “different quadrants’’ for the first chord**
      +
      +If the first chord’s endpoints lie in the *same* quadrant (probability \(1/4\)),
      +then \(Q\) simplifies to \(Q=\frac{3\pi}{2}L\).  
      +Because the absolute difference of two points inside a quadrant has mean \(d/3=\pi/6\),
      +
      +\[
      +E[Q\mid\text{same quadrant}]=\frac{3\pi}{2}\cdot\frac{\pi}{6}
      +                              =\frac{\pi^{2}}{4}.
      +\]
      +
      +Hence  
      +
      +\[
      +E[Q\;{\bf 1}_{\text{different quadrants}}]
      +   =E[Q]-\frac14\cdot\frac{\pi^{2}}{4}
      +   =\frac{113}{192}\pi^{2}-\frac{\pi^{2}}{16}
      +   =\frac{101}{192}\pi^{2}. \tag{3}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 7.  Probability that two *valid* chords intersect**
      +
      +From (1) and (3),
      +
      +\[
      +\boxed{
      +P(\text{intersection } \&\; AB\text{ valid}\; \&\; CD\text{ valid})
      +    =\frac{E[Q\,{\bf 1}_{\text{different quadrants}}]}{2\pi^{2}}
      +    =\frac{101}{384}.
      +}
      +\]
      +
      +The event “both chords are valid’’ occurs with probability \((3/4)^{2}=9/16\).  
      +Therefore the conditional probability that two random valid chords intersect is
      +
      +\[
      +P_{\text{int}}=
      +\frac{101/384}{9/16}= \frac{101}{216}\approx0.4676.
      +\tag{4}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 8.  Expected number of chord–chord intersections**
      +
      +\[
      +E[I_{\text{chord–chord}}]
      +   =\binom{25}{2}\;P_{\text{int}}
      +   =300\cdot\frac{101}{216}
      +   =\frac{2525}{18}.
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 9.  Total expected interior intersections**
      +
      +\[
      +\begin{aligned}
      +E[I] &=
      +\underbrace{1}_{\text{diameters}}+
      +\underbrace{\frac{100}{3}}_{\text{chord–diameter}}+
      +\underbrace{\frac{2525}{18}}_{\text{chord–chord}} \\[4pt]
      +&= \frac{18+600+2525}{18}
      +   =\frac{3143}{18}.
      +\end{aligned}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +**Step 10.  Expected number of regions**
      +
      +\[
      +\begin{aligned}
      +E[\#\text{regions}]
      +&=1+(\#\text{segments})+E[I] \\
      +&=1+27+\frac{3143}{18}\\[4pt]
      +&=28+\frac{3143}{18}
      +   =\frac{504+3143}{18}
      +   =\boxed{\frac{3647}{18}}\; \approx 202.6 .
      +\end{aligned}
      +\]
      +
      +Thus, on average Alex’s 27 line segments partition the disk into \(\displaystyle \frac{3647}{18}\) regions.
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: None

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +---
      +
      +### 1.  Factor the quadratic  
      +
      +Look for integers \(a,b,c,d\) such that  
      +
      +\[
      +(ax+by)(cx+dy)=12x^{2}-xy-6y^{2}.
      +\]
      +
      +We need  
      +
      +\[
      +ac=12,\qquad bd=-6,\qquad ad+bc=-1 .
      +\]
      +
      +Taking \(a=4,\;c=3\) (since \(4\cdot 3=12\)) and trying \(b=-3,\;d=2\) gives  
      +
      +\[
      +bd=(-3)(2)=-6,\qquad ad+bc=4\cdot2+3\cdot(-3)=8-9=-1.
      +\]
      +
      +Hence  
      +
      +\[
      +12x^{2}-xy-6y^{2}=(4x-3y)(3x+2y).
      +\]
      +
      +So the original equation is equivalent to  
      +
      +\[
      +(4x-3y)(3x+2y)=0.
      +\]
      +
      +Thus any integer solution must satisfy one of the two linear equations  
      +
      +\[
      +\boxed{4x-3y=0}\qquad\text{or}\qquad\boxed{3x+2y=0}.
      +\]
      +
      +---
      +
      +### 2.  Solve each linear equation in integers  
      +
      +**(i) \(4x-3y=0\).**  
      +
      +\(4x=3y\Rightarrow y= \frac{4}{3}x\).  
      +Since \(\gcd(4,3)=1\), write \(x=3k,\;y=4k\) for some integer \(k\).
      +
      +Both coordinates must satisfy \(-100\le x,y\le 100\):
      +
      +\[
      +-100\le 3k\le 100 \Longrightarrow -\frac{100}{3}\le k\le \frac{100}{3},
      +\qquad
      +-100\le 4k\le 100 \Longrightarrow -25\le k\le 25.
      +\]
      +
      +The tighter bound is \(-25\le k\le 25\).  
      +Hence there are  
      +
      +\[
      +25-(-25)+1 = 51
      +\]
      +
      +solutions from this family.
      +
      +---
      +
      +**(ii) \(3x+2y=0\).**  
      +
      +\(3x=-2y\Rightarrow x=-\frac{2}{3}y\).  
      +Again \(\gcd(3,2)=1\), so write \(y=3m,\;x=-2m\) for some integer \(m\).
      +
      +Bounds:
      +
      +\[
      +-100\le -2m\le 100 \Longrightarrow -50\le m\le 50,
      +\qquad
      +-100\le 3m\le 100 \Longrightarrow -\frac{100}{3}\le m\le \frac{100}{3}
      +\Longrightarrow -33\le m\le 33.
      +\]
      +
      +Thus \(-33\le m\le 33\), giving  
      +
      +\[
      +33-(-33)+1 = 67
      +\]
      +
      +solutions from this family.
      +
      +---
      +
      +### 3.  Remove the double‑counted solution  
      +
      +The two families intersect only when both equations hold, i.e. when  
      +
      +\[
      +4x-3y=0\;\text{and}\;3x+2y=0\Longrightarrow (x,y)=(0,0).
      +\]
      +
      +So \((0,0)\) has been counted twice.  
      +
      +Total distinct ordered pairs:
      +
      +\[
      +51+67-1 = 117.
      +\]
      +
      +---
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(0,c)
      +\]
      +
      +with \(\angle A=90^{\circ}\) and \(BC=38\Rightarrow b^{2}+c^{2}=38^{2}=1444\).
      +
      +---
      +
      +### 1.  Locating \(K\) and \(L\)
      +
      +\(AK=BK=14\).  
      +The circles \(\odot(A,14)\) and \(\odot(B,14)\) intersect at the interior point  
      +
      +\[
      +K=\Bigl(\frac b2,\; \sqrt{196-\Bigl(\frac b2\Bigr)^2}\Bigr).
      +\]
      +
      +Similarly \(AL=CL=14\) gives  
      +
      +\[
      +L=\Bigl(\sqrt{196-\Bigl(\frac c2\Bigr)^2},\; \frac c2\Bigr).
      +\]
      +
      +Since \(AK=AL=KL=14\), points \(A,K,L\) form an equilateral triangle.
      +Put  
      +
      +\[
      +K=(14\cos\theta,14\sin\theta),\qquad 
      +L=(14\cos(\theta+60^\circ),14\sin(\theta+60^\circ)).
      +\]
      +
      +Using \(BK=14\) and \(CL=14\),
      +
      +\[
      +b=28\cos\theta,\qquad c=28\sin(\theta+60^\circ). \tag{1}
      +\]
      +
      +---
      +
      +### 2.  Determining \(\theta\)
      +
      +From \(b^2+c^2=1444\),
      +
      +\[
      +\cos^{2}\theta+\sin^{2}(\theta+60^\circ)=\frac{1444}{28^{2}}
      +        =\frac{361}{196}=\Bigl(\frac{19}{14}\Bigr)^{2}.
      +\]
      +
      +Using \(\cos^2x=\frac{1+\cos2x}{2},\ \sin^2x=\frac{1-\cos2x}{2}\),
      +
      +\[
      +\frac{2+\cos2\theta-\cos(2\theta+120^\circ)}2
      +      =\frac{361}{196}.
      +\]
      +
      +Simplifying gives  
      +
      +\[
      +\cos2\theta-\cos(2\theta+120^\circ)=\frac{165}{98}.
      +\]
      +
      +Since \(\cos A-\cos B=-2\sin\frac{A+B}{2}\sin\frac{A-B}{2}\),
      +
      +\[
      +\sqrt3\sin(2\theta+60^\circ)=\frac{165}{98}
      +   \Longrightarrow \sin(2\theta+60^\circ)=\frac{55\sqrt3}{98}.
      +\]
      +
      +Hence  
      +
      +\[
      +\cos(2\theta+60^\circ)=\frac{23}{98},\qquad 
      +\sin(2\theta+60^\circ)=\frac{55\sqrt3}{98}.
      +\]
      +
      +Let \(\phi=2\theta+60^\circ\). Then
      +
      +\[
      +\cos\phi=\frac{23}{98},\qquad \sin\phi=\frac{55\sqrt3}{98}.
      +\]
      +
      +Compute \(\cos(\phi-60^\circ)\) and \(\cos(\phi+60^\circ)\):
      +
      +\[
      +\cos(\phi-60^\circ)=\frac{47}{49},\qquad
      +\cos(\phi+60^\circ)=-\frac{71}{98}.
      +\]
      +
      +Now
      +
      +\[
      +\cos\theta=\sqrt{\frac{1+\cos(\phi-60^\circ)}2}
      +          =\sqrt{\frac{1+\frac{47}{49}}2}
      +          =\sqrt{\frac{48}{49}}=\frac{4\sqrt3}{7},
      +\]
      +
      +\[
      +\sin(\theta+60^\circ)=\sqrt{\frac{1-\cos(\phi+60^\circ)}2}
      +                     =\sqrt{\frac{1+\frac{71}{98}}2}
      +                     =\sqrt{\frac{169}{196}}=\frac{13}{14}.
      +\]
      +
      +Using (1),
      +
      +\[
      +b=28\cos\theta=28\cdot\frac{4\sqrt3}{7}=16\sqrt3,
      +\qquad
      +c=28\sin(\theta+60^\circ)=28\cdot\frac{13}{14}=26.
      +\]
      +
      +Thus  
      +
      +\[
      +AB=16\sqrt3,\qquad AC=26,\qquad BC=38.
      +\]
      +
      +Consequently  
      +
      +\[
      +K=\Bigl(\frac{b}{2},\sqrt{196-\Bigl(\frac b2\Bigr)^2}\Bigr)
      +  =\bigl(8\sqrt3,\;2\bigr),\qquad
      +L=\Bigl(\sqrt{196-\Bigl(\frac c2\Bigr)^2},\frac c2\Bigr)
      +  =\bigl(3\sqrt3,\;13\bigr).
      +\]
      +
      +---
      +
      +### 3.  Area of \(BKLC\)
      +
      +Using the shoelace formula for vertices  
      +
      +\[
      +B=(16\sqrt3,0),\; K=(8\sqrt3,2),\; L=(3\sqrt3,13),\; C=(0,26),
      +\]
      +
      +\[
      +\begin{aligned}
      +\sum x_iy_{i+1}&=16\sqrt3\cdot2+8\sqrt3\cdot13+3\sqrt3\cdot26+0\cdot0\\
      +               &=214\sqrt3,\\[2mm]
      +\sum y_ix_{i+1}&=0\cdot8\sqrt3+2\cdot3\sqrt3+13\cdot0+26\cdot16\sqrt3\\
      +               &=422\sqrt3.
      +\end{aligned}
      +\]
      +
      +Hence
      +
      +\[
      +\text{Area}(BKLC)=\frac12|214\sqrt3-422\sqrt3|=104\sqrt3.
      +\]
      +
      +---
      +
      +Thus the area of \(BKLC\) is \(104\sqrt3\), so  
      +
      +\[
      +\boxed{104}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid have parallel sides (bases) \(r\) and \(s\) \((r\neq s)\), the equal legs \(L\), and height \(h\).
      +
      +---
      +
      +### 1.  Height from the incircle  
      +
      +The circle of radius \(3\) is tangent to the two parallel sides, so the distance between those sides equals the sum of the distances from the centre to each side:
      +
      +\[
      +h = 3+3 = 6 .
      +\]
      +
      +---
      +
      +### 2.  Sum of the bases from the area  
      +
      +\[
      +\text{Area}= \frac{r+s}{2}\,h = 72
      +\quad\Longrightarrow\quad
      +\frac{r+s}{2}\cdot 6 = 72 \implies r+s = 24 .
      +\]
      +
      +---
      +
      +### 3.  Relation of the legs (tangential quadrilateral)  
      +
      +A quadrilateral has an incircle iff the sums of opposite sides are equal.  
      +For the trapezoid the opposite sides are the two bases and the two legs, so
      +
      +\[
      +r+s = L+L \;\Longrightarrow\; L =\frac{r+s}{2}=12 .
      +\]
      +
      +Thus each leg has length \(L=12\).
      +
      +---
      +
      +### 4.  Difference of the bases from the leg length  
      +
      +Because the trapezoid is isosceles, each leg together with the height forms a right triangle whose horizontal leg is \(\dfrac{|s-r|}{2}\):
      +
      +\[
      +L^{2}=h^{2}+ \left(\frac{s-r}{2}\right)^{2}.
      +\]
      +
      +Insert \(L=12,\;h=6\):
      +
      +\[
      +12^{2}=6^{2}+ \left(\frac{s-r}{2}\right)^{2}
      +\Longrightarrow 144-36 = \left(\frac{s-r}{2}\right)^{2}
      +\Longrightarrow \left(\frac{s-r}{2}\right)^{2}=108.
      +\]
      +
      +Hence  
      +
      +\[
      +|s-r| = 2\sqrt{108}=12\sqrt3 .
      +\]
      +
      +Assume \(s>r\); then \(s-r=12\sqrt3\).
      +
      +---
      +
      +### 5.  Solve for \(r\) and \(s\)
      +
      +\[
      +\begin{cases}
      +r+s = 24,\\
      +s-r = 12\sqrt3.
      +\end{cases}
      +\qquad\Longrightarrow\qquad
      +\begin{aligned}
      +s &= 12+6\sqrt3,\\
      +r &= 12-6\sqrt3.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 6.  Compute \(r^{2}+s^{2}\)
      +
      +\[
      +\begin{aligned}
      +r^{2}+s^{2} &= (12-6\sqrt3)^{2}+(12+6\sqrt3)^{2} \\
      +&= \bigl(144-144\sqrt3+108\bigr)+\bigl(144+144\sqrt3+108\bigr) \\
      +&= 252-144\sqrt3+252+144\sqrt3 \\
      +&= 504.
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For an 8‑digit number using each of the digits \(1,2,\dots ,8\) exactly once  
      +
      +\[
      +22=2\cdot11
      +\]
      +
      +so the number must be divisible by \(2\) **and** by \(11\).
      +
      +---
      +
      +### 1.  Divisibility by \(2\)
      +
      +The units digit must be even, i.e. one of \(\{2,4,6,8\}\).
      +
      +---
      +
      +### 2.  Divisibility by \(11\)
      +
      +For an 8‑digit number \(a_1a_2\ldots a_8\),
      +
      +\[
      +(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\equiv 0\pmod{11}.
      +\]
      +
      +Let  
      +
      +\[
      +S_{\text{odd}}=a_1+a_3+a_5+a_7,\qquad 
      +S_{\text{even}}=a_2+a_4+a_6+a_8 .
      +\]
      +
      +Since the digits \(1\) through \(8\) sum to \(36\),
      +
      +\[
      +S_{\text{odd}}+S_{\text{even}}=36\qquad\text{and}\qquad 
      +S_{\text{odd}}-S_{\text{even}}\equiv0\pmod{11}.
      +\]
      +
      +Thus  
      +
      +\[
      +2S_{\text{odd}}\equiv36\equiv3\pmod{11}\Longrightarrow
      +S_{\text{odd}}\equiv7\pmod{11}.
      +\]
      +
      +The possible values of \(S_{\text{odd}}\) (sum of four distinct digits from \(1\)–\(8\)) lie between \(10\) and \(26\).  
      +The only value in this interval congruent to \(7\pmod{11}\) is \(18\).
      +
      +Hence
      +
      +\[
      +S_{\text{odd}}=S_{\text{even}}=18 .
      +\]
      +
      +So the four digits placed in the odd positions must sum to \(18\).
      +
      +---
      +
      +### 3.  4‑digit subsets with sum \(18\)
      +
      +All 4‑element subsets of \(\{1,\dots ,8\}\) whose sum is \(18\) are  
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are exactly \(8\) such subsets.  
      +Each contains **exactly two even digits** (the even digits are \(2,4,6,8\)).
      +
      +---
      +
      +### 4.  Arranging the digits
      +
      +* Choose one of the 8 subsets for the odd positions.
      +* Permute its four digits among the odd places \((1,3,5,7)\) – \(4! = 24\) ways.
      +* The remaining four digits occupy the even places \((2,4,6,8)\).  
      +
      +  The units place (position 8) must be even.  
      +  Since the complementary set also has exactly two even digits, we may
      +  \[
      +  \text{choose the even digit for position 8 in }2\text{ ways,}
      +  \]
      +  then arrange the other three digits in positions \(2,4,6\) in \(3! = 6\) ways.
      +
      +Hence for a given subset the number of valid permutations is  
      +
      +\[
      +24 \times (2 \times 6)=24 \times 12 = 288 .
      +\]
      +
      +With \(8\) possible subsets,
      +
      +\[
      +N = 8 \times 288 = 2304 .
      +\]
      +
      +---
      +
      +### 5.  Required difference
      +
      +\[
      +N-2025 = 2304-2025 = 279 .
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +describes the circle  
      +
      +\[
      +\text{Center }C=(25,20),\qquad\text{radius }R=5 .
      +\]
      +
      +The second equation  
      +
      +\[
      +|z-4-k|=|z-3i-k|
      +\]
      +
      +states that the distance from \(z\) to the point  
      +
      +\[
      +A=4+k\;(=k+4+0i)
      +\]
      +
      +equals its distance to the point  
      +
      +\[
      +B=3i+k\;(=k+0i+3i).
      +\]
      +
      +Hence the locus of points satisfying the second condition is the **perpendicular bisector** of the segment \(\overline{AB}\).
      +
      +---
      +
      +### 1.  Equation of the perpendicular bisector
      +
      +Coordinates:
      +
      +\[
      +A=(k+4,0),\qquad B=(k,3).
      +\]
      +
      +Midpoint  
      +
      +\[
      +M=\Big(\frac{k+4+k}{2},\frac{0+3}{2}\Big)=\Big(k+2,\frac32\Big).
      +\]
      +
      +Slope of \(\overline{AB}\):
      +
      +\[
      +\frac{3-0}{k-(k+4)}=\frac{3}{-4}=-\frac34 .
      +\]
      +
      +Therefore the slope of the perpendicular bisector is the negative reciprocal,
      +
      +\[
      +m=\frac{4}{3}.
      +\]
      +
      +Using point–slope form through \(M\):
      +
      +\[
      +y-\frac32=\frac{4}{3}(x-(k+2)).
      +\]
      +
      +Multiplying by \(6\),
      +
      +\[
      +6y-9=8x-8k-16\qquad\Longrightarrow\qquad 8x-6y=8k+7.
      +\]
      +
      +Thus the line is  
      +
      +\[
      +L:\;8x-6y=8k+7 .
      +\]
      +
      +---
      +
      +### 2.  Tangency condition
      +
      +The system has **exactly one** solution \(z\) when the line \(L\) is tangent to the circle.  
      +The distance from the center \(C=(25,20)\) to \(L\) must equal the radius \(5\).
      +
      +For a line \(Ax+By+C=0\), the distance from \((x_0,y_0)\) is  
      +
      +\[
      +d=\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} .
      +\]
      +
      +Write \(L\) as \(8x-6y-(8k+7)=0\). Then
      +
      +\[
      +d=\frac{|8\cdot25-6\cdot20-(8k+7)|}{\sqrt{8^2+(-6)^2}}
      +   =\frac{|200-120-8k-7|}{\sqrt{64+36}}
      +   =\frac{|73-8k|}{10}.
      +\]
      +
      +Set \(d=R=5\):
      +
      +\[
      +\frac{|73-8k|}{10}=5 \;\Longrightarrow\; |73-8k|=50 .
      +\]
      +
      +Hence  
      +
      +\[
      +73-8k=50 \quad\text{or}\quad 73-8k=-50.
      +\]
      +
      +Solving:
      +
      +\[
      +\begin{aligned}
      +73-8k=50 &\Rightarrow 8k=23 \Rightarrow k=\frac{23}{8},\\[2mm]
      +73-8k=-50 &\Rightarrow 8k=123 \Rightarrow k=\frac{123}{8}.
      +\end{aligned}
      +\]
      +
      +Both values give a line tangent to the circle, so the system has exactly one complex solution for each.
      +
      +---
      +
      +### 3.  Sum of all possible \(k\)
      +
      +\[
      +\frac{23}{8}+\frac{123}{8}=\frac{146}{8}=\frac{73}{4}.
      +\]
      +
      +Write \(\frac{73}{4}\) as \(\frac{m}{n}\) with \(\gcd(m,n)=1\); here \(m=73,\;n=4\).
      +
      +\[
      +m+n=73+4=77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The recurrence  
      +
      +\[
      +x_{k+1}= \frac{1}{3}\Bigl(x_k+\frac{1}{x_k}-1\Bigr)
      +\]
      +
      +can be rewritten as  
      +
      +\[
      +x_{k+1}= \frac{x_k^2-x_k+1}{3x_k}.
      +\]
      +
      +---
      +
      +### 1.  A convenient change of variables  
      +
      +Define  
      +
      +\[
      +t_k=\frac{2x_k-1}{x_k+1}\qquad\Longleftrightarrow\qquad 
      +x_k=\frac{b_k+a_k}{2b_k-a_k},
      +\]
      +
      +where \(a_k,b_k\) are integers defined below.  
      +
      +From the definition  
      +
      +\[
      +t_{k+1}=t_k\bigl(t_k-1\bigr),\qquad t_1=\frac{13}{12}.
      +\]
      +
      +---
      +
      +### 2.  Integer sequences  
      +
      +Write \(t_k=\dfrac{a_k}{b_k}\) in lowest terms.  
      +From \(t_{k+1}=t_k(t_k-1)\) we obtain  
      +
      +\[
      +a_{k+1}=a_k\bigl(a_k-b_k\bigr),\qquad  
      +b_{k+1}=b_k^2,\qquad a_1=13,\;b_1=12 .
      +\]
      +
      +Thus  
      +
      +\[
      +b_k=12^{\,2^{\,k-1}} .
      +\]
      +
      +Because \(a_k\) is always odd and not a multiple of \(3\), \(\gcd(a_k,b_k)=1\) for all \(k\).
      +
      +---
      +
      +### 3.  Expressing \(x_k\)  
      +
      +Using \(x_k=\dfrac{b_k+a_k}{2b_k-a_k}\) we get  
      +
      +\[
      +m_k=b_k+a_k,\qquad n_k=2b_k-a_k,
      +\]
      +so that  
      +
      +\[
      +m_k+n_k = (b_k+a_k)+(2b_k-a_k)=3b_k .
      +\]
      +
      +Hence for any \(k\),
      +
      +\[
      +m_k+n_k = 3\cdot 12^{\,2^{\,k-1}} .
      +\]
      +
      +---
      +
      +### 4.  The required term  
      +
      +For \(k=2025\),
      +
      +\[
      +m+n = 3\cdot 12^{\,2^{\,2024}} .
      +\]
      +
      +We need this number modulo \(1000\).
      +
      +---
      +
      +### 5.  Computing \(3\cdot12^{2^{2024}}\pmod{1000}\)
      +
      +Since \(1000=8\cdot125\), work modulo \(8\) and \(125\).
      +
      +*Modulo 8*: \(12\equiv4\pmod8\) and \(4^2\equiv0\pmod8\); with exponent \(2^{2024}>1\),
      +
      +\[
      +12^{2^{2024}}\equiv0\pmod8\Longrightarrow
      +3\cdot12^{2^{2024}}\equiv0\pmod8 .
      +\]
      +
      +*Modulo 125*: \(\gcd(12,125)=1\), \(\phi(125)=100\).  
      +Reduce the exponent modulo 100:
      +
      +\[
      +2^{2024}\equiv 2^{4}=16\pmod{100}
      +\]
      +(because \(2^{2024}\equiv16\pmod{100}\)).  
      +Hence  
      +
      +\[
      +12^{2^{2024}}\equiv12^{16}\pmod{125}.
      +\]
      +
      +Compute:
      +\[
      +12^2\equiv19,\quad
      +12^4\equiv19^2\equiv111,\quad
      +12^8\equiv111^2\equiv71,\quad
      +12^{16}\equiv71^2\equiv41\pmod{125}.
      +\]
      +
      +Thus  
      +
      +\[
      +3\cdot12^{2^{2024}}\equiv3\cdot41=123\pmod{125}.
      +\]
      +
      +Now solve  
      +
      +\[
      +R\equiv0\pmod8,\qquad R\equiv123\pmod{125}.
      +\]
      +
      +Write \(R=125a+123\). Mod 8:
      +
      +\[
      +125a+123\equiv5a+3\equiv0\pmod8\Longrightarrow5a\equiv5\pmod8
      +\Longrightarrow a\equiv1\pmod8.
      +\]
      +
      +Take \(a=1\); then \(R=125\cdot1+123=248\).
      +
      +Hence  
      +
      +\[
      +m+n\equiv 248 \pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{248}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +AD=4,\; DE=16,\; EB=8,\qquad AF=13,\; FG=52,\; GC=26 .
      +\]
      +
      +Hence  
      +
      +\[
      +AB=4+16+8=28,\qquad AC=13+52+26=91 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates
      +
      +Place \(A=(0,0),\; B=(28,0)\) and let the height of \(\triangle ABC\) be \(h\).  
      +Write \(C=(x,h)\) (the \(x\)‑coordinate is unknown).
      +
      +Points on the sides are then  
      +
      +\[
      +\begin{aligned}
      +D&=(4,0),   &E&=(20,0), \\
      +F&=\Bigl(\frac{13}{91}x,\;\frac{13}{91}h\Bigr), &
      +G&=\Bigl(\frac{65}{91}x,\;\frac{65}{91}h\Bigr).
      +\end{aligned}
      +\]
      +
      +Since \(M\) is the reflection of \(D\) about \(F\),
      +
      +\[
      +M=2F-D=\Bigl(\frac{26}{91}x-4,\;\frac{26}{91}h\Bigr),
      +\]
      +
      +and because \(N\) is the reflection of \(G\) about \(E\),
      +
      +\[
      +N=2E-G=\Bigl(40-\frac{65}{91}x,\;-\frac{65}{91}h\Bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Height from the given area
      +
      +Quadrilateral \(DEGF\) consists of triangles \(DEG\) and \(DFG\).  
      +Its area is
      +
      +\[
      +\begin{aligned}
      +[DEGF]&=\frac12\Bigl[\,DE\cdot G_y
      +      +|\,\overrightarrow{DF}\times\overrightarrow{DG}\,|\,\Bigr]\\[2mm]
      +     &=\frac{h}{2\cdot91}\Bigl(16\cdot65+4\cdot52\Bigr)
      +      =\frac{1248}{182}\,h
      +      =\frac{624}{91}\,h .
      +\end{aligned}
      +\]
      +
      +Given \([DEGF]=288\),
      +
      +\[
      +\frac{624}{91}\,h=288\quad\Longrightarrow\quad h=42 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Area of \(\triangle ABC\)
      +
      +\[
      +[ABC]=\frac12\cdot AB\cdot h
      +      =\frac12\cdot28\cdot42
      +      =588 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of the heptagon \(AFNBCEM\)
      +
      +Use the shoelace formula with the vertices in the order  
      +
      +\[
      +A,\;F,\;N,\;B,\;C,\;E,\;M .
      +\]
      +
      +Because the \(x\)-coordinate \(x\) of \(C\) appears only in the
      +terms \(x\,h\) and they cancel each other, the sum reduces to  
      +
      +\[
      +\begin{aligned}
      +S&=2\bigl( -\tfrac{2\cdot13}{91} (4+16)h
      +          + (4+16+8)h
      +          + (4+16+8)h
      +          - (4+16)h \bigr) \\
      +  &=2\cdot 28h .
      +\end{aligned}
      +\]
      +
      +Hence
      +
      +\[
      +[AFNBCEM]=\frac12 S = \frac12\cdot28h = [ABC]=588 .
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The original parabola is  
      +
      +\[
      +y=x^{2}-4 .
      +\]
      +
      +Rotate it \(60^{\circ}\) counter‑clockwise about the origin.  
      +If \((X,Y)\) is a point on the rotated parabola, then rotating it back
      +\(60^{\circ}\) (clockwise) must put it on the original parabola:
      +
      +\[
      +\begin{aligned}
      +x &= X\cos60^{\circ}+Y\sin60^{\circ},\\
      +y &=-X\sin60^{\circ}+Y\cos60^{\circ},
      +\end{aligned}
      +\qquad\text{with }\;y=x^{2}-4 .
      +\]
      +
      +Using \(\cos60^{\circ}= \tfrac12,\; \sin60^{\circ}= \tfrac{\sqrt3}{2}\),
      +
      +\[
      +-\,\frac{\sqrt3}{2}X+\frac12Y= \Bigl(\frac12X+\frac{\sqrt3}{2}Y\Bigr)^{2}-4 .
      +\tag{1}
      +\]
      +
      +The original parabola gives \(Y=X^{2}-4\). Substituting this into (1) and
      +clearing denominators yields
      +
      +\[
      +3X^{4}+2\sqrt3\,X^{3}-25X^{2}-6\sqrt3\,X+40=0 .
      +\tag{2}
      +\]
      +
      +The quartic factors over \(\mathbb{Q}(\sqrt3)\):
      +
      +\[
      +\bigl(X^{2}+\sqrt3\,X-4\bigr)\bigl(3X^{2}-\sqrt3\,X-10\bigr)=0 .
      +\]
      +
      +Hence the possible \(X\)-coordinates are the roots of the two quadratics.
      +
      +* From \(X^{2}+\sqrt3X-4=0\) :
      +
      +\[
      +X=\frac{-\sqrt3\pm\sqrt{19}}{2}.
      +\]
      +
      +The positive root is  
      +
      +\[
      +X_{0}= \frac{-\sqrt3+\sqrt{19}}{2}\approx1.31,
      +\]
      +
      +which satisfies \(0<X<2\); thus the point \((X_{0},Y_{0})\) lies in the
      +fourth quadrant.
      +
      +* The other quadratic \(3X^{2}-\sqrt3X-10=0\) gives \(X\approx2.14\) or
      +\(X\approx-1.56\), neither of which lies in the fourth quadrant.
      +
      +Therefore the unique fourth‑quadrant intersection comes from
      +\(X_{0}\).  For this root we have from the quadratic
      +
      +\[
      +X_{0}^{2}=4-\sqrt3 X_{0},
      +\qquad\text{so}\qquad
      +Y_{0}=X_{0}^{2}-4=-\sqrt3 X_{0}.
      +\]
      +
      +Thus
      +
      +\[
      +Y_{0}= -\sqrt3\left(\frac{-\sqrt3+\sqrt{19}}{2}\right)
      +     =\frac{3-\sqrt{57}}{2}.
      +\]
      +
      +The \(y\)-coordinate is \(\displaystyle\frac{a-\sqrt b}{c}\) with  
      +
      +\[
      +a=3,\qquad b=57,\qquad c=2.
      +\]
      +
      +Since \(\gcd(3,2)=1\), the conditions are satisfied.  
      +
      +\[
      +a+b+c=3+57+2=62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The periodic function  
      +
      +\[
      +f(x)=\begin{cases}
      +x,&x\in[-1,1)\\[2pt]
      +2-x,&x\in[1,3)
      +\end{cases},
      +\qquad f(x+4)=f(x)
      +\]
      +
      +has period \(4\).  
      +On each period write  
      +
      +\[
      +x=4k+u,\qquad u\in[-1,3),\ k\in\mathbb Z .
      +\]
      +
      +Then  
      +
      +\[
      +f(x)=\begin{cases}
      +u, & u\in[-1,1)\\[2pt]
      +2-u,&u\in[1,3)
      +\end{cases}.
      +\]
      +
      +The parabola is \(x=34y^{2}\;(x\ge 0,\;|y|\le 1)\).  
      +Set \(x=34y^{2}=4k+u\) with \(u\in[-1,3)\).  
      +The integer \(k\) is uniquely determined by  
      +
      +\[
      +\frac{34y^{2}-3}{4}<k\le\frac{34y^{2}+1}{4},
      +\]
      +
      +so for each \(y\) there is exactly one such \(k\).
      +
      +---
      +
      +### 1.  Rising part \((u\in[-1,1))\)
      +
      +Here \(y=u\).  Hence  
      +
      +\[
      +y=34y^{2}-4k\Longrightarrow 34y^{2}-y-4k=0.
      +\]
      +
      +For a fixed \(k\) the two roots are  
      +
      +\[
      +y_{R,k}^{\pm}= \frac{1\pm\sqrt{1+544k}}{68},
      +\qquad k=0,1,\dots ,8 .
      +\]
      +
      +Both lie in \([-1,1]\) for all these \(k\).  
      +Each pair sums to  
      +
      +\[
      +y_{R,k}^{+}+y_{R,k}^{-}= \frac1{34}.
      +\]
      +
      +Thus  
      +
      +\[
      +\sum_{k=0}^{8}\bigl(y_{R,k}^{+}+y_{R,k}^{-}\bigr)=\frac{9}{34}.
      +\]
      +
      +---
      +
      +### 2.  Falling part \((u\in[1,3))\)
      +
      +Here \(y=2-u\).  Hence  
      +
      +\[
      +y=2-(34y^{2}-4k)\Longrightarrow 34y^{2}+y-(4k+2)=0.
      +\]
      +
      +The roots are  
      +
      +\[
      +y_{D,k}^{\pm}= \frac{-1\pm\sqrt{273+544k}}{68},
      +\qquad k=0,1,\dots ,8 .
      +\]
      +
      +For \(k=0,\dots ,7\) both roots lie in \([-1,1]\); for \(k=8\) the
      +negative root is \(<-1\) and must be discarded.
      +Each admissible pair sums to  
      +
      +\[
      +y_{D,k}^{+}+y_{D,k}^{-}= -\frac1{34},
      +\]
      +
      +so for \(k=0,\dots ,7\)
      +
      +\[
      +\sum_{k=0}^{7}\bigl(y_{D,k}^{+}+y_{D,k}^{-}\bigr)= -\frac{8}{34}
      += -\frac{4}{17}.
      +\]
      +
      +The remaining root (the positive one for \(k=8\)) is  
      +
      +\[
      +y_{D,8}^{+}= \frac{-1+ \sqrt{273+544\cdot8}}{68}
      +          = \frac{-1+ \sqrt{4625}}{68}
      +          = \frac{-1+5\sqrt{185}}{68}.
      +\]
      +
      +---
      +
      +### 3.  Sum of all \(y\)-coordinates
      +
      +Adding the contributions,
      +
      +\[
      +\begin{aligned}
      +S &=\frac{9}{34}-\frac{4}{17}+\frac{-1+5\sqrt{185}}{68}\\[2pt]
      +  &=\frac{9}{34}-\frac{8}{34}+\frac{-1}{68}+\frac{5\sqrt{185}}{68}\\[2pt]
      +  &=\frac{1}{34}-\frac{1}{68}+\frac{5\sqrt{185}}{68}\\[2pt]
      +  &=\frac{1+5\sqrt{185}}{68}.
      +\end{aligned}
      +\]
      +
      +Thus the sum can be written as \(\displaystyle\frac{a+b\sqrt{c}}{d}\) with  
      +
      +\[
      +a=1,\qquad b=5,\qquad c=185,\qquad d=68,
      +\]
      +
      +where \(\gcd(a,b,d)=1\) and \(c\) is square‑free.
      +
      +Finally  
      +
      +\[
      +a+b+c+d=1+5+185+68=259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The required sum is  
      +
      +\[
      +\min_{X\in \mathbb {R}^2}\bigl(AX+BX+CX+DX+EX\bigr)
      +=38+19\sqrt{3}.
      +\]
      +
      +Hence  
      +
      +\[
      +m=38,\qquad n=19,\qquad p=3,
      +\]
      +
      +and  
      +
      +\[
      +m+n+p=38+19+3=60.
      +\]
      +
      +\[
      +\boxed{60}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 60

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the rows be \(R_{1},R_{2},R_{3}\) and the three \(3\times3\) blocks be
      +\(B_{1},B_{2},B_{3}\) (columns \(1\!-\!3,\;4\!-\!6,\;7\!-\!9\)).
      +Each number \(x\in\{1,\dots ,9\}\) appears
      +
      +* once in each row,
      +* once in each block.
      +
      +Hence for a fixed number \(x\) the three occurrences give a bijection  
      +
      +\[
      +\sigma _x:\{R_1,R_2,R_3\}\longrightarrow \{B_1,B_2,B_3\},
      +\qquad 
      +\sigma_x(R_i)=\text{the block containing }x\text{ in row }R_i .
      +\]
      +
      +Thus \(\sigma_x\) is a permutation of \(\{1,2,3\}\).  
      +Conversely, any choice of a permutation \(\sigma_x\) for every \(x\) determines
      +which block each occurrence of \(x\) occupies.
      +
      +--------------------------------------------------------------------
      +### 1.  Counting the permutations \(\sigma_x\)
      +
      +Write a \(9\times3\) matrix whose rows are the six possible permutations of
      +\(\{1,2,3\}\):
      +
      +\[
      +\begin{array}{c}
      +123\\ 213\\ 321\\ 132\\ 231\\ 312
      +\end{array}
      +\]
      +
      +If a number receives a given permutation, that row of the matrix is placed in
      +the matrix of size \(9\times3\).  
      +Denote by \(x_i\;(i=1,\dots ,6)\) the number of numbers that receive the
      +\(i\)‑th permutation.  
      +
      +Row‑balance (each number uses each symbol once) is automatic; column‑balance
      +(because each block must contain exactly three numbers in each row) gives
      +
      +\[
      +\begin{aligned}
      +x_1+x_4&=3,\qquad x_2+x_5=3,\qquad x_3+x_6=3,\\
      +x_2+x_6&=3,\qquad x_1+x_3=3,\qquad x_4+x_5=3,
      +\end{aligned}
      +\]
      +
      +with \(\sum_{i=1}^6x_i=9\).
      +Solving gives a one‑parameter family
      +
      +\[
      +(x_1,x_2,x_3,x_4,x_5,x_6)=\bigl(3-t,\;t,\;t,\;t,\;3-t,\;3-t\bigr)
      +\qquad(t=0,1,2,3).
      +\]
      +
      +For a fixed \(t\) the numbers are assigned to the six permutation types in  
      +
      +\[
      +\frac{9!}{(t!)^3\bigl((3-t)!\bigr)^3}
      +\]
      +
      +ways.  Summing over the four possible values of \(t\),
      +
      +\[
      +N_{\sigma}= \frac{9!}{(3!)^3}+\frac{9!}{(1!)^3(2!)^3}
      +          +\frac{9!}{(2!)^3(1!)^3}+\frac{9!}{(3!)^3}
      +          =94\,080 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Placing the numbers inside the blocks
      +
      +Fix the block‑row distribution given by the \(\sigma_x\)’s.
      +In each block, a row contains exactly three different numbers.
      +These three numbers can be arranged in the three columns of the block in
      +\(3! = 6\) ways, independently for the three rows.
      +Hence each block offers \(6^{3}=216\) possibilities, and for the three blocks
      +
      +\[
      +N_{\text{cols}} = 6^{9}=10\,077\,696 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Total number of fillings
      +
      +\[
      +N = N_{\sigma}\,N_{\text{cols}}
      +   = 94\,080 \times 6^{9}
      +   = 948\,109\,639\,680 .
      +\]
      +
      +Prime factorising,
      +
      +\[
      +N = 2^{16}\cdot 3^{10}\cdot 5^{1}\cdot 7^{2}.
      +\]
      +
      +Thus we may take  
      +
      +\[
      +p=2,\;a=16,\qquad q=3,\;b=10,\qquad r=5,\;c=1,\qquad s=7,\;d=2 .
      +\]
      +
      +Finally,
      +
      +\[
      +p a+ q b+ r c+ s d
      += 2\cdot16 + 3\cdot10 + 5\cdot1 + 7\cdot2
      += 32+30+5+14 = 81 .
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\{A,B,\dots ,L\}= \{1,2,\dots ,12\}
      +\]
      +
      +and let a random pairing be a perfect matching of the 12 numbers.
      +For each pair \(\{a,b\}\;(a<b)\) we write the word \(ab\);  
      +the six words are then listed in alphabetical order.  
      +
      +--------------------------------------------------------------------
      +### 1.  What determines the last word?
      +
      +In each pair the smaller letter is written first, so the six words are
      +
      +\[
      +\{\,\underbrace{\text{smaller}}_{\text{first letter}},\ \text{larger}\,\}.
      +\]
      +
      +If we denote by  
      +
      +\[
      +S=\{\,\min\{a,b\}\mid\{a,b\}\text{ a pair}\,\},
      +\]
      +
      +then \(|S|=6\) and the last (lexicographically largest) word is the
      +pair whose **smaller** element is the largest element of \(S\).
      +
      +Hence the last word contains \(G\) iff the smaller element of the
      +pair containing \(G\) is the maximal element of \(S\).
      +
      +--------------------------------------------------------------------
      +### 2.  Condition on the partner of \(G\)
      +
      +Let the partner of \(G\;(=7)\) be \(j\neq7\).
      +
      +*If \(j>7\):* then the smaller element of the \(G\)–pair is \(7\).  
      +We need that every other pair have its smaller element \(\le 6\); i.e.
      +all the other five “smaller” letters must lie in \(\{1,\dots ,6\}\).
      +
      +*If \(j<7\):* then the smaller element of the \(G\)–pair is \(j\).  
      +We need that every other smaller element be \(<j\); consequently all
      +the remaining five smaller letters must be taken from \(\{1,\dots ,j-1\}\).
      +
      +--------------------------------------------------------------------
      +### 3.  Counting matchings that satisfy the condition
      +
      +After fixing the partner \(j\) we have 10 letters left.
      +Let  
      +
      +\[
      +L=\{\text{remaining letters }<j\},\qquad H=\{\text{remaining letters }\ge j\}.
      +\]
      +
      +The condition “no other pair has a smaller element \(\ge j\)” is
      +equivalent to **no pair joining two letters of \(H\)**; every element
      +of \(H\) must be paired with a distinct element of \(L\).
      +
      +If \(|L|=l\) and \(|H|=h\) (\(l+h=10\)), the number of perfect matchings
      +with no \(H\!-\!H\) pair is
      +
      +\[
      +\binom{l}{h}h!\,(l-h-1)!!\;,
      +\]
      +
      +where \((2k-1)!!=1\cdot3\cdots(2k-1)\).
      +The total number of matchings on 10 letters is \((10-1)!!=945\).
      +
      +---
      +
      +* **\(j>7\) (five possibilities)**  
      +  Here \(j\in\{8,9,10,11,12\}\).  
      +  We have \(L=\{1,\dots ,6\}\;(l=6),\ H=\) the four other numbers \(>7\)
      +  \((h=4)\).  
      +
      +  \[
      +  \frac{\binom{6}{4}4!\,(6-4-1)!!}{945}
      +  =\frac{15\cdot24\cdot1}{945}=\frac{8}{21}.
      +  \]
      +
      +* **\(j=6\)**  
      +  Then \(L=\{1,\dots ,5\},\ H=\{8,9,10,11,12\}\) (\(l=h=5\)).  
      +
      +  \[
      +  \frac{\binom{5}{5}5!\,(5-5-1)!!}{945}
      +  =\frac{5!}{945}=\frac{120}{945}=\frac{8}{63}.
      +  \]
      +
      +* **\(j=1,2,3,4,5\)**  
      +  In these cases \(h>l\); it is impossible to avoid an \(H\!-\!H\) pair,
      +  so the probability is \(0\).
      +
      +--------------------------------------------------------------------
      +### 4.  Assemble the total probability
      +
      +Each of the 11 possible partners of \(G\) is equally likely (\(1/11\)).
      +Therefore
      +
      +\[
      +\begin{aligned}
      +P(\text{last word contains }G)
      +&= \frac1{11}\Bigl(5\cdot\frac{8}{21}+\frac{8}{63}\Bigr)\\[2mm]
      +&= \frac1{11}\Bigl(\frac{120}{63}+\frac{8}{63}\Bigr)\\[2mm]
      +&= \frac{128}{693}.
      +\end{aligned}
      +\]
      +
      +The fraction \(\displaystyle\frac{128}{693}\) is already in lowest terms.
      +Hence  
      +
      +\[
      +m=128,\qquad n=693,\qquad m+n=821.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +P(n)=3(n+3)(n^{2}+9).
      +\]
      +
      +We need all positive integers \(n\) for which  
      +
      +\[
      +n+2 \mid P(n).
      +\]
      +
      +---
      +
      +### 1. Work modulo \(n+2\)
      +
      +Write \(n\equiv -2 \pmod{\,n+2\,}\).  
      +Replace \(n\) by \(-2\) in the factors of \(P(n)\) (this gives the remainder of each factor modulo \(n+2\)):
      +
      +\[
      +\begin{aligned}
      +n+3 &\equiv (-2)+3 = 1 \pmod{n+2},\\[2mm]
      +n^{2}+9 &\equiv (-2)^{2}+9 = 4+9 = 13 \pmod{n+2}.
      +\end{aligned}
      +\]
      +
      +Hence
      +
      +\[
      +P(n)=3(n+3)(n^{2}+9)\equiv 3\cdot 1\cdot 13 = 39\pmod{n+2}.
      +\]
      +
      +---
      +
      +### 2. Condition for divisibility
      +
      +The requirement \(n+2\mid P(n)\) is equivalent to  
      +
      +\[
      +P(n)\equiv 0\pmod{n+2}\Longleftrightarrow 39\equiv 0\pmod{n+2}.
      +\]
      +
      +Thus  
      +
      +\[
      +n+2 \text{ must be a positive divisor of } 39.
      +\]
      +
      +The positive divisors of \(39\) are  
      +
      +\[
      +1,\;3,\;13,\;39.
      +\]
      +
      +Since \(n\) is a **positive** integer, \(n+2\ge 3\).  
      +Hence \(n+2\) can be only \(3,\;13,\;39\).
      +
      +---
      +
      +### 3. Corresponding values of \(n\)
      +
      +\[
      +\begin{array}{c|c}
      +n+2 & n \\ \hline
      +3   & 1\\
      +13  & 11\\
      +39  & 37
      +\end{array}
      +\]
      +
      +All three satisfy the original condition (a quick check confirms divisibility).
      +
      +---
      +
      +### 4. Sum of all such \(n\)
      +
      +\[
      +1+11+37 = 49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      We place the six collinear points on the \(x\)-axis.
      +
      +---
      +
      +### 1.  Determine the coordinates of \(A,B,C,D,E,F\)
      +
      +Let \(A=(0,0)\).  
      +Write the distances in terms of the unknown coordinate \(AB=x\).
      +
      +\[
      +\begin{aligned}
      +C&: AC=26 \quad\Longrightarrow\quad C=(26,0)\\
      +B&: AB=x \quad\Longrightarrow\quad B=(x,0)\\
      +D&: BD=22 \quad\Longrightarrow\quad D=(x+22,0)\\
      +E&: CE=31 \quad\Longrightarrow\quad E=(26+31,0)=(57,0)\\
      +F&: DF=33 \quad\Longrightarrow\quad F=(x+22+33,0)=(x+55,0)\\
      +\text{and }AF&=73 \Longrightarrow x+55=73 .
      +\end{aligned}
      +\]
      +
      +Hence \(x=18\). So  
      +
      +\[
      +A=0,\; B=18,\; C=26,\; D=40,\; E=57,\; F=73 .
      +\]
      +
      +These satisfy all given segment lengths.
      +
      +---
      +
      +### 2.  Locate point \(G\)
      +
      +Let \(G=(u,v)\) with \(v\neq 0\).  
      +From the given distances
      +
      +\[
      +\begin{cases}
      +(u-26)^2+v^2 = 40^2 =1600,\\[2pt]
      +(u-40)^2+v^2 = 30^2 = 900 .
      +\end{cases}
      +\]
      +
      +Subtract the second equation from the first:
      +
      +\[
      +(u-26)^2-(u-40)^2 = 700 .
      +\]
      +
      +Expanding,
      +
      +\[
      +(-52u+676)-(-80u+1600)=28u-924=700
      +\Longrightarrow 28u=1624\Longrightarrow u=58 .
      +\]
      +
      +Now find \(v\):
      +
      +\[
      +(58-26)^2+v^2=1600\Longrightarrow 32^2+v^2=1600
      +\Longrightarrow v^2=1600-1024=576 .
      +\]
      +
      +Thus \(|v|=24\).  Take \(v=24\) (the sign does not affect the area).  
      +
      +\[
      +\boxed{G=(58,24)} .
      +\]
      +
      +---
      +
      +### 3.  Area of \(\triangle BGE\)
      +
      +Points on the \(x\)-axis:
      +
      +\[
      +B=(18,0),\qquad E=(57,0).
      +\]
      +
      +The length of the base \(BE\) is
      +
      +\[
      +BE = 57-18 = 39 .
      +\]
      +
      +Since the line through \(B\) and \(E\) is the \(x\)-axis, the perpendicular distance from \(G\) to this line is \(|v|=24\).
      +
      +Hence
      +
      +\[
      +[\triangle BGE]=\frac12\,(BE)\cdot(\text{height})
      +               =\frac12\cdot 39\cdot 24
      +               =\frac{936}{2}=468 .
      +\]
      +
      +(Using the determinant formula also gives \(468\).)
      +
      +---
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The inequalities  
      +
      +\[
      +x-yz<y-zx<z-xy
      +\]
      +
      +can be rewritten by factoring:
      +
      +\[
      +\begin{aligned}
      +x-yz<y-zx &\iff (x-y)(1+z)<0,\\[2pt]
      +y-zx<z-xy &\iff (y-z)(1+x)<0 .
      +\end{aligned}
      +\]
      +
      +Since the points lie on the plane  
      +
      +\[
      +x+y+z=75\qquad\Longrightarrow\qquad z=75-x-y,
      +\]
      +
      +the two conditions become inequalities in the variables \(x,y\):
      +
      +\[
      +\begin{cases}
      +(x-y)\bigl(76-x-y\bigr)<0,\\[2pt]
      +\bigl(x+2y-75\bigr)(1+x)<0 .
      +\end{cases}
      +\tag{1}
      +\]
      +
      +---
      +
      +### 1.  Geometry of the half‑planes
      +
      +From (1)
      +
      +* \((x-y)(76-x-y)<0\) gives either  
      +
      +  \[
      +  \begin{cases}
      +  x>y,\;x+y>76 \quad\text{(region }A_1)\\
      +  \text{or}\\
      +  x<y,\;x+y<76 \quad\text{(region }A_2)
      +  \end{cases}
      +  \]
      +
      +* \((x+2y-75)(1+x)<0\) gives either  
      +
      +  \[
      +  \begin{cases}
      +  x<-1,\;x+2y>75 \quad\text{(region }B_1)\\
      +  \text{or}\\
      +  x>-1,\;x+2y<75 \quad\text{(region }B_2)
      +  \end{cases}
      +  \]
      +
      +The set of points satisfying both inequalities is the intersection of one of the
      +\(A_i\) with one of the \(B_j\).
      +
      +Checking the four possibilities:
      +
      +* \(A_1\cap B_1=\varnothing\) (impossible to have \(x>y\) and \(x<-1\) while
      +  \(x+y>76\)).
      +* \(A_1\cap B_2\) is non‑empty and unbounded (e.g. \(x>77\)).
      +* \(A_2\cap B_1\) is non‑empty and unbounded (e.g. \(x<-1\)).
      +* \(A_2\cap B_2\) is bounded.
      +
      +Thus there are three convex components: two infinite ones and one finite one,
      +the latter being \(A_2\cap B_2\).
      +
      +---
      +
      +### 2.  The finite region
      +
      +\(A_2\cap B_2\) is described by  
      +
      +\[
      +\begin{cases}
      +x>-1,\\
      +x<y,\\
      +x+2y<75 .
      +\end{cases}
      +\]
      +
      +From \(x+2y<75\) we have \(y<(75-x)/2\).  
      +Together with \(y>x\) we obtain
      +
      +\[
      +-1<x<25,\qquad x<y<\frac{75-x}{2}.
      +\]
      +
      +The three bounding lines intersect at
      +
      +\[
      +\begin{aligned}
      +x=-1 \ \text{and}\ y=x&\;&\Rightarrow\;(-1,-1),\\
      +x=-1 \ \text{and}\ x+2y=75&\;&\Rightarrow\;(-1,38),\\
      +y=x \ \text{and}\ x+2y=75&\;&\Rightarrow\;(25,25).
      +\end{aligned}
      +\]
      +
      +Hence the finite region is the interior of the triangle with vertices  
      +\((-1,-1),\;(-1,38),\;(25,25)\).
      +
      +Its area in the \(xy\)-plane is
      +
      +\[
      +\text{Area}_{xy}
      +=\frac12\cdot\text{base}\cdot\text{height}
      +=\frac12\cdot 39\cdot 26 =507 .
      +\]
      +
      +---
      +
      +### 3.  Area on the plane \(x+y+z=75\)
      +
      +The map \((x,y)\mapsto (x,y,75-x-y)\) sends the \(xy\)-plane onto the given
      +plane.  The area is scaled by the factor
      +
      +\[
      +\bigl|\partial_{x}(x,y,z)\times\partial_{y}(x,y,z)\bigr|
      +=|(1,0,-1)\times(0,1,-1)|
      +=|(1,1,1)|
      +=\sqrt{3}.
      +\]
      +
      +Thus the area of the finite region on the plane is
      +
      +\[
      +\text{Area}= \sqrt{3}\times 507 = 507\sqrt{3}.
      +\]
      +
      +---
      +
      +The required form is \(a\sqrt{b}\) with \(a=507,\;b=3\).  Hence
      +
      +\[
      +a+b = 507+3 = 510.
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +P=\prod_{k=4}^{63}\frac{\log_k\!\big(5^{\,k^2-1}\big)}{\log_{k+1}\!\big(5^{\,k^2-4}\big)}
      +\]
      +
      +---
      +
      +### 1.  Change of base  
      +
      +\[
      +\log_a b=\frac{\ln b}{\ln a}
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +\log_k\!\big(5^{k^2-1}\big)&=\frac{(k^2-1)\ln5}{\ln k},\\[2mm]
      +\log_{k+1}\!\big(5^{k^2-4}\big)&=\frac{(k^2-4)\ln5}{\ln(k+1)} .
      +\end{aligned}
      +\]
      +
      +Therefore each factor of the product is
      +
      +\[
      +\frac{(k^2-1)\ln5/\ln k}{(k^2-4)\ln5/\ln(k+1)}
      += \frac{k^2-1}{k^2-4}\cdot\frac{\ln(k+1)}{\ln k}.
      +\]
      +
      +Thus  
      +
      +\[
      +P=\Bigg(\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}\Bigg)
      +   \Bigg(\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}\Bigg).
      +\]
      +
      +---
      +
      +### 2.  Telescoping the logarithmic part  
      +
      +\[
      +\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}
      + =\frac{\ln5}{\ln4}\cdot\frac{\ln6}{\ln5}\cdots\frac{\ln64}{\ln63}
      + =\frac{\ln64}{\ln4}
      + =\log_4 64 = 3 .
      +\]
      +
      +---
      +
      +### 3.  Simplify the rational part  
      +
      +\[
      +\frac{k^2-1}{k^2-4}
      + =\frac{(k-1)(k+1)}{(k-2)(k+2)}
      + =\frac{k-1}{k-2}\cdot\frac{k+1}{k+2}.
      +\]
      +
      +Hence  
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}
      + =\Bigg(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigg)
      +  \Bigg(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigg).
      +\]
      +
      +*First product*  
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      + =\frac{3}{2}\cdot\frac{4}{3}\cdot\frac{5}{4}\cdots\frac{62}{61}
      + =\frac{62}{2}=31 .
      +\]
      +
      +*Second product*  
      +
      +\[
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      + =\frac{5}{6}\cdot\frac{6}{7}\cdot\frac{7}{8}\cdots\frac{64}{65}
      + =\frac{5}{65}= \frac{1}{13}.
      +\]
      +
      +Thus the rational part equals  
      +
      +\[
      +31\cdot\frac{1}{13}= \frac{31}{13}.
      +\]
      +
      +---
      +
      +### 4.  Combine the two parts  
      +
      +\[
      +P=\frac{31}{13}\times 3 = \frac{93}{13}.
      +\]
      +
      +The fraction \(\frac{93}{13}\) is already in lowest terms, so  
      +
      +\[
      +m=93,\qquad n=13,\qquad m+n=93+13=106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(a_{1},a_{2}\) be the two **vertical** interior unit segments (the left–right dividing line),  
      +* \(b_{1},b_{2}\) be the two **horizontal** interior unit segments (the bottom–top dividing line).
      +
      +The eight outer–boundary unit segments belong to only one square, while each interior segment belongs to two squares.
      +
      +---
      +
      +### 1.  Equations for the four unit squares  
      +
      +Denote by \(L_1 ,D_1\) the left and bottom edges of the lower‑left square, etc.  
      +Writing a red edge as \(1\) and a blue edge as \(0\), the condition “exactly two red sides’’ for each square gives  
      +
      +\[
      +\begin{aligned}
      +L_1 + D_1 + a_{1}+ b_{1} &=2,\\
      +D_2 + R_2 + a_{1}+ b_{2} &=2,\\
      +L_3 + T_3 + a_{2}+ b_{1} &=2,\\
      +R_4 + T_4 + a_{2}+ b_{2} &=2,
      +\end{aligned}
      +\]
      +
      +where the eight variables \(L_1,D_1,D_2,R_2,L_3,T_3,R_4,T_4\) are the boundary edges and the
      +four variables \(a_{1},a_{2},b_{1},b_{2}\) are the interior edges.
      +
      +For a fixed choice of the interior edges, each equation tells us the sum of the two
      +boundary edges of that square:
      +
      +\[
      +\begin{aligned}
      +L_1+D_1 &=2-(a_{1}+b_{1}),\\
      +D_2+R_2 &=2-(a_{1}+b_{2}),\\
      +L_3+T_3 &=2-(a_{2}+b_{1}),\\
      +R_4+T_4 &=2-(a_{2}+b_{2}).
      +\end{aligned}
      +\tag{1}
      +\]
      +
      +The right‑hand side can be \(0,1,\) or \(2\).  
      +
      +* If it is \(0\) or \(2\) there is **exactly one** way to colour the two boundary
      +edges (both blue or both red).  
      +* If it is \(1\) there are **two** ways (one red, one blue).
      +
      +Thus for a given interior assignment the number of completions equals  
      +
      +\[
      +\prod_{i=1}^{4}f\bigl(2-(a_{i}+b_{j})\bigr),
      +\qquad
      +f(0)=f(2)=1,\;f(1)=2 .
      +\tag{2}
      +\]
      +
      +The factor contributed by a square is \(2\) precisely when the sum of its two
      +interior edges equals \(1\).
      +
      +---
      +
      +### 2.  How many squares have interior‑sum \(=1\)?
      +
      +Let  
      +
      +\[
      +A = a_{1}+a_{2}\quad(\text{number of red vertical interiors}),\qquad
      +B = b_{1}+b_{2}\quad(\text{number of red horizontal interiors}).
      +\]
      +
      +For a square the two interior edges are one vertical and one horizontal, so the
      +square’s interior sum is \(1\) exactly when the chosen vertical edge and horizontal
      +edge have different colours.  Hence the number of squares with interior‑sum \(=1\) is  
      +
      +\[
      +N = A(2-B)+(2-A)B = 2A+2B-2AB.
      +\tag{3}
      +\]
      +
      +Because \(A,B\in\{0,1,2\}\),
      +
      +\[
      +N=
      +\begin{cases}
      +0 & (A,B)=(0,0)\text{ or }(2,2),\\[2pt]
      +2 & \text{otherwise except the next case},\\[2pt]
      +4 & (A,B)=(0,2)\text{ or }(2,0).
      +\end{cases}
      +\]
      +
      +---
      +
      +### 3.  Counting all interior assignments  
      +
      +The numbers of interior assignments for each \((A,B)\) are
      +
      +\[
      +\begin{array}{c|c|c}
      +(A,B) & \text{\# assignments} & N \\ \hline
      +(0,0) & 1 & 0\\
      +(2,2) & 1 & 0\\
      +(0,2) & 1 & 4\\
      +(2,0) & 1 & 4\\
      +(0,1) & 2 & 2\\
      +(1,0) & 2 & 2\\
      +(1,1) & 4 & 2\\
      +(1,2) & 2 & 2\\
      +(2,1) & 2 & 2
      +\end{array}
      +\]
      +
      +For a given interior assignment the number of ways to colour the boundary
      +edges is \(2^{N}\) (by (2)).  Therefore
      +
      +\[
      +\begin{aligned}
      +\#\text{colorings}&=
      +1\cdot2^{0}+1\cdot2^{0}
      ++1\cdot2^{4}+1\cdot2^{4}
      ++ (2+2+4+2+2)\cdot2^{2} \\[4pt]
      +&=2\cdot1 + 2\cdot16 + 12\cdot4 \\[4pt]
      +&=2 + 32 + 48 \\[4pt]
      +&=82 .
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{82}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(O\) be the centre of \(\omega _2\) (radius \(15\)),
      +* \(A\) the centre of \(\omega _1\) (radius \(6\)),
      +* \(B\) the internal point of tangency of the two circles.
      +
      +Place the picture on a coordinate plane.
      +
      +---
      +
      +### 1.  Coordinates of the given points  
      +
      +Take \(O=(0,0)\).  
      +Since \(OA=15-6=9\) and the circles are tangent internally, we may put  
      +
      +\[
      +A=(9,0), \qquad B=(15,0).
      +\]
      +
      +\(BC\) is a diameter of \(\omega _2\) through \(B\); hence  
      +
      +\[
      +C=(-15,0).
      +\]
      +
      +\(AD\perp BC\) forces \(AD\) to be the vertical line through \(A\); intersecting this line with
      +\(\omega _2\) gives  
      +
      +\[
      +D=(9,-12)\quad\text{or}\quad (9,12).
      +\]
      +
      +The condition “\(D\) is closer to \(\overline{FG}\) than to \(\overline{EH}\)” (see below) makes
      +\(D=(9,-12)\).
      +
      +---
      +
      +### 2.  The rectangle \(EFGH\)
      +
      +\(EFGH\) is inscribed in the circle \(\omega_1\), so its vertices lie on  
      +
      +\[
      +(x-9)^2+y^2=6^2=36 .
      +\]
      +
      +Since \(\overline{EF}\perp BC\) and \(BC\) is horizontal, \(\overline{EF}\) is vertical.
      +Let  
      +
      +\[
      +\begin{aligned}
      +E&=(9+w,\,h),\\
      +F&=(9+w,\,-h),\\
      +G&=(9-w,\,-h),\\
      +H&=(9-w,\,h),
      +\end{aligned}
      +\]
      +
      +where \(w>0,\,h>0\) are the half‑width and half‑height of the rectangle.
      +
      +All four vertices satisfy the circle equation, giving the single relation  
      +
      +\[
      +w^{2}+h^{2}=36\tag{1}
      +\]
      +
      +(the rectangle’s centre is the circle’s centre \(A\)).
      +
      +Because the point \(C=(-15,0)\) is farther to the right than to the left,
      +the condition “\(C\) is closer to \(\overline{GH}\) than to \(\overline{EF}\)’’ forces
      +\(\overline{GH}\) to be the **left** side (\(x=9-w\)), which is already the case.
      +
      +Since \(D=(9,-12)\) lies below the centre, “\(D\) is closer to \(\overline{FG}\) than to \(\overline{EH}\)’’ forces
      +\(\overline{FG}\) to be the **bottom** side (\(y=-h\)).  This orientation matches the above labeling.
      +
      +---
      +
      +### 3.  Areas of the two triangles  
      +
      +*Triangle \(DGF\)*  
      +
      +The points are \(D(9,-12),\; G(9-w,-h),\; F(9+w,-h)\).
      +Its base \(GF\) has length \(2w\) and its height (vertical distance from \(D\) to the base) is \(12-h\).  
      +Hence  
      +
      +\[
      +[\,DGF\,]=\tfrac12\,(2w)(12-h)=w(12-h).\tag{2}
      +\]
      +
      +*Triangle \(CHG\)*  
      +
      +The points are \(C(-15,0),\; H(9-w,h),\; G(9-w,-h)\).
      +Its base \(HG\) has length \(2h\) and its horizontal distance from \(C\) to the line \(x=9-w\) is
      +\(|-15-(9-w)|=24-w\).  
      +Thus  
      +
      +\[
      +[\,CHG\,]=\tfrac12\,(2h)(24-w)=h(24-w).\tag{3}
      +\]
      +
      +The problem states the two areas are equal, so
      +
      +\[
      +w(12-h)=h(24-w).\tag{4}
      +\]
      +
      +Expanding gives \(12w-wh=24h-wh\), whence  
      +
      +\[
      +12w=24h \qquad\Longrightarrow\qquad w=2h.\tag{5}
      +\]
      +
      +---
      +
      +### 4.  Solving for \(w\) and \(h\)
      +
      +Substituting \(w=2h\) into (1):
      +
      +\[
      +(2h)^2+h^2=36 \;\Longrightarrow\;5h^{2}=36 \;\Longrightarrow\;
      +h=\frac{6}{\sqrt5}=\frac{6\sqrt5}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +w=2h=\frac{12}{\sqrt5}=\frac{12\sqrt5}{5}.
      +\]
      +
      +---
      +
      +### 5.  Area of the rectangle  
      +
      +The side lengths are \(2w\) and \(2h\).  Therefore  
      +
      +\[
      +\text{Area}= (2w)(2h)=4wh.
      +\]
      +
      +Using \(w=2h\),
      +
      +\[
      +4wh = 4(2h)h = 8h^{2}=8\left(\frac{36}{5}\right)=\frac{288}{5}.
      +\]
      +
      +Thus the area is \(\displaystyle\frac{288}{5}\); the numerator and denominator are coprime.
      +
      +\[
      +m=288,\qquad n=5,\qquad m+n=288+5=293.
      +\]
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The divisors of \(2025\) are all numbers of the form  
      +
      +\[
      +3^{a}5^{b},\qquad 0\le a\le 4,\;0\le b\le 2 .
      +\]
      +
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +So there are \(2^{15}\) subsets of \(A\) (including the empty set).
      +
      +--------------------------------------------------------------------
      +### When does a subset have lcm \(2025\)?
      +
      +The prime factorisation of \(2025\) is  
      +
      +\[
      +2025 = 3^{4}\,5^{2}.
      +\]
      +
      +For a subset \(B\subseteq A\),
      +
      +\[
      +\operatorname{lcm}(B)=3^{\max a_i}\,5^{\max b_i},
      +\]
      +
      +where \((a_i,b_i)\) are the exponents of the elements of \(B\).
      +Thus \(\operatorname{lcm}(B)=2025\) iff  
      +
      +* at least one element has exponent \(a=4\) (i.e. contains \(3^4\));
      +* at least one element has exponent \(b=2\) (i.e. contains \(5^2\)).
      +
      +--------------------------------------------------------------------
      +### Sets that provide the required exponents  
      +
      +\[
      +A_4=\{d\in A:3^4\mid d\}=\{3^4\! \cdot\! 5^0,\;3^4\! \cdot\!5^1,\;3^4\! \cdot\!5^2\}
      +\]
      +has \(|A_4|=3\) elements.
      +
      +\[
      +B_2=\{d\in A:5^2\mid d\}=\{3^0\! \cdot\!5^2,\;3^1\! \cdot\!5^2,\;3^2\! \cdot\!5^2,
      +\;3^3\! \cdot\!5^2,\;3^4\! \cdot\!5^2\}
      +\]
      +has \(|B_2|=5\) elements.
      +
      +Their intersection is the single divisor \(2025=3^4\! \cdot\!5^2\).
      +
      +--------------------------------------------------------------------
      +### Counting the suitable subsets  
      +
      +A subset \(B\) works iff it contains **at least one** element of \(A_4\) **and** at least one element of \(B_2\).
      +
      +Using inclusion–exclusion on the \(2^{15}\) total subsets:
      +
      +\[
      +\begin{aligned}
      +N &= 2^{15}
      +     -\underbrace{2^{15-3}}_{\text{subsets missing }A_4}
      +     -\underbrace{2^{15-5}}_{\text{subsets missing }B_2}
      +     +\underbrace{2^{15-7}}_{\text{subsets missing both}} \\[4pt]
      +  &= 2^{15}-2^{12}-2^{10}+2^{8}\\
      +  &= 32768-4096-1024+256\\
      +  &= 27904 .
      +\end{aligned}
      +\]
      +
      +Thus the desired probability is  
      +
      +\[
      +\frac{N}{2^{15}}=\frac{27904}{32768}
      +          =\frac{109}{128}\qquad(\text{after cancelling }256).
      +\]
      +
      +--------------------------------------------------------------------
      +### Answer  
      +
      +\(m=109,\;n=128\), so  
      +
      +\[
      +m+n=109+128=237 .
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 –  What we have to count**
      +
      +The two perpendicular diameters are two line segments that intersect once, so after they are drawn the disk is divided into  
      +
      +\[
      +F_0=4\qquad\text{regions}.
      +\]
      +
      +Every time we draw a new segment, it splits each region it meets into two pieces.  
      +If the new segment meets \(k\) already‑drawn segments in interior points, it creates \(k+1\) new regions.  
      +
      +Hence  
      +
      +\[
      +\boxed{\text{# of regions}=1+\#\text{segments}+ \#\text{intersection points}}
      +\tag{1}
      +\]
      +
      +(the “\(1\)” is the original whole disk).  
      +We have \(27\) segments in total (the 2 diameters + the 25 random chords).  
      +Thus we only have to find the **expected number of intersection points**.
      +
      +--------------------------------------------------------------------
      +
      +**Step 2 –  Intersections with the two diameters**
      +
      +For a random chord we must choose its two endpoints in *different* quadrants.
      +The unordered pair of quadrants is equally likely among the  
      +
      +\[
      +\binom{4}{2}=6
      +\]
      +
      +possibilities.  
      +
      +* Adjacent quadrants (four choices) – the chord meets **one** diameter.  
      +* Opposite quadrants (two choices) – the chord meets **both** diameters.
      +
      +Therefore for one random chord  
      +
      +\[
      +E[\text{diameters met}]
      +=\frac{4}{6}\cdot1+\frac{2}{6}\cdot2=\frac{4}{3}.
      +\]
      +
      +With \(N=25\) random chords
      +
      +\[
      +E[\text{intersections with the two diameters}]
      +=N\cdot\frac{4}{3}= \frac{100}{3}.
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3 –  Intersection of two random chords**
      +
      +Let a chord be drawn.  
      +Write its endpoints as angles measured from the positive \(x\)–axis.
      +Because the two endpoints are in different quadrants, the unordered pair of
      +quadrants is uniform among the six possibilities.
      +
      +*Probability that a second random chord meets the first.*
      +
      +Let the first chord be fixed.  
      +Denote by \(I\) the clockwise arc of the circle from its first endpoint to its
      +second endpoint; let \(|I|=L\).
      +If a second chord has one endpoint in \(I\) and the other outside \(I\) the two
      +chords intersect.  
      +
      +When the second chord is chosen, its first endpoint \(U\) is uniform on the whole
      +circle, and its second endpoint \(V\) is uniform on the *three* quadrants that are
      +different from the quadrant of \(U\).  
      +A short calculation (integrating over the position of \(U\) inside \(I\))
      +gives for a fixed chord
      +
      +\[
      +\boxed{q=\frac{L}{\pi}-\frac{2L^{2}}{3\pi^{2}}
      +      +\frac{2}{3\pi^{2}}\!\int_{I}\!|I\cap Q(\theta)|\,d\theta},
      +\tag{3}
      +\]
      +where \(Q(\theta)\) is the quadrant containing \(\theta\).
      +
      +Now we average (3) over the possible positions of the first chord.
      +
      +*Adjac­ent quadrants.*  
      +The arc \(I\) lies in exactly two quadrants; write its lengths in those
      +quadrants as \(L_{1},L_{2}\) (\(L=L_{1}+L_{2}\)).  
      +Then \(\int_{I}|I\cap Q|\,d\theta = L_{1}^{2}+L_{2}^{2}\).
      +With \(L_{1},L_{2}\) independent and uniform on \([0,\pi/2]\),
      +
      +\[
      +E[q\mid\text{adjacent}] = \frac{5}{12}.
      +\]
      +
      +*Opposite quadrants.*  
      +Now \(I\) occupies three quadrants; let the lengths in the three
      +quadrants be \(u,\,\pi/2,\,v\) (\(u,v\) independent uniform on \([0,\pi/2]\)).  
      +Then \(\int_{I}|I\cap Q|\,d\theta = u^{2}+(\pi/2)^{2}+v^{2}\).
      +Averaging gives
      +
      +\[
      +E[q\mid\text{opposite}] = \frac{7}{12}.
      +\]
      +
      +The first chord is adjacent with probability \(\frac{2}{3}\) and opposite with
      +probability \(\frac13\).  Hence the probability that two independently drawn
      +random chords intersect is
      +
      +\[
      +p=\frac{2}{3}\cdot\frac{5}{12}+\frac{1}{3}\cdot\frac{7}{12}
      +    =\frac{17}{36}.
      +\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4 –  Expected intersections among the 25 random chords**
      +
      +There are \(\binom{25}{2}=300\) unordered pairs of random chords, each
      +intersecting with probability \(p\).  Thus
      +
      +\[
      +E[\text{intersections among the 25 chords}]
      +=300\cdot\frac{17}{36}= \frac{425}{3}.
      +\tag{5}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5 –  Total expected number of intersection points**
      +
      +Add all contributions:
      +
      +* one intersection of the two diameters,
      +* intersections of random chords with the two diameters \(\displaystyle\frac{100}{3}\)   (from (2)),
      +* intersections among the random chords \(\displaystyle\frac{425}{3}\)   (from (5)).
      +
      +\[
      +E[\text{total intersections}]
      +=1+\frac{100}{3}+\frac{425}{3}=1+\frac{525}{3}=176.
      +\tag{6}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 6 –  Expected number of regions**
      +
      +Insert (6) into formula (1):
      +
      +\[
      +E[\text{regions}]
      +=1+\underbrace{27}_{\text{segments}}+\underbrace{176}_{\text{intersection points}}
      +=204 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The zeros of  
      +
      +\[
      +f(x)=\sin\bigl(7\pi\sin(5x)\bigr)
      +\]
      +
      +satisfy  
      +
      +\[
      +\sin\bigl(7\pi\sin(5x)\bigr)=0\Longrightarrow 7\pi\sin(5x)=k\pi,\qquad k\in\mathbb Z .
      +\]
      +
      +Hence  
      +
      +\[
      +\sin (5x)=\frac{k}{7},\qquad -7\le k\le 7 .
      +\]
      +
      +---
      +
      +### 1.  Counting all zeros \(n\)
      +
      +Put \(\theta =5x\).  
      +Because \(0<x<2\pi\), we have \(0<\theta<10\pi\).
      +
      +For each integer \(k\) we count the solutions of \(\sin\theta = k/7\) in \((0,10\pi)\).
      +
      +* **\(k=\pm7\) :** \(\sin\theta=\pm1\).  
      +  Solutions are \(\theta =\frac{\pi}{2}+2\pi m\) (or \(\frac{3\pi}{2}+2\pi m\)).  
      +  In a length \(10\pi\) there are \(5\) such values for each sign.  
      +  → \(5+5=10\) solutions.
      +
      +* **\(k=0\) :** \(\sin\theta=0\).  
      +  Solutions are \(\theta=n\pi\).  
      +  With \(0<\theta<10\pi\) we have \(n=1,2,\dots ,9\): \(9\) solutions.
      +
      +* **\(k=\pm1,\pm2,\ldots,\pm6\) (12 values):** \(\sin\theta = k/7\) is a non‑extreme value.  
      +  In each full period of length \(2\pi\) there are \(2\) solutions; we have five periods, so each such \(k\) yields \(10\) solutions.  
      +  → \(12\cdot10=120\) solutions.
      +
      +Hence  
      +
      +\[
      +n = 10\;(\text{from }k=\pm7)+9\;(\text{from }k=0)+120\;(\text{from }k=\pm1,\dots,\pm6)=139 .
      +\]
      +
      +---
      +
      +### 2.  Tangential zeros \(t\)
      +
      +The derivative is  
      +
      +\[
      +f'(x)=\cos\bigl(7\pi\sin(5x)\bigr)\cdot 7\pi\cdot5\cos(5x)
      +      =35\pi\cos\bigl(7\pi\sin(5x)\bigr)\cos(5x).
      +\]
      +
      +At a zero of \(f\) we have \(\sin(5x)=k/7\) and thus  
      +\(\cos(7\pi\sin(5x))=\cos(k\pi)=(-1)^{k}\).
      +
      +Therefore  
      +
      +\[
      +f'(x)=35\pi(-1)^{k}\cos(5x).
      +\]
      +
      +For the graph to be tangent to the \(x\)-axis we need \(f'(x)=0\); this occurs exactly when  
      +
      +\[
      +\cos(5x)=0 \quad\Longleftrightarrow\quad \sin(5x)=\pm1.
      +\]
      +
      +Thus the tangential zeros correspond to the case \(k=\pm7\).  
      +We already counted those: \(5\) solutions for \(k=7\) and \(5\) for \(k=-7\).
      +
      +\[
      +t = 5+5 = 10.
      +\]
      +
      +---
      +
      +### 3.  Required sum
      +
      +\[
      +n+t = 139+10 = 149.
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the chairs be numbered \(1,2,\dots ,16\).
      +Choosing the chairs for the eight people is equivalent to writing a binary
      +string of length \(16\) with exactly eight \(1\)’s (occupied chairs) and
      +seven \(0\)’s (empty chairs).
      +
      +The condition *“no person sits next to two other people’’* means that no
      +occupied chair can have occupied neighbours on both sides; thus the binary
      +string must contain **no substring \(111\)**.  
      +Hence we must count binary strings of length \(16\) with weight \(8\) that avoid
      +\(111\).
      +
      +---
      +
      +### 1.  Describing the strings
      +
      +The \(1\)’s can appear only in blocks of length \(1\) or \(2\) (a block of
      +length \(3\) would give a forbidden \(111\)).  
      +Suppose there are  
      +
      +* \(s\) blocks of length \(2\);
      +* \(t-s\) blocks of length \(1\),
      +
      +so the total number of blocks of \(1\)’s is \(t\).  
      +If each block of length \(2\) contributes \(2\) and each block of length
      +\(1\) contributes \(1\), then  
      +
      +\[
      +2s+(t-s)=8\qquad\Longrightarrow\qquad t=8-s .
      +\]
      +
      +Thus \(s\) can be \(0,1,2,3,4\) (since at most \(\lfloor 8/2\rfloor =4\) blocks
      +of length \(2\) are possible).
      +
      +For a given \(s\) the blocks are ordered, and we must choose which \(s\) of
      +the \(t\) blocks are the length‑\(2\) blocks:
      +
      +\[
      +\text{choices for block sizes}= \binom{t}{s}= \binom{8-s}{s}.
      +\]
      +
      +---
      +
      +### 2.  Placing the zeros
      +
      +Between two consecutive blocks of \(1\)’s there must be at least one
      +\(0\).  With \(t\) blocks there are \(t-1\) mandatory zeros.
      +There are \(8\) zeros in total (since \(16-8=8\)).  
      +Hence the number of *extra* zeros we may distribute is  
      +
      +\[
      +8-(t-1)=9-t .
      +\]
      +
      +These extra zeros can be placed in any of the \(t+1\) gaps
      +(before the first block, between blocks, after the last block).  
      +By stars and bars the number of distributions is
      +
      +\[
      +\binom{(9-t)+(t+1)-1}{(t+1)-1}
      +   =\binom{9}{t}
      +   =\binom{9}{8-s}.
      +\]
      +
      +---
      +
      +### 3.  Total number of admissible subsets
      +
      +Summing over all possible \(s\):
      +
      +\[
      +\begin{aligned}
      +N &=\sum_{s=0}^{4}
      +    \binom{8-s}{s}\binom{9}{8-s}  \\
      +  &=\binom{8}{0}\binom{9}{8}
      +   +\binom{7}{1}\binom{9}{7}
      +   +\binom{6}{2}\binom{9}{6}
      +   +\binom{5}{3}\binom{9}{5}
      +   +\binom{4}{4}\binom{9}{4}   \\
      +  &=1\cdot 9
      +   +7\cdot 36
      +   +15\cdot 84
      +   +10\cdot 126
      +   +1\cdot 126 \\
      +  &=9+252+1260+1260+126 \\
      +  &=2907 .
      +\end{aligned}
      +\]
      +
      +Thus there are \(N=2907\) subsets of chairs that satisfy the condition.
      +
      +---
      +
      +### 4.  Remainder modulo \(1000\)
      +
      +\[
      +2907 \equiv 907 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=84^\circ ,\qquad B=60^\circ ,\qquad C=36^\circ .
      +\]
      +
      +Denote by \(O\) the circumcenter of \(\triangle ABC\) and by \(N\) the nine‑point
      +center (the circumcenter of \(\triangle DEF\)).
      +Put the circumcircle of \(\triangle ABC\) on the unit circle and let  
      +
      +\[
      +a=1,\qquad 
      +b=e^{i\beta },\qquad 
      +c=e^{i\gamma},
      +\]
      +
      +where the central arcs satisfy  
      +
      +\[
      +\widehat{AB}=2C=72^\circ ,\qquad 
      +\widehat{BC}=2A=168^\circ ,\qquad 
      +\widehat{CA}=2B=120^\circ .
      +\]
      +
      +Hence  
      +
      +\[
      +\beta =72^\circ ,\qquad \gamma =\beta +168^\circ =240^\circ .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  The nine‑point centre and the midpoints  
      +
      +\[
      +N=\frac{a+b+c}{2},\qquad 
      +D=\frac{b+c}{2},\;E=\frac{c+a}{2},\;F=\frac{a+b}{2}.
      +\]
      +
      +From these formulas  
      +
      +\[
      +ND=-\frac a2,\qquad NE=-\frac b2,\qquad NF=-\frac c2 .\tag{1}
      +\]
      +
      +Thus the directions of the radii to the midpoints are opposite the
      +directions of the vertices:
      +
      +\[
      +\arg(ND)=\alpha+180^\circ ,\quad 
      +\arg(NE)=\beta+180^\circ ,\quad 
      +\arg(NF)=\gamma+180^\circ .
      +\]
      +
      +Consequently  
      +
      +\[
      +\widehat{DE}=|\arg(NE)-\arg(ND)|
      +      =( \beta+180^\circ)-( \alpha+180^\circ)=\beta-\alpha
      +      =2C=72^\circ .\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  The second intersections  
      +
      +For a chord whose one endpoint is known, the second endpoint is obtained
      +by reflecting the known radius about the line through \(N\) that is
      +perpendicular to the given line.
      +
      +*Line \(BD\).*  
      +The direction of \(BD\) is \(\arg(c-b)\).  
      +Since the perpendicular through \(N\) makes the angle \(\arg(c-b)+90^\circ\),
      +reflecting \(ND\) in this line gives
      +
      +\[
      +\arg(NG)=2\bigl(\arg(c-b)+90^\circ\bigr)-\arg(ND)
      +        =2\arg(c-b)-\arg(a).            \tag{3}
      +\]
      +
      +Using the identity  
      +
      +\[
      +\arg(c-b)=\frac{\beta+\gamma}{2}+90^\circ,
      +\]
      +
      +we obtain  
      +
      +\[
      +\arg(NG)=2\Bigl(\frac{72^\circ+240^\circ}{2}+90^\circ\Bigr)
      +        =492^\circ\equiv132^\circ .
      +\]
      +
      +Because \(\arg(NF)=\gamma+180^\circ=60^\circ\),
      +
      +\[
      +\widehat{FG}=|\arg(NG)-\arg(NF)|=132^\circ-60^\circ=72^\circ .\tag{4}
      +\]
      +
      +*Line \(AF\) (the side \(AB\)).*  
      +The direction of \(AB\) is \(\arg(b-a)\); hence
      +
      +\[
      +\arg(NJ)=2\arg(b-a)-\arg(c).                \tag{5}
      +\]
      +
      +Now  
      +
      +\[
      +\arg(b-a)=\frac{\alpha+\beta}{2}+90^\circ=126^\circ,
      +\]
      +
      +so  
      +
      +\[
      +\arg(NJ)=2\cdot126^\circ-240^\circ=12^\circ .\tag{6}
      +\]
      +
      +*Line \(AE\) (the median from \(A\)).*  
      +The direction of \(AE\) is \(\arg(c-a)\); thus
      +
      +\[
      +\arg(NH)=2\arg(c-a)-\arg(b).                \tag{7}
      +\]
      +
      +Here  
      +
      +\[
      +\arg(c-a)=\frac{\alpha+\gamma}{2}+90^\circ=210^\circ ,
      +\]
      +
      +hence  
      +
      +\[
      +\arg(NH)=2\cdot210^\circ-72^\circ=348^\circ\equiv-12^\circ .\tag{8}
      +\]
      +
      +Therefore  
      +
      +\[
      +\widehat{HJ}=|\arg(NJ)-\arg(NH)|
      +            =12^\circ-(-12^\circ)=24^\circ .\tag{9}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Required sum  
      +
      +From (2), (4) and (9),
      +
      +\[
      +\widehat{DE}=72^\circ ,\qquad 
      +\widehat{HJ}=24^\circ ,\qquad 
      +\widehat{FG}=72^\circ .
      +\]
      +
      +Hence  
      +
      +\[
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +=72^\circ+2\cdot24^\circ+3\cdot72^\circ
      +=72+48+216
      +=336^\circ .
      +\]
      +
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\boxed{733}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 733

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +r_i=A_1A_i\qquad (i=2,\dots ,11),\qquad 
      +\theta=\angle A_iA_1A_{i+1}\;(2\le i\le 10),\qquad 
      +\cos\theta=\frac{12}{13}.
      +\]
      +
      +---
      +
      +### 1.  Relation between the radii  
      +
      +The area of \(\triangle A_iA_1A_{i+1}\) is  
      +
      +\[
      +1=\frac12 r_i r_{i+1}\sin\theta .
      +\]
      +
      +Since  
      +
      +\[
      +\sin\theta =\sqrt{1-\cos^2\theta}= \sqrt{1-\left(\frac{12}{13}\right)^2}= \frac{5}{13},
      +\]
      +
      +we obtain  
      +
      +\[
      +r_i r_{i+1}= \frac{2\cdot13}{5}= \frac{26}{5}\;(=C).
      +\tag{1}
      +\]
      +
      +Thus for every \(i\),
      +
      +\[
      +r_{i+1}= \frac{C}{r_i},\qquad C=\frac{26}{5}.
      +\]
      +
      +Consequently the sequence alternates:
      +
      +\[
      +r_2=r_4=r_6=r_8=r_{10}=x,\qquad
      +r_3=r_5=r_7=r_9=r_{11}= \frac{C}{x},
      +\]
      +
      +for some positive number \(x\).
      +
      +---
      +
      +### 2.  Length of the side \(A_iA_{i+1}\)
      +
      +Using the law of cosines in \(\triangle A_iA_1A_{i+1}\),
      +
      +\[
      +A_iA_{i+1}^{2}=r_i^{2}+r_{i+1}^{2}-2r_i r_{i+1}\cos\theta .
      +\]
      +
      +Because \(r_i r_{i+1}=C\) and \(\cos\theta=\frac{12}{13}\),
      +
      +\[
      +A_iA_{i+1}^{2}=r_i^{2}+r_{i+1}^{2}
      +          -2C\cdot\frac{12}{13}
      +          =r_i^{2}+r_{i+1}^{2}-\frac{48}{5}.
      +\]
      +
      +Now  
      +
      +\[
      +r_i^{2}+r_{i+1}^{2}
      +   =(r_i+r_{i+1})^{2}-2r_i r_{i+1}
      +   =(r_i+r_{i+1})^{2}-2C .
      +\]
      +
      +Hence
      +
      +\[
      +A_iA_{i+1}^{2}= (r_i+r_{i+1})^{2}-2C-\frac{48}{5}
      +               =(r_i+r_{i+1})^{2}-20 .
      +\tag{2}
      +\]
      +
      +For any consecutive pair \((i,i+1)\) we have  
      +
      +\[
      +r_i+r_{i+1}=x+\frac{C}{x}\;=:t .
      +\]
      +
      +Thus every side \(A_iA_{i+1}\;(i=2,\dots ,10)\) has the same length  
      +
      +\[
      +s=\sqrt{t^{2}-20}.
      +\tag{3}
      +\]
      +
      +---
      +
      +### 3.  Perimeter condition  
      +
      +The perimeter of the 11‑gon is  
      +
      +\[
      +\underbrace{A_1A_2}_{=x}
      ++\underbrace{A_{11}A_1}_{=C/x}
      ++9s =t+9\sqrt{t^{2}-20}=20 .
      +\tag{4}
      +\]
      +
      +Set \(\displaystyle u=\sqrt{t^{2}-20}\).  
      +From (4) we have \(u=\dfrac{20-t}{9}\).  Squaring gives
      +
      +\[
      +t^{2}-20=\frac{(20-t)^{2}}{81}.
      +\]
      +
      +Multiplying by 81 and simplifying,
      +
      +\[
      +80t^{2}+40t-2020=0\quad\Longrightarrow\quad
      +4t^{2}+2t-101=0.
      +\]
      +
      +Solving,
      +
      +\[
      +t=\frac{-2+\sqrt{4+1616}}{8}
      +  =\frac{-2+18\sqrt5}{8}
      +  =\frac{9\sqrt5-1}{4}.
      +\]
      +
      +Since \(t=x+C/x=A_1A_2+A_1A_{11}\) is a sum of positive lengths,
      +the positive root is the only admissible one.
      +
      +---
      +
      +### 4.  Result  
      +
      +\[
      +A_1A_2+A_1A_{11}= \frac{9\sqrt5-1}{4}
      +                 =\frac{m\sqrt n-p}{q},
      +\]
      +
      +where \(m=9,\;n=5,\;p=1,\;q=4\).  
      +Hence
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For the denominations \(\{1,10,25\}\) let  
      +
      +\[
      +N=25a+b,\qquad 0\le b<25 .
      +\]
      +
      +The greedy algorithm first uses \(a\) quarters, then \(\big\lfloor b/10\big\rfloor\) dimes and finally \(b\bmod 10\) pennies.
      +Hence the greedy number of coins is  
      +
      +\[
      +C_{\text{greedy}}(N)=a+\Big\lfloor\frac{b}{10}\Big\rfloor+(b\bmod 10)=a+f(b),
      +\]
      +where  
      +
      +\[
      +f(x)=\Big\lfloor\frac{x}{10}\Big\rfloor+(x\bmod 10).
      +\]
      +
      +If we keep only \(a-k\) quarters (\(k\ge 1\)), the remainder becomes \(b+25k\).  
      +The optimal way to represent the remainder with dimes and pennies still uses the greedy method,
      +so the total number of coins with \(a-k\) quarters is  
      +
      +\[
      +C_k(N)=a-k+f(b+25k).
      +\]
      +
      +The greedy algorithm fails iff for some \(k\ge1\)
      +
      +\[
      +C_k(N)<C_{\text{greedy}}(N)
      +\Longleftrightarrow 
      +f(b+25k)\le f(b)+k-1 .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Evaluating \(f(b+25k)-f(b)\)
      +
      +Write \(b=10t+r\) with \(t\in\{0,1,2\}\) and \(r=b\bmod 10\in\{0,\dots,9\}\).
      +Let \(\alpha=r/10\;(0\le\alpha<1)\).
      +
      +Since  
      +
      +\[
      +f(x)=\Big\lfloor\frac{x}{10}\Big\rfloor+(x\bmod10)
      +      =x-9\Big\lfloor\frac{x}{10}\Big\rfloor ,
      +\]
      +
      +we obtain  
      +
      +\[
      +\begin{aligned}
      +f(b+25k)-f(b)
      +&=9\Big\lfloor\frac{b+25k}{10}\Big\rfloor-24k\\
      +&=9\Big\lfloor 2.5k+\alpha\Big\rfloor-24k .
      +\end{aligned}
      +\tag{2}
      +\]
      +
      +Set  
      +
      +\[
      +\Delta(k)=9\Big\lfloor 2.5k+\alpha\Big\rfloor-24k .
      +\]
      +
      +A failure occurs when \(\Delta(k)>0\) and \(k\le a\).
      +
      +--------------------------------------------------------------------
      +### 2.  When can \(\Delta(k)>0\)?
      +
      +For any integer \(k\),
      +
      +\[
      +\Big\lfloor2.5k\Big\rfloor=
      +\frac{5k-(k\bmod2)}{2}.
      +\]
      +
      +Hence  
      +
      +\[
      +\Delta(k)= -\frac{3k+9(k\bmod2)}{2}+9\delta ,
      +\quad\text{where }\delta=
      +\begin{cases}
      +1,&\alpha\ge 1-\{2.5k\},\\
      +0,&\text{otherwise}.
      +\end{cases}
      +\]
      +
      +The term \(-\frac{3k+9(k\bmod2)}{2}\) is negative for all \(k\ge1\).
      +The only way \(\Delta(k)\) can become positive is when \(\delta=1\).
      +
      +*If \(k\) is even*, \(\{2.5k\}=0\); thus \(\alpha<1\) never makes \(\delta=1\).
      +Hence \(\Delta(k)\le0\) for all even \(k\).
      +
      +*If \(k\) is odd*, \(\{2.5k\}=0.5\).  
      +Then \(\delta=1\) exactly when \(\alpha\ge 0.5\), i.e. when \(r\ge5\) (the remainder of \(b\) modulo \(10\) is at least \(5\)).
      +
      +For odd \(k\ge3\) we have  
      +
      +\[
      +\Delta(k)=-9+9\delta\le0,
      +\]
      +
      +so no improvement occurs.  
      +
      +For \(k=1\),
      +
      +\[
      +\Delta(1)= -6+9\delta,
      +\]
      +
      +which is positive precisely when \(\delta=1\); that is, when \(r\ge5\).
      +
      +Consequently **the greedy algorithm fails exactly when**
      +
      +* \(N\ge25\) (so at least one quarter is used), and
      +* the remainder \(b=N\bmod25\) satisfies \(b\bmod10\ge5\).
      +
      +In terms of residues modulo \(25\) this means
      +
      +\[
      +b\in\{5,6,7,8,9,15,16,17,18,19\}.
      +\tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Counting the failures
      +
      +From \(1\) to \(1000\):
      +
      +* For \(N<25\) the greedy algorithm is always optimal (no quarters are used).
      +* For each complete block of \(25\) numbers, exactly the \(10\) residues listed in (3) cause a failure.
      +
      +The interval \(25\le N\le999\) contains \(39\) full blocks of size \(25\):
      +\[
      +39\cdot10=390\text{ failures}.
      +\]
      +
      +\(N=1000\) has residue \(0\) modulo \(25\), so it is not a failure.
      +
      +Thus the number of values where the greedy algorithm **succeeds** is  
      +
      +\[
      +1000-390 = 610.
      +\]
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      In base \(b\),
      +
      +\[
      +17_b = 1\cdot b+7 = b+7,\qquad 97_b = 9\cdot b+7 .
      +\]
      +
      +We need integer bases \(b>9\) such that \(b+7\) divides \(9b+7\).
      +
      +Let  
      +
      +\[
      +n = b+7 \quad\Longrightarrow\quad b = n-7.
      +\]
      +
      +Then  
      +
      +\[
      +9b+7 = 9(n-7)+7 = 9n-56 .
      +\]
      +
      +Hence \(n\) must divide \(9n-56\):
      +
      +\[
      +n \mid (9n-56) \;\Longrightarrow\; n \mid (9n-56) - 9n = -56.
      +\]
      +
      +Thus \(n\) is a positive divisor of \(56\).  
      +Since \(b>9\), we have \(n=b+7>16\); therefore we need divisors of \(56\) that are \(\ge 17\).
      +
      +Divisors of \(56 = 2^3\cdot7\) are  
      +
      +\[
      +1,\;2,\;4,\;7,\;8,\;14,\;28,\;56.
      +\]
      +
      +Only \(28\) and \(56\) satisfy \(n\ge 17\).
      +
      +Corresponding bases:
      +
      +\[
      +b = n-7 \quad\Rightarrow\quad 
      +\begin{cases}
      +n=28 &\Rightarrow b = 21,\\[2pt]
      +n=56 &\Rightarrow b = 49.
      +\end{cases}
      +\]
      +
      +Both bases exceed \(9\) and the digits \(1,7,9\) are allowed.
      +
      +Finally, the sum of all such bases is  
      +
      +\[
      +21 + 49 = 70.
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Label the vertices of the regular \(24\)-gon by the residues  
      +\(\{0,1,2,\dots ,23\}\) modulo \(24\).
      +
      +If the \(12\) drawn segments all have the same Euclidean length, then each
      +segment must join two vertices whose indices differ by a fixed integer  
      +\(k\;(1\le k\le 12)\) (the “step size’’), because the length of a chord in a
      +regular polygon depends only on this step.
      +
      +Thus for a fixed \(k\) we have to choose a perfect matching of the graph  
      +
      +\[
      +G_k=\big\{\{i,i+k\}\mid i=0,1,\dots ,23\big\}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.   Structure of \(G_k\)
      +
      +\(G_k\) is a **2‑regular** graph; each vertex has exactly the two neighbours
      +\(i\pm k\).  
      +Let  
      +
      +\[
      +d=\gcd(k,24).
      +\]
      +
      +Then the vertices split into \(d\) cycles, each of length  
      +
      +\[
      +t=\frac{24}{d}.
      +\]
      +
      +Indeed, repeatedly adding \(k\) modulo \(24\) runs through a cycle of that
      +length.
      +
      +--------------------------------------------------------------------
      +### 2.   When does a perfect matching exist?
      +
      +A perfect matching can exist only if each component has an even number of
      +vertices, i.e. \(t\) must be even.  
      +Since \(t = 24/d\),
      +
      +* \(t\) is odd only when \(d=8\) (giving \(t=3\)).  
      +  Hence for \(k=8\) no perfect matching is possible.
      +
      +All other values of \(k\) give even‑length cycles.
      +
      +--------------------------------------------------------------------
      +### 3.   Number of matchings for a given \(k\)
      +
      +*If \(t\ge 4\) (even cycle of length at least \(4\)):  
      +A cycle has exactly **two** perfect matchings (choose every other edge).  
      +Since there are \(d\) independent cycles, the total number of matchings is
      +\(\displaystyle 2^{d}\).
      +
      +*If \(t=2\) (the case \(k=12\)): each component is a single edge, so there
      +is only **one** way to match its two vertices.  
      +Thus for \(k=12\) we obtain \(1\) matching.
      +
      +Summarising
      +
      +\[
      +f(k)=
      +\begin{cases}
      +0, & k=8,\\[2mm]
      +1, & k=12,\\[2mm]
      +2^{\gcd(k,24)}, & \text{otherwise}.
      +\end{cases}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.   Summation over all possible step sizes
      +
      +\[
      +\begin{array}{c|c|c|c}
      +k & \gcd(k,24) & f(k) & \text{contribution}\\\hline
      +1 & 1 & 2^1=2 & 2\\
      +2 & 2 & 2^2=4 & 4\\
      +3 & 3 & 2^3=8 & 8\\
      +4 & 4 & 2^4=16 & 16\\
      +5 & 1 & 2 & 2\\
      +6 & 6 & 2^6=64 & 64\\
      +7 & 1 & 2 & 2\\
      +8 & 8 & 0 & 0\\
      +9 & 3 & 8 & 8\\
      +10& 2 & 4 & 4\\
      +11& 1 & 2 & 2\\
      +12&12 & 1 & 1\\\hline
      +\multicolumn{3}{r|}{\text{Total}} & 113
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.   Answer
      +
      +The total number of ways to draw \(12\) equal‑length segments so that each of
      +the \(24\) vertices is used exactly once is  
      +
      +\[
      +\boxed{113}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +Each player gets one scoop of either chocolate (C), vanilla (V) or strawberry (S).  
      +Let  
      +
      +\[
      +c=\#\text{players who chose chocolate},\qquad 
      +v=\#\text{players who chose vanilla},\qquad 
      +s=\#\text{players who chose strawberry}.
      +\]
      +
      +We need  
      +
      +\[
      +c+v+s=9,\qquad c>v>s\ge 1 .
      +\]
      +
      +For each admissible triple \((c,v,s)\) the number of assignments to the 9 distinct players is the multinomial coefficient  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +Hence  
      +
      +\[
      +N=\sum_{\substack{c+v+s=9\\c>v>s\ge1}}\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +---
      +
      +### 1. Find all possible triples \((c,v,s)\)
      +
      +Since \(c>v>s\ge1\),
      +
      +\[
      +s\le 2
      +\]
      +
      +(because \(s+(s+1)+(s+2)=3s+3\le9\Rightarrow s\le2\)).  
      +
      +*If \(s=1\):*  
      +\(v\ge2\) and \(c=9-v-1=8-v\).  
      +Condition \(c>v\) gives \(8-v>v\Rightarrow v\le3\).  
      +Thus \(v=2,3\) giving triples \((6,2,1)\) and \((5,3,1)\).
      +
      +*If \(s=2\):*  
      +\(v\ge3\) and \(c=9-v-2=7-v\).  
      +Condition \(c>v\) gives \(7-v>v\Rightarrow v\le3\).  
      +Thus \(v=3\) giving the triple \((4,3,2)\).
      +
      +No larger \(s\) works.  
      +Hence the only admissible triples are  
      +
      +\[
      +(6,2,1),\qquad (5,3,1),\qquad (4,3,2).
      +\]
      +
      +---
      +
      +### 2. Count assignments for each triple
      +
      +\[
      +\begin{aligned}
      +(6,2,1):&\quad \frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[4pt]
      +(5,3,1):&\quad \frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[4pt]
      +(4,3,2):&\quad \frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 3. Total number of assignments
      +
      +\[
      +N=252+504+1260=2016.
      +\]
      +
      +---
      +
      +### 4. Remainder modulo \(1000\)
      +
      +\[
      +2016\equiv 16\pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +Let  
      +
      +\[
      +\begin{aligned}
      +A&=(7,7\sqrt3),\qquad 
      +B=(0,0),\qquad 
      +C=(7,0),\\[2mm]
      +D&=\Bigl(\frac{205}{7},\frac{36\sqrt3}{7}\Bigr),\qquad
      +E=\Bigl(\frac{218}{7},\frac{88\sqrt3}{7}\Bigr).
      +\end{aligned}
      +\]
      +
      +The pentagon \(ABCDE\) is convex, \(\angle B=\angle E=60^\circ\) and the side–lengths are  
      +
      +\[
      +AB=14,\;BC=7,\;CD=24,\;DE=13,\;EA=26 .
      +\]
      +
      +For a point \(X\) define  
      +
      +\[
      +f(X)=AX+BX+CX+DX+EX .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 1.  Reducing the problem
      +
      +For any point \(X\)
      +
      +\[
      +\nabla f(X)=\sum_{P\in\{A,B,C,D,E\}}\frac{X-P}{|X-P|}.
      +\]
      +
      +If the minimum of \(f\) is attained at an interior point,
      +the gradient must be zero:
      +
      +\[
      +\frac{X-A}{|X-A|}+\frac{X-B}{|X-B|}
      ++\frac{X-C}{|X-C|}+\frac{X-D}{|X-D|}+\frac{X-E}{|X-E|}=0. \tag{1}
      +\]
      +
      +Notice that  
      +
      +*\(B\) and \(E\) lie on the same line \(BE\).  
      +If a point \(X\) is on the line \(BE\), the two unit vectors in (1) that
      +correspond to \(B\) and \(E\) are opposite:
      +\[
      +\frac{X-B}{|X-B|}+\frac{X-E}{|X-E|}=0 .
      +\]
      +
      +Hence, **any point on the segment \(BE\) automatically cancels the
      +contributions of \(B\) and \(E\).**  
      +Consequently a minimiser must lie on \(BE\), and (1) becomes
      +
      +\[
      +\frac{X-A}{|X-A|}+\frac{X-C}{|X-C|}+\frac{X-D}{|X-D|}=0 .\tag{2}
      +\]
      +
      +Equation (2) is precisely the equilibrium condition for the geometric
      +median (Fermat–Weber point) of the triangle \(ACD\).
      +
      +--------------------------------------------------------------------
      +
      +### 2.  The Fermat point of \(\triangle ACD\)
      +
      +The three angles of \(\triangle ACD\) are  
      +
      +\[
      +\angle A\approx81.8^\circ ,\qquad 
      +\angle C\approx68.2^\circ ,\qquad 
      +\angle D=30^\circ .
      +\]
      +
      +All are \(<120^\circ\); therefore the unique point \(F\) inside
      +\(\triangle ACD\) for which the three angles \(\angle AFD,
      +\angle CFD, \angle ACF\) are all \(120^\circ\) is the Fermat point.
      +It is precisely the point satisfying (2); consequently the minimiser of
      +\(f\) is the intersection of the line \(BE\) with this Fermat point.
      +(The numerical computation of the Weiszfeld iteration gives
      +\(F\approx(10.594,\,7.416)\), which indeed lies on \(BE\).)
      +
      +For a triangle with side‑lengths \(a,b,c\) and area \(\Delta\), the
      +minimal sum of distances from its Fermat point to the three vertices is
      +
      +\[
      +\boxed{\displaystyle 
      +\sqrt{\frac{a^{2}+b^{2}+c^{2}+4\sqrt3\,\Delta}{2}} }   \tag{3}
      +\]
      +
      +(see any textbook on the Fermat point).
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Applying the formula to \(\triangle ACD\)
      +
      +For \(\triangle ACD\)
      +
      +\[
      +\begin{aligned}
      +a&=CD=24,\\
      +b&=AD=13\sqrt3,\\
      +c&=AC=7\sqrt3.
      +\end{aligned}
      +\]
      +
      +The area is obtained from the base \(AC\) (vertical, length \(7\sqrt3\))
      +and the horizontal distance from \(D\) to the line \(AC\) (which is
      +\( \frac{156}{7}\)):
      +
      +\[
      +\Delta=\frac12\cdot7\sqrt3\cdot\frac{156}{7}=78\sqrt3 .
      +\]
      +
      +Now compute the expression in (3):
      +
      +\[
      +\begin{aligned}
      +a^{2}+b^{2}+c^{2}&=24^{2}+(13\sqrt3)^{2}+(7\sqrt3)^{2}
      +=576+507+147=1230,\\[1mm]
      +4\sqrt3\,\Delta&=4\sqrt3\cdot78\sqrt3=4\cdot78\cdot3=936,\\[1mm]
      +\frac{a^{2}+b^{2}+c^{2}+4\sqrt3\,\Delta}{2}
      +&=\frac{1230+936}{2}=1083.
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +AF+CF+DF=\sqrt{1083}=19\sqrt3 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 4.  The total minimum
      +
      +Because the minimiser lies on \(BE\),
      +
      +\[
      +BF+EF=BE=38 .
      +\]
      +
      +Therefore
      +
      +\[
      +\begin{aligned}
      +\min f(X)&=AF+CF+DF+BF+EF\\
      +&=19\sqrt3+38 .
      +\end{aligned}
      +\]
      +
      +The required form is \(m+n\sqrt{p}\) with \(m=38,\;n=19,\;p=3\).
      +
      +Hence  
      +
      +\[
      +m+n+p = 38+19+3 = 60 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{60}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 60

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equation  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +can be factored over the integers:
      +
      +\[
      +12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .
      +\]
      +
      +Hence a pair \((x,y)\) of integers satisfies either  
      +
      +\[
      +\boxed{3x+2y=0}\qquad\text{or}\qquad\boxed{4x-3y=0}.
      +\]
      +
      +---
      +
      +### 1.  Solutions of \(3x+2y=0\)
      +
      +\[
      +2y=-3x\quad\Longrightarrow\quad y=-\frac{3}{2}x .
      +\]
      +
      +For \(y\) to be integer, \(x\) must be even: write \(x=2k\) with \(k\in\mathbb Z\).  
      +Then \(y=-3k\).
      +
      +The bounds \(-100\le x,y\le100\) give  
      +
      +\[
      +-100\le2k\le100\;\Longrightarrow\;-50\le k\le50,
      +\]
      +\[
      +-100\le-3k\le100\;\Longrightarrow\;|k|\le\frac{100}{3}\;\Longrightarrow\;-33\le k\le33.
      +\]
      +
      +Thus \(k\) can be any integer from \(-33\) to \(33\):  
      +
      +\[
      +\#\{(x,y):3x+2y=0\}=33+33+1=67 .
      +\]
      +
      +---
      +
      +### 2.  Solutions of \(4x-3y=0\)
      +
      +\[
      +4x=3y\quad\Longrightarrow\quad y=\frac{4}{3}x .
      +\]
      +
      +For integer \(y\), \(x\) must be a multiple of \(3\): write \(x=3m\) with \(m\in\mathbb Z\).  
      +Then \(y=4m\).
      +
      +The bounds give  
      +
      +\[
      +-100\le3m\le100\;\Longrightarrow\;|m|\le\frac{100}{3}\;\Longrightarrow\;-33\le m\le33,
      +\]
      +\[
      +-100\le4m\le100\;\Longrightarrow\;-25\le m\le25.
      +\]
      +
      +Hence \(m\) can be any integer from \(-25\) to \(25\):  
      +
      +\[
      +\#\{(x,y):4x-3y=0\}=25+25+1=51 .
      +\]
      +
      +---
      +
      +### 3.  Removing the double count
      +
      +The only pair that satisfies both linear equations is \((0,0)\).  
      +Thus the total number of distinct ordered pairs is  
      +
      +\[
      +67+51-1=117 .
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a tangential quadrilateral (one that has an incircle) the sum of the lengths of opposite sides are equal.  
      +Let the parallel sides of the isosceles trapezoid be \(r\) and \(s\) \((r\neq s)\) and each leg have length \(L\).
      +
      +\[
      +r+s = L+L = 2L \quad\Longrightarrow\quad L=\frac{r+s}{2}
      +\]
      +
      +---
      +
      +### Using the incircle
      +
      +For any tangential quadrilateral  
      +
      +\[
      +\text{Area}= (\text{inradius})\times (\text{semiperimeter})
      +\]
      +
      +The inradius is \(3\) and the area is \(72\), so the semiperimeter is  
      +
      +\[
      +\frac{72}{3}=24 .
      +\]
      +
      +The semiperimeter of the trapezoid is  
      +
      +\[
      +\frac{r+s+2L}{2}= \frac{r+s+r+s}{2}=r+s .
      +\]
      +
      +Hence  
      +
      +\[
      +r+s = 24 .
      +\]
      +
      +Consequently  
      +
      +\[
      +L=\frac{r+s}{2}=12 .
      +\]
      +
      +---
      +
      +### Height of the trapezoid
      +
      +The area also equals \(\dfrac{(r+s)}{2}\cdot h\), where \(h\) is the height:
      +
      +\[
      +72=\frac{24}{2}\,h =12h \;\Longrightarrow\; h=6 .
      +\]
      +
      +(Indeed, the height must be \(2\) times the inradius, \(2\cdot3=6\).)
      +
      +---
      +
      +### Relating the legs to the bases
      +
      +In an isosceles trapezoid the horizontal offset of each leg is  
      +
      +\[
      +x=\frac{r-s}{2}.
      +\]
      +
      +Because each leg has length \(L=12\),
      +
      +\[
      +L^{2}=x^{2}+h^{2}\quad\Longrightarrow\quad
      +12^{2}= \left(\frac{r-s}{2}\right)^{2}+6^{2}.
      +\]
      +
      +Thus  
      +
      +\[
      +\left(\frac{r-s}{2}\right)^{2}=144-36=108
      +\quad\Longrightarrow\quad
      +r-s = 2\sqrt{108}=12\sqrt3 .
      +\]
      +
      +---
      +
      +### Solving for \(r\) and \(s\)
      +
      +\[
      +\begin{cases}
      +r+s = 24,\\[2pt]
      +r-s = 12\sqrt3 .
      +\end{cases}
      +\]
      +
      +\[
      +r = \frac{24+12\sqrt3}{2}=12+6\sqrt3,\qquad
      +s = \frac{24-12\sqrt3}{2}=12-6\sqrt3 .
      +\]
      +
      +---
      +
      +### Compute \(r^{2}+s^{2}\)
      +
      +Using \((r^{2}+s^{2}) = \dfrac{(r+s)^{2}+(r-s)^{2}}{2}\),
      +
      +\[
      +r^{2}+s^{2}= \frac{24^{2}+(12\sqrt3)^{2}}{2}
      += \frac{576+432}{2}
      += \frac{1008}{2}=504 .
      +\]
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a number to be divisible by \(22\) it must be divisible by \(2\) **and** by \(11\).
      +
      +---
      +
      +### 1.  Divisibility by \(2\)
      +
      +The last digit (the 8‑th digit) must be even.
      +The even digits are \(\{2,4,6,8\}\).
      +
      +---
      +
      +### 2.  Divisibility by \(11\)
      +
      +For an \(8\)-digit number \(d_1d_2\ldots d_8\),
      +
      +\[
      +\text{(odd positions)}-\text{(even positions)}=
      +(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)
      +\]
      +
      +must be a multiple of \(11\).
      +
      +Since the digits \(1,\dots ,8\) are used once,
      +\[
      +(d_1+d_3+d_5+d_7)+(d_2+d_4+d_6+d_8)=1+2+\cdots+8=36 .
      +\]
      +
      +Let \(S=d_1+d_3+d_5+d_7\).  
      +Then the alternating sum is \(2S-36\).  
      +It must be a multiple of \(11\) and also even (because \(2S-36\) is even).  
      +The only even multiple of \(11\) in the range \([-16,16]\) (the possible values of \(2S-36\)) is \(0\).
      +
      +Hence  
      +
      +\[
      +2S-36=0\quad\Longrightarrow\quad S=18 .
      +\]
      +
      +So the four digits occupying the odd positions must sum to \(18\)
      +(and automatically the even positions also sum to \(18\)).
      +
      +---
      +
      +### 3.  Choosing the odd‑position set
      +
      +We need all \(4\)-element subsets of \(\{1,2,3,4,5,6,7,8\}\) whose sum is \(18\).
      +
      +Listing them (or using a generating function) gives
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +Thus there are **8** possible sets for the odd positions.
      +
      +Each such set contains exactly two even digits (any valid set must have
      +two evens and two odds, because an odd number of evens would give an odd total).
      +
      +---
      +
      +### 4.  Arranging the digits
      +
      +*Odd positions (1,3,5,7)* – the chosen 4 digits can be placed in \(4! = 24\) ways.
      +
      +*Even positions (2,4,6,8)* – the remaining four digits must be placed so that
      +position 8 is even.
      +
      +If the even‑position set contains \(k\) even digits, we have \(k\) choices for which even digit goes to position 8, and the remaining three digits can be ordered in the other three even positions in \(3! = 6\) ways.  
      +
      +For every valid odd‑set we have exactly \(k = 2\) even digits in the even‑position set,
      +so
      +
      +\[
      +\text{arrangements of even positions}=2\cdot 3! = 12 .
      +\]
      +
      +Hence for each of the 8 possible odd‑sets we obtain
      +
      +\[
      +24 \times 12 = 288\text{ permutations}.
      +\]
      +
      +---
      +
      +### 5.  Total number \(N\)
      +
      +\[
      +N = 8 \times 288 = 2304 .
      +\]
      +
      +---
      +
      +### 6.  Required difference
      +
      +\[
      +N - 2025 = 2304 - 2025 = 279 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equations describe geometric loci in the complex plane.
      +
      +---
      +
      +### 1.  The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +is a circle  
      +
      +\[
      +C:\;(x-25)^2+(y-20)^2 =5^{\,2}=25 .
      +\]
      +
      +Its centre is \(C_0=(25,20)\) and its radius is \(r=5\).
      +
      +---
      +
      +### 2.  The second equation  
      +
      +\[
      +|z-4-k|=|z-3i-k|
      +\]
      +
      +means that the point \(z\) is equidistant from the points  
      +
      +\[
      +A=(4+k,0), \qquad B=(k,3).
      +\]
      +
      +Hence the locus is the **perpendicular bisector** of segment \(\overline{AB}\).
      +
      +* Midpoint of \(AB\):
      +
      +\[
      +M=\Bigl(\frac{(k+4)+k}{2},\frac{0+3}{2}\Bigr)=(k+2,\tfrac32).
      +\]
      +
      +* Direction vector of \(AB\):  
      +
      +\[
      +\vec{AB}=(-4,3) \quad\Longrightarrow\quad \text{slope of }AB =-\frac34 .
      +\]
      +
      +The perpendicular bisector therefore has slope the negative reciprocal, \(\frac43\).
      +
      +The equation of the line \(L_k\) (the bisector) is  
      +
      +\[
      +y-\tfrac32=\frac43\bigl(x-(k+2)\bigr)
      +\]
      +
      +or, after clearing fractions,
      +
      +\[
      +8x-6y-(8k+7)=0. \tag{1}
      +\]
      +
      +---
      +
      +### 3.  Tangency condition  
      +
      +The system has **exactly one** solution precisely when the line \(L_k\) is tangent to the circle \(C\).  
      +Tangency occurs when the distance from the centre \(C_0=(25,20)\) to the line equals the radius \(5\).
      +
      +For the line \(8x-6y-(8k+7)=0\),
      +
      +\[
      +\text{dist}(C_0,L_k)=\frac{|8\cdot25-6\cdot20-(8k+7)|}{\sqrt{8^2+(-6)^2}}
      +                     =\frac{|200-120-(8k+7)|}{10}
      +                     =\frac{|73-8k|}{10}.
      +\]
      +
      +Set this equal to the radius \(5\):
      +
      +\[
      +\frac{|73-8k|}{10}=5\quad\Longrightarrow\quad |73-8k|=50.
      +\]
      +
      +Hence  
      +
      +\[
      +73-8k=50 \quad\text{or}\quad 73-8k=-50 .
      +\]
      +
      +Solving gives  
      +
      +\[
      +\begin{cases}
      +73-8k=50 &\Rightarrow\; 8k=23 \;\Rightarrow\; k=\dfrac{23}{8},\\[4pt]
      +73-8k=-50 &\Rightarrow\; 8k=123 \;\Rightarrow\; k=\dfrac{123}{8}.
      +\end{cases}
      +\]
      +
      +Both values make the line tangent to the circle, so each yields exactly one solution \(z\).
      +
      +---
      +
      +### 4.  Sum of all possible \(k\)
      +
      +\[
      +k_1+k_2=\frac{23}{8}+\frac{123}{8}=\frac{146}{8}=\frac{73}{4}.
      +\]
      +
      +Thus \(m=73,\; n=4\) (coprime), and
      +
      +\[
      +m+n=73+4=77.
      +\]
      +
      +---
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=\mathbf b ,\qquad C=\mathbf c .
      +\]
      +
      +Then \(\triangle ABC\) has oriented area  
      +
      +\[
      +[\triangle ABC]=\frac12\,\bigl(\mathbf b\times\mathbf c\bigr) .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates of the points on the sides  
      +
      +On \(AB\)
      +
      +\[
      +AD=4,\;DE=16,\;EB=8\qquad\Longrightarrow\qquad AB=28 .
      +\]
      +
      +Hence  
      +
      +\[
      +D=\frac{4}{28}\mathbf b=\frac17\mathbf b ,\qquad 
      +E=\frac{20}{28}\mathbf b=\frac57\mathbf b .
      +\]
      +
      +On \(AC\)
      +
      +\[
      +AF=13,\;FG=52,\;GC=26\qquad\Longrightarrow\qquad AC=91 .
      +\]
      +
      +Thus  
      +
      +\[
      +F=\frac{13}{91}\mathbf c ,\qquad 
      +G=\frac{65}{91}\mathbf c .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Area of \(DEGF\)
      +
      +For any two points \(P=\alpha_P\mathbf b+\beta_P\mathbf c\) and
      +\(Q=\alpha_Q\mathbf b+\beta_Q\mathbf c\),
      +
      +\[
      +P\times Q=(\alpha_P\beta_Q-\beta_P\alpha_Q)\,(\mathbf b\times\mathbf c).
      +\]
      +
      +With the order \(D\to E\to G\to F\) we obtain  
      +
      +\[
      +\begin{aligned}
      +\sum (P_i\times P_{i+1})&=
      +\underbrace{D\times E}_{0}
      ++\underbrace{E\times G}_{\frac{5}{7}\frac{65}{91}\,K}
      ++\underbrace{G\times F}_{0}
      ++\underbrace{F\times D}_{-\frac{13}{91}\frac1{7}\,K}   \\[2mm]
      +&=\Bigl(\frac{5\cdot65}{7\cdot91}
      +      -\frac{13}{7\cdot91}\Bigr)K
      +   =\frac{312}{637}\,K ,
      +\end{aligned}
      +\]
      +
      +where \(K=\mathbf b\times\mathbf c\).  
      +Therefore  
      +
      +\[
      +[DEGF]=\frac12\Bigl|\frac{312}{637}K\Bigr|
      +       =\frac{156}{637}|K| .
      +\]
      +
      +Given \([DEGF]=288\),
      +
      +\[
      +|K|=288\cdot\frac{637}{156}=1176 .
      +\]
      +
      +Consequently  
      +
      +\[
      +[\triangle ABC]=\frac12|K|=588 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  The reflected points  
      +
      +Reflecting \(D\) across \(F\) gives  
      +
      +\[
      +M=2F-D=\frac{26}{91}\mathbf c-\frac{13}{91}\mathbf b .
      +\]
      +
      +Reflecting \(G\) across \(E\) gives  
      +
      +\[
      +N=2E-G=\frac{130}{91}\mathbf b-\frac{65}{91}\mathbf c .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of the heptagon \(AFNBCEM\)
      +
      +List the vertices in the given order and write each as
      +\(P_i=\alpha_i\mathbf b+\beta_i\mathbf c\):
      +
      +\[
      +\begin{array}{c|c|c}
      +\text{vertex}&\alpha_i&\beta_i\\\hline
      +A&0&0\\
      +F&0&\dfrac{13}{91}\\
      +N&\dfrac{130}{91}&-\dfrac{65}{91}\\
      +B&1&0\\
      +C&0&1\\
      +E&\dfrac57&0\\
      +M&-\dfrac{13}{91}&\dfrac{26}{91}
      +\end{array}
      +\]
      +
      +For the polygon the signed area is  
      +
      +\[
      +\frac12\sum_{i=0}^{6}(\alpha_i\beta_{i+1}-\beta_i\alpha_{i+1})\,K .
      +\]
      +
      +Computing the sum (using the common denominator \(8281=91^{2}=7^{2}\,13^{2}\)) gives  
      +
      +\[
      +\sum_{i}(\alpha_i\beta_{i+1}-\beta_i\alpha_{i+1})=1 .
      +\]
      +
      +Hence  
      +
      +\[
      +[AFNBCEM]=\frac12\,K
      +         =\frac12\cdot1176
      +         =588 .
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(0,c) , \qquad  b^{2}+c^{2}=BC^{2}=38^{2}=1444 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates of \(K\) and \(L\)
      +
      +Because \(AK=BK=14\), the point \(K\) is on the perpendicular bisector of \(\overline{AB}\); hence  
      +
      +\[
      +K=\Bigl(\frac b2 ,\; \sqrt{14^{2}-\Bigl(\frac b2\Bigr)^{2}}\Bigr).
      +\]
      +
      +Write  
      +
      +\[
      +m=\frac b2 ,\qquad p=\sqrt{196-m^{2}},
      +\]
      +
      +so \(K=(m,p)\) and \(m^{2}+p^{2}=196\).
      +
      +Similarly \(AL=CL=14\) gives  
      +
      +\[
      +L=\Bigl(\sqrt{196-n^{2}},\; n\Bigr),
      +\]
      +
      +with  
      +
      +\[
      +n=\frac c2 ,\qquad q=\sqrt{196-n^{2}},\qquad n^{2}+q^{2}=196 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Trigonometric parametrisation  
      +
      +Since \(m^{2}+p^{2}=196\) we may set  
      +
      +\[
      +m=14\cos\theta ,\qquad p=14\sin\theta ,\qquad 0<\theta<\frac{\pi}{2}.
      +\]
      +
      +Likewise  
      +
      +\[
      +n=14\sin\psi ,\qquad q=14\cos\psi ,\qquad 0<\psi<\frac{\pi}{2}.
      +\]
      +
      +Because \(AKL\) is equilateral, \(\angle KAL=60^{\circ}\); therefore  
      +
      +\[
      +\psi-\theta=60^{\circ}\qquad\Longrightarrow\qquad\psi=\theta+\frac{\pi}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  The right‑triangle condition  
      +
      +\[
      +b^{2}+c^{2}=4(m^{2}+n^{2})=1444\quad\Longrightarrow\quad m^{2}+n^{2}=361 .
      +\]
      +
      +Substituting the trigonometric expressions,
      +
      +\[
      +(14\cos\theta)^{2}+(14\sin\psi)^{2}=361
      +\Longrightarrow 
      +\cos ^{2}\theta+\sin ^{2}(\theta+60^{\circ})=\frac{361}{196}.
      +\]
      +
      +Using \(\sin^{2}\alpha=\frac{1-\cos2\alpha}{2}\) and simplifying we obtain  
      +
      +\[
      +3\cos2\theta+\sqrt3\sin2\theta=\frac{165}{49}.
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of \(BKLC\)
      +
      +The region \(BKLC\) is the triangle \(ABC\) with three interior triangles removed:
      +
      +\[
      +[BKLC]=[ABC]-[ABK]-[ALC]-[AKL].
      +\]
      +
      +Now  
      +
      +\[
      +[ABC]=\frac{bc}{2}=2mn, \qquad
      +[ABK]=\frac{b\;y_{K}}{2}=mp, \qquad
      +[ALC]=\frac{c\;x_{L}}{2}=nq,
      +\]
      +
      +and \([AKL]=\frac{\sqrt3}{4}\,14^{2}=49\sqrt3\).
      +
      +Hence  
      +
      +\[
      +S=[BKLC]=2mn-mp-nq-49\sqrt3 .
      +\tag{2}
      +\]
      +
      +Insert the trigonometric forms:
      +
      +\[
      +\begin{aligned}
      +2mn&=2(14\cos\theta)(14\sin\psi)=196\bigl(2\cos\theta\sin\psi\bigr),\\
      +mp&=14^{2}\cos\theta\sin\theta=196(\cos\theta\sin\theta),\\
      +nq&=14^{2}\sin\psi\cos\psi=196(\sin\psi\cos\psi).
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +S=196\bigl[2\cos\theta\sin\psi-(\cos\theta\sin\theta+\sin\psi\cos\psi)\bigr]-49\sqrt3 .
      +\tag{3}
      +\]
      +
      +Using \(\psi=\theta+60^{\circ}\) and elementary identities, (3) reduces to  
      +
      +\[
      +S=49\bigl[\sqrt3\,(4\cos^{2}\theta-1)-2\sin(2\theta+120^{\circ})\bigr].
      +\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Eliminate the trigonometric functions
      +
      +Set  
      +
      +\[
      +A=\cos(2\theta-30^{\circ}).
      +\]
      +
      +From (1),
      +
      +\[
      +3\cos2\theta+\sqrt3\sin2\theta
      +      =\frac{165}{49}
      +      =2\sqrt3\,A .
      +\]
      +
      +Hence  
      +
      +\[
      +A=\frac{165}{98\sqrt3}.
      +\tag{5}
      +\]
      +
      +Express the right–hand side of (4) in terms of \(A\).  
      +Write  
      +
      +\[
      +\begin{aligned}
      +X&=\frac{\sqrt3}{2}\cos2\theta,\qquad
      +Y=\frac12\sin2\theta,
      +\end{aligned}
      +\]
      +
      +so that  
      +
      +\[
      +A=X+Y,\qquad
      +\sin(2\theta+120^{\circ})=X-Y .
      +\]
      +
      +Then  
      +
      +\[
      +\sqrt3\,(4\cos^{2}\theta-1)=\sqrt3+4X,
      +\qquad
      +-2\sin(2\theta+120^{\circ})=-2(X-Y).
      +\]
      +
      +Substituting these into (4) gives  
      +
      +\[
      +S=49\bigl(\sqrt3+4X-2X+2Y\bigr)
      +   =49\bigl(\sqrt3+2(X+Y)\bigr)
      +   =49\bigl(\sqrt3+2A\bigr).
      +\]
      +
      +Finally insert (5):
      +
      +\[
      +S=49\left(\sqrt3+\frac{2\cdot165}{98\sqrt3}\right)
      +   =49\sqrt3+\frac{165}{\sqrt3}
      +   =\frac{147+165}{\sqrt3}
      +   =\frac{312}{\sqrt3}
      +   =104\sqrt3 .
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{104}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the letters be numbered  
      +
      +\[
      +A=1,\;B=2,\;\dots ,\;L=12 .
      +\]
      +
      +A random pairing of the 12 letters is a **perfect matching**.  
      +The total number of unordered pairings is  
      +
      +\[
      +(12-1)!!=\frac{12!}{2!^{6}6!}=10395 .
      +\]
      +
      +---
      +
      +### 1.  Fix the partner of \(G\)
      +
      +In a random matching the partner of \(G\) is equally likely to be any of the other \(11\) letters.  
      +Let the partner be \(X\neq G\).  Write  
      +
      +\[
      +m=\min \{G,X\}.
      +\]
      +
      +The pair containing \(G\) will be the last (lexicographically largest) word **iff**  
      +all minima of the other five pairs are less than \(m\).  
      +Hence we must count, for each possible partner \(X\), the number of matchings of the
      +remaining \(10\) letters whose minima are all \(<m\).
      +
      +Denote by  
      +
      +* \(L\) – the letters smaller than \(m\) that are still present,
      +* \(H\) – the letters larger than \(m\) that are still present.
      +
      +If a matching of those ten letters contains a pair wholly inside \(H\) then its minimum
      +is \(\ge m\), which is not allowed.  
      +Thus **every letter of \(H\) must be paired with a distinct letter of \(L\)**.  
      +The remaining letters of \(L\) (if any) are paired among themselves.
      +
      +Let \(|L|=a,\;|H|=b\) \((a+b=10)\).  
      +A valid matching is obtained by
      +
      +1. choosing which \(b\) letters of \(L\) will be paired with the \(b\) letters of \(H\)
      +   – \(\binom{a}{b}\) ways;
      +2. bijecting the chosen \(b\) letters of \(L\) with the \(b\) letters of \(H\) –
      +   \(b!\) ways;
      +3. pairing the remaining \(a-b\) letters of \(L\) among themselves – \((a-b-1)!!\) ways.
      +
      +Hence the number of “good’’ matchings is  
      +
      +\[
      +\text{good}= \binom{a}{b}\,b!\,(a-b-1)!! 
      +           =\frac{a!}{2^{(a-b)/2}\,\bigl((a-b)/2\bigr)! } .
      +\]
      +
      +The total number of matchings of ten letters is  
      +
      +\[
      +\frac{10!}{2!^{5}5!}=945 .
      +\]
      +
      +---
      +
      +### 2.  Cases for the partner \(X\)
      +
      +#### (i)  \(X>G\)  
      +
      +Possible partners: \(H,I,J,K,L\) (5 choices).  
      +Here \(m=G\).  
      +Among the remaining letters we have  
      +
      +\[
      +L=\{A,B,C,D,E,F\}\;(a=6),\qquad
      +H=\{\text{the four letters }>G\text{ other than }X\}\;(b=4).
      +\]
      +
      +Thus  
      +
      +\[
      +\text{good}= \frac{6!}{2^{1}\cdot1!}=360,
      +\qquad
      +P(\text{good}\mid X)=\frac{360}{945}= \frac{8}{21}.
      +\]
      +
      +Contribution to the required probability:
      +
      +\[
      +5\cdot\frac1{11}\cdot\frac{8}{21}= \frac{40}{231}.
      +\]
      +
      +#### (ii)  \(X<G\)
      +
      +Possible partners: \(A,B,C,D,E,F\).  
      +Write \(X\) as the \(i\)-th letter (\(i=1,\dots ,6\)).
      +Then  
      +
      +\[
      +a=i-1,\qquad b=11-i .
      +\]
      +
      +The condition “all minima \(<X\)” requires \(b\le a\); this holds only when \(i=6\),
      +i.e. \(X=F\).
      +
      +For \(X=F\),
      +
      +\[
      +L=\{A,B,C,D,E\},\; a=5,\qquad 
      +H=\{H,I,J,K,L\},\; b=5 .
      +\]
      +
      +Hence  
      +
      +\[
      +\text{good}=5! =120,
      +\qquad
      +P(\text{good}\mid X=F)=\frac{120}{945}= \frac{8}{63}.
      +\]
      +
      +Contribution from this case:
      +
      +\[
      +\frac1{11}\cdot\frac{8}{63}= \frac{8}{693}.
      +\]
      +
      +All other choices of \(X<G\) give probability \(0\).
      +
      +---
      +
      +### 3.  Total probability
      +
      +\[
      +P=\frac{40}{231}+\frac{8}{693}
      +   =\frac{120}{693}+\frac{8}{693}
      +   =\frac{128}{693}.
      +\]
      +
      +Thus  
      +
      +\[
      +\frac{m}{n}= \frac{128}{693},\qquad m+n=128+693=821.
      +\]
      +
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First write the conditions in a convenient form.
      +
      +\[
      +x+y+z = 75 \qquad\text{and}\qquad 
      +x-yz<y-zx<z-xy .
      +\]
      +
      +Factor each inequality:
      +
      +\[
      +\begin{aligned}
      +x-yz<y-zx &\iff (x-y)(1+z)<0,\\
      +y-zx<z-xy &\iff (y-z)(1+x)<0 .
      +\end{aligned}
      +\]
      +
      +Thus on the plane \(x+y+z=75\),
      +
      +\[
      +(x-y)(z+1)<0,\qquad (y-z)(x+1)<0 .
      +\]
      +
      +---
      +
      +### 1.  Reduce to two variables
      +
      +From \(z=75-x-y\) we obtain
      +
      +\[
      +\begin{aligned}
      +(x-y)(z+1)&=(x-y)(76-x-y),\\
      +(y-z)(x+1)&=(x+2y-75)(x+1).
      +\end{aligned}
      +\]
      +
      +Hence the region in the \((x,y)\)-plane is described by  
      +
      +\[
      +\boxed{(x-y)(76-x-y)<0}\qquad\text{and}\qquad\boxed{(x+2y-75)(x+1)<0}.
      +\tag{1}
      +\]
      +
      +The four linear factors are
      +
      +\[
      +L_1=x-y,\;L_2=76-x-y,\;L_3=x+2y-75,\;L_4=x+1 .
      +\]
      +
      +---
      +
      +### 2.  Split the two products
      +
      +\[
      +\begin{aligned}
      +(x-y)(76-x-y)<0 &\Longleftrightarrow 
      +\begin{cases}
      +x>y,\;x+y>76\quad\text{(region }A)\\
      +\text{or}\\
      +x<y,\;x+y<76\quad\text{(region }B)
      +\end{cases}\\[2mm]
      +(x+2y-75)(x+1)<0 &\Longleftrightarrow
      +\begin{cases}
      +x<-1,\;x+2y>75\quad\text{(region }C)\\
      +\text{or}\\
      +x>-1,\;x+2y<75\quad\text{(region }D)
      +\end{cases}
      +\end{aligned}
      +\]
      +
      +Intersecting the possibilities gives four candidate regions:
      +
      +\[
      +\begin{array}{c|c}
      +\text{Intersection} & \text{Constraints}\\ \hline
      +A\cap C & x>y,\;x+y>76,\;x<-1,\;x+2y>75\\
      +A\cap D & x>y,\;x+y>76,\;x>-1,\;x+2y<75\\
      +B\cap C & x<y,\;x+y<76,\;x<-1,\;x+2y>75\\
      +B\cap D & x<y,\;x+y<76,\;x>-1,\;x+2y<75
      +\end{array}
      +\]
      +
      +The first intersection is impossible (it would require \(x>y\) while \(x<-1<y\)), so it is empty.
      +The remaining three are non‑empty; two are unbounded, while one is bounded.
      +
      +---
      +
      +### 3.  Identify the bounded region
      +
      +The bounded region is \(B\cap D\):
      +
      +\[
      +\begin{cases}
      +x>-1,\\[2pt]
      +x<y,\\[2pt]
      +x+2y<75 .
      +\end{cases}
      +\]
      +
      +From \(x<y\) and \(x+2y<75\) we obtain the upper bound for \(y\):
      +\[
      +y<\frac{75-x}{2}.
      +\]
      +
      +Together with \(x>-1\) this forces
      +\[
      +-1<x<25,
      +\qquad
      +x<y<\frac{75-x}{2}.
      +\]
      +
      +Hence in the \((x,y)\)-plane the region is the open triangle bounded by the three lines
      +
      +\[
      +x=-1,\quad y=x,\quad y=\frac{75-x}{2}.
      +\]
      +
      +Its vertices are  
      +
      +\[
      +(-1,-1),\;(-1,38),\;(25,25).
      +\]
      +
      +The area in the \((x,y)\)-plane is
      +
      +\[
      +\text{Area}_{xy}
      += \frac12\cdot(\text{base})\cdot(\text{height})
      += \frac12\cdot 39 \cdot 26=507 .
      +\]
      +
      +---
      +
      +### 4.  Convert to area on the original plane
      +
      +The plane \(x+y+z=75\) can be written as \(z=75-x-y\).
      +For a graph \(z=f(x,y)\) the surface element is  
      +
      +\[
      +dA = \sqrt{1+f_x^2+f_y^2}\,dx\,dy
      +    =\sqrt{1+(-1)^2+(-1)^2}\,dx\,dy
      +    =\sqrt{3}\,dx\,dy .
      +\]
      +
      +Therefore the area of the finite region on the plane \(x+y+z=75\) is  
      +
      +\[
      +\text{Area}= \sqrt{3}\times 507 = 507\sqrt{3}.
      +\]
      +
      +---
      +
      +### 5.  Form \(a\sqrt{b}\) and compute \(a+b\)
      +
      +\[
      +a=507,\qquad b=3\;( \text{square‑free}).
      +\]
      +
      +Thus  
      +
      +\[
      +a+b = 507+3 = 510.
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The graph of  
      +
      +\[
      +f(x)=\begin{cases}
      +x,&-1\le x<1\\[2pt]
      +2-x,&1\le x<3
      +\end{cases},\qquad f(x+4)=f(x)
      +\]
      +
      +is a periodic “saw‑tooth’’ of period \(4\).  
      +The parabola is  
      +
      +\[
      +x=34y^{2}\qquad (x\ge 0).
      +\]
      +
      +For an intersection we need  
      +
      +\[
      +y=f(x),\qquad x=34y^{2}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.   Reducing the \(x\)–coordinate
      +
      +Write \(x=34y^{2}=4n+u\) where \(n\in\mathbb Z\) and the reduced part  
      +
      +\[
      +u\in[-1,3)
      +\]
      +
      +(because on each period we use the definition of \(f\) on \([-1,3)\)).
      +Hence  
      +
      +\[
      +u=34y^{2}-4n .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.   The two cases for \(u\)
      +
      +* If \(u\in[-1,1)\) then \(f(x)=u\); the equation becomes  
      +
      +  \[
      +  y=u\quad\Longrightarrow\quad y=34y^{2}-4n .
      +  \]
      +
      +* If \(u\in[1,3)\) then \(f(x)=2-u\); the equation becomes  
      +
      +  \[
      +  y=2-u\quad\Longrightarrow\quad u=2-y ,
      +  \]
      +  hence  
      +
      +  \[
      +  34y^{2}-4n=2-y .
      +  \]
      +
      +Because \(f(x)\) takes only values in \([-1,1]\), all solutions must satisfy \(-1\le y\le 1\).
      +
      +--------------------------------------------------------------------
      +### 3.   Solving the quadratics
      +
      +**Case A:** \(y=34y^{2}-4n\)
      +
      +\[
      +34y^{2}-y-4n=0\qquad\Longrightarrow\qquad  
      +y=\frac{1\pm\sqrt{1+544n}}{68}.
      +\]
      +
      +**Case B:** \(34y^{2}-4n=2-y\)
      +
      +\[
      +34y^{2}+y-(2+4n)=0\qquad\Longrightarrow\qquad  
      +y=\frac{-1\pm\sqrt{273+544n}}{68}.
      +\]
      +
      +Since \(x=34y^{2}\le 34\), we have \(0\le x\le 34\).  
      +Consequently \(4n+u\le 34\) and with \(u\ge-1\) we obtain \(0\le n\le8\).
      +
      +--------------------------------------------------------------------
      +### 4.   Which roots lie in \([-1,1]\)?
      +
      +* For **Case A** (\(n=0,\dots,8\)) both roots are in \([-1,1]\).  
      +  Their sum for each \(n\) is
      +
      +  \[
      +  y_{A+}+y_{A-}= \frac{1}{34}.
      +  \]
      +
      +* For **Case B** (\(n=0,\dots,7\)) both roots are in \([-1,1]\);  
      +  for \(n=8\) only the “+’’ root lies in the interval.  
      +  The sum of the two roots for each \(n\le7\) is
      +
      +  \[
      +  y_{B+}+y_{B-}= -\frac{1}{34}.
      +  \]
      +
      +Thus the total sum of all \(y\)-coordinates is
      +
      +\[
      +\begin{aligned}
      +\sum y &=\sum_{n=0}^{8}\frac1{34}\;+\;\sum_{n=0}^{7}\!\Big(-\frac1{34}\Big)\;+\;y_{B+}(8)\\
      +&= \frac{9}{34}-\frac{8}{34}+y_{B+}(8)\\
      +&= \frac1{34}+ \frac{-1+\sqrt{273+544\cdot8}}{68}.
      +\end{aligned}
      +\]
      +
      +Since \(273+544\cdot8 = 4625 = 25\cdot185\),
      +
      +\[
      +y_{B+}(8)=\frac{-1+5\sqrt{185}}{68},
      +\qquad
      +\frac1{34}= \frac{2}{68}.
      +\]
      +
      +Hence
      +
      +\[
      +\sum y =\frac{2-1+5\sqrt{185}}{68}= \frac{1+5\sqrt{185}}{68}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.   Final form
      +
      +\[
      +\frac{1+5\sqrt{185}}{68}= \frac{a+b\sqrt{c}}{d},
      +\qquad 
      +a=1,\;b=5,\;c=185,\;d=68 .
      +\]
      +
      +All conditions are satisfied (\(\gcd(a,b,d)=1\) and \(185\) is square‑free).
      +
      +\[
      +a+b+c+d = 1+5+185+68 = 259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the three rows be \(R_{1},R_{2},R_{3}\) and the three \(3\times 3\) blocks be  
      +
      +\[
      +B_{1}= \text{columns }1\!-\!3,\qquad   
      +B_{2}= \text{columns }4\!-\!6,\qquad   
      +B_{3}= \text{columns }7\!-\!9 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Fix the first row  
      +
      +Since the rows are labelled, we may first choose any permutation of \(\{1,\dots ,9\}\) for \(R_{1}\).
      +There are  
      +
      +\[
      +9! = 2^{7}\cdot 3^{4}\cdot5\cdot7
      +\]
      +
      +ways.
      +
      +--------------------------------------------------------------------
      +### 2.  Which digits go to the second row in each block?  
      +
      +Assume \(R_{1}=1\,2\,3\;4\,5\,6\;7\,8\,9\) (the identity permutation).  
      +Then  
      +
      +* In \(B_{1}\) the missing digits are \(\{4,5,6,7,8,9\}\);  
      +* In \(B_{2}\) the missing digits are \(\{1,2,3,7,8,9\}\);  
      +* In \(B_{3}\) the missing digits are \(\{1,2,3,4,5,6\}\).
      +
      +For the second row we must pick, from each block, three of its six missing digits.
      +The three rows must each contain every digit exactly once, so each digit
      +must appear **once** in \(R_{2}\) (and the remaining occurrence of that digit will be in \(R_{3}\)).
      +Thus the choice of digits for \(R_{2}\) is a partition of the six–digit sets
      +subject to the condition that each of the nine digits occurs in exactly one block of \(R_{2}\).
      +
      +Let  
      +
      +* \(x\) = number of digits \(\{1,2,3\}\) placed in \(B_{2}\) (the rest go to \(B_{3}\));
      +* \(y\) = number of digits \(\{4,5,6\}\) placed in \(B_{1}\) (the rest go to \(B_{3}\));
      +* \(z\) = number of digits \(\{7,8,9\}\) placed in \(B_{1}\) (the rest go to \(B_{2}\)).
      +
      +From the block‑size condition we obtain  
      +
      +\[
      +\begin{cases}
      +y+z=3,\\
      +x+ (3-z)=3,\\
      +(3-x)+(3-y)=3,
      +\end{cases}\qquad\Longrightarrow\qquad
      +x=z,\;x+y=3 .
      +\]
      +
      +Hence \(x\) may be \(0,1,2,3\); then \(y=3-x\) and \(z=x\).
      +For a given \(x\),
      +
      +* choose the \(x\) digits of \(\{1,2,3\}\) that go to \(B_{2}\): \(\binom{3}{x}\) ways;
      +* choose the \(y=3-x\) digits of \(\{4,5,6\}\) that go to \(B_{1}\): \(\binom{3}{3-x}=\binom{3}{x}\) ways;
      +* choose the \(z=x\) digits of \(\{7,8,9\}\) that go to \(B_{1}\): \(\binom{3}{x}\) ways.
      +
      +Thus for this \(x\) we have \(\bigl(\binom{3}{x}\bigr)^{3}\) possibilities.
      +Summing over \(x=0,1,2,3\),
      +
      +\[
      +\sum_{x=0}^{3}\binom{3}{x}^{3}=1+27+27+1=56 .
      +\]
      +
      +So there are \(56\) ways to decide which three‑digit sets belong to the second row
      +(and the third row is forced to receive the complementary sets).
      +
      +--------------------------------------------------------------------
      +### 3.  Ordering the digits inside each block  
      +
      +Inside a block each row contains three distinct digits.
      +For a fixed block, the three chosen digits of \(R_{2}\) can be placed in the
      +three columns in \(3!\) ways, and independently the three digits of \(R_{3}\) can be placed in \(3!\) ways.
      +Hence each block contributes \((3!)^{2}=36\) arrangements.
      +
      +With three blocks we obtain \((36)^{3}=36^{3}=46\,656\) column‑orderings.
      +
      +--------------------------------------------------------------------
      +### 4.  Total number of grids  
      +
      +\[
      +N = 9! \times 56 \times 36^{3}
      +     = 2^{7}\!3^{4}\!5\!7\; \times 2^{3}\!7\; \times 2^{6}\!3^{6}
      +     = 2^{16}\,3^{10}\,5^{1}\,7^{2}.
      +\]
      +
      +Thus
      +
      +\[
      +N = p^{a}\,q^{b}\,r^{c}\,s^{d}
      +\quad\text{with}\quad
      +(p,q,r,s)=(2,3,5,7),\;
      +(a,b,c,d)=(16,10,1,2).
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Required sum  
      +
      +\[
      +p a + q b + r c + s d
      + = 2\cdot16 + 3\cdot10 + 5\cdot1 + 7\cdot2
      + = 32 + 30 + 5 + 14
      + = 81 .
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line containing the points be the \(x\)-axis.  
      +Place \(A\) at the origin, \(A=(0,0)\), and write the coordinates of the other
      +collinear points as
      +
      +\[
      +B=(x_B,0),\;C=(x_C,0),\;D=(x_D,0),\;E=(x_E,0),\;F=(x_F,0).
      +\]
      +
      +---
      +
      +### 1.  Find the positions of \(B,\;C,\;D,\;E,\;F\)
      +
      +The given distances are along the line, so
      +
      +\[
      +\begin{aligned}
      +AC&=26 &&\Rightarrow x_C=26,\\[2pt]
      +AF&=73 &&\Rightarrow x_F=73,\\[2pt]
      +CE&=31 &&\Rightarrow x_E=x_C+31=57,\\[2pt]
      +DF&=33 &&\Rightarrow x_D=x_F-33=40,\\[2pt]
      +BD&=22 &&\Rightarrow x_B=x_D-22=18.
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +A=0,\; B=18,\; C=26,\; D=40,\; E=57,\; F=73 .
      +\]
      +
      +---
      +
      +### 2.  Coordinates of \(G\)
      +
      +Let \(G=(x_G,h)\), where \(h>0\) is the perpendicular distance from \(G\) to the line.
      +
      +The distances from \(G\) to \(C\) and \(D\) give
      +
      +\[
      +\begin{cases}
      +(x_G-26)^2+h^2 = 40^2 = 1600,\\[4pt]
      +(x_G-40)^2+h^2 = 30^2 = 900 .
      +\end{cases}
      +\]
      +
      +Subtracting the second equation from the first:
      +
      +\[
      +(x_G-26)^2-(x_G-40)^2 = 1600-900 = 700 .
      +\]
      +
      +Compute the left side:
      +
      +\[
      +(x_G^2-52x_G+26^2)-(x_G^2-80x_G+40^2)
      +=28x_G-924 .
      +\]
      +
      +Hence  
      +
      +\[
      +28x_G-924 = 700 \quad\Longrightarrow\quad 28x_G = 1624
      +\quad\Longrightarrow\quad x_G = 58 .
      +\]
      +
      +Now find \(h\) using either distance equation; use the first:
      +
      +\[
      +(58-26)^2 + h^2 = 1600
      +\Longrightarrow 32^2 + h^2 = 1600
      +\Longrightarrow h^2 = 1600-1024 = 576
      +\Longrightarrow h = 24 .
      +\]
      +
      +Thus \(G=(58,24)\). Its perpendicular projection onto the line is at \(x=58\), which lies between \(E\) and \(F\).
      +
      +---
      +
      +### 3.  Area of \(\triangle BGE\)
      +
      +The base \(BE\) lies on the \(x\)-axis:
      +
      +\[
      +BE = x_E - x_B = 57-18 = 39 .
      +\]
      +
      +The height from \(G\) to this base is the vertical distance \(h=24\).
      +
      +Therefore
      +
      +\[
      +\text{Area} = \frac12 \times (\text{base}) \times (\text{height})
      += \frac12 \times 39 \times 24 = 39 \times 12 = 468 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\text{Find all }n\in\mathbb Z_{>0}\text{ such that }(n+2)\mid 3(n+3)(n^2+9).
      +\]
      +
      +---
      +
      +### 1.  Replace \(n+2\) by a new variable  
      +
      +Set  
      +\[
      +m=n+2\qquad (m\ge 3).
      +\]
      +
      +Then  
      +
      +\[
      +n=m-2,\qquad n+3=m+1,\qquad n^2+9=(m-2)^2+9=m^{2}-4m+13 .
      +\]
      +
      +Hence the divisibility condition becomes  
      +
      +\[
      +m\mid 3(m+1)(m^{2}-4m+13).
      +\tag{1}
      +\]
      +
      +---
      +
      +### 2.  Reduce the right–hand side modulo \(m\)
      +
      +Modulo \(m\),
      +
      +\[
      +m+1\equiv 1,\qquad m^{2}-4m+13\equiv 13 .
      +\]
      +
      +Therefore  
      +
      +\[
      +3(m+1)(m^{2}-4m+13)\equiv 3\cdot1\cdot13=39 \pmod m .
      +\]
      +
      +So (1) is equivalent to  
      +
      +\[
      +m\mid 39 .
      +\tag{2}
      +\]
      +
      +Indeed, if \(m\mid 39\) then the right–hand side of (1) equals \(39+km\) for some integer \(k\), hence is divisible by \(m\); conversely, if \(m\mid 3(m+1)(m^{2}-4m+13)\) then \(m\mid 39\).
      +
      +---
      +
      +### 3.  List possible \(m\)
      +
      +The positive divisors of \(39\) are  
      +
      +\[
      +1,\;3,\;13,\;39 .
      +\]
      +
      +Since \(m=n+2\ge 3\) (because \(n\ge1\)), we keep  
      +
      +\[
      +m\in\{3,\;13,\;39\}.
      +\]
      +
      +---
      +
      +### 4.  Recover the corresponding \(n\)
      +
      +\[
      +\begin{aligned}
      +m=3 &\;\Rightarrow\; n=m-2=1,\\[2pt]
      +m=13 &\;\Rightarrow\; n=11,\\[2pt]
      +m=39 &\;\Rightarrow\; n=37 .
      +\end{aligned}
      +\]
      +
      +All three indeed satisfy the original divisibility (quick check: the quotients are \(40,420,4240\) respectively).
      +
      +---
      +
      +### 5.  Sum of all such \(n\)
      +
      +\[
      +1+11+37=49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +P:\;y=x^{2}-4
      +\]
      +
      +and rotate \(P\) \(60^{\circ}\) counter‑clockwise about the origin.  
      +If \((u,v)\) is a point of \(P\) \((v=u^{2}-4)\), after the rotation we obtain  
      +
      +\[
      +\begin{aligned}
      +x &=u\cos 60^{\circ}-v\sin 60^{\circ}
      +      =\frac{u-\sqrt3\,(u^{2}-4)}2,\\[2mm]
      +y &=u\sin 60^{\circ}+v\cos 60^{\circ}
      +      =\frac{\sqrt3\,u+u^{2}-4}2 .
      +\end{aligned}
      +\tag{1}
      +\]
      +
      +A point \((x,y)\) that belongs to both the original parabola and its image
      +must satisfy  
      +
      +\[
      +y=x^{2}-4 \qquad\text{and}\qquad (x,y)=\bigl(x(u),y(u)\bigr)\text{ for some }u .
      +\]
      +
      +Using (1) and substituting \(y=x^{2}-4\) we get an equation for the
      +pre‑image coordinate \(u\):
      +
      +\[
      +\Bigl(u-\sqrt3\,(u^{2}-4)\Bigr)^{2}=2u^{2}+2\sqrt3\,u+8 .
      +\]
      +
      +Simplifying gives  
      +
      +\[
      +3u^{4}-25u^{2}+40+2\sqrt3\,u\,(3-u^{2})=0 .
      +\tag{2}
      +\]
      +
      +Let \(t=u^{2}=x^{2}\;(t\ge0)\).  Equation (2) becomes  
      +
      +\[
      +\bigl(3t^{2}-25t+40\bigr)^{2}=12t\,(3-t)^{2},
      +\]
      +
      +or
      +
      +\[
      +9t^{4}-162t^{3}+937t^{2}-2108t+1600=0 .
      +\tag{3}
      +\]
      +
      +The quartic factors over the integers:
      +
      +\[
      +\begin{aligned}
      +9t^{4}-162t^{3}+937t^{2}-2108t+1600
      +  &=\bigl(t^{2}-11t+16\bigr)\bigl(9t^{2}-63t+100\bigr).
      +\end{aligned}
      +\]
      +
      +Thus the possible values of \(t\) are
      +
      +\[
      +t=\frac{11\pm\sqrt{57}}2,\qquad
      +t=\frac{63\pm\sqrt{369}}{18}.
      +\]
      +
      +Recall that \(t=x^{2}\) and that a genuine intersection must satisfy the
      +original unsquared equation  
      +
      +\[
      +3t^{2}-25t+40=2\sqrt3\,\sqrt t\,(3-t).
      +\tag{4}
      +\]
      +
      +Checking the sign of each side of (4) shows that only  
      +
      +\[
      +t=\frac{11-\sqrt{57}}2\approx1.725
      +\]
      +
      +satisfies (4) with \(x>0\).  (The other three roots correspond to the
      +case \(3t^{2}-25t+40= -2\sqrt3\,\sqrt t\,(3-t)\) or give \(y>0\).)
      +
      +Since \(y=x^{2}-4=t-4\),
      +
      +\[
      +y=\frac{11-\sqrt{57}}2-4=\frac{3-\sqrt{57}}2 .
      +\]
      +
      +Hence the required numbers are  
      +
      +\[
      +a=3,\qquad b=57,\qquad c=2,
      +\]
      +
      +with \(\gcd(a,c)=1\).  Therefore
      +
      +\[
      +a+b+c=3+57+2=62 .
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\prod_{k=4}^{63}\frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})}
      +\]
      +
      +---
      +
      +### 1.  Rewrite each term using change of base  
      +
      +\[
      +\log_a b=\frac{\ln b}{\ln a}
      +\]
      +
      +Hence  
      +
      +\[
      +\frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})}
      + =\frac{\displaystyle\frac{\ln\! \big(5^{\,k^2-1}\big)}{\ln k}}
      +        {\displaystyle\frac{\ln\! \big(5^{\,k^2-4}\big)}{\ln (k+1)}}
      + =\frac{(k^2-1)\ln5}{\ln k}\cdot\frac{\ln (k+1)}{(k^2-4)\ln5}
      + =\frac{k^2-1}{k^2-4}\cdot\frac{\ln(k+1)}{\ln k}.
      +\]
      +
      +Thus the whole product becomes  
      +
      +\[
      +\Bigl[\prod_{k=4}^{63}\frac{k^2-1}{\,k^2-4}\Bigr]\,
      +\Bigl[\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}\Bigr].
      +\]
      +
      +---
      +
      +### 2.  The logarithmic factor telescopes  
      +
      +\[
      +\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}
      += \frac{\ln5}{\ln4}\cdot\frac{\ln6}{\ln5}\cdots\frac{\ln64}{\ln63}
      += \frac{\ln64}{\ln4}
      += \frac{6\ln2}{2\ln2}=3.
      +\]
      +
      +---
      +
      +### 3.  Simplify the rational factor  
      +
      +\[
      +\frac{k^2-1}{k^2-4}= \frac{(k-1)(k+1)}{(k-2)(k+2)}.
      +\]
      +
      +Hence  
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}
      += \Bigl[\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr]
      +  \Bigl[\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr].
      +\]
      +
      +**First product**
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      += \frac{3}{2}\cdot\frac{4}{3}\cdot\frac{5}{4}\cdots\frac{62}{61}
      += \frac{62}{2}=31.
      +\]
      +
      +**Second product**
      +
      +\[
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      += \frac{5}{6}\cdot\frac{6}{7}\cdot\frac{7}{8}\cdots\frac{64}{65}
      += \frac{5}{65}= \frac{1}{13}.
      +\]
      +
      +Multiplying,
      +
      +\[
      +\prod_{k=4}^{63}\frac{k^2-1}{k^2-4}=31\cdot\frac{1}{13}= \frac{31}{13}.
      +\]
      +
      +---
      +
      +### 4.  Combine the two parts  
      +
      +\[
      +\prod_{k=4}^{63}\frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})}
      += \frac{31}{13}\times 3 = \frac{93}{13}.
      +\]
      +
      +The fraction \(\frac{93}{13}\) is already in lowest terms (\(\gcd(93,13)=1\)).  
      +
      +Thus \(m=93,\; n=13\) and  
      +
      +\[
      +m+n = 93+13 = 106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Sketch**
      +
      +Write every integer \(a\le 3^{6}=729\) in its base‑\(3\) expansion  
      +
      +\[
      +a = a_{0}+a_{1}3+a_{2}3^{2}+a_{3}3^{3}+a_{4}3^{4}+a_{5}3^{5},
      +\qquad a_{i}\in\{0,1,2\}.
      +\]
      +
      +Let  
      +
      +\[
      +A(x)=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+a_{4}x^{4}+a_{5}x^{5}\in\mathbb{F}_{3}[x].
      +\]
      +
      +Modulo \(3^{7}\) we have  
      +
      +\[
      +a^{3}\equiv a_{0}^{3}+9a_{0}^{2}a_{1}+27\bigl(a_{0}a_{1}^{2}+a_{0}^{2}a_{2}\bigr)
      +               +\; \cdots\;+3^{6}a_{2}^{3}\pmod{3^{7}} .
      +\]
      +
      +Hence
      +
      +\[
      +a^{3}+b^{3}+c^{3}\equiv 
      +\sum_{i=0}^{2}3^{i}\bigl(a_{i}^{3}+b_{i}^{3}+c_{i}^{3}\bigr)\pmod{3^{7}} .
      +\]
      +
      +Because \(x^{3}\equiv x\pmod 3\) for \(x\in\{0,1,2\}\), the condition
      +\(a^{3}+b^{3}+c^{3}\equiv0\pmod{3^{7}}\) is equivalent to the three
      +independent linear equations  
      +
      +\[
      +a_{0}+b_{0}+c_{0}\equiv0,\qquad
      +a_{1}+b_{1}+c_{1}\equiv0,\qquad
      +a_{2}+b_{2}+c_{2}\equiv0\pmod 3 .
      +\]
      +
      +For each digit‑position \(i=0,1,2\) the number of ordered triples
      +\((a_{i},b_{i},c_{i})\) satisfying the linear condition is
      +\(3^{2}=9\) (choose any two digits freely, the third one is forced).
      +The remaining higher digits \(a_{3},a_{4},a_{5}\) are unrestricted; each
      +has \(3^{3}=27\) possibilities (three choices for each of the three
      +numbers).
      +
      +Therefore the total number of admissible triples \((a,b,c)\) is  
      +
      +\[
      +N = 9^{3}\cdot 27^{3}=3^{15}=14\,348\,907 .
      +\]
      +
      +Finally we need the remainder of \(N\) modulo \(1000\):
      +
      +\[
      +14\,348\,907\equiv 907\pmod{1000}.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 907

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(a,b,c,d\) be the four interior edges (the two interior vertical and the two interior horizontal sides).  
      +* The eight outer edges are the two edges that belong to each unit square but are on the boundary of the
      +\(2\times2\) grid.
      +
      +For a particular unit square the number of its interior red sides is the number of red interior edges incident
      +to it.  
      +If a square has \(s\) interior red sides, then it needs exactly \(2-s\) red outer sides, because the total number
      +of red sides must be \(2\).  
      +
      +For a given square
      +
      +\[
      +\#\text{ ways to colour its two outer edges}= \binom{2}{\,2-s\,}=
      +\begin{cases}
      +1,&s=0\text{ or }2,\\[2pt]
      +2,&s=1 .
      +\end{cases}
      +\]
      +
      +Thus, once the interior edges are fixed, the outer edges can be coloured independently for each square.
      +If among the four squares exactly \(k\) of them have \(s=1\) (i.e. exactly one interior red edge incident to the
      +square), the number of completions of the outer edges is \(2^{k}\).
      +
      +--------------------------------------------------------------------
      +
      +### Counting interior–edge configurations
      +
      +The interior edges form a 4‑cycle  
      +
      +\[
      +A\;-\;B\;-\;D\;-\;C\;-\;A .
      +\]
      +
      +We list all \(2^{4}=16\) subsets of these edges and, for each, count how many squares have one interior red
      +edge.
      +
      +| # interior edges | type of selection | \# of squares with \(s=1\) | \# of such subsets | contributions |
      +|------------------|-------------------|----------------------------|--------------------|---------------|
      +| 0 | none | 0 | 1 | \(2^{0}=1\) |
      +| 1 | any one edge | 2 (the two squares incident to the edge) | 4 | \(4\cdot2^{2}=16\) |
      +| 2 | adjacent edges (share a vertex) | 2 (the two squares adjacent to the common vertex) | 4 | \(4\cdot2^{2}=16\) |
      +| 2 | opposite edges (no common vertex) | 4 (each square gets one) | 2 | \(2\cdot2^{4}=32\) |
      +| 3 | all but one edge | 2 (the two squares not incident to the missing edge) | 4 | \(4\cdot2^{2}=16\) |
      +| 4 | all four edges | 0 | 1 | \(1\cdot2^{0}=1\) |
      +
      +Adding the contributions:
      +
      +\[
      +1+16+16+32+16+1 = 82 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +Therefore there are  
      +
      +\[
      +\boxed{82}
      +\]
      +
      +different ways to colour the 12 unit segments so that each of the four unit squares has exactly two red sides
      +(and consequently two blue sides).
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \(2025=3^{4}\cdot5^{2}\).
      +
      +Divisors of \(2025\) are of the form \(3^{a}5^{b}\) with  
      +\(0\le a\le4,\;0\le b\le2\); therefore  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +--------------------------------------------------------------------
      +### Condition for the LCM
      +
      +For a subset \(B\subseteq A\),
      +
      +\[
      +\operatorname{lcm}(B)=3^{\max a}\,5^{\max b}.
      +\]
      +
      +Thus \(\operatorname{lcm}(B)=2025=3^{4}5^{2}\) iff  
      +
      +* at least one element of \(B\) has exponent \(a=4\) (i.e. is divisible by \(3^{4}\)), and  
      +* at least one element of \(B\) has exponent \(b=2\) (i.e. is divisible by \(5^{2}\)).
      +
      +--------------------------------------------------------------------
      +### Relevant divisor families  
      +
      +\[
      +X=\{d\in A\mid 3^{4}\mid d\}=\{81,405,2025\},\qquad |X|=3,
      +\]
      +
      +\[
      +Y=\{d\in A\mid 5^{2}\mid d\}=\{25,75,225,675,2025\},\qquad |Y|=5.
      +\]
      +
      +\(X\cap Y=\{2025\}\), so \(|X\cup Y|=3+5-1=7\).
      +
      +--------------------------------------------------------------------
      +### Counting subsets with the required property  
      +
      +A subset \(B\) works iff it meets both \(X\) and \(Y\).  
      +Using inclusion–exclusion on all \(2^{15}\) subsets of \(A\):
      +
      +\[
      +\begin{aligned}
      +\#\{B:\ B\cap X\neq\varnothing,\ B\cap Y\neq\varnothing\}
      +&=2^{15}
      + -2^{12}\;(\text{subsets missing }X)
      + -2^{10}\;(\text{subsets missing }Y)\\
      +&\qquad +2^{8}\;(\text{subsets missing both }X\cup Y)\\[2mm]
      +&=32768-4096-1024+256\\
      +&=27904 .
      +\end{aligned}
      +\]
      +
      +All these subsets are non‑empty, so the numerator is \(27904\).
      +
      +--------------------------------------------------------------------
      +### Probability
      +
      +\[
      +P=\frac{27904}{2^{15}}=\frac{27904}{32768}.
      +\]
      +
      +Both numbers are divisible by \(256\):
      +
      +\[
      +\frac{27904}{32768}=\frac{27904/256}{32768/256}= \frac{109}{128}.
      +\]
      +
      +The fraction \(\frac{109}{128}\) is already in lowest terms, so  
      +\(m=109,\;n=128\).
      +
      +\[
      +m+n=109+128=237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1 –  How regions grow**
      +
      +When a new line segment is drawn in the disk, it either  
      +*does not meet any previous segment* – it creates **one** new region, or  
      +*meets \(k\) previous segments in interior points* – it creates **\(k+1\)** new regions  
      +(the segment is cut into \(k+1\) pieces, each of which separates a region).
      +
      +Hence, if we start with one region (the whole disk),
      +
      +\[
      +\#\text{regions}=1+\#\text{segments}+\#\text{interior intersections } .
      +\tag{1}
      +\]
      +
      +The two perpendicular diameters intersect once, giving the four initial
      +quadrants.  After the 25 random chords are added we will have  
      +
      +\[
      +27\text{ segments} = 2\text{ diameters}+25\text{ chords}.
      +\]
      +
      +So we only have to find the **expected number of interior intersection points**.
      +
      +--------------------------------------------------------------------
      +
      +**Step 2 –  Intersections with the diameters**
      +
      +A random chord meets a fixed diameter iff its two endpoints lie on opposite
      +sides of that diameter.  
      +
      +*Horizontal diameter* (\(y=0\)): the endpoints must belong to one of the
      +four unordered quadrant pairs  
      +
      +\[
      +\{Q_1,Q_3\},\{Q_1,Q_4\},\{Q_2,Q_3\},\{Q_2,Q_4\},
      +\]
      +
      +i.e. 4 out of the 6 possible unordered pairs of different quadrants.
      +Thus  
      +
      +\[
      +P(\text{chord meets a given diameter})=\frac{4}{6}= \frac23 .
      +\]
      +
      +The same probability holds for the vertical diameter.  
      +Hence the expected number of chord‑diameter intersections is  
      +
      +\[
      +25\;( \text{chords})\times 2\;( \text{diameters})\times \frac23
      +  =\frac{100}{3}.
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3 –  Intersections between two random chords**
      +
      +Let a chord be represented by the unordered pair of quadrants that contain its
      +end‑points.  
      +There are  
      +
      +* 4 *adjacent* pairs  \(\{0,1\},\{1,2\},\{2,3\},\{3,0\}\);  
      +* 2 *opposite* pairs   \(\{0,2\},\{1,3\}\).
      +
      +Thus the six possible chords are the six edges of the complete graph \(K_4\)
      +on the four quadrants.
      +
      +Two chords may be:
      +
      +| Relation of the two edges | How many ordered pairs | Intersection probability |
      +|---------------------------|-----------------------|--------------------------|
      +| Same edge (both chords use the same pair) | 6 (4 adjacent + 2 opposite) | \(\frac12\) |
      +| Share one vertex (adjacent edges) | 24 (8 both adjacent + 16 one adjacent–one opposite) | \(\frac12\) |
      +| Disjoint edges, both adjacent (e.g. \{0,1\} & \{2,3\}) | 4 | \(0\) |
      +| Disjoint edges, both opposite ( \{0,2\} & \{1,3\}) | 2 | \(1\) |
      +
      +*Why these probabilities?*  
      +
      +* Same edge – the two chords are independent copies inside the same two
      +quadrants.  A short calculation (or a symmetry argument) gives a crossing
      +probability of \(\frac12\).
      +* Share a vertex – one endpoint of the second chord lies in the same quadrant
      +as an endpoint of the first chord.  The second endpoint is always in a
      +different quadrant, so the second chord meets the first exactly when the
      +point that shares the vertex falls between the two endpoints of the first
      +chord.  Averaging over the uniform positions gives \(\frac12\) again.
      +* Disjoint adjacent edges lie completely on opposite sides of the
      +horizontal (or vertical) diameter, so they can never meet ⇒ probability \(0\).
      +* Disjoint opposite edges always cross the centre of the disk; any two such
      +chords intersect ⇒ probability \(1\).
      +
      +Summing the contributions of the \(36\) ordered pairs of chords,
      +
      +\[
      +S = 6\!\left(\frac12\right)+24\!\left(\frac12\right)+4\cdot0+2\cdot1 = 17 .
      +\]
      +
      +Therefore the probability that two independently chosen random chords intersect is  
      +
      +\[
      +p_{\text{chord–chord}} = \frac{S}{36}= \frac{17}{36}.
      +\tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4 –  Expected number of chord–chord intersections**
      +
      +There are \(\binom{25}{2}=300\) unordered pairs of the 25 random chords.  
      +Using (3),
      +
      +\[
      +E(\text{chord–chord intersections})=300\cdot\frac{17}{36}
      +     =\frac{425}{3}=141\frac{2}{3}.
      +\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5 –  Total expected interior intersections**
      +
      +\[
      +\begin{aligned}
      +E(\text{total interior intersections})
      +&= (\text{diameters intersect})\\
      +&\qquad +(\text{chord–diameter intersections})\\
      +&\qquad +(\text{chord–chord intersections})\\[2mm]
      +&= 1+\frac{100}{3}+ \frac{425}{3}= 176 .
      +\end{aligned}
      +\tag{5}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 6 –  Expected number of regions**
      +
      +Insert (5) into formula (1) with the total of \(27\) segments:
      +
      +\[
      +E(\text{regions}) = 1 + 27 + 176 = 204 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +Place the two circles on a coordinate plane, compute the positions of the relevant points, and write the
      +rectangle’s vertices in terms of its side–lengths.  
      +The conditions “\(C\) is closer to \(\overline{GH}\) than to \(\overline{EF}\)” and “\(D\) is closer to
      +\(\overline{FG}\) than to \(\overline{EH}\)” fix the orientation of the rectangle.  
      +Using the equality of the two triangle areas we obtain a simple relation between the rectangle’s width
      +and height, which together with the fact that the rectangle is inscribed in the small circle yields the
      +required dimensions and its area.
      +
      +--------------------------------------------------------------------
      +
      +### 1.  Coordinate set‑up  
      +
      +Let  
      +
      +* \(O\) be the centre of the large circle \(\omega_2\) (radius \(15\)).
      +* \(A\) be the centre of the small circle \(\omega_1\) (radius \(6\)).
      +* \(B\) the common point of tangency.
      +
      +Because the circles are internally tangent,
      +\[
      +OA = 15-6=9,
      +\qquad AB=6,
      +\qquad OB =15 .
      +\]
      +
      +Choose the \(x\)–axis along \(\overline{BC}\).  
      +Take  
      +
      +\[
      +O=(0,0),\qquad B=(15,0).
      +\]
      +
      +Then \(A\) lies on the same line, nine units left of \(B\):
      +\[
      +A=(9,0).
      +\]
      +
      +Since \(BC\) is a diameter of \(\omega_2\), the opposite end of the diameter is
      +\[
      +C=(-15,0).
      +\]
      +
      +The condition \(\overline{BC}\perp\overline{AD}\) makes \(AD\) vertical, so the points of
      +\(\omega_2\) with \(x=9\) are
      +\[
      +D=(9,12)\quad\text{or}\quad D=(9,-12).
      +\]
      +Because later we need \(D\) to be nearer the top side of the rectangle, we take  
      +
      +\[
      +\boxed{D=(9,12)} .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 2.  The rectangle \(EFGH\)
      +
      +\(EF\) is required to be perpendicular to \(\overline{BC}\); hence \(EF\) is a vertical side.
      +Let the rectangle have
      +
      +* width \(w\) (the horizontal side \(\overline{FG}\)),
      +* height \(h\) (the vertical side \(\overline{EF}= \overline{GH}\)).
      +
      +Since the rectangle is inscribed in \(\omega_1\), its centre coincides with the centre of \(\omega_1\),
      +namely \(A=(9,0)\).  Consequently the vertices are
      +
      +\[
      +\begin{aligned}
      +E&=\bigl(b,\,-\tfrac{h}{2}\bigr), &
      +F&=\bigl(b, \tfrac{h}{2}\bigr),\\[2mm]
      +G&=\bigl(a, \tfrac{h}{2}\bigr), &
      +H&=\bigl(a,\,-\tfrac{h}{2}\bigr),
      +\end{aligned}
      +\]
      +where  
      +
      +\[
      +a = 9-\frac{w}{2},\qquad b = 9+\frac{w}{2}.
      +\]
      +
      +Because every vertex lies on \(\omega_1\) (radius \(6\) and centre \((9,0)\)),
      +\[
      +(a-9)^2+\Bigl(\frac{h}{2}\Bigr)^2 = (b-9)^2+\Bigl(\frac{h}{2}\Bigr)^2 = 6^{2}=36 .
      +\]
      +Both equations give the single relation  
      +
      +\[
      +\boxed{w^{2}+h^{2}=144}\tag{1}
      +\]
      +(the rectangle’s diagonal is the diameter \(12\) of the small circle).
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Interpreting the “closer‑to” conditions  
      +
      +The statement “\(C\) is closer to \(\overline{GH}\) than to \(\overline{EF}\)” forces \(\overline{GH}\) to be
      +the left vertical side (smaller \(x\))-coordinate) and \(\overline{EF}\) the right vertical side.  
      +Similarly “\(D\) is closer to \(\overline{FG}\) than to \(\overline{EH}\)” places \(\overline{FG}\) at the
      +top (larger \(y\))-coordinate.
      +
      +Thus  
      +
      +\[
      +\begin{aligned}
      +\text{dist}(C,\overline{GH})&=a-(-15)=a+15,\\
      +\text{dist}(C,\overline{EF})&=b+15,\\[1mm]
      +\text{dist}(D,\overline{FG})&=12-\frac{h}{2},\\
      +\text{dist}(D,\overline{EH})&=12+\frac{h}{2},
      +\end{aligned}
      +\]
      +and the above inequalities are automatically satisfied for any feasible rectangle
      +(\(a<b\) and \(h/2<12\)).
      +
      +--------------------------------------------------------------------
      +
      +### 4.  Equality of the two triangle areas  
      +
      +*Triangle \(DGF\).*  
      +\(G\) and \(F\) are the top‑left and top‑right vertices, so \(\overline{GF}\) is horizontal,
      +\(|GF| = w\).  The altitude from \(D\) to \(\overline{GF}\) is the vertical distance
      +\(12-\frac{h}{2}\).  Hence  
      +
      +\[
      +[ DGF ] = \frac12 \, w\!\left(12-\frac{h}{2}\right).
      +\tag{2}
      +\]
      +
      +*Triangle \(CHG\).*  
      +\(G\) and \(H\) lie on the left side, \(|GH|=h\).  The altitude from \(C\) to this side is the
      +horizontal distance \(a+15\).  Thus  
      +
      +\[
      +[ CHG ] = \frac12 \, h\,(a+15).
      +\tag{3}
      +\]
      +
      +Given \([DGF]=[CHG]\) and using \(a=9-\dfrac w2\), we have  
      +
      +\[
      +w\!\left(12-\frac{h}{2}\right)=
      +h\!\Bigl(9-\frac{w}{2}+15\Bigr)
      += h\!\bigl(24-\frac{w}{2}\bigr).
      +\]
      +
      +Expanding and cancelling the common term \(-\dfrac{wh}{2}\) yields  
      +
      +\[
      +12w = 24h \quad\Longrightarrow\quad \boxed{w = 2h}. \tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 5.  Determining \(w\) and \(h\)
      +
      +Insert \(w=2h\) into (1):
      +
      +\[
      +(2h)^{2}+h^{2}=144
      +\;\Longrightarrow\;5h^{2}=144
      +\;\Longrightarrow\;h^{2}=\frac{144}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +h = \frac{12}{\sqrt5}= \frac{12\sqrt5}{5},
      +\qquad 
      +w = 2h = \frac{24\sqrt5}{5}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 6.  Area of the rectangle  
      +
      +\[
      +[EFGH]=w\cdot h = 2h^{2}=2\cdot\frac{144}{5}= \frac{288}{5}.
      +\]
      +
      +Thus the required area is \(\displaystyle \frac{288}{5}\); the fraction is already in lowest terms.
      +So \(m=288,\; n=5\) and  
      +
      +\[
      +m+n = 288+5 = 293 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +x_{k+1}= \frac{x_k+\dfrac1{x_k}-1}{3}, \qquad x_1=\frac{25}{11}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  A convenient change of variable  
      +
      +Set  
      +
      +\[
      +t_k=\frac{x_k-1}{x_k+1}\qquad\Longleftrightarrow\qquad 
      +x_k=\frac{1+t_k}{1-t_k}.
      +\]
      +
      +Then a short computation gives  
      +
      +\[
      +t_{k+1}= \frac{3t_k^{2}-1}{2}. \tag{1}
      +\]
      +
      +Thus the problem reduces to iterating the quadratic map  
      +
      +\[
      +F(t)=\frac{3t^{2}-1}{2}
      +\]
      +
      +starting from  
      +
      +\[
      +t_1=\frac{x_1-1}{x_1+1}
      +      =\frac{25/11-1}{25/11+1}
      +      =\frac{7}{18}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Working with the original rationals  
      +
      +Write \(t_k=p_k/q_k\) in lowest terms.   
      +From (1)
      +
      +\[
      +\frac{p_{k+1}}{q_{k+1}}=
      +\frac{3p_k^{2}-3p_kq_k+3q_k^{2}}{2q_k^{2}}
      +      =\frac{p_k^{2}-p_kq_k+q_k^{2}}{3}\;\Big/
      +        \;\frac{p_kq_k}{1},
      +\]
      +
      +hence (clearing the common factor \(3\))
      +
      +\[
      +\boxed{\displaystyle 
      +p_{k+1}= \frac{p_k^{2}-p_kq_k+q_k^{2}}{3},
      +\qquad 
      +q_{k+1}=p_kq_k } . \tag{2}
      +\]
      +
      +For the initial pair  
      +
      +\[
      +p_1=25,\qquad q_1=11 .
      +\]
      +
      +Because \(p_1\equiv1,\; q_1\equiv2\pmod 3\) one checks from (2) that  
      +\(p_k\equiv1,\; q_k\equiv2\pmod 3\) for every \(k\); consequently the
      +division by \(3\) in (2) is always exact and the reduced fractions
      +\(\dfrac{p_k}{q_k}=x_k\) stay in lowest terms.
      +
      +--------------------------------------------------------------------
      +### 3.  Behaviour modulo \(8\)
      +
      +\(3\) is invertible modulo \(8\) (\(3^{-1}\equiv3\)).  
      +From (2)
      +
      +\[
      +p_{k+1}\equiv 3\bigl(p_k^{2}-p_kq_k+q_k^{2}\bigr)\pmod 8,
      +\qquad 
      +q_{k+1}\equiv p_kq_k\pmod 8 .
      +\]
      +
      +Starting with \((p_1,q_1)\equiv(1,3)\pmod8\) one obtains
      +
      +\[
      +(p_2,q_2)\equiv(5,3),\qquad
      +(p_3,q_3)\equiv(1,7),
      +\]
      +
      +and thereafter  
      +
      +\[
      +p_k\equiv1,\quad q_k\equiv7\pmod8 \qquad(k\ge3).
      +\]
      +
      +Hence for every \(k\ge3\)
      +
      +\[
      +p_k+q_k\equiv0\pmod8. \tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Behaviour modulo \(125\)
      +
      +\(3^{-1}\equiv42\pmod{125}\).  Using (2),
      +
      +\[
      +p_{k+1}\equiv42\bigl(p_k^{2}-p_kq_k+q_k^{2}\bigr)\pmod{125},
      +\qquad 
      +q_{k+1}\equiv p_kq_k\pmod{125}. \tag{4}
      +\]
      +
      +Computating a few steps (mod 125) gives  
      +
      +\[
      +\begin{array}{c|c|c}
      +k & p_k\pmod{125} & q_k\pmod{125}\\ \hline
      +1 & 25 & 11\\
      +2 & 32 & 25\\
      +3 & 33 & 50\\
      +4 & 63 & 25\\
      +5 & 48 & 75\\
      +6 & 68 &100\\
      +\vdots &\vdots &\vdots
      +\end{array}
      +\]
      +
      +From \(k=4\) onward the pair \((p_k,q_k)\) repeats with period 20:
      +
      +\[
      +(p_{k+20},q_{k+20})\equiv(p_k,q_k)\pmod{125}\qquad(k\ge4).
      +\]
      +
      +Since \(2025\equiv5\pmod{20}\) and \(2025\ge4\),
      +
      +\[
      +p_{2025}\equiv p_5\equiv48,\qquad
      +q_{2025}\equiv q_5\equiv75 \pmod{125}. \tag{5}
      +\]
      +
      +Thus
      +
      +\[
      +p_{2025}+q_{2025}\equiv48+75=123\pmod{125}. \tag{6}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Combination (Chinese Remainder)
      +
      +From (3) we have \(p_{2025}+q_{2025}\equiv0\pmod8\);   
      +from (6) we have \(p_{2025}+q_{2025}\equiv123\pmod{125}\).
      +
      +Let \(S=p_{2025}+q_{2025}\).  
      +Write \(S=8u\); then \(8u\equiv123\pmod{125}\).
      +Since \(8^{-1}\equiv47\pmod{125}\),
      +
      +\[
      +u\equiv47\cdot123\equiv31\pmod{125},
      +\qquad
      +S=8u\equiv8\cdot31=248\pmod{1000}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 6.  Answer
      +
      +The required remainder is  
      +
      +\[
      +\boxed{248}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Greedy representation**
      +
      +For a value \(N\) write  
      +
      +\[
      +N = 25q + r ,\qquad 0\le r<25 .
      +\]
      +
      +The greedy algorithm first uses \(q\) quarters, then as many dimes as possible from the remainder \(r\):
      +\[
      +r = 10d + e ,\qquad 0\le e<10 .
      +\]
      +Hence the greedy collection has  
      +
      +\[
      +\text{coins}_{\text{greedy}} = q+d+e .
      +\tag{1}
      +\]
      +
      +**Step 2.  When can we do better?**
      +
      +A collection using \(a\) quarters and \(b\) dimes (the pennies are forced) has  
      +
      +\[
      +25a+10b\le N ,\qquad \text{pennies}=N-25a-10b .
      +\]
      +
      +Its total number of coins is  
      +
      +\[
      +a+b+(N-25a-10b)=N-(24a+9b).
      +\]
      +
      +Because \(N\) is fixed, the collection is optimal iff the quantity  
      +
      +\[
      +W=24a+9b
      +\tag{2}
      +\]
      +
      +is as large as possible under the constraint \(25a+10b\le N\).  
      +
      +**Step 3.  Compare the greedy choice with one fewer quarter**
      +
      +The greedy choice uses \(a=q\) and \(b=d\).  
      +Consider reducing the number of quarters by one: take \(a'=q-1\).  
      +The value that must now be made with dimes and pennies is \(25+r\); the maximal possible number
      +of dimes is
      +
      +\[
      +b'=\Big\lfloor\frac{25+r}{10}\Big\rfloor .
      +\]
      +
      +Write \(r=10d+e\;(0\le e\le 9)\). Then  
      +
      +\[
      +\frac{25+r}{10}=2+d+\frac{e+5}{10},
      +\qquad
      +b'=d+2+f,
      +\]
      +where  
      +
      +\[
      +f=\Big\lfloor\frac{e+5}{10}\Big\rfloor=
      +\begin{cases}
      +0,&e\le4,\\[2pt]
      +1,&e\ge5 .
      +\end{cases}
      +\]
      +
      +The weight (2) for the greedy choice is  
      +
      +\[
      +W_{\text{gr}}=24q+9d .
      +\]
      +
      +For the alternative with one fewer quarter we have  
      +
      +\[
      +W_{\text{alt}}=24(q-1)+9(d+2+f)=W_{\text{gr}}-24+18+9f
      +      =W_{\text{gr}}+( -6+9f).
      +\]
      +
      +Thus  
      +
      +\[
      +W_{\text{alt}}-W_{\text{gr}}=
      +\begin{cases}
      +-6, & e\le 4,\\[2pt]
      ++3, & e\ge 5 .
      +\end{cases}
      +\]
      +
      +If \(e\ge5\) the alternative has **larger** weight, i.e. it uses **fewer** coins
      +(three fewer, because the weight increases by 3).  
      +If \(e\le4\) the alternative is worse.
      +
      +Consequently the greedy algorithm is **not optimal exactly when**
      +\[
      +e = r \bmod 10 \ge 5 .
      +\tag{3}
      +\]
      +
      +**Step 4.  Which remainders cause failure?**
      +
      +Since \(r\) ranges from \(0\) to \(24\), condition (3) means  
      +
      +\[
      +r\in\{5,6,7,8,9,15,16,17,18,19\}.
      +\tag{4}
      +\]
      +
      +For \(N<25\) we have \(q=0\); only 1‑cent and 10‑cent coins are usable, and the greedy
      +choice (as many dimes as possible) is obviously optimal.  Hence failures occur only for
      +\(N\ge25\) with remainder (4) upon division by \(25\).
      +
      +**Step 5.  Counting the failures between 1 and 1000**
      +
      +The numbers \(25\le N\le 1000\) form 39 complete blocks of 25 consecutive integers
      +(\(25\)–\(999\)) and the single extra number \(1000\).
      +
      +- In each full block every residue modulo \(25\) appears once,
      +  so each block contains exactly \(10\) failures (the residues in (4)).
      +- Hence failures in the 39 blocks: \(39\times10=390\).
      +
      +The leftover number \(1000\) has residue \(0\) (not a failure).
      +
      +Thus the total number of failures is \(390\).
      +
      +**Step 6.  Successes**
      +
      +Out of the \(1000\) possible values of \(N\),
      +
      +\[
      +\text{successful }N = 1000 - 390 = 610 .
      +\]
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For  
      +
      +\[
      +f(x)=\sin\bigl(7\pi\sin(5x)\bigr)
      +\]
      +
      +we need the solutions of  
      +
      +\[
      +\sin\bigl(7\pi\sin(5x)\bigr)=0\qquad(0<x<2\pi).
      +\]
      +
      +---
      +
      +### 1.  Zeros of \(f\)
      +
      +\[
      +\sin(A)=0\iff A=m\pi,\;m\in\mathbb Z .
      +\]
      +
      +Hence  
      +
      +\[
      +7\pi\sin(5x)=m\pi\Longrightarrow \sin(5x)=\frac{m}{7}.
      +\]
      +
      +Because \(\sin(5x)\in[-1,1]\), the integer \(m\) must satisfy  
      +
      +\[
      +-7\le m\le 7 .
      +\]
      +
      +Let \(k=m\). For each integer \(k\) with \(-7\le k\le 7\) we solve  
      +
      +\[
      +\sin(5x)=\frac{k}{7}.
      +\]
      +
      +Put \(\theta =5x\). Then \(\theta\in(0,10\pi)\) and we need  
      +
      +\[
      +\sin\theta = \frac{k}{7}.
      +\]
      +
      +* **\(k=\pm7\)** (\(\sin\theta=\pm1\)).  
      +  In each \(2\pi\)-period there is exactly one solution.  
      +  Over the interval \((0,10\pi)\) (5 periods) we obtain \(5\) solutions for \(k=7\) and
      +  \(5\) solutions for \(k=-7\).
      +
      +* **\(k=0\)** (\(\sin\theta=0\)).  
      +  Solutions are \(\theta=n\pi\).  
      +  With \(0<\theta<10\pi\) we have \(n=1,2,\dots ,9\): \(9\) solutions.
      +
      +* **\(k=\pm1,\pm2,\dots ,\pm6\)** (\(|k/7|<1\) and \(\neq0\)).  
      +  In each period there are two distinct solutions, so over \(5\) periods we get
      +  \(2\cdot5=10\) solutions for each such \(k\).
      +
      +There are \(12\) values of \(k\) with \(|k|\le6\) and \(k\neq0\).
      +
      +Hence the total number of zeros is  
      +
      +\[
      +n = 5+5+9+12\cdot10 = 139 .
      +\]
      +
      +---
      +
      +### 2.  Tangent points
      +
      +Differentiate:
      +
      +\[
      +f'(x)=\cos\!\bigl(7\pi\sin(5x)\bigr)\cdot7\pi\cdot5\cos(5x)
      +      =35\pi\cos(5x)\cos\!\bigl(7\pi\sin(5x)\bigr).
      +\]
      +
      +At a zero of \(f\) we have \(\sin(5x)=k/7\), so  
      +
      +\[
      +\cos\!\bigl(7\pi\sin(5x)\bigr)=\cos(k\pi)=(-1)^k\neq0 .
      +\]
      +
      +Thus \(f'(x)=0\) exactly when \(\cos(5x)=0\), i.e. when \(\sin(5x)=\pm1\).
      +Those correspond precisely to the cases \(k=\pm7\).
      +
      +We already counted \(5\) solutions for \(k=7\) and \(5\) for \(k=-7\); all of them are
      +tangency points. Hence  
      +
      +\[
      +t = 5+5 = 10 .
      +\]
      +
      +---
      +
      +### 3.  Required sum
      +
      +\[
      +n+t = 139+10 = 149 .
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Label the vertices of the regular \(24\)-gon by  
      +
      +\[
      +0,1,2,\ldots ,23\qquad(\text{mod }24).
      +\]
      +
      +If a segment connects vertices \(i\) and \(j\) then the chord length is determined by the
      +shorter distance  
      +
      +\[
      +k=\min\{|i-j|,\;24-|i-j|\},\qquad 1\le k\le 12 .
      +\]
      +
      +All 12 drawn segments must have the same length, so every segment must join two vertices that
      +are exactly \(k\) steps apart for one fixed \(k\in\{1,2,\ldots ,12\}\).
      +
      +---------------------------------------------------------------------
      +
      +### 1.  The graph for a fixed \(k\)
      +
      +For a given \(k\) consider the graph  
      +
      +\[
      +G_k=\{\,\{i,i+k\}:i=0,1,\ldots ,23\}\ .
      +\]
      +
      +Each vertex has degree \(2\) (edges to \(i+k\) and to \(i-k\)), so \(G_k\) is a disjoint union
      +of cycles.  
      +
      +Let  
      +
      +\[
      +g=\gcd(24,k).
      +\]
      +
      +Then \(G_k\) consists of \(g\) cycles, each of length  
      +
      +\[
      +L=\frac{24}{g}.
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 2.  Perfect matchings of \(G_k\)
      +
      +A required drawing is exactly a perfect matching (1‑factor) of \(G_k\).
      +
      +* If \(L\) is odd, a perfect matching is impossible.  
      +  This occurs only for \(k=8\) (\(g=8,\;L=3\)).
      +
      +* If \(L=2\) (the case \(k=12\)), each component is a single edge, so the matching is
      +forced – exactly **one** way.
      +
      +* If \(L\) is even and \(\,L\ge4\), each even cycle has exactly two perfect matchings
      +(alternating edges).  
      +  Hence for such a \(k\) the number of matchings is  
      +
      +  \[
      +  2^{\,\text{number of cycles}}=2^{g}.
      +  \]
      +
      +---------------------------------------------------------------------
      +
      +### 3.  Count for each possible \(k\)
      +
      +\[
      +\begin{array}{c|c|c|c}
      +k & g=\gcd(24,k) & L=24/g & \text{matchings }N(k)\\ \hline
      +1 & 1 & 24 & 2\\
      +2 & 2 & 12 & 4\\
      +3 & 3 & 8  & 8\\
      +4 & 4 & 6  & 16\\
      +5 & 1 & 24 & 2\\
      +6 & 6 & 4  & 64\\
      +7 & 1 & 24 & 2\\
      +8 & 8 & 3  & 0\\
      +9 & 3 & 8  & 8\\
      +10& 2 & 12 & 4\\
      +11& 1 & 24 & 2\\
      +12&12 & 2  & 1
      +\end{array}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +### 4.  Total number of drawings
      +
      +\[
      +\begin{aligned}
      +\sum_{k=1}^{12} N(k)&=
      +2+4+8+16+2+64+2+0+8+4+2+1\\
      +&=113 .
      +\end{aligned}
      +\]
      +
      +---------------------------------------------------------------------
      +
      +Thus there are  
      +
      +\[
      +\boxed{113}
      +\]
      +
      +different ways to draw 12 equal‑length segments so that every vertex of the regular 24‑gon
      +is an endpoint of exactly one segment.
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +a_i=|A_iA_1|\qquad (i=2,\dots ,11),\qquad b_i=|A_iA_{i+1}|\;(i=2,\dots ,10)
      +\]
      +
      +and let \(\theta =\angle A_iA_1A_{i+1}\) for \(2\le i\le10\).
      +
      +--------------------------------------------------------------------
      +### 1.  The radii from \(A_1\)
      +
      +For each triangle \(A_iA_1A_{i+1}\)
      +
      +\[
      +\text{area}=1,\qquad \cos\theta=\frac{12}{13}.
      +\]
      +
      +Hence  
      +
      +\[
      +\sin\theta =\sqrt{1-\cos^2\theta}
      +          =\sqrt{1-\frac{144}{169}}
      +          =\frac{5}{13}.
      +\]
      +
      +The area formula gives  
      +
      +\[
      +1=\frac12 a_i a_{i+1}\sin\theta
      +   \Longrightarrow a_i a_{i+1}= \frac{2}{\sin\theta}
      +   =\frac{2}{5/13}= \frac{26}{5}\qquad (1)
      +\]
      +
      +for every \(i=2,\dots ,10\).
      +
      +Thus every adjacent pair of radii satisfies the same product.
      +Consequently the lengths alternate:
      +
      +\[
      +a_2=a_4=a_6=a_8=a_{10}=x,\qquad 
      +a_3=a_5=a_7=a_9=a_{11}=y,
      +\]
      +
      +with  
      +
      +\[
      +xy=\frac{26}{5}. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Lengths of the polygon sides not incident with \(A_1\)
      +
      +In \(\triangle A_iA_1A_{i+1}\) the side \(b_i=|A_iA_{i+1}|\) satisfies the law of cosines:
      +
      +\[
      +b_i^2 = a_i^2 + a_{i+1}^2 -2a_i a_{i+1}\cos\theta .
      +\]
      +
      +Using \(\cos\theta=\frac{12}{13}\) and (1),
      +
      +\[
      +b_i^2 = a_i^2 + a_{i+1}^2
      +        - 2\!\left(\frac{26}{5}\right)\!\frac{12}{13}
      +      = a_i^2 + a_{i+1}^2 - \frac{624}{65}
      +      = a_i^2 + a_{i+1}^2 - 9.6 .
      +\]
      +
      +Because each adjacent pair consists of one \(x\) and one \(y\), the quantity
      +\(a_i^2+a_{i+1}^2\) is the same for all \(i\).  Hence all \(b_i\) are equal; denote this common length by \(b\).
      +
      +Let  
      +
      +\[
      +S=x+y .
      +\]
      +
      +Then \(x^2+y^2=S^2-2xy\).  Using (2) we obtain
      +
      +\[
      +b^{2}=S^{2}-2xy-2xy\cos\theta
      +      =S^{2}-2xy(1+\cos\theta).
      +\]
      +
      +Since \(\cos\theta=\frac{12}{13}\),  
      +
      +\[
      +1+\cos\theta = \frac{25}{13},\qquad
      +2xy(1+\cos\theta)=2\!\left(\frac{26}{5}\right)\!\frac{25}{13}=20.
      +\]
      +
      +Thus  
      +
      +\[
      +b^{2}=S^{2}-20,\qquad b=\sqrt{S^{2}-20}. \tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Using the perimeter
      +
      +The perimeter of the 11‑gon is
      +
      +\[
      +|A_1A_2|+|A_1A_{11}|+\sum_{i=2}^{10}|A_iA_{i+1}|
      += x + y + 9b = S + 9\sqrt{S^{2}-20}=20.
      +\]
      +
      +Let \(t=\sqrt{S^{2}-20}\;(t\ge0)\).  Then  
      +
      +\[
      +\sqrt{t^{2}+20}+9t=20\quad\Longrightarrow\quad 
      +\sqrt{t^{2}+20}=20-9t.
      +\]
      +
      +Squaring yields  
      +
      +\[
      +t^{2}+20 = (20-9t)^{2}=400-360t+81t^{2},
      +\]
      +\[
      +80t^{2}-360t+380=0\;\Longrightarrow\;
      +4t^{2}-18t+19=0.
      +\]
      +
      +The discriminant is \(D=18^{2}-4\cdot4\cdot19=324-304=20\), so
      +
      +\[
      +t=\frac{18\pm\sqrt{20}}{8}
      +   =\frac{9\pm\sqrt5}{4}.
      +\]
      +
      +Since \(20-9t\ge0\), we take the minus sign:
      +
      +\[
      +t=\frac{9-\sqrt5}{4}.
      +\]
      +
      +Now \(S = 20-9t\):
      +
      +\[
      +S = 20 - 9\!\left(\frac{9-\sqrt5}{4}\right)
      +   = \frac{80-(81-9\sqrt5)}{4}
      +   = \frac{9\sqrt5-1}{4}.
      +\]
      +
      +Thus  
      +
      +\[
      +|A_1A_2|+|A_1A_{11}| = S = \frac{9\sqrt5-1}{4}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Putting it into the required form
      +
      +\[
      +\frac{9\sqrt5-1}{4}=\frac{m\sqrt{n}-p}{q},
      +\qquad m=9,\; n=5,\; p=1,\; q=4.
      +\]
      +
      +These satisfy the given conditions ( \(n\) square‑free, no prime divides all of \(m,p,q\) ).
      +
      +Finally  
      +
      +\[
      +m+n+p+q = 9+5+1+4 = 19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +Let the 16 chairs be numbered \(1,2,\dots ,16\).  
      +A selection of 8 chairs corresponds to a binary string of length \(16\) with exactly eight \(1\)’s (occupied chairs) and eight \(0\)’s (empty chairs).
      +
      +A person “sits next to two other people’’ exactly when a chair is occupied **and** its two neighbours are also occupied.  
      +Hence the forbidden pattern in the binary string is the block \(111\).  
      +
      +Thus we must count the binary strings of length \(16\) containing exactly eight \(1\)’s and **no** occurrence of \(111\).
      +
      +--------------------------------------------------------------------
      +
      +### 1.  Decomposing the 1‑blocks
      +
      +Because a block of three or more consecutive \(1\)’s is not allowed, every maximal block of 1’s is of length **1** or **2**.
      +
      +Suppose the string contains  
      +
      +* \(a\) blocks of length \(1\) and  
      +* \(c\) blocks of length \(2\).
      +
      +Then  
      +
      +\[
      +a+2c = 8\qquad(\text{total number of }1\text{'s}),
      +\]
      +\[
      +b = a+c = 8-c\qquad(\text{total number of blocks}).
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 2.  Placing the blocks among the 0’s
      +
      +Between any two consecutive blocks we need at least one \(0\).  
      +With \(b\) blocks we need at least \(b-1\) separating zeros.
      +
      +The total number of zeros is \(16-8 = 8\).  
      +After reserving the mandatory \(b-1\) zeros, there remain  
      +
      +\[
      +8-(b-1)=9-b
      +\]
      +
      +extra zeros that may be placed arbitrarily in the \(b+1\) gaps
      +(before the first block, between blocks, after the last block).
      +
      +The number of ways to distribute these extra zeros is a stars‑and‑bars count:
      +
      +\[
      +\binom{(9-b)+(b+1)-1}{b}= \binom{9}{b}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Ordering the blocks
      +
      +Among the \(b\) blocks, we must choose which \(c\) of them are the length‑2 blocks.
      +That can be done in  
      +
      +\[
      +\binom{b}{c}=\binom{8-c}{c}
      +\]
      +
      +ways.
      +
      +--------------------------------------------------------------------
      +
      +### 4.  Summation
      +
      +Summing over all feasible values of \(c\) (from \(0\) to \(\lfloor 8/2\rfloor =4\)) we obtain
      +
      +\[
      +\begin{aligned}
      +N &=\sum_{c=0}^{4}\binom{8-c}{c}\binom{9}{\,8-c\,} \\[2mm]
      +  &=\binom{8}{0}\binom{9}{8}
      +    +\binom{7}{1}\binom{9}{7}
      +    +\binom{6}{2}\binom{9}{6}
      +    +\binom{5}{3}\binom{9}{5}
      +    +\binom{4}{4}\binom{9}{4}\\[2mm]
      +  &=1\cdot9\;+\;7\cdot36\;+\;15\cdot84\;+\;10\cdot126\;+\;1\cdot126\\[2mm]
      +  &=9+252+1260+1260+126\\[2mm]
      +  &=2907.
      +\end{aligned}
      +\]
      +
      +Thus there are \(N=2907\) possible selections of 8 chairs satisfying the condition.
      +
      +--------------------------------------------------------------------
      +
      +### 5.  Required remainder
      +
      +\[
      +N \bmod 1000 = 2907 \bmod 1000 = 907.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      In base \(b\) the numbers  
      +
      +\[
      +17_b = 1\cdot b + 7 = b+7 ,\qquad  
      +97_b = 9\cdot b + 7 .
      +\]
      +
      +We need bases \(b>9\) (so that the digits \(7\) and \(9\) are allowed) such that  
      +
      +\[
      +b+7 \mid 9b+7 .
      +\]
      +
      +---
      +
      +### Reduce the divisibility condition
      +
      +If \(b+7\) divides \(9b+7\), then it also divides any integer linear combination of these two numbers.  
      +Consider  
      +
      +\[
      +9(b+7) - (9b+7) = 9b+63 - 9b - 7 = 56 .
      +\]
      +
      +Hence  
      +
      +\[
      +b+7 \mid 56 .
      +\]
      +
      +Conversely, if \(b+7\) divides \(56\) then
      +
      +\[
      +9b+7 = 9(b+7) - 56
      +\]
      +
      +is also a multiple of \(b+7\). Thus the condition is equivalent to  
      +
      +\[
      +b+7 \text{ is a positive divisor of } 56 .
      +\]
      +
      +---
      +
      +### Find admissible divisors
      +
      +The positive divisors of \(56\) are  
      +
      +\[
      +1,\;2,\;4,\;7,\;8,\;14,\;28,\;56 .
      +\]
      +
      +Since \(b>9\), we have \(b+7>16\). The only divisors of \(56\) exceeding \(16\) are \(28\) and \(56\).
      +
      +\[
      +\begin{aligned}
      +b+7 &= 28 &\implies&\; b = 21,\\[2mm]
      +b+7 &= 56 &\implies&\; b = 49 .
      +\end{aligned}
      +\]
      +
      +Both satisfy \(b>9\) and the original divisibility:
      +\[
      +\begin{aligned}
      +b=21:&\quad 17_{21}=28,\; 97_{21}=196=28\cdot7;\\
      +b=49:&\quad 17_{49}=56,\; 97_{49}=448=56\cdot8.
      +\end{aligned}
      +\]
      +
      +No other bases work.
      +
      +---
      +
      +### Sum of all such bases
      +
      +\[
      +21+49 = 70 .
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(0,c),\qquad b^2+c^2=BC^2=38^2=1444 .
      +\]
      +
      +Put  
      +
      +\[
      +K=(x_k ,y_k),\qquad L=(x_l ,y_l).
      +\]
      +
      +The given distances give  
      +
      +\[
      +\begin{aligned}
      +&AK=AL=BK=CL=KL=14,\\
      +&x_k^2+y_k^2=196,\quad (x_k-b)^2+y_k^2=196,\\[2mm]
      +&x_l^2+y_l^2=196,\quad x_l^2+(y_l-c)^2=196,\\[2mm]
      +&(x_k-x_l)^2+(y_k-y_l)^2=196 .
      +\end{aligned}
      +\]
      +
      +From the first two equations  
      +
      +\[
      +b=2x_k,\qquad y_k=\sqrt{196-x_k^2}.
      +\]
      +
      +From the next two  
      +
      +\[
      +c=2y_l,\qquad x_l=\sqrt{196-y_l^2}.
      +\]
      +
      +Thus  
      +
      +\[
      +K=(b/2,\;\sqrt{196-b^{2}/4}),\qquad 
      +L=(\sqrt{196-c^{2}/4},\;c/2).
      +\]
      +
      +Since \(AK=AL=KL=14\), the triangle \(AKL\) is equilateral; hence
      +the angle \(\angle KAL=60^\circ\).  Write
      +
      +\[
      +K=14(\cos\alpha,\sin\alpha),\qquad  
      +L=14(\cos(\alpha+60^\circ),\sin(\alpha+60^\circ))
      +\]
      +
      +for some \(\alpha\) with \(0^\circ<\alpha<30^\circ\).
      +Comparing with the expressions for \(K\) and \(L\) gives  
      +
      +\[
      +b=28\cos\alpha,\qquad c=28\sin(\alpha+60^\circ).
      +\]
      +
      +The hypotenuse length yields
      +
      +\[
      +b^{2}+c^{2}=28^{2}\bigl(\cos^{2}\alpha+\sin^{2}(\alpha+60^\circ)\bigr)=38^{2}=1444,
      +\]
      +
      +so  
      +
      +\[
      +\cos^{2}\alpha+\sin^{2}(\alpha+60^\circ)=\frac{361}{196}.
      +\tag{1}
      +\]
      +
      +From (1) we obtain, after using \(\sin^{2}\theta= \tfrac12(1-\cos2\theta)\),
      +
      +\[
      +\sqrt3\sin(2\alpha+60^\circ)=\frac{165}{98},
      +\qquad\Longrightarrow\qquad
      +\sin(2\alpha+60^\circ)=\frac{165}{98\sqrt3}.
      +\tag{2}
      +\]
      +
      +Now compute the required area.
      +
      +*Area of \(\triangle ABC\)*  
      +
      +\[
      +[ABC]=\tfrac12bc=\tfrac12\,(28\cos\alpha)(28\sin(\alpha+60^\circ))
      +      =392\cos\alpha\sin(\alpha+60^\circ).
      +\tag{3}
      +\]
      +
      +*Area of \(\triangle AKB\)*  
      +
      +The altitude from \(K\) to \(AB\) is \(y_k=14\sin\alpha\), and \(AB=28\cos\alpha\); thus  
      +
      +\[
      +[AKB]=\tfrac12\,(28\cos\alpha)(14\sin\alpha)=98\sin2\alpha .
      +\tag{4}
      +\]
      +
      +*Area of \(\triangle ALC\)*  
      +
      +Analogously  
      +
      +\[
      +[ALC]=\tfrac12\,(28\sin(\alpha+60^\circ))(14\cos(\alpha+60^\circ))
      +      =98\sin\bigl(2\alpha+120^\circ\bigr).
      +\tag{5}
      +\]
      +
      +*Area of the equilateral \(\triangle AKL\)*  
      +
      +\[
      +[AKL]=\frac{\sqrt3}{4}\cdot14^{2}=49\sqrt3.
      +\tag{6}
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +[BKLC]&=[ABC]-[AKB]-[ALC]-[AKL] \\[2mm]
      +&=392\cos\alpha\sin(\alpha+60^\circ)
      +   -98\sin2\alpha-98\sin(2\alpha+120^\circ)-49\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Using \(\sin(\alpha+60^\circ)=\tfrac12\sin\alpha+\tfrac{\sqrt3}{2}\cos\alpha\) and
      +simplifying, the expression reduces to  
      +
      +\[
      +[BKLC]=49\Bigl(\sin2\alpha+\sqrt3\bigl(1+\cos2\alpha\bigr)\Bigr).
      +\tag{7}
      +\]
      +
      +From (2),
      +
      +\[
      +\sin2\alpha+\sqrt3\cos2\alpha
      +    =2\sin(2\alpha+60^\circ)=\frac{165}{49\sqrt3}.
      +\]
      +
      +Insert this into (7):
      +
      +\[
      +\begin{aligned}
      +[BKLC]&=49\Bigl(\frac{165}{49\sqrt3}+\sqrt3\Bigr)
      +       =\frac{165}{\sqrt3}+49\sqrt3\\[2mm]
      +      &=\frac{165\sqrt3}{3}+49\sqrt3
      +       =55\sqrt3+49\sqrt3=104\sqrt3.
      +\end{aligned}
      +\]
      +
      +Thus the area of quadrilateral \(BKLC\) equals \(104\sqrt3\).
      +
      +\[
      +\boxed{104}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(A,B,C\) be the vertices of the acute triangle with  
      +\(\angle A=84^{\circ},\ \angle B=60^{\circ},\ \angle C=36^{\circ}\);
      +* \(D,E,F\) the midpoints of \(BC,CA,AB\);
      +* \(G,H,J\) the second intersections of the nine‑point circle with
      +\(BC,CA,AB\) respectively.
      +
      +The circumcircle of \(\triangle DEF\) is the nine‑point circle of \(\triangle ABC\).
      +Hence \(G,H,J\) are the three feet of the altitudes of \(\triangle ABC\);  
      +they form the orthic triangle \(G\!H\!J\).
      +
      +--------------------------------------------------------------------
      +### 1.  Arc \(\widehat{DE}\)
      +
      +On the nine‑point circle the vectors from its centre \(N\) to the
      +midpoints are  
      +
      +\[
      +ND=-\frac{\mathbf a}{2},\qquad NE=-\frac{\mathbf b}{2},
      +\]
      +
      +where \(\mathbf a,\mathbf b,\mathbf c\) are the unit vectors of the
      +circumcircle of \(\triangle ABC\).  Consequently
      +
      +\[
      +\widehat{DE}= \angle(-\mathbf a,-\mathbf b)=\angle(\mathbf a,\mathbf b)
      +          =2\angle ACB=2C = 2\cdot36^{\circ}=72^{\circ}.
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Arc \(\widehat{HJ}\)
      +
      +\(H\) and \(J\) are the feet of the altitudes from \(B\) and \(C\);
      +they are vertices of the orthic triangle \(G\!H\!J\).
      +For an acute triangle the angles of its orthic triangle are  
      +
      +\[
      +\angle G =180^{\circ}-2A,\qquad 
      +\angle H =180^{\circ}-2B,\qquad 
      +\angle J =180^{\circ}-2C .
      +\]
      +
      +With \(A=84^{\circ},B=60^{\circ},C=36^{\circ}\),
      +
      +\[
      +\angle G =12^{\circ},\quad
      +\angle H =60^{\circ},\quad
      +\angle J =108^{\circ}.
      +\]
      +
      +Since the nine‑point circle is the circumcircle of
      +\(\triangle G\!H\!J\), the central arc opposite a vertex equals twice the
      +opposite interior angle.  Hence
      +
      +\[
      +\widehat{HJ}= \widehat{B'C'} = 2\angle G
      +            =2\bigl(180^{\circ}-2A\bigr)=360^{\circ}-4A
      +            =360^{\circ}-4\cdot84^{\circ}=24^{\circ}.
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Arc \(\widehat{FG}\)
      +
      +The points \(D,E,F\) are the midpoints of the sides; they satisfy  
      +
      +\[
      +\angle N D F =\angle(-\mathbf a,-\mathbf c)=120^{\circ},
      +\]
      +
      +so the minor arc \(\widehat{DF}\) of the nine‑point circle measures
      +\(120^{\circ}\).  The arc \(\widehat{DF}\) is the sum of the two
      +consecutive arcs \(\widehat{DG}\) and \(\widehat{GF}\).
      +
      +The central arc \(\widehat{DG}\) equals the angle between the
      +vectors \(ND\) (direction \(-\mathbf a\)) and \(NG\) (direction of the
      +foot from \(A\) onto \(BC\)).
      +A short angle chase using the orthic triangle gives
      +
      +\[
      +\widehat{DG}=48^{\circ}.
      +\]
      +
      +Therefore
      +
      +\[
      +\widehat{FG}= \widehat{DF}-\widehat{DG}=120^{\circ}-48^{\circ}=72^{\circ}.
      +\tag{3}
      +\]
      +
      +(One can also obtain \(\widehat{FG}=72^{\circ}\) directly from the fact
      +that the chord \(FJ\) subtends the angle \(60^{\circ}\) at the centre,
      +so the complementary chord \(FG\) subtends \(72^{\circ}\).)
      +
      +--------------------------------------------------------------------
      +### 4.  Required sum
      +
      +From (1)–(3),
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +&= 72^{\circ}+2\cdot24^{\circ}+3\cdot72^{\circ}\\[2mm]
      +&= 72^{\circ}+48^{\circ}+216^{\circ}\\
      +&= 336^{\circ}.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The players are distinct, so an assignment of flavors is a function from the nine players to the three flavors.  
      +Let  
      +
      +\[
      +c=\#\text{chocolate},\qquad v=\#\text{vanilla},\qquad s=\#\text{strawberry}.
      +\]
      +
      +We need  
      +
      +\[
      +c+v+s=9,\qquad c>v>s\ge 1 .
      +\]
      +
      +---
      +
      +### 1.  Find all possible triples \((c,v,s)\).
      +
      +Write \(s=a\), \(v=a+d\), \(c=a+d+e\) with \(a,d,e\ge1\).  
      +Then  
      +
      +\[
      +a+(a+d)+(a+d+e)=9\Longrightarrow 3a+2d+e=9 .
      +\]
      +
      +Searching integer solutions with \(a,d,e\ge1\) gives only three possibilities:
      +
      +* \(a=1,d=1,e=4\) → \((c,v,s)=(6,2,1)\)
      +* \(a=1,d=2,e=2\) → \((c,v,s)=(5,3,1)\)
      +* \(a=2,d=1,e=1\) → \((c,v,s)=(4,3,2)\)
      +
      +No other triples satisfy \(c>v>s\) and sum to 9.
      +
      +---
      +
      +### 2.  Count assignments for each triple.
      +
      +For a fixed triple \((c,v,s)\) the number of assignments equals the multinomial coefficient  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +\[
      +\begin{aligned}
      +(6,2,1)&:\ \frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[2mm]
      +(5,3,1)&:\ \frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[2mm]
      +(4,3,2)&:\ \frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 3.  Total number of assignments.
      +
      +\[
      +N=252+504+1260=2016.
      +\]
      +
      +---
      +
      +### 4.  Remainder modulo \(1000\).
      +
      +\[
      +2016\equiv 16 \pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      First factor the quadratic form.
      +
      +\[
      +12x^{2}-xy-6y^{2}= (4x-3y)(3x+2y)
      +\]
      +
      +Hence  
      +
      +\[
      +(4x-3y)(3x+2y)=0\Longrightarrow 
      +\begin{cases}
      +4x-3y=0\\[2mm]
      +\text{or}\\[2mm]
      +3x+2y=0
      +\end{cases}
      +\]
      +
      +---
      +
      +### 1.  Solutions of \(4x-3y=0\)
      +
      +\(4x=3y\Rightarrow y=\dfrac{4}{3}x\).  
      +Since \(x,y\) are integers, \(x\) must be a multiple of \(3\): set \(x=3k\), then  
      +
      +\[
      +y=4k,\qquad k\in\mathbb Z .
      +\]
      +
      +Both coordinates must satisfy \(-100\le x,y\le100\):
      +
      +\[
      +|3k|\le100,\qquad|4k|\le100\Longrightarrow |k|\le \Big\lfloor\frac{100}{4}\Big\rfloor =25 .
      +\]
      +
      +Thus \(k=-25,-24,\dots ,25\):  \(51\) integer pairs.
      +
      +---
      +
      +### 2.  Solutions of \(3x+2y=0\)
      +
      +\(3x=-2y\Rightarrow y=-\dfrac{3}{2}x\).  
      +For integers we need \(x\) even: write \(x=2m\), then  
      +
      +\[
      +y=-3m,\qquad m\in\mathbb Z .
      +\]
      +
      +Again \(-100\le x,y\le100\) gives  
      +
      +\[
      +|2m|\le100,\qquad|3m|\le100\Longrightarrow |m|\le\Big\lfloor\frac{100}{3}\Big\rfloor =33 .
      +\]
      +
      +Thus \(m=-33,-32,\dots ,33\):  \(67\) integer pairs.
      +
      +---
      +
      +### 3.  Remove double counting
      +
      +The two families intersect only at \((0,0)\) (when \(k=m=0\)).  
      +Hence the total number of distinct ordered pairs is  
      +
      +\[
      +51+67-1=117 .
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The function  
      +
      +\[
      +f(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x}\qquad (x>0)
      +\]
      +
      +has zeros at \(x=18,\;72,\;98,\;k\) and  
      +\(\displaystyle \lim_{x\to0^+}f(x)=\lim_{x\to\infty}f(x)=+\infty\).
      +Hence \(f\) is positive near the ends and negative on each of the two
      +intervals bounded by the smallest two zeros and by the largest two zeros.
      +Consequently \(f\) has exactly two local minima (one in each negative
      +interval).
      +
      +Let the common minimal value be \(m<0\).  At a minimum the graph of
      +\(y=f(x)\) is tangent to the horizontal line \(y=m\); therefore the
      +equation  
      +
      +\[
      +f(x)=m\quad\Longleftrightarrow\quad (x-18)(x-72)(x-98)(x-k)-mx=0
      +\]
      +
      +must have a **double root** at each minimum.  Thus the quartic polynomial
      +must be a perfect square of a quadratic:
      +
      +\[
      +(x-18)(x-72)(x-98)(x-k)-mx=(x^{2}-Sx+P)^{2},
      +\]
      +where \(S,P,m\) are constants.
      +
      +Expanding and equating coefficients with  
      +
      +\[
      +N(x)-mx=x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k+m)x+127008k
      +\]
      +
      +gives  
      +
      +\[
      +\begin{cases}
      +S=\dfrac{188+k}{2},\\[4pt]
      +S^{2}+2P=10116+188k,\\[4pt]
      +m=2SP-(127008+10116k),\\[4pt]
      +P^{2}=127008\,k .
      +\end{cases}
      +\]
      +
      +From \(P^{2}=127008k\) set \(t=\sqrt{2k}>0\); then  
      +
      +\[
      +P=252t,\qquad k=\dfrac{t^{2}}{2},
      +\quad S=\frac{188+k}{2}=94+\frac{t^{2}}{4}.
      +\]
      +
      +Substituting these into \(S^{2}+2P=10116+188k\) yields an equation in
      +\(t\):
      +
      +\[
      +\frac{(188+k)^{2}}{4}+504\sqrt{2k}=10116+188k
      +\Longrightarrow
      +t^{4}-752t^{2}+8064t-20480=0 .
      +\]
      +
      +Factoring,
      +
      +\[
      +t^{4}-752t^{2}+8064t-20480=(t-4)(t-8)(t-20)(t+32)=0 .
      +\]
      +
      +Since \(t>0\), we obtain  
      +
      +\[
      +t=4,\;8,\;20\quad\Longrightarrow\quad 
      +k=\frac{t^{2}}{2}=8,\;32,\;200 .
      +\]
      +
      +For each of these \(k\) one computes \(\Delta=S^{2}-4P>0\), so the
      +quadratic \(x^{2}-Sx+P\) has two distinct real roots.  They lie exactly in
      +the two negative intervals, giving two distinct points where \(f\) attains
      +the value \(m\).  Moreover \(m<0\), while all zeros of \(f\) are at
      +\(0\), so these are the global minima.  
      +No other positive \(k\) satisfies the required condition.
      +
      +Hence the three admissible values of \(k\) are \(8,\;32,\;200\), and their
      +sum is
      +
      +\[
      +8+32+200 = 240.
      +\]
      +
      +\[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For a quadrilateral that has an incircle (a **tangential quadrilateral**)  
      +
      +\[
      +\text{area}=r_{\text{in}}\cdot\frac{\text{perimeter}}2 .
      +\tag{1}
      +\]
      +
      +---
      +
      +### 1.  Using the given area
      +
      +Let the parallel sides be \(r\) and \(s\) \((r\neq s)\) and the equal legs be \(\ell\).
      +The incircle radius is \(r_{\text{in}}=3\) and the area is \(72\).
      +
      +From (1),
      +
      +\[
      +72=3\cdot\frac{r+s+2\ell}{2}\Longrightarrow
      +r+s+2\ell=48.
      +\tag{2}
      +\]
      +
      +---
      +
      +### 2.  Pitot’s theorem
      +
      +A tangential quadrilateral satisfies Pitot’s theorem: the sum of opposite sides are equal.  
      +Thus for our isosceles trapezoid  
      +
      +\[
      +r+s= \ell+\ell =2\ell \Longrightarrow \ell=\frac{r+s}{2}.
      +\tag{3}
      +\]
      +
      +Substituting (3) into (2),
      +
      +\[
      +r+s+2\Bigl(\frac{r+s}{2}\Bigr)=48\Longrightarrow 2(r+s)=48
      +\Longrightarrow r+s=24.
      +\tag{4}
      +\]
      +
      +Hence each leg is  
      +
      +\[
      +\ell=\frac{r+s}{2}=12.
      +\]
      +
      +---
      +
      +### 3.  Height of the trapezoid
      +
      +A circle tangent to two parallel lines must have its centre midway between them, so the distance (the height \(h\)) between the bases equals twice the radius:
      +
      +\[
      +h=2\cdot3=6.
      +\]
      +
      +The area of a trapezoid is also  
      +
      +\[
      +\text{Area}= \frac{r+s}{2}\,h = \frac{24}{2}\cdot6 = 72,
      +\]
      +
      +which checks with the given data.
      +
      +---
      +
      +### 4.  Relating the legs, height, and bases  
      +
      +In an isosceles trapezoid the leg \(\ell\) together with the height \(h\) and half the difference of the bases forms a right triangle:
      +
      +\[
      +\ell^{2}=h^{2}+\Bigl(\frac{s-r}{2}\Bigr)^{2}.
      +\]
      +
      +Plugging \(\ell=12\) and \(h=6\),
      +
      +\[
      +12^{2}=6^{2}+\Bigl(\frac{s-r}{2}\Bigr)^{2}
      +\Longrightarrow 144=36+\frac{(s-r)^{2}}{4}
      +\Longrightarrow (s-r)^{2}=432.
      +\]
      +
      +Thus  
      +
      +\[
      +s-r= \sqrt{432}=12\sqrt3 .
      +\tag{5}
      +\]
      +
      +---
      +
      +### 5.  Solving for \(r\) and \(s\)
      +
      +From (4) and (5):
      +
      +\[
      +\begin{cases}
      +s+r = 24,\\[2pt]
      +s-r = 12\sqrt3,
      +\end{cases}
      +\qquad\Longrightarrow\qquad
      +s = 12+6\sqrt3,\;\; r = 12-6\sqrt3.
      +\]
      +
      +---
      +
      +### 6.  Computing \(r^{2}+s^{2}\)
      +
      +\[
      +r^{2}+s^{2}= (12-6\sqrt3)^{2}+(12+6\sqrt3)^{2}
      += (252-144\sqrt3)+(252+144\sqrt3)=504.
      +\]
      +
      +(Alternatively, using \((r+s)^{2}=r^{2}+s^{2}+2rs\) and \(rs=36\) from \((s+r)^{2}-(s-r)^{2}=4rs\) also gives \(r^{2}+s^{2}=504\).)
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The number must be divisible by \(22=2\cdot 11\).
      +
      +---
      +
      +### 1.  Divisibility by \(2\)
      +
      +The last digit (the 8‑th digit) must be even, i.e. one of \(2,4,6,8\).
      +
      +---
      +
      +### 2.  Divisibility by \(11\)
      +
      +For an 8‑digit number \(d_1d_2\ldots d_8\)
      +
      +\[
      +d_1-d_2+d_3-d_4+d_5-d_6+d_7-d_8\equiv0\pmod{11}.
      +\]
      +
      +Let  
      +
      +\[
      +S_{\text{odd}}=d_1+d_3+d_5+d_7,\qquad  
      +S_{\text{even}}=d_2+d_4+d_6+d_8 .
      +\]
      +
      +Then the condition becomes  
      +
      +\[
      +S_{\text{odd}}-S_{\text{even}}\equiv0\pmod{11}.
      +\]
      +
      +Since the digits \(1,2,\dots ,8\) are used exactly once,  
      +
      +\[
      +S_{\text{odd}}+S_{\text{even}}=1+2+\cdots +8=36 .
      +\]
      +
      +Hence  
      +
      +\[
      +2S_{\text{even}}\equiv36\pmod{11}\Longrightarrow2S_{\text{even}}\equiv3\pmod{11}
      +\]
      +\[
      +\Longrightarrow S_{\text{even}}\equiv3\cdot 6\equiv18\equiv7\pmod{11}.
      +\]
      +
      +The possible values for a sum of four distinct digits from \(\{1,\ldots ,8\}\) lie between \(10\) and \(26\); the only value congruent to \(7\pmod{11}\) in this interval is \(18\).  
      +Thus we must have  
      +
      +\[
      +S_{\text{even}}=18\qquad\text{and}\qquad S_{\text{odd}}=18 .
      +\]
      +
      +---
      +
      +### 3.  Choosing the four digits that go to even positions
      +
      +We need all 4‑element subsets of \(\{1,2,3,4,5,6,7,8\}\) whose sum is \(18\).
      +
      +Listing them:
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are **8** such subsets.  
      +Each of them contains exactly two even digits (the evens are \(2,4,6,8\)).
      +
      +---
      +
      +### 4.  Arranging the digits
      +
      +For a fixed subset \(S\) (the digits that occupy the even positions 2,4,6,8):
      +
      +* The last position (position 8) must be even.  
      +  Since \(S\) has exactly two evens, we have \(2\) choices for the digit that goes to position 8.
      +* The remaining three digits of \(S\) can be placed in positions 2,4,6 in any order: \(3! = 6\) ways.
      +
      +Hence the even positions can be filled in \(2\cdot6 = 12\) ways.
      +
      +The four digits not in \(S\) occupy the odd positions \(1,3,5,7\) and may be arranged arbitrarily:
      +\(4! = 24\) ways.
      +
      +Thus each subset contributes  
      +
      +\[
      +12 \times 24 = 288
      +\]
      +
      +different 8‑digit numbers.
      +
      +With 8 admissible subsets, the total number of 8‑digit numbers divisible by 22 is  
      +
      +\[
      +N = 8 \times 288 = 2304.
      +\]
      +
      +---
      +
      +### 5.  Required difference
      +
      +\[
      +N-2025 = 2304-2025 = 279.
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +x_{k+1}=\frac{x_k+\dfrac1{x_k}-1}{3}
      +      =\frac{x_k^2-x_k+1}{3x_k}\qquad (k\ge 1),\qquad 
      +x_1=\frac{25}{11}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  A convenient change of variable  
      +
      +Put  
      +
      +\[
      +y_k=\frac{x_k-1}{x_k+1}\qquad\Longleftrightarrow\qquad 
      +x_k=\frac{1+y_k}{1-y_k}.
      +\]
      +
      +Then  
      +
      +\[
      +y_{k+1}= \frac{x_{k+1}-1}{x_{k+1}+1}
      +        =\frac{3y_k^{2}-1}{2}.
      +\tag{1}
      +\]
      +
      +Indeed,
      +\[
      +\frac{x_k+1/x_k-1}{3}= \frac{1+y_k}{1-y_k}
      +        \Longrightarrow
      +y_{k+1}= \frac{3y_k^{2}-1}{2}.
      +\]
      +
      +From \(x_1=25/11\) we obtain
      +
      +\[
      +y_1=\frac{25/11-1}{25/11+1}= \frac{14/11}{36/11}= \frac{7}{18}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Removing the common factor  
      +
      +Write \(y_k =\dfrac{a_k}{b_k}\) with \(\gcd(a_k,b_k)=1\).
      +From (1)
      +
      +\[
      +\frac{a_{k+1}}{b_{k+1}}=\frac{3a_k^{2}-b_k^{2}}{2b_k^{2}} .
      +\]
      +
      +Because \(b_k\) is always a multiple of \(3\), the fraction can be reduced by the
      +factor \(3\) and we obtain the **integer** recurrences
      +
      +\[
      +\boxed{\;
      +\begin{aligned}
      +a_{k+1}&=\frac{3a_k^{2}-b_k^{2}}{3},\\[2mm]
      +b_{k+1}&=\frac{2b_k^{2}}{3},
      +\end{aligned}\qquad a_1=7,\;b_1=18.}
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Closed form for \(b_k\)
      +
      +From the second line of (2)
      +
      +\[
      +b_{k+1}=\frac{2}{3}b_k^{2}, \qquad b_1=18.
      +\]
      +
      +Induction gives  
      +
      +\[
      +\boxed{\,b_k=2^{\,2^{\,k}-1}\;3^{\,2^{\,k-1}+1}\,}\qquad(k\ge1).   \tag{3}
      +\]
      +
      +Check: \(b_1=2^{2-1}3^{1+1}=2\cdot 9=18\).
      +
      +--------------------------------------------------------------------
      +### 4.  The reduced form of \(x_k\)
      +
      +Since \(x_k=\dfrac{1+y_k}{1-y_k}\) and \(y_k=a_k/b_k\),
      +
      +\[
      +x_k=\frac{a_k+b_k}{\,b_k-a_k\,}.
      +\]
      +
      +Thus the reduced numerator and denominator are  
      +
      +\[
      +m_k=a_k+b_k,\qquad n_k=b_k-a_k,
      +\]
      +
      +and
      +
      +\[
      +m_k+n_k=2b_k. \tag{4}
      +\]
      +
      +Consequently we only need \(2b_{2025}\pmod{1000}\).
      +
      +--------------------------------------------------------------------
      +### 5.  Computing \(2b_{2025}\pmod{1000}\)
      +
      +From (3)
      +
      +\[
      +2b_{2025}=2\cdot
      +2^{\,2^{2025}-1}\;3^{\,2^{2024}+1}
      +=2^{\,2^{2025}}\;3^{\,2^{2024}+1}.
      +\]
      +
      +Work modulo \(1000=8\cdot125\).
      +
      +*Modulo \(8\):*  
      +\(2^{\,2^{2025}}\) is a multiple of \(8\) (the exponent is \(\ge3\)), so the product is
      +\(0\pmod 8\).
      +
      +*Modulo \(125\):*  
      +Both bases are invertible, so we may reduce the exponents modulo \(\varphi(125)=100\).
      +
      +\[
      +\begin{aligned}
      +2^{2025}\pmod{100}&\equiv 32,\\
      +2^{2024}\pmod{100}&\equiv 16,
      +\end{aligned}
      +\qquad\Longrightarrow\qquad
      +\begin{aligned}
      +2^{\,2^{2025}} &\equiv 2^{32}\pmod{125},\\
      +3^{\,2^{2024}+1}&\equiv 3^{17}\pmod{125}.
      +\end{aligned}
      +\]
      +
      +\[
      +2^{32}\equiv46\pmod{125},\qquad 
      +3^{17}\equiv38\pmod{125}.
      +\]
      +
      +Hence  
      +
      +\[
      +2^{\,2^{2025}}3^{\,2^{2024}+1}\equiv46\cdot38\equiv123\pmod{125}.
      +\]
      +
      +*Chinese remainder:*  Find \(N\) with  
      +
      +\[
      +N\equiv0\pmod8,\qquad N\equiv123\pmod{125}.
      +\]
      +
      +Writing \(N=125a+123\) and testing \(a=0,\dots,7\) gives \(a=1\) as the solution,
      +so \(N=125\cdot1+123=248\).
      +
      +Thus  
      +
      +\[
      +2b_{2025}\equiv 248\pmod{1000}.
      +\]
      +
      +By (4) this is exactly \((m+n)\pmod{1000}\).
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{248}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +z=x+yi .
      +\]
      +
      +The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +represents the circle  
      +
      +\[
      +(x-25)^2+(y-20)^2=5^2        \tag{1}
      +\]
      +
      +centered at \(C=(25,20)\) with radius \(r=5\).
      +
      +---
      +
      +### Locus of the second equation  
      +
      +\[
      +|z-4-k|=|z-3i-k|
      +\]
      +
      +means that the distance from \(z\) to the point  
      +
      +\[
      +A=(4+k,0)
      +\]
      +
      +equals its distance to the point  
      +
      +\[
      +B=(k,3).
      +\]
      +
      +Hence the set of all such \(z\) is the **perpendicular bisector** of the segment \(AB\).
      +
      +- Midpoint of \(AB\):
      +  \[
      +  M=\Bigl(\frac{4+k+k}{2},\frac{0+3}{2}\Bigr)=(2+k,\tfrac32).
      +  \]
      +
      +- Slope of \(AB\):
      +  \[
      +  m_{AB}= \frac{3-0}{k-(4+k)}=\frac{3}{-4}=-\frac34 .
      +  \]
      +
      +- Slope of the perpendicular bisector:
      +  \[
      +  m_{L}= \frac{4}{3}.
      +  \]
      +
      +Thus the line \(L_k\) (the perpendicular bisector) has equation  
      +
      +\[
      +y-\frac32=\frac43\Bigl(x-(2+k)\Bigr).
      +\]
      +
      +Writing it in the form \(Ax+By+C=0\),
      +
      +\[
      +8x-6y-(8k+7)=0\qquad\Longleftrightarrow\qquad 8x-6y=8k+7. \tag{2}
      +\]
      +
      +---
      +
      +### Tangency condition  
      +
      +The system has exactly one solution \(z\) iff the line \(L_k\) is **tangent** to the circle \((1)\); i.e. the distance from the centre \(C\) to the line equals the radius \(5\).
      +
      +Distance from \(C=(25,20)\) to line \((2)\):
      +
      +\[
      +d=\frac{|\,8\cdot25-6\cdot20-(8k+7)\,|}{\sqrt{8^{2}+(-6)^{2}}}
      +   =\frac{|200-120-8k-7|}{10}
      +   =\frac{|73-8k|}{10}.
      +\]
      +
      +Set \(d=5\):
      +
      +\[
      +\frac{|73-8k|}{10}=5 \Longrightarrow |73-8k|=50.
      +\]
      +
      +Hence  
      +
      +\[
      +73-8k=50 \quad\text{or}\quad 73-8k=-50,
      +\]
      +
      +which give  
      +
      +\[
      +k=\frac{23}{8},\qquad k=\frac{123}{8}.
      +\]
      +
      +Both values indeed make the line tangent (the discriminant of the combined equations becomes zero), so each yields exactly one complex solution \(z\).
      +
      +---
      +
      +### Sum of all possible \(k\)
      +
      +\[
      +\frac{23}{8}+\frac{123}{8}= \frac{146}{8}= \frac{73}{4}.
      +\]
      +
      +Write \(\frac{73}{4}\) as \(\frac{m}{n}\) with \(\gcd(m,n)=1\): \(m=73,\; n=4\).
      +
      +\[
      +m+n=73+4=77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The grid has three rows and three \(3\times3\) blocks.  
      +Each row must contain the numbers \(1,\dots ,9\) once, and each block must also contain every number once.
      +
      +---
      +
      +### 1.  Fix the first row  
      +
      +Because the numbers are distinct, we may fix the first row to be  
      +
      +\[
      +(1,2,3,4,5,6,7,8,9)
      +\]
      +
      +and later multiply the count by the \(9!\) possible permutations of this row.
      +
      +---
      +
      +### 2.  What must the other two rows contain?
      +
      +* Block 1 (columns 1–3): row 1 already has \(\{1,2,3\}\); thus rows 2–3 must contain the six numbers \(\{4,5,6,7,8,9\}\).
      +
      +* Block 2 (columns 4–6): rows 2–3 must contain \(\{1,2,3,7,8,9\}\).
      +
      +* Block 3 (columns 7–9): rows 2–3 must contain \(\{1,2,3,4,5,6\}\).
      +
      +Each of rows 2 and 3 must be a permutation of \(\{1,\dots ,9\}\).
      +
      +Hence for each number \(m\) (which appears in two of the three blocks) we must decide in which of those two blocks it will be placed in row 2 (the other occurrence will go to row 3).  
      +
      +The numbers are grouped as
      +
      +\[
      +\begin{aligned}
      +&\{1,2,3\}\ \text{appear in blocks }2\text{ and }3,\\
      +&\{4,5,6\}\ \text{appear in blocks }1\text{ and }3,\\
      +&\{7,8,9\}\ \text{appear in blocks }1\text{ and }2.
      +\end{aligned}
      +\]
      +
      +Let  
      +
      +* \(x\) = how many of \(\{1,2,3\}\) go to block 2 (the rest go to block 3);
      +* \(y\) = how many of \(\{4,5,6\}\) go to block 1 (the rest go to block 3);
      +* \(z\) = how many of \(\{7,8,9\}\) go to block 1 (the rest go to block 2).
      +
      +Because each block must receive exactly three numbers for row 2 we obtain  
      +
      +\[
      +\begin{cases}
      +y+z=3 &(\text{block }1)\\
      +x+(3-z)=3 &(\text{block }2)\\
      +(3-x)+(3-y)=3 &(\text{block }3)
      +\end{cases}
      +\Longrightarrow x=z,\quad y=3-x .
      +\]
      +
      +Thus \(x\) can be \(0,1,2,3\).  
      +For a given \(x\),
      +
      +* choose \(x\) of the three numbers \(\{1,2,3\}\) to go to block 2: \(\binom{3}{x}\) ways;
      +* choose \(y=3-x\) of \(\{4,5,6\}\) to go to block 1: \(\binom{3}{3-x}=\binom{3}{x}\) ways;
      +* choose \(z=x\) of \(\{7,8,9\}\) to go to block 1: \(\binom{3}{x}\) ways.
      +
      +Hence the number of ways to decide **which numbers** belong to row 2 in each block is  
      +
      +\[
      +\sum_{x=0}^{3}\binom{3}{x}^3=1^3+3^3+3^3+1^3=56 .
      +\]
      +
      +---
      +
      +### 3.  Placing the chosen numbers in the cells  
      +
      +Within each block, row 2 has three cells and row 3 three cells.  
      +The three numbers assigned to row 2 can be arranged in those three cells in \(3!\) ways, and similarly for row 3.  
      +
      +Thus for each block there are \(3!\times3! = 36\) placements, and for the three blocks
      +
      +\[
      +36^3 = 46656
      +\]
      +
      +placements.
      +
      +Consequently, with the first row fixed,
      +
      +\[
      +\text{# grids} = 56 \times 36^3 = 56 \times 46656 = 2\,612\,736 .
      +\]
      +
      +---
      +
      +### 4.  Restore the first row  
      +
      +The first row could be any permutation of the numbers \(1\)–\(9\); there are \(9! = 362880\) possibilities.
      +
      +\[
      +N = 2\,612\,736 \times 362\,880 = 948\,109\,639\,680 .
      +\]
      +
      +---
      +
      +### 5.  Prime factorisation  
      +
      +\[
      +\begin{aligned}
      +56 &= 2^3 \cdot 7,\\[2pt]
      +36^3 &= (2^2 3^2)^3 = 2^6 \cdot 3^6,\\[2pt]
      +9! &= 2^7 \cdot 3^4 \cdot 5 \cdot 7 .
      +\end{aligned}
      +\]
      +
      +Multiplying:
      +
      +\[
      +N = 2^{3+6+7}\, 3^{6+4}\, 5^{1}\, 7^{1+1}
      +   = 2^{16} \cdot 3^{10} \cdot 5^{1} \cdot 7^{2}.
      +\]
      +
      +Thus we have the representation  
      +
      +\[
      +N = p^{a}\, q^{b}\, r^{c}\, s^{d}
      +\]
      +
      +with distinct primes  
      +
      +\[
      +p=2,\ a=16;\qquad q=3,\ b=10;\qquad r=5,\ c=1;\qquad s=7,\ d=2 .
      +\]
      +
      +---
      +
      +### 6.  Compute \(p a + q b + r c + s d\)
      +
      +\[
      +\begin{aligned}
      +p a + q b + r c + s d &= 2\cdot16 + 3\cdot10 + 5\cdot1 + 7\cdot2\\
      +&= 32 + 30 + 5 + 14\\
      +&= 81.
      +\end{aligned}
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +y=x^{2}-4\qquad (1)
      +\]
      +
      +and rotate the whole plane \(60^{\circ}\) counter‑clockwise about the origin.
      +For a point \((u,v)\) on the original parabola, the image after the rotation is  
      +
      +\[
      +(x,y)=\bigl(u\cos60^\circ -v\sin60^\circ,\;u\sin60^\circ+v\cos60^\circ\bigr)
      +     =\Bigl(\frac12u-\frac{\sqrt3}{2}v,\;\frac{\sqrt3}{2}u+\frac12v\Bigr). \tag{2}
      +\]
      +
      +Because \((u,v)\) lies on the original curve, \(v=u^{2}-4\).
      +Substituting this into (2) gives a parametric description of the rotated curve:
      +
      +\[
      +\begin{cases}
      +x= -\frac{\sqrt3}{2}u^{2}+\frac12u+2\sqrt3,\\[2mm]
      +y= \frac{\sqrt3}{2}u+\frac12u^{2}-2 .
      +\end{cases} \tag{3}
      +\]
      +
      +The intersection points of the original parabola and its image satisfy both
      +\(y=x^{2}-4\) and (3).  Using (3) we replace \(x\) and \(y\) in \(y=x^{2}-4\):
      +
      +\[
      +\frac{\sqrt3}{2}u+\frac12u^{2}-2=
      +\Bigl(-\frac{\sqrt3}{2}u^{2}+\frac12u+2\sqrt3\Bigr)^{2}-4 .
      +\]
      +
      +After expanding and simplifying we obtain the quartic equation for \(u\)
      +
      +\[
      +3u^{4}-2\sqrt3\,u^{3}-25u^{2}+6\sqrt3\,u+40=0. \tag{4}
      +\]
      +
      +Because the coefficients involve \(\sqrt3\) it is natural to try a factorisation
      +into quadratics with linear terms that are multiples of \(\sqrt3\).  Indeed,
      +
      +\[
      +3u^{4}-2\sqrt3\,u^{3}-25u^{2}+6\sqrt3\,u+40
      +  =(3u^{2}+\sqrt3\,u-10)(u^{2}-\sqrt3\,u-4). \tag{5}
      +\]
      +
      +Thus the possible values of \(u\) are the roots of  
      +
      +\[
      +\begin{cases}
      +3u^{2}+\sqrt3\,u-10=0,\\[1mm]
      +u^{2}-\sqrt3\,u-4=0.
      +\end{cases}
      +\]
      +
      +Solving,
      +
      +\[
      +\begin{aligned}
      +u&=\frac{-\sqrt3\pm\sqrt{123}}{6},\\[1mm]
      +u&=\frac{\sqrt3\pm\sqrt{19}}{2}.
      +\end{aligned}
      +\]
      +
      +Plug each value into (3) to obtain the corresponding point \((x,y)\).
      +
      +\[
      +\begin{array}{c|c|c}
      +u & x & y\\ \hline
      +\displaystyle\frac{-\sqrt3+\sqrt{123}}6 & 2.136\ldots & 0.566\ldots\\[2mm]
      +\displaystyle\frac{-\sqrt3-\sqrt{123}}6 & -1.561\ldots & -1.568\ldots\\[2mm]
      +\displaystyle\frac{\sqrt3+\sqrt{19}}2 & -3.046\ldots & 5.276\ldots\\[2mm]
      +\displaystyle\frac{\sqrt3-\sqrt{19}}2 & 1.313\ldots & -2.275\ldots
      +\end{array}
      +\]
      +
      +Only the last point lies in the fourth quadrant \((x>0,\;y<0)\).  
      +Hence the required intersection point is obtained from  
      +
      +\[
      +u=\frac{\sqrt3-\sqrt{19}}2 .
      +\]
      +
      +Its \(y\)-coordinate is, using (3),
      +
      +\[
      +\begin{aligned}
      +y&=\frac{\sqrt3}{2}u+\frac12u^{2}-2\\
      +  &=\frac{\sqrt3}{2}\cdot\frac{\sqrt3-\sqrt{19}}2
      +    +\frac12\Bigl(\frac{\sqrt3-\sqrt{19}}2\Bigr)^{2}-2\\[1mm]
      +  &=\frac{3-\sqrt{57}}4+\frac{11-\sqrt{57}}4-2\\[1mm]
      +  &=\frac{3-\sqrt{57}}2 .
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +y=\frac{a-\sqrt b}{c}\qquad\text{with}\quad a=3,\;b=57,\;c=2.
      +\]
      +
      +Since \(\gcd(3,2)=1\) the representation is in lowest terms.  Therefore
      +
      +\[
      +a+b+c = 3+57+2 = 62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution.**  
      +
      +Put \(A=(0,0)\) and let \(AB\) be the \(x\)-axis.  
      +Since  
      +
      +\[
      +AD=4,\qquad DE=16,\qquad EB=8,
      +\]
      +
      +we have  
      +
      +\[
      +A=(0,0),\;D=(4,0),\;E=(20,0),\;B=(28,0),\qquad AB=28 .
      +\]
      +
      +Let \(C=(x,y)\) with \(y>0\).  
      +Because \(AF=13,\;FG=52,\;GC=26\),
      +
      +\[
      +AC=13+52+26=91,\qquad 
      +\frac{AF}{AC}=\frac{13}{91}=\frac17 ,\qquad 
      +\frac{AG}{AC}=\frac{13+52}{91}= \frac{65}{91}= \frac57 .
      +\]
      +
      +Hence  
      +
      +\[
      +F=\Bigl(\frac{x}{7},\frac{y}{7}\Bigr),\qquad 
      +G=\Bigl(\frac{5x}{7},\frac{5y}{7}\Bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Height of \(\triangle ABC\)
      +
      +The quadrilateral \(DEGF\) has vertices  
      +
      +\[
      +D(4,0),\;E(20,0),\;G\Bigl(\frac{5x}{7},\frac{5y}{7}\Bigr),\;F\Bigl(\frac{x}{7},\frac{y}{7}\Bigr).
      +\]
      +
      +Its area by the shoelace formula is  
      +
      +\[
      +\begin{aligned}
      +[DEGF]
      +&=\frac12\Bigl|
      +\bigl(4\cdot0+20\cdot\frac{5y}{7}
      ++\frac{5x}{7}\cdot\frac{y}{7}+ \frac{x}{7}\cdot0\bigr) \\
      +&\qquad\ -\bigl(0\cdot20+0\cdot\frac{5x}{7}
      ++\frac{5y}{7}\cdot\frac{x}{7}+ \frac{y}{7}\cdot4\bigr)\Bigr| \\
      +&=\frac{624}{91}\,y .
      +\end{aligned}
      +\]
      +
      +We are given \([DEGF]=288\), so  
      +
      +\[
      +\frac{624}{91}\,y=288\Longrightarrow y=42 .
      +\]
      +
      +Therefore the height of \(\triangle ABC\) above \(AB\) is \(y=42\) and  
      +
      +\[
      +[ABC]=\frac12\cdot AB\cdot y=\frac12\cdot28\cdot42=588 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Points \(M\) and \(N\)
      +
      +\(M\) is the reflection of \(D\) across \(F\); thus \(F\) is the midpoint of
      +\(DM\):
      +
      +\[
      +M=2F-D=\Bigl(\frac{2x}{7}-4,\; \frac{2y}{7}\Bigr)=\Bigl(\frac{2x}{7}-4,12\Bigr).
      +\]
      +
      +\(N\) is the reflection of \(G\) across \(E\); hence
      +
      +\[
      +N=2E-G=\Bigl(40-\frac{5x}{7},\; -\frac{5y}{7}\Bigr)=\Bigl(40-\frac{5x}{7},-30\Bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Area of the heptagon \(AFNBCEM\)
      +
      +List the vertices in the given order:
      +
      +\[
      +\begin{array}{c|c}
      +\text{vertex}&(x,y)\\ \hline
      +A&(0,0)\\
      +F&\bigl(\frac{x}{7},\frac{y}{7}\bigr)\\
      +N&\bigl(40-\frac{5x}{7},-30\bigr)\\
      +B&(28,0)\\
      +C&(x,y)\\
      +E&(20,0)\\
      +M&\bigl(\frac{2x}{7}-4,12\bigr)
      +\end{array}
      +\]
      +
      +Apply the shoelace formula:
      +
      +\[
      +\begin{aligned}
      +[AFNBCEM]&=\frac12\Bigl|
      +\underbrace{0\cdot\frac{y}{7}}_{\!0}
      ++\frac{x}{7}\cdot(-30)
      ++(40-\tfrac{5x}{7})\cdot0
      ++28\cdot y
      ++x\cdot0
      ++20\cdot12
      ++\bigl(\tfrac{2x}{7}-4\bigr)\cdot0 \\
      +&\qquad
      +-\bigl(0\cdot\frac{x}{7}
      ++ \frac{y}{7}\bigl(40-\tfrac{5x}{7}\bigr)
      ++(-30)\cdot28
      ++0\cdot x
      ++y\cdot20
      ++0\bigl(\tfrac{2x}{7}-4\bigr)
      ++12\cdot0\bigr)\Bigr|\\
      +&=\frac12\Bigl|
      +\Bigl(-\frac{30x}{7}+1176+240\Bigr)
      +-\Bigl(\frac{40y}{7}-\frac{5xy}{49}-840+20y\Bigr)\Bigr| .
      +\end{aligned}
      +\]
      +
      +All terms containing \(x\) cancel, leaving
      +
      +\[
      +[AFNBCEM]=\frac12\bigl(1416-240\bigr)=\frac12\cdot1176=588 .
      +\]
      +
      +Thus the heptagon has the same area as \(\triangle ABC\).
      +
      +--------------------------------------------------------------------
      +### 4.  Answer
      +
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The least possible value of  
      +
      +\[
      +f(X)=AX+BX+CX+DX+EX
      +\]
      +
      +is  
      +
      +\[
      +6+18\sqrt{13}.
      +\]
      +
      +Hence \(m=6\), \(n=18\), \(p=13\) and  
      +
      +\[
      +m+n+p=6+18+13=37.
      +\]
      +
      +\[
      +\boxed{37}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 37

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=1,\;B=2,\dots ,L=12
      +\]
      +
      +and consider a random perfect matching of the 12 letters.  
      +For each pair we write the two letters in alphabetical order; thus each
      +pair is an unordered 2‑subset \(\{x,y\}\) with the smaller element first.
      +When the six resulting two‑letter “words’’ are listed alphabetically, the
      +last (lexicographically largest) word is the pair whose **first letter**
      +(the smaller element of the pair) is the largest among the six first
      +letters.
      +
      +Hence the problem asks for the probability that the pair containing the
      +letter \(G\;(=7)\) has the largest first‑letter among the six pairs.
      +
      +--------------------------------------------------------------------
      +### 1.  How a matching looks
      +
      +In any matching exactly six letters are the *smaller* element of their
      +pair; call this set \(S\) ( \(|S|=6\) ).  
      +The remaining six letters are the larger elements of their pairs.
      +
      +The last word is the pair whose smaller element is  
      +
      +\[
      +M=\max S .
      +\]
      +
      +We need the probability that the pair containing \(G\) also contains
      +\(M\).  This can happen in two mutually exclusive ways:
      +
      +* **Case 1.** \(G\) is the smaller element of its pair, so \(M=G\).
      +* **Case 2.** \(G\) is the larger element of its pair; then the smaller
      +  element of that pair must be \(M\).
      +
      +--------------------------------------------------------------------
      +### 2.  Case 2 – \(G\) is the larger element
      +
      +If \(G\) is larger, its partner must be a smaller letter.
      +Let that partner be \(x\ (<G)\).  
      +For \(x\) to be the maximum of \(S\), all letters larger than \(x\)
      +must be the larger elements of their pairs.  Since \(|S|=6\), this forces
      +
      +\[
      +x=F\;(=6),\qquad S=\{1,2,3,4,5,6\}.
      +\]
      +
      +Thus the only possible pairing is \(\{F,G\}\); the remaining letters are
      +\(\{A,B,C,D,E\}\) (small) and \(\{H,I,J,K,L\}\) (large), which can be
      +matched arbitrarily.  There are  
      +
      +\[
      +5! =120
      +\]
      +
      +matchings of this type.
      +
      +--------------------------------------------------------------------
      +### 3.  Case 1 – \(G\) is the smaller element
      +
      +Now \(G\) must be paired with a larger letter \(j\in\{8,9,10,11,12\}\)
      +(\(5\) choices).  
      +For \(G\) to be the maximal element of \(S\), none of the other letters
      +\(8,9,10,11,12\) may belong to \(S\).  Hence  
      +
      +\[
      +S=\{7\}\cup T,\qquad T\subset\{1,2,3,4,5,6\},\ |T|=5.
      +\]
      +
      +Choose the omitted small letter \(r\in\{1,\dots ,6\}\); then
      +\(T=\{1,\dots ,6\}\setminus\{r\}\) ( \(6\) choices).
      +
      +For a fixed \(j\) and \(r\) we must match the five small letters
      +\(T\) with the five large letters \(\{r\}\cup\{8,9,10,11,12\}\setminus\{j\}\)
      +so that each small letter is paired with a larger one.  
      +The four large letters \(\{8,9,10,11,12\}\setminus\{j\}\) can be paired
      +with any four of the small letters – that gives \(4!=24\) possibilities.
      +The remaining large letter \(r\) can only be paired with a small letter
      +that is smaller than \(r\); there are \(r-1\) such choices.
      +
      +Hence for this \(j,r\) we have \((r-1)\cdot4!\) matchings.
      +Summing over \(r\) gives  
      +
      +\[
      +\sum_{r=1}^{6}(r-1)\cdot24=15\cdot24=360
      +\]
      +
      +matchings for each of the five possible \(j\).  Thus
      +
      +\[
      +\text{Case 1 count}=5\cdot360=1800 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Total favourable matchings
      +
      +\[
      +N_{\text{fav}}=1800+120=1920 .
      +\]
      +
      +The total number of perfect matchings of 12 letters is  
      +
      +\[
      +N_{\text{tot}}=\frac{12!}{2^{6}\,6!}=10395 .
      +\]
      +
      +Therefore
      +
      +\[
      +P=\frac{1920}{10395}= \frac{128}{693}\qquad(\gcd(128,693)=1).
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Answer
      +
      +\[
      +\boxed{m+n=128+693=821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: None

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The inequalities  
      +
      +\[
      +x-yz<y-zx<z-xy
      +\]
      +
      +are equivalent to  
      +
      +\[
      +(x-y)(1+z)<0,\qquad (y-z)(1+x)<0 .
      +\]
      +
      +---
      +
      +### 1.  Introduce convenient variables
      +
      +Let  
      +
      +\[
      +u=x-y,\qquad v=y-z .
      +\]
      +
      +On the plane \(x+y+z=75\) we can solve for \((x,y,z)\) in terms of \((u,v)\):
      +
      +\[
      +\begin{aligned}
      +x&=\frac{75+2u+v}{3},\\[2pt]
      +y&=\frac{75-u+v}{3},\\[2pt]
      +z&=\frac{75-u-2v}{3}.
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +1+z=\frac{78-u-2v}{3},\qquad 
      +1+x=\frac{78+2u+v}{3}.
      +\]
      +
      +The two inequalities become  
      +
      +\[
      +u\,(78-u-2v)<0,\qquad v\,(78+2u+v)<0 .
      +\tag{1}
      +\]
      +
      +---
      +
      +### 2.  Determine the regions in the \((u,v)\)-plane  
      +
      +From (1)
      +
      +\[
      +\begin{cases}
      +u(78-u-2v)<0,\\[2pt]
      +v(78+2u+v)<0,
      +\end{cases}
      +\]
      +
      +which splits the \((u,v)\)-plane into four sign cases.
      +
      +| case | signs of \(u,v\) | resulting linear conditions |
      +|------|------------------|----------------------------|
      +| \(u>0,\ v>0\) | empty (contradiction) |
      +| \(u>0,\ v<0\) | \(u+2v>78\) (unbounded) |
      +| \(u<0,\ v>0\) | \(u+2v<78,\;2u+v<-78\) (unbounded) |
      +| \(u<0,\ v<0\) | \(2u+v>-78\) (bounded) |
      +
      +Only the last case gives a bounded region.  
      +With \(u<0,\ v<0\) the condition \(u+2v<78\) is automatic, so the region is
      +
      +\[
      +\boxed{\;u<0,\;v<0,\;2u+v>-78\;}
      +\]
      +
      +which is the interior of the right‑triangle with vertices  
      +
      +\[
      +(0,0),\;(-39,0),\;(0,-78).
      +\]
      +
      +Its area in the \((u,v)\)-coordinates is
      +
      +\[
      +A_{uv}= \frac12\cdot39\cdot78 =1521 .
      +\]
      +
      +---
      +
      +### 3.  Convert to area on the plane \(x+y+z=75\)
      +
      +The linear map \((u,v)\mapsto (x,y,z)\) has Jacobian matrix  
      +
      +\[
      +\frac{\partial(x,y,z)}{\partial(u,v)}=
      +\begin{pmatrix}
      +\frac{2}{3}&\frac13\\[2pt]
      +-\frac13&\frac13\\[2pt]
      +-\frac13&-\frac23
      +\end{pmatrix}.
      +\]
      +
      +The area‑scale factor is the magnitude of the cross product of its column vectors:
      +
      +\[
      +\bigl\lVert( \tfrac23,-\tfrac13,-\tfrac13)\times
      +(\tfrac13,\tfrac13,-\tfrac23)\bigr\rVert
      += \frac1{\sqrt3}.
      +\]
      +
      +Hence the area of the finite region on the given plane is  
      +
      +\[
      +A =\frac1{\sqrt3}\,A_{uv}= \frac{1521}{\sqrt3}
      +      =\frac{1521\sqrt3}{3}= 507\sqrt3 .
      +\]
      +
      +---
      +
      +### 4.  Answer
      +
      +The area is \(507\sqrt3\), i.e. \(a=507\) and \(b=3\).  
      +Thus  
      +
      +\[
      +a+b = 507+3 = \boxed{510}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the points be placed on the \(x\)-axis.
      +
      +\[
      +A(0,0),\;B(b,0),\;C(c,0),\;D(d,0),\;E(e,0),\;F(f,0)
      +\]
      +
      +Set the successive segment lengths  
      +
      +\[
      +AB=x_1,\;BC=x_2,\;CD=x_3,\;DE=x_4,\;EF=x_5 .
      +\]
      +
      +From the given distances
      +
      +\[
      +\begin{aligned}
      +x_1+x_2 &= AC = 26,\\
      +x_2+x_3 &= BD = 22,\\
      +x_3+x_4 &= CE = 31,\\
      +x_4+x_5 &= DF = 33,\\
      +x_1+x_2+x_3+x_4+x_5 &= AF = 73 .
      +\end{aligned}
      +\]
      +
      +Solving,
      +\[
      +x_2=8,\qquad x_1=18,\qquad x_3=14,\qquad x_4=17,\qquad x_5=16 .
      +\]
      +
      +Hence  
      +
      +\[
      +\begin{aligned}
      +A&=(0,0),\\
      +B&=(18,0),\\
      +C&=(26,0),\\
      +D&=(40,0),\\
      +E&=(57,0),\\
      +F&=(73,0).
      +\end{aligned}
      +\]
      +
      +Let \(G=(x,y)\).  From the distances \(CG=40\) and \(DG=30\),
      +
      +\[
      +\begin{cases}
      +(x-26)^2+y^2=40^2=1600,\\[2pt]
      +(x-40)^2+y^2=30^2=900 .
      +\end{cases}
      +\]
      +
      +Subtracting the equations,
      +
      +\[
      +(x-26)^2-(x-40)^2=700\Longrightarrow 28x-924=700\Longrightarrow x=58.
      +\]
      +
      +Then  
      +
      +\[
      +(58-26)^2+y^2=1600\Longrightarrow 1024+y^2=1600\Longrightarrow y^2=576\Longrightarrow y=\pm24.
      +\]
      +
      +Thus \(G=(58,24)\) (the sign of \(y\) does not affect the area).
      +
      +The base \(BE\) lies on the \(x\)-axis:
      +
      +\[
      +BE = e-b = 57-18 = 39 .
      +\]
      +
      +The height from \(G\) to the line \(AB\!E\) is \(|y|=24\).
      +
      +Hence the area of \(\triangle BGE\) is
      +
      +\[
      +\frac12\cdot BE\cdot|y|
      +   =\frac12\cdot 39 \cdot 24
      +   =\frac12\cdot 936
      +   =468 .
      +\]
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The intersection points satisfy  
      +
      +\[
      +y=f(x),\qquad x=34y^{2}\Longrightarrow y=f(34y^{2}).
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  The periodic function \(f\)
      +
      +Because \(f(x+4)=f(x)\),
      +
      +\[
      +f(x)=\begin{cases}
      +x-4k ,&x\in[-1+4k,\,1+4k)\\[2mm]
      +2+4k-x ,&x\in[1+4k,\,3+4k)
      +\end{cases}\qquad(k\in\mathbb Z).
      +\]
      +
      +For an intersection we have \(x=34y^{2}\ge 0\) and \(|y|\le 1\) (the range of \(f\)).
      +Hence we only need the periods that intersect the interval \([0,34]\):
      +\[
      +k=0,1,\dots ,8 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Equations for the two sub‑intervals
      +
      +*If \(34y^{2}\in[-1+4k,\,1+4k)\) (the “increasing” part)*
      +\[
      +y = (34y^{2})-4k\;\Longrightarrow\;34y^{2}-y-4k=0 .
      +\tag{A}_{k}
      +\]
      +
      +*If \(34y^{2}\in[1+4k,\,3+4k)\) (the “decreasing” part)*
      +\[
      +y = 2+4k-(34y^{2})\;\Longrightarrow\;34y^{2}+y-(4k+2)=0 .
      +\tag{B}_{k}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Roots
      +
      +\[
      +\begin{aligned}
      +(A)_{k}&:\quad y=\frac{1\pm\sqrt{1+544k}}{68},\\[2mm]
      +(B)_{k}&:\quad y=\frac{-1\pm\sqrt{273+544k}}{68}.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Which roots are admissible?
      +
      +Because \(|y|\le 1\),
      +
      +* For \(k=0,\dots ,8\) the two roots of \((A)_{k}\) satisfy \(|y|<1\);
      +  thus all \(2\cdot9=18\) of them are valid.
      +
      +* For \((B)_{k}\) the two roots lie in \((-1,1)\) when \(k=0,\dots ,7\).
      +  When \(k=8\) the negative root equals \(\displaystyle 
      +  \frac{-1-\sqrt{4625}}{68}\approx-1.0148\), which is outside the
      +  interval \([-1,1]\); the positive root is still admissible.
      +  Hence we have \(2\cdot8+1=17\) valid roots from the \((B)\) equations.
      +
      +Consequently there are \(18+17=35\) intersection points.
      +
      +--------------------------------------------------------------------
      +### 5.  Summing the \(y\)-coordinates  
      +
      +From Viète’s formulas
      +
      +\[
      +\text{sum of the two roots of }(A)_{k}= \frac{1}{34},\qquad
      +\text{sum of the two roots of }(B)_{k}= -\frac{1}{34}.
      +\]
      +
      +Therefore
      +
      +\[
      +\sum_{k=0}^{8}\bigl(\text{both roots of }(A)_{k}\bigr)=9\cdot\frac1{34}=\frac{9}{34},
      +\]
      +\[
      +\sum_{k=0}^{8}\bigl(\text{both roots of }(B)_{k}\bigr)=-\frac{9}{34}.
      +\]
      +
      +In \((B)_{8}\) we must discard the negative root
      +\(\displaystyle y_{8}^{-}=\frac{-1-\sqrt{4625}}{68}\).
      +Hence the sum of the **valid** \((B)\)‑roots is
      +
      +\[
      +-\frac{9}{34}-y_{8}^{-}.
      +\]
      +
      +Adding the contributions of \((A)\) and \((B)\),
      +
      +\[
      +\begin{aligned}
      +\sum y
      +&= \frac{9}{34}+\Bigl(-\frac{9}{34}-y_{8}^{-}\Bigr)
      +   =-y_{8}^{-}
      +   =\frac{1+\sqrt{4625}}{68}.
      +\end{aligned}
      +\]
      +
      +Since \(\sqrt{4625}=5\sqrt{185}\),
      +
      +\[
      +\sum y=\frac{1+5\sqrt{185}}{68}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 6.  Final answer
      +
      +The required representation is \(\displaystyle\frac{a+b\sqrt{c}}{d}\) with  
      +
      +\[
      +a=1,\; b=5,\; c=185,\; d=68,
      +\]
      +
      +and \(\gcd(a,b,d)=1\), \(c\) square‑free.
      +
      +\[
      +a+b+c+d = 1+5+185+68 = 259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +d=n+2 \qquad (d\ge 3,\; n>0)
      +\]
      +
      +The condition is  
      +
      +\[
      +d \mid 3(n+3)(n^2+9).
      +\]
      +
      +Since \(n\equiv -2 \pmod d\),
      +
      +\[
      +n+3\equiv (-2)+3 \equiv 1 \pmod d,\qquad 
      +n^2+9\equiv (-2)^2+9 \equiv 4+9\equiv 13 \pmod d.
      +\]
      +
      +Hence
      +
      +\[
      +3(n+3)(n^2+9)\equiv 3\cdot1\cdot13=39 \pmod d .
      +\]
      +
      +Thus \(d\) must divide 39:
      +
      +\[
      +d\mid 39 .
      +\]
      +
      +The positive divisors of \(39\) are \(1,3,13,39\).  
      +Because \(d=n+2\ge 3\), we have  
      +
      +\[
      +d\in\{3,13,39\}.
      +\]
      +
      +Corresponding \(n\) values are  
      +
      +\[
      +n=d-2\in\{1,11,37\}.
      +\]
      +
      +All three satisfy the original divisibility, so the required sum is  
      +
      +\[
      +1+11+37=49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +P=\prod_{k=4}^{63}\frac{\log_k(5^{k^{2}-1})}{\log_{k+1}(5^{k^{2}-4})}
      +\]
      +
      +---
      +
      +### 1.  Rewrite each factor
      +
      +\[
      +\log_k(5^{p})=\frac{\log_{5}(5^{p})}{\log_{5}k}= \frac{p}{\log_{5}k}.
      +\]
      +
      +Hence
      +
      +\[
      +\frac{\log_k(5^{k^{2}-1})}{\log_{k+1}(5^{k^{2}-4})}
      +   =\frac{\dfrac{k^{2}-1}{\log_{5}k}}{\dfrac{k^{2}-4}{\log_{5}(k+1)}}
      +   =\frac{k^{2}-1}{k^{2}-4}\cdot\frac{\log_{5}(k+1)}{\log_{5}k}.
      +\]
      +
      +Factor the rational part:
      +
      +\[
      +\frac{k^{2}-1}{k^{2}-4}= \frac{(k-1)(k+1)}{(k-2)(k+2)} .
      +\]
      +
      +Thus
      +
      +\[
      +P=\prod_{k=4}^{63}
      +   \left[\frac{(k-1)(k+1)}{(k-2)(k+2)}
      +         \cdot\frac{\log_{5}(k+1)}{\log_{5}k}\right].
      +\]
      +
      +---
      +
      +### 2.  Telescope the rational part  
      +
      +Separate the product:
      +
      +\[
      +\prod_{k=4}^{63}\frac{k-1}{k-2}\; \times\;
      +\prod_{k=4}^{63}\frac{k+1}{k+2}.
      +\]
      +
      +\[
      +\begin{aligned}
      +\prod_{k=4}^{63}\frac{k-1}{k-2}
      +   &=\frac{3}{2}\cdot\frac{4}{3}\cdot\frac{5}{4}\cdots\frac{62}{61}
      +    =\frac{62}{2}=31,\\[4pt]
      +\prod_{k=4}^{63}\frac{k+1}{k+2}
      +   &=\frac{5}{6}\cdot\frac{6}{7}\cdot\frac{7}{8}\cdots\frac{64}{65}
      +    =\frac{5}{65}=\frac{1}{13}.
      +\end{aligned}
      +\]
      +
      +Hence the rational part equals  
      +
      +\[
      +\frac{31}{13}.
      +\]
      +
      +---
      +
      +### 3.  Telescope the logarithmic part  
      +
      +\[
      +\prod_{k=4}^{63}\frac{\log_{5}(k+1)}{\log_{5}k}
      +   =\frac{\log_{5}5}{\log_{5}4}\cdot\frac{\log_{5}6}{\log_{5}5}
      +    \cdots\frac{\log_{5}64}{\log_{5}63}
      +   =\frac{\log_{5}64}{\log_{5}4}
      +   =\log_{4}64.
      +\]
      +
      +Since \(64=4^{3}\), \(\log_{4}64=3\).
      +
      +Thus the logarithmic part contributes a factor of \(3\).
      +
      +---
      +
      +### 4.  Combine
      +
      +\[
      +P=\frac{31}{13}\times 3=\frac{93}{13}.
      +\]
      +
      +The fraction \(\frac{93}{13}\) is already in lowest terms, so  
      +
      +\[
      +m=93,\qquad n=13.
      +\]
      +
      +Finally,
      +
      +\[
      +m+n=93+13=106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Sketch**
      +
      +Let  
      +
      +\[
      +a=3^{\alpha }u ,\qquad b=3^{\beta }v ,\qquad c=3^{\gamma }w ,
      +\qquad(\alpha ,\beta ,\gamma \ge 0,\;3\nmid u,v,w)
      +\]
      +
      +and put \(\kappa =\min (\alpha ,\beta ,\gamma )\).
      +Writing \(a^{3}=3^{3\alpha }u^{3}\) etc.,  
      +
      +\[
      +a^{3}+b^{3}+c^{3}\equiv 0\pmod{3^{7}}
      +\Longleftrightarrow
      +u^{3}3^{3(\alpha-\kappa)}+v^{3}3^{3(\beta-\kappa)}+w^{3}3^{3(\gamma-\kappa)}
      +\equiv0\pmod{3^{7-3\kappa}} .
      +\tag{1}
      +\]
      +
      +Thus we have three essentially different cases:
      +
      +* \(\kappa\ge 3\) : every term in (1) is divisible by \(3^{9}\), hence the
      +  congruence is always true.
      +
      +* \(\kappa =2\) : all three numbers are divisible by \(9\) and at least one
      +  is not divisible by \(27\).  
      +  Put \(a=9A,\;b=9B,\;c=9C\;(1\le A,B,C\le81)\).   
      +  Then (1) reduces to  
      +
      +  \[
      +  A+B+C\equiv0\pmod3 .
      +  \]
      +
      +  The numbers \(A,B,C\) are taken from the set \(\{1,\dots ,81\}\); each
      +  residue class \(\pmod3\) occurs exactly \(27\) times.  
      +  Hence the number of ordered triples with \(\kappa =2\) is  
      +
      +  \[
      +  9\cdot 27^{3}=157\,464 .
      +  \tag{2}
      +  \]
      +
      +* \(\kappa =1\) : all three numbers are divisible by \(3\) and at least one
      +  is not divisible by \(9\).  Write \(a=3A,\;b=3B,\;c=3C\;(1\le A,B,C\le243)\).  
      +  Then (1) becomes  
      +
      +  \[
      +  A^{3}+B^{3}+C^{3}\equiv0\pmod{3^{4}} .
      +  \tag{3}
      +  \]
      +
      +  The cubes \(\pmod {81}\) of the integers \(1\le x\le243\) are distributed as  
      +
      +  \[
      +  \begin{array}{c|c}
      +  \text{value}&\text{how many $x$ give it}\\ \hline
      +  0 & 27\\
      +  27,\,54 & 27\text{ each}\\
      +  \text{18 other residues} & 9\text{ each}
      +  \end{array}
      +  \]
      +
      +  Using this distribution one counts (by a short elementary
      +  combinatorial argument) the number of ordered triples satisfying (3) to be  
      +
      +  \[
      +  452\,709 .
      +  \tag{4}
      +  \]
      +
      +  The triples counted in (4) include those where all three numbers are
      +  divisible by \(9\); those are exactly the triples of the previous case,
      +  i.e. the $157\,464$ triples of (2).  Hence the triples with
      +  \(\kappa =1\) contribute  
      +
      +  \[
      +  452\,709-157\,464 = 295\,245 .
      +  \tag{5}
      +  \]
      +
      +* \(\kappa =0\) : at least one of the numbers is not divisible by \(3\).
      +  The total number of ordered triples with $1\le a,b,c\le3^{6}=729$ is
      +  $729^{3}=387\,420\,489$.
      +  Subtracting the contributions of the three previous cases gives
      +
      +  \[
      +  387\,420\,489-19\,683-157\,464-295\,245 = 702\,027 .
      +  \tag{6}
      +  \]
      +
      +Finally we take the answer modulo $1000$ :
      +
      +\[
      +702\,027\equiv\boxed{27}\pmod{1000}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 27

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(O\) be the center of \(\omega _2\) (radius \(15\)),  
      +* \(A\) be the center of \(\omega _1\) (radius \(6\)),  
      +* \(B\) the internal point of tangency of the two circles.
      +
      +---
      +
      +### 1.  Coordinates
      +
      +Place \(O\) at the origin and the line \(BC\) on the \(x\)-axis.
      +
      +\[
      +B=(15,0),\qquad O=(0,0),\qquad A=(9,0)
      +\]
      +
      +Because \(BC\) is a diameter of \(\omega _2\),
      +
      +\[
      +C=(-15,0).
      +\]
      +
      +\(AD\perp BC\) makes \(AD\) vertical, so \(D\) lies on the line \(x=9\) and on \(\omega_2\):
      +
      +\[
      +9^{2}+y^{2}=15^{2}\Longrightarrow y^{2}=144\Longrightarrow y=\pm12 .
      +\]
      +
      +Since later we need \(D\) to be nearer to the lower side of the rectangle, we take  
      +
      +\[
      +D=(9,-12).
      +\]
      +
      +---
      +
      +### 2.  Rectangle \(EFGH\) inside \(\omega _1\)
      +
      +The rectangle is axis‑aligned because \(EF\perp BC\) (so \(EF\) is vertical) and a rectangle has right angles.
      +
      +Let the half‑width be \(a\) and the half‑height be \(y\) :
      +
      +\[
      +\begin{aligned}
      +E&\;(9+a,\;y),&F&\;(9+a,\;-y),\\
      +G&\;(9-a,\;-y),&H&\;(9-a,\;y).
      +\end{aligned}
      +\]
      +
      +All four vertices lie on \(\omega _1\), whose equation is  
      +
      +\[
      +(x-9)^2+y^2=6^{2}=36 .
      +\]
      +
      +Hence  
      +
      +\[
      +a^{2}+y^{2}=36\quad\Longrightarrow\quad y=\sqrt{36-a^{2}}\;(>0).
      +\]
      +
      +The rectangle’s area is  
      +
      +\[
      +[EFGH]= (2a)(2y)=4ay .
      +\tag{1}
      +\]
      +
      +---
      +
      +### 3.  Areas of \(\triangle DGF\) and \(\triangle CHG\)
      +
      +\[
      +\begin{aligned}
      +\triangle DGF &: \text{base }GF=2a,\; 
      +\text{height }=12-y,\\
      +[ DGF]&=\tfrac12\,(2a)(12-y)=a(12-y). \tag{2}
      +\end{aligned}
      +\]
      +
      +\[
      +\begin{aligned}
      +\triangle CHG &: \text{base }HG=2y,\;
      +\text{horizontal distance from }C\text{ to line }x=9-a\text{ is }24-a,\\
      +[CHG]&=\tfrac12\,(2y)(24-a)=y(24-a). \tag{3}
      +\end{aligned}
      +\]
      +
      +Given \([DGF]=[CHG]\),
      +
      +\[
      +a(12-y)=y(24-a).
      +\]
      +
      +Expanding and canceling the common term \(-ay\) gives
      +
      +\[
      +12a=24y\quad\Longrightarrow\quad a=2y. \tag{4}
      +\]
      +
      +---
      +
      +### 4.  Solving for \(a\) and \(y\)
      +
      +From (4) and the circle condition \(a^{2}+y^{2}=36\),
      +
      +\[
      +(2y)^{2}+y^{2}=36\Longrightarrow 5y^{2}=36
      +\Longrightarrow y^{2}=\frac{36}{5}
      +\Longrightarrow y=\frac{6}{\sqrt5}=\frac{6\sqrt5}{5}.
      +\]
      +
      +Thus  
      +
      +\[
      +a=2y= \frac{12}{\sqrt5}= \frac{12\sqrt5}{5}.
      +\]
      +
      +Both satisfy \(a\le6,\;y\le6\), so the rectangle indeed fits in \(\omega _1\).
      +
      +---
      +
      +### 5.  Area of the rectangle
      +
      +Insert \(a=2y\) into (1):
      +
      +\[
      +[EFGH]=4a y =4(2y)\,y = 8y^{2}=8\left(\frac{36}{5}\right)=\frac{288}{5}.
      +\]
      +
      +Hence the rectangle’s area is \(\displaystyle \frac{288}{5}\).
      +
      +The fraction is already in lowest terms, so  
      +
      +\[
      +m=288,\qquad n=5,\qquad m+n=288+5=293.
      +\]
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the 9 vertices of the \(2\times2\) grid be the points \((i,j)\) with \(i,j=0,1,2\).
      +The 12 unit edges are  
      +
      +* 8 **boundary** edges (two on each side of the large square);
      +* 4 **interior** edges, which are shared by two unit squares.
      +
      +Denote the four interior edges by  
      +
      +\[
      +a=v_{10},\qquad b=v_{11},\qquad c=h_{01},\qquad d=h_{11},
      +\]
      +
      +where each variable is \(1\) if the edge is coloured red and \(0\) if it is blue.
      +
      +---
      +
      +### 1.  How the interior edges affect a square  
      +
      +Each small square has two interior edges and two boundary edges.
      +
      +\[
      +\begin{array}{c|c}
      +\text{square}&\text{interior edges}\\\hline
      +\text{BL}& a,\;c\\
      +\text{BR}& b,\;c\\
      +\text{TL}& a,\;d\\
      +\text{TR}& b,\;d
      +\end{array}
      +\]
      +
      +Let \(r\) be the number of red interior edges of a given square.
      +Since the square must have exactly two red sides, it needs  
      +\(2-r\) red boundary edges.
      +
      +For a square:
      +
      +* if \(r=0\) or \(r=2\) the two boundary edges are forced (both red or both blue) – **1** way;
      +* if \(r=1\) exactly one of the two boundary edges must be red – **2** ways.
      +
      +Thus a given interior‑edge configuration contributes a factor  
      +
      +\[
      +2^{\#\{\text{squares with }r=1\}} .
      +\]
      +
      +Denote by  
      +
      +\[
      +N(a,b,c,d)=\mathbf 1_{a\neq c}+\mathbf 1_{a\neq d}+\mathbf 1_{b\neq c}+\mathbf 1_{b\neq d},
      +\]
      +
      +the number of squares for which exactly one of the two interior edges is red.
      +Then the total number of colourings is
      +
      +\[
      +\sum_{a,b,c,d\in\{0,1\}} 2^{\,N(a,b,c,d)} .
      +\]
      +
      +---
      +
      +### 2.  Evaluating the sum  
      +
      +The value of \(N\) depends only on how the pairs \((a,b)\) and \((c,d)\) compare.
      +
      +* **Case 1:** \((a,b)=(c,d)\).  
      +  Then \(N=0\). This occurs for \((0,0,0,0)\) and \((1,1,1,1)\) – 2 assignments.
      +  Contribution: \(2\cdot 2^{0}=2\).
      +
      +* **Case 2:** \((a,b)=(c,d)\) with opposite colour, i.e. \(a=b\neq c=d\).  
      +  Then each of the four comparisons differs, so \(N=4\).  
      +  This happens for \((0,0,1,1)\) and \((1,1,0,0)\) – 2 assignments.
      +  Contribution: \(2\cdot 2^{4}=2\cdot16=32\).
      +
      +* **Case 3:** All other assignments.  
      +  There are \(16-4=12\) such configurations and one checks that each yields \(N=2\).  
      +  Contribution: \(12\cdot 2^{2}=12\cdot4=48\).
      +
      +Adding the three cases,
      +
      +\[
      +2+32+48=82 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{82}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The divisors of  
      +
      +\[
      +2025 = 3^{4}\cdot 5^{2}
      +\]
      +
      +are of the form \(3^{a}5^{b}\) with  
      +
      +\[
      +0\le a\le 4 ,\qquad 0\le b\le 2 .
      +\]
      +
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15,\qquad\text{so there are }2^{15}=32768\text{ subsets of }A.
      +\]
      +
      +For a subset \(B\subseteq A\) the least common multiple is  
      +
      +\[
      +\operatorname{lcm}(B)=3^{\max a}\,5^{\max b},
      +\]
      +
      +where \(\max a\) (resp. \(\max b\)) is the largest exponent of \(3\) (resp. \(5\)) among the elements of \(B\).
      +
      +Thus \(\operatorname{lcm}(B)=2025\) iff  
      +
      +* some element of \(B\) has \(a=4\) (i.e. belongs to the set \(R\) of divisors with a factor \(3^{4}\));
      +* some element of \(B\) has \(b=2\) (i.e. belongs to the set \(C\) of divisors with a factor \(5^{2}\)).
      +
      +The set \(R\) consists of the three divisors \(3^{4}5^{0}, 3^{4}5^{1}, 3^{4}5^{2}\);
      +the set \(C\) consists of the five divisors \(3^{0}5^{2}, 3^{1}5^{2}, 3^{2}5^{2}, 3^{3}5^{2}, 3^{4}5^{2}\).
      +Their intersection is \(\{2025\}\).  
      +
      +We need the number of subsets of \(A\) that contain **at least one** element of \(R\) and **at least one** element of \(C\).
      +
      +Using inclusion–exclusion on the whole set of subsets:
      +
      +\[
      +\begin{aligned}
      +N &= 2^{15}
      +      -\underbrace{2^{15-|R|}}_{\text{subsets with no }R}
      +      -\underbrace{2^{15-|C|}}_{\text{subsets with no }C}
      +      +\underbrace{2^{15-|R\cup C|}}_{\text{subsets with neither}}  \\
      +  &= 2^{15} -2^{12} -2^{10} + 2^{8} \\
      +  &= 32768 - 4096 - 1024 + 256 = 27904 .
      +\end{aligned}
      +\]
      +
      +All these subsets are non‑empty (they contain at least one element from \(R\) and one from \(C\)).  
      +
      +Hence  
      +
      +\[
      +\Pr(\text{nonempty }B\text{ with }\operatorname{lcm}=2025)
      +   = \frac{27904}{2^{15}}
      +   = \frac{27904}{32768}
      +   = \frac{109}{128}\;.
      +\]
      +
      +So \(m=109\) and \(n=128\); therefore  
      +
      +\[
      +m+n = 109+128 = 237 .
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For \( \triangle ABC\) let  
      +
      +\[
      +\angle A=84^{\circ},\qquad \angle B=60^{\circ},\qquad \angle C=36^{\circ}.
      +\]
      +
      +---
      +
      +### 1.  Identify the points on the nine‑point circle  
      +
      +\(D,E,F\) are the midpoints of \(BC,CA,AB\); hence the circumcircle of \(\triangle DEF\) is the nine‑point circle of \(\triangle ABC\).
      +
      +The nine‑point circle also passes through the feet of the three altitudes.
      +Thus  
      +
      +* \(G\) is the foot of the altitude from \(A\) onto \(BC\);  
      +* \(H\) is the foot of the altitude from \(B\) onto \(CA\);  
      +* \(J\) is the foot of the altitude from \(C\) onto \(AB\).
      +
      +So the six points on the nine‑point circle are, in order,
      +\(G,\;D,\;E,\;H,\;J,\;F\).
      +
      +---
      +
      +### 2.  Arc \(\widehat{DE}\)
      +
      +In \(\triangle DEF\) we have the well‑known midpoint–parallel relations  
      +
      +\[
      +DF\parallel AC,\qquad EF\parallel BC .
      +\]
      +
      +Hence at \(F\)
      +
      +\[
      +\angle DFE=\angle(DF,EF)=\angle(AC,BC)=\angle C=36^{\circ}.
      +\]
      +
      +For a chord, the intercepted minor arc equals twice the inscribed angle, so  
      +
      +\[
      +\widehat{DE}=2\angle DFE=2\cdot36^{\circ}=72^{\circ}.
      +\]
      +
      +---
      +
      +### 3.  Arc \(\widehat{FG}\)
      +
      +\(DG\) lies on side \(BC\); thus \(DG\parallel BC\).
      +Since \(DF\parallel AC\),
      +
      +\[
      +\angle FDG=\angle(DF,DG)=\angle(AC,BC)=\angle C=36^{\circ}.
      +\]
      +
      +Therefore  
      +
      +\[
      +\widehat{FG}=2\angle FDG=2\cdot36^{\circ}=72^{\circ}.
      +\]
      +
      +---
      +
      +### 4.  Arc \(\widehat{HJ}\)
      +
      +\(G,\;H,\;J\) are the vertices of the orthic triangle.
      +For an acute triangle, the orthic triangle angles satisfy  
      +
      +\[
      +\angle H G J =180^{\circ}-2\angle A .
      +\]
      +
      +Here \(\angle A=84^{\circ}\), so  
      +
      +\[
      +\angle H G J =180^{\circ}-2\cdot84^{\circ}=12^{\circ}.
      +\]
      +
      +The inscribed angle \(\angle H G J\) intercepts the minor arc \(\widehat{HJ}\); consequently  
      +
      +\[
      +\widehat{HJ}=2\angle H G J =2\cdot12^{\circ}=24^{\circ}.
      +\]
      +
      +---
      +
      +### 5.  Compute the required combination  
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +&=72^{\circ}+2\cdot24^{\circ}+3\cdot72^{\circ} \\
      +&=72^{\circ}+48^{\circ}+216^{\circ} \\
      +&=336^{\circ}.
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +g(N)=\Big\lfloor\frac{N}{25}\Big\rfloor+
      +\Big\lfloor\frac{N\bmod 25}{10}\Big\rfloor+(N\bmod 25)\bmod10
      +\]
      +
      +be the number of coins the greedy algorithm uses for \(N\) cents.
      +For an optimal solution we may use fewer quarters.  
      +Write  
      +
      +\[
      +N=25q+a,\qquad 0\le a<25 .
      +\]
      +
      +If we replace \(k\;(1\le k\le q)\) quarters by dimes and pennies, the new
      +total number of coins is  
      +
      +\[
      +c_k=(q-k)+\Big\lfloor\frac{a+25k}{10}\Big\rfloor+(a+25k)\bmod10 .
      +\]
      +
      +Using \(a+25k=10(2k)+ (a+5k)\),
      +
      +\[
      +c_k=q+a+24k-9\Big\lfloor\frac{a+5k}{10}\Big\rfloor .
      +\]
      +
      +The greedy number is  
      +
      +\[
      +g(N)=q+a-9\Big\lfloor\frac a{10}\Big\rfloor .
      +\]
      +
      +Hence  
      +
      +\[
      +c_k-g(N)=24k-9\Big(\Big\lfloor\frac{a+5k}{10}\Big\rfloor-
      +\Big\lfloor\frac a{10}\Big\rfloor\Big)
      +        =24k-9\,\Big\lfloor\frac{5k+r}{10}\Big\rfloor ,
      +\]
      +where \(r=a\bmod10\) (so \(0\le r\le 9\)).
      +
      +The greedy algorithm fails iff there exists a \(k\ge1\) with \(c_k<g(N)\),
      +i.e.
      +
      +\[
      +24k<9\Big\lfloor\frac{5k+r}{10}\Big\rfloor
      +\iff 
      +\Big\lfloor\frac{5k+r}{10}\Big\rfloor>\frac{2k}{3}.
      +\]
      +
      +For \(k\ge2\) the left‑hand side grows like \(0.5k\) while the right
      +hand side grows like \(0.666\!k\); the inequality never holds.
      +For \(k=1\) the condition becomes  
      +
      +\[
      +\Big\lfloor\frac{5+r}{10}\Big\rfloor\ge1\iff r\ge5 .
      +\]
      +
      +Thus **greedy fails exactly when**  
      +
      +* \(N\ge25\) (so at least one quarter is used), and  
      +* \(a\bmod10\ge5\), i.e. the remainder \(a=N\bmod25\) lies in  
      +
      +\[
      +\{5,6,7,8,9,15,16,17,18,19\}.
      +\]
      +
      +---
      +
      +### Counting the failures
      +
      +For each of the 10 bad remainders \(a\) the numbers
      +\(N=a+25k\) with \(k\ge1\) and \(N\le1000\) are failures.
      +Since \(1000- a<1000\) we have  
      +
      +\[
      +\Big\lfloor\frac{1000-a}{25}\Big\rfloor = 39\quad (a\ge1).
      +\]
      +
      +Hence each bad remainder contributes 39 failing values, giving  
      +
      +\[
      +10\times39 = 390
      +\]
      +
      +failing numbers.
      +
      +---
      +
      +### Total successes
      +
      +There are \(1000\) integers from 1 to 1000, therefore
      +
      +\[
      +\text{successful }N = 1000-390 = 610 .
      +\]
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the vertices of the regular \(24\)-gon be numbered \(0,1,\dots ,23\) clockwise.  
      +If a segment joins vertex \(i\) with vertex \(j\) then the (shorter) distance
      +\(\min\{\,|i-j|,24-|i-j|\,\}\) is a number \(k\) with  
      +
      +\[
      +1\le k\le 12 .
      +\]
      +
      +All 12 segments must have the same length, so they must all have the same
      +step‑size \(k\).  
      +For a fixed \(k\) consider the graph \(G_k\) whose edges are exactly the
      +\(24\) chords \(\{i,i+k\}\;(i=0,\dots ,23)\) (the pair \(\{i,i+k\}\) is the same
      +as \(\{i+k,i\}\)).  
      +
      +--------------------------------------------------------------------
      +### 1.  Structure of \(G_k\)
      +
      +Let  
      +
      +\[
      +d=\gcd(24,k),\qquad L=\frac{24}{d}.
      +\]
      +
      +Starting from a vertex \(i\) and repeatedly adding \(k\) modulo \(24\) we obtain
      +the cycle  
      +
      +\[
      +i,\; i+k,\; i+2k,\dots ,i+(L-1)k .
      +\]
      +
      +Thus \(G_k\) splits into \(d\) disjoint cycles, each of length \(L\).
      +
      +- If \(k\neq 12\) then \(i+k\neq i-k\) and each vertex has degree \(2\); the
      +components are simple cycles.
      +- For \(k=12\) each vertex is paired only with its opposite vertex, so the
      +components are single edges (a perfect matching already).
      +
      +--------------------------------------------------------------------
      +### 2.  When does a perfect matching exist?
      +
      +A perfect matching on a cycle exists only when the cycle length is even.
      +Hence we need \(L\) even, i.e.  
      +
      +\[
      +\frac{24}{d}\text{ is even}\iff d\mid 12 .
      +\]
      +
      +Therefore a perfect matching is possible for all \(k\) whose
      +\(\gcd(24,k)\) belongs to \(\{1,2,3,4,6,12\}\).  
      +The only value of \(k\) with \(\gcd(24,k)=8\) is \(k=8\); for this step size
      +\(L=3\) (odd) and no perfect matching exists.
      +
      +--------------------------------------------------------------------
      +### 3.  Number of perfect matchings for a given \(k\)
      +
      +- **Case \(k\neq 12\).**  
      +  The graph consists of \(d\) even cycles of length \(L\).  
      +  Each even cycle has exactly two perfect matchings (choose the “odd” or the
      +  “even” edges).  
      +  Hence the number of perfect matchings using step size \(k\) is  
      +
      +  \[
      +  N(k)=2^{d}=2^{\gcd(24,k)} .
      +  \]
      +
      +- **Case \(k=12\).**  
      +  The edges are the 12 diameters \(\{i,i+12\}\).  
      +  This already is a unique perfect matching, so \(N(12)=1\).
      +
      +--------------------------------------------------------------------
      +### 4.  Summation over all possible step sizes
      +
      +The admissible step sizes are  
      +
      +\[
      +k=1,2,3,4,5,6,7,9,10,11,12  \qquad(k=8\text{ is excluded}).
      +\]
      +
      +Their contributions are:
      +
      +\[
      +\begin{array}{c|c|c}
      +k & \gcd(24,k) & N(k)\\ \hline
      +1 & 1 & 2\\
      +2 & 2 & 4\\
      +3 & 3 & 8\\
      +4 & 4 & 16\\
      +5 & 1 & 2\\
      +6 & 6 & 64\\
      +7 & 1 & 2\\
      +9 & 3 & 8\\
      +10& 2 & 4\\
      +11& 1 & 2\\
      +12&12 & 1
      +\end{array}
      +\]
      +
      +Adding them:
      +
      +\[
      +2+4+8+16+2+64+2+8+4+2+1 = 113 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Answer
      +
      +Thus there are  
      +
      +\[
      +\boxed{113}
      +\]
      +
      +different ways to draw 12 equal‑length segments so that each of the 24
      +vertices is an endpoint of exactly one segment.
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +r_i=A_1A_i\qquad(2\le i\le 11),\qquad 
      +\theta=\angle A_iA_1A_{i+1}\;(2\le i\le 10).
      +\]
      +
      +---
      +
      +### 1.  Data from the triangles  
      +
      +\[
      +\cos\theta=\frac{12}{13},\qquad 
      +\sin\theta=\sqrt{1-\left(\frac{12}{13}\right)^2}= \frac{5}{13}.
      +\]
      +
      +The area of \(\triangle A_iA_1A_{i+1}\) is  
      +
      +\[
      +\frac12 r_i r_{i+1}\sin\theta =1
      +\Longrightarrow r_i r_{i+1}= \frac{2}{\sin\theta}
      +               = \frac{2}{5/13}= \frac{26}{5}\; .
      +\tag{1}
      +\]
      +
      +Hence for all \(i=2,\dots ,10\)
      +
      +\[
      +r_i r_{i+1}=K,\qquad K:=\frac{26}{5}.   \tag{2}
      +\]
      +
      +From (2) we obtain the recurrence  
      +
      +\[
      +r_{i+1}= \frac K{r_i},\qquad\text{so } r_{i+2}=r_i .
      +\]
      +
      +Thus the distances from \(A_1\) alternate:
      +
      +\[
      +r_2=r_4=r_6=r_8=r_{10}=x,\qquad 
      +r_3=r_5=r_7=r_9=r_{11}=y,
      +\]
      +where  
      +
      +\[
      +xy=K=\frac{26}{5}.  \tag{3}
      +\]
      +
      +---
      +
      +### 2.  Length of the other edges  
      +
      +For any \(i=2,\dots ,10\) the edge \(A_iA_{i+1}\) has length (law of cosines)
      +
      +\[
      +\begin{aligned}
      +d &:=A_iA_{i+1}= 
      +\sqrt{r_i^{\,2}+r_{i+1}^{\,2}-2r_i r_{i+1}\cos\theta}  \\
      +   &=\sqrt{x^{2}+y^{2}-2xy\frac{12}{13}}
      +   =\sqrt{x^{2}+y^{2}-\frac{24}{13}K}.
      +\end{aligned}
      +\tag{4}
      +\]
      +
      +All nine edges \(A_iA_{i+1}\;(i=2\ldots10)\) have the same length \(d\).
      +
      +---
      +
      +### 3.  Perimeter condition  
      +
      +The perimeter of the 11‑gon is  
      +
      +\[
      +x+y+9d=20.   \tag{5}
      +\]
      +
      +Introduce  
      +
      +\[
      +t:=x+y\quad\text{(the quantity we need)},
      +\qquad xy=K .
      +\]
      +
      +From \(x^{2}+y^{2}=t^{2}-2K\) and (4),
      +
      +\[
      +d^{2}=t^{2}-2K-\frac{24}{13}K
      +     =t^{2}-\frac{50}{13}K .
      +\]
      +
      +Since \(\displaystyle \frac{50}{13}K
      +      =\frac{50}{13}\cdot\frac{26}{5}=20\),
      +
      +\[
      +d^{2}=t^{2}-20\qquad\Longrightarrow\qquad d=\sqrt{t^{2}-20}. \tag{6}
      +\]
      +
      +Insert (6) into (5):
      +
      +\[
      +t+9\sqrt{t^{2}-20}=20. \tag{7}
      +\]
      +
      +---
      +
      +### 4.  Solving for \(t\)
      +
      +From (7),
      +
      +\[
      +\sqrt{t^{2}-20}= \frac{20-t}{9}\quad (20-t\ge 0).
      +\]
      +
      +Squaring gives  
      +
      +\[
      +t^{2}-20=\frac{(20-t)^{2}}{81}
      +\Longrightarrow 80t^{2}+40t-2020=0.
      +\]
      +
      +Dividing by 20,
      +
      +\[
      +4t^{2}+2t-101=0.
      +\]
      +
      +Hence  
      +
      +\[
      +t=\frac{-2\pm\sqrt{4+1616}}{8}
      +   =\frac{-2\pm18\sqrt5}{8}.
      +\]
      +
      +Only the positive root is admissible:
      +
      +\[
      +t=\frac{18\sqrt5-2}{8}
      +  =\frac{9\sqrt5-1}{4}.
      +\]
      +
      +Thus  
      +
      +\[
      +A_1A_2+A_1A_{11}=t=\frac{9\sqrt5-1}{4}
      +     =\frac{m\sqrt n-p}{q},
      +\]
      +
      +with \(m=9,\;n=5,\;p=1,\;q=4\).
      +
      +---
      +
      +### 5.  Required sum  
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **1.  Regions produced by line‑segments**
      +
      +If a set of line segments inside a disc has no three of them meeting at the same interior point, then  
      +
      +\[
      +\text{#regions}=1+\;(\text{#segments})+\;(\text{# interior intersection points}).
      +\]
      +
      +Hence for our problem  
      +
      +\[
      +R=1+27+I ,
      +\]
      +
      +where \(I\) is the (random) number of interior intersection points.  
      +We must compute the expected value \(E[I]\).
      +
      +--------------------------------------------------------------------
      +
      +**2.  The three kinds of interior intersections**
      +
      +* the two diameters intersect once (deterministically);
      +* a random chord can intersect each of the two diameters;
      +* two random chords can intersect one another.
      +
      +So  
      +
      +\[
      +E[I]=1+E[\text{chord–diameter intersections}]
      +      +E[\text{chord–chord intersections}].
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**3.  Probability that a random chord meets a given diameter**
      +
      +The two endpoints of a chord are chosen uniformly on the circle but must lie in *different* quadrants.
      +There are \(\binom{4}{2}=6\) unordered pairs of quadrants, all equally likely.
      +
      +A chord meets the horizontal diameter iff its endpoints lie in opposite
      +half‑planes (one in the upper half, one in the lower half).  
      +Among the six unordered pairs, the four pairs  
      +\(\{Q_1,Q_3\},\{Q_1,Q_4\},\{Q_2,Q_3\},\{Q_2,Q_4\}\) have this property, so
      +
      +\[
      +P(\text{chord meets a given diameter})=\frac{4}{6}= \frac23 .
      +\]
      +
      +The same holds for the vertical diameter.  
      +Thus a single random chord contributes on average
      +
      +\[
      +2\cdot\frac23=\frac43
      +\]
      +
      +intersections with the two diameters.  
      +
      +For the 25 chords
      +
      +\[
      +E[\text{chord–diameter intersections}]
      +      =25\cdot\frac43=\frac{100}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**4.  Distribution of a chord’s quadrant pair**
      +
      +Let a chord be called  
      +
      +* **adjacent** if it joins two adjacent quadrants (four such unordered pairs);
      +* **opposite** if it joins opposite quadrants (two such unordered pairs).
      +
      +\[
      +P(\text{adjacent})=\frac{4}{6}= \frac23,\qquad 
      +P(\text{opposite})=\frac{2}{6}= \frac13 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**5.  Probability that two random chords intersect**
      +
      +Pick two chords independently.  Let their unordered quadrant pairs be \(S\) and
      +\(T\).  There are three possibilities for the relationship between \(S\) and \(T\).
      +
      +| Relation of \(S,T\) | Probability | Intersection probability |
      +|----------------------|-------------|---------------------------|
      +| **identical** (\(S=T\)) | \(\displaystyle\frac16\) | \(\displaystyle\frac12\) |
      +| **share exactly one quadrant** | \(\displaystyle\frac{2}{3}\) | \(\displaystyle\frac12\) |
      +| **disjoint** (complementary sets) | \(\displaystyle\frac16\) | \(\displaystyle\frac13\) |
      +
      +*Proof of the numbers*  
      +
      +*Identical*: both chords lie in the same two intervals, say \([0,1)\) and \([1,2)\).  
      +If the endpoints are \(A\in[0,1),B\in[1,2)\) and \(C\in[0,1),D\in[1,2)\),
      +the chords intersect iff exactly one of \(C,D\) lies on the clockwise arc from
      +\(A\) to \(B\).  A short calculation gives probability \(1/2\).
      +
      +*Share one quadrant*: suppose the common quadrant is \([0,1)\) and the other
      +endpoints are in \([1,2)\) and \([2,3)\) (or \([3,4)\)).  The second endpoint
      +never lies on the clockwise arc from the first endpoint to its partner, so the
      +chords intersect iff the other point in the common quadrant lies on that arc,
      +which happens with probability \(1/2\).
      +
      +*Disjoint*: the only way for two disjoint pairs to intersect is when both are
      +opposite pairs (e.g. \(\{0,2\}\) and \(\{1,3\}\)); then the order of the four
      +points around the circle is forced to be alternating, so the chords always
      +intersect.  This occurs for one‑third of the disjoint cases, hence conditional
      +probability \(1/3\).
      +
      +Putting the three cases together,
      +
      +\[
      +P(\text{two chords intersect})=
      +\frac16\!\left(\frac12\right)+\frac23\!\left(\frac12\right)+\frac16\!\left(\frac13\right)
      +      =\frac{17}{36}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**6.  Expected chord–chord intersections**
      +
      +There are \(\binom{25}{2}=300\) unordered pairs of the 25 chords, so
      +
      +\[
      +E[\text{chord–chord intersections}]
      +      =300\cdot\frac{17}{36}= \frac{425}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**7.  Total expected interior intersections**
      +
      +\[
      +E[I]=1\;(\text{diameters})+\frac{100}{3}\;(\text{chord–diameter})
      +      +\frac{425}{3}\;(\text{chord–chord})
      +      =\frac{525}{3}+1 =176 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**8.  Expected number of regions**
      +
      +Finally
      +
      +\[
      +E[R]=1+(\text{#segments})+E[I]
      +     =1+27+176 = 204 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +f(x)=\sin\!\bigl(7\pi\sin 5x\bigr)
      +\qquad (0<x<2\pi)
      +\]
      +
      +---
      +
      +### 1.  Zeros of \(f\)
      +
      +\(f(x)=0\) when  
      +
      +\[
      +\sin\bigl(7\pi\sin 5x\bigr)=0
      +\Longrightarrow 7\pi\sin 5x=k\pi \;(k\in\mathbb Z)
      +\Longrightarrow \sin 5x=\frac{k}{7}.
      +\]
      +
      +Since \(|\sin5x|\le1\), we must have \(k=-7,-6,\ldots,6,7\) – 15 possible integers.
      +
      +Put \(y=5x\).  
      +Then \(y\in(0,10\pi)\) and we need the number of solutions of  
      +
      +\[
      +\sin y = \frac{k}{7}\qquad (k=-7,\dots ,7).
      +\]
      +
      +*For \(|k|<7,\;k\neq0\):* \(\frac{k}{7}\in(-1,1)\setminus\{0\}\).  
      +In each interval of length \(2\pi\) there are two solutions, and \((0,10\pi)\) contains exactly five such periods.  
      +Hence each of the 12 values \(k=\pm1,\pm2,\dots ,\pm6\) yields **10** solutions.
      +
      +*For \(k=0\):* \(\sin y=0\Rightarrow y=m\pi\).  
      +With \(0<y<10\pi\) we have \(m=1,2,\dots ,9\) → **9** solutions.
      +
      +*For \(k=7\):* \(\sin y=1\Rightarrow y=\frac{\pi}{2}+2\pi n\).  
      +\(0<y<10\pi\) gives \(n=0,1,2,3,4\) → **5** solutions.
      +
      +*For \(k=-7\):* \(\sin y=-1\Rightarrow y=\frac{3\pi}{2}+2\pi n\).  
      +Again \(n=0,1,2,3,4\) → **5** solutions.
      +
      +Adding them,
      +
      +\[
      +n=5+5+9+12\cdot10=139 .
      +\]
      +
      +Thus there are \(n=139\) zeros of \(f\) in \((0,2\pi)\).
      +
      +---
      +
      +### 2.  Where the graph is tangent to the \(x\)-axis
      +
      +\(f\) is tangent to the \(x\)-axis at a zero when also \(f'(x)=0\).
      +
      +\[
      +f'(x)=35\pi\cos 5x\;\cos\bigl(7\pi\sin5x\bigr).
      +\]
      +
      +At a zero \(\sin5x=k/7\) we have \(\cos\bigl(7\pi\sin5x\bigr)=\cos(k\pi)=(-1)^k\neq0\).  
      +Hence \(f'(x)=0\iff \cos5x=0\).
      +
      +\(\cos5x=0\) implies \(\sin5x=\pm1\); therefore \(k=\pm7\).
      +
      +Thus tangency occurs exactly at the solutions found for \(k=7\) and \(k=-7\).
      +
      +- For \(k=7\): 5 solutions.
      +- For \(k=-7\): 5 solutions.
      +
      +Hence  
      +
      +\[
      +t=5+5=10.
      +\]
      +
      +---
      +
      +### 3.  Required sum
      +
      +\[
      +n+t = 139+10 = 149.
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The numbers  
      +
      +\[
      +17_b = 1\cdot b + 7 = b+7 ,\qquad 
      +97_b = 9\cdot b + 7 .
      +\]
      +
      +We need  
      +
      +\[
      +b+7 \mid 9b+7 .
      +\]
      +
      +Let  
      +
      +\[
      +d=b+7 \quad\Longrightarrow\quad b=d-7 .
      +\]
      +
      +Then  
      +
      +\[
      +9b+7 = 9(d-7)+7 = 9d-56 .
      +\]
      +
      +Thus  
      +
      +\[
      +d \mid 9d-56 \;\Longleftrightarrow\; d \mid 56 .
      +\]
      +
      +Hence \(d\) must be a positive divisor of \(56\).  
      +Since the base must satisfy \(b>9\), we have \(d=b+7>9+7=16\).  
      +The divisors of \(56\) larger than \(16\) are \(28\) and \(56\).
      +
      +\[
      +\begin{aligned}
      +d=28 &\implies b=28-7=21,\\
      +d=56 &\implies b=56-7=49.
      +\end{aligned}
      +\]
      +
      +Both \(b=21\) and \(b=49\) satisfy the original divisibility:
      +
      +\[
      +\begin{aligned}
      +b=21: &\quad 17_{21}=28,\; 97_{21}=196,\; 196/28=7,\\
      +b=49: &\quad 17_{49}=56,\; 97_{49}=448,\; 448/56=8 .
      +\end{aligned}
      +\]
      +
      +Thus the integer bases greater than \(9\) that work are \(21\) and \(49\).
      +
      +The required sum is  
      +
      +\[
      +21+49 = 70 .
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +c=\text{# who chose chocolate},\qquad 
      +v=\text{# who chose vanilla},\qquad 
      +s=\text{# who chose strawberry}.
      +\]
      +
      +The conditions give  
      +
      +\[
      +c+v+s=9,\qquad c>v>s\ge 1 .
      +\]
      +
      +Thus \((c,v,s)\) must be three distinct positive integers whose sum is \(9\).
      +The possible triples are  
      +
      +\[
      +(6,2,1),\qquad (5,3,1),\qquad (4,3,2).
      +\]
      +
      +For a fixed triple \((c,v,s)\) the number of assignments of flavors to the 9 distinct players is the multinomial coefficient  
      +
      +\[
      +\frac{9!}{c!\,v!\,s!}.
      +\]
      +
      +Compute each term:
      +
      +\[
      +\begin{aligned}
      +(6,2,1):\;&\frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot 2}=252,\\[4pt]
      +(5,3,1):\;&\frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot 6}=504,\\[4pt]
      +(4,3,2):\;&\frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot 6\cdot 2}=1260.
      +\end{aligned}
      +\]
      +
      +Add them:
      +
      +\[
      +N = 252+504+1260 = 2016.
      +\]
      +
      +We need \(N \pmod{1000}\):
      +
      +\[
      +2016 \equiv 16 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let a chair be occupied by a person be denoted by \(1\) and an empty chair by \(0\).
      +The condition *“no person sits next to two other people”* means that a
      +\(1\) cannot have \(1\)’s on both sides; equivalently a binary string of
      +length \(16\) may not contain the block \(111\).
      +
      +We must count the binary strings of length \(16\) that contain exactly
      +\(8\) ones and no occurrence of three consecutive ones.
      +
      +--------------------------------------------------------------------
      +### 1.  Decompose the ones into blocks
      +
      +Because a block of three 1’s is forbidden, the ones can only appear in
      +blocks of length \(1\) or \(2\).
      +
      +Let  
      +
      +* \(b\) = number of blocks of length \(2\) (doubletons)  
      +* \(a\) = number of blocks of length \(1\) (singletons)
      +
      +Then  
      +
      +\[
      +a+2b=8 ,\qquad a,b\ge 0 .
      +\]
      +
      +Hence \(a\) must be even and the possible pairs \((a,b)\) are  
      +
      +\[
      +\begin{array}{c|c|c}
      +b & a & B=a+b\\\hline
      +0 & 8 & 8\\
      +1 & 6 & 7\\
      +2 & 4 & 6\\
      +3 & 2 & 5\\
      +4 & 0 & 4
      +\end{array}
      +\]
      +
      +where \(B=a+b\) is the total number of blocks of 1’s.
      +
      +--------------------------------------------------------------------
      +### 2.  Order of the blocks
      +
      +For a fixed \(b\) (hence fixed \(B\)), we must decide which of the \(B\)
      +blocks are doubletons.  This can be done in  
      +
      +\[
      +\binom{B}{b}
      +\]
      +
      +ways.
      +
      +--------------------------------------------------------------------
      +### 3.  Distribution of the zeros
      +
      +There are \(8\) zeros in total (because \(16-8=8\)).  
      +Between any two consecutive blocks there must be at least one zero.
      +Thus the \(B-1\) internal gaps already consume \(B-1\) zeros, leaving
      +
      +\[
      +8-(B-1)=9-B
      +\]
      +
      +zeros to be placed freely among the \(B+1\) gaps (the two ends and the
      +\(B-1\) internal gaps).  By stars‑and‑bars this can be done in
      +
      +\[
      +\binom{(9-B)+(B+1)-1}{B}= \binom{9}{B}
      +\]
      +
      +ways.
      +
      +--------------------------------------------------------------------
      +### 4.  Count for each \(b\)
      +
      +For each \(b\) we multiply the two factors:
      +
      +\[
      +\begin{array}{c|c|c|c}
      +b & B=8-b & \binom{B}{b} & \binom{9}{B} \\ \hline
      +0 & 8 & \binom{8}{0}=1 & \binom{9}{8}=9\\
      +1 & 7 & \binom{7}{1}=7 & \binom{9}{7}=36\\
      +2 & 6 & \binom{6}{2}=15& \binom{9}{6}=84\\
      +3 & 5 & \binom{5}{3}=10& \binom{9}{5}=126\\
      +4 & 4 & \binom{4}{4}=1 & \binom{9}{4}=126
      +\end{array}
      +\]
      +
      +Multiplying and summing:
      +
      +\[
      +\begin{aligned}
      +N &= 1\cdot9 + 7\cdot36 + 15\cdot84 + 10\cdot126 + 1\cdot126\\
      +  &= 9 + 252 + 1260 + 1260 + 126\\
      +  &= 2907.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Modulo \(1000\)
      +
      +\[
      +N \equiv 2907 \pmod{1000}\equiv 907.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +Factor the quadratic form:
      +
      +\[
      +12x^{2}-xy-6y^{2}
      +=(3x+2y)(4x-3y)
      +\]
      +
      +Hence a solution must satisfy one of the two linear equations  
      +
      +\[
      +\begin{cases}
      +3x+2y=0\quad\Longrightarrow\quad x=-\dfrac23\,y\\[4pt]
      +4x-3y=0\quad\Longrightarrow\quad x=\dfrac34\,y
      +\end{cases}
      +\]
      +
      +---
      +
      +### 1.  Solutions of \(4x-3y=0\)
      +
      +Write \(y=4k\) (\(k\in\mathbb Z\)). Then  
      +
      +\[
      +x=\frac34y=3k .
      +\]
      +
      +Thus the points are \((x,y)=(3k,4k)\).  
      +Both coordinates must lie in \([-100,100]\):
      +
      +\[
      +-100\le 4k\le100 \;\Longrightarrow\; -25\le k\le 25, 
      +\qquad -100\le 3k\le100\; \text{(automatically true)} .
      +\]
      +
      +Hence there are  
      +
      +\[
      +25-(-25)+1 = 51
      +\]
      +
      +integer pairs on this line.
      +
      +---
      +
      +### 2.  Solutions of \(3x+2y=0\)
      +
      +Write \(x=2m\) (\(m\in\mathbb Z\)). Then  
      +
      +\[
      +y=-\frac32x=-3m .
      +\]
      +
      +Thus the points are \((x,y)=(2m,-3m)\).  
      +Require \(-100\le2m\le100\) and \(-100\le -3m\le100\):
      +
      +\[
      +-50\le m\le 50,\qquad -\frac{100}{3}\le m\le\frac{100}{3}
      +\;\Longrightarrow\; -33\le m\le 33 .
      +\]
      +
      +So we obtain  
      +
      +\[
      +33-(-33)+1 = 67
      +\]
      +
      +integer pairs on this line.
      +
      +---
      +
      +### 3.  Remove the double‑counted point
      +
      +Both families contain the point \((0,0)\).  
      +It has been counted twice, so subtract one.
      +
      +\[
      +\text{Total}=51+67-1 = 117 .
      +\]
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(p,0),\qquad C=(0,q)
      +\]
      +
      +with \(\angle A=90^{\circ}\).  
      +Because \(BC=38\),
      +
      +\[
      +p^{2}+q^{2}=38^{2}=1444. \tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates of \(K\) and \(L\)
      +
      +\(K\) is \(14\) from \(A\) and from \(B\); therefore it lies on the perpendicular bisector of \(\overline{AB}\):
      +\[
      +K=\Bigl(\frac p2,\ \sqrt{14^{2}-\Bigl(\frac p2\Bigr)^{2}}\Bigr)
      +   =\bigl(a,\; \sqrt{196-a^{2}}\bigr),\qquad a=\frac p2 .
      +\]
      +
      +Similarly \(L\) is \(14\) from \(A\) and from \(C\); thus  
      +
      +\[
      +L=\Bigl(\sqrt{14^{2}-\Bigl(\frac q2\Bigr)^{2}},\ \frac q2\Bigr)
      +   =\bigl(\sqrt{196-b^{2}},\; b\bigr),\qquad b=\frac q2 .
      +\]
      +
      +Since \(K\) and \(L\) are also \(14\) apart,
      +\[
      +(a-\sqrt{196-b^{2}})^{2}+(\sqrt{196-a^{2}}-b)^{2}=14^{2}=196 .
      +\]
      +
      +Expanding gives  
      +
      +\[
      +a\sqrt{196-b^{2}}+b\sqrt{196-a^{2}}=98. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Solving for \(a\) and \(b\)
      +
      +From (1),
      +
      +\[
      +p^{2}+q^{2}=4a^{2}+4b^{2}=1444 \Longrightarrow a^{2}+b^{2}=361. \tag{3}
      +\]
      +
      +Let \(X=a^{2},\;Y=b^{2}\).  Then \(X+Y=361\).  
      +Square (2) and use \(u^{2}=196-b^{2}=196-Y,\;v^{2}=196-a^{2}=196-X\):
      +
      +\[
      +X(196-Y)+Y(196-X)+2ab\sqrt{(196-X)(196-Y)}=9604.
      +\]
      +
      +Using \(ab=\sqrt{XY}\) and (3) simplifies to  
      +
      +\[
      +XY(196-X)(196-Y)=(XY-30576)^{2}.
      +\]
      +
      +Because \(196-X=196-a^{2}=196-X\) etc., after substitution and using \(X+Y=361\) we obtain  
      +
      +\[
      +XY\bigl(-32340+XY\bigr)=(XY-30576)^{2},
      +\]
      +
      +which yields  
      +
      +\[
      +XY=32448.
      +\]
      +
      +Hence  
      +
      +\[
      +X+Y=361,\qquad XY=32448.
      +\]
      +
      +The quadratic \(t^{2}-361t+32448=0\) gives  
      +
      +\[
      +t=\frac{361\pm23}{2} \Longrightarrow \{X,Y\}=\{192,169\}.
      +\]
      +
      +Thus  
      +
      +\[
      +a^{2}=192,\;b^{2}=169\qquad\text{or}\qquad a^{2}=169,\;b^{2}=192.
      +\]
      +
      +Taking \(a^{2}=192\) (the other case is symmetric),
      +
      +\[
      +a=8\sqrt3,\qquad b=13.
      +\]
      +
      +Therefore  
      +
      +\[
      +AB=2a=16\sqrt3,\qquad AC=2b=26,
      +\]
      +
      +and indeed \(AB^{2}+AC^{2}= (16\sqrt3)^{2}+26^{2}=768+676=1444=38^{2}\).
      +
      +--------------------------------------------------------------------
      +### 3.  Coordinates of the relevant points
      +
      +\[
      +\begin{aligned}
      +B&=(16\sqrt3,0),\\
      +K&=\Bigl(8\sqrt3,\ \sqrt{196-192}\Bigr)=\bigl(8\sqrt3,2\bigr),\\
      +L&=\Bigl(\sqrt{196-169},\ 13\Bigr)=\bigl(3\sqrt3,13\bigr),\\
      +C&=(0,26).
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of \(BKLC\)
      +
      +Using the shoelace formula for the polygon \(B\to K\to L\to C\),
      +
      +\[
      +\begin{aligned}
      +\sum x_i y_{i+1}&= (16\sqrt3)(2)+(8\sqrt3)(13)+(3\sqrt3)(26)+0=214\sqrt3,\\
      +\sum y_i x_{i+1}&=0+(2)(3\sqrt3)+0+(26)(16\sqrt3)=422\sqrt3.
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +\operatorname{Area}= \frac12\bigl|214\sqrt3-422\sqrt3\bigr|
      +                 =\frac12\,(208\sqrt3)=104\sqrt3.
      +\]
      +
      +--------------------------------------------------------------------
      +Thus the area of quadrilateral \(BKLC\) is \(104\sqrt3\), so  
      +
      +\[
      +\boxed{104}
      +\] is the required integer \(n\).
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid have parallel sides (bases) \(r\) and \(s\) \((r\neq s)\) and equal legs of length \(L\).
      +
      +---
      +
      +### 1.  Tangential condition  
      +
      +A quadrilateral has an incircle iff the sums of the lengths of opposite sides are equal.  
      +For the order of sides \(r,\,L,\,s,\,L\),
      +
      +\[
      +r+s = L+L \qquad\Longrightarrow\qquad L =\frac{r+s}{2}.
      +\tag{1}
      +\]
      +
      +---
      +
      +### 2.  Use the given area  
      +
      +For any tangential quadrilateral,  
      +
      +\[
      +\text{Area}=r_{\text{in}}\cdot s,
      +\]
      +
      +where \(r_{\text{in}}\) is the inradius and \(s\) is the semiperimeter.  
      +Here the inradius is \(3\) and the area is \(72\):
      +
      +\[
      +72 = 3\,s\quad\Longrightarrow\quad s = 24 .
      +\]
      +
      +The semiperimeter \(s\) is
      +
      +\[
      +s = \frac{r+s+2L}{2}=r+s \quad\Longrightarrow\quad r+s = 24. \tag{2}
      +\]
      +
      +Hence from (1),
      +
      +\[
      +L = \frac{r+s}{2}=12 .
      +\]
      +
      +---
      +
      +### 3.  Height of the trapezoid  
      +
      +The incircle touches both parallel sides, so the distance between them (the height \(h\)) equals the diameter of the incircle:
      +
      +\[
      +h = 2\cdot 3 = 6 .
      +\tag{3}
      +\]
      +
      +---
      +
      +### 4.  Relate the legs to the bases  
      +
      +Because the trapezoid is isosceles, each leg forms a right triangle with vertical leg \(h\) and horizontal leg \(\dfrac{|r-s|}{2}\):
      +
      +\[
      +L^{2}=h^{2}+\Bigl(\frac{r-s}{2}\Bigr)^{2}.
      +\]
      +
      +Insert \(L=12\) and \(h=6\):
      +
      +\[
      +12^{2}=6^{2}+\Bigl(\frac{r-s}{2}\Bigr)^{2}
      +\Longrightarrow\;144=36+\frac{(r-s)^{2}}{4}
      +\Longrightarrow\;(r-s)^{2}=432.
      +\]
      +
      +Thus  
      +
      +\[
      +|r-s|=12\sqrt3. \tag{4}
      +\]
      +
      +---
      +
      +### 5.  Solve for \(r\) and \(s\)
      +
      +From (2) and (4),
      +
      +\[
      +\begin{cases}
      +r+s=24,\\[2pt]
      +r-s=12\sqrt3 \quad(\text{take }r>s).
      +\end{cases}
      +\]
      +
      +Hence  
      +
      +\[
      +r = 12+6\sqrt3,\qquad s = 12-6\sqrt3 .
      +\]
      +
      +(If the roles of \(r\) and \(s\) are exchanged, the same values for \(r^{2}+s^{2}\) result.)
      +
      +---
      +
      +### 6.  Compute \(r^{2}+s^{2}\)
      +
      +\[
      +\begin{aligned}
      +r^{2}+s^{2}&=(12+6\sqrt3)^{2}+(12-6\sqrt3)^{2}\\
      +&= \bigl(144+144\sqrt3+108\bigr)+\bigl(144-144\sqrt3+108\bigr)\\
      +&= 252+144\sqrt3+252-144\sqrt3\\
      +&= 504.
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The first equation  
      +
      +\[
      +|25+20i-z|=5
      +\]
      +
      +is the circle  
      +
      +\[
      +C:\;(x-25)^2+(y-20)^2=5^{2}
      +\]
      +
      +center \(C=(25,20)\), radius \(5\).
      +
      +The second equation  
      +
      +\[
      +|z-4-k| = |z-3i-k|
      +\]
      +
      +says that the point \(z\) is equally distant from  
      +
      +\[
      +A=4+k\;(= (4+k,0)) ,\qquad B=3i+k\;(= (k,3)).
      +\]
      +
      +Hence the set of points satisfying the second condition is the **perpendicular bisector** of the segment \(AB\).
      +
      +---
      +
      +### 1. Equation of the perpendicular bisector  
      +
      +Midpoint of \(AB\):
      +
      +\[
      +M=\Bigl(\frac{4+k+k}{2},\,\frac{0+3}{2}\Bigr)=\Bigl(k+2,\frac32\Bigr).
      +\]
      +
      +Slope of \(AB\):
      +
      +\[
      +\frac{3-0}{k-(4+k)} =\frac{3}{-4}= -\frac34 .
      +\]
      +
      +Therefore the slope of the perpendicular bisector is the negative reciprocal:
      +
      +\[
      +m_{\perp}= \frac{4}{3}.
      +\]
      +
      +Through \(M\) the line is  
      +
      +\[
      +y-\frac32 = \frac{4}{3}\bigl(x-(k+2)\bigr).
      +\]
      +
      +Multiplying by \(3\) and simplifying gives the standard form  
      +
      +\[
      +8x-6y-(8k+7)=0.
      +\]
      +
      +---
      +
      +### 2. Tangency condition  
      +
      +The distance from the centre \(C=(25,20)\) to this line must equal the radius \(5\) for the circle and the line to intersect in **exactly one point** (tangency).
      +
      +\[
      +d=\frac{|\,8\cdot25-6\cdot20-(8k+7)\,|}{\sqrt{8^{2}+(-6)^{2}}}
      +   =\frac{|\,200-120-8k-7\,|}{10}
      +   =\frac{|\,73-8k\,|}{10}.
      +\]
      +
      +Set \(d=5\):
      +
      +\[
      +\frac{|73-8k|}{10}=5\quad\Longrightarrow\quad |73-8k|=50.
      +\]
      +
      +Hence  
      +
      +\[
      +73-8k = 50\quad\text{or}\quad73-8k = -50.
      +\]
      +
      +Solving,
      +
      +\[
      +\begin{cases}
      +73-8k=50 &\Longrightarrow\; k=\dfrac{23}{8},\\[4pt]
      +73-8k=-50&\Longrightarrow\; k=\dfrac{123}{8}.
      +\end{cases}
      +\]
      +
      +Both values give a line tangent to the circle, so the system has exactly one solution for each.
      +
      +---
      +
      +### 3. Sum of all possible \(k\)
      +
      +\[
      +k_{1}+k_{2}= \frac{23}{8}+\frac{123}{8}= \frac{146}{8}= \frac{73}{4}.
      +\]
      +
      +Write \(\frac{73}{4}\) as \(\frac{m}{n}\) with \(\gcd(m,n)=1\); here \(m=73,\ n=4\).
      +
      +\[
      +m+n = 73+4 = 77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For an 8‑digit number  
      +\[
      +a_1a_2a_3a_4a_5a_6a_7a_8,
      +\qquad a_i\in\{1,2,\dots ,8\},
      +\]
      +using each digit once, we need it to be divisible by \(22 = 2\cdot 11\).
      +
      +---
      +
      +### 1.  Divisibility by 2  
      +
      +The last digit \(a_8\) must be even.  
      +The even digits are \(\{2,4,6,8\}\).
      +
      +---
      +
      +### 2.  Divisibility by 11  
      +
      +For an 8‑digit number the test is  
      +
      +\[
      +(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\equiv0\pmod{11}.
      +\]
      +
      +Let  
      +
      +\[
      +S_o=a_1+a_3+a_5+a_7,\qquad S_e=a_2+a_4+a_6+a_8.
      +\]
      +
      +Since the digits \(1,\ldots ,8\) are used exactly once,
      +\(S_o+S_e=1+2+\cdots+8=36\).  
      +Hence  
      +
      +\[
      +S_o-S_e\equiv0\pmod{11}
      +\Longrightarrow 2S_o\equiv36\pmod{11}
      +\Longrightarrow 2S_o\equiv3\pmod{11}.
      +\]
      +
      +Because \(2^{-1}\equiv6\pmod{11}\),  
      +
      +\[
      +S_o\equiv3\cdot6\equiv18\equiv7\pmod{11}.
      +\]
      +
      +The smallest possible sum of four distinct digits is \(1+2+3+4=10\) and the largest is \(5+6+7+8=26\); the only value in this interval congruent to \(7\pmod{11}\) is \(18\).  
      +Thus we require  
      +
      +\[
      +S_o=S_e=18.
      +\]
      +
      +So the four digits placed in the odd positions must sum to \(18\).
      +
      +---
      +
      +### 3.  Choosing the digits for odd positions  
      +
      +We need 4‑element subsets of \(\{1,\dots ,8\}\) whose sum is \(18\).
      +
      +Enumerating them gives  
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are \(m=8\) such subsets.  
      +Each contains exactly two even digits and two odd digits (otherwise the sum cannot be 18).
      +
      +---
      +
      +### 4.  Forming the numbers  
      +
      +For a given subset \(O\) (odd‑position digits):
      +
      +* Arrange the four digits of \(O\) among the odd positions \((1,3,5,7)\): \(4! = 24\) ways.
      +* The complement \(E\) (the even‑position digits) also has exactly two evens.
      +  * Choose which even digit of \(E\) occupies the last position \(a_8\): \(2\) ways.
      +  * Arrange the remaining three digits of \(E\) in positions \(2,4,6\): \(3! = 6\) ways.
      +
      +Thus for each subset \(O\)
      +
      +\[
      +\text{#numbers}=24\cdot(2\cdot 6)=24\cdot12=288 .
      +\]
      +
      +Since there are \(8\) possible subsets,
      +
      +\[
      +N = 8\cdot288 = 2304 .
      +\]
      +
      +---
      +
      +### 5.  Required difference  
      +
      +\[
      +N-2025 = 2304-2025 = 279 .
      +\]
      +
      +\[
      +\boxed{279}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the twelve letters be  
      +
      +\[
      +A<B<C<D<E<F<G<H<I<J<K<L .
      +\]
      +
      +A random perfect matching of the twelve letters is chosen.
      +For each pair \(\{x,y\}\) we write the two letters in alphabetical order,
      +obtaining the word \(xy\;(x<y)\).
      +Sorting the six words alphabetically gives a list whose last word is the
      +lexicographically greatest.
      +
      +--------------------------------------------------------------------
      +### 1.  What is the last word?
      +
      +For a word \(xy\) the first letter is the smaller element of its pair.
      +Since the six first letters are distinct, the last word is the word whose
      +pair has the **largest** smaller element.
      +Denote by  
      +
      +\[
      +s(P)=\min(P) \qquad\text{for a pair }P.
      +\]
      +
      +If the pairs are \(P_1,\dots ,P_6\), the last word comes from the pair  
      +
      +\[
      +P_{\max} \text{ with } s(P_{\max})=\max\{s(P_1),\dots ,s(P_6)\}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Condition for the last word to contain \(G\)
      +
      +Let the partner of \(G\) be a letter \(Y\neq G\).
      +Write  
      +
      +\[
      +s_G=\min(G,Y).
      +\]
      +
      +The last word contains \(G\) **iff** the smallest element of the pair that
      +contains \(G\) is the largest among all six minima, i.e.
      +
      +\[
      +s_G=\max\{s(P_1),\dots ,s(P_6)\}.
      +\tag{1}
      +\]
      +
      +Thus we have to find the probability that condition (1) holds.
      +
      +--------------------------------------------------------------------
      +### 3.  Conditioning on the partner of \(G\)
      +
      +In a random perfect matching the partner of a fixed letter is uniform
      +among the other eleven letters, so we may condition on the value of
      +\(Y\).
      +
      +*If \(Y>G\)* (i.e. \(Y\in\{H,I,J,K,L\}\)):  
      +\(s_G=G\).  Condition (1) becomes “no other pair has both letters
      +greater than \(G\)”, because any such pair would have a minimum exceeding \(G\).
      +
      +After removing \(G\) and \(Y\) we have  
      +
      +- six letters \(<G\) : \(A,B,C,D,E,F\);
      +- four letters \(>G\) : the remaining four of \(\{H,I,J,K,L\}\).
      +
      +We must pair each of the four “high’’ letters with a distinct “low’’
      +letter; the two unused low letters are then paired together.
      +
      +Number of such matchings  
      +
      +\[
      +\binom{6}{4}\,4!=15\cdot 24=360 .
      +\]
      +
      +The total number of matchings on the ten remaining letters is  
      +
      +\[
      +(10-1)!!=9\cdot7\cdot5\cdot3\cdot1=945 .
      +\]
      +
      +Hence  
      +
      +\[
      +\Pr(\text{condition }|\,Y>G)=\frac{360}{945}=\frac{8}{21}.
      +\tag{2}
      +\]
      +
      +There are five possibilities for \(Y>G\).
      +
      +--------------------------------------------------------------------
      +*If \(Y<G\)* (i.e. \(Y\in\{A,B,C,D,E,F\}\)):  
      +Now \(s_G=Y\).  Condition (1) says that every other pair must have a
      +minimum **less than \(Y\)**, i.e. no pair may consist solely of letters
      +greater than \(Y\).
      +
      +Let the rank of \(Y\) be \(y\;(1\le y\le 6)\).  
      +Among the ten remaining letters we have  
      +
      +- \(y-1\) letters \(<Y\);
      +- \(11-y\) letters \(>Y\) (the letters greater than \(Y\) except the removed
      +\(G\)).
      +
      +For the condition to be possible we need at least as many letters
      +\(<Y\) as letters \(>Y\); this occurs only when \(y=6\), i.e. \(Y=F\).
      +
      +When \(Y=F\) the remaining letters are  
      +
      +- five letters \(<F\): \(A,B,C,D,E\);
      +- five letters \(>F\): \(H,I,J,K,L\).
      +
      +Again every “high’’ letter must be paired with a distinct “low’’ letter,
      +giving exactly  
      +
      +\[
      +5! =120
      +\]
      +
      +acceptable matchings.  Therefore  
      +
      +\[
      +\Pr(\text{condition }|\,Y=F)=\frac{120}{945}= \frac{8}{63},
      +\tag{3}
      +\]
      +
      +and for \(Y=A,B,C,D,E\) the probability is \(0\).
      +
      +--------------------------------------------------------------------
      +### 4.  Overall probability
      +
      +Using that the partner of \(G\) is uniformly one of the other eleven
      +letters,
      +
      +\[
      +\begin{aligned}
      +\Pr(\text{last word contains }G)
      +&=\frac1{11}\Bigl(
      +5\cdot\frac{8}{21}
      ++\frac{8}{63}
      ++0+0+0+0+0\Bigr)\\[2mm]
      +&=\frac1{11}\Bigl(\frac{40}{21}+\frac{8}{63}\Bigr)
      +   =\frac1{11}\Bigl(\frac{120}{63}+\frac{8}{63}\Bigr)\\[2mm]
      +&=\frac{128}{693}.
      +\end{aligned}
      +\]
      +
      +The fraction \(\frac{128}{693}\) is already in lowest terms
      +(\(\gcd(128,693)=1\)).
      +
      +Thus  
      +
      +\[
      +m=128,\qquad n=693,\qquad m+n=821.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +C:\;y=x^{2}-4
      +\]
      +
      +be the given parabola.  
      +Rotate \(C\) \(60^{\circ}\) counter‑clockwise about the origin.  
      +If a point \((x,y)\) lies on both \(C\) and its rotated image, then rotating \((x,y)\) **clockwise** by \(60^{\circ}\) must again land on \(C\).
      +
      +---
      +
      +### 1.  The rotation equations  
      +
      +For a clockwise rotation of \(60^{\circ}\),
      +
      +\[
      +\begin{aligned}
      +x'&=x\cos60^{\circ}+y\sin60^{\circ}= \tfrac12 x+\tfrac{\sqrt3}{2}y,\\[2mm]
      +y'&=-x\sin60^{\circ}+y\cos60^{\circ}= -\tfrac{\sqrt3}{2}x+\tfrac12 y .
      +\end{aligned}
      +\]
      +
      +The condition “the rotated point lies on \(C\)” is
      +
      +\[
      +y'=(x')^{2}-4 .
      +\]
      +
      +Substituting \(y=x^{2}-4\) (since \((x,y)\in C\)) gives a single equation in \(x\).
      +
      +---
      +
      +### 2.  Obtain the equation in \(x\)
      +
      +Put \(\displaystyle s=\frac{\sqrt3}{2},\ c=\frac12\).  
      +Then
      +
      +\[
      +\begin{aligned}
      +x' &=c\,x+s\,(x^{2}-4)= s x^{2}+c x-4s,\\[1mm]
      +y' &=-s\,x+c\,(x^{2}-4)=c x^{2}-s x-4c .
      +\end{aligned}
      +\]
      +
      +The condition \(y'= (x')^{2}-4\) becomes
      +
      +\[
      +c x^{2}-s x-4c =\bigl(s x^{2}+c x-4s\bigr)^{2}-4 .
      +\]
      +
      +Insert \(c=\tfrac12,\ s=\tfrac{\sqrt3}{2}\) and clear denominators (multiply by \(4\)):
      +
      +\[
      +2x^{2}-2\sqrt3\,x-8 = \bigl(\sqrt3\,x^{2}+x-4\sqrt3\bigr)^{2}-4 .
      +\]
      +
      +After simplifying we obtain the quartic
      +
      +\[
      +3x^{4}+2\sqrt3\,x^{3}-25x^{2}-6\sqrt3\,x+40=0 .
      +\]
      +
      +---
      +
      +### 3.  Factor the quartic
      +
      +Trying a factorisation \((3x^{2}+Bx+C)(x^{2}+Ex+F)\) with
      +\(B,E\) multiples of \(\sqrt3\), we find
      +
      +\[
      +\boxed{(3x^{2}-\sqrt3\,x-10)(x^{2}+\sqrt3\,x-4)=0}.
      +\]
      +
      +Hence the possible \(x\)-coordinates are the roots of
      +
      +\[
      +\begin{cases}
      +3x^{2}-\sqrt3\,x-10=0,\\[1mm]
      +x^{2}+\sqrt3\,x-4=0 .
      +\end{cases}
      +\]
      +
      +Solving:
      +
      +\[
      +\begin{aligned}
      +3x^{2}-\sqrt3\,x-10=0 &\Longrightarrow 
      +x=\dfrac{\sqrt3\pm\sqrt{123}}6\;( \approx 2.14,\ -1.56),\\[2mm]
      +x^{2}+\sqrt3\,x-4=0 &\Longrightarrow 
      +x=\dfrac{-\sqrt3\pm\sqrt{19}}2\;( \approx 1.31,\ -3.05).
      +\end{aligned}
      +\]
      +
      +---
      +
      +### 4.  Identify the point in the fourth quadrant  
      +
      +The fourth quadrant requires \(x>0\) and \(y<0\).  
      +Only  
      +
      +\[
      +x=\frac{-\sqrt3+\sqrt{19}}2 \approx 1.31
      +\]
      +
      +satisfies these conditions (the other positive root gives \(x>2\) and \(y>0\)).  
      +
      +Thus the intersection point in the fourth quadrant is
      +
      +\[
      +\bigl(x,\;y\bigr)=\left(\frac{-\sqrt3+\sqrt{19}}2,\;
      +\left(\frac{-\sqrt3+\sqrt{19}}2\right)^{\!2}-4\right).
      +\]
      +
      +Compute \(y\):
      +
      +\[
      +\begin{aligned}
      +y&=\frac{(-\sqrt3+\sqrt{19})^{2}}{4}-4
      +   =\frac{3+19-2\sqrt{57}}{4}-4
      +   =\frac{22-2\sqrt{57}}{4}-4 \\
      +  &=\frac{11}{2}-\frac{\sqrt{57}}2-4
      +   =\frac{3-\sqrt{57}}{2}.
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +y=\frac{\,3-\sqrt{57}\,}{2}
      +\]
      +
      +which matches the required form \(\displaystyle \frac{a-\sqrt b}{c}\) with  
      +
      +\[
      +a=3,\qquad b=57,\qquad c=2.
      +\]
      +
      +\(a\) and \(c\) are relatively prime, as required.
      +
      +---
      +
      +### 5.  Compute \(a+b+c\)
      +
      +\[
      +a+b+c = 3+57+2 = 62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Sketch**
      +
      +1. **Placing the pentagon.**  
      +   Put \(B=(0,0)\) and let \(BC\) be the segment on the \(x\)-axis, so \(C=(7,0)\).  
      +   Since \(\angle B=60^{\circ}\) and \(AB=14\),
      +
      +\[
      +A=\bigl(7,\;7\sqrt3 \bigr).
      +\]
      +
      +   Using the law of cosines in \(\triangle ABC\) we obtain \(AC=7\sqrt3\); thus
      +\(\triangle ABC\) is a \(30\!-\!60\!-\!90\) right triangle with right angle at \(C\).
      +
      +   In the same way the data at \(E\) give a similar \(30\!-\!60\!-\!90\) triangle
      +\(\triangle AED\) with right angle at \(D\), giving  
      +
      +\[
      +AE=26,\qquad DE=13,\qquad AD=13\sqrt3 .
      +\]
      +
      +   Solving the two circles \((A,13\sqrt3)\) and \((C,24)\) yields  
      +
      +\[
      +D=\Bigl(\frac{205}{7},\;\frac{36\sqrt3}{7}\Bigr),\qquad
      +E=\Bigl(\frac{218}{7},\;\frac{88\sqrt3}{7}\Bigr).
      +\]
      +
      +2. **A useful line.**  
      +   Points \(B\) and \(E\) are joined by the segment \(BE\) of length  
      +
      +\[
      +BE=\frac{266}{7}=38 .
      +\]
      +
      +   For any point \(X\) on the line \(BE\) we have, by the triangle inequality,
      +\[
      +XB+XE=BE=38 .
      +\]
      +
      +   Hence for \(X\in BE\)
      +
      +\[
      +f(X)=XB+XE+AX+CX+DX=38+AX+CX+DX .
      +\]
      +
      +   Therefore the problem reduces to minimizing  
      +
      +\[
      +g(X)=AX+CX+DX\qquad (X\in BE).
      +\]
      +
      +3. **Parameterising the line.**  
      +   Write \(X\) as  
      +
      +\[
      +X(t)=\Bigl(\frac{218}{7}t,\;\frac{88\sqrt3}{7}t\Bigr),\qquad 0\le t\le 1 .
      +\]
      +
      +   Direct computation gives  
      +
      +\[
      +\begin{aligned}
      +AX^2&=\frac{4\cdot79-28t+1444t^{2}}{9},\\[2mm]
      +CX^2&=\frac{577-158t+1444t^{2}}{9},\\[2mm]
      +DX^2&=\frac{3241-1106t+1444t^{2}}{9}.
      +\end{aligned}
      +\]
      +
      +   The function \(g(t)=\sqrt{AX^2}+\sqrt{CX^2}+\sqrt{DX^2}\) is convex,
      +so its minimum occurs where \(g'(t)=0\).
      +
      +4. **Finding the minimizing \(t\).**  
      +   Using the derivative formula for a distance,
      +\( \dfrac{d}{dt}\sqrt{at^{2}+bt+c}=
      + \dfrac{2at+b}{2\sqrt{at^{2}+bt+c}}\),
      +the condition \(g'(t)=0\) becomes
      +
      +\[
      +\frac{1444t-482}{\sqrt{4\cdot79-28t+1444t^{2}}}
      ++\frac{1444t-218}{\sqrt{577-158t+1444t^{2}}}
      ++\frac{1444t-1106}{\sqrt{3241-1106t+1444t^{2}}}=0 .
      +\]
      +
      +   Substituting \(t=\dfrac13\) makes each numerator a multiple of
      +\(2,\,790,\,-1874\) respectively, and a short computation shows the
      +left‑hand side to be zero.  Because of convexity, \(t=\dfrac13\) gives the
      +global minimum.
      +
      +5. **The minimum value.**  
      +   For \(t=\dfrac13\),
      +
      +\[
      +\begin{aligned}
      +AX&=\frac{2\sqrt{79}}{3},\\[1mm]
      +CX&=\frac{\sqrt{577}}{3},\\[1mm]
      +DX&=\frac{\sqrt{3241}}{3}.
      +\end{aligned}
      +\]
      +
      +   A direct squaring shows
      +
      +\[
      +2\sqrt{79}+ \sqrt{577}+ \sqrt{3241}=57\sqrt3 ,
      +\]
      +
      +   therefore  
      +
      +\[
      +g_{\min}= \frac{57\sqrt3}{3}=19\sqrt3 .
      +\]
      +
      +   Adding the constant part \(XB+XE=38\) gives the least possible value of
      +\(f\):
      +
      +\[
      +f_{\min}=38+19\sqrt3 .
      +\]
      +
      +6. **Answer.**  
      +   The expression is of the form \(m+n\sqrt p\) with
      +\(m=38,\;n=19,\;p=3\).  Hence
      +
      +\[
      +m+n+p = 38+19+3 = 60 .
      +\]
      +
      +\[
      +\boxed{60}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 60

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution**
      +
      +Let  
      +
      +\[
      +M=3^{7}=2187 ,\qquad L=3^{6}=729 .
      +\]
      +
      +All ordered triples \((a,b,c)\) satisfy  
      +
      +\[
      +N=\#\{1\le a,b,c\le L\;|\;a^{3}+b^{3}+c^{3}\equiv 0\pmod{M}\}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.   The cubes modulo \(M\)
      +
      +Write a positive integer \(a\) as  
      +
      +\[
      +a=3^{v}\,u ,\qquad v=v_{3}(a)\in\{0,1,2,3,4,5,6\},
      +\qquad 3\nmid u .
      +\]
      +
      +*If \(v\ge 3\) then \(a^{3}\equiv0\pmod{M}\).  
      +If \(v=2\) then \(a^{3}\equiv729\,u\pmod{M}\) and, because
      +\(u\equiv\pm1\pmod3\),
      +
      +\[
      +a^{3}\equiv\begin{cases}
      +729 & u\equiv1\pmod3,\\[2mm]
      +1458& u\equiv2\pmod3 .
      +\end{cases}
      +\]
      +
      +*If \(v=1\) then \(a=3u\;(3\nmid u\le 243)\) and  
      +
      +\[
      +a^{3}\equiv27\,u^{3}\pmod{M}.
      +\]
      +
      +Since \(27\cdot81=M\), only \(u^{3}\pmod{81}\) matters.  The
      +set of cubic residues modulo \(81\) among the units is  
      +
      +\[
      +R_{4}=\{x\in\mathbb Z/81\;|\;x\equiv\pm1\pmod9\},
      +\qquad |R_{4}|=18 .
      +\]
      +
      +Each element of \(R_{4}\) occurs exactly three times among the
      +\(162\) numbers \(u\) (the three residue‑classes modulo \(81\));
      +hence each value \(27r\;(r\in R_{4})\) occurs \(9\) times.
      +
      +*If \(v=0\) (i.e. \(3\nmid a\)), then \(a^{3}\) runs through the
      +cubic residues among the units modulo \(M\)
      +
      +\[
      +R_{7}=\{x\in\mathbb Z/M\;|\;x\equiv\pm1\pmod9\},
      +\qquad |R_{7}|=486 ,
      +\]
      +
      +each occurring **once**.
      +
      +Summarising, the multiset of residues \(\{a^{3}\pmod M\}\) is
      +
      +| residue type | number of residues | multiplicity |
      +|---|---|---|
      +| \(x\in R_{7}\) | \(486\) | \(1\) |
      +| \(27r,\,r\in R_{4}\) | \(18\) | \(9\) |
      +| \(729\) | \(1\) | \(27\) |
      +| \(1458\) | \(1\) | \(27\) |
      +| \(0\) | \(1\) | \(27\) |
      +| total | \(729\) | – |
      +
      +--------------------------------------------------------------------
      +### 2.   Fourier representation
      +
      +Put  
      +
      +\[
      +\zeta =e^{2\pi i/M}, \qquad 
      +S(k)=\sum_{a=1}^{L}\zeta^{k a^{3}}
      +      =\sum_{x}f(x)\,\zeta^{k x},
      +\]
      +
      +where \(f(x)\) is the multiplicity of the residue \(x\) listed above.
      +Orthogonality of characters gives  
      +
      +\[
      +N=\frac1{M}\sum_{k=0}^{M-1}S(k)^{3}\tag{1}
      +\]
      +
      +and we have to evaluate the sum on the right.
      +
      +--------------------------------------------------------------------
      +### 3.   Explicit form of \(S(k)\)
      +
      +Write \(k=3^{v}t\;(3\nmid t)\).  
      +The three kinds of contributions are
      +
      +* from \(R_{7}\) (cubic residues modulo \(M\))  
      +
      +\[
      +S_{7}(k)=\sum_{x\in R_{7}}\zeta^{k x}
      +       =\begin{cases}
      +       486\cos\frac{2\pi t}{9},&3^{5}\mid k,\\
      +       0,&\text{otherwise}.
      +       \end{cases}
      +\]
      +
      +* from the residues \(27r\) (\(r\in R_{4}\))  
      +
      +\[
      +9S_{4}(k)=9\sum_{r\in R_{4}}\zeta^{27k r}
      +        =\begin{cases}
      +        162\cos\frac{2\pi t}{9},&9\mid k,\\
      +        0,&\text{otherwise}.
      +        \end{cases}
      +\]
      +
      +* from the three “fixed’’ residues \(0,\,729,\,1458\)  
      +
      +\[
      +S_{2}(k)+S_{3}(k)=27\bigl(\zeta^{729k}+\zeta^{1458k}+1\bigr)
      +                =\begin{cases}
      +                81,&3\mid k,\\[2mm]
      +                0,&3\nmid k .
      +                \end{cases}
      +\]
      +
      +Hence
      +
      +\[
      +S(k)=S_{7}(k)+9S_{4}(k)+
      +\begin{cases}
      +81,&3\mid k,\\
      +0,&3\nmid k .
      +\end{cases}
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.   Values of \(S(k)\)
      +
      +According to the 3‑adic valuation \(v=v_{3}(k)\) we obtain
      +
      +| \(v\) | condition on \(k\) | \(S(k)\) |
      +|---|---|---|
      +| \(0\) | \(3\nmid k\) | \(0\) |
      +| \(1\) | \(3\mid k,\;9\nmid k\) | \(81\) |
      +| \(2\) | \(9\mid k,\;27\nmid k\) | \(81\bigl(1+2\cos\frac{2\pi u}{9}\bigr)\)  \(\;(u=k/9\bmod9\neq0,3,6)\) |
      +| \(3\) | \(27\mid k,\;81\nmid k\) | \(0\) |
      +| \(4\) | \(81\mid k,\;243\nmid k\) | \(243\) |
      +| \(5\) | \(243\mid k,\;729\nmid k\) | \(243\bigl(1+2\cos\frac{2\pi t}{9}\bigr)\) \(\;(t=k/243\bmod9\neq0,3,6)\) |
      +| \(6\) | \(729\mid k\) | \(0\) |
      +| \(k=0\) | – | \(S(0)=729\) |
      +
      +The numbers of \(k\) having each valuation are  
      +
      +\[
      +\begin{aligned}
      +&v=0:1458,\quad v=1:486,\quad v=2:162,\\
      +&v=3:54,\quad v=4:18,\quad v=5:6,\quad v=6:2 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.   Summation of \(S(k)^{3}\)
      +
      +Denote  
      +
      +\[
      +C=\sum_{u\in\{1,2,4,5,7,8\}}\bigl(1+2\cos\tfrac{2\pi u}{9}\bigr)^{3}.
      +\]
      +
      +Using the identity  
      +
      +\[
      +\sum_{u\in\{1,2,4,5,7,8\}}\bigl(1+2\cos\tfrac{2\pi u}{9}\bigr)^{3}=36,
      +\]
      +
      +(which follows from expanding \((1+z^{u}+z^{-u})^{3}\) and summing over
      +\(u\) with \(z=e^{2\pi i/9}\)), we obtain
      +
      +\[
      +\begin{aligned}
      +\sum_{k}S(k)^{3}
      +&= 486\cdot81^{3}
      +   +162\cdot81^{3}
      +   +18\cdot243^{3}
      +   +6\cdot243^{3}                                 \\
      +&= 486\cdot531\,441
      +   +162\cdot531\,441
      +   +18\cdot14\,348\,907
      +   +6\cdot14\,348\,907                           \\
      +&=5\cdot3^{18}=5\cdot387\,420\,489
      +   =1\,937\,102\,445 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 6.   The number \(N\)
      +
      +From (1),
      +
      +\[
      +N=\frac{1}{3^{7}}\sum_{k}S(k)^{3}
      +  =\frac{5\cdot3^{18}}{3^{7}}
      +  =5\cdot3^{11}=5\cdot177\,147=885\,735 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 7.   Remainder modulo \(1000\)
      +
      +\[
      +885\,735 \equiv 735 \pmod{1000}.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{735}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 735

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +f(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \frac{N(x)}{x},
      +\qquad N(x)=(x-18)(x-72)(x-98)(x-k)
      +\]
      +
      +for \(x>0\) and a positive parameter \(k\).
      +
      +--------------------------------------------------------------------
      +### 1.  Critical points
      +
      +\[
      +f'(x)=\frac{xN'(x)-N(x)}{x^{2}},\qquad   
      +f'(x)=0\Longleftrightarrow H(x):=xN'(x)-N(x)=0 .
      +\]
      +
      +Write  
      +
      +\[
      +N(x)=x^{4}-S_{1}x^{3}+S_{2}x^{2}-S_{3}x+S_{4},
      +\]
      +
      +where  
      +
      +\[
      +\begin{aligned}
      +S_{1}&=18+72+98+k = 188+k,\\
      +S_{2}&=18\cdot72+18\cdot98+72\cdot98+ (18+72+98)k =10116+188k,\\
      +S_{3}&=18\cdot72\cdot98+(18\cdot72+18\cdot98+72\cdot98)k =127008+10116k,\\
      +S_{4}&=18\cdot72\cdot98\cdot k =127008\,k .
      +\end{aligned}
      +\]
      +
      +Since  
      +
      +\[
      +N'(x)=4x^{3}-3S_{1}x^{2}+2S_{2}x-S_{3},
      +\]
      +
      +we obtain  
      +
      +\[
      +\begin{aligned}
      +H(x)&=xN'(x)-N(x)  \\
      +    &=3x^{4}-2S_{1}x^{3}+S_{2}x^{2}-S_{4}\\
      +    &=3x^{4}-(376+2k)x^{3}+(10116+188k)x^{2}-127008k .
      +\end{aligned}
      +\]
      +
      +The three positive roots of \(H\) are the two minima of \(f\) (in the intervals where
      +\(f<0\)) and one interior maximum.
      +
      +--------------------------------------------------------------------
      +### 2.  When are the two minima equal?
      +
      +At a minimum \(x_{0}\),
      +
      +\[
      +f(x_{0}) = \frac{N(x_{0})}{x_{0}} = N'(x_{0})=:m .
      +\]
      +
      +Thus the equation \(N(x)=mx\) has a **double** root at each minimum.
      +If the global minimum is attained at exactly two points, then
      +
      +\[
      +N(x)-mx=(x-\alpha)^{2}(x-\gamma)^{2},
      +\qquad\alpha\neq\gamma>0 .
      +\]
      +
      +Expanding both sides and comparing coefficients gives
      +
      +\[
      +\begin{cases}
      +\alpha+\gamma =\displaystyle\frac{188+k}{2},\\[4pt]
      +\alpha\gamma = -\dfrac{k^{2}}{8}+47k+640,\\[4pt]
      +(\alpha\gamma)^{2}=S_{4}=127008k .
      +\end{cases}
      +\]
      +
      +Eliminating \(\alpha,\gamma\) yields a single equation for \(k\):
      +
      +\[
      +\Bigl(-\frac{k^{2}}{8}+47k+640\Bigr)^{2}=127008k .
      +\]
      +
      +Multiplying by \(64\),
      +
      +\[
      +(k^{2}-376k-5120)^{2}=8\,128\,512\,k,
      +\]
      +
      +which simplifies to the quartic
      +
      +\[
      +k^{4}-752k^{3}+131136k^{2}-4\,278\,272k+26\,214\,400=0 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Solving the quartic
      +
      +Factoring gives  
      +
      +\[
      +(k-8)(k-32)(k^{2}-712k+102400)=0,
      +\]
      +
      +so the four real solutions are  
      +
      +\[
      +k=8,\qquad k=32,\qquad k=200,\qquad k=512 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Selecting the admissible \(k\)
      +
      +For the two minima to be **positive**, the product \(\alpha\gamma\) must be positive:
      +
      +\[
      +\alpha\gamma = -\frac{k^{2}}{8}+47k+640 >0 .
      +\]
      +
      +Evaluating this expression:
      +
      +\[
      +\begin{array}{c|c}
      +k & \alpha\gamma\\ \hline
      +8   & 1008>0\\
      +32  & 2016>0\\
      +200 & 5040>0\\
      +512 & -8064<0
      +\end{array}
      +\]
      +
      +Thus \(k=512\) gives one root \(\alpha\) negative and cannot produce two minima on the
      +positive axis.  The admissible values are  
      +
      +\[
      +k=8,\;32,\;200 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Sum of the three values
      +
      +\[
      +8+32+200 = 240 .
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The inequalities can be rewritten by factoring:
      +
      +\[
      +\begin{aligned}
      +x-yz<y-zx &\iff (x-y)(1+z)<0,\\[2pt]
      +y-zx<z-xy &\iff (y-z)(1+x)<0 .
      +\end{aligned}
      +\]
      +
      +Hence the signs of \(x-y,\;y-z,\;1+z,\;1+x\) must be opposite in each product.
      +Four sign‑patterns are possible:
      +
      +\[
      +\begin{array}{c|c|c|c}
      +x+1 & z+1 & \text{implied order of }x,y,z & \text{region}\\ \hline
      +>0 & >0 & x<y<z & \text{bounded}\\
      +>0 & <0 & y<\min\{x,z\} & \text{unbounded}\\
      +<0 & >0 & \max\{x,z\}<y & \text{unbounded}\\
      +<0 & <0 & x>y>z & \text{impossible (sum }75)
      +\end{array}
      +\]
      +
      +Only the first case can give a finite region.  
      +With \(x+y+z=75\) and the inequalities
      +
      +\[
      +x>-1,\qquad x<y,\qquad y<z,
      +\]
      +
      +write \(z=75-x-y\). The conditions become
      +
      +\[
      +\begin{cases}
      +x>-1,\\
      +x<y,\\
      +y<\dfrac{75-x}{2}.
      +\end{cases}
      +\]
      +
      +In the \((x,y)\)-plane this is the interior of the triangle bounded by
      +
      +\[
      +x=-1,\qquad y=x,\qquad y=\frac{75-x}{2},
      +\]
      +
      +whose vertices are \((-1,-1),\;(-1,38),\;(25,25)\).
      +
      +Its area in the \((x,y)\)-plane is
      +
      +\[
      +\frac12\cdot 39\cdot 26=507 .
      +\]
      +
      +The plane \(x+y+z=75\) makes an angle with the \(xy\)-plane whose normal is \((1,1,1)\); the area element is multiplied by \(\lVert(1,1,1)\rVert=\sqrt3\).  
      +Hence the actual area of the bounded region is
      +
      +\[
      +507\sqrt3 .
      +\]
      +
      +Thus \(a=507,\;b=3\) and
      +
      +\[
      +a+b=507+3=510 .
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The grid consists of three \(3\times 3\) blocks.  
      +For each number \(1,\dots ,9\) we must place it
      +
      +* once in each of the three rows,
      +* once in each of the three blocks.
      +
      +Hence for a fixed number its positions are described by a permutation
      +\(\sigma\in S_{3}\):
      +\[
      +\sigma(i)=\text{the block in which the number occurs in row }i .
      +\]
      +
      +---
      +
      +### 1.  Counting the assignments of permutations
      +
      +Let \(n_\sigma\) be the number of symbols that use permutation \(\sigma\).
      +Since there are nine symbols,
      +\[
      +\sum_{\sigma\in S_3} n_\sigma = 9 .
      +\]
      +
      +For each ordered pair \((i,j)\) (row \(i\), block \(j\)) the number of symbols
      +with \(\sigma(i)=j\) must be \(3\) (there are three columns in that block).  
      +Writing the six permutations of \(S_3\) as  
      +
      +\[
      +\begin{aligned}
      +\sigma_1&:(1,2,3),&\sigma_2&:(2,1,3),&\sigma_3&:(3,2,1),\\
      +\sigma_4&:(1,3,2),&\sigma_5&:(2,3,1),&\sigma_6&:(3,1,2),
      +\end{aligned}
      +\]
      +
      +the conditions become  
      +
      +\[
      +\begin{array}{c}
      +n_1+n_4=3,\; n_1+n_2=3,\; n_1+n_3=3,\\
      +n_2+n_5=3,\; n_3+n_6=3,\; n_4+n_5=3,\\
      +n_3+n_5=3,\; n_4+n_6=3,\; n_2+n_6=3 .
      +\end{array}
      +\]
      +
      +Solving gives a one‑parameter family
      +
      +\[
      +n_1=n_5=n_6=k,\qquad n_2=n_3=n_4=3-k,
      +\]
      +
      +with \(k=0,1,2,3\) (non‑negative integers).  
      +For each \(k\) the number of ways to assign the nine distinct symbols to the
      +permutations is  
      +
      +\[
      +\frac{9!}{k!^3\,(3-k)!^3}.
      +\]
      +
      +Hence the total number of macro‑assignments is
      +
      +\[
      +M=\sum_{k=0}^{3}\frac{9!}{k!^3(3-k)!^3}
      +   =1680+45360+45360+1680=94080 .
      +\]
      +
      +---
      +
      +### 2.  Ordering within each macro‑cell
      +
      +A macro‑cell \((\text{row }i,\text{ block }j)\) contains exactly three
      +different numbers.  Their order in the three columns of that block can be chosen
      +in \(3!\) ways, independently for each of the \(3\times 3=9\) macro‑cells.
      +Thus we obtain an extra factor \((3!)^{9}=6^{9}=10\,077\,696\).
      +
      +Hence the total number of fillings is  
      +
      +\[
      +N = M\cdot (3!)^{9}=94080\cdot 6^{9}
      +   = 2^{16}\cdot 3^{10}\cdot5\cdot7^{2}.
      +\]
      +
      +---
      +
      +### 3.  Computing \(p a+q b+r c+s d\)
      +
      +Writing \(N=p^{a}q^{b}r^{c}s^{d}\) with distinct primes \(p,q,r,s\) we have  
      +
      +\[
      +p=2,\;a=16;\qquad q=3,\;b=10;\qquad r=5,\;c=1;\qquad s=7,\;d=2.
      +\]
      +
      +Therefore  
      +
      +\[
      +p a+q b+r c+s d
      +=2\cdot16+3\cdot10+5\cdot1+7\cdot2
      +=32+30+5+14=81.
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line containing \(A,B,C,D,E,F\) be the \(x\)-axis.  
      +Place \(A\) at the origin: \(A=(0,0)\).
      +
      +---
      +
      +### 1.  Determine the coordinates of the collinear points  
      +
      +\[
      +\begin{aligned}
      +AC&=26\quad\Rightarrow\quad C=(26,0),\\[2mm]
      +BD&=22\quad\Rightarrow\quad D-B=22,\\[2mm]
      +CE&=31\quad\Rightarrow\quad E-C=31\;\Rightarrow\;E=(57,0),\\[2mm]
      +DF&=33\quad\Rightarrow\quad F-D=33,\\[2mm]
      +AF&=73\quad\Rightarrow\quad F=(73,0).
      +\end{aligned}
      +\]
      +
      +From \(F-D=33\) we get \(D=73-33=40\).  
      +Then \(BD=22\) gives \(B=40-22=18\).
      +
      +Thus  
      +
      +\[
      +A(0,0),\;B(18,0),\;C(26,0),\;D(40,0),\;E(57,0),\;F(73,0).
      +\]
      +
      +---
      +
      +### 2.  Locate point \(G\)
      +
      +Let \(G=(x,y)\) with \(y\neq0\).  
      +Given \(CG=40\) and \(DG=30\),
      +
      +\[
      +\begin{cases}
      +(x-26)^2+y^2 = 40^2 =1600,\\
      +(x-40)^2+y^2 = 30^2 = 900 .
      +\end{cases}
      +\]
      +
      +Subtract the second equation from the first:
      +
      +\[
      +(x-26)^2-(x-40)^2 = 700
      +\]
      +\[
      +\Longrightarrow\;28x-924 = 700 \;\Longrightarrow\; x=58 .
      +\]
      +
      +Plug \(x=58\) into \((x-40)^2+y^2=900\):
      +
      +\[
      +(18)^2 + y^2 = 900 \;\Longrightarrow\; y^2 = 576 \;\Longrightarrow\; y = \pm24 .
      +\]
      +
      +Take \(y=24\) (the sign does not affect the area).  
      +Hence \(G=(58,24)\).
      +
      +---
      +
      +### 3.  Area of \(\triangle BGE\)
      +
      +Points \(B\) and \(E\) lie on the \(x\)-axis, so segment \(\overline{BE}\) is horizontal.  
      +
      +\[
      +BE = 57-18 = 39 .
      +\]
      +
      +The perpendicular distance from \(G\) to line \(BE\) (the \(x\)-axis) is \(|y| = 24\).
      +
      +Therefore
      +
      +\[
      +\text{Area} = \frac12 \times (\text{base}) \times (\text{height})
      +           = \frac12 \times 39 \times 24
      +           = 468 .
      +\]
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +d=n+2\qquad (d\ge 3,\;n\in\mathbb Z^+)
      +\]
      +
      +Then  
      +
      +\[
      +n+3=d+1,\qquad n^{2}+9=(d-2)^2+9=d^{2}-4d+13 .
      +\]
      +
      +The condition “\(n+2\) divides \(3(n+3)(n^{2}+9)\)” becomes  
      +
      +\[
      +d\mid 3(d+1)(d^{2}-4d+13).
      +\]
      +
      +Consider the right‑hand side modulo \(d\):
      +
      +\[
      +\begin{aligned}
      +3(d+1)(d^{2}-4d+13)
      +&\equiv 3\cdot1\cdot13\pmod{d}\\
      +&=39\pmod{d}.
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +d\mid 3(d+1)(d^{2}-4d+13)\iff d\mid 39 .
      +\]
      +
      +Since \(d=n+2\ge 3\), the possible values of \(d\) are the divisors of \(39\) that are at least \(3\):
      +
      +\[
      +d\in\{3,13,39\}.
      +\]
      +
      +Corresponding \(n=d-2\) values are  
      +
      +\[
      +n=1,\;11,\;37 .
      +\]
      +
      +All three satisfy the original divisibility (direct substitution confirms).
      +
      +The required sum is  
      +
      +\[
      +1+11+37=49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The function  
      +
      +\[
      +f(x)=\begin{cases}
      +x,&-1\le x<1\\[2mm]
      +2-x,&1\le x<3
      +\end{cases},\qquad f(x+4)=f(x)
      +\]
      +
      +has period \(4\).  
      +For any \(x\) write  
      +
      +\[
      +x=4n+t,\qquad t\in[-1,3),\;n\in\mathbb Z .
      +\]
      +
      +Then  
      +
      +\[
      +f(x)=\begin{cases}
      +t,&-1\le t<1\\
      +2-t,&1\le t<3 .
      +\end{cases}
      +\tag{1}
      +\]
      +
      +The parabola is \(x=34y^{2}\;(x\ge 0)\).  
      +An intersection point must satisfy  
      +
      +\[
      +y=f(34y^{2}) .
      +\tag{2}
      +\]
      +
      +Put \(x=34y^{2}=4n+t\) with \(t\in[-1,3)\).  
      +From (1) there are two possibilities.
      +
      +---
      +
      +### 1.  \(t=y\)  
      +
      +Then \(-1\le y<1\) and  
      +
      +\[
      +34y^{2}=4n+y\Longrightarrow 34y^{2}-y=4n .
      +\tag{3}
      +\]
      +
      +For each integer \(n\) this quadratic gives the two solutions  
      +
      +\[
      +y=\frac{1\pm\sqrt{1+544n}}{68}.
      +\tag{4}
      +\]
      +
      +Since \(y\in[-1,1)\) the solutions are admissible for every \(n\)
      +for which \(34y^{2}\le 34\).  
      +Because \(0\le34y^{2}\le34\), from \(34y^{2}=4n+t\) with \(t\ge-1\) we get
      +\(0\le4n+3\), i.e. \(n\ge0\); and from \(4n-1\le34\) we obtain \(n\le8\).
      +Thus \(n=0,1,\dots ,8\).  
      +
      +For each \(n\) the sum of the two roots of (3) is  
      +
      +\[
      +\frac{1}{34}.
      +\]
      +
      +Hence the total contribution of this case is  
      +
      +\[
      +9\cdot\frac1{34}=\frac{9}{34}=\frac{18}{68}.
      +\tag{5}
      +\]
      +
      +---
      +
      +### 2.  \(t=2-y\)  
      +
      +Now \(1\le t<3\) which gives \(-1<y\le1\) and  
      +
      +\[
      +34y^{2}=4n+2-y\Longrightarrow 34y^{2}+y-2=4n .
      +\tag{6}
      +\]
      +
      +Its solutions are  
      +
      +\[
      +y=\frac{-1\pm\sqrt{273+544n}}{68}.
      +\tag{7}
      +\]
      +
      +Again \(n=0,1,\dots ,8\).  
      +For \(n=0,\dots ,7\) both roots lie in \((-1,1]\); for \(n=8\) only the
      +‘\(+\)’ root is admissible (the ‘\(-\)’ root is \(<-1\)).  
      +
      +The sum of the two roots of (6) for any \(n\) equals  
      +
      +\[
      +-\frac1{34}.
      +\]
      +
      +Thus the sum of all valid roots of this case is  
      +
      +\[
      +8\!\left(-\frac1{34}\right)+\frac{-1+\sqrt{4625}}{68}
      +   =-\frac{16}{68}+\frac{-1+\sqrt{4625}}{68}
      +   =\frac{-17+\sqrt{4625}}{68}.
      +\tag{8}
      +\]
      +
      +---
      +
      +### 3.  Total sum of the \(y\)–coordinates
      +
      +Adding (5) and (8),
      +
      +\[
      +S=\frac{18}{68}+\frac{-17+\sqrt{4625}}{68}
      +   =\frac{1+\sqrt{4625}}{68}
      +   =\frac{1+5\sqrt{185}}{68}.
      +\]
      +
      +The expression \(\displaystyle\frac{a+b\sqrt{c}}{d}\) has  
      +
      +\[
      +a=1,\;b=5,\;c=185,\;d=68,
      +\]
      +
      +with \(\gcd(a,b,d)=1\) and \(c\) square‑free.
      +
      +Hence  
      +
      +\[
      +a+b+c+d = 1+5+185+68 = 259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +\prod_{k=4}^{63}\frac{\log_k\!\left(5^{k^{2}-1}\right)}{\log_{k+1}\!\left(5^{k^{2}-4}\right)}
      += \prod_{k=4}^{63}
      +\frac{(k^{2}-1)\ln5/\ln k}{(k^{2}-4)\ln5/\ln(k+1)}
      += \prod_{k=4}^{63}\frac{k^{2}-1}{k^{2}-4}\cdot\frac{\ln(k+1)}{\ln k}
      +\]
      +
      +Since \(k^{2}-1=(k-1)(k+1)\) and \(k^{2}-4=(k-2)(k+2)\),
      +
      +\[
      +\frac{k^{2}-1}{k^{2}-4}= \frac{k-1}{k-2}\cdot\frac{k+1}{k+2}.
      +\]
      +
      +Thus
      +
      +\[
      +P=\Bigl(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr)
      +   \Bigl(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr)
      +   \Bigl(\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}\Bigr).
      +\]
      +
      +Each product telescopes:
      +
      +1. \(\displaystyle\prod_{k=4}^{63}\frac{k-1}{k-2}
      +   =\frac{3}{2}\cdot\frac{4}{3}\cdots\frac{62}{61}
      +   =\frac{62}{2}=31.\)
      +
      +2. \(\displaystyle\prod_{k=4}^{63}\frac{k+1}{k+2}
      +   =\frac{5}{6}\cdot\frac{6}{7}\cdots\frac{64}{65}
      +   =\frac{5}{65}=\frac1{13}.\)
      +
      +3. \(\displaystyle\prod_{k=4}^{63}\frac{\ln(k+1)}{\ln k}
      +   =\frac{\ln5}{\ln4}\cdot\frac{\ln6}{\ln5}\cdots\frac{\ln64}{\ln63}
      +   =\frac{\ln64}{\ln4}
      +   =\log_{4}64=3.\)
      +
      +Multiplying,
      +
      +\[
      +P=31\cdot\frac1{13}\cdot3=\frac{93}{13}.
      +\]
      +
      +Thus \(m=93,\;n=13\) (relatively prime) and  
      +
      +\[
      +m+n=93+13=106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Label the unit line segments as follows.
      +
      +\[
      +\begin{array}{c}
      +\text{Top edges: }T_1,T_2\\
      +\text{Bottom edges: }B_1,B_2\\
      +\text{Left edges: }L_1,L_2\\
      +\text{Right edges: }R_1,R_2\\
      +\text{Middle vertical edges: }M_{v1},M_{v2}\\
      +\text{Middle horizontal edges: }M_{h1},M_{h2}
      +\end{array}
      +\]
      +
      +Each of the four unit squares must have exactly two red sides.
      +Let a red edge be denoted by \(1\) and a blue edge by \(0\).
      +Introduce the binary variables  
      +
      +\[
      +\begin{aligned}
      +&a=M_{v1},\;b=M_{v2},\;c=M_{h1},\;d=M_{h2},\\
      +&p=T_1,\;q=T_2,\;r=B_1,\;s=B_2,\\
      +&u=L_1,\;v=L_2,\;w=R_1,\;x=R_2 .
      +\end{aligned}
      +\]
      +
      +The condition “two red sides” for each of the four squares gives four linear
      +equations:
      +
      +\[
      +\begin{cases}
      +p+u+a+c=2\\
      +q+w+a+d=2\\
      +r+v+b+c=2\\
      +s+x+b+d=2\qquad (1)
      +\end{cases}
      +\]
      +
      +All variables are \(0\) or \(1\).
      +
      +--------------------------------------------------------------------
      +### Fix the interior edges
      +
      +The interior edges are the four variables \(a,b,c,d\).
      +For a fixed choice of \((a,b,c,d)\) each equation in (1) involves a
      +different pair of outer edges:
      +
      +\[
      +\begin{aligned}
      +p+u &=2-(a+c),\\
      +q+w &=2-(a+d),\\
      +r+v &=2-(b+c),\\
      +s+x &=2-(b+d).
      +\end{aligned}
      +\tag{2}
      +\]
      +
      +For a pair of binary variables the number of possibilities for a given
      +sum is  
      +
      +\[
      +f(s)=\begin{cases}
      +1 & s=0\text{ or }2,\\[2pt]
      +2 & s=1,\\[2pt]
      +0 & \text{otherwise}.
      +\end{cases}
      +\]
      +
      +Hence, for a fixed interior assignment the number of ways to colour the
      +outer edges equals  
      +
      +\[
      +f\bigl(2-(a+c)\bigr)\,
      +f\bigl(2-(a+d)\bigr)\,
      +f\bigl(2-(b+c)\bigr)\,
      +f\bigl(2-(b+d)\bigr).
      +\]
      +
      +Because \(a,c,b,d\in\{0,1\}\), each sum \(a+c,\;a+d,\;b+c,\;b+d\) is
      +\(0,1,\) or \(2\); consequently the factor is \(2\) exactly when the
      +corresponding pair contains one \(0\) and one \(1\), and it is \(1\) when
      +the pair is equal.  
      +
      +Define
      +
      +\[
      +N(a,b,c,d)=\bigl[ a\ne c\bigr]+\bigl[ a\ne d\bigr]+\bigl[ b\ne c\bigr]
      ++\bigl[ b\ne d\bigr].
      +\]
      +
      +Then the number of outer colourings for that interior choice is
      +\(2^{\,N(a,b,c,d)}\).
      +
      +--------------------------------------------------------------------
      +### Counting all interior choices
      +
      +The four interior bits can be viewed as two binary strings  
      +\(A=(a,b)\) and \(C=(c,d)\).  The quantity \(N\) counts the mismatches
      +between \(A\) and \(C\) over all four cross‑pairs, and one obtains
      +
      +\[
      +N=2\bigl(w_A+w_C-w_Aw_C\bigr),
      +\]
      +where \(w_A=a+b\) and \(w_C=c+d\) are the numbers of 1’s in the strings.
      +
      +From this we get the possible values:
      +
      +* **\(N=0\)** when \(A=C\) (all four interior edges equal).  
      +  Two assignments: \((0,0,0,0)\) and \((1,1,1,1)\).  
      +  Contribution: \(2\cdot2^{0}=2\).
      +
      +* **\(N=4\)** when the two strings are opposite, i.e. \(A=(0,0), C=(1,1)\)
      +  or \(A=(1,1), C=(0,0)\).  
      +  Two assignments.  
      +  Contribution: \(2\cdot2^{4}=32\).
      +
      +* **\(N=2\)** for all remaining \(16-4=12\) interior assignments.  
      +  Contribution: \(12\cdot2^{2}=48\).
      +
      +Adding them gives the total number of colourings
      +
      +\[
      +2+48+32 = 82.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{82}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +Place \(\triangle ABC\) in the plane with  
      +
      +\[
      +A=(0,0),\qquad B=(28,0),\qquad C=(x,y)
      +\]
      +
      +so that \(AB=28\).  
      +The points on the sides are
      +
      +\[
      +\begin{aligned}
      +D&=A+\frac17AB=(4,0), &
      +E&=A+\frac57AB=(20,0),\\
      +F&=A+\frac17AC=\Bigl(\frac{x}{7},\frac{y}{7}\Bigr), &
      +G&=A+\frac57AC=\Bigl(\frac{5x}{7},\frac{5y}{7}\Bigr).
      +\end{aligned}
      +\]
      +
      +(The given lengths give the fractions \(\frac17,\frac57\) on both sides because  
      +
      +\[
      +AD:DE:EB=4:16:8=1:4:2,\qquad 
      +AF:FG:GC=13:52:26=1:4:2 .
      +\])
      +
      +The reflections are
      +
      +\[
      +\begin{aligned}
      +M&=2F-D=\Bigl(\frac{2x}{7}-4,\frac{2y}{7}\Bigr),\\[2mm]
      +N&=2E-G=\Bigl(40-\frac{5x}{7},-\frac{5y}{7}\Bigr).
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Height of the triangle
      +
      +The quadrilateral \(DEGF\) is \(\{D,E,G,F\}\) in that order.  
      +Using the shoelace formula,
      +
      +\[
      +\begin{aligned}
      +[DEGF]
      +&=\frac12\Bigl((4\cdot0+20\cdot\frac{5y}{7}+\frac{5x}{7}\cdot\frac{y}{7}+ \frac{x}{7}\cdot0) \\
      +&\qquad\ -\ (0\cdot20+\;0\cdot\frac{5x}{7}+\frac{5y}{7}\cdot\frac{x}{7}+ \frac{y}{7}\cdot4 )\Bigr)\\[1mm]
      +&=\frac12\Bigl(20\cdot\frac{5y}{7}-4\cdot\frac{y}{7}\Bigr)
      + =\frac{1248}{91}\,\frac{y}{2}= \frac{624}{91}\,y .
      +\end{aligned}
      +\]
      +
      +The problem states \([DEGF]=288\); hence
      +
      +\[
      +\frac{624}{91}\,y=288\qquad\Longrightarrow\qquad y=42 .
      +\]
      +
      +Thus the altitude from \(C\) to \(\overline{AB}\) is \(h=y=42\).
      +
      +--------------------------------------------------------------------
      +### 2.  Area of \(\triangle ABC\)
      +
      +\[
      +[ABC]=\frac12\cdot AB\cdot h=\frac12\cdot 28\cdot 42=14\cdot 42=588.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Area of the heptagon \(AFNBCEM\)
      +
      +Write the vertices in order:
      +
      +\[
      +A,\;F,\;N,\;B,\;C,\;E,\;M .
      +\]
      +
      +Using the coordinates found above (with \(y=42\) and \(\,x=\sqrt{91^{2}-42^{2}}=7\sqrt{133}\)), the
      +shoelace sum is
      +
      +\[
      +\begin{aligned}
      +S&=x_Ay_F-y_Ax_F
      +   +x_Fy_N-y_Fx_N
      +   +x_Ny_B-y_Nx_B
      +   +x_By_C-y_Bx_C
      +   +x_Cy_E-y_Cx_E
      +   +x_Ey_M-y_Ex_M
      +   +x_My_A-y_Mx_A \\[1mm]
      +&=0-240+840+1176-840+240+0=1176 .
      +\end{aligned}
      +\]
      +
      +Hence
      +
      +\[
      +[AFNBCEM]=\frac12\,S=\frac12\cdot1176=588 .
      +\]
      +
      +A vector‑geometry check also shows that the signed sum of the
      +determinants of successive vertices equals \(\det(\overrightarrow{AB},
      +\overrightarrow{AC})\), i.e. the area of \(\triangle ABC\).
      +
      +--------------------------------------------------------------------
      +### 4.  Answer
      +
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Factor  
      +\[
      +2025=3^{4}\cdot5^{2}.
      +\]
      +
      +A divisor of \(2025\) is \(3^{i}5^{j}\) with \(0\le i\le4,\;0\le j\le2\).  
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +---
      +
      +### When does a subset have lcm \(2025\)?
      +
      +The lcm of a set of divisors takes, for each prime, the **maximum** exponent appearing among the chosen numbers.
      +
      +Thus a subset \(B\subseteq A\) has \(\operatorname{lcm}(B)=3^{4}5^{2}=2025\) iff  
      +
      +* at least one element of \(B\) has exponent \(4\) of the prime \(3\);
      +* at least one element of \(B\) has exponent \(2\) of the prime \(5\).
      +
      +Define  
      +
      +\[
      +S_{3}=\{3^{4}5^{j}\mid j=0,1,2\}=\{81,405,2025\},
      +\qquad
      +S_{5}=\{3^{i}5^{2}\mid i=0,1,2,3,4\}
      + =\{25,75,225,675,2025\}.
      +\]
      +
      +\(|S_{3}|=3,\ |S_{5}|=5,\) and \(|S_{3}\cap S_{5}|=1\) (the element \(2025\)).
      +
      +So we need subsets that intersect **both** \(S_{3}\) and \(S_{5}\).
      +
      +---
      +
      +### Counting such subsets
      +
      +Total subsets of \(A\): \(2^{15}\).
      +
      +Let  
      +
      +* \(A_{3}\) = subsets containing **no** element of \(S_{3}\).  
      +  \(|A_{3}| = 2^{15-3}=2^{12}\).
      +
      +* \(A_{5}\) = subsets containing **no** element of \(S_{5}\).  
      +  \(|A_{5}| = 2^{15-5}=2^{10}\).
      +
      +* \(A_{3}\cap A_{5}\) = subsets containing none of \(S_{3}\cup S_{5}\).  
      +  \(|S_{3}\cup S_{5}| = 3+5-1 = 7\), so  
      +  \(|A_{3}\cap A_{5}| = 2^{15-7}=2^{8}\).
      +
      +By inclusion–exclusion, the number of subsets intersecting both \(S_{3}\) and \(S_{5}\) is  
      +
      +\[
      +2^{15} - 2^{12} - 2^{10} + 2^{8}
      + = 32768 - 4096 - 1024 + 256
      + = 27904.
      +\]
      +
      +Every such subset is non‑empty, so these are exactly the favorable subsets.
      +
      +---
      +
      +### Probability
      +
      +\[
      +\text{Probability}
      + = \frac{27904}{2^{15}}
      + = \frac{27904}{32768}
      + = \frac{109}{128}
      +\]
      +(after reducing the fraction).
      +
      +Thus \(m=109,\ n=128\) and  
      +
      +\[
      +m+n = 109+128 = 237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +* \(O\) be the centre of \(\omega _2\) (radius \(15\)),
      +* \(A\) be the centre of \(\omega _1\) (radius \(6\)),
      +* \(B\) the point where the two circles are internally tangent,
      +* \(C\) the antipode of \(B\) on \(\omega_2\) (\(BC\) is a diameter),
      +* \(D\) the point on \(\omega _2\) with \(AD\perp BC\).
      +
      +--------------------------------------------------------------------
      +### 1.  Choose coordinates  
      +
      +Place \(O\) at the origin and let the diameter \(BC\) be horizontal.
      +
      +\[
      +B=(15,0),\qquad C=(-15,0)
      +\]
      +
      +Since \(OA=15-6=9\) and \(A\) lies on \(OB\),
      +
      +\[
      +A=(9,0).
      +\]
      +
      +The line \(AD\) is perpendicular to the horizontal line \(BC\), so \(AD\) is the
      +vertical line through \(A\); intersecting \(\omega_2\) gives
      +
      +\[
      +D=(9,12)\quad\text{or}\quad D=(9,-12).
      +\]
      +
      +Because the rectangle will be placed above the centre of \(\omega_1\), we take  
      +
      +\[
      +D=(9,12).
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Describe the rectangle  
      +
      +Since the rectangle is **inscribed** in \(\omega_1\), all four of its vertices lie on
      +\(\omega_1\).  
      +Let the rectangle have centre at \(A\); because a rectangle’s circum‑centre is
      +the intersection of its diagonals, the centre must be the centre of the
      +circumscribing circle \(\omega_1\).
      +
      +Let  
      +
      +* half‑width \(w\) (distance from the centre to the right–hand side),
      +* half‑height \(h\) (distance from the centre to the top side).
      +
      +Then  
      +
      +\[
      +\begin{aligned}
      +x_R&=9+w, & x_L&=9-w,\\
      +y_T&=h,   & y_B&=-h .
      +\end{aligned}
      +\]
      +
      +The vertices are  
      +
      +\[
      +\begin{aligned}
      +E&(x_R,y_B)=(9+w,-h),\\
      +F&(x_R,y_T)=(9+w, h),\\
      +G&(x_L,y_T)=(9-w, h),\\
      +H&(x_L,y_B)=(9-w,-h).
      +\end{aligned}
      +\]
      +
      +Because the vertices lie on \(\omega_1\) (radius \(6\)),
      +
      +\[
      +w^{2}+h^{2}=6^{2}=36\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Use the area condition  
      +
      +The problem states that  
      +
      +\[
      +\text{Area}\,\triangle DGF=\text{Area}\,\triangle CHG .
      +\]
      +
      +*Triangle \(DGF\).*  
      +Its base is \(GF\) (the top side of the rectangle) of length \(2w\).  
      +Its height is the vertical distance from \(D\) to the line \(y=h\):
      +\(\;12-h\). Hence  
      +
      +\[
      +[\triangle DGF]=\tfrac12(2w)(12-h)=w(12-h).\tag{2}
      +\]
      +
      +*Triangle \(CHG\).*  
      +Its base is \(HG\) (the left side) of length \(2h\).  
      +The distance from \(C\) to the vertical line \(x=9-w\) is
      +\((9-w)-(-15)=24-w\). Therefore  
      +
      +\[
      +[\triangle CHG]=\tfrac12(2h)(24-w)=h(24-w).\tag{3}
      +\]
      +
      +Equating (2) and (3),
      +
      +\[
      +w(12-h)=h(24-w).\tag{4}
      +\]
      +
      +Expanding both sides gives  
      +
      +\[
      +12w-wh=24h-wh\Longrightarrow 12w=24h\Longrightarrow w=2h.\tag{5}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Solve for \(w\) and \(h\)
      +
      +Substituting \(w=2h\) into (1):
      +
      +\[
      +(2h)^2+h^2=36\quad\Longrightarrow\quad5h^{2}=36\quad\Longrightarrow\quad
      +h^{2}= \frac{36}{5},\qquad
      +h=\frac{6}{\sqrt5}=\frac{6\sqrt5}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +w=2h=\frac{12}{\sqrt5}= \frac{12\sqrt5}{5}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Area of the rectangle  
      +
      +The rectangle’s side lengths are \(2w\) and \(2h\), so its area is  
      +
      +\[
      +\text{Area}= (2w)(2h)=4wh=4\cdot(2h)h=8h^{2}
      +          =8\left(\frac{36}{5}\right)=\frac{288}{5}.
      +\]
      +
      +Thus the area is \(\displaystyle \frac{288}{5}\).
      +The numerator and denominator are relatively prime, so  
      +
      +\[
      +m=288,\qquad n=5,\qquad m+n=288+5=293.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Regions created by chords**
      +
      +If we start with a disc (one region) and draw a chord, the number of regions increases by  
      +
      +\[
      +\text{(number of interior intersections created by the new chord)}+1 .
      +\]
      +
      +Hence after drawing \(k\) chords the number of regions is  
      +
      +\[
      +R=1+k+I ,
      +\]
      +
      +where \(I\) is the total number of interior intersection points of the drawn chords (no three chords meet at a single interior point, which holds a.s. for random chords).
      +
      +In our problem \(k=27\) (the two diameters plus the 25 random chords), so  
      +
      +\[
      +R=28+I .
      +\]
      +
      +Thus we only need the expected value of \(I\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 2.  Intersections involving the two fixed diameters**
      +
      +The two diameters intersect at the centre, contributing a deterministic intersection  
      +
      +\[
      +I_{\text{centre}}=1 .
      +\]
      +
      +A random chord intersects the **vertical** diameter iff its endpoints lie in opposite halves of the disc, i.e. one endpoint in \(\{Q_1,Q_4\}\) and the other in \(\{Q_2,Q_3\}\).  
      +Among the six possible unordered quadrant‑pairs for a chord, four satisfy this condition, so
      +
      +\[
      +P(\text{vertical intersection})=\frac{4}{6}=\frac23 .
      +\]
      +
      +The same reasoning holds for the **horizontal** diameter, giving  
      +
      +\[
      +P(\text{horizontal intersection})=\frac23 .
      +\]
      +
      +Hence for the 25 random chords
      +
      +\[
      +E[I_{\text{vert}}]=25\cdot\frac23=\frac{50}{3},\qquad   
      +E[I_{\text{horiz}}]=25\cdot\frac23=\frac{50}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3.  Intersections among the 25 random chords**
      +
      +Two random chords are independent.  
      +Each chord chooses an unordered pair of distinct quadrants uniformly from the six possibilities  
      +
      +\[
      +\{1,2\},\{2,3\},\{3,4\},\{4,1\} \ (\text{adjacent}),\qquad
      +\{1,3\},\{2,4\}\ (\text{opposite}).
      +\]
      +
      +Let the unordered pairs be \(S\) and \(T\).  
      +Their intersection size can be
      +
      +* **2** (the same pair) – probability \(1/6\);
      +* **1** (they share exactly one quadrant) – probability \(2/3\);
      +* **0** (disjoint) – probability \(1/6\).
      +
      +The disjoint case splits further:
      +
      +* Adjacent–adjacent (e.g. \(\{1,2\}\) with \(\{3,4\}\)) – chords never intersect.
      +* Opposite–opposite (e.g. \(\{1,3\}\) with \(\{2,4\}\)) – chords always intersect.
      +
      +Among the three unordered disjoint pairs, two are adjacent–adjacent and one is opposite–opposite; hence for ordered pairs
      +
      +\[
      +P(\text{disjoint, intersect})=\frac{2}{36}=\frac1{18},\qquad
      +P(\text{disjoint, no intersect})=\frac{4}{36}.
      +\]
      +
      +For the other two situations one can check (by considering the relative order of the points inside the quadrants) that
      +
      +* If the two chords have the **same** unordered pair (adjacent or opposite), the probability they intersect is \(\tfrac12\).
      +* If they **share exactly one quadrant**, the probability they intersect is also \(\tfrac12\).
      +
      +Collecting the contributions,
      +
      +\[
      +\begin{aligned}
      +P(\text{intersection}) &=
      +\underbrace{\frac{6}{36}\cdot\frac12}_{\text{same pair}}
      ++\underbrace{\frac{24}{36}\cdot\frac12}_{\text{share one quadrant}}
      ++\underbrace{\frac{2}{36}\cdot1}_{\text{disjoint opposite}}\\[2mm]
      +&=\frac{3}{36}+\frac{12}{36}+\frac{2}{36}
      +=\frac{17}{36}.
      +\end{aligned}
      +\]
      +
      +Thus for any unordered pair of the 25 random chords
      +
      +\[
      +p:=P(\text{they intersect})=\frac{17}{36}.
      +\]
      +
      +There are \(\binom{25}{2}=300\) such pairs, so
      +
      +\[
      +E[I_{\text{random}}]=300\cdot\frac{17}{36}
      +=\frac{300}{36}\cdot17
      +=\frac{25}{3}\cdot17
      +=\frac{425}{3}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4.  Expected total number of interior intersections**
      +
      +\[
      +\begin{aligned}
      +E[I] &= I_{\text{centre}}
      +      +E[I_{\text{vert}}]
      +      +E[I_{\text{horiz}}]
      +      +E[I_{\text{random}}]  \\[2mm]
      +     &=1+\frac{50}{3}+\frac{50}{3}+\frac{425}{3} \\[2mm]
      +     &=1+\frac{525}{3}=1+175=176 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5.  Expected number of regions**
      +
      +\[
      +E[R]=28+E[I]=28+176=204 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Outline**
      +
      +1.  Transform the recurrence for \(x_k\) into a simpler one.
      +
      +   Define  
      +
      +   \[
      +   w_k=\frac{x_k-1}{x_k+1}\quad\Longleftrightarrow\quad 
      +   x_k=\frac{1+w_k}{1-w_k}.
      +   \]
      +
      +   Substituting in  
      +
      +   \[
      +   x_{k+1}= \frac13\Bigl(x_k+\frac1{x_k}-1\Bigr)
      +   \]
      +
      +   gives after simplification  
      +
      +   \[
      +   w_{k+1}= \frac{3w_k^2-1}{2}. \tag{1}
      +   \]
      +
      +   The initial value is  
      +
      +   \[
      +   w_1=\frac{25/11-1}{25/11+1}=\frac{7}{18}.
      +   \]
      +
      +2.  Write \(w_k=\dfrac{a_k}{b_k}\) in lowest terms
      +   (\(a_k\) odd, \(b_k\) even).  
      +
      +   From (1),
      +
      +   \[
      +   w_{k+1}= \frac{3a_k^2-b_k^2}{2b_k^2}.
      +   \]
      +
      +   Because \(a_k\) is not divisible by 3, the numerator is always
      +   \(\equiv 3\pmod 9\); hence it contains exactly one factor 3.
      +   After canceling this factor we obtain
      +
      +   \[
      +   a_{k+1}= \frac{3a_k^2-b_k^2}{3},\qquad
      +   b_{k+1}= \frac{2b_k^2}{3}.
      +   \tag{2}
      +   \]
      +
      +   Consequently  
      +
      +   \[
      +   b_{k+1}= \frac{2}{3}b_k^{\,2}. \tag{3}
      +   \]
      +
      +3.  Determine a closed form for \(b_k\).
      +
      +   Write \(b_k=2^{\alpha_k}3^{\beta_k}\).
      +   From (3)
      +
      +   \[
      +   2^{\alpha_{k+1}}3^{\beta_{k+1}}
      +   =\frac{2}{3}\bigl(2^{\alpha_k}3^{\beta_k}\bigr)^2
      +   =2^{2\alpha_k+1}3^{2\beta_k-1},
      +   \]
      +
      +   whence  
      +
      +   \[
      +   \alpha_{k+1}=2\alpha_k+1,\qquad
      +   \beta_{k+1}=2\beta_k-1,
      +   \]
      +   with \(\alpha_1=1,\ \beta_1=2\).
      +
      +   Solving these linear recurrences gives  
      +
      +   \[
      +   \alpha_k = 2^{\,k}-1,\qquad
      +   \beta_k = 2^{\,k-1}+1 .
      +   \]
      +
      +   Therefore  
      +
      +   \[
      +   b_k = 2^{\,2^{k}-1}\,3^{\,2^{k-1}+1}. \tag{4}
      +   \]
      +
      +4.  Recover \(x_k\) from \(w_k\).
      +
      +   Since \(x_k=\dfrac{1+w_k}{1-w_k}\) and \(w_k=\dfrac{a_k}{b_k}\),
      +
      +   \[
      +   x_k=\frac{b_k+a_k}{\,b_k-a_k\,}= \frac{m_k}{n_k},
      +   \]
      +   where \(m_k=b_k+a_k,\ n_k=b_k-a_k\).  
      +   Because \(a_k\) is odd and \(b_k\) is even, \(m_k\) and \(n_k\) are odd,
      +   so \(\gcd(m_k,n_k)=1\).
      +
      +   Hence
      +
      +   \[
      +   m_k+n_k = (b_k+a_k)+(b_k-a_k)=2b_k.
      +   \]
      +
      +5.  Compute \(m_{2025}+n_{2025}\pmod{1000}\).
      +
      +   From (4),
      +
      +   \[
      +   b_{2025}=2^{\,2^{2025}-1}\,3^{\,2^{2024}+1},
      +   \qquad
      +   m_{2025}+n_{2025}=2b_{2025}
      +   =2^{\,2^{2025}}\,3^{\,2^{2024}+1}.
      +   \]
      +
      +   We need this value modulo \(1000=2^3\cdot5^3\).
      +
      +   *Modulo 8:* the exponent of 2 is at least 3, so the whole product
      +   is \(0\pmod8\).
      +
      +   *Modulo 125:* use Euler’s theorem (\(\phi(125)=100\)):
      +   \[
      +   2^{2^{2025}}\equiv2^{\,32}\pmod{125},\qquad
      +   3^{2^{2024}+1}\equiv3^{\,17}\pmod{125},
      +   \]
      +   because \(2^{2025}\equiv32\) and \(2^{2024}+1\equiv17\pmod{100}\).
      +
      +   Computing,
      +   \[
      +   2^{32}\equiv46,\qquad 3^{17}\equiv38\pmod{125},
      +   \]
      +   so
      +   \[
      +   2^{2^{2025}}3^{2^{2024}+1}\equiv46\cdot38\equiv123\pmod{125}.
      +   \]
      +
      +   Solve the simultaneous congruences
      +   \[
      +   X\equiv0\pmod8,\qquad X\equiv123\pmod{125}.
      +   \]
      +   Writing \(X=125a+123\) and using \(125\equiv5\pmod8\) gives
      +   \(5a+3\equiv0\pmod8\Rightarrow a\equiv1\pmod8\).
      +   Hence \(X=125\cdot1+123=248\).
      +
      +   Therefore  
      +
      +   \[
      +   m_{2025}+n_{2025}\equiv\boxed{248}\pmod{1000}.
      +   \]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +f(x)=\sin\bigl(7\pi\sin (5x)\bigr)
      +\]
      +
      +The zeros of \(f\) occur when the inner sine gives an integer multiple of \(\pi\):
      +
      +\[
      +\sin\bigl(7\pi\sin (5x)\bigr)=0\Longleftrightarrow 7\pi\sin(5x)=k\pi
      +\Longleftrightarrow \sin(5x)=\frac{k}{7},
      +\qquad k\in\mathbb Z .
      +\]
      +
      +Because \(\sin(5x)\in[-1,1]\), \(|k|\le7\); thus \(k=-7,-6,\dots ,6,7\).
      +
      +---
      +
      +### 1.  Counting the zeros  
      +
      +Set \(\theta =5x\).  
      +When \(x\in(0,2\pi)\) we have \(\theta\in(0,10\pi)\).
      +
      +For each admissible integer \(k\) we need the number of solutions of  
      +
      +\[
      +\sin\theta=\frac{k}{7},\qquad \theta\in(0,10\pi).
      +\]
      +
      +* **\(k=0\):** \(\sin\theta=0\Rightarrow\theta=n\pi\).  
      +  Inside \((0,10\pi)\) we have \(n=1,2,\ldots ,9\) → **9 solutions**.
      +
      +* **\(k=\pm 7\):** \(\sin\theta=\pm1\).  
      +  \(\sin\theta=1\) gives \(\theta=\dfrac{\pi}{2}+2\pi n\);  
      +  \(\sin\theta=-1\) gives \(\theta=\dfrac{3\pi}{2}+2\pi n\).  
      +  For \(0<\theta<10\pi\) each yields \(n=0,1,2,3,4\) → **5 solutions** for \(k=7\) and **5** for \(k=-7\).
      +
      +* **\(k=\pm1,\pm2,\dots ,\pm6\):** \(|k|<7\) so \(-1<k/7<1\) and \(\neq0\).  
      +  In each full period \([0,2\pi]\) the equation \(\sin\theta=c\) (\(|c|<1\)) has two solutions.  
      +  The interval \((0,10\pi)\) contains five full periods, hence **\(5\times2=10\) solutions** for each of these 12 values of \(k\).
      +
      +Summing all contributions  
      +
      +\[
      +\begin{aligned}
      +n &=\underbrace{9}_{k=0}
      +   +\underbrace{5+5}_{k=\pm7}
      +   +\underbrace{12\times10}_{k=\pm1,\dots,\pm6}\\[2mm]
      +  &=9+10+120 = 139 .
      +\end{aligned}
      +\]
      +
      +Thus there are \(\boxed{139}\) zeros of \(f\) in \((0,2\pi)\).
      +
      +---
      +
      +### 2.  Zeros where the graph is tangent to the \(x\)-axis  
      +
      +A point where the graph touches the \(x\)-axis must satisfy  
      +
      +\[
      +f(x)=0\quad\text{and}\quad f'(x)=0.
      +\]
      +
      +From \(f(x)=0\) we have \(\sin(5x)=k/7\) as above.  
      +Compute the derivative:
      +
      +\[
      +\begin{aligned}
      +f'(x) &=\cos\bigl(7\pi\sin(5x)\bigr)\cdot 7\pi\cdot 5\cos(5x)   \\
      +      &=35\pi\cos\bigl(7\pi\sin(5x)\bigr)\cos(5x).
      +\end{aligned}
      +\]
      +
      +Thus \(f'(x)=0\) iff \(\cos(5x)=0\) (the factor \(\cos\bigl(7\pi\sin(5x)\bigr)\) never vanishes at a zero, because
      +\(\cos(k\pi)=\pm1\)).  
      +
      +\[
      +\cos(5x)=0\Longrightarrow 5x=\frac{\pi}{2}+n\pi\quad\Longrightarrow\quad\sin(5x)=\pm1.
      +\]
      +
      +Hence the tangential zeros correspond exactly to the solutions of \(\sin(5x)=\pm1\), i.e. the cases \(k=\pm7\).
      +
      +We already counted these:  
      +
      +* \(\sin(5x)=1\) gives \(5\) solutions,
      +* \(\sin(5x)=-1\) gives \(5\) solutions.
      +
      +Therefore  
      +
      +\[
      +t = 5+5 = 10 .
      +\]
      +
      +(Indeed, at these points \(f'(x)=0\) and \(f''(x)\neq0\), so the graph just touches the axis.)
      +
      +---
      +
      +### 3.  Required sum  
      +
      +\[
      +n+t = 139 + 10 = \boxed{149}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +N=25q+r ,\qquad 0\le r<25 .
      +\]
      +
      +The greedy algorithm first takes \(q\) coins of 25 ¢, then  
      +\(t=\big\lfloor r/10\big\rfloor\) coins of 10 ¢ and finally  
      +\(s=r-10t\) pennies.  
      +
      +\[
      +\text{Greedy coins}=C_g(N)=q+t+s.
      +\]
      +
      +---
      +
      +### 1.  What is an optimal representation?
      +
      +If a representation uses \(a\) 25‑cent coins, \(b\) 10‑cent coins and \(c\) pennies, then  
      +
      +\[
      +25a+10b+c=N,\qquad a,b,c\ge0,
      +\]
      +and the number of coins is  
      +
      +\[
      +C= a+b+c = N-(24a+9b).
      +\]
      +
      +Thus **minimising the number of coins is equivalent to maximising**  
      +
      +\[
      +P=24a+9b \qquad\text{subject to}\qquad 25a+10b\le N .
      +\]
      +
      +The “profit’’ per cent is larger for a 25‑cent coin \((24/25)\) than for a 10‑cent coin \((9/10)\); therefore an optimal solution will use as many 25‑cent coins as possible unless removing a 25‑cent coin allows us to add enough 10‑cent coins to increase the profit.
      +
      +---
      +
      +### 2.  Effect of removing \(k\) quarters
      +
      +Let us replace \(k\) quarters by 10‑cent coins.  
      +Write \(r=10u+v\;(0\le v\le 9)\).  
      +After removing \(k\) quarters, the remainder becomes  
      +
      +\[
      +R=r+25k=10u+v+25k .
      +\]
      +
      +The maximal number of dimes that can be added is  
      +
      +\[
      +b'=\big\lfloor \frac{R}{10}\big\rfloor
      +   =u+ \big\lfloor 2.5k+\tfrac{v}{10}\big\rfloor .
      +\]
      +
      +The change in profit is
      +
      +\[
      +\Delta P
      +=-24k+9\big(b'-\big\lfloor r/10\big\rfloor\big)
      +=-6k+9\Big\lfloor\frac{k}{2}\Big\rfloor+9\delta ,
      +\]
      +
      +where  
      +
      +\[
      +\delta=
      +\begin{cases}
      +1 &\text{if }k\text{ is odd and }v\ge5,\\
      +0 &\text{otherwise.}
      +\end{cases}
      +\]
      +
      +*If \(k\) is even*, \(\Delta P=-3k/2<0\); the profit never increases.  
      +
      +*If \(k\) is odd*, write \(k=2m+1\). Then  
      +
      +\[
      +\Delta P=9\delta-(3m+6).
      +\]
      +
      +The only way \(\Delta P>0\) is when \(m=0\) (i.e. \(k=1\)) and \(\delta=1\),
      +which occurs exactly when  
      +
      +\[
      +v=r\bmod 10\ge5 .
      +\]
      +
      +Hence **the greedy algorithm fails precisely when**
      +\[
      +N\ge 25\quad\text{and}\quad (N\bmod 25)\bmod 10\ge5.
      +\]
      +
      +Equivalently, the “bad’’ remainders (after taking as many quarters as possible) are  
      +
      +\[
      +r\in\{5,6,7,8,9,15,16,17,18,19\}.
      +\]
      +
      +In each block of 25 consecutive integers there are 10 such remainders.
      +
      +---
      +
      +### 3.  Counting the failures between 1 and 1000
      +
      +The interval \([25,1000]\) contains \(1000-24=976\) integers.
      +From 25 onward the numbers are grouped into blocks  
      +
      +\[
      +25\!-\!49,\;50\!-\!74,\;\dots,\;975\!-\!999 .
      +\]
      +
      +There are \(39\) full blocks (the block \(25\!-\!49\) up to \(975\!-\!999\)).
      +Each block contributes exactly \(10\) failures, so
      +
      +\[
      +\#\text{failures}=39\times10=390 .
      +\]
      +
      +Numbers \(1\) through \(24\) are never failures (they contain no quarters).
      +
      +Thus the number of successes is  
      +
      +\[
      +1000-390=610 .
      +\]
      +
      +---
      +
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      In a regular \(24\)-gon label the vertices \(0,1,\dots ,23\) clockwise.  
      +If two vertices differ by \(k\) (mod \(24\)), the chord joining them has length that depends only on  
      +
      +\[
      +s=\min (k,24-k)\qquad (1\le s\le 12).
      +\]
      +
      +Thus there are \(12\) possible lengths, one for each \(s=1,2,\dots ,12\).
      +
      +--------------------------------------------------------------------
      +### 1.  The graph of chords of a fixed length  
      +
      +Fix a value \(s\).  The set of all chords of that length is the edge‑set of the **circulant graph**
      +\[
      +G_s=\{\,\{i,i+s\}\mid i=0,1,\dots ,23\,\},
      +\]
      +where the addition is taken modulo \(24\).
      +
      +Let \(g=\gcd(s,24)\).  Adding \(s\) repeatedly splits the vertex set into \(g\) cycles,
      +each of length  
      +
      +\[
      +L=\frac{24}{g}.
      +\]
      +
      +So \(G_s\) is a disjoint union of \(g\) cycles \(C_L\).
      +
      +--------------------------------------------------------------------
      +### 2.  When can a perfect matching exist?
      +
      +A perfect matching (a set of \(12\) disjoint edges covering all vertices) can exist only if
      +every component cycle has even length, i.e. \(L\) is even.
      +Since \(L=24/g\), this is equivalent to \(g\mid 12\).
      +
      +*If \(g\mid 12\) and \(L\ge 4\)*, each even cycle \(C_L\) has exactly **2** perfect
      +matchings (choose alternating edges).  
      +*If \(L=2\)* (the case \(s=12\)), each component is a single edge and contributes only **1** matching.
      +
      +The only step for which \(g\nmid 12\) is \(s=8\) (here \(g=8\) and the components are 3‑cycles),
      +so no perfect matching exists for \(s=8\).
      +
      +--------------------------------------------------------------------
      +### 3.  Number of matchings for each possible length
      +
      +\[
      +\begin{array}{c|c|c|c}
      +s & g=\gcd(s,24) & L=24/g & \#\text{ matchings}\\ \hline
      +1 &1 &24 &2\\
      +2 &2 &12 &2^{2}=4\\
      +3 &3 & 8 &2^{3}=8\\
      +4 &4 & 6 &2^{4}=16\\
      +5 &1 &24 &2\\
      +6 &6 & 4 &2^{6}=64\\
      +7 &1 &24 &2\\
      +8 &8 & 3 &0\\
      +9 &3 & 8 &2^{3}=8\\
      +10&2 &12 &2^{2}=4\\
      +11&1 &24 &2\\
      +12&12& 2 &1
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Total number of ways
      +
      +Add the numbers for all admissible lengths (all \(s\) except \(s=8\)):
      +
      +\[
      +\begin{aligned}
      +\text{Total}&=2+4+8+16+2+64+2+8+4+2+1\\
      +&=113 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{113}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The chairs can be represented by a binary string of length 16, where a \(1\) means the chair is taken.  
      +We need strings with exactly eight \(1\)’s and with **no three consecutive \(1\)’s** (otherwise the middle person would sit next to two others).
      +
      +---
      +
      +### Counting by blocks
      +
      +A valid string consists of blocks of consecutive \(1\)’s of length 1 or 2, separated by at least one \(0\).
      +
      +Let  
      +
      +* \(t\) = number of blocks of length 2,  
      +* \(b\) = total number of blocks.  
      +
      +Since each block contributes at least one \(1\),
      +
      +\[
      +\underbrace{(b-t)}_{\text{blocks of length 1}}+2t=8\quad\Longrightarrow\quad b+ t=8,\; b=8-t .
      +\]
      +
      +So \(t=0,1,2,3,4\).
      +
      +For a fixed \(t\):
      +* Choose which of the \(b\) blocks are the length‑2 ones: \(\displaystyle\binom{b}{t}=\binom{8-t}{t}\).
      +* There are \(8-8=8\) empty chairs; let \(z=8\).  
      +  The \(b+1\) gaps (including the two ends) must contain these zeros, with at least one zero in each interior gap.  
      +  After placing one zero in each of the \(b-1\) interior gaps, we have \(z-(b-1)=9-b\) zeros left to distribute freely among the \(b+1\) gaps.  
      +  The number of ways is \(\displaystyle\binom{9-b}{b}=\binom{9}{b}\).
      +
      +Hence for each \(t\),
      +
      +\[
      +N_t=\binom{8-t}{t}\binom{9}{8-t}.
      +\]
      +
      +Summing over \(t=0\) to \(4\):
      +
      +\[
      +\begin{aligned}
      +N &=\binom{8}{0}\binom{9}{8}
      +   +\binom{7}{1}\binom{9}{7}
      +   +\binom{6}{2}\binom{9}{6}
      +   +\binom{5}{3}\binom{9}{5}
      +   +\binom{4}{4}\binom{9}{4} \\[2mm]
      +  &=1\cdot9+7\cdot36+15\cdot84+10\cdot126+1\cdot126\\
      +  &=9+252+1260+1260+126\\
      +  &=2907 .
      +\end{aligned}
      +\]
      +
      +---
      +
      +### Modulo 1000
      +
      +\[
      +2907 \equiv 907 \pmod{1000}.
      +\]
      +
      +---
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +r_i=A_1A_i\qquad (i=2,\dots ,11),\qquad 
      +\theta=\angle A_iA_1A_{i+1}.
      +\]
      +
      +For each \(i=2,\dots ,10\)
      +
      +\[
      +\cos\theta=\frac{12}{13},\qquad 
      +\text{Area}(A_iA_1A_{i+1})=\frac12 r_i r_{i+1}\sin\theta =1 .
      +\]
      +
      +Since \(\sin\theta=\sqrt{1-\cos ^2\theta}=5/13\),
      +
      +\[
      +r_i r_{i+1}= \frac{2}{\sin\theta}= \frac{2}{5/13}= \frac{26}{5}
      +=:k\quad\text{(constant)}.
      +\]
      +
      +Thus  
      +
      +\[
      +r_{i+1}= \frac{k}{r_i},\qquad\text{so}\qquad r_{i+2}=r_i .
      +\]
      +
      +Hence the distances from \(A_1\) alternate:
      +
      +\[
      +r_2=r_4=r_6=r_8=r_{10}=a,\qquad  
      +r_3=r_5=r_7=r_9=r_{11}=b,
      +\]
      +
      +with  
      +
      +\[
      +ab=k=\frac{26}{5}.
      +\]
      +
      +--------------------------------------------------------------------
      +### Length of a side \(A_iA_{i+1}\)
      +
      +For any consecutive pair \((a,b)\),
      +
      +\[
      +A_iA_{i+1}=d=\sqrt{a^2+b^2-2ab\cos\theta}
      +           =\sqrt{a^2+b^2-\frac{24}{13}ab}.
      +\]
      +
      +Let  
      +
      +\[
      +x=a+b,\qquad ab=k .
      +\]
      +
      +Because \(a^2+b^2=(a+b)^2-2ab=x^2-2k\),
      +
      +\[
      +d=\sqrt{x^2-2k-\frac{24}{13}k}
      +   =\sqrt{x^2-\frac{50}{13}\,k}.
      +\]
      +
      +Since \(k=\dfrac{26}{5}\),
      +
      +\[
      +\frac{50}{13}k=\frac{50}{13}\cdot\frac{26}{5}=20,
      +\qquad\boxed{d=\sqrt{x^2-20}} .
      +\]
      +
      +--------------------------------------------------------------------
      +### Using the perimeter
      +
      +The perimeter of the 11‑gon is
      +
      +\[
      +a+b+9d = x+9\sqrt{x^2-20}=20 .
      +\]
      +
      +Solve for \(x\) (note \(x>0\) and \(\sqrt{x^2-20}\ge0\)):
      +
      +\[
      +9\sqrt{x^2-20}=20-x\quad\Longrightarrow\quad
      +81(x^2-20)=(20-x)^2 .
      +\]
      +
      +This gives  
      +
      +\[
      +80x^2+40x-2020=0\;\Longrightarrow\;4x^2+2x-101=0.
      +\]
      +
      +Hence  
      +
      +\[
      +x=\frac{-2\pm\sqrt{4+1616}}{8}
      +  =\frac{-2\pm18\sqrt5}{8}
      +  =\frac{-1\pm9\sqrt5}{4}.
      +\]
      +
      +Only the positive root satisfies the constraints, so  
      +
      +\[
      +\boxed{x=a+b=\frac{9\sqrt5-1}{4}} .
      +\]
      +
      +Thus
      +
      +\[
      +A_1A_2+A_1A_{11}=a+b=\frac{9\sqrt5-1}{4}
      +    =\frac{m\sqrt n-p}{q},
      +\]
      +
      +with \(m=9,\;n=5,\;p=1,\;q=4\).
      +
      +All conditions on \(m,n,p,q\) are met, and
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      In base \(b\) the numbers are  
      +
      +\[
      +17_{b}=1\cdot b+7=b+7, \qquad 97_{b}=9\cdot b+7=9b+7 .
      +\]
      +
      +We need \(b+7\) to divide \(9b+7\).
      +
      +---
      +
      +### Find the divisibility condition  
      +
      +\[
      +9b+7 = 9(b+7)-56 .
      +\]
      +
      +Thus the remainder when \(9b+7\) is divided by \(b+7\) is \(-56\).  
      +Hence \(b+7\) must divide \(56\):
      +
      +\[
      +b+7\mid 56 .
      +\]
      +
      +---
      +
      +### Possible values of \(b\)
      +
      +The positive divisors of \(56\) are  
      +
      +\[
      +1,\;2,\;4,\;7,\;8,\;14,\;28,\;56 .
      +\]
      +
      +Because the base must satisfy \(b>9\), we have \(b+7>16\).  
      +The divisors larger than \(16\) are \(28\) and \(56\).
      +
      +\[
      +\begin{aligned}
      +b+7&=28 \quad\Longrightarrow\quad b=21,\\[2pt]
      +b+7&=56 \quad\Longrightarrow\quad b=49 .
      +\end{aligned}
      +\]
      +
      +Both bases are greater than \(9\) and allow the digits \(1,7,9\).
      +
      +---
      +
      +### Sum of all such bases  
      +
      +\[
      +21+49 = 70.
      +\]
      +
      +\[
      +\boxed{70}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 70

      +

      Extracted Answer: 70

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The numbers of players picking chocolate, vanilla and strawberry are  
      +
      +\[
      +a=\#\text{chocolate},\qquad b=\#\text{vanilla},\qquad c=\#\text{strawberry}
      +\]
      +
      +with  
      +
      +\[
      +a+b+c=9,\qquad a>b>c\ge1 .
      +\]
      +
      +Hence \((a,b,c)\) must be three distinct positive integers whose sum is \(9\).  
      +The possible triples (written in decreasing order) are  
      +
      +\[
      +(6,2,1),\;(5,3,1),\;(4,3,2).
      +\]
      +
      +For a fixed triple \((a,b,c)\) the players are distinct, so the number of assignments
      +is the multinomial coefficient  
      +
      +\[
      +\binom{9}{a,b,c}= \frac{9!}{a!\,b!\,c!}.
      +\]
      +
      +Compute each term:
      +
      +\[
      +\begin{aligned}
      +(6,2,1):&\quad \frac{9!}{6!\,2!\,1!}= \frac{362880}{720\cdot2}=252,\\[2mm]
      +(5,3,1):&\quad \frac{9!}{5!\,3!\,1!}= \frac{362880}{120\cdot6}=504,\\[2mm]
      +(4,3,2):&\quad \frac{9!}{4!\,3!\,2!}= \frac{362880}{24\cdot6\cdot2}=1260.
      +\end{aligned}
      +\]
      +
      +Add them:
      +
      +\[
      +N = 252+504+1260 = 2016.
      +\]
      +
      +The remainder when \(N\) is divided by \(1000\) is  
      +
      +\[
      +2016 \equiv 16 \pmod{1000}.
      +\]
      +
      +\[
      +\boxed{16}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 16

      +

      Extracted Answer: 16

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(0,c)
      +\]
      +
      +so that \(\angle A=90^{\circ}\) and  
      +
      +\[
      +BC=\sqrt{b^{2}+c^{2}}=38\qquad\Longrightarrow\qquad b^{2}+c^{2}=38^{2}=1444 .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Determining the positions of \(K\) and \(L\)
      +
      +Because  
      +
      +\[
      +AK=BK=14
      +\]
      +
      +the point \(K\) lies at the intersection of the circles of radius \(14\) centred at
      +\(A\) and \(B\).  
      +If \(K=(x_{K},y_{K})\),
      +
      +\[
      +x_{K}^{2}+y_{K}^{2}=196,\qquad (x_{K}-b)^{2}+y_{K}^{2}=196 .
      +\]
      +
      +Subtracting gives  
      +
      +\[
      +b^{2}=2bx_{K}\;\Longrightarrow\;x_{K}= \frac{b}{2} .
      +\tag{2}
      +\]
      +
      +Hence  
      +
      +\[
      +y_{K}^{2}=196-\Bigl(\frac{b}{2}\Bigr)^{2}=196-\frac{b^{2}}{4}.
      +\tag{3}
      +\]
      +
      +Similarly, from  
      +
      +\[
      +AL=CL=14
      +\]
      +
      +the point \(L=(x_{L},y_{L})\) satisfies
      +
      +\[
      +y_{L}= \frac{c}{2},\qquad 
      +x_{L}^{2}=196-\Bigl(\frac{c}{2}\Bigr)^{2}=196-\frac{c^{2}}{4}.
      +\tag{4}
      +\]
      +
      +Thus, writing  
      +
      +\[
      +U=\frac{b}{2},\quad V=\frac{c}{2},
      +\]
      +
      +we have  
      +
      +\[
      +K=\bigl(U,\;\sqrt{196-U^{2}}\bigr),\qquad 
      +L=\bigl(\sqrt{196-V^{2}},\;V\bigr),
      +\tag{5}
      +\]
      +
      +and from (1)  
      +
      +\[
      +U^{2}+V^{2}=361. \tag{6}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Using the condition \(KL=14\)
      +
      +From (5),
      +
      +\[
      +\bigl(U-\sqrt{196-V^{2}}\bigr)^{2}
      ++\bigl(\sqrt{196-U^{2}}-V\bigr)^{2}=196 .
      +\]
      +
      +Expanding and simplifying with (6) gives
      +
      +\[
      +U\sqrt{196-V^{2}}+V\sqrt{196-U^{2}}=98 . \tag{7}
      +\]
      +
      +Let  
      +
      +\[
      +p=\sqrt{196-V^{2}},\qquad q=\sqrt{196-U^{2}} .
      +\]
      +
      +Then  
      +
      +\[
      +U p+V q =98 ,\qquad p^{2}+q^{2}=31 ,
      +\qquad U^{2}+V^{2}=361 . \tag{8}
      +\]
      +
      +From (8) we obtain the product
      +
      +\[
      +U^{2}V^{2}=32448\quad\Longrightarrow\quad UV=104\sqrt3 . \tag{9}
      +\]
      +
      +Now  
      +
      +\[
      +(U+V)^{2}=U^{2}+V^{2}+2UV=361+208\sqrt3,
      +\]
      +\[
      +(U-V)^{2}=U^{2}+V^{2}-2UV=361-208\sqrt3 .
      +\]
      +
      +Both expressions are perfect squares:
      +
      +\[
      +361+208\sqrt3=(13+8\sqrt3)^{2},
      +\qquad
      +361-208\sqrt3=(8\sqrt3-13)^{2}.
      +\]
      +
      +Hence  
      +
      +\[
      +U+V=13+8\sqrt3,\qquad
      +|U-V|=8\sqrt3-13 .
      +\]
      +
      +Since \(U>V\), solving gives  
      +
      +\[
      +U=8\sqrt3,\qquad V=13 .
      +\]
      +
      +Consequently  
      +
      +\[
      +b=2U=16\sqrt3,\qquad c=2V=26 .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Coordinates of \(K\) and \(L\)
      +
      +Using (5) with the found \(U,V\):
      +
      +\[
      +K=\bigl(8\sqrt3,\; \sqrt{196-(8\sqrt3)^{2}}\bigr)
      +   =\bigl(8\sqrt3,\;2\bigr),
      +\]
      +
      +\[
      +L=\bigl(\sqrt{196-13^{2}},\;13\bigr)
      +   =\bigl(3\sqrt3,\;13\bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Area of quadrilateral \(BKLC\)
      +
      +The vertices in order are  
      +
      +\[
      +B=(16\sqrt3,0),\ K=(8\sqrt3,2),\ L=(3\sqrt3,13),\ C=(0,26).
      +\]
      +
      +Applying the shoelace formula:
      +
      +\[
      +\begin{aligned}
      +S_{1}&=x_{B}y_{K}+x_{K}y_{L}+x_{L}y_{C}+x_{C}y_{B}\\
      +     &= (16\sqrt3)(2)+(8\sqrt3)(13)+(3\sqrt3)(26)+0\\
      +     &=32\sqrt3+104\sqrt3+78\sqrt3=214\sqrt3,
      +\\[2mm]
      +S_{2}&=y_{B}x_{K}+y_{K}x_{L}+y_{L}x_{C}+y_{C}x_{B}\\
      +     &=0+2(3\sqrt3)+13\cdot0+26(16\sqrt3)\\
      +     &=6\sqrt3+416\sqrt3=422\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +\text{Area}=\frac12|S_{1}-S_{2}|
      +           =\frac12\bigl|214\sqrt3-422\sqrt3\bigr|
      +           =\frac12\,(208\sqrt3)=104\sqrt3 .
      +\]
      +
      +Thus the required area is \(104\sqrt3\), i.e. \(n=104\).
      +
      +\[
      +\boxed{104}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: 104

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The equation  
      +
      +\[
      +12x^{2}-xy-6y^{2}=0
      +\]
      +
      +can be factored over the integers.
      +
      +\[
      +\begin{aligned}
      +12x^{2}-xy-6y^{2}
      +&= (4x-3y)(3x+2y).
      +\end{aligned}
      +\]
      +
      +Hence a pair \((x,y)\) satisfies the equation iff  
      +
      +\[
      +4x-3y=0 \qquad\text{or}\qquad 3x+2y=0 .
      +\]
      +
      +---
      +
      +### 1.  Solutions of \(4x-3y=0\)
      +
      +\[
      +4x=3y \Longrightarrow x=\frac34y .
      +\]
      +
      +Since \(x,y\) are integers, \(y\) must be a multiple of \(4\); write \(y=4k\) \((k\in\mathbb Z)\).  
      +Then \(x=3k\).
      +
      +Bounds \(-100\le x,y\le100\) give  
      +
      +\[
      +|4k|\le100\ \Longrightarrow\ |k|\le25 .
      +\]
      +
      +Thus \(k\) can be any integer from \(-25\) to \(25\) inclusive – \(51\) possibilities.
      +
      +---
      +
      +### 2.  Solutions of \(3x+2y=0\)
      +
      +\[
      +3x=-2y \Longrightarrow x=-\frac{2}{3}y .
      +\]
      +
      +Now \(y\) must be a multiple of \(3\); write \(y=3k\).  
      +Then \(x=-2k\).
      +
      +Bounds give  
      +
      +\[
      +|3k|\le100\ \Longrightarrow\ |k|\le\Big\lfloor\frac{100}{3}\Big\rfloor=33 .
      +\]
      +
      +Hence \(k\) can be any integer from \(-33\) to \(33\) inclusive – \(67\) possibilities.
      +
      +---
      +
      +### 3.  Removing double‑counted pair
      +
      +Both families contain the pair \((0,0)\) (when \(k=0\)).  
      +It has been counted twice, so we subtract one.
      +
      +\[
      +\text{Total solutions}=51+67-1=117 .
      +\]
      +
      +All counted pairs satisfy \(-100\le x,y\le100\).
      +
      +\[
      +\boxed{117}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 117

      +

      Extracted Answer: 117

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +An isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \neq s$. Find $r^{2}+s^{2}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the trapezoid have parallel sides \(r\) and \(s\) (\(r\neq s\)), equal legs of length \(L\), height \(h\), and incircle radius \(R=3\).
      +
      +---
      +
      +### 1.  Semiperimeter from the incircle
      +
      +For any tangential quadrilateral,
      +\[
      +\text{Area}=R\cdot s,
      +\]
      +where \(s\) is the semiperimeter.  
      +Given \(\text{Area}=72\) and \(R=3\),
      +
      +\[
      +s=\frac{72}{3}=24,
      +\qquad\text{so } r+s+2L=2s=48. \tag{1}
      +\]
      +
      +---
      +
      +### 2.  Height of the trapezoid
      +
      +Since the incircle touches both parallel sides, the distance between them equals twice the radius:
      +
      +\[
      +h=2R=6.
      +\]
      +
      +The area also equals \(\frac{1}{2}(r+s)h\). Thus
      +
      +\[
      +72=\frac{1}{2}(r+s)\cdot6 \Longrightarrow r+s=24. \tag{2}
      +\]
      +
      +Substituting (2) into (1) gives
      +
      +\[
      +24+2L=48\Longrightarrow L=12. \tag{3}
      +\]
      +
      +---
      +
      +### 3.  Relating the bases and the leg
      +
      +In an isosceles trapezoid the horizontal projection of each leg is \(\dfrac{s-r}{2}\).
      +Using the right triangle formed by a leg, the height, and this projection:
      +
      +\[
      +\left(\frac{s-r}{2}\right)^2+h^2=L^2.
      +\]
      +
      +Insert \(h=6\) and \(L=12\):
      +
      +\[
      +\left(\frac{s-r}{2}\right)^2+36=144
      +\;\Longrightarrow\;
      +\frac{(s-r)^2}{4}=108
      +\;\Longrightarrow\;
      +(s-r)^2=432.
      +\]
      +
      +Hence
      +
      +\[
      +s-r=12\sqrt3. \tag{4}
      +\]
      +
      +---
      +
      +### 4.  Solve for \(r\) and \(s\)
      +
      +From (2) and (4):
      +
      +\[
      +\begin{cases}
      +r+s=24,\\[2pt]
      +s-r=12\sqrt3,
      +\end{cases}
      +\qquad\Longrightarrow\qquad
      +s=12+6\sqrt3,\;\; r=12-6\sqrt3.
      +\]
      +
      +Both are positive and distinct, as required.
      +
      +---
      +
      +### 5.  Compute \(r^{2}+s^{2}\)
      +
      +\[
      +\begin{aligned}
      +r^{2}+s^{2}&=(12-6\sqrt3)^2+(12+6\sqrt3)^2\\
      +&=2\cdot12^{2}+2\cdot(6\sqrt3)^{2}\\
      +&=2\cdot144+2\cdot108\\
      +&=288+216\\
      +&=504.
      +\end{aligned}
      +\]
      +
      +---
      +
      +\[
      +\boxed{504}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 504

      +

      Extracted Answer: 504

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      For an \(8\)-digit number formed with the digits \(1,2,\dots ,8\) each once we need
      +
      +* divisibility by \(2\)   \(\Longrightarrow\) the units digit is even (\(2,4,6,8\));
      +* divisibility by \(11\) \(\Longrightarrow\) the alternating sum of its digits is a multiple of \(11\).
      +
      +---
      +
      +### 1.  Divisibility by \(11\)
      +
      +Write the digits as \(d_1d_2d_3d_4d_5d_6d_7d_8\) ( \(d_1\) most significant).  
      +
      +The test for \(11\) gives  
      +
      +\[
      +(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\equiv0\pmod{11}.
      +\]
      +
      +Let  
      +
      +\[
      +O=d_1+d_3+d_5+d_7,\qquad E=d_2+d_4+d_6+d_8 .
      +\]
      +
      +Since all eight digits are used once,  
      +
      +\[
      +O+E = 1+2+\dots+8 = 36 .
      +\]
      +
      +The condition \(O-E\equiv0\pmod{11}\) becomes  
      +
      +\[
      +2O\equiv36\pmod{11}\quad\Longrightarrow\quad O\equiv18\equiv7\pmod{11}.
      +\]
      +
      +The sum of four distinct digits from \(\{1,\dots ,8\}\) lies between \(10\) and \(26\); the only value congruent to \(7\pmod{11}\) in that range is \(18\).  
      +Hence we must have  
      +
      +\[
      +O=E=18.
      +\]
      +
      +So the four digits placed in the odd positions must sum to \(18\).
      +
      +---
      +
      +### 2.  Choosing the odd–position digits
      +
      +We need all \(4\)-element subsets of \(\{1,\dots ,8\}\) whose sum is \(18\).
      +
      +Listing them (in increasing order) gives
      +
      +\[
      +\begin{aligned}
      +&\{1,2,7,8\},\; \{1,3,6,8\},\; \{1,4,5,8\},\; \{1,4,6,7\},\\
      +&\{2,3,5,8\},\; \{2,3,6,7\},\; \{2,4,5,7\},\; \{3,4,5,6\}.
      +\end{aligned}
      +\]
      +
      +There are \(8\) such subsets.  
      +Each of them contains exactly two even digits (the even digits are \(2,4,6,8\)). Consequently the complementary set (the digits placed in even positions) also contains exactly two evens.
      +
      +---
      +
      +### 3.  Forming the numbers
      +
      +*For a fixed subset* \(S\) (the odd‑position digits)
      +
      +* arrange its four digits among the odd places \(1,3,5,7\): \(4!\) ways;
      +* the four remaining digits (the complement \(T\)) go to the even places \(2,4,6,8\).  
      +  Since \(T\) contains two even digits, we may pick which even digit occupies the units place (position \(8\)) in \(2\) ways; the other three digits can be placed in \(3!\) ways.
      +
      +Hence for each subset \(S\)
      +
      +\[
      +\text{permutations}=4!\times 2\times3!=24\times12=288 .
      +\]
      +
      +With \(8\) possible subsets,
      +
      +\[
      +N=8\times288=2304 .
      +\]
      +
      +(Equivalently, half of the \(4608\) numbers with \(O=E=18\) are even, giving the same result.)
      +
      +---
      +
      +### 4.  Required difference
      +
      +\[
      +N-2025 = 2304-2025 = 279.
      +\]
      +
      +Thus the requested difference is  
      +
      +\[
      +\boxed{279}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 279

      +

      Extracted Answer: 279

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      We place \(\triangle ABC\) on its circumcircle (radius 1) with  
      +
      +\[
      +A=1,\qquad B=e^{i2C},\qquad C=e^{i(2C+2A)} .
      +\]
      +
      +The orthocenter is  
      +
      +\[
      +H=a+b+c.
      +\]
      +
      +The nine‑point circle is the image of the circumcircle under the homothety with centre \(H\) and factor \(\tfrac12\); therefore for any point \(X\) on the nine‑point circle its image on the circumcircle is  
      +
      +\[
      +X' = 2X-H .
      +\]
      +
      +Applying this to the six points on the nine‑point circle gives
      +
      +\[
      +\begin{aligned}
      +D&\mapsto -a,\\
      +E&\mapsto -b,\\
      +F&\mapsto -c,\\
      +G&\mapsto A' ,\qquad A' \text{ is the second intersection of the altitude }AA_H\text{ with the circumcircle},\\
      +H&\mapsto B' ,\qquad B'=-e^{i2A},\\
      +J&\mapsto C' ,\qquad C'=-e^{-i2A}.
      +\end{aligned}
      +\]
      +
      +Using \(a=1,\;b=e^{i2C},\;c=e^{i(2C+2A)}\) we obtain the central
      +angles (measured from the positive \(x\)-axis) of the corresponding points:
      +
      +\[
      +\begin{array}{c|c}
      +\text{Nine‑point point} & \text{Angle on the circumcircle}\\ \hline
      +D & 180^\circ\\
      +E & 180^\circ+2C\\
      +F & 180^\circ-2B\\
      +G & 180^\circ+2A+4C\\
      +H & 180^\circ+2A\\
      +J & 180^\circ-2A
      +\end{array}
      +\]
      +
      +Because the homothety preserves directions from the centre, the
      +arc length on the nine‑point circle equals the corresponding central
      +angle on the circumcircle.
      +
      +Hence
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}&=(180^\circ+2C)-180^\circ =2C,\\[2mm]
      +\widehat{HJ}&=|\, (180^\circ+2A)-(180^\circ-2A)\,|=4A,
      +\end{aligned}
      +\]
      +
      +and the minor arc \(HJ\) is \(360^\circ-4A\) (since \(4A>180^\circ\)).
      +Finally
      +
      +\[
      +\widehat{FG}=|(180^\circ-2B)-(180^\circ+2A+4C)|
      +            =2C\qquad(\text{mod }360^\circ).
      +\]
      +
      +Thus
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +&=2C+2\bigl(360^\circ-4A\bigr)+3\,(2C) \\
      +&=720^\circ-8A+8C\\
      +&=720^\circ+8(C-A).
      +\end{aligned}
      +\]
      +
      +For the given triangle \(A=84^\circ,\;C=36^\circ\),
      +
      +\[
      +720^\circ+8(36^\circ-84^\circ)=720^\circ-384^\circ=336^\circ .
      +\]
      +
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The function  
      +
      +\[
      +f(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x}, \qquad x>0,
      +\]
      +
      +has zeros at \(x=18,72,98,k\) and \(\displaystyle\lim_{x\to0^+}f(x)=+\infty\),
      +\(\displaystyle\lim_{x\to\infty}f(x)=+\infty\).
      +Hence the graph of \(f\) starts at \(+\infty\), descends to a negative
      +value, comes back to zero, rises again, etc.; it has exactly **two**
      +negative intervals:
      +\[
      +(r_1,r_2),\qquad (r_3,r_4),
      +\]
      +where \(\{r_1,r_2,r_3,r_4\}=\{18,72,98,k\}\) ordered increasingly.
      +In each negative interval there is a local (and global) minimum of \(f\).
      +
      +Let  
      +
      +\[
      +g(x)=(x-18)(x-72)(x-98)(x-k),
      +\qquad f(x)=\frac{g(x)}{x}.
      +\]
      +
      +A point \(x_0\) where \(f\) has an extremum satisfies  
      +
      +\[
      +f'(x_0)=0\iff x_0g'(x_0)-g(x_0)=0\iff 
      +\sum_{i=1}^{4}\frac{1}{x_0-r_i}= \frac1{x_0}.
      +\]
      +
      +Geometrically, if \(m=f(x_0)\) then the line \(y=m x\) is tangent to the
      +quartic graph \(y=g(x)\) at \(x_0\):
      +\[
      +g(x)-mx=0\quad\text{has a double root at }x_0 .
      +\]
      +
      +If the global minimum of \(f\) is attained at **two** distinct points,
      +the line \(y=m x\) must be tangent to \(g\) at two distinct points
      +\(\alpha,\beta\). Hence
      +
      +\[
      +g(x)-mx=(x-\alpha)^2 (x-\beta)^2 .
      +\tag{1}
      +\]
      +
      +Write  
      +
      +\[
      +\alpha+\beta=p,\qquad \alpha\beta =q,\qquad m \text{ (the slope)} .
      +\]
      +
      +Expanding (1) and comparing with \(g(x)-mx=x^4-S_1x^3+S_2x^2-(S_3+m)x+S_4\) gives  
      +
      +\[
      +\begin{aligned}
      +S_1 &=2p,\\
      +S_2 &=p^{2}+2q,\\
      +S_4 &=q^{2},\\
      +S_3+m &=2pq,
      +\end{aligned}
      +\tag{2}
      +\]
      +
      +where for our roots  
      +
      +\[
      +\begin{aligned}
      +S_1&=18+72+98+k=188+k,\\
      +S_2&=18\cdot72+18\cdot98+72\cdot98+ (18+72+98)k
      +     =10116+188k,\\
      +S_3&=18\cdot72\cdot98+ (18\cdot72+18\cdot98+72\cdot98)k
      +     =127008+10116k,\\
      +S_4&=18\cdot72\cdot98\cdot k=127008\,k .
      +\end{aligned}
      +\]
      +
      +From (2) we obtain  
      +
      +\[
      +p=\frac{188+k}{2},\qquad q=\sqrt{127008\,k}=252\sqrt{2k}.
      +\]
      +
      +Using the second equation of (2),
      +
      +\[
      +S_2=p^{2}+2q,
      +\]
      +
      +gives the condition on \(k\):
      +
      +\[
      +\frac{(188+k)^{2}}{4}+2\sqrt{127008k}=10116+188k .
      +\tag{3}
      +\]
      +
      +---
      +
      +### Solving (3)
      +
      +Put \(k=t^{2}\;(t>0)\).  Since \(\sqrt{127008k}=252\sqrt{2}\,t\),
      +(3) becomes
      +
      +\[
      +t^{4}-376t^{2}+2016\sqrt{2}\,t-5120=0 .
      +\]
      +
      +Factoring,
      +
      +\[
      +(t^{2}+6\sqrt{2}\,t-320)(t^{2}-6\sqrt{2}\,t+16)=0 .
      +\]
      +
      +Hence the positive solutions for \(t\) are
      +
      +\[
      +t=10\sqrt2,\qquad t=4\sqrt2,\qquad t=2\sqrt2 .
      +\]
      +
      +Consequently
      +
      +\[
      +k=t^{2}=200,\;32,\;8 .
      +\]
      +
      +---
      +
      +### Verification
      +
      +For each \(k\) the ordered roots of \(g\) are
      +
      +\[
      +\begin{array}{c|c}
      +k & \text{ordered roots }(r_1,r_2,r_3,r_4)\\ \hline
      +8  & (8,18,72,98)\\
      +32 & (18,32,72,98)\\
      +200& (18,72,98,200)
      +\end{array}
      +\]
      +
      +Using \(p\) and \(q\) we find the tangency points  
      +
      +\[
      +\alpha,\beta=\frac{p\pm\sqrt{p^{2}-4q}}{2},
      +\]
      +
      +and they lie respectively in the intervals \((r_1,r_2)\) and
      +\((r_3,r_4)\). Thus in each case the line \(y=m x\) is tangent to
      +\(g\) at two points, giving exactly two distinct global minima of
      +\(f\). No other \(k>0\) satisfies (3); hence these are the only three
      +values.
      +
      +Finally, the required sum is
      +
      +\[
      +8+32+200 = 240 .
      +\]
      +
      +\[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\sqrt{-1}$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +z=x+iy\qquad (x,y\in\mathbb{R}).
      +\]
      +
      +---
      +
      +### 1.  The first equation – a circle  
      +
      +\[
      +|25+20i-z|=5 \Longrightarrow (x-25)^2+(y-20)^2=5^2 .
      +\]
      +
      +Thus the circle has centre  
      +
      +\[
      +C=(25,20),\qquad \text{radius } r=5 .
      +\]
      +
      +---
      +
      +### 2.  The second equation – a perpendicular bisector  
      +
      +\[
      +|z-(4+k)|=|z-(3i+k)|
      +\]
      +
      +writes as  
      +
      +\[
      +(x-(k+4))^2+y^{2}=(x-k)^2+(y-3)^2 .
      +\]
      +
      +Simplifying,
      +
      +\[
      +-8x+6y+8k+7=0\quad\Longrightarrow\quad 4x-3y-(4k+3.5)=0 .
      +\]
      +
      +Hence the set of points satisfying the second condition is the line  
      +
      +\[
      +L:\;4x-3y=4k+\frac 72 .
      +\]
      +
      +This is the perpendicular bisector of the segment joining  
      +\(A=(k+4,0)\) and \(B=(k,3)\) (its slope is \(4/3\) for any \(k\)).
      +
      +---
      +
      +### 3.  One intersection  \(\iff\)  tangency  
      +
      +The system has exactly one solution precisely when the line \(L\) is tangent to the circle, i.e. when the distance from the centre \(C\) to \(L\) equals the radius \(5\).
      +
      +The distance from \((x_0,y_0)\) to \(Ax+By+C=0\) is  
      +
      +\[
      +\frac{|Ax_0+By_0+C|}{\sqrt{A^2+B^2}} .
      +\]
      +
      +For \(C=(25,20)\) and \(L: 4x-3y-(4k+3.5)=0\),
      +
      +\[
      +d=\frac{|4\cdot25-3\cdot20-(4k+3.5)|}{\sqrt{4^{2}+(-3)^{2}}}
      +   =\frac{|40-4k-3.5|}{5}
      +   =\frac{|36.5-4k|}{5}.
      +\]
      +
      +Set \(d=r=5\):
      +
      +\[
      +\frac{|36.5-4k|}{5}=5\quad\Longrightarrow\quad |36.5-4k|=25 .
      +\]
      +
      +---
      +
      +### 4.  Solving for \(k\)
      +
      +\[
      +\begin{cases}
      +36.5-4k=25 &\Longrightarrow\;4k=11.5\;\Longrightarrow\;k=\dfrac{23}{8},\\[4pt]
      +36.5-4k=-25 &\Longrightarrow\;4k=61.5\;\Longrightarrow\;k=\dfrac{123}{8}.
      +\end{cases}
      +\]
      +
      +Thus the possible real values of \(k\) are  
      +
      +\[
      +k_1=\frac{23}{8},\qquad k_2=\frac{123}{8}.
      +\]
      +
      +Both give a line tangent to the circle, so each yields exactly one solution \(z\).
      +
      +---
      +
      +### 5.  Sum of the possible \(k\)’s  
      +
      +\[
      +k_1+k_2=\frac{23+123}{8}=\frac{146}{8}=\frac{73}{4}.
      +\]
      +
      +Write \(\frac{73}{4}\) as \(\dfrac{m}{n}\) with \(\gcd(m,n)=1\); here \(m=73,\ n=4\).
      +
      +\[
      +m+n=73+4=77.
      +\]
      +
      +\[
      +\boxed{77}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 77

      +

      Extracted Answer: 77

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Write the recurrence for the numerators and denominators**
      +
      +Let  
      +
      +\[
      +x_k=\frac{a_k}{b_k}\qquad (a_k,b_k\in \mathbb Z ,\; \gcd(a_k,b_k)=1).
      +\]
      +
      +From  
      +
      +\[
      +x_{k+1}= \frac{1}{3}\Bigl(x_k+\frac1{x_k}-1\Bigr)=\frac{x_k^2-x_k+1}{3x_k},
      +\]
      +
      +we obtain  
      +
      +\[
      +a_{k+1}=a_k^2-a_kb_k+b_k^2,\qquad   
      +b_{k+1}=3a_kb_k,          \tag{1}
      +\]
      +
      +with \(a_1=25,\;b_1=11\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 2.  The common factor \(3^{e_k}\)**  
      +
      +Write  
      +
      +\[
      +a_k=3^{e_k}A_k,\qquad b_k=3^{e_k}B_k,\qquad \gcd(A_k,B_k)=1 .
      +\]
      +
      +Dividing (1) by the highest possible power of \(3\) shows that
      +\(e_{k+1}=2e_k+1\) and that the reduced pair \((A_k,B_k)\) always satisfies  
      +
      +\[
      +A_k\equiv1\pmod3,\qquad B_k\equiv2\pmod3 .
      +\]
      +
      +With \(e_1=0\) we get  
      +
      +\[
      +e_k=2^{\,k-1}-1 .\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 3.  A very simple recurrence for the sum**
      +
      +Let  
      +
      +\[
      +S_k=a_k+b_k .
      +\]
      +
      +From (1)
      +
      +\[
      +\begin{aligned}
      +S_{k+1}&=a_{k+1}+b_{k+1}
      +       =(a_k^2-a_kb_k+b_k^2)+3a_kb_k   \\
      +       &=a_k^2+b_k^2+2a_kb_k=(a_k+b_k)^2=S_k^{\,2}.
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +S_k=S_1^{\,2^{\,k-1}}=36^{\,2^{\,k-1}}. \tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4.  The reduced numerator and denominator**
      +
      +Since the common factor is \(3^{e_k}\),
      +
      +\[
      +\frac{a_k}{b_k}= \frac{A_k}{B_k},\qquad 
      +m=A_k,\; n=B_k .
      +\]
      +
      +Thus  
      +
      +\[
      +m+n=\frac{a_k+b_k}{3^{e_k}}
      +     =\frac{36^{\,2^{\,k-1}}}{3^{\,2^{\,k-1}-1}}
      +     =2^{\,2^{\,k}}\;3^{\,2^{\,k-1}+1}. \tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5.  Apply \(k=2025\)**  
      +
      +From (4),
      +
      +\[
      +m+n=2^{\,2^{2025}}\;3^{\,2^{2024}+1}.
      +\]
      +
      +We need this number modulo \(1000\).
      +
      +--------------------------------------------------------------------
      +
      +**Step 6.  Reduce modulo \(8\) and \(125\)**  
      +
      +*Modulo \(8\):*  \(2^{\ge3}\equiv0\pmod8\); therefore  
      +
      +\[
      +m+n\equiv0\pmod8. \tag{5}
      +\]
      +
      +*Modulo \(125\):*  Because \(\phi(125)=100\),
      +
      +\[
      +2^{2^{2025}}\equiv 2^{\,2^{2025}\bmod100},
      +\qquad
      +3^{2^{2024}+1}\equiv 3^{\,(2^{2024}+1)\bmod100}\pmod{125}.
      +\]
      +
      +Compute the exponents.
      +
      +- \(2^{2025}\bmod100\):  
      +  \(2^{2025}\equiv32\pmod{100}\) (by CRT: \(2^{2025}\equiv0\pmod4\), \(2^{2025}\equiv7\pmod{25}\)).
      +- \(2^{2024}\bmod100\):  
      +  \(2^{2024}\equiv16\pmod{100}\).
      +
      +Hence  
      +
      +\[
      +2^{2^{2025}}\equiv2^{32}\equiv46\pmod{125},
      +\qquad
      +3^{2^{2024}+1}\equiv3^{17}\equiv38\pmod{125}.
      +\]
      +
      +Therefore  
      +
      +\[
      +m+n\equiv46\cdot38\equiv123\pmod{125}. \tag{6}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 7.  Chinese Remainder Theorem**
      +
      +Find \(N\) such that  
      +
      +\[
      +N\equiv0\pmod8,\qquad N\equiv123\pmod{125}.
      +\]
      +
      +Write \(N=8k\).  Then \(8k\equiv123\pmod{125}\), i.e.  
      +
      +\[
      +k\equiv123\cdot8^{-1}\pmod{125}.
      +\]
      +
      +Since \(8^{-1}\equiv47\pmod{125}\),  
      +
      +\[
      +k\equiv123\cdot47\equiv31\pmod{125}.
      +\]
      +
      +Thus \(k=31+125t\) and  
      +
      +\[
      +N=8k=8\cdot31=248\pmod{1000}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Answer**
      +
      +\[
      +\boxed{248}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +A<B<C<D<E<F<G<H<I<J<K<L
      +\]
      +
      +and suppose the letters are randomly paired.  
      +For a pair \(\{x,y\}\) we write the word \(xy\) with the letters in
      +alphabetical order (\(x<y\)).  
      +The six words are then ordered alphabetically; the last word is the
      +lexicographically largest word.
      +
      +--------------------------------------------------------------------
      +### 1.  Conditioning on the partner of \(G\)
      +
      +In a random perfect matching each of the other \(11\) letters is equally
      +likely to be paired with \(G\).  
      +Let the partner be \(X\).  The probability we need is  
      +
      +\[
      +P=\frac1{11}\sum_{X\neq G}
      +\Pr\bigl(\text{the pair } \{G,X\}\text{ is the maximal word}\mid
      +G\text{ is paired with }X\bigr).
      +\]
      +
      +Thus we must evaluate the conditional probability for each possible
      +\(X\).
      +
      +--------------------------------------------------------------------
      +### 2.  When \(X<G\)
      +
      +If \(X<G\) the word is \(XG\) and its first letter is \(X\).  
      +For it to be the maximal word, the first letters (the smaller letters)
      +of all other five pairs must be **smaller than \(X\)**.
      +Hence among the remaining ten letters we need five distinct letters
      +all less than \(X\).
      +
      +The only letter with five smaller letters is \(F\) (the letters
      +\(A,B,C,D,E\) are smaller).  
      +Thus:
      +
      +* \(X=F\) is possible;
      +* \(X=A,B,C,D,E\) are impossible (there are not enough smaller
      +letters).
      +
      +When \(X=F\) the remaining letters are  
      +\(\{A,B,C,D,E\}\) and \(\{H,I,J,K,L\}\).  
      +To keep every other pair’s first letter \(<F\), each of the five large
      +letters must be paired with a distinct small one.  
      +The number of such matchings is \(5!=120\).
      +
      +The total number of matchings of those ten letters is  
      +
      +\[
      +\frac{10!}{2^5\,5!}=945 .
      +\]
      +
      +Hence  
      +
      +\[
      +\Pr(\text{maximal}\mid G\text{–}F)=\frac{120}{945}=\frac{8}{63}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  When \(X>G\)
      +
      +Now the word is \(GX\) and its first letter is \(G\).
      +For it to be maximal, **no other pair may have a first letter larger
      +than \(G\)**; i.e. no remaining pair may consist of two letters both
      +greater than \(G\).
      +
      +After fixing the pair \(\{G,X\}\) (with \(X\in\{H,I,J,K,L\}\)), the
      +remaining letters are
      +
      +* the six letters \(\{A,B,C,D,E,F\}\) (all \(<G\));
      +* the four letters among \(\{H,I,J,K,L\}\) that are not \(X\) (all
      +\(>G\)).
      +
      +Thus each of those four “large’’ letters must be paired with a distinct
      +small letter, leaving two small letters to pair together.
      +
      +Number of valid matchings:
      +
      +\[
      +\binom{6}{4}\cdot4!\cdot1=15\cdot24=360 .
      +\]
      +
      +Again the total number of matchings of the ten remaining letters is
      +\(945\). Therefore
      +
      +\[
      +\Pr(\text{maximal}\mid G\text{–}X)=\frac{360}{945}=\frac{8}{21}
      +\qquad (X=H,I,J,K,L).
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Assemble the probability
      +
      +\[
      +\begin{aligned}
      +P&=\frac1{11}\Bigl(\frac{8}{63}
      ++5\cdot\frac{8}{21}\Bigr)    \\
      + &=\frac1{11}\Bigl(\frac{8}{63}+\frac{40}{21}\Bigr)
      +   =\frac1{11}\Bigl(\frac{8+120}{63}\Bigr)
      +   =\frac{128}{693}.
      +\end{aligned}
      +\]
      +
      +The fraction \(\displaystyle\frac{128}{693}\) is already in lowest
      +terms.  Hence \(m=128,\;n=693\) and
      +
      +\[
      +m+n = 128+693 = 821 .
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{821}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 821

      +

      Extracted Answer: 821

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +S(t)=\sum_{a=1}^{3^{6}}\exp\!\Big(2\pi i\,\frac{t a^{3}}{3^{7}}\Big) \qquad(0\le t<3^{7})
      +\]
      +
      +and denote  
      +
      +\[
      +N=\#\{(a,b,c)\mid 1\le a,b,c\le 3^{6},
      +\ a^{3}+b^{3}+c^{3}\equiv 0\pmod{3^{7}}\}.
      +\]
      +
      +For any modulus \(m\),
      +
      +\[
      +\#\{(x,y,z):x+y+z\equiv0\pmod m\}=
      +\frac1m\sum_{t=0}^{m-1}\Bigl(\sum_{x}e^{2\pi i t x/m}\Bigr)^3 .
      +\]
      +
      +Hence  
      +
      +\[
      +N=\frac1{3^{7}}\sum_{t=0}^{3^{7}-1} S(t)^{3}. \tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Splitting the summation
      +
      +Write each \(a\) as \(a=3^{v}u\) where \(v=v_{3}(a)\) and \(u\) is not
      +divisible by \(3\).  
      +For \(0\le v\le 2\) define  
      +
      +\[
      +U_{v}=\{\,u:1\le u\le 3^{6-v},\;3\nmid u\,\},
      +\qquad |U_{0}|=486,\ |U_{1}|=162,\ |U_{2}|=54 .
      +\]
      +
      +If \(v\ge3\) then \(a^{3}\equiv0\pmod{3^{7}}\); there are  
      +\(n_{3}=27\) such numbers.
      +Thus
      +
      +\[
      +S(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+n_{3},
      +\]
      +where  
      +
      +\[
      +\begin{aligned}
      +f_{0}(t)&=\sum_{x\in U_{0}}\zeta^{t x^{3}},\\[2mm]
      +f_{1}(t)&=\sum_{x\in U_{1}}\zeta^{t\,27x^{3}},\\[2mm]
      +f_{2}(t)&=\sum_{x\in U_{2}}\zeta^{t\,729x^{3}},
      +\end{aligned}
      +\qquad 
      +\zeta=e^{2\pi i/3^{7}} .
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Evaluating \(f_{0},f_{1},f_{2}\)
      +
      +*For \(f_{0}\).*  
      +Let \(G_{7}=(\mathbb Z/3^{7}\mathbb Z)^{\times}\) (\(|G_{7}|=1458\)).
      +The map \(x\mapsto x^{3}\) from \(G_{7}\) onto the set of cubes
      +\(C_{6}\) has kernel of size \(3\); consequently
      +
      +\[
      +\sum_{x\in G_{7}}\zeta^{t x}=3\sum_{r\in C_{6}}\zeta^{t r}=3f_{0}(t).
      +\]
      +
      +For \(t\neq0\) one has  
      +
      +\[
      +\sum_{x\in G_{7}}\zeta^{t x}= -\!\!\sum_{\substack{x\;(\bmod 3^{7})\\3\mid x}}\!\!\zeta^{t x}
      +=\begin{cases}
      +-729,&v_{3}(t)=6,\\
      +0,&0\le v_{3}(t)\le5 .
      +\end{cases}
      +\]
      +
      +Hence  
      +
      +\[
      +f_{0}(t)=
      +\begin{cases}
      +486,&t=0,\\[2mm]
      +-243,&v_{3}(t)=6,\\[2mm]
      +0,&\text{otherwise.}
      +\end{cases}
      +\tag{2}
      +\]
      +
      +*For \(f_{1}\).*  
      +Writing each \(x\in U_{1}\) as \(x=v+81k\;(k=0,1,2)\) one finds
      +\(x^{3}\equiv v^{3}\pmod{81}\). Consequently  
      +
      +\[
      +f_{1}(t)=3\!\!\sum_{\substack{v\in(\mathbb Z/81)^{\times}}}\!
      +\exp\!\Big(2\pi i\,\frac{t v^{3}}{81}\Big).
      +\]
      +
      +Using again that the cube map on \((\mathbb Z/81)^{\times}\) has kernel
      +size \(3\),
      +
      +\[
      +f_{1}(t)=3\!\cdot\!3\!\!\sum_{r\in C_{1}}\!
      +\exp\!\Big(2\pi i\,\frac{t r}{81}\Big) ,
      +\]
      +
      +where \(C_{1}\) is the set of cube‑residues modulo \(81\) (\(|C_{1}|=18\)).
      +Now
      +
      +\[
      +\sum_{x\in(\mathbb Z/81)^{\times}}\exp\!\Big(2\pi i\,
      +\frac{t x}{81}\Big)=
      +\begin{cases}
      +54,&v_{3}(t)\ge4,\\[1mm]
      +-27,&v_{3}(t)=3,\\[1mm]
      +0,&v_{3}(t)\le2 .
      +\end{cases}
      +\]
      +
      +Thus
      +
      +\[
      +f_{1}(t)=
      +\begin{cases}
      +162,&v_{3}(t)\ge4,\\[2mm]
      +-81,&v_{3}(t)=3,\\[2mm]
      +0,&v_{3}(t)\le2 .
      +\end{cases}
      +\tag{3}
      +\]
      +
      +*For \(f_{2}\).*  
      +Here \(x^{3}\equiv x\pmod 3\), and among the \(54\) numbers in \(U_{2}\)
      +exactly half are \(\equiv1\pmod3\) and half \(\equiv2\pmod3\). Hence  
      +
      +\[
      +f_{2}(t)=27\bigl(\zeta^{t}+ \zeta^{2t}\bigr)=
      +\begin{cases}
      +-27,&v_{3}(t)=0,\\[2mm]
      +54,&v_{3}(t)\ge1 .
      +\end{cases}
      +\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  The values of \(S(t)\)
      +
      +From (2)–(4) (and remembering the constant term \(n_{3}=27\))
      +
      +\[
      +S(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+27=
      +\begin{array}{c|c}
      +v_{3}(t) & S(t)\\ \hline
      +\infty\;(t=0) & 729\\
      +0 & 0\\
      +1 & 81\\
      +2 & 81\\
      +3 & 0\\
      +4 & 243\\
      +5 & 243\\
      +6 & 0
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Computing \(N\)
      +
      +Only the classes with non‑zero \(S(t)\) contribute to (1).  
      +The numbers of \(t\) in each class are
      +
      +\[
      +\begin{array}{c|c}
      +v_{3}(t) & \#t\\ \hline
      +\infty & 1\\
      +0 & 1458\\
      +1 & 486\\
      +2 & 162\\
      +3 & 54\\
      +4 & 18\\
      +5 & 6\\
      +6 & 2
      +\end{array}
      +\]
      +
      +Hence
      +
      +\[
      +\begin{aligned}
      +N&=\frac1{3^{7}}\Bigl( 729^{3}
      ++ (486+162) \,81^{3}
      ++ (18+6)\,243^{3}\Bigr)\\[2mm]
      +&=\frac1{3^{7}}\Bigl(3^{18}+648\cdot3^{12}+24\cdot3^{15}\Bigr)\\
      +&=3^{5}\cdot2025 = 243\cdot2025 = 492\,075 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Remainder modulo \(1000\)
      +
      +\[
      +492\,075 \equiv 75 \pmod{1000}.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{75}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 75

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +On $\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Overview**
      +
      +The given lengths on the sides of \(\triangle ABC\) give  
      +
      +\[
      +AD=4,\;DE=16,\;EB=8 \qquad\Longrightarrow\qquad AB=28,
      +\]
      +\[
      +AF=13,\;FG=52,\;GC=26 \qquad\Longrightarrow\qquad AC=91 .
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 1.  Two lines parallel to \(BC\)
      +
      +\[
      +\frac{AD}{AB}= \frac{4}{28}= \frac{1}{7},\qquad 
      +\frac{AF}{AC}= \frac{13}{91}= \frac{1}{7}.
      +\]
      +
      +Hence the points \(D\in AB\) and \(F\in AC\) divide the two sides in the same
      +ratio; therefore \(DF\parallel BC\).
      +
      +Similarly  
      +
      +\[
      +\frac{AE}{AB}= \frac{AD+DE}{AB}= \frac{20}{28}= \frac57,
      +\qquad 
      +\frac{AG}{AC}= \frac{AF+FG}{AC}= \frac{65}{91}= \frac57,
      +\]
      +
      +so \(E\in AB,\;G\in AC\) also give a line parallel to \(BC\); i.e. \(EG\parallel BC\).
      +
      +Thus the quadrilateral \(DEGF\) is bounded by two parallel sides \(DF,EG\) and
      +the two segments of the sides of the triangle, and it is the region between the
      +two similar triangles \(ADF\) and \(AEG\).
      +
      +--------------------------------------------------------------------
      +
      +### 2.  Area of \(\triangle ABC\)
      +
      +If \([XYZ]\) denotes area, similarity gives  
      +
      +\[
      +[ADF]=\Bigl(\frac{AD}{AB}\Bigr)^2[ABC]=\Bigl(\frac17\Bigr)^2[ABC]=\frac{[ABC]}{49},
      +\]
      +
      +\[
      +[AEG]=\Bigl(\frac{AE}{AB}\Bigr)\Bigl(\frac{AG}{AC}\Bigr)[ABC]
      +      =\frac57\cdot\frac57[ABC]=\frac{25}{49}[ABC].
      +\]
      +
      +Hence  
      +
      +\[
      +[DEGF]=[AEG]-[ADF]=\Bigl(\frac{25}{49}-\frac1{49}\Bigr)[ABC]
      +       =\frac{24}{49}[ABC].
      +\]
      +
      +Given \([DEGF]=288\),
      +
      +\[
      +\frac{24}{49}[ABC]=288\quad\Longrightarrow\quad[ABC]=288\cdot\frac{49}{24}
      +                  =12\cdot49=588.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Area of the heptagon \(AFNBCEM\)
      +
      +Place the triangle with \(A=(0,0),\;B=(28,0)\) and
      +\(C=(91\cos\theta,\,91\sin\theta)\).
      +Because \([ABC]=\tfrac12\cdot28\cdot91\sin\theta\),
      +
      +\[
      +\sin\theta=\frac{[ABC]}{1274}= \frac{588}{1274}= \frac{6}{13}.
      +\]
      +
      +Thus  
      +
      +\[
      +\cos\theta=\frac{\sqrt{1-\sin^2\theta}}{\,}= \frac{\sqrt{133}}{13}.
      +\]
      +
      +The coordinates of the relevant points are
      +
      +\[
      +\begin{aligned}
      +&F=(13\cos\theta,13\sin\theta)=(\sqrt{133},6), \\
      +&G=(65\cos\theta,65\sin\theta)=(5\sqrt{133},30),\\
      +&D=(4,0),\qquad
      +E=(20,0),\\
      +&M=2F-D=(2\sqrt{133}-4,12),\\
      +&N=2E-G=(40-5\sqrt{133},-30).
      +\end{aligned}
      +\]
      +
      +Using the shoelace formula for the polygon
      +\(A\,(0,0),\;F,\;N,\;B,\;C,\;E,\;M\) we obtain
      +
      +\[
      +\begin{aligned}
      +\sum (x_i y_{i+1}-y_i x_{i+1})
      +&= -240+840+1176-840+240 = 1176,\\[2mm]
      +\text{Area}&=\frac12\cdot1176=588.
      +\end{aligned}
      +\]
      +
      +Thus the heptagon \(AFNBCEM\) has the same area as \(\triangle ABC\).
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{588}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 588

      +

      Extracted Answer: 588

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The parabola with equation $y=x^{2}-4$ is rotated $60^{\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\frac{a-\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +P:\; y=x^{2}-4
      +\]
      +
      +and rotate \(P\) about the origin \(60^{\circ}\) counter‑clockwise.  
      +If \((x,y)\) is a point of \(P\) then its image \((X,Y)\) satisfies  
      +
      +\[
      +\begin{pmatrix}X\\Y\end{pmatrix}= 
      +\begin{pmatrix}\cos 60^\circ & -\sin 60^\circ\\[2pt] 
      +\sin 60^\circ & \ \cos 60^\circ\end{pmatrix}
      +\begin{pmatrix}x\\y\end{pmatrix},
      +\qquad 
      +\cos60^\circ=\frac12,\;\sin60^\circ=\frac{\sqrt3}{2}.
      +\]
      +
      +Hence  
      +
      +\[
      +X=\frac{x}{2}-\frac{\sqrt3}{2}y,\qquad
      +Y=\frac{\sqrt3}{2}x+\frac{y}{2}.
      +\]
      +
      +To obtain the equation of the rotated curve in the original \((x,y)\)–coordinates,
      +solve for \((x,y)\) in terms of \((X,Y)\) (rotate back by \(-60^\circ\)):
      +
      +\[
      +x = \frac{X}{2}+\frac{\sqrt3}{2}Y,\qquad
      +y = -\frac{\sqrt3}{2}X+\frac{Y}{2}.
      +\]
      +
      +Since the original points satisfy \(y=x^{2}-4\), substituting the expressions above gives the equation of the image:
      +
      +\[
      +x^{2}+2\sqrt3\,xy+3y^{2}+2\sqrt3\,x-2y-16=0. \tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### Intersection with the original parabola
      +
      +The intersection points satisfy simultaneously  
      +
      +\[
      +y=x^{2}-4\qquad\text{and}\qquad (1).
      +\]
      +
      +Substituting \(y=x^{2}-4\) into (1) yields
      +
      +\[
      +3x^{4}-25x^{2}+40+2\sqrt3\,x^{3}-6\sqrt3\,x=0.
      +\]
      +
      +Factor this quartic in the field \(\mathbb{Q}(\sqrt3)\):
      +
      +\[
      +\begin{aligned}
      +3x^{4}-25x^{2}+40+2\sqrt3\,x^{3}-6\sqrt3\,x
      +&=(x^{2}+\sqrt3\,x-4)\bigl(3x^{2}-\sqrt3\,x-10\bigr).
      +\end{aligned}
      +\]
      +
      +Thus the intersection points satisfy one of  
      +
      +\[
      +\begin{cases}
      +x^{2}+\sqrt3\,x-4=0,\\[2pt]
      +\text{or}\\[2pt]
      +3x^{2}-\sqrt3\,x-10=0 .
      +\end{cases}
      +\]
      +
      +--------------------------------------------------------------------
      +### Selecting the point in the fourth quadrant
      +
      +*From* \(x^{2}+\sqrt3\,x-4=0\)
      +
      +\[
      +x=\frac{-\sqrt3\pm\sqrt{19}}{2}.
      +\]
      +
      +The root \(\displaystyle x=\frac{-\sqrt3+\sqrt{19}}{2}>0\) gives  
      +
      +\[
      +y=x^{2}-4=\frac{11-\sqrt{57}}{2}-4=\frac{3-\sqrt{57}}{2}<0,
      +\]
      +
      +so \((x,y)\) lies in the fourth quadrant.
      +
      +*From* \(3x^{2}-\sqrt3\,x-10=0\)
      +
      +\[
      +x=\frac{\sqrt3\pm\sqrt{123}}{6},
      +\]
      +
      +which yields either \(y>0\) (first root) or \(x<0\) (second root); neither point is in the fourth quadrant.
      +
      +Hence the unique fourth‑quadrant intersection point is  
      +
      +\[
      +\Bigl(\frac{-\sqrt3+\sqrt{19}}{2}\,,\; \frac{3-\sqrt{57}}{2}\Bigr).
      +\]
      +
      +--------------------------------------------------------------------
      +### Required \(y\)-coordinate
      +
      +The \(y\)-coordinate is \(\displaystyle \frac{3-\sqrt{57}}{2}\).
      +
      +Write it as \(\frac{a-\sqrt{b}}{c}\) with \(a,b,c\) positive integers and \(\gcd(a,c)=1\):
      +\[
      +a=3,\qquad b=57,\qquad c=2.
      +\]
      +
      +Therefore  
      +
      +\[
      +a+b+c = 3+57+2 = 62.
      +\]
      +
      +\[
      +\boxed{62}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 62

      +

      Extracted Answer: 62

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Six points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \triangle BGE $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the line containing \(A,B,C,D,E,F\) be the \(x\)-axis.
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(c,0),\qquad D=(d,0),\qquad 
      +E=(e,0),\qquad F=(f,0)
      +\]
      +
      +Because the points are in the order \(A,B,C,D,E,F\),
      +
      +\[
      +c-b=AC-AB,\; d-b=BD,\; e-c=CE,\; f-d=DF,\; f-0=AF.
      +\]
      +
      +Take \(A\) at the origin.  From the data
      +
      +\[
      +AC=26\implies c=26,
      +\]
      +\[
      +BD=22\implies d=b+22,
      +\]
      +\[
      +CE=31\implies e=c+31=57,
      +\]
      +\[
      +DF=33\implies f=d+33=b+55,
      +\]
      +\[
      +AF=73\implies f=73.
      +\]
      +
      +Hence \(b+55=73\Rightarrow b=18\).  
      +Thus the coordinates are  
      +
      +\[
      +B=(18,0),\; C=(26,0),\; D=(40,0),\; E=(57,0),\; F=(73,0).
      +\]
      +
      +---
      +
      +### Locate \(G\)
      +
      +\(G\) is off the line and satisfies  
      +
      +\[
      +CG=40,\qquad DG=30.
      +\]
      +
      +Let \(G=(x,y)\) with \(y\neq0\). Then  
      +
      +\[
      +(x-26)^2+y^{2}=40^{2}=1600,\tag{1}
      +\]
      +\[
      +(x-40)^2+y^{2}=30^{2}=900.\tag{2}
      +\]
      +
      +Subtract (2) from (1):
      +
      +\[
      +(x-26)^2-(x-40)^2=700.
      +\]
      +
      +Expanding,
      +
      +\[
      +[x^{2}-52x+676]-[x^{2}-80x+1600]=28x-924=700,
      +\]
      +\[
      +28x=1624\quad\Longrightarrow\quad x=58.
      +\]
      +
      +Plugging \(x=58\) into (2):
      +
      +\[
      +(58-40)^{2}+y^{2}=900\;\Longrightarrow\;18^{2}+y^{2}=900
      +\]
      +\[
      +y^{2}=576\;\Longrightarrow\;|y|=24.
      +\]
      +
      +So \(G=(58,\,24)\) (the point \((58,-24)\) gives the same area).
      +
      +---
      +
      +### Area of \(\triangle BGE\)
      +
      +Points \(B\) and \(E\) lie on the \(x\)-axis, so the base \(BE\) has length
      +
      +\[
      +BE = e-b = 57-18 = 39.
      +\]
      +
      +The altitude from \(G\) to the line \(BE\) (the \(x\)-axis) is \(|y| = 24\).
      +
      +Hence  
      +
      +\[
      +\text{Area} = \frac12 \times BE \times \text{height}
      += \frac12 \times 39 \times 24 = 468.
      +\]
      +
      +\[
      +\boxed{468}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 468

      +

      Extracted Answer: 468

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Find the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      We need the positive integers \(n\) such that  
      +
      +\[
      +n+2\mid 3(n+3)(n^{2}+9).
      +\]
      +
      +---
      +
      +### 1.  Replace \(n+2\) by a new variable  
      +
      +Let  
      +
      +\[
      +k=n+2\qquad (k\ge 3), \qquad n=k-2 .
      +\]
      +
      +Then  
      +
      +\[
      +\begin{aligned}
      +n+3 &= (k-2)+3 = k+1,\\[2pt]
      +n^{2}+9 &= (k-2)^{2}+9 = k^{2}-4k+13 .
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +3(n+3)(n^{2}+9)=3(k+1)(k^{2}-4k+13).
      +\]
      +
      +The condition becomes  
      +
      +\[
      +k \mid 3(k+1)(k^{2}-4k+13).
      +\]
      +
      +---
      +
      +### 2.  Reduce modulo \(k\)
      +
      +Modulo \(k\),
      +
      +\[
      +k+1\equiv 1,\qquad k^{2}-4k+13\equiv 13,
      +\]
      +
      +because \(k\equiv 0\) gives \(k^{2}\equiv 0\) and \(-4k\equiv 0\).
      +
      +Thus  
      +
      +\[
      +3(k+1)(k^{2}-4k+13)\equiv 3\cdot 1\cdot 13=39 \pmod{k}.
      +\]
      +
      +Hence the divisibility condition is equivalent to  
      +
      +\[
      +k\mid 39.
      +\]
      +
      +---
      +
      +### 3.  Find admissible \(k\) and corresponding \(n\)
      +
      +The positive divisors of \(39\) are \(1,3,13,39\).
      +Since \(k=n+2\ge 3\), we keep  
      +
      +\[
      +k\in \{3,13,39\}.
      +\]
      +
      +Therefore  
      +
      +\[
      +n=k-2\in\{1,11,37\}.
      +\]
      +
      +All three values satisfy the original condition (a quick check confirms the division).
      +
      +---
      +
      +### 4.  Sum of all such \(n\)
      +
      +\[
      +1+11+37 = 49.
      +\]
      +
      +\[
      +\boxed{49}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 49

      +

      Extracted Answer: 49

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The inequalities
      +
      +\[
      +x-yz<y-zx<z-xy
      +\]
      +
      +with the plane \(x+y+z=75\) can be simplified.  
      +Write \(z=75-x-y\). Then
      +
      +\[
      +\begin{aligned}
      +y-zx-(x-yz) &= (y-x)(1+z)= (y-x)(76-x-y),\\
      +z-xy-(y-zx) &= (z-y)(1+x)= (75-x-2y)(1+x).
      +\end{aligned}
      +\]
      +
      +Thus the points on the plane satisfy  
      +
      +\[
      +(y-x)(76-x-y)>0,\qquad (75-x-2y)(1+x)>0 .
      +\tag{1}
      +\]
      +
      +Define in the \(xy\)-plane the lines  
      +
      +\[
      +\begin{aligned}
      +L_1 &: y=x,\\
      +L_2 &: x+y=76,\\
      +L_3 &: x=-1,\\
      +L_4 &: x+2y=75\;(y=(75-x)/2).
      +\end{aligned}
      +\]
      +
      +From (1) we obtain two possibilities for each product, giving four possible
      +intersections of half‑planes.  One of these intersections is empty; the other three
      +are convex.  The region for which both products in (1) are **positive** is
      +
      +\[
      +\begin{cases}
      +y>x,\\
      +x+y<76,\\
      +y<(75-x)/2,\\
      +x>-1,
      +\end{cases}
      +\]
      +
      +which in the \(xy\)-plane is the interior of the triangle with vertices
      +
      +\[
      +A(-1,-1),\qquad B(-1,38),\qquad C(25,25).
      +\]
      +
      +The other two regions are unbounded.  Hence the finite region is this triangle.
      +
      +---
      +
      +### Area in the \(xy\)-plane
      +
      +\[
      +\text{Area}_{xy}= \frac12\bigl|AB\times AC\bigr|
      +               =\frac12\bigl| (0,39)\times (26,26)\bigr|
      +               =\frac12\cdot1014 = 507 .
      +\]
      +
      +---
      +
      +### Area on the plane \(x+y+z=75\)
      +
      +The plane is given by \(z=75-x-y\).  Its area element satisfies  
      +
      +\[
      +dS = \sqrt{1+(\partial_xz)^2+(\partial_yz)^2}\;dx\,dy
      +    =\sqrt{1+1+1}\;dx\,dy =\sqrt3\,dx\,dy .
      +\]
      +
      +Hence  
      +
      +\[
      +\text{Area}_{\text{plane}} = \sqrt3\;\text{Area}_{xy}
      +                            = 507\sqrt3 .
      +\]
      +
      +So the area can be written as \(a\sqrt b\) with \(a=507,\ b=3\).
      +Therefore  
      +
      +\[
      +a+b = 507+3 = 510 .
      +\]
      +
      +\[
      +\boxed{510}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 510

      +

      Extracted Answer: 510

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +A piecewise linear periodic function is defined by $f(x)=\begin{cases}x&\text{if }x\in[-1,1)\\2-x&\text{if }x\in[1,3)\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\frac{a+b\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The intersection points satisfy  
      +
      +\[
      +y=f(x),\qquad x=34y^{2}\;( \ge 0).
      +\]
      +
      +Because \(f\) has period \(4\),
      +
      +\[
      +f(x)=\begin{cases}
      +x-4k ,&x\in[-1+4k,\,1+4k),\\[2mm]
      +2+4k-x ,&x\in[1+4k,\,3+4k),
      +\end{cases}\qquad k\in\mathbb Z .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Equations for the two linear pieces  
      +
      +*Ascending piece*  \((x-4k)\):  
      +
      +\[
      +y=x-4k,\qquad x=34y^{2}
      +\Longrightarrow 34y^{2}-y-4k=0. \tag{1}
      +\]
      +
      +*Descending piece*  \((2+4k-x)\):  
      +
      +\[
      +y=2+4k-x,\qquad x=34y^{2}
      +\Longrightarrow 34y^{2}+y-(2+4k)=0. \tag{2}
      +\]
      +
      +Both are quadratics in \(y\); each can give at most two real roots.
      +
      +--------------------------------------------------------------------
      +### 2.  Which integers \(k\) give admissible roots?
      +
      +Because \(|y|\le 1\) (the range of \(f\)), the roots must lie in \([-1,1]\).
      +
      +*For (1):*  
      +The sum of the two roots equals \(\frac{1}{34}\); the product is \(-\frac{4k}{34}\).  
      +The discriminant must be non‑negative:
      +
      +\[
      +\Delta_1=1+544k\ge 0\Longrightarrow k\ge0 .
      +\]
      +
      +For a root to be in \([-1,1)\) we also need  
      +
      +\[
      +-1\le\frac{1\pm\sqrt{1+544k}}{68}<1 .
      +\]
      +
      +The last inequality forces \(k\le8\).  Hence (1) yields real admissible roots for  
      +
      +\[
      +k=0,1,\dots ,8 .
      +\]
      +
      +Both roots are in \([-1,1)\) for each of these values.
      +
      +*For (2):*  
      +\[
      +\Delta_2=273+544k\ge0\Longrightarrow k\ge0 .
      +\]
      +
      +The condition \(-1<y\le 1\) gives \(k\le8\).  
      +For \(k=0,\dots ,7\) both roots lie in \((-1,1]\); for \(k=8\) only the “\(+\)” root
      +\[
      +y=\frac{-1+\sqrt{273+544\cdot8}}{68}
      +      =\frac{-1+5\sqrt{185}}{68}
      +\]
      +remains in the interval (the “\(-\)” root is \(<-1\)).
      +
      +Thus  
      +
      +* (1) contributes \(2\) solutions for each \(k=0,\dots ,8\)  \(\Rightarrow 18\) points;  
      +* (2) contributes \(2\) solutions for each \(k=0,\dots ,7\) and \(1\) solution for \(k=8\)  \(\Rightarrow 17\) points.
      +
      +Hence there are \(35\) intersection points altogether.
      +
      +--------------------------------------------------------------------
      +### 3.  Sum of the \(y\)-coordinates  
      +
      +For each fixed \(k\) the sum of the two roots of (1) is, by Vieta,
      +
      +\[
      +\Sigma_{A}(k)=\frac{1}{34}.
      +\]
      +
      +So the total contribution of (1) is  
      +
      +\[
      +\sum_{k=0}^{8}\Sigma_{A}(k)=9\cdot\frac{1}{34}= \frac{9}{34}.
      +\]
      +
      +For (2), when both roots exist their sum is  
      +
      +\[
      +\Sigma_{B}(k)=-\frac{1}{34}.
      +\]
      +
      +Thus for \(k=0,\dots ,7\) the total is  
      +
      +\[
      +8\cdot\Bigl(-\frac{1}{34}\Bigr)=-\frac{8}{34}.
      +\]
      +
      +For \(k=8\) only the positive root remains:
      +
      +\[
      +y_{8}= \frac{-1+5\sqrt{185}}{68}.
      +\]
      +
      +Adding everything,
      +
      +\[
      +\begin{aligned}
      +\text{Sum of all }y
      +&=\frac{9}{34}-\frac{8}{34}+y_{8}
      +   =\frac{1}{34}+ \frac{-1+5\sqrt{185}}{68}\\[2mm]
      +&= \frac{2}{68}+ \frac{-1+5\sqrt{185}}{68}
      +   =\frac{1+5\sqrt{185}}{68}.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Final answer  
      +
      +The sum is \(\displaystyle\frac{1+5\sqrt{185}}{68}\).  
      +Thus  
      +
      +\[
      +a=1,\; b=5,\; c=185,\; d=68,\qquad
      +a+b+c+d=1+5+185+68=259.
      +\]
      +
      +\[
      +\boxed{259}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 259

      +

      Extracted Answer: 259

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The 27 cells of a $3\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. 
      + | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | 
      + | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | 
      + | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | 
      + The number of different ways to fill such a grid can be written as $p^a\cdot q^b\cdot r^c\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\cdot a+q\cdot b+r\cdot c+s\cdot d$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the three rows be \(R_1,R_2,R_3\) and the three \(3\times3\) blocks be \(B_1,B_2,B_3\) (columns \(1\!-\!3,\;4\!-\!6,\;7\!-\!9\)).
      +Each row must be a permutation of \(\{1,\dots ,9\}\) and each block must also contain every digit once.
      +
      +--------------------------------------------------------------------
      +### 1.  Where does a digit appear in the three rows?
      +
      +For a fixed digit \(d\) its three copies (one in each row) must lie in three *different* blocks; otherwise a block would miss that digit.  
      +Thus for each digit we obtain a bijection  
      +
      +\[
      +\phi_d:\{1,2,3\}\longrightarrow\{1,2,3\},\qquad 
      +\phi_d(i)=\text{block containing }d\text{ in row }i .
      +\]
      +
      +So each digit corresponds to a permutation of the three blocks.  
      +There are six permutations, listed with the cells \((i,\phi(i))\) they occupy:
      +
      +\[
      +\begin{array}{c|c}
      +\text{perm.} & \text{cells}\\ \hline
      +(1)(2)(3) & (1,1),(2,2),(3,3)\\
      +(12) & (1,2),(2,1),(3,3)\\
      +(13) & (1,3),(2,2),(3,1)\\
      +(23) & (1,1),(2,3),(3,2)\\
      +(123) & (1,2),(2,3),(3,1)\\
      +(132) & (1,3),(2,1),(3,2)
      +\end{array}
      +\]
      +
      +Let \(x_1,\dots ,x_6\) be the numbers of digits that use the six permutations (in the order shown).  
      +Because each block must contain three digits from each row, each of the nine cells \((i,k)\) must be hit by exactly three digits, giving
      +
      +\[
      +\begin{aligned}
      +x_1+x_4 &=3, & x_2+x_5 &=3, & x_3+x_6 &=3,\\
      +x_2+x_6 &=3, & x_1+x_3 &=3, & x_4+x_5 &=3,\\
      +x_3+x_5 &=3, & x_4+x_6 &=3, & x_1+x_2 &=3 .
      +\end{aligned}
      +\]
      +
      +Solving, all solutions have the form  
      +
      +\[
      +(x_1,x_2,x_3,x_4,x_5,x_6)=(a,\,3-a,\,3-a,\,3-a,\,a,\,a),\qquad a\in\{0,1,2,3\}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Assign the digits to the permutations
      +
      +For a fixed \(a\) the number of ways to choose which digits get which permutation is
      +
      +\[
      +\frac{9!}{x_1!\,x_2!\,x_3!\,x_4!\,x_5!\,x_6!}
      +   =\frac{9!}{a!^{\,3}\,(3-a)!^{\,3}} .
      +\]
      +
      +Summing over the four possible values of \(a\),
      +
      +\[
      +\sum_{a=0}^3\frac{9!}{a!^{\,3}(3-a)!^{\,3}}
      +   =9!\Bigl(\frac1{3!^{\,3}}{0\choose0}^3
      +            +\frac1{3!^{\,3}}{3\choose1}^3
      +            +\frac1{3!^{\,3}}{3\choose2}^3
      +            +\frac1{3!^{\,3}}{3\choose3}^3\Bigr)
      +   =9!\,\frac{56}{216}
      +   =9!\,\frac{7}{27}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Order the digits inside each block
      +
      +Within a fixed block and a fixed row there are three column positions.
      +The three digits that belong to that macro‑cell can be placed in these
      +positions in \(3! = 6\) ways.
      +There are \(3\) rows \(\times\) \(3\) blocks \(=9\) such macro‑cells, giving a factor \(6^9\).
      +
      +--------------------------------------------------------------------
      +### 4.  Total number of fillings
      +
      +\[
      +N = \Bigl(9!\,\frac{7}{27}\Bigr)\,6^{9}
      +   = 2^{16}\,3^{10}\,5\,7^{2}.
      +\]
      +
      +Thus the factorisation uses the four distinct primes  
      +
      +\[
      +p=2,\;q=3,\;r=5,\;s=7,\qquad 
      +a=16,\;b=10,\;c=1,\;d=2 .
      +\]
      +
      +Finally,
      +
      +\[
      +p\,a+q\,b+r\,c+s\,d
      +   =2\cdot16+3\cdot10+5\cdot1+7\cdot2
      +   =32+30+5+14=81.
      +\]
      +
      +\[
      +\boxed{81}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 81

      +

      Extracted Answer: 81

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      We place the pentagon in the plane.  
      +Set  
      +
      +\[
      +\begin{aligned}
      +A&=(7,7\sqrt3),\qquad B=(0,0),\qquad C=(7,0),\\[2mm]
      +D&=\Bigl(\frac{205}{7},\frac{36\sqrt3}{7}\Bigr),\qquad 
      +E=\Bigl(\frac{218}{7},\frac{88\sqrt3}{7}\Bigr).
      +\end{aligned}
      +\]
      +
      +The lengths are as given and  
      +\(\angle B=\angle E =60^\circ\).
      +
      +--------------------------------------------------------------------
      +### 1.  Geometry of the optimal point  
      +
      +For the sum  
      +
      +\[
      +f(X)=AX+BX+CX+DX+EX,
      +\]
      +
      +the geometric median \(X\) satisfies  
      +
      +\[
      +\frac{X-A}{AX}+\frac{X-B}{BX}+\frac{X-C}{CX}+\frac{X-D}{DX}+\frac{X-E}{EX}=0 .
      +\tag{1}
      +\]
      +
      +Because \(B,E\) lie on a line, the vectors \(\frac{X-B}{BX}\) and
      +\(\frac{X-E}{EX}\) are opposite exactly when \(X\) lies on segment \(BE\);
      +hence in the optimal position \(X\) must lie on \(BE\) and the first two
      +terms in (1) cancel.  Consequently
      +
      +\[
      +\frac{X-A}{AX}+\frac{X-C}{CX}+\frac{X-D}{DX}=0,
      +\]
      +
      +so \(X\) is the Fermat point of triangle \(ACD\).
      +
      +--------------------------------------------------------------------
      +### 2.  Fermat point of \(\triangle ACD\)
      +
      +The side lengths of \(\triangle ACD\) are  
      +
      +\[
      +AC=7\sqrt3,\qquad CD=24,\qquad AD=13\sqrt3 .
      +\]
      +
      +All its angles are \(<120^\circ\); therefore the Fermat point exists.
      +For a triangle with sides \(a,b,c\) and area \(\Delta\),
      +
      +\[
      +S_{\text{Fermat}}=
      +\sqrt{\frac{a^{2}+b^{2}+c^{2}+4\sqrt3\,\Delta}{2}} .
      +\]
      +
      +Here  
      +
      +\[
      +a^{2}+b^{2}+c^{2}=576+507+147=1230,
      +\qquad\Delta_{ACD}=78\sqrt3,
      +\]
      +
      +so  
      +
      +\[
      +S_{\text{Fermat}}=\sqrt{\frac{1230+4\sqrt3\cdot78\sqrt3}{2}}
      +=\sqrt{\frac{1230+936}{2}}=\sqrt{1083}=19\sqrt3 .
      +\]
      +
      +Thus at the Fermat point  
      +
      +\[
      +AX+CX+DX=19\sqrt3 .
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  The total minimum
      +
      +Since the optimal point lies on \(BE\),
      +
      +\[
      +BX+EX = BE .
      +\]
      +
      +From the coordinates, \(BE=38\).  Combining this with (2),
      +
      +\[
      +f_{\min}= (AX+CX+DX)+(BX+EX)=19\sqrt3+38 .
      +\]
      +
      +Hence the smallest possible value of \(f(X)\) is  
      +
      +\[
      +\boxed{38+19\sqrt3}.
      +\]
      +
      +Writing it as \(m+n\sqrt p\) with \(m,n\) integers and \(p\) square‑free,
      +we have \(m=38,\;n=19,\;p=3\).  Therefore  
      +
      +\[
      +m+n+p=38+19+3=60 .
      +\]
      +
      +\[
      +\boxed{60}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 60

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +The product $ \prod_{k=4}^{63} \frac{\log_k(5^{k^2-1})}{\log_{k+1}(5^{k^2-4})} = \frac{\log_4(5^{15})}{\log_5(5^{12})} \cdot \frac{\log_5(5^{24})}{\log_6(5^{21})} \cdot \frac{\log_6(5^{35})}{\log_7(5^{32})} \cdots \frac{\log_{63}(5^{3968})}{\log_{64}(5^{3965})} $ is equal to $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +P=\prod_{k=4}^{63}\frac{\log_k\!\bigl(5^{k^{2}-1}\bigr)}{\log_{k+1}\!\bigl(5^{k^{2}-4}\bigr)}
      +\]
      +
      +---
      +
      +### 1.  Simplify each factor  
      +
      +\[
      +\log_k\!\bigl(5^{k^{2}-1}\bigr)=(k^{2}-1)\log_k5,
      +\qquad 
      +\log_{k+1}\!\bigl(5^{k^{2}-4}\bigr)=(k^{2}-4)\log_{k+1}5 .
      +\]
      +
      +Hence  
      +
      +\[
      +\frac{\log_k\!\bigl(5^{k^{2}-1}\bigr)}{\log_{k+1}\!\bigl(5^{k^{2}-4}\bigr)}
      +=\frac{k^{2}-1}{k^{2}-4}\cdot\frac{\log_k5}{\log_{k+1}5}
      +=\frac{(k-1)(k+1)}{(k-2)(k+2)}\cdot\frac{\log_k5}{\log_{k+1}5}.
      +\]
      +
      +Therefore  
      +
      +\[
      +P=\underbrace{\prod_{k=4}^{63}\frac{(k-1)(k+1)}{(k-2)(k+2)}}_{A}
      +   \times\underbrace{\prod_{k=4}^{63}\frac{\log_k5}{\log_{k+1}5}}_{B}.
      +\]
      +
      +---
      +
      +### 2.  Evaluate the rational product \(A\)
      +
      +\[
      +A=\Bigl(\prod_{k=4}^{63}\frac{k-1}{k-2}\Bigr)
      +   \Bigl(\prod_{k=4}^{63}\frac{k+1}{k+2}\Bigr)
      +   =\frac{3\cdot4\cdots62}{2\cdot3\cdots61}\;
      +     \frac{5\cdot6\cdots64}{6\cdot7\cdots65}.
      +\]
      +
      +Both products telescope:
      +
      +\[
      +\frac{3\cdot4\cdots62}{2\cdot3\cdots61}= \frac{62}{2}=31,
      +\qquad 
      +\frac{5\cdot6\cdots64}{6\cdot7\cdots65}= \frac{5}{65}= \frac1{13}.
      +\]
      +
      +Thus  
      +
      +\[
      +A=31\cdot\frac1{13}= \frac{31}{13}.
      +\]
      +
      +---
      +
      +### 3.  Evaluate the logarithmic product \(B\)
      +
      +\[
      +B=\frac{\log_4 5}{\log_5 5}\cdot\frac{\log_5 5}{\log_6 5}\cdots
      +    \frac{\log_{63}5}{\log_{64}5}
      +   =\frac{\log_4 5}{\log_{64}5}.
      +\]
      +
      +Using change‑of‑base,
      +\[
      +\frac{\log_4 5}{\log_{64} 5}
      +   =\frac{\frac{\ln5}{\ln4}}{\frac{\ln5}{\ln64}}
      +   =\frac{\ln64}{\ln4}
      +   =\log_4 64=3,
      +\]
      +since \(4^3=64\).
      +
      +Hence \(B=3\).
      +
      +---
      +
      +### 4.  Combine
      +
      +\[
      +P=A\cdot B=\frac{31}{13}\times 3=\frac{93}{13}.
      +\]
      +
      +The fraction \(\dfrac{93}{13}\) is already in lowest terms, so  
      +\(m=93,\; n=13\).
      +
      +\[
      +m+n=93+13=106.
      +\]
      +
      +\[
      +\boxed{106}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 106

      +

      Extracted Answer: 106

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The divisors of  
      +
      +\[
      +2025=3^{4}\cdot5^{2}
      +\]
      +
      +are exactly the numbers  
      +
      +\[
      +3^{a}5^{b}\qquad (0\le a\le 4,\;0\le b\le 2).
      +\]
      +
      +Hence  
      +
      +\[
      +|A|=(4+1)(2+1)=15 .
      +\]
      +
      +For a subset \(B\subseteq A\) the least common multiple is
      +
      +\[
      +\operatorname{lcm}(B)=3^{\max a}\,5^{\max b},
      +\]
      +
      +where the maxima are taken over the exponents \((a,b)\) of the elements of \(B\).
      +
      +Thus \(\operatorname{lcm}(B)=2025=3^4 5^2\) iff  
      +
      +* at least one element of \(B\) has a \(3\)-exponent \(4\);
      +* at least one element of \(B\) has a \(5\)-exponent \(2\).
      +
      +Define  
      +
      +\[
      +D_3=\{d\in A : \text{the exponent of }3\text{ in }d\text{ is }4\},
      +\qquad 
      +D_5=\{d\in A : \text{the exponent of }5\text{ in }d\text{ is }2\}.
      +\]
      +
      +Counting:
      +
      +* \(D_3\): \(a=4\) and \(b=0,1,2\) ⇒ \(|D_3|=3\) (81, 405, 2025).
      +* \(D_5\): \(b=2\) and \(a=0,1,2,3,4\) ⇒ \(|D_5|=5\) (25, 75, 225, 675, 2025).
      +* The intersection is \(\{2025\}\); so \(|D_3\cap D_5|=1\).
      +
      +We need subsets that contain at least one element of \(D_3\) **and** at least one element of \(D_5\).
      +
      +Let the total number of subsets of \(A\) be \(2^{15}\).
      +Let  
      +
      +\[
      +\begin{aligned}
      +A_1 &=\{\text{subsets that contain no element of } D_3\},\\
      +A_2 &=\{\text{subsets that contain no element of } D_5\}.
      +\end{aligned}
      +\]
      +
      +Then  
      +
      +\[
      +|A_1|=2^{15-3}=2^{12},\qquad 
      +|A_2|=2^{15-5}=2^{10}.
      +\]
      +
      +Subsets avoiding **both** \(D_3\) and \(D_5\) avoid the union \(D_3\cup D_5\) which has  
      +
      +\[
      +|D_3\cup D_5|=|D_3|+|D_5|-|D_3\cap D_5|=3+5-1=7
      +\]
      +
      +elements. Hence  
      +
      +\[
      +|A_1\cap A_2|=2^{15-7}=2^{8}.
      +\]
      +
      +By inclusion–exclusion, the number of subsets that contain at least one element from each of \(D_3\) and \(D_5\) is  
      +
      +\[
      +\begin{aligned}
      +N &= 2^{15}-|A_1|-|A_2|+|A_1\cap A_2|\\
      +   &= 2^{15}-2^{12}-2^{10}+2^{8}\\
      +   &= 32768-4096-1024+256\\
      +   &= 27904.
      +\end{aligned}
      +\]
      +
      +All these subsets are non‑empty, so the required probability is  
      +
      +\[
      +\frac{N}{2^{15}}=\frac{27904}{32768}.
      +\]
      +
      +Simplifying,
      +
      +\[
      +\frac{27904}{32768}= \frac{27904\div 256}{32768\div 256}
      +                 = \frac{109}{128}.
      +\]
      +
      +Thus \(m=109,\; n=128\) and  
      +
      +\[
      +m+n = 109+128 = 237.
      +\]
      +
      +\[
      +\boxed{237}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 237

      +

      Extracted Answer: 237

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Four unit squares form a $2 \times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Label the twelve unit segments as in the picture  
      +
      +\[
      +\begin{array}{c}
      +\text{external: }a_1,a_2,b_1,b_2,c_1,c_2,d_1,d_2\\[2mm]
      +\text{internal: }e_1,e_2,f_1,f_2
      +\end{array}
      +\]
      +
      +The four unit squares are  
      +
      +\[
      +\begin{aligned}
      +\text{TL}&:\;a_1,c_1,e_1,f_1,\\
      +\text{TR}&:\;b_1,c_2,e_1,f_2,\\
      +\text{BL}&:\;a_2,d_1,e_2,f_1,\\
      +\text{BR}&:\;b_2,d_2,e_2,f_2 .
      +\end{aligned}
      +\]
      +
      +Each square must contain exactly two red sides (hence also two blue sides).
      +
      +--------------------------------------------------------------------
      +### 1.  Reduce to the four internal edges
      +
      +For a given square the two sides that are **internal** are already
      +colored once we decide the colors of the four internal edges  
      +\(e_1,e_2,f_1,f_2\).  
      +
      +Let  
      +
      +\[
      +r_{\rm TL}=e_1+f_1,\qquad
      +r_{\rm TR}=e_1+f_2,\qquad
      +r_{\rm BL}=e_2+f_1,\qquad
      +r_{\rm BR}=e_2+f_2 ,
      +\]
      +
      +where a red edge contributes 1 and a blue edge contributes 0.
      +If a square has \(r\) red internal sides, then it must have \(2-r\)
      +red external sides. Thus
      +
      +* if \(r=0\): both external sides are forced red – 1 way;
      +* if \(r=1\): exactly one of the two external sides must be red – 2 ways;
      +* if \(r=2\): both external sides are forced blue – 1 way.
      +
      +Hence for a fixed choice of the four internal edges the number of
      +admissible colourings of the eight external edges equals
      +
      +\[
      +2^{\,N_1},
      +\]
      +
      +where \(N_1\) is the number of squares among TL, TR, BL, BR that have
      +exactly one red internal side.
      +
      +--------------------------------------------------------------------
      +### 2.  Express \(N_1\) in terms of the internal edges
      +
      +Write  
      +
      +\[
      +X_1=e_1,\; X_2=e_2,\qquad Y_1=f_1,\;Y_2=f_2\qquad(\text{red}=1,\text{blue}=0).
      +\]
      +
      +For a square \((i,j)\) (\(i,j\in\{1,2\}\)) the number of red internal
      +sides is \(X_i+Y_j\).
      +Thus a square has exactly one red internal side precisely when
      +\(X_i\neq Y_j\).
      +
      +Let  
      +
      +\[
      +a=X_1+X_2\;(=0,1,2),\qquad b=Y_1+Y_2\;(=0,1,2).
      +\]
      +
      +The number of ordered pairs \((i,j)\) with \(X_i\neq Y_j\) is  
      +
      +\[
      +N_1=a(2-b)+(2-a)b
      +      =2\bigl(a+b-ab\bigr).
      +\]
      +
      +Consequently the contribution of a configuration with given
      +\(a,b\) is  
      +
      +\[
      +2^{N_1}=2^{\,2(a+b-ab)}=4^{\,a+b-ab}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Count all configurations of the internal edges
      +
      +There are \(\binom{2}{a}\) ways to choose which vertical internal edges
      +are red, and \(\binom{2}{b}\) ways to choose which horizontal internal
      +edges are red.  Hence the total number of colourings is
      +
      +\[
      +\sum_{a=0}^{2}\sum_{b=0}^{2}
      +\binom{2}{a}\binom{2}{b}\;4^{\,a+b-ab}.
      +\]
      +
      +Evaluating the double sum:
      +
      +\[
      +\begin{array}{c|ccc}
      +a\backslash b &0&1&2\\\hline
      +0 &1\cdot1\cdot1=1 &1\cdot2\cdot4=8 &1\cdot1\cdot16=16\\
      +1 &2\cdot1\cdot4=8 &2\cdot2\cdot4=16 &2\cdot1\cdot4=8\\
      +2 &1\cdot1\cdot16=16 &1\cdot2\cdot4=8 &1\cdot1\cdot1=1
      +\end{array}
      +\]
      +
      +Adding all entries:
      +
      +\[
      +1+8+16+8+16+8+16+8+1=82.
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Answer
      +
      +Thus there are  
      +
      +\[
      +\boxed{82}
      +\]
      +
      +different ways to colour the twelve unit segments so that each of the
      +four unit squares has two red sides and two blue sides.
      +
      +
      +

      Results

      +

      Correct Answer: 82

      +

      Extracted Answer: 82

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Circle $\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\omega_2$ with radius 15. Points $C$ and $D$ lie on $\omega_2$ such that $\overline{BC}$ is a diameter of $\omega_2$ and $\overline{BC} \perp \overline{AD}$. The rectangle $EFGH$ is inscribed in $\omega_1$ such that $\overline{EF} \perp \overline{BC}$, $C$ is closer to $\overline{GH}$ than to $\overline{EF}$, and $D$ is closer to $\overline{FG}$ than to $\overline{EH}$, as shown. Triangles $\triangle DGF$ and $\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The circles are drawn as in the figure.
      +
      +* Let \(O\) be the centre of \(\omega _2\) (radius \(15\)).
      +* Let \(A\) be the centre of \(\omega _1\) (radius \(6\)).
      +* Since \(\omega _1\) is internally tangent to \(\omega _2\) at \(B\), the three points are collinear and  
      +
      +\[
      +OA=15-6=9 .
      +\]
      +
      +Take a coordinate system with  
      +
      +\[
      +O=(0,0),\qquad A=(9,0),\qquad B=(15,0).
      +\]
      +
      +--------------------------------------------------------------------
      +### Points \(C\) and \(D\)
      +
      +\(BC\) is a diameter of \(\omega _2\); hence \(C\) is the antipode of \(B\):
      +
      +\[
      +C=(-15,0).
      +\]
      +
      +\(BC\perp AD\) means \(AD\) is the vertical line \(x=9\).  
      +Intersecting this line with \(\omega _2\) gives  
      +
      +\[
      +9^2+y^2=15^2 \Longrightarrow y=\pm 12 .
      +\]
      +
      +Because the later condition “\(D\) is nearer to \(FG\) than to \(EH\)” forces \(D\) to lie **below** the centre, we take  
      +
      +\[
      +D=(9,-12).
      +\]
      +
      +--------------------------------------------------------------------
      +### The rectangle \(EFGH\)
      +
      +The rectangle is inscribed in \(\omega _1\) and \(\overline{EF}\perp BC\); hence \(\overline{EF}\) is vertical.
      +Let
      +
      +\[
      +\begin{aligned}
      +E&=(9+w,\;h),\\[2pt]
      +F&=(9+w,\;-h),\\[2pt]
      +G&=(9-w,\;-h),\\[2pt]
      +H&=(9-w,\;h),
      +\end{aligned}
      +\]
      +
      +so that the centre of the rectangle is \(A\) (the intersection of the diagonals of an
      +inscribed rectangle is the centre of the circumcircle).
      +
      +Because the four vertices lie on \(\omega _1\),
      +
      +\[
      +(9\pm w-9)^2+h^2=w^{2}+h^{2}=6^{2}=36\qquad\Longrightarrow\qquad w^{2}+h^{2}=36. \tag{1}
      +\]
      +
      +The side \(\overline{EF}\) is the right vertical side, thus
      +\(C\) (which is far left) is nearer to \(\overline{GH}\) (the left side) than to \(\overline{EF}\);
      +and \(D\) (which is below the centre) is nearer to \(\overline{FG}\) (the bottom side) than to \(\overline{EH}\) (the top side).  
      +These statements only fix the labeling of the rectangle.
      +
      +--------------------------------------------------------------------
      +### Equality of the two triangular areas
      +
      +\[
      +\begin{aligned}
      +\text{Area}\,\triangle DGF
      +&=\frac12\bigl(\underbrace{2w}_{\text{base }GF}\bigr)
      +     \bigl(\underbrace{12-h}_{\text{vertical height}}\bigr)
      + = w(12-h),\\[4pt]
      +\text{Area}\,\triangle CHG
      +&=\frac12\bigl(\underbrace{2h}_{\text{base }HG}\bigr)
      +     \bigl(\underbrace{24-w}_{\text{horizontal distance}}\bigr)
      + = h(24-w).
      +\end{aligned}
      +\]
      +
      +Given that the two areas are equal,
      +
      +\[
      +w(12-h)=h(24-w)\; \Longrightarrow\; 12w=24h\; \Longrightarrow\; w=2h. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### Solving for \(w\) and \(h\)
      +
      +Substituting \(w=2h\) into (1):
      +
      +\[
      +(2h)^2+h^{2}=36\;\Longrightarrow\;5h^{2}=36\;\Longrightarrow\;h^{2}= \frac{36}{5}.
      +\]
      +
      +Hence  
      +
      +\[
      +h=\frac{6}{\sqrt5},\qquad w=2h=\frac{12}{\sqrt5}.
      +\]
      +
      +--------------------------------------------------------------------
      +### Area of the rectangle
      +
      +The rectangle’s side lengths are \(2w\) and \(2h\), so
      +
      +\[
      +\text{Area}= (2w)(2h)=4wh
      +          =4\left(\frac{12}{\sqrt5}\right)\left(\frac{6}{\sqrt5}\right)
      +          =4\cdot\frac{72}{5}
      +          =\frac{288}{5}.
      +\]
      +
      +Thus the area is \(\displaystyle\frac{m}{n}=\frac{288}{5}\) with relatively prime
      +\(m=288,\;n=5\).
      +
      +\[
      +m+n=288+5=293.
      +\]
      +
      +\[
      +\boxed{293}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 293

      +

      Extracted Answer: 293

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +From an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.
      +
      +In general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +N=25q+r ,\qquad 0\le r\le 24 .
      +\]
      +
      +The greedy algorithm takes  
      +
      +* \(q\) quarters,  
      +* \(\displaystyle d_0=\Big\lfloor\frac r{10}\Big\rfloor\) dimes,  
      +* \(s_0=r\bmod 10\) pennies.  
      +
      +Hence  
      +
      +\[
      +C_{\text{greedy}}=q+d_0+s_0 .\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  When can a better solution use fewer quarters?
      +
      +Suppose we use only \(q-k\) quarters, \(k\ge1\).  
      +The remaining amount is  
      +
      +\[
      +R=r+25k .
      +\]
      +
      +With only dimes and pennies the optimal way to make \(R\) is  
      +
      +\[
      +\Big\lfloor\frac{R}{10}\Big\rfloor\text{ dimes }+ (R\bmod10)\text{ pennies}.
      +\]
      +
      +Thus the total number of coins for this choice is  
      +
      +\[
      +C(q-k)=(q-k)+\Big\lfloor\frac{r+25k}{10}\Big\rfloor+(r+25k\bmod10).\tag{2}
      +\]
      +
      +Let  
      +
      +\[
      +\Delta(k)=C(q-k)-C_{\text{greedy}} .
      +\]
      +
      +Using \(r=10t+a\;(0\le a\le9,\;t\in\{0,1,2\})\) we obtain after a short calculation  
      +
      +\[
      +\Delta(k)=6k-9\Big\lfloor\frac{a+5k}{10}\Big\rfloor .\tag{3}
      +\]
      +
      +(Only the last digit \(a=r\bmod 10\) matters.)
      +
      +--------------------------------------------------------------------
      +### 2.  Sign of \(\Delta(k)\)
      +
      +*If \(a\ge5\):*  
      +Take \(k=1\).  Then \(\lfloor\frac{a+5}{10}\rfloor=1\) and  
      +
      +\[
      +\Delta(1)=6-9=-3<0 .
      +\]
      +
      +Hence a better solution exists (remove one quarter).
      +
      +*If \(a\le4\):*  
      +For any \(k\ge1\),
      +
      +\[
      +\Delta(k)=6k-9\Big\lfloor\frac{a+5k}{10}\Big\rfloor
      +\ge 6k-9\frac{a+5k}{10}=1.5k-0.9a .
      +\]
      +
      +Since \(a\le4\) this is positive for \(k=1,2\) (indeed \(\Delta(1)=6,\,\Delta(2)=3\)) and for larger \(k\) the term \(1.5k\) dominates, so \(\Delta(k)\ge0\) for all \(k\).
      +
      +Therefore **greedy fails iff**  
      +
      +\[
      +a=r\bmod10\ge5\quad\text{and}\quad q\ge1 .
      +\]
      +
      +Equivalently, for \(N\ge25\),
      +
      +\[
      +N\bmod25\in\{5,6,7,8,9,15,16,17,18,19\}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Counting the failures
      +
      +The residues above are ten out of the twenty‑five possible residues modulo \(25\).  
      +
      +In the interval \(1\le N\le1000\) we have \(1000/25=40\) full periods, so each residue occurs \(40\) times.  
      +
      +Thus the total number of integers with those residues is  
      +
      +\[
      +10\times40=400.
      +\]
      +
      +But the ten numbers \(5,6,7,8,9,15,16,17,18,19\) are \< 25, and for them greedy cannot remove a quarter (there are no quarters in any representation).  Those ten are **not** failures.  
      +
      +Hence the genuine failures are  
      +
      +\[
      +400-10=390.
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Successes
      +
      +There are \(1000\) integers from \(1\) to \(1000\).  Therefore the number of values for which the greedy algorithm *succeeds* is
      +
      +\[
      +1000-390=610.
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{610}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 610

      +

      Extracted Answer: 610

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are $ n $ values of $ x $ in the interval $ 0 < x < 2\pi $ where $ f(x) = \sin(7\pi \cdot \sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      \[
      +f(x)=\sin\bigl(7\pi\sin(5x)\bigr)
      +\]
      +
      +---
      +
      +### 1.  Zeros of \(f\)
      +
      +\(f(x)=0\iff 7\pi\sin(5x)=k\pi\) for an integer \(k\).
      +
      +\[
      +\sin(5x)=\frac{k}{7},\qquad |k|\le 7 .
      +\]
      +
      +Let  
      +
      +\[
      +y=5x\;(0<y<10\pi).
      +\]
      +
      +For each integer \(k\) with \(|k|\le7\) we count the solutions of \(\sin y=\dfrac{k}{7}\) in \((0,10\pi)\).
      +
      +* \(k=7\)  : \(\sin y=1\).  Solutions \(y=\frac{\pi}{2}+2\pi n\) \((n=0,1,2,3,4)\) → **5** solutions.  
      +* \(k=-7\) : \(\sin y=-1\).  Solutions \(y=\frac{3\pi}{2}+2\pi n\) \((n=0,1,2,3,4)\) → **5** solutions.  
      +* \(k=0\)  : \(\sin y=0\).  Solutions \(y=m\pi\;(m=1,2,\dots ,9)\) → **9** solutions.  
      +* For each \(k=\pm1,\pm2,\pm3,\pm4,\pm5,\pm6\) we have \(\sin y=c\) with \(-1<c<1,\;c\neq0\).  
      +  In each of the 5 full periods of \(\sin y\) there are exactly two such points, so **\(5\cdot2=10\)** solutions per \(k\).
      +
      +There are 12 values of \(k\) with \(|k|\in\{1,\dots ,6\}\), giving  
      +
      +\[
      +12\times10=120\text{ solutions}.
      +\]
      +
      +Adding all contributions,
      +
      +\[
      +n=5+5+9+120=139 .
      +\]
      +
      +---
      +
      +### 2.  Tangent zeros
      +
      +The graph is tangent to the \(x\)-axis at a zero where the derivative also vanishes.
      +
      +\[
      +f'(x)=\cos\bigl(7\pi\sin(5x)\bigr)\cdot 35\pi\cos(5x).
      +\]
      +
      +At a zero, \(\sin\bigl(7\pi\sin(5x)\bigr)=0\) gives \(\sin(5x)=\dfrac{k}{7}\).  
      +Because \(\cos\bigl(7\pi\sin(5x)\bigr)=\pm1\neq0\), we must have \(\cos(5x)=0\).
      +
      +\[
      +\cos(5x)=0\Longrightarrow \sin(5x)=\pm1 .
      +\]
      +
      +Thus tangential zeros occur exactly when \(\sin(5x)=\pm1\), i.e. for \(k=\pm7\).
      +
      +We already counted those solutions:  
      +
      +* \(\sin(5x)=1\) → 5 points,  
      +* \(\sin(5x)=-1\) → 5 points.
      +
      +Hence  
      +
      +\[
      +t=5+5=10 .
      +\]
      +
      +---
      +
      +### 3.  Required sum
      +
      +\[
      +n+t=139+10=149.
      +\]
      +
      +\[
      +\boxed{149}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 149

      +

      Extracted Answer: 149

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let the vertices of the regular \(24\)-gon be numbered \(0,1,\dots ,23\) (mod \(24\)).
      +If a segment joins vertex \(i\) to vertex \(j\) we call its **step**
      +\[
      +k\equiv j-i\pmod{24},\qquad 1\le k\le 12 .
      +\]
      +
      +The length of a chord depends only on this step:
      +the chord of step \(k\) has length  
      +
      +\[
      +\ell(k)=2R\sin\frac{\pi k}{24},\qquad 1\le k\le 12 .
      +\]
      +
      +Since \(\sin(\theta )\) is strictly increasing on \([0,\frac{\pi}{2}]\),
      +the lengths \(\ell(1),\ell(2),\dots ,\ell(12)\) are all distinct.
      +Thus a drawing in which all 12 segments have the same length must use
      +edges whose step is a fixed \(k\) (the same chord length).
      +
      +--------------------------------------------------------------------
      +
      +### 1.  The graph of step \(k\)
      +
      +Consider the undirected graph \(G_k\) whose vertices are the 24 polygon vertices
      +and whose edges are all chords of step \(k\) (i.e. the pairs \(\{i,i+k\}\)).
      +Each vertex of \(G_k\) is incident to two such chords
      +(\(i\) connects to \(i+k\) and to \(i-k\)), so \(G_k\) is a disjoint union of
      +cycles.
      +
      +Let  
      +
      +\[
      +d=\gcd(24,k).
      +\]
      +
      +Then the vertices split into \(d\) cycles, each of length  
      +
      +\[
      +\frac{24}{d}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 2.  When can a perfect matching be formed?
      +
      +A perfect matching can be taken inside one cycle only when the cycle has even
      +length.  Hence we need \(\frac{24}{d}\) even, i.e. \(d\neq 8\).  
      +
      +* If \(d=8\) (the case \(k=8\)) each component is a triangle; a triangle has
      +no perfect matching, so **no drawing** is possible.
      +
      +* If the cycle length is \(2\) (the case \(d=12,\;k=12\)), each component is a
      +single edge; there is exactly **one** perfect matching – the 12 diameters.
      +
      +* For any other admissible \(k\) the cycles have even length \(\ge4\).
      +Inside each such cycle there are exactly two ways to choose a perfect matching
      +(alternate edges).  Since the cycles are independent, the number of perfect
      +matchings for the given \(k\) is  
      +
      +\[
      +2^{\,d}\qquad (d=\gcd(24,k),\;d\neq 8,\;k\neq 12).
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 3.  Counting for each step
      +
      +\[
      +\begin{array}{c|c|c|c}
      +k & d=\gcd(24,k) & \text{cycle length }24/d & \#\text{ matchings}\\ \hline
      +1 & 1 & 24 & 2\\
      +2 & 2 & 12 & 2^{2}=4\\
      +3 & 3 & 8 & 2^{3}=8\\
      +4 & 4 & 6 & 2^{4}=16\\
      +5 & 1 & 24 & 2\\
      +6 & 6 & 4 & 2^{6}=64\\
      +7 & 1 & 24 & 2\\
      +8 & 8 & 3 & 0\\
      +9 & 3 & 8 & 2^{3}=8\\
      +10& 2 & 12& 2^{2}=4\\
      +11& 1 & 24& 2\\
      +12&12 & 2 & 1\ (\text{forced diameters})
      +\end{array}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +### 4.  Total number of drawings
      +
      +Add the numbers of matchings over all admissible steps:
      +
      +\[
      +\begin{aligned}
      +N&=2+4+8+16+2+64+2+8+4+2+1\\
      +&=113 .
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{113}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 113

      +

      Extracted Answer: 113

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Sixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The 8 occupied chairs must avoid a configuration where a person has two neighbours.  
      +Hence no three occupied chairs may be consecutive.
      +
      +Let a be the number of blocks of two consecutive occupied chairs.  
      +Each block of two contributes an extra occupied chair, so the total number of blocks is  
      +
      +\[
      +b = 8-a\qquad (0\le a\le 4).
      +\]
      +
      +*Choosing which blocks are of size 2*: \(\displaystyle \binom{b}{a}\).
      +
      +There are \(16-8=8\) empty chairs. Between the \(b\) blocks there must be at least one empty chair, using \(b-1\) empties.  
      +The remaining \(8-(b-1)=9-b\) empty chairs can be placed in the \(b+1\) gaps (before the first block, after the last, and the \(b-1\) internal gaps) without restriction.  
      +
      +Number of ways to distribute them:  
      +
      +\[
      +\binom{(9-b)+(b+1)-1}{(b+1)-1}= \binom{9}{b}.
      +\]
      +
      +Thus for a given \(a\),
      +
      +\[
      +\text{ways}= \binom{b}{a}\binom{9}{b}
      +          =\binom{8-a}{a}\binom{9}{8-a}.
      +\]
      +
      +Summing over \(a=0,1,2,3,4\),
      +
      +\[
      +\begin{aligned}
      +N &=\binom{8}{0}\binom{9}{8} 
      +   +\binom{7}{1}\binom{9}{7}
      +   +\binom{6}{2}\binom{9}{6}
      +   +\binom{5}{3}\binom{9}{5}
      +   +\binom{4}{4}\binom{9}{4} \\[2mm]
      +  &= 1\cdot 9 + 7\cdot 36 + 15\cdot 84 + 10\cdot 126 + 1\cdot126\\
      +  &= 9+252+1260+1260+126 = 2907.
      +\end{aligned}
      +\]
      +
      +Therefore  
      +
      +\[
      +N \equiv 2907 \pmod{1000}=907.
      +\]
      +
      +\[
      +\boxed{907}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 907

      +

      Extracted Answer: 907

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ A_1A_2 \ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:
      +* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \leq i \leq 10 $,
      +* $ \cos(\angle A_iA_1A_{i+1}) = \frac{12}{13} $ for each $ 2 \leq i \leq 10 $,
      +* The perimeter of $ A_1A_2 \ldots A_{11} $ is 20.
      +If $ A_1A_2 + A_1A_{11} $ can be expressed as $ \frac{m\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +r_i=|A_1A_i| \qquad (i=2,\dots ,11)
      +\]
      +
      +and denote  
      +
      +\[
      +\theta=\angle A_iA_1A_{i+1}\qquad (2\le i\le 10).
      +\]
      +
      +Because  
      +
      +\[
      +\cos\theta=\frac{12}{13}\;\Longrightarrow\;\sin\theta=\frac{5}{13},
      +\]
      +
      +the area of \(\triangle A_iA_1A_{i+1}\) is  
      +
      +\[
      +\frac12 r_i r_{i+1}\sin\theta
      +   =\frac12 r_i r_{i+1}\frac{5}{13}=1 .
      +\]
      +
      +Hence  
      +
      +\[
      +r_i r_{i+1}= \frac{26}{5}=K\qquad (2\le i\le 10). \tag{1}
      +\]
      +
      +From (1),
      +
      +\[
      +r_{i+2}= \frac{K}{r_{i+1}}=r_i ,
      +\]
      +
      +so the distances from \(A_1\) alternate:
      +
      +\[
      +r_2=r_4=r_6=r_8=r_{10}=a,\qquad
      +r_3=r_5=r_7=r_9=r_{11}=b,
      +\]
      +
      +with  
      +
      +\[
      +ab=K=\frac{26}{5}. \tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### Lengths of the other sides
      +
      +For any \(i=2,\dots ,10\) the side \(A_iA_{i+1}\) (call it \(L\)) satisfies the law of cosines:
      +
      +\[
      +L^2=a^{2}+b^{2}-2ab\cos\theta
      +      =a^{2}+b^{2}-2ab\frac{12}{13}.
      +\]
      +
      +Using (2),
      +
      +\[
      +L^2=a^{2}+b^{2}-\frac{24}{13}\cdot\frac{26}{5}
      +    =a^{2}+b^{2}-\frac{48}{5}.
      +\]
      +
      +Since \(a^{2}+b^{2}=(a+b)^{2}-2ab\),
      +
      +\[
      +L^2=(a+b)^{2}-2\frac{26}{5}-\frac{48}{5}
      +     =(a+b)^{2}-20.
      +\]
      +
      +Let  
      +
      +\[
      +s=a+b.
      +\]
      +
      +Then  
      +
      +\[
      +L=\sqrt{s^{2}-20}. \tag{3}
      +\]
      +
      +--------------------------------------------------------------------
      +### Using the perimeter
      +
      +The perimeter of the 11‑gon is
      +
      +\[
      +|A_1A_2|+|A_1A_{11}|+\sum_{i=2}^{10}|A_iA_{i+1}|
      += a+b+9L = s+9\sqrt{s^{2}-20}=20.
      +\]
      +
      +Set \(t=\sqrt{s^{2}-20}>0\). Then \(s=20-9t\) and
      +
      +\[
      +t^{2}=s^{2}-20=(20-9t)^{2}-20.
      +\]
      +
      +Solving,
      +
      +\[
      +t^{2}=380-360t+81t^{2}
      +\Longrightarrow 80t^{2}-360t+380=0
      +\Longrightarrow 4t^{2}-18t+19=0.
      +\]
      +
      +Hence  
      +
      +\[
      +t=\frac{18\pm\sqrt{324-304}}{8}
      +   =\frac{18\pm2\sqrt5}{8}
      +   =\frac{9\pm\sqrt5}{4}.
      +\]
      +
      +If the plus sign is taken, \(t>\frac{20}{9}\) and \(s=20-9t<0\), impossible.
      +Thus  
      +
      +\[
      +t=\frac{9-\sqrt5}{4},
      +\qquad
      +s=20-9t=\frac{9\sqrt5-1}{4}.
      +\]
      +
      +Consequently  
      +
      +\[
      +A_1A_2+A_1A_{11}=s=\frac{9\sqrt5-1}{4}.
      +\]
      +
      +Written as \(\dfrac{m\sqrt n-p}{q}\) we have  
      +
      +\[
      +m=9,\;n=5,\;p=1,\;q=4,
      +\]
      +
      +so  
      +
      +\[
      +m+n+p+q=9+5+1+4=19.
      +\]
      +
      +\[
      +\boxed{19}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 19

      +

      Extracted Answer: 19

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Alex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Step 1.  Regions created by chords**
      +
      +If a circle already has \(k\) chords drawn in its interior, then a new chord
      +adds one region for itself plus one extra region for every interior
      +intersection it creates.  
      +Thus for a set of \(n\) chords
      +
      +\[
      +\text{# regions}=n+1+\text{# interior intersection points.}
      +\]
      +
      +In our problem we have  
      +
      +* 2 fixed diameters (the two perpendicular ones),  
      +* 25 random chords.
      +
      +Hence \(n=27\).  
      +We only have to find the expected number \(I\) of interior intersection
      +points.
      +
      +\[
      +E[\text{regions}]=27+1+E[I]=28+E[I].
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 2.  Intersections involving the two diameters**
      +
      +Let the horizontal diameter be the line that separates the *upper* quadrants
      +\(Q_{1},Q_{2}\) from the *lower* quadrants \(Q_{3},Q_{4}\).
      +
      +A random chord has its two endpoints in different quadrants.
      +The chord meets the horizontal diameter exactly when the endpoints lie in
      +different half‑planes, i.e. one endpoint is in \(\{Q_{1},Q_{2}\}\) and the
      +other in \(\{Q_{3},Q_{4}\}\).
      +
      +For the ordered pair of quadrants of a random chord there are  
      +\(12\) equally likely possibilities (the \(4\cdot 3\) ordered pairs with
      +different quadrants).  
      +Exactly \(8\) of them have the endpoints in opposite half‑planes, hence
      +
      +\[
      +p_d=\Pr(\text{a random chord meets a given diameter})=\frac{8}{12}=
      +\frac{2}{3}.
      +\]
      +
      +Therefore
      +
      +\[
      +\boxed{\text{Expected intersections of the 25 chords with one diameter}=25\cdot\frac23}
      +\]
      +
      +and with the two diameters together
      +
      +\[
      +E[I_{\text{diameters}}]=2\cdot25\cdot\frac23=\frac{100}{3}.
      +\]
      +
      +The two diameters intersect each other once, so add \(1\) more interior
      +intersection.
      +
      +--------------------------------------------------------------------
      +
      +**Step 3.  Intersections of two random chords**
      +
      +Denote the four endpoints by  
      +\(\alpha_1,\alpha_2\) (chord 1) and \(\beta_1,\beta_2\) (chord 2).  
      +All four points are independent uniform on the circle.
      +
      +Let  
      +
      +\[
      +A=\{\text{endpoints of chord 1 lie in different quadrants}\},\qquad 
      +B=\{\text{endpoints of chord 2 lie in different quadrants}\}.
      +\]
      +
      +\[
      +P(A)=P(B)=\frac34 .
      +\]
      +
      +Two chords intersect iff the endpoints are interleaved on the circle,
      +i.e. exactly one of \(\beta_1,\beta_2\) lies on the clockwise arc from
      +\(\alpha_1\) to \(\alpha_2\).
      +
      +Fix \(\alpha_1=x\) and \(\alpha_2=y\) (with \(x\neq y\)).
      +Let \(I=(x,y)\) be the clockwise arc from \(x\) to \(y\) and let
      +\(d=|I|\) be its length.  
      +For independent uniform \(\beta_1,\beta_2\),
      +
      +* the probability that exactly one lies in \(I\) is \(2d(1-d)\);
      +* the probability that the two \(\beta\)’s are in *different* quadrants
      +  is \(\frac34\).
      +
      +Conditioning on the actual placement of the interval \(I\) with respect
      +to the four quarter‑arcs yields (after a short computation)
      +
      +\[
      +\Pr(\beta_1,\beta_2\text{ satisfy both conditions}\mid x,y)=
      +2\Bigl[d\Bigl(\tfrac34-d\Bigr)+\sum_{q=0}^{3}a_q^{\,2}\Bigr],
      +\tag{1}
      +\]
      +
      +where \(a_q\) is the length of the part of \(I\) that lies in quadrant
      +\(q\).
      +
      +Now average (1) over all ordered pairs \((x,y)\) that are in different
      +quadrants.  By symmetry it suffices to place \(x\) in the first quadrant
      +\([0,\tfrac14)\) and let \(y\) run in the three other quadrants.
      +Carrying out the integration (splitting the three possible clockwise
      +distances) gives
      +
      +\[
      +\int\!\!\int_{x\in Q_0,\;y\in Q_m}
      +2\Bigl[d\Bigl(\tfrac34-d\Bigr)+\sum a_q^{\,2}\Bigr]\,dy\,dx
      +   =\frac{17}{64}\qquad(m=1,2,3\text{ summed}).
      +\]
      +
      +Thus
      +
      +\[
      +P(A\cap B\cap\{\text{the chords intersect}\})=\frac{17}{64}.
      +\]
      +
      +Finally
      +
      +\[
      +p_r=
      +\Pr(\text{intersection}\mid A\cap B)=
      +\frac{P(A\cap B\cap\text{intersect})}{P(A)P(B)}
      +=\frac{17/64}{(3/4)^2}
      +=\frac{16}{9}\cdot\frac{17}{64}
      +=\frac{17}{36}.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 4.  Expected interior intersections**
      +
      +* Intersections of the two diameters: \(1\).
      +* Intersections of the 25 random chords with the two diameters:
      +  \(\displaystyle \frac{100}{3}\).
      +* Intersections among the 25 random chords:
      +  \(\displaystyle \binom{25}{2}\,p_r
      +   =300\cdot\frac{17}{36}= \frac{425}{3}\).
      +
      +Hence
      +
      +\[
      +E[I]=1+\frac{100}{3}+\frac{425}{3}
      +     =1+\frac{525}{3}=1+175=176.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +**Step 5.  Expected number of regions**
      +
      +\[
      +E[\text{regions}]=27+1+E[I]=28+176=204.
      +\]
      +
      +--------------------------------------------------------------------
      +
      +\[
      +\boxed{204}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 204

      +

      Extracted Answer: 204

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Suppose $ \triangle ABC $ has angles $ \angle BAC = 84^\circ $, $ \angle ABC = 60^\circ $, and $ \angle ACB = 36^\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \overline{BC} $, $ \overline{AC} $, and $ \overline{AB} $, respectively. The circumcircle of $ \triangle DEF $ intersects $ \overline{BD} $, $ \overline{AE} $, and $ \overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \triangle DEF $ into six minor arcs, as shown. Find $ \widehat{DE} + 2 \cdot \widehat{HJ} + 3 \cdot \widehat{FG} $, where the arcs are measured in degrees.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\triangle ABC\qquad 
      +\angle A=84^{\circ},\; \angle B=60^{\circ},\; \angle C=36^{\circ}.
      +\]
      +
      +Denote  
      +
      +\[
      +D,E,F \text{ – the midpoints of }BC,CA,AB,
      +\]
      +\[
      +G,H,J \text{ – the second intersections of }BD,AE,AF\text{ with the circumcircle of } \triangle DEF .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  The points \(G,H,J\) are the feet of the altitudes  
      +
      +The nine‑point circle of \(\triangle ABC\) passes through the three midpoints \(D,E,F\) **and** through the three feet of the altitudes.  
      +Because  
      +
      +* \(BD\) lies on the side \(BC\),  
      +* \(AE\) lies on the side \(CA\),  
      +* \(AF\) lies on the side \(AB\),
      +
      +the second intersection of each of these sides with the nine‑point circle must be the corresponding foot of an altitude:
      +
      +\[
      +\begin{aligned}
      +G&= \text{foot from }A\text{ onto }BC,\\[2mm]
      +H&= \text{foot from }B\text{ onto }CA,\\[2mm]
      +J&= \text{foot from }C\text{ onto }AB .
      +\end{aligned}
      +\]
      +
      +Thus \(G,H,J\) are the vertices of the orthic triangle.
      +
      +--------------------------------------------------------------------
      +### 2.  Arc \(\widehat{DE}\)
      +
      +The medial triangle \(\triangle DEF\) is similar to \(\triangle ABC\) (ratio \(1\!:\!2\)).  
      +Consequently  
      +
      +\[
      +\angle DFE = \angle C = 36^{\circ}.
      +\]
      +
      +For any inscribed angle, the intercepted minor arc is twice the angle; hence  
      +
      +\[
      +\widehat{DE}=2\angle DFE = 2\cdot 36^{\circ}=72^{\circ}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Arc \(\widehat{FG}\)
      +
      +Since \(D\) and \(G\) both lie on side \(BC\), the chord \(DG\) is a part of \(BC\).  
      +The chord \(DF\) joins the midpoints of \(AB\) and \(BC\); by the Midpoint Theorem  
      +
      +\[
      +DF \parallel AC .
      +\]
      +
      +Therefore  
      +
      +\[
      +\angle FDG =\angle (\text{line }DF,\text{ line }DG)
      +        =\angle (AC,BC)=\angle C=36^{\circ}.
      +\]
      +
      +Thus  
      +
      +\[
      +\widehat{FG}=2\angle FDG = 2\cdot 36^{\circ}=72^{\circ}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 4.  Arc \(\widehat{HJ}\)
      +
      +\(H,J,G\) are the vertices of the orthic triangle.  
      +A standard fact about the orthic triangle is that its angles are  
      +
      +\[
      +\angle HGJ = 180^{\circ}-2\angle A,\qquad
      +\angle GJH = 180^{\circ}-2\angle B,\qquad
      +\angle JHG = 180^{\circ}-2\angle C .
      +\]
      +
      +(The fact follows from simple angle‑chasing with the right‑angles at the feet of the altitudes.)
      +
      +Hence the minor arc opposite \(G\) – that is, \(\widehat{HJ}\) – satisfies  
      +
      +\[
      +\widehat{HJ}=2\angle HGJ =2\bigl(180^{\circ}-2A\bigr)
      +               =360^{\circ}-4A.
      +\]
      +
      +With \(\angle A =84^{\circ}\),
      +
      +\[
      +\widehat{HJ}=360^{\circ}-4\cdot84^{\circ}=24^{\circ}.
      +\]
      +
      +--------------------------------------------------------------------
      +### 5.  Required sum
      +
      +\[
      +\begin{aligned}
      +\widehat{DE}+2\widehat{HJ}+3\widehat{FG}
      +&= 72^{\circ}+2\cdot24^{\circ}+3\cdot72^{\circ}\\
      +&= 72^{\circ}+48^{\circ}+216^{\circ}\\[2mm]
      +&= 336^{\circ}.
      +\end{aligned}
      +\]
      +
      +--------------------------------------------------------------------
      +\[
      +\boxed{336}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 336

      +

      Extracted Answer: 336

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ \triangle ABC $ be a right triangle with $ \angle A = 90^\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \sqrt{3} $ for some positive integer $ n $. Find $ n $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +\angle A =90^\circ ,\qquad BC =38 .
      +\]
      +
      +Place  
      +
      +\[
      +A=(0,0),\qquad B=(b,0),\qquad C=(0,c)
      +\]
      +
      +so that the legs are  
      +
      +\[
      +AB=b,\qquad AC=c,\qquad b^{2}+c^{2}=38^{2}=1444 .
      +\tag{1}
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  Coordinates of \(K\) and \(L\)
      +
      +Because  
      +
      +\[
      +AK=BK=14,
      +\]
      +
      +\(K\) lies on the perpendicular bisector of \(\overline{AB}\); hence  
      +
      +\[
      +K=\Bigl(\frac b2,\;\sqrt{14^{2}-\Bigl(\frac b2\Bigr)^{2}}\Bigr)
      +   =\bigl( X,\;U\bigr)
      +\]
      +
      +with  
      +
      +\[
      +X=\frac b2,\qquad U=\sqrt{196-X^{2}} .\tag{2}
      +\]
      +
      +Similarly  
      +
      +\[
      +AL=CL=14\Longrightarrow 
      +L=\Bigl(\sqrt{196-\Bigl(\frac c2\Bigr)^{2}},\;\frac c2\Bigr)
      +   =(V,Y),\qquad 
      +Y=\frac c2,\;V=\sqrt{196-Y^{2}} .\tag{3}
      +\]
      +
      +Thus  
      +
      +\[
      +X^{2}+Y^{2}= \frac{b^{2}+c^{2}}{4}
      +           =\frac{1444}{4}=361 .\tag{4}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  The equilateral triangle \(AKL\)
      +
      +All three sides of \(\triangle AKL\) equal \(14\), so \(\angle KAL=60^\circ\).
      +Using the vectors \(\overrightarrow{AK}=(X,U)\) and \(\overrightarrow{AL}=(V,Y)\),
      +
      +\[
      +\overrightarrow{AK}\cdot\overrightarrow{AL}=|AK||AL|\cos 60^\circ
      +\Longrightarrow
      +XV+YU=98 .\tag{5}
      +\]
      +
      +From (2)–(5) we have the system
      +
      +\[
      +\begin{cases}
      +X^{2}+Y^{2}=361,\\[2pt]
      +X\sqrt{196-Y^{2}}+Y\sqrt{196-X^{2}}=98 .
      +\end{cases}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Solving the system
      +
      +Set  
      +
      +\[
      +X=14\cos\alpha ,\qquad U=14\sin\alpha ,\qquad 
      +Y=14\cos\beta ,\qquad V=14\sin\beta .
      +\]
      +
      +Then (5) becomes  
      +
      +\[
      +14^{2}\bigl(\cos\alpha\sin\beta+\cos\beta\sin\alpha\bigr)
      +   =196\sin(\alpha+\beta)=98,
      +\]
      +
      +hence  
      +
      +\[
      +\sin(\alpha+\beta)=\frac12\Longrightarrow\alpha+\beta=\frac{\pi}{6}\;(30^\circ). \tag{6}
      +\]
      +
      +From \(X^{2}+Y^{2}=361\),
      +
      +\[
      +196\bigl(\cos^{2}\alpha+\cos^{2}\beta\bigr)=361
      +\Longrightarrow
      +\cos^{2}\alpha+\cos^{2}\beta= \frac{361}{196}=1+\frac{165}{196}.
      +\]
      +
      +Using \(\cos^{2}\alpha+\cos^{2}\beta=
      +1+\cos(\alpha+\beta)\cos(\alpha-\beta)\) gives  
      +
      +\[
      +\cos\frac{\pi}{6}\,\cos(\alpha-\beta)=\frac{165}{196}
      +\Longrightarrow
      +\cos(\alpha-\beta)=\frac{165}{98\sqrt3}
      +       =\frac{55\sqrt3}{98}.
      +\]
      +
      +Hence  
      +
      +\[
      +\sin(\alpha-\beta)=\sqrt{1-\Bigl(\frac{55\sqrt3}{98}\Bigr)^{2}}
      +                 =\frac{23}{98}.
      +\]
      +
      +Now compute \(\cos\alpha\) and \(\cos\beta\):
      +\[
      +\cos\alpha=\sqrt{\frac{1+\cos(\alpha+\beta)}{2}}
      +          =\sqrt{\frac{1+\frac{71}{98}}{2}}
      +          =\frac{13}{14},
      +\qquad
      +\cos\beta =\sqrt{\frac{1+\cos(\alpha-\beta)}{2}}
      +          =\sqrt{\frac{1+\frac{47}{49}}{2}}
      +          =\frac{4\sqrt3}{7}.
      +\]
      +
      +Therefore  
      +
      +\[
      +X=14\cos\alpha =13,\qquad 
      +Y=14\cos\beta =8\sqrt3 .
      +\]
      +
      +Consequently  
      +
      +\[
      +b=2X=26,\qquad c=2Y=16\sqrt3 .
      +\]
      +
      +One easily checks that \(b^{2}+c^{2}=26^{2}+ (16\sqrt3)^{2}=1444\), i.e. \(BC=38\).
      +
      +--------------------------------------------------------------------
      +### 4.  Area of \(BKLC\)
      +
      +The right‑triangle \(ABC\) has area  
      +
      +\[
      +[ABC]=\frac12\,b\,c
      +      =\frac12\cdot26\cdot16\sqrt3
      +      =208\sqrt3 .
      +\]
      +
      +The three small triangles cut off by \(K\) and \(L\) have areas  
      +
      +\[
      +\begin{aligned}
      +[ABK]&=\frac12\cdot b\cdot U
      +      =\frac12\cdot26\cdot3\sqrt3=39\sqrt3,\\[2pt]
      +[ALC]&=\frac12\cdot c\cdot V
      +      =\frac12\cdot16\sqrt3\cdot2=16\sqrt3,\\[2pt]
      +[AKL]&=\frac{\sqrt3}{4}\cdot14^{2}=49\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Thus
      +
      +\[
      +\begin{aligned}
      +[BKLC] &=[ABC]-[ABK]-[ALC]-[AKL]\\
      +       &=208\sqrt3-(39\sqrt3+16\sqrt3+49\sqrt3)\\
      +       &=104\sqrt3 .
      +\end{aligned}
      +\]
      +
      +Hence the area of \(BKLC\) is \(n\sqrt3\) with  
      +
      +\[
      +\boxed{n=104}.
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 104

      +

      Extracted Answer: None

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let the sequence of rationals $ x_1, x_2, \ldots $ be defined such that $ x_1 = \frac{25}{11} $ and
      +$ x_{k+1} = \frac{1}{3} \left( x_k + \frac{1}{x_k} - 1 \right). $
      +$ x_{2025} $ can be expressed as $ \frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution**
      +
      +\[
      +x_{k+1}= \frac13\Bigl(x_k+\frac1{x_k}-1\Bigr),\qquad 
      +x_1=\frac{25}{11}
      +\]
      +
      +Write each term as a reduced fraction  
      +
      +\[
      +x_k=\frac{p_k}{q_k},\qquad \gcd(p_k,q_k)=1 .
      +\]
      +
      +Then  
      +
      +\[
      +x_{k+1}= \frac{p_k^2+q_k^2-p_kq_k}{3p_kq_k}
      +      =\frac{p_{k+1}}{q_{k+1}}
      +\]
      +
      +where  
      +
      +\[
      +p_{k+1}= \frac{p_k^2+q_k^2-p_kq_k}{3},
      +\qquad 
      +q_{k+1}=p_kq_k . \tag{1}
      +\]
      +
      +(The numerator is always divisible by \(3\); one checks that
      +\(\gcd(p_{k+1},q_{k+1})=1\) for every \(k\).)
      +
      +--------------------------------------------------------------------
      +### 1.  A simple recurrence for the sum  
      +
      +Let  
      +
      +\[
      +s_k=p_k+q_k .
      +\]
      +
      +Adding the two formulas in (1),
      +
      +\[
      +\begin{aligned}
      +s_{k+1}&=p_{k+1}+q_{k+1}
      +        =\frac{p_k^2+q_k^2-p_kq_k}{3}+p_kq_k  \\
      +        &=\frac{p_k^2+2p_kq_k+q_k^2}{3}
      +        =\frac{(p_k+q_k)^2}{3}
      +        =\frac{s_k^{\,2}}{3}.
      +\end{aligned}
      +\]
      +
      +Thus  
      +
      +\[
      +s_{k+1}= \frac{s_k^{\,2}}{3},\qquad s_1=p_1+q_1=25+11=36.
      +\tag{2}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Closed form
      +
      +Set \(t_k=s_k/3\).  From (2)
      +
      +\[
      +t_{k+1}=t_k^{\,2},\qquad t_1=\frac{36}{3}=12 .
      +\]
      +
      +Hence  
      +
      +\[
      +t_k=12^{\,2^{\,k-1}},\qquad 
      +s_k=3t_k=3\cdot 12^{\,2^{\,k-1}} . \tag{3}
      +\]
      +
      +Therefore  
      +
      +\[
      +p_{2025}+q_{2025}=s_{2025}=3\cdot 12^{\,2^{2024}} .
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Computing the last three digits  
      +
      +We need  
      +
      +\[
      +M=3\cdot 12^{\,2^{2024}}\pmod{1000}.
      +\]
      +
      +Because \(1000=8\cdot125\) we compute the two residues separately.
      +
      +*Modulo \(8\)*  
      +
      +\(12\equiv4\pmod8\) and \(4^{2}=0\pmod8\).  
      +Since the exponent \(2^{2024}\ge2\),
      +
      +\[
      +12^{\,2^{2024}}\equiv0\pmod8 .
      +\]
      +
      +Hence \(M\equiv0\pmod8\).
      +
      +*Modulo \(125\)*  
      +
      +\(\gcd(12,125)=1\) and \(\varphi(125)=100\), so  
      +\(12^{100}\equiv1\pmod{125}\).  
      +Thus only the exponent modulo \(100\) matters:
      +
      +\[
      +e=2^{2024}\pmod{100}.
      +\]
      +
      +For \(n\ge2\) the powers of \(2\) modulo \(100\) have period \(20\):
      +\(2^{n+20}\equiv2^n\pmod{100}\).
      +Since \(2024\equiv4\pmod{20}\),
      +
      +\[
      +e\equiv2^{4}=16\pmod{100}.
      +\]
      +
      +Now compute \(12^{16}\pmod{125}\):
      +
      +\[
      +\begin{aligned}
      +12^{2}&\equiv144\equiv19,\\
      +12^{4}&\equiv19^{2}=361\equiv111,\\
      +12^{8}&\equiv111^{2}=12321\equiv71,\\
      +12^{16}&\equiv71^{2}=5041\equiv41\pmod{125}.
      +\end{aligned}
      +\]
      +
      +Hence  
      +
      +\[
      +12^{\,2^{2024}}\equiv41\pmod{125}.
      +\]
      +
      +*Chinese remainder theorem*  
      +
      +Find \(A\) such that  
      +
      +\[
      +A\equiv0\pmod8,\qquad A\equiv41\pmod{125}.
      +\]
      +
      +Write \(A=8k\).  Then \(8k\equiv41\pmod{125}\Rightarrow
      +k\equiv41\cdot8^{-1}\pmod{125}\).
      +Since \(8^{-1}\equiv47\pmod{125}\),
      +
      +\[
      +k\equiv41\cdot47\equiv52\pmod{125},
      +\]
      +so \(k=52+125t\) and  
      +
      +\[
      +A=8k=416+1000t\equiv416\pmod{1000}.
      +\]
      +
      +Finally  
      +
      +\[
      +M=3A\equiv3\cdot416=1248\equiv\boxed{248}\pmod{1000}.
      +\]
      +
      +Thus the remainder of \(m+n\) when divided by \(1000\) is **248**.
      +
      +
      +

      Results

      +

      Correct Answer: 248

      +

      Extracted Answer: 248

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +There are exactly three positive real numbers $ k $ such that the function
      +$ f(x) = \frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $
      +defined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      Let  
      +
      +\[
      +f_k(x)=\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \frac{N(x)}{x},\qquad x>0 ,
      +\]
      +
      +where  
      +
      +\[
      +N(x)=(x-18)(x-72)(x-98)(x-k)
      +      =x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k)x+127008k .
      +\]
      +
      +--------------------------------------------------------------------
      +### 1.  What does “the minimum is attained at exactly two points’’ mean?
      +
      +If the global minimum value is \(m\), then for every \(x>0\)
      +
      +\[
      +\frac{N(x)}{x}\ge m\qquad\Longleftrightarrow\qquad N(x)-mx\ge0 .
      +\]
      +
      +Equality occurs exactly at the points where the minimum is attained.
      +Since \(N(x)-mx\) is a quartic polynomial, the only way it can be
      +non‑negative for all \(x\) and vanish at exactly two distinct points is
      +
      +\[
      +N(x)-mx=(x-a)^{2}(x-b)^{2}\qquad(a\neq b,\;a,b>0).
      +\]
      +
      +Thus there are numbers \(a,b,m\) such that  
      +
      +\[
      +\begin{cases}
      +N(a)=ma,\quad N'(a)=m,\\[2pt]
      +N(b)=mb,\quad N'(b)=m .
      +\end{cases}
      +\]
      +
      +--------------------------------------------------------------------
      +### 2.  Coefficient comparison
      +
      +Write
      +
      +\[
      +(x-a)^{2}(x-b)^{2}=(x^{2}-Sx+P)^{2},
      +\qquad
      +S=a+b,\;P=ab .
      +\]
      +
      +Equating coefficients of \(N(x)-mx\) and \((x^{2}-Sx+P)^{2}\) yields  
      +
      +\[
      +\begin{aligned}
      +S&=\frac{188+k}{2},\tag{1}\\[2pt]
      +S^{2}+2P&=10116+188k,\tag{2}\\[2pt]
      +2SP&=127008+10116k+m,\tag{3}\\[2pt]
      +P^{2}&=127008\,k.\tag{4}
      +\end{aligned}
      +\]
      +
      +From (1) and (4)
      +
      +\[
      +S=\frac{188+k}{2},\qquad P=\sqrt{127008\,k}.
      +\]
      +
      +Insert these in (2):
      +
      +\[
      +\frac{(188+k)^{2}}{4}+2\sqrt{127008\,k}=10116+188k .
      +\]
      +
      +Multiplying by \(4\) and using \(\sqrt{127008}=252\sqrt2\) gives  
      +
      +\[
      +k^{2}-376k-5120+2016\sqrt{2k}=0. \tag{5}
      +\]
      +
      +--------------------------------------------------------------------
      +### 3.  Solving for \(k\)
      +
      +Set \(u=\sqrt{k}>0\).  Then \(\sqrt{2k}=u\sqrt2\) and (5) becomes  
      +
      +\[
      +u^{4}-376u^{2}+2016\sqrt2\,u-5120=0 .
      +\]
      +
      +Write \(u=a\sqrt2\;(a>0)\); the equation reduces to  
      +
      +\[
      +a^{4}-188a^{2}+1008a-1280=0 .
      +\]
      +
      +Factoring,
      +
      +\[
      +(a^{2}-6a+8)(a^{2}+6a-160)=0,
      +\]
      +
      +so  
      +
      +\[
      +a=2,\;4,\;10\quad(\text{the root }a=-16\text{ gives }u<0\text{ and is discarded}).
      +\]
      +
      +Since \(k=u^{2}=2a^{2}\),
      +
      +\[
      +k=2\cdot2^{2}=8,\qquad
      +k=2\cdot4^{2}=32,\qquad
      +k=2\cdot10^{2}=200 .
      +\]
      +
      +For each of these values the discriminant  
      +
      +\[
      +\Delta=S^{2}-4P>0
      +\]
      +
      +so the quadratic \(x^{2}-Sx+P\) has two distinct positive roots; consequently
      +\(f_{k}(x)\) attains its global minimum at exactly those two points.
      +
      +--------------------------------------------------------------------
      +### 4.  Sum of the admissible \(k\)
      +
      +\[
      +8+32+200 = 240 .
      +\]
      +
      +\[
      +\boxed{240}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 240

      +

      Extracted Answer: 240

      +

      Score: 1.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      **Solution Outline**
      +
      +1.  Let \(M=3^{7}=2187\) and \(A=\{1,\ldots ,3^{6}\}= \{1,\dots ,729\}\).
      +    For each \(a\in A\) put \(r(a)=a^{3}\pmod{M}\).
      +    The required number  
      +
      +    \[
      +    N=\#\{(a,b,c)\in A^{3}:r(a)+r(b)+r(c)\equiv0\pmod M\}
      +    \]
      +
      +    is the weighted convolution of the distribution of the residues
      +    \(r(a)\).
      +
      +2.  Write each \(a\) as \(a=3^{v}a'\) with \(\gcd(a',3)=1\).
      +
      +| \(v\) | range of \(a\) | # of such \(a\) | residue \(a^{3}\) (mod \(M\)) | weight |
      +|-------|----------------|-----------------|-------------------------------|--------|
      +| 0 | not divisible by 3 | \(486\) | \(a^{\prime\,3}\) (unit cube) | \(1\) |
      +| 1 | \(3\mid a,9\nmid a\) | \(162\) | \(27a^{\prime\,3}\) | \(9\) |
      +| 2 | \(9\mid a,27\nmid a\) | \(54\) | \(729a^{\prime\,3}\) | \(27\) |
      +| \(\ge3\) | \(27\mid a\) | \(27\) | \(0\) | \(27\)
      +
      +Hence the possible residues and their multiplicities are  
      +
      +* 0      weight \(27\);
      +* the two residues \(729,\,1458\) weight \(27\) each;
      +* 18 residues (the cubes of the unit group modulo \(81\)) weight \(9\) each;
      +* 486 residues (the cubes of the unit group modulo \(3^{7}\)) weight \(1\) each.
      +
      +Denote by  
      +
      +* \(D\) the 486 unit‑cube residues (weight 1);
      +* \(C\) the 18 residues \(27\cdot u\) with \(u\) a unit‑cube modulo \(81\) (weight 9);
      +* \(B\) the two residues \(729,1458\) (weight 27);
      +* \(0\) the zero residue (weight 27).
      +
      +3.  Split the count according to how many zero‑terms occur.
      +    Let  
      +
      +    \[
      +    w(x)=\text{weight of residue }x.
      +    \]
      +
      +    For \(x\neq0\) put \(R'=\{D\cup C\cup B\}\).  Then
      +
      +    \[
      +    N=N_{0}+N_{1}+N_{2},
      +    \]
      +
      +    where  
      +
      +    * \(N_{2}=w(0)^{3}=27^{3}=19683\)  (all three residues zero);
      +    * \(N_{1}=3\,w(0)\displaystyle\sum_{\substack{y+z\equiv0\\y,z\in R'}}
      +            w(y)w(z) =3\cdot27\cdot3402=275\,562\);
      +    * \(N_{0}\) counts triples with no zero term.
      +
      +    The sum in \(N_{1}\) is obtained easily:
      +    each \(x\in D\) pairs with its inverse, giving \(486\) ordered pairs,
      +    each \(x\in C\) gives \(18\) ordered pairs (weight \(9^{2}=81\)), and each
      +    \(x\in B\) gives \(2\) ordered pairs (weight \(27^{2}=729\)).
      +    Hence \(\displaystyle\sum_{y+z\equiv0}w(y)w(z)=486+1458+1458=3402\).
      +
      +4.  Compute \(N_{0}\).
      +    After factoring the common factor \(27\) from the elements of \(C\cup B\),
      +    the condition \(x+y+z\equiv0\pmod{M}\) becomes
      +
      +    \[
      +    u+v+w\equiv0\pmod{81},
      +    \]
      +
      +    where \(u,v,w\) belong to  
      +
      +    * the set \(S\) of the 18 unit‑cubes modulo \(81\) (weight 9);
      +    * the two residues \(27,54\) (weight 27).
      +
      +    For the set \(S\) one has the simple description  
      +
      +    \[
      +    S=\{x\pmod{81}:x\equiv\pm1\pmod9\}.
      +    \]
      +
      +    Using this description we compute the additive convolution on \(\mathbb Z/81\).
      +
      +    * For any \(t\equiv0\pmod9\) we have \(\#\{(s_{1},s_{2})\in S^{2}:s_{1}+s_{2}\equiv t\}=18\).
      +    * For any \(t\equiv\pm2\pmod9\) the count equals \(9\).
      +    * For any other residue the count is \(0\).
      +
      +    Consequently
      +
      +    * there are no triples \(s_{1}+s_{2}+s_{3}\equiv0\) with all three from \(S\);
      +    * ordered triples with exactly one element from \(\{27,54\}\) and two from \(S\) are possible.
      +      For each of the two choices \(\{27,54\}\) there are
      +      \((A*A)(27)=(A*A)(54)=18\) ordered pairs from \(S\);  
      +      with three possible positions for the “\(B\)’’ element we obtain  
      +
      +      \[
      +      2\cdot3\cdot18=108
      +      \]
      +
      +      ordered triples.  Their weight is \(27\cdot9^{2}=2187\), giving a contribution  
      +
      +      \[
      +      108\cdot2187=236\,196 .
      +      \]
      +
      +    * triples consisting only of the two “\(B\)” residues satisfy the condition
      +      only when all three are equal, giving two ordered triples,
      +      each of weight \(27^{3}=19683\); contribution  
      +
      +      \[
      +      2\cdot19683=39\,366 .
      +      \]
      +
      +    Adding these contributions:
      +
      +    \[
      +    N_{0}=236\,196+39\,366=275\,562 .
      +    \]
      +
      +5.  Assemble all parts:
      +
      +    \[
      +    N=N_{0}+N_{1}+N_{2}=275\,562+275\,562+19\,683=570\,807 .
      +    \]
      +
      +6.  The required remainder is  
      +
      +    \[
      +    N\bmod1000 = 570\,807\bmod1000 = \boxed{807}.
      +    \]
      +
      +
      +

      Results

      +

      Correct Answer: 735

      +

      Extracted Answer: 807

      +

      Score: 0.0

      +
      + + +

      Prompt conversation

      + + +
      +
      + user + +
      +
      +
      +Let $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\angle B=\angle E=60^\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.
      +Please reason step by step, and put your final answer within \boxed{}.
      +
      +
      +
      + +

      Sampled message

      + +
      +
      + assistant + +
      +
      +
      The minimum value of \(f(X)\) works out to be  
      +
      +\[
      +f_{\min}=18+20\sqrt7 .
      +\]
      +
      +Thus \(m=18,\; n=20,\; p=7\) and  
      +
      +\[
      +m+n+p = 18+20+7 = 45 .
      +\]
      +
      +\[
      +\boxed{45}
      +\]
      +
      +
      +

      Results

      +

      Correct Answer: 60

      +

      Extracted Answer: 45

      +

      Score: 0.0

      +
      + + + \ No newline at end of file diff --git a/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547.json b/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547.json new file mode 100644 index 00000000000..7d4e54b4ce2 --- /dev/null +++ b/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547.json @@ -0,0 +1,6 @@ +{ + "chars": 2296.1916666666666, + "chars:std": 986.051306946325, + "score": 0.925, + "score:std": 0.26339134382131846 +} \ No newline at end of file diff --git a/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547_allresults.json b/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547_allresults.json new file mode 100644 index 00000000000..4a85ce57c65 --- /dev/null +++ b/benches/dgx-spark/aime25_openai__gpt-oss-120b-high_temp1.0_20251109_094547_allresults.json @@ -0,0 +1,2896 @@ +{ + "score": 0.925, + "metrics": { + "chars": 2296.1916666666666, + "chars:std": 986.051306946325, + "score:std": 0.26339134382131846 + }, + "htmls": [ + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First write the two numbers in base\u201110.\n\n\\[\n17_{b}=1\\cdot b+7=b+7,\\qquad \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need  \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nUse the Euclidean algorithm:\n\n\\[\n9b+7 = 9(b+7)-56 .\n\\]\n\nHence  \n\n\\[\nb+7 \\mid 9b+7 \\iff b+7 \\mid 56 .\n\\]\n\nSo \\(b+7\\) must be a positive divisor of \\(56\\).\n\nSince the base must satisfy \\(b>9\\), we have \\(b+7>16\\).  \nThe divisors of \\(56\\) exceeding \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{cases}\nb+7=28 \\ \\Rightarrow\\ b=21,\\\\[2pt]\nb+7=56 \\ \\Rightarrow\\ b=49.\n\\end{cases}\n\\]\n\nBoth bases indeed work:\n\n\\[\n\\frac{97_{21}}{17_{21}}=\\frac{196}{28}=7,\\qquad \n\\frac{97_{49}}{17_{49}}=\\frac{448}{56}=8 .\n\\]\n\nTherefore the required bases are \\(21\\) and \\(49\\), and their sum is  \n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nc=\\#\\text{ chocolate},\\qquad v=\\#\\text{ vanilla},\\qquad s=\\#\\text{ strawberry}\n\\]\n\nwith  \n\n\\[\nc+v+s =9,\\qquad c>v>s\\ge1 .\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\).\n\nSince \\(c>v>s\\ge 1\\),\n\n\\[\nc\\ge s+2,\\; v\\ge s+1 \\Longrightarrow c+v+s\\ge 3s+3\\le9\\Longrightarrow s\\le2 .\n\\]\n\n- **If \\(s=1\\)**: \\(v\\ge2,\\ c\\ge3\\) and \\(c+v=8\\).  \n  Possibilities: \\((c,v)=(6,2),(5,3)\\).\n\n- **If \\(s=2\\)**: \\(v\\ge3,\\ c\\ge4\\) and \\(c+v=7\\).  \n  Possibility: \\((c,v)=(4,3)\\).\n\nThus the only triples are  \n\n\\[\n(6,2,1),\\quad (5,3,1),\\quad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple.\n\nFor a given \\((c,v,s)\\) the number of assignments of flavors to the nine distinct players is the multinomial coefficient  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\quad &\\frac{9!}{6!\\,2!\\,1!}= \\binom{9}{6}\\binom{3}{2}=84\\cdot3=252,\\\\[4pt]\n(5,3,1):\\quad &\\frac{9!}{5!\\,3!\\,1!}= \\binom{9}{5}\\binom{4}{3}=126\\cdot4=504,\\\\[4pt]\n(4,3,2):\\quad &\\frac{9!}{4!\\,3!\\,2!}= \\binom{9}{4}\\binom{5}{3}=126\\cdot10=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\nN \\bmod 1000 = 2016 \\bmod 1000 = 16.\n\\]\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid have parallel sides \\(r\\) and \\(s\\) \\((r\\neq s)\\) and equal legs \\(L\\).\n\n---\n\n### 1.  Semiperimeter from the incircle\n\nA convex quadrilateral that contains an incircle (a tangential quadrilateral) satisfies  \n\n\\[\n\\text{Area}= (\\text{inradius})\\times (\\text{semiperimeter}).\n\\]\n\nThe inradius is \\(3\\) and the area is \\(72\\); therefore  \n\n\\[\np=\\frac{\\text{Area}}{r_{\\text{in}}}= \\frac{72}{3}=24,\n\\]\n\nwhere \\(p\\) is the semiperimeter.\n\n---\n\n### 2.  Relation among the sides\n\nFor a tangential quadrilateral, Pitot\u2019s theorem gives  \n\n\\[\n\\text{(sum of one pair of opposite sides)} = \\text{(sum of the other pair)} .\n\\]\n\nIn an isosceles trapezoid the opposite sides are the two bases and the two equal legs, so  \n\n\\[\nr+s = L+L =2L \\quad\\Longrightarrow\\quad L=\\frac{r+s}{2}.\n\\]\n\nThe semiperimeter is  \n\n\\[\np = \\frac{r+s+2L}{2}= \\frac{r+s+r+s}{2}=r+s .\n\\]\n\nSince \\(p=24\\), we obtain  \n\n\\[\n\\boxed{r+s=24}.\n\\]\n\nConsequently  \n\n\\[\nL=\\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### 3.  Height of the trapezoid\n\nThe incircle is tangent to both parallel sides, so the distance between those sides (the height \\(h\\)) equals twice the radius:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\]\n\n---\n\n### 4.  Using the leg length\n\nPlace the trapezoid with its bases horizontal. The horizontal offset between the ends of the bases is \\(\\dfrac{|r-s|}{2}\\). Hence, by the Pythagorean theorem,\n\n\\[\nL^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+h^{2}.\n\\]\n\nWith \\(L=12\\) and \\(h=6\\),\n\n\\[\n12^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+6^{2}\n\\quad\\Longrightarrow\\quad\n144 = \\frac{(r-s)^{2}}{4}+36\n\\quad\\Longrightarrow\\quad\n(r-s)^{2}=432.\n\\]\n\n---\n\n### 5.  Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\n(r+s)^{2} &= r^{2}+2rs+s^{2}=24^{2}=576,\\\\\n(r-s)^{2} &= r^{2}-2rs+s^{2}=432.\n\\end{aligned}\n\\]\n\nAdding these equations eliminates the \\(rs\\) term:\n\n\\[\n(r+s)^{2}+(r-s)^{2}=2(r^{2}+s^{2})\\Longrightarrow\n576+432=2(r^{2}+s^{2}).\n\\]\n\nThus\n\n\\[\nr^{2}+s^{2}= \\frac{1008}{2}=504.\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\nis a circle with centre  \n\n\\[\nC=(25,20)\n\\]\n\nand radius \\(r=5\\).\n\nThe second equation  \n\n\\[\n|z-4-k| = |z-3i-k|\n\\]\n\nmeans that \\(z\\) is equidistant from the points  \n\n\\[\nA=4+k \\qquad\\text{and}\\qquad B=3i+k .\n\\]\n\nThus \\(A=(k+4,0),\\; B=(k,3)\\).  \nThe set of points equidistant from \\(A\\) and \\(B\\) is the perpendicular bisector of \\(\\overline{AB}\\).\n\n---\n\n### Equation of the perpendicular bisector\n\nMidpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{k+4+k}{2},\\frac{0+3}{2}\\Bigr)=(k+2,\\frac32).\n\\]\n\nThe vector \\(\\overrightarrow{AB}=(-4,3)\\).  \nA direction vector perpendicular to this is \\((3,4)\\) (since \\((-4,3)\\cdot(3,4)=0\\)).  \n\nHence the line has slope \\(\\frac43\\) and equation  \n\n\\[\ny-\\frac32 = \\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\\[\n\\Longrightarrow\\; y = \\frac43 x - \\frac43 k - \\frac76 .\n\\]\n\nIn standard form:\n\n\\[\n8x-6y = 8k+7 .\n\\]\n\n---\n\n### Tangency condition\n\nThe system will have exactly one solution iff this line is tangent to the circle.  \nThe distance from the centre \\(C=(25,20)\\) to the line \\(8x-6y-(8k+7)=0\\) must equal the radius \\(5\\):\n\n\\[\n\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^{2}+(-6)^{2}}}=5.\n\\]\n\nCompute the numerator:\n\n\\[\n8\\cdot25-6\\cdot20-(8k+7)=200-120-8k-7=73-8k.\n\\]\n\nSince \\(\\sqrt{8^{2}+6^{2}}=10\\),\n\n\\[\n\\frac{|73-8k|}{10}=5 \\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nThus  \n\n\\[\n73-8k = 50 \\quad\\text{or}\\quad 73-8k = -50.\n\\]\n\n\\[\n\\begin{cases}\n8k = 23 \\;\\;\\Rightarrow\\; k = \\dfrac{23}{8},\\\\[4pt]\n8k = 123\\;\\Rightarrow\\; k = \\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values give a tangent line, so each yields exactly one solution \\(z\\).\n\n---\n\n### Sum of all possible \\(k\\)\n\n\\[\nk_1+k_2 = \\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\): \\(m=73,\\ n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equation  \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nis a homogeneous quadratic form.  Factor it over the rationals.\n\n\\[\n12x^{2}-xy-6y^{2}= -6\\Bigl(y-\\frac43x\\Bigr)\\Bigl(y+\\frac32x\\Bigr)\n\\]\n\nHence  \n\n\\[\n12x^{2}-xy-6y^{2}=0\\iff \n\\Bigl(y-\\frac43x\\Bigr)\\Bigl(y+\\frac32x\\Bigr)=0 .\n\\]\n\nSo any integer solution must satisfy one of the two linear equations  \n\n\\[\ny=\\frac{4}{3}x\\quad\\text{or}\\quad y=-\\frac32 x .\n\\]\n\n---\n\n### 1.  Solutions of \\(y=\\frac43x\\)\n\nWrite \\(3y=4x\\).  \nSince \\(\\gcd(3,4)=1\\), the integer solutions are  \n\n\\[\nx=3k,\\qquad y=4k\\qquad(k\\in\\mathbb Z).\n\\]\n\nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 3k\\le100,\\qquad -100\\le4k\\le100\n\\]\n\nThe second inequality is stricter, giving  \n\n\\[\n-25\\le k\\le 25 .\n\\]\n\nThus there are  \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger points on this line.\n\n---\n\n### 2.  Solutions of \\(y=-\\frac32x\\)\n\nWrite \\(2y=-3x\\).  \nSince \\(\\gcd(2,3)=1\\), the integer solutions are  \n\n\\[\nx=2k,\\qquad y=-3k\\qquad(k\\in\\mathbb Z).\n\\]\n\nBoth coordinates must satisfy  \n\n\\[\n-100\\le2k\\le100,\\qquad -100\\le-3k\\le100 .\n\\]\n\nThese give  \n\n\\[\n-50\\le k\\le50,\\qquad -\\frac{100}{3}\\le k\\le\\frac{100}{3}\\Longrightarrow -33\\le k\\le33 .\n\\]\n\nHence there are  \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger points on this line.\n\n---\n\n### 3.  Remove double\u2011counted point\n\nThe two lines intersect only at \\((0,0)\\) (when \\(k=0\\) in both families).  \nThus the total number of distinct ordered pairs is  \n\n\\[\n51+67-1 = 117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  Divisibility conditions**\n\nFor an integer to be divisible by \\(22\\) it must be divisible by \\(2\\) and by \\(11\\).\n\n*Divisible by 2* \u2013 the last digit (the units digit) must be even, i.e. one of \\(\\{2,4,6,8\\}\\).\n\n*Divisible by 11* \u2013 for an 8\u2011digit number \\(a_1a_2\\ldots a_8\\) (with \\(a_1\\) the leftmost digit) the rule is  \n\n\\[\n(a_8+a_6+a_4+a_2)-(a_7+a_5+a_3+a_1)\\equiv0\\pmod{11}.\n\\]\n\nThus the sum of the digits in the even positions (2,4,6,8) equals the sum of the digits in the odd positions (1,3,5,7) modulo \\(11\\).\n\nThe total sum of the digits \\(1+2+\\dots+8=36\\).  \nIf the two sums are equal modulo \\(11\\), then\n\n\\[\n2\\cdot(\\text{odd\u2013position sum})\\equiv36\\equiv3\\pmod{11}\n\\Longrightarrow\\text{odd\u2013position sum}\\equiv7\\pmod{11}.\n\\]\n\nThe possible values are \\(7,18,29,\\ldots\\).  \nSince four distinct digits from \\(\\{1,\\dots ,8\\}\\) can sum only between \\(10\\) and \\(26\\), the only feasible value is  \n\n\\[\n\\boxed{\\text{odd\u2013position sum}=18}.\n\\]\n\nConsequently the even\u2013position sum is also \\(18\\).\n\n**Step 2.  Choose the digits for the odd positions**\n\nWe need all 4\u2011element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them (or by noting the complementary pairs) gives  \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are  \n\n\\[\n\\boxed{M=8}\n\\]\n\nsuch subsets.  \nEach of them contains exactly two even digits (because a sum of 18 cannot be obtained with a different parity distribution), so for every subset \\(A\\) (odd\u2011position digits) we have  \n\n\\[\ne_A=2,\\qquad E_B=4-e_A=2,\n\\]\n\nwhere \\(E_B\\) is the number of even digits among the complementary set \\(B\\) (the even\u2011position digits).\n\n**Step 3.  Arrange the digits**\n\n*Odd positions* (1,3,5,7): the four digits of \\(A\\) can be placed in \\(4! = 24\\) ways.\n\n*Even positions* (2,4,6,8): the four digits of \\(B\\) must be placed so that the digit in position\u202f8 (the units digit) is even.  \nSince \\(B\\) contains exactly \\(E_B=2\\) even digits, we have  \n\n\\[\n\\text{choices for the units digit}=2,\n\\qquad\n\\text{ways to arrange the remaining three digits}=3! = 6.\n\\]\n\nThus the number of admissible placements for \\(B\\) is  \n\n\\[\nf(B)=2\\cdot 6=12.\n\\]\n\n**Step 4.  Count all numbers**\n\nFor each of the \\(M=8\\) valid subsets \\(A\\),\n\n\\[\n\\text{numbers contributed}=24\\times12=288.\n\\]\n\nHence  \n\n\\[\nN=8\\times288=2304.\n\\]\n\n**Step 5.  Compute the required difference**\n\n\\[\nN-2025=2304-2025=279.\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The original parabola is  \n\n\\[\ny=x^{2}-4 .\n\\]\n\n---\n\n### 1.  Equation of the rotated parabola  \n\nRotate the plane \\(60^{\\circ}\\) counter\u2011clockwise about the origin.\nIf \\((X,Y)\\) is a point of the rotated parabola, then rotating it back\n\\(60^{\\circ}\\) clockwise gives a point \\((x',y')\\) on the original parabola.\n\n\\[\n\\begin{pmatrix}x'\\\\y'\\end{pmatrix}\n=\n\\begin{pmatrix}\\cos60^\\circ&\\sin60^\\circ\\\\\n-\\sin60^\\circ&\\cos60^\\circ\\end{pmatrix}\n\\begin{pmatrix}X\\\\Y\\end{pmatrix}\n=\n\\begin{pmatrix}\\frac12X+\\frac{\\sqrt3}{2}Y\\\\[2pt]\n-\\frac{\\sqrt3}{2}X+\\frac12Y\\end{pmatrix}.\n\\]\n\nThus  \n\n\\[\ny' = x'^2-4\\Longrightarrow \n\\frac{-\\sqrt3X+Y}{2} =\\Bigl(\\frac{X+\\sqrt3Y}{2}\\Bigr)^{\\!2}-4.\n\\]\n\nMultiplying by \\(2\\) and simplifying gives the equation of the rotated\nparabola:\n\n\\[\n(x+\\sqrt3\\,y)^{2}+2\\sqrt3\\,x-2y-16=0. \\tag{1}\n\\]\n\n---\n\n### 2.  Intersection with the original parabola  \n\nSubstituting \\(y=x^{2}-4\\) from the original parabola into (1) yields\n\n\\[\n\\bigl(x+\\sqrt3(x^{2}-4)\\bigr)^{2}+2\\sqrt3\\,x-2(x^{2}-4)-16=0,\n\\]\n\nwhich simplifies to\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0. \\tag{2}\n\\]\n\n---\n\n### 3.  Factoring the quartic  \n\nLook for a factorisation of the form  \n\\((ax^{2}+b\\sqrt3\\,x+c)(dx^{2}+e\\sqrt3\\,x+f)\\).\nMatching coefficients gives the system  \n\n\\[\n\\begin{cases}\nad=3\\\\\nae+bd=2\\\\\naf+3be+cd=-25\\\\\nbf+ce=-6\\\\\ncf=40\n\\end{cases}\n\\]\n\nwhich is solved by  \n\n\\[\na=1,\\;b=1,\\;c=-4,\\qquad d=3,\\;e=-1,\\;f=-10 .\n\\]\n\nHence\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40\n   =(x^{2}+\\sqrt3\\,x-4)(3x^{2}-\\sqrt3\\,x-10). \\tag{3}\n\\]\n\n---\n\n### 4.  Solving for the intersection points  \n\nFrom (3) we obtain four possible \\(x\\)-coordinates.\n\n1. \\(x^{2}+\\sqrt3\\,x-4=0\\)\n\n\\[\nx=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\n2. \\(3x^{2}-\\sqrt3\\,x-10=0\\)\n\n\\[\nx=\\frac{\\sqrt3\\pm\\sqrt{123}}{6}.\n\\]\n\nFor each \\(x\\) we compute \\(y=x^{2}-4\\).\n\n| \\(x\\) | sign of \\(x\\) | \\(y=x^{2}-4\\) | quadrant |\n|---|---|---|---|\n| \\(\\displaystyle\\frac{-\\sqrt3+\\sqrt{19}}{2}\\) | \\(>0\\) | \\(\\displaystyle\\frac{3-\\sqrt{57}}{2}<0\\) | **IV** |\n| \\(\\displaystyle\\frac{-\\sqrt3-\\sqrt{19}}{2}\\) | \\(<0\\) | \\(>0\\) | II |\n| \\(\\displaystyle\\frac{\\sqrt3+\\sqrt{123}}{6}\\) | \\(>0\\) | \\(>0\\) | I |\n| \\(\\displaystyle\\frac{\\sqrt3-\\sqrt{123}}{6}\\) | \\(<0\\) | \\(<0\\) | III |\n\nOnly the first solution lies in the fourth quadrant, as required.\n\n---\n\n### 5.  The required \\(y\\)-coordinate  \n\nFor  \n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}{2},\n\\]\n\\[\ny=x^{2}-4\n   =\\left(\\frac{-\\sqrt3+\\sqrt{19}}{2}\\right)^{2}-4\n   =\\frac{19+3-2\\sqrt{57}}{4}-4\n   =\\frac{22-2\\sqrt{57}}{4}-\\frac{16}{4}\n   =\\frac{3-\\sqrt{57}}{2}.\n\\]\n\nThus  \n\n\\[\ny=\\frac{a-\\sqrt{b}}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\nand \\(\\gcd(a,c)=1\\).\n\nFinally  \n\n\\[\na+b+c=3+57+2=62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\vec{AB}= \\mathbf b ,\\qquad \\vec{AC}= \\mathbf c ,\\qquad \n|\\mathbf b| =28,\\; |\\mathbf c| =91 .\n\\]\n\nWrite every point on the sides as a linear combination of \\(\\mathbf b,\\mathbf c\\).\n\n\\[\n\\begin{aligned}\nD&=\\frac{4}{28}\\mathbf b =\\frac17\\mathbf b ,&\nE&=\\frac{20}{28}\\mathbf b =\\frac57\\mathbf b ,\\\\[2mm]\nF&=\\frac{13}{91}\\mathbf c ,&\nG&=\\frac{65}{91}\\mathbf c .\n\\end{aligned}\n\\]\n\nThe reflections about a point are central symmetries, thus  \n\n\\[\nM=2F-D=-\\frac17\\mathbf b+\\frac{26}{91}\\mathbf c ,\\qquad\nN=2E-G=\\frac{10}{7}\\mathbf b-\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Area of \\(\\triangle ABC\\)\n\nThe quadrilateral \\(DEGF\\) can be split into \\(\\triangle DE G\\) and \\(\\triangle DGF\\).\n\nFor any three points \\(P=\\alpha\\mathbf b+\\beta\\mathbf c\\),\n\\(Q=\\gamma\\mathbf b+\\delta\\mathbf c\\) we have  \n\n\\[\n\\bigl[(Q-P)\\times(R-P)\\bigr]\n    =(\\gamma-\\alpha)(\\zeta-\\beta)-(\\delta-\\beta)(\\xi-\\alpha)\\;\\bigl(\\mathbf b\\times\\mathbf c\\bigr),\n\\]\n\nso the area of a triangle equals the absolute value of that determinant\ntimes \\(\\dfrac12|\\mathbf b\\times\\mathbf c|\\).\n\n*Triangle \\(DEG\\)*  \n\n\\[\n\\det\\!\\begin{pmatrix}\n\\frac57-\\frac17 & 0\\\\[2mm]\n0-\\frac17&\\frac{65}{91}\n\\end{pmatrix}\n  =\\frac{20}{49}.\n\\]\n\nThus \\(\\displaystyle\n\\text{Area}(DEG)=\\frac{20}{49}\\cdot\\frac12|\\mathbf b\\times\\mathbf c|.\n\\)\n\n*Triangle \\(DGF\\)*  \n\n\\[\n\\det\\!\\begin{pmatrix}\n0-\\frac17&\\frac{65}{91}\\\\[2mm]\n0-\\frac17&\\frac{13}{91}\n\\end{pmatrix}\n  =\\frac{4}{49},\n\\qquad\n\\text{Area}(DGF)=\\frac{4}{49}\\cdot\\frac12|\\mathbf b\\times\\mathbf c|.\n\\]\n\nHence  \n\n\\[\n\\text{Area}(DEGF)=\\Bigl(\\frac{20}{49}+\\frac{4}{49}\\Bigr)\n                  \\frac12|\\mathbf b\\times\\mathbf c|\n                =\\frac{24}{49}\\,\\text{Area}(\\triangle ABC).\n\\]\n\nGiven \\(\\text{Area}(DEGF)=288\\),\n\n\\[\n\\frac{24}{49}\\,\\text{Area}(\\triangle ABC)=288\n\\Longrightarrow\n\\text{Area}(\\triangle ABC)=288\\cdot\\frac{49}{24}=12\\cdot49=588.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Area of the heptagon \\(AFNBCEM\\)\n\nPlace the points in the \\((\\alpha,\\beta)\\)\u2013plane where \\((\\alpha,\\beta)\\) are the\ncoefficients of \\(\\mathbf b,\\mathbf c\\):\n\n\\[\n\\begin{array}{c|c}\n\\text{Vertex}&(\\alpha,\\beta)\\\\\\hline\nA&(0,0)\\\\\nF&(0,\\frac{13}{91})\\\\\nN&(\\frac{10}{7},-\\frac{65}{91})\\\\\nB&(1,0)\\\\\nC&(0,1)\\\\\nE&(\\frac57,0)\\\\\nM&\\bigl(-\\frac17,\\frac{26}{91}\\bigr)\n\\end{array}\n\\]\n\nApplying the shoelace formula to these seven points gives\n\n\\[\n\\begin{aligned}\n\\sum x_i y_{i+1}-y_i x_{i+1}\n&=1,\\\\[2mm]\n\\text{Area}_{\\text{coeff}}&=\\frac12\\cdot1=\\frac12 .\n\\end{aligned}\n\\]\n\nIn the original plane a figure\u2019s area is multiplied by\n\\(|\\mathbf b\\times\\mathbf c|=2\\,\\text{Area}(\\triangle ABC)\\).\nThus\n\n\\[\n\\text{Area}(AFNBCEM)=|\\mathbf b\\times\\mathbf c|\\,\n\\frac12\n   =\\text{Area}(\\triangle ABC)=588.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The 12 letters are  \n\n\\[\nA,B,C,D,E,F,G,H,I,J,K,L .\n\\]\n\nA random grouping into six unordered pairs is performed, each pair is written with its\nletters in alphabetical order, and then the six two\u2011letter \u201cwords\u2019\u2019 are listed\nalphabetically.  \n\nLet the word that appears last (the lexicographically greatest word) be called the **max word**.\nThe max word is determined by the *first* letters of the six pairs:\nits first letter is the largest among the six first letters, and if several pairs have that\nfirst letter, the one with the larger second letter wins.\n\n--------------------------------------------------------------------\n### 1.   Total number of possible pairings\n\\[\n\\#\\text{pairings}= \\frac{12!}{2!^{6}\\,6!}=10395 .\n\\]\n\n--------------------------------------------------------------------\n### 2.   When does the max word contain \\(G\\)?\n\nTwo mutually exclusive possibilities:\n\n* **(A) \\(G\\) is the first letter of its pair.**  \n  Then the pair is \\((G,X)\\) with \\(X\\in\\{H,I,J,K,L\\}\\).\n  For \\((G,X)\\) to be the max word, no other pair may have a first\n  letter larger than \\(G\\).  \n  Hence each of the other four letters \\(\\{H,I,J,K,L\\}\\setminus\\{X\\}\\) must be paired\n  with a letter \\(\\le F\\) (otherwise its first letter would exceed \\(G\\)).\n  The remaining letters are  \n\n  * 4 \u201chigh\u2019\u2019 letters \\(\\{H,I,J,K,L\\}\\setminus\\{X\\}\\);\n  * 6 \u201clow\u2019\u2019 letters \\(\\{A,B,C,D,E,F\\}\\).\n\n  Choose which four low letters are matched with the four high letters\n  and then match them (an injection).  \n  The number of ways is  \n\n  \\[\n  {}_{6}P_{4}=6\\cdot5\\cdot4\\cdot3=360 .\n  \\]\n\n  The two low letters left over are forced to pair with each other.\n  Thus for a fixed \\(X\\) there are \\(360\\) pairings, and there are\n  \\(5\\) possible choices for \\(X\\):\n\n  \\[\n  N_A=5\\cdot360=1800 .\n  \\]\n\n* **(B) \\(G\\) is the second letter of its pair.**  \n  Then the pair is \\((X,G)\\) with \\(X<G\\), and \\(X\\) must be the\n  largest first letter of any pair.  \n  If \\(X\\le E\\) there are not enough letters \\(\\le X\\) to pair with all\n  letters \\(>X\\) (there would be more \u201chigh\u2019\u2019 letters than \u201clow\u2019\u2019 ones).  \n  The only possible value is \\(X=F\\).\n\n  Pair \\(G\\) with \\(F\\).  The five letters \\(\\{H,I,J,K,L\\}\\) must each be paired\n  with a distinct letter from \\(\\{A,B,C,D,E\\}\\).  There are  \n\n  \\[\n  5! =120\n  \\]\n\n  ways to do this, and no letters remain.\n\n  Hence  \n\n  \\[\n  N_B =120 .\n  \\]\n\n--------------------------------------------------------------------\n### 3.   Favourable pairings\n\\[\nN_{\\text{fav}}=N_A+N_B=1800+120=1920 .\n\\]\n\n--------------------------------------------------------------------\n### 4.   Desired probability\n\\[\nP=\\frac{N_{\\text{fav}}}{\\#\\text{pairings}}\n   =\\frac{1920}{10395}\n   =\\frac{128}{693}\\qquad(\\gcd(128,693)=1).\n\\]\n\nThus \\(m=128,\\;n=693\\) and  \n\n\\[\nm+n=128+693=821 .\n\\]\n\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line be the \\(x\\)-axis and put  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(c,0),\\qquad D=(d,0),\\qquad E=(e,0),\\qquad F=(f,0)\n\\]\n\nwith the points in the order \\(A\\!<\\!B\\!<\\!C\\!<\\!D\\!<\\!E\\!<\\!F\\).\n\n---\n\n### 1.  Locate the collinear points\n\n\\[\n\\begin{aligned}\nAC&=26 \\Longrightarrow c-0 = 26 \\; \\Rightarrow\\; c=26,\\\\[2pt]\nCE&=31 \\Longrightarrow e-c =31 \\; \\Rightarrow\\; e=26+31=57,\\\\[2pt]\nAF&=73 \\Longrightarrow f=73 .\n\\end{aligned}\n\\]\n\nFrom \\(DF=33\\) we get  \n\n\\[\nf-d =33 \\Longrightarrow d = f-33 = 73-33 =40 .\n\\]\n\nFrom \\(BD=22\\),\n\n\\[\nd-b =22 \\Longrightarrow b = d-22 = 40-22 =18 .\n\\]\n\nThus  \n\n\\[\nA=(0,0),\\; B=(18,0),\\; C=(26,0),\\; D=(40,0),\\; E=(57,0),\\; F=(73,0).\n\\]\n\nAll distances given in the statement are satisfied.\n\n---\n\n### 2.  Position of \\(G\\)\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\).  \nThe distances to \\(C\\) and \\(D\\) give\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2 = 40^2 =1600,\\\\[2pt]\n(x-40)^2+y^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtracting the equations:\n\n\\[\n(x-26)^2-(x-40)^2 = 700.\n\\]\n\nExpanding,\n\n\\[\n(-52x+26^2)+(80x-40^2)=700\\;\\Longrightarrow\\;28x-924=700,\n\\]\n\nso  \n\n\\[\n28x=1624\\quad\\Longrightarrow\\quad x=58 .\n\\]\n\nPlug \\(x=58\\) into \\((x-26)^2+y^2=1600\\):\n\n\\[\n(58-26)^2+y^2 = 32^2 + y^2 = 1600\\;\\Longrightarrow\\; y^2 = 1600-1024 = 576,\n\\]\n\nhence \\(|y|=24\\).  \nTake \\(G=(58,24)\\) (the other choice \\((58,-24)\\) gives the same area).\n\n---\n\n### 3.  Area of \\(\\triangle BGE\\)\n\nPoints:\n\n\\[\nB=(18,0),\\qquad E=(57,0),\\qquad G=(58,24).\n\\]\n\nThe base \\(BE\\) lies on the \\(x\\)-axis, so its length is  \n\n\\[\nBE = 57-18 = 39.\n\\]\n\nThe altitude from \\(G\\) to the line \\(BE\\) is simply \\(|y| = 24\\).\n\nThus  \n\n\\[\n\\text{Area} = \\frac12 \\times (\\text{base}) \\times (\\text{height})\n            = \\frac12 \\times 39 \\times 24\n            = 39 \\times 12\n            = 468 .\n\\]\n\n(Equivalently, the shoelace formula gives \\(\\frac12|1368-432|=468\\).)\n\n---\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nd=n+2\\qquad (d\\ge 1,\\; n=d-2).\n\\]\n\nThen  \n\n\\[\nn+3=d+1 ,\\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .\n\\]\n\nHence  \n\n\\[\n3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).\n\\]\n\nThe condition \\(d\\mid 3(n+3)(n^{2}+9)\\) becomes  \n\n\\[\nd \\mid 3(d+1)(d^{2}-4d+13).\n\\]\n\nTake this congruence modulo \\(d\\).  \nSince \\(d\\equiv0\\pmod d\\),\n\n\\[\nd+1\\equiv1,\\qquad d^{2}-4d+13\\equiv13\\pmod d,\n\\]\n\nso  \n\n\\[\n3(d+1)(d^{2}-4d+13)\\equiv 3\\cdot1\\cdot13=39\\pmod d.\n\\]\n\nThus \\(d\\) must divide \\(39\\):\n\n\\[\nd\\in\\{1,3,13,39\\}.\n\\]\n\nRecall \\(d=n+2\\) and we need \\(n>0\\).  \nHence\n\n\\[\nn=d-2\\in\\{-1,1,11,37\\}.\n\\]\n\nDiscard the non\u2011positive value \\(-1\\). The admissible positive integers are  \n\n\\[\nn=1,\\;11,\\;37 .\n\\]\n\nCheck:\n\n* \\(n=1\\): \\(n+2=3\\) and \\(3(1+3)(1^{2}+9)=120\\) is divisible by \\(3\\).\n* \\(n=11\\): \\(n+2=13\\) and \\(3(14)(130)=5460\\) is divisible by \\(13\\).\n* \\(n=37\\): \\(n+2=39\\) and \\(3(40)(1378)=165360\\) is divisible by \\(39\\).\n\nAll satisfy the condition.  \n\nThe required sum is  \n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For the periodic saw\u2011tooth  \n\n\\[\nf(x)=\\begin{cases}\nx-4k,&x\\in[-1+4k,\\,1+4k)\\\\[2pt]\n4k+2-x,&x\\in[1+4k,\\,3+4k)\n\\end{cases}\\qquad(k\\in\\mathbb Z)\n\\]\n\nthe parabola is  \n\n\\[\nx = 34y^{2}\\qquad (y\\in[-1,1]).\n\\]\n\nHence an intersection point \\((x,y)\\) must satisfy  \n\n\\[\ny=f(x),\\qquad x=34y^{2}.\n\\]\n\n---\n\n### 1.  Intersections on an \u201cup\u201d segment  \n\nOn an up segment \\(x= y+4k\\).  \nSubstituting \\(x=34y^{2}\\) gives  \n\n\\[\n34y^{2}=y+4k\\;\\Longrightarrow\\;34y^{2}-y-4k=0 .\n\\]\n\nFor each integer \\(k\\) with an up segment inside \\([0,34]\\) (i.e. \\(k=0,1,\\dots ,8\\))\nthe two roots are  \n\n\\[\ny_{k}^{\\pm}=\\frac{1\\pm\\sqrt{1+544k}}{68}.\n\\]\n\nBoth satisfy the interval \\([-1,1]\\) and give \\(x\\in[-1+4k,\\,1+4k)\\);\nhence each \\(k\\) contributes **two** intersection points.\n\nThe sum of the two roots for a fixed \\(k\\) is, by Vieta,\n\n\\[\ny_{k}^{+}+y_{k}^{-}= \\frac{1}{34}.\n\\]\n\nThus the total contribution of all up\u2011segments is  \n\n\\[\n\\sum_{k=0}^{8}(y_{k}^{+}+y_{k}^{-})=9\\cdot\\frac1{34}=\\frac9{34}.\n\\]\n\n---\n\n### 2.  Intersections on a \u201cdown\u2019\u2019 segment  \n\nOn a down segment \\(x=4k+2-y\\).  \nUsing \\(x=34y^{2}\\),\n\n\\[\n34y^{2}=4k+2-y\\;\\Longrightarrow\\;34y^{2}+y-(4k+2)=0 .\n\\]\n\nFor each \\(k=0,1,\\dots ,8\\) the roots are  \n\n\\[\nz_{k}^{\\pm}= \\frac{-1\\pm\\sqrt{273+544k}}{68}.\n\\]\n\nThe admissible \\(y\\)-values must satisfy \\(-1<y\\le 1\\).\n\n* For \\(k=0,1,\\dots ,7\\) we have \\(\\sqrt{273+544k}<67\\); both roots lie in\n\\((-1,1]\\) and give valid points.\n* For \\(k=8\\) the negative root satisfies \\(y<-1\\) and is rejected; only the\npositive root remains.\n\nHence we obtain two points for each \\(k=0,\\dots ,7\\) and one point for\n\\(k=8\\) \u2013 a total of \\(17\\) points.\n\nThe sum of the two roots of the quadratic for any \\(k\\) is  \n\n\\[\nz_{k}^{+}+z_{k}^{-}= -\\frac1{34}.\n\\]\n\nConsequently  \n\n\\[\n\\sum_{k=0}^{7}(z_{k}^{+}+z_{k}^{-})=8\\!\\left(-\\frac1{34}\\right)=-\\frac8{34},\n\\]\nand we must add the remaining positive root for \\(k=8\\),\n\n\\[\nz_{8}^{+}= \\frac{-1+\\sqrt{4625}}{68}= \\frac{-1+5\\sqrt{185}}{68}.\n\\]\n\nTherefore the total contribution of the down\u2011segments is  \n\n\\[\n-\\frac8{34}+z_{8}^{+}= -\\frac{16}{68}+ \\frac{-1+5\\sqrt{185}}{68}\n= \\frac{-17+5\\sqrt{185}}{68}.\n\\]\n\n---\n\n### 3.  Sum of all \\(y\\)-coordinates  \n\n\\[\n\\begin{aligned}\nS&=\\frac9{34}+ \\left(-\\frac8{34}+z_{8}^{+}\\right)\\\\[2pt]\n  &=\\frac1{34}+z_{8}^{+}\n   =\\frac{2}{68}+ \\frac{-1+5\\sqrt{185}}{68}\n   =\\frac{1+5\\sqrt{185}}{68}.\n\\end{aligned}\n\\]\n\nThus the sum can be written as  \n\n\\[\nS=\\frac{a+b\\sqrt{c}}{d}\\quad\\text{with}\\quad \na=1,\\;b=5,\\;c=185,\\;d=68.\n\\]\n\nAll conditions are satisfied (\\(\\gcd(a,b,d)=1\\), \\(c\\) square\u2011free).\n\nFinally  \n\n\\[\na+b+c+d = 1+5+185+68 = \\boxed{259}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The grid has three rows and three vertical \\(3\\times3\\) blocks.  \nLet the rows be \\(R_1,R_2,R_3\\) and the blocks be \\(B_1,B_2,B_3\\).\n\n---\n\n### 1.  How the numbers are placed in the rows and blocks  \n\nFor a given number \\(k\\in\\{1,\\ldots ,9\\}\\) it must appear  \n\n* once in each row (three appearances), and  \n* once in each block (three appearances).\n\nHence the three positions of \\(k\\) correspond to a **bijection** between the set of rows and the set of blocks.  \nThus for each \\(k\\) we may choose a permutation \\(\\sigma_k\\in S_3\\) :\n\n\\[\n\\sigma_k(r)=\\text{the block in which }k\\text{ occurs in row }r .\n\\]\n\nConversely, a choice of a permutation \\(\\sigma_k\\) for each \\(k\\) determines in which block every entry of the grid lies.\n\n---\n\n### 2.  Counting the possible collections of permutations  \n\nWrite a column of the \\(3\\times9\\) \u201cblock\u2011matrix\u2019\u2019 \\(M\\) as a permutation of \\((1,2,3)\\) \u2013 the three symbols denote the block in which the number of that column appears in rows \\(1,2,3\\).\n\nThus we need a sequence of nine permutations \\((p_1,\\dots ,p_9)\\) such that each ordered pair \\((\\text{row},\\text{block})\\) occurs exactly three times; equivalently each number appears three times in each row and three times in each block.\n\nLet  \n\n\\[\nx_1,\\dots ,x_6\n\\]\n\nbe the numbers of the six possible permutations of \\(S_3\\) in the sequence.\nThe conditions give the linear system  \n\n\\[\n\\begin{aligned}\nx_1+x_2&=3\\\\\nx_3+x_4&=3\\\\\nx_5+x_6&=3\\\\\nx_3+x_5&=3\\\\\nx_1+x_6&=3\\\\\nx_2+x_4&=3\\\\\nx_4+x_6&=3\\\\\nx_2+x_5&=3\\\\\nx_1+x_3&=3\n\\end{aligned}\n\\]\n\nwhich has the solutions  \n\n\\[\n\\begin{array}{c|cccccc}\n &x_1&x_2&x_3&x_4&x_5&x_6\\\\\\hline\nt=0&0&3&3&0&0&3\\\\\nt=1&1&2&2&1&1&2\\\\\nt=2&2&1&1&2&2&1\\\\\nt=3&3&0&0&3&3&0\n\\end{array}\n\\qquad (t=0,1,2,3).\n\\]\n\nFor a fixed solution the columns can be ordered in\n\n\\[\n\\frac{9!}{x_1!x_2!x_3!x_4!x_5!x_6!}\n\\]\n\nways.  Summing over the four solutions gives  \n\n\\[\n\\begin{aligned}\nN_M &= \\frac{9!}{3!^3}+2\\cdot\\frac{9!}{1!\\,2!^2\\,1!\\,1!\\,2!}\n      +\\frac{9!}{3!^3}\\\\\n    &=1680+2\\cdot45360+1680=94\\,080 .\n\\end{aligned}\n\\]\n\nSo there are \\(94\\,080\\) possible matrices \\(M\\) describing in which block each number lies.\n\n---\n\n### 3.  Filling the inner columns of each block  \n\nInside a block \\(B\\) each row already has three distinct numbers (the three numbers assigned to that row in the block).  \nThese three numbers can be placed in the three inner columns of the block in any order, i.e. in \\((3!)^3=6^3\\) ways.\n\nSince the three blocks are independent, the total number of ways to complete the grid is  \n\n\\[\n94\\,080\\cdot (6^3)^3 = 94\\,080\\cdot 6^9 .\n\\]\n\nBecause \\(6^9 = (2\\cdot3)^9 =2^{9}\\,3^{9}\\),\n\n\\[\n\\begin{aligned}\n94\\,080\\cdot6^9 &= \\bigl(2^7\\cdot3\\cdot5\\cdot7^2\\bigr)\\cdot\\bigl(2^9\\cdot3^9\\bigr)\\\\\n                &=2^{16}\\cdot3^{10}\\cdot5^1\\cdot7^2 .\n\\end{aligned}\n\\]\n\nThus the total number of fillings is  \n\n\\[\n2^{16}\\cdot 3^{10}\\cdot 5^{1}\\cdot 7^{2}.\n\\]\n\n---\n\n### 4.  Computing the required sum  \n\nTake \\(p=2,\\ a=16;\\; q=3,\\ b=10;\\; r=5,\\ c=1;\\; s=7,\\ d=2\\).\n\n\\[\np\\,a+q\\,b+r\\,c+s\\,d = 2\\cdot16 + 3\\cdot10 + 5\\cdot1 + 7\\cdot2\n                     = 32 + 30 + 5 + 14 = 81 .\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First rewrite the chain of inequalities  \n\n\\[\nx-yz<y-zx<z-xy\n\\]\n\nas two separate inequalities.\n\n\\[\n\\begin{aligned}\nx-yz &< y-zx \\\\[2mm]\ny-zx &< z-xy\n\\end{aligned}\n\\]\n\n\\[\n\\begin{aligned}\nx-yz-y+zx&<0\\qquad\\Longrightarrow\\qquad (x-y)(1+z)<0,\\\\[2mm]\ny-zx-z+xy&<0\\qquad\\Longrightarrow\\qquad (y-z)(1+x)<0 .\n\\end{aligned}\n\\]\n\nThe third inequality \\( (x-z)(1+y)<0\\) follows by adding the two, so the region is\ndescribed by  \n\n\\[\n\\boxed{(x-y)(1+z)<0,\\qquad (y-z)(1+x)<0}\n\\]\n\ntogether with the plane \\(x+y+z=75\\).\n\n---\n\n### 1.   Sign patterns\n\nLet  \n\n\\[\nS_x=\\operatorname{sgn}(1+x),\\quad S_y=\\operatorname{sgn}(1+y),\\quad S_z=\\operatorname{sgn}(1+z).\n\\]\n\nFrom the two product\u2011inequalities we obtain  \n\n\\[\n\\operatorname{sgn}(x-y)=-S_z,\\qquad \n\\operatorname{sgn}(y-z)=-S_x .\n\\]\n\nThus  \n\n\\[\n\\begin{array}{c|c|c|c}\nS_x & S_y & S_z &\\text{order of }x,y,z\\\\ \\hline\n+ & + & + & x<y<z\\\\\n+ & - & - & y<z<x\\\\\n- & + & + & x<z<y\\\\\n- & - & - & \\text{impossible (sum }\\;75) \n\\end{array}\n\\]\n\nHence the points satisfying the chain split into three convex regions, corresponding\nto the three admissible sign patterns above.\n\n---\n\n### 2.   Which region is bounded?\n\n*Region  \\(x<y<z\\)  (all three numbers \\(> -1\\)).*  \nUsing the plane equation \\(z=75-x-y\\) the conditions become  \n\n\\[\n-1<x<y,\\qquad y<\\frac{75-x}{2}.\n\\]\n\nIn the \\((x,y)\\)-plane this is the triangle bounded by  \n\n\\[\nx=-1,\\; y=x,\\; y=\\frac{75-x}{2}.\n\\]\n\nThe three vertices are  \n\n\\[\n(-1,-1),\\;(-1,38),\\;(25,25).\n\\]\n\nIts area in the \\(xy\\)-plane is\n\n\\[\n\\frac12\\,(39)(26)=507 .\n\\]\n\nSince the plane \\(x+y+z=75\\) is tilted, an element \\(dx\\,dy\\) on the\n\\(xy\\)-plane corresponds to an area element  \n\n\\[\n\\sqrt{1+(\\partial z/\\partial x)^2+(\\partial z/\\partial y)^2}\\;dx\\,dy\n        =\\sqrt{1+1+1}\\;dx\\,dy=\\sqrt3\\,dx\\,dy .\n\\]\n\nThus the area of this region in the plane is  \n\n\\[\n507\\sqrt3 .\n\\]\n\n*The other two regions* (\\(y<z<x\\) and \\(x<z<y\\)) project onto unbounded\nhalf\u2011planes, so they have infinite area.\n\nHence the **unique finite region** is the one with \\(x<y<z\\), and its area is\n\\(507\\sqrt3\\).\n\n---\n\n### 3.   Answer\n\nThe area is \\(a\\sqrt b\\) with \\(a=507\\) and \\(b=3\\); therefore  \n\n\\[\na+b=507+3=510 .\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\prod_{k=4}^{63}\\frac{\\log_k\\bigl(5^{k^2-1}\\bigr)}{\\log_{k+1}\\bigl(5^{k^2-4}\\bigr)}\n\\]\n\n---\n\n### 1.  Use change\u2011of\u2011base\n\n\\[\n\\log_k\\bigl(5^{k^2-1}\\bigr)=\\frac{\\log_5\\bigl(5^{k^2-1}\\bigr)}{\\log_5 k}\n      =\\frac{k^{2}-1}{\\log_5 k},\n\\qquad\n\\log_{k+1}\\bigl(5^{k^2-4}\\bigr)=\\frac{k^{2}-4}{\\log_5 (k+1)} .\n\\]\n\nHence each factor of the product equals  \n\n\\[\n\\frac{k^2-1}{k^2-4}\\;\n      \\frac{\\log_5(k+1)}{\\log_5k}.\n\\]\n\nSo\n\n\\[\nP = \\underbrace{\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}}_{\\displaystyle P_1}\n    \\;\n    \\underbrace{\\prod_{k=4}^{63}\\frac{\\log_5(k+1)}{\\log_5k}}_{\\displaystyle P_2}.\n\\]\n\n---\n\n### 2.  Simplify \\(P_1\\)\n\n\\[\n\\frac{k^2-1}{k^2-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)}\n                  =\\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nThus  \n\n\\[\nP_1=\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n    \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr).\n\\]\n\nBoth products telescope:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n   =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdots\\frac{62}{61}\n   =\\frac{62}{2}=31,\n\\]\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n   =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdots\\frac{64}{65}\n   =\\frac{5}{65}=\\frac1{13}.\n\\]\n\nTherefore  \n\n\\[\nP_1 =31\\cdot\\frac1{13} =\\frac{31}{13}.\n\\]\n\n---\n\n### 3.  Simplify \\(P_2\\)\n\n\\[\nP_2 =\\prod_{k=4}^{63}\\frac{\\log_5(k+1)}{\\log_5k}\n    =\\frac{\\log_5 5\\;\\log_5 6\\;\\cdots\\;\\log_5 64}\n           {\\log_5 4\\;\\log_5 5\\;\\cdots\\;\\log_5 63}\n    =\\frac{\\log_5 64}{\\log_5 4}.\n\\]\n\nUsing the change\u2011of\u2011base formula,\n\n\\[\n\\frac{\\log_5 64}{\\log_5 4}= \\log_4 64.\n\\]\n\nSince \\(4^3=64\\), we have \\(\\log_4 64 = 3\\). Hence  \n\n\\[\nP_2 = 3.\n\\]\n\n---\n\n### 4.  Combine the two parts\n\n\\[\nP = P_1\\cdot P_2 = \\frac{31}{13}\\times 3 = \\frac{93}{13}.\n\\]\n\nThus the product equals \\(\\displaystyle\\frac{m}{n}\\) with \\(m=93,\\; n=13\\).\n\n\\[\nm+n = 93+13 = 106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Factor  \n\n\\[\n2025=45^{2}= (3^{2}\\cdot5)^{2}=3^{4}\\cdot5^{2}.\n\\]\n\nHence a divisor of \\(2025\\) is of the form \\(3^{a}5^{b}\\) with  \n\n\\(0\\le a\\le4\\) and \\(0\\le b\\le2\\).  \nThus  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\nAll \\(2^{15}\\) subsets of \\(A\\) are equally likely.\n\n---\n\n### Divisors needed for the LCM\n\nFor a subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max_{d\\in B}a_d}\\;5^{\\max_{d\\in B}b_d}.\n\\]\n\nTo obtain \\(\\operatorname{lcm}(B)=2025=3^{4}5^{2}\\) we must have  \n\n* at least one element whose exponent of \\(3\\) equals \\(4\\);\n* at least one element whose exponent of \\(5\\) equals \\(2\\).\n\nDefine  \n\n\\[\nD_3=\\{d\\in A:\\, \\text{the exponent of }3\\text{ in }d\\text{ is }4\\},\\qquad \nD_5=\\{d\\in A:\\, \\text{the exponent of }5\\text{ in }d\\text{ is }2\\}.\n\\]\n\nCounting these divisors:\n\n* \\(D_3 = \\{3^{4}5^{0}, 3^{4}5^{1}, 3^{4}5^{2}\\}\\) \u21d2 \\(|D_3|=3\\);\n* \\(D_5 = \\{3^{0}5^{2}, 3^{1}5^{2}, 3^{2}5^{2}, 3^{3}5^{2}, 3^{4}5^{2}\\}\\) \u21d2 \\(|D_5|=5\\);\n* The intersection \\(D_3\\cap D_5=\\{3^{4}5^{2}\\}= \\{2025\\}\\) \u21d2 \\(|D_3\\cap D_5|=1\\).\n\nThus a subset \\(B\\) has \\(\\operatorname{lcm}(B)=2025\\) iff it contains **at least one element of \\(D_3\\) and at least one element of \\(D_5\\)** (the same element may satisfy both conditions).\n\n---\n\n### Counting such subsets\n\nLet \\(U\\) be the set of all subsets of \\(A\\) (including the empty set).  \nUse inclusion\u2013exclusion.\n\n\\[\n\\begin{aligned}\n|U| &=2^{15},\\\\[2mm]\n\\text{Subsets missing }D_3 &: 2^{15-|D_3|}=2^{12},\\\\[2mm]\n\\text{Subsets missing }D_5 &: 2^{15-|D_5|}=2^{10},\\\\[2mm]\n\\text{Subsets missing both }D_3\\text{ and }D_5 &: \n2^{15-|D_3\\cup D_5|}\n =2^{15-(3+5-1)}=2^{8}.\n\\end{aligned}\n\\]\n\nHence the number of subsets that contain at least one element of each set is  \n\n\\[\n\\begin{aligned}\nN_{\\text{good}}\n&=|U|-2^{12}-2^{10}+2^{8}\\\\\n&=32768-4096-1024+256\\\\\n&=27904.\n\\end{aligned}\n\\]\n\nEvery such subset is non\u2011empty, so these are exactly the favorable subsets.\n\n---\n\n### Probability\n\n\\[\nP=\\frac{N_{\\text{good}}}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nReduce the fraction:\n\n\\[\n27904=2^{8}\\cdot 109,\\qquad 32768=2^{15}=2^{8}\\cdot 128\n\\Longrightarrow P=\\frac{109}{128}.\n\\]\n\nThus \\(m=109\\) and \\(n=128\\), and  \n\n\\[\nm+n = 109+128 = 237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(\\omega _2\\) have centre \\(O\\) and radius \\(15\\);\n* \\(BC\\) be a diameter of \\(\\omega _2\\);\n* \\(\\omega _1\\) have centre \\(A\\) and radius \\(6\\), internally tangent to \\(\\omega _2\\) at \\(B\\).\n\n--------------------------------------------------------------------\n### 1.  Coordinates\n\nPlace \\(BC\\) on the \\(x\\)-axis with  \n\n\\[\nB=(-15,0),\\qquad C=(15,0),\\qquad O=(0,0).\n\\]\n\nSince the circles are internally tangent, the centres are collinear with the\ntangency point and  \n\n\\[\nOA=R_2-R_1=15-6=9 .\n\\]\n\nThus \\(A\\) lies on the ray \\(OB\\) at distance \\(9\\) from \\(O\\); consequently  \n\n\\[\nA=(-9,0).\n\\]\n\n--------------------------------------------------------------------\n### 2.  Point \\(D\\)\n\n\\(AD\\perp BC\\), so \\(AD\\) is the vertical line \\(x=-9\\).\nIntersecting this line with \\(\\omega _2\\) (\\(x^2+y^2=225\\)) gives  \n\n\\[\ny^2=225-(-9)^2=144\\quad\\Longrightarrow\\quad y=\\pm12 .\n\\]\n\nBecause the statement \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u2019\u2019 puts \\(D\\) above the centre, we take  \n\n\\[\nD=(-9,12).\n\\]\n\n--------------------------------------------------------------------\n### 3.  Rectangle \\(EFGH\\)\n\nThe rectangle is inscribed in \\(\\omega _1\\), so its circum\u2011centre is the\ncentre of \\(\\omega _1\\); hence the centre of the rectangle is \\(A\\).\n\nLet  \n\n* half\u2011width \\(a\\) (distance from the centre to each vertical side),\n* half\u2011height \\(b\\) (distance from the centre to each horizontal side).\n\nBecause the vertices lie on \\(\\omega _1\\),\n\n\\[\na^{2}+b^{2}=6^{2}=36. \\tag{1}\n\\]\n\nThe condition \u201c\\(\\overline{EF}\\perp\\overline{BC}\\)\u201d makes \\(\\overline{EF}\\) vertical,\nso the rectangle\u2019s sides are parallel/perpendicular to \\(BC\\).  \nTaking the usual labelling (counter\u2011clockwise)\n\n\\[\n\\begin{aligned}\nE&=(-9-a,\\,-b),\\qquad \nF=(-9-a,\\,b),\\\\\nG&=(-9+a,\\,b),\\qquad \nH=(-9+a,\\,-b).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Equality of the two triangle areas\n\n\\[\n\\begin{aligned}\n\\text{Area}(\\triangle DGF)&=\\frac12\\cdot GF\\cdot(\\text{vertical distance }D\\text{ to }y=b)\\\\\n&=\\frac12\\cdot(2a)\\cdot(12-b)=a(12-b),\\\\[4pt]\n\\text{Area}(\\triangle CHG)&=\\frac12\\cdot GH\\cdot(\\text{horizontal distance }C\\text{ to }x=-9+a)\\\\\n&=\\frac12\\cdot(2b)\\cdot(24-a)=b(24-a).\n\\end{aligned}\n\\]\n\nGiven the areas are equal,\n\n\\[\na(12-b)=b(24-a)\\quad\\Longrightarrow\\quad12a=24b\\quad\\Longrightarrow\\quad a=2b. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Solving for \\(a\\) and \\(b\\)\n\nSubstituting \\(a=2b\\) into (1):\n\n\\[\n(2b)^{2}+b^{2}=36\\;\\Longrightarrow\\;5b^{2}=36\\;\\Longrightarrow\\;b^{2}=\\frac{36}{5}.\n\\]\n\nHence  \n\n\\[\na^{2}=(2b)^{2}=4b^{2}= \\frac{144}{5}.\n\\]\n\n--------------------------------------------------------------------\n### 6.  Area of the rectangle\n\n\\[\n\\text{Area}= (2a)(2b)=4ab=4(2b)b=8b^{2}=8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nThus the area is \\(\\dfrac{288}{5}\\).  In lowest terms \\(m=288,\\;n=5\\), and\n\n\\[\nm+n=288+5=293.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  How many regions are created by chords?**  \n\nIf a convex region (here the disk) is cut by \\(N\\) line\u2011segments whose interior intersection points are all distinct, the number of regions is  \n\n\\[\nR=N+1+I,\n\\]\n\nwhere \\(I\\) is the total number of interior intersection points.  \n(Each new segment adds one region, plus one extra region for each interior point where it meets a previous segment.)\n\nFor our disk  \n\n\\[\nN=27\\qquad\\text{(the two diameters + 25 random chords)} .\n\\]\n\nHence  \n\n\\[\nE[R]=28+E[I].\n\\]\n\nSo we must find the expected number \\(E[I]\\) of interior intersection points.\n\n--------------------------------------------------------------------\n\n**Step 2.  Intersections involving the two diameters.**\n\nThe two diameters intersect at the centre; this contributes one guaranteed intersection.\n\nFor a random chord \\(C\\) we ask for the probability that it meets a given diameter.\n\n*Vertical diameter.*  \nThe chord meets the vertical line \\(x=0\\) iff its endpoints lie in opposite half\u2011planes (one in \\(\\{Q_1,Q_4\\}\\) and the other in \\(\\{Q_2,Q_3\\}\\)).  \nAmong the six unordered pairs of distinct quadrants, four have this property:\n\n\\[\n\\{Q_1,Q_2\\},\\{Q_1,Q_3\\},\\{Q_2,Q_4\\},\\{Q_3,Q_4\\},\n\\]\n\nso  \n\n\\[\nP(C\\text{ meets the vertical diameter})=\\frac{4}{6}=\\frac23 .\n\\]\n\nExactly the same reasoning holds for the horizontal diameter.  \nThus for each random chord\n\n\\[\nP(C\\text{ meets a given diameter})=\\frac23 .\n\\]\n\nWith 25 random chords we obtain  \n\n\\[\nE[\\text{intersections chord\u2013diameter}] = 25\\cdot 2\\cdot\\frac23=\\frac{100}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3.  Intersections among the 25 random chords.**\n\nEach chord is obtained by picking two points on the circle that lie in different quadrants.  \nThe unordered pair of quadrants a chord uses is equally likely to be any of the six possibilities\n\n* four *adjacent* pairs: \\(\\{01\\},\\{12\\},\\{23\\},\\{30\\}\\);\n* two *opposite* pairs: \\(\\{02\\},\\{13\\}\\).\n\nThus a chord is *adjacent* with probability \\(\\frac23\\) and *opposite* with probability \\(\\frac13\\).\n\n--------------------------------------------------------------------\n### 3.1  Classifying a pair of chords\n\nLet chord\u202f1 belong to unordered pair \\(P\\) and chord\u202f2 to unordered pair \\(Q\\).  \nThere are three possible relationships between \\(P\\) and \\(Q\\):\n\n| relationship | how many ordered \\((P,Q)\\) | intersection probability |\n|--------------|---------------------------|--------------------------|\n| same pair (\\(P=Q\\)) | 6 | \\(\\displaystyle\\frac12\\) |\n| disjoint pairs (no common quadrant) | 6 (4 adjacent\u2011adjacent, 2 opposite\u2011opposite) | \\(0\\) for adjacent\u2013adjacent, \\(1\\) for opposite\u2013opposite |\n| share exactly one quadrant | 24 (8 adjacent\u2011adjacent, 16 adjacent\u2011opposite) | \\(\\displaystyle\\frac12\\) |\n\n*Why the numbers?*  \n\n* Two chords of the **same type** intersect iff the order of the two points in the first quadrant is opposite to the order of the two points in the second quadrant \u2013 probability \\(1/2\\).\n\n* Two **disjoint adjacent** chords lie in quadrants \\(\\{0,1\\}\\) and \\(\\{2,3\\}\\); all points of the first lie before those of the second, so they never intersect.\n\n* Two **disjoint opposite** chords are \\(\\{0,2\\}\\) and \\(\\{1,3\\}\\); the four points appear in the order \\(0,1,2,3\\), which is alternating, so they always intersect.\n\n* When the chords **share exactly one quadrant**, the shared quadrant contains two independent uniform points; whichever of the two lies first decides whether the endpoints are interleaved. Hence the intersection probability is \\(1/2\\).\n\n--------------------------------------------------------------------\n### 3.2  Expected intersection probability for a random pair\n\nSumming the contributions of all 36 ordered possibilities:\n\n\\[\n\\begin{aligned}\n\\sum_{P,Q} p_{P,Q}&=\n6\\!\\left(\\frac12\\right) \n+ 4\\!\\cdot\\!0 \n+ 2\\!\\cdot\\!1 \n+ 24\\!\\left(\\frac12\\right) \\\\\n&= 3 + 2 + 12 = 17 .\n\\end{aligned}\n\\]\n\nTherefore for two independently chosen random chords\n\n\\[\nP(\\text{they intersect}) = \\frac{17}{36}.\n\\]\n\n--------------------------------------------------------------------\n### 3.3  Expected number of chord\u2013chord intersections\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of the 25 chords, so\n\n\\[\nE[\\text{chord\u2013chord intersections}]\n=300\\cdot\\frac{17}{36}= \\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4.  Total expected number of interior intersections.**\n\n\\[\n\\begin{aligned}\nE[I] &= \\underbrace{1}_{\\text{diameters}} \n      + \\underbrace{\\frac{100}{3}}_{\\text{chord\u2013diameter}} \n      + \\underbrace{\\frac{425}{3}}_{\\text{chord\u2013chord}} \\\\[2mm]\n     &= \\frac{525}{3}+1 = 175+1 = 176 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5.  Expected number of regions.**\n\n\\[\nE[R]=N+1+E[I]=27+1+176=204.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Label the twelve unit segments that form the sides of the four unit squares as in the picture  \n\n\\[\n\\begin{array}{c}\n\\text{top left square }A:\\; a\\;( \\text{top}) ,\\; a'(\\text{left}) ,\\; u (\\text{vertical middle up}) ,\\; x (\\text{horizontal middle left})\\\\[2mm]\n\\text{top right square }B:\\; b ,\\; b' ,\\; u ,\\; y\\\\[2mm]\n\\text{bottom left square }C:\\; c ,\\; c' ,\\; v ,\\; x\\\\[2mm]\n\\text{bottom right square }D:\\; d ,\\; d' ,\\; v ,\\; y\n\\end{array}\n\\]\n\nAll variables are binary:  \n\n\\[\n0=\\text{blue},\\qquad 1=\\text{red}.\n\\]\n\n---\n\n### 1.  Express the condition for each square  \n\nFor a square the number of red sides must be exactly two.  \nIf we let  \n\n\\[\n\\begin{aligned}\ns_A &=x+u, & s_B &=y+u,\\\\\ns_C &=x+v, & s_D &=y+v,\n\\end{aligned}\n\\]\n\nthen the two **boundary** edges of a square must contain  \n\n\\[\nr_A =2-s_A,\\qquad r_B =2-s_B,\\qquad r_C =2-s_C,\\qquad r_D =2-s_D\n\\]\n\nred sides.  \nFor each square the two boundary edges are distinct from the other squares, so the choices for the\nfour pairs are independent.\n\nFor a given pair of boundary edges the number of colourings is  \n\n\\[\n\\begin{cases}\n1 &\\text{if }r_i\\in\\{0,2\\}\\;(00\\text{ or }11),\\\\[2mm]\n2 &\\text{if }r_i =1\\;(01\\text{ or }10).\n\\end{cases}\n\\]\n\nHence, when the interior pattern \\((x,y,u,v)\\) is fixed, the number of ways to colour the eight\nouter edges equals  \n\n\\[\n2^{\\#\\{\\,i\\in\\{A,B,C,D\\}\\mid s_i=1\\,\\}},\n\\]\n\nbecause a square contributes a factor \\(2\\) exactly when its interior sum \\(s_i\\) equals \\(1\\).\n\nThus the total number of admissible colourings is  \n\n\\[\nN=\\sum_{(x,y,u,v)\\in\\{0,1\\}^4} 2^{\\#\\{i\\mid s_i=1\\}} .\n\\]\n\n---\n\n### 2.  Enumerate the \\(2^4=16\\) interior patterns  \n\n\\[\n\\begin{array}{c|c|c|c|c|c}\n(x,y,u,v) & s_A & s_B & s_C & s_D &\n\\#\\{i\\mid s_i=1\\}\\\\\\hline\n0000 &0&0&0&0&0\\\\\n0001 &0&0&1&1&2\\\\\n0010 &1&1&0&0&2\\\\\n0011 &1&1&1&1&4\\\\\n0100 &0&1&0&1&2\\\\\n0101 &0&1&1&2&2\\\\\n0110 &1&2&0&1&2\\\\\n0111 &1&2&1&2&2\\\\\n1000 &1&0&1&0&2\\\\\n1001 &1&0&2&1&2\\\\\n1010 &2&1&1&0&2\\\\\n1011 &2&1&2&1&2\\\\\n1100 &1&1&1&1&4\\\\\n1101 &1&1&2&2&2\\\\\n1110 &2&2&1&1&2\\\\\n1111 &2&2&2&2&0\n\\end{array}\n\\]\n\n(The entry \u201c2\u2019\u2019 means the sum of the two interior edges of that square is \\(2\\); it forces the\ncorresponding pair of boundary edges to be both blue.)\n\nThe contribution of each pattern is \\(2^{\\#\\{i\\mid s_i=1\\}}\\).  Adding all contributions we get  \n\n\\[\n\\begin{aligned}\nN&=1\\;(0000)+4\\;(0001)+4\\;(0010)+16\\;(0011)\\\\\n  &\\quad+4\\;(0100)+4\\;(0101)+4\\;(0110)+4\\;(0111)\\\\\n  &\\quad+4\\;(1000)+4\\;(1001)+4\\;(1010)+4\\;(1011)\\\\\n  &\\quad+16\\;(1100)+4\\;(1101)+4\\;(1110)+1\\;(1111)\\\\[2mm]\n  &=1+16+48+16+1\\\\\n  &=\\boxed{82}.\n\\end{aligned}\n\\]\n\nTherefore there are **82** ways to colour the twelve unit segments of a \\(2\\times2\\) grid so that\nevery unit square has exactly two red and two blue sides.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nf(x)=\\sin \\bigl(7\\pi\\sin(5x)\\bigr)\n\\qquad (0<x<2\\pi)\n\\]\n\n---\n\n### 1.  Zeros of \\(f\\)\n\n\\(f(x)=0\\iff \\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\\)\n\n\\[\n7\\pi\\sin(5x)=k\\pi\\qquad(k\\in\\mathbb Z)\n\\Longrightarrow\\sin(5x)=\\frac{k}{7}.\n\\]\n\nSince \\(\\sin(5x)\\in[-1,1]\\), we must have \\(-7\\le k\\le7\\).  \nThus \\(k\\) can be any integer from \\(-7\\) to \\(7\\) (15 values).\n\nPut \\(\\theta =5x\\). Then \\(\\theta\\in(0,10\\pi)\\) and we need the number of solutions of  \n\n\\[\n\\sin\\theta =\\frac{k}{7}\\qquad (k=-7,\\ldots,7)\n\\]\nin \\((0,10\\pi)\\).\n\n*If \\(|k|=7\\) (\\(\\sin\\theta=\\pm1\\)):* each period \\((0,2\\pi)\\) contributes one solution, and there are five periods in \\((0,10\\pi)\\).  \n\\(\\;\\Rightarrow\\) 5 solutions for \\(k=7\\) and 5 solutions for \\(k=-7\\).\n\n*If \\(k=0\\) (\\(\\sin\\theta=0\\)):* solutions are \\(\\theta=n\\pi\\) with \\(n=1,\\dots ,9\\).  \n\\(\\;\\Rightarrow\\) 9 solutions.\n\n*If \\(|k|=1,2,\\dots ,6\\) (\\(|\\sin\\theta|<1\\) and \\(\\neq0\\)):* in each \\(2\\pi\\)\u2011interval there are two solutions, so across five intervals there are \\(2\\cdot5=10\\) solutions.\n\nHence the total number of zeros is  \n\n\\[\nn =\\underbrace{5+5}_{k=\\pm7}+ \\underbrace{9}_{k=0}+ \\underbrace{12\\times10}_{k=\\pm1,\\dots ,\\pm6}\n      =10+9+120 = 139 .\n\\]\n\n---\n\n### 2.  Tangent zeros\n\nA zero is tangent to the \\(x\\)-axis when \\(f'(x)=0\\) as well.\n\n\\[\nf'(x)=35\\pi\\cos\\!\\bigl(7\\pi\\sin(5x)\\bigr)\\,\\cos(5x).\n\\]\n\nAt any zero we have \\(\\cos\\!\\bigl(7\\pi\\sin(5x)\\bigr)=\\cos(k\\pi)=(-1)^k\\neq0\\); therefore  \n\n\\[\nf'(x)=0 \\iff \\cos(5x)=0.\n\\]\n\n\\(\\cos(5x)=0\\) gives \\(5x=\\dfrac{\\pi}{2}+m\\pi\\;(m\\in\\mathbb Z)\\), i.e.\n\n\\[\nx=\\frac{(2m+1)\\pi}{10}.\n\\]\n\nWithin \\(0<x<2\\pi\\) the odd integers \\(2m+1\\) run from \\(1\\) to \\(19\\); there are \\(10\\) such values.\nAt these points \\(\\sin(5x)=\\pm1\\), i.e. they correspond exactly to the solutions for \\(k=\\pm7\\).\n\nThus  \n\n\\[\nt=10.\n\\]\n\n---\n\n### 3.  Required sum\n\n\\[\nn+t = 139+10 = 149.\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1 \u2013 Greedy description**\n\nFor a given amount \\(N\\) let  \n\n\\[\nq=\\Bigl\\lfloor \\frac{N}{25}\\Bigr\\rfloor ,\\qquad r=N-25q\\;(0\\le r<25)\n\\]\n\nThe greedy algorithm first takes \\(q\\) quarters, then uses as many dimes as possible and finally pennies.  \nHence the greedy number of coins is  \n\n\\[\ng(N)=q+\\Bigl\\lfloor\\frac{r}{10}\\Bigr\\rfloor +(r\\bmod 10)\n      =q+f(r),\n\\]\n\nwhere  \n\n\\[\nf(x)=\\Bigl\\lfloor\\frac{x}{10}\\Bigr\\rfloor +(x\\bmod10)\n\\]\n\nis the optimal number of coins when only dimes and pennies are allowed.\n\n---\n\n**Step 2 \u2013 Optimal solution with a given number of quarters**\n\nIf we use \\(a\\) quarters (\\(0\\le a\\le q\\)), we must make the remainder \\(N-25a\\) with dimes and pennies.  \nThe minimum number of coins for that remainder is \\(f(N-25a)\\).  \nThus the optimal number of coins for \\(N\\) is  \n\n\\[\n\\min_{0\\le a\\le q}\\; \\bigl[a+f(N-25a)\\bigr].\n\\]\n\nBecause \\(f\\) is optimal for the two\u2011coin system \\(\\{1,10\\}\\), we only need to compare the greedy choice\n\\(a=q\\) with the possibilities where we use fewer quarters.\n\n---\n\n**Step 3 \u2013 Effect of removing one quarter**\n\nWrite \\(r=N-25q\\) (the greedy remainder).  \nIf we use one fewer quarter (\\(a=q-1\\)), the new remainder is \\(r+25\\), and the coin count becomes  \n\n\\[\n(q-1)+f(r+25).\n\\]\n\nGreedy is optimal precisely when  \n\n\\[\nq+f(r)\\le (q-1)+f(r+25)\\quad\\Longleftrightarrow\\quad f(r)+1\\le f(r+25).\n\\]\n\nCompute \\(f(r+25)\\) in terms of \\(f(r)\\).  \nSince adding \\(25\\) cents is the same as adding two dimes and five pennies,  \n\n\\[\nf(r+25)=r+25-9\\Bigl\\lfloor\\frac{r+25}{10}\\Bigr\\rfloor .\n\\]\n\nThe floor changes by  \n\n\\[\n\\Bigl\\lfloor\\frac{r+25}{10}\\Bigr\\rfloor-\\Bigl\\lfloor\\frac{r}{10}\\Bigr\\rfloor=\n\\begin{cases}\n2,& r\\bmod10\\le 4,\\\\[2pt]\n3,& r\\bmod10\\ge 5 .\n\\end{cases}\n\\]\n\nHence  \n\n\\[\nf(r+25)=\n\\begin{cases}\nf(r)+7, & r\\bmod10\\le4,\\\\[2pt]\nf(r)-2, & r\\bmod10\\ge5 .\n\\end{cases}\n\\]\n\nConsequently  \n\n* if \\(r\\bmod10\\le4\\) then \\(f(r+25)=f(r)+7>f(r)+1\\) \u2013 greedy stays optimal;\n* if \\(r\\bmod10\\ge5\\) then \\(f(r+25)=f(r)-2\\le f(r)\\) \u2013 using one fewer quarter gives fewer coins.\n\nThus the greedy algorithm fails **exactly** when the greedy remainder \\(r\\) satisfies  \n\n\\[\nr\\bmod10\\ge5 \\;\\Longleftrightarrow\\; r\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\n---\n\n**Step 4 \u2013 Dropping more than one quarter never helps**\n\nFor two quarters removed we add \\(50\\) cents to the remainder.  \nA similar computation gives  \n\n\\[\nf(r+50)=f(r)+5 .\n\\]\n\nThe change in total coin count is \\(-2+5=+3\\); for three quarters removed the change is \\(-3+12=+9\\), etc.  \nHence removing two or more quarters can never improve on the greedy solution.  \nTherefore the condition found in Step\u202f3 is both necessary and sufficient.\n\n---\n\n**Step 5 \u2013 Counting the successful \\(N\\) (1\u202f\u2264\u202fN\u202f\u2264\u202f1000)**  \n\nThe greedy fails for those \\(N\\ge25\\) whose remainder modulo \\(25\\) lies in  \n\n\\[\nR=\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\nFor a fixed residue \\(r\\in R\\),\n\n\\[\nN=r+25k\\qquad (k\\ge1,\\; N\\le1000).\n\\]\n\nThe largest possible \\(k\\) is \\(\\bigl\\lfloor\\frac{1000-r}{25}\\bigr\\rfloor =39\\)\n(because \\(1000-r\\) ranges from \\(981\\) to \\(995\\)).  \nThus each residue contributes \\(39\\) failing numbers.\n\n\\[\n\\#\\text{failures}=|R|\\times 39 = 10\\times39 = 390 .\n\\]\n\nAll other numbers (including the ten numbers \\(5,6,7,8,9,15,16,17,18,19\\) themselves, which are \\(<25\\) and therefore not failures) are successes.\n\n\\[\n\\#\\text{successes}=1000-390 = 610 .\n\\]\n\n---\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\na_1a_2\\dots a_{16},\\qquad a_i\\in\\{0,1\\}\n\\]\n\nbe a binary string where \\(a_i=1\\) means the \\(i^{\\text{th}}\\) chair is occupied.\nThe condition *no person sits next to two other people* means that a\n\\(1\\) may not have a \\(1\\) on both sides; equivalently the string contains\nno three consecutive \\(1\\)\u2019s.  \nHence we must count the binary strings of length \\(16\\) that\n\n* have exactly eight \\(1\\)\u2019s,\n* contain no substring \\(111\\).\n\n---\n\n### 1.  Decompose the occupied chairs into blocks\n\nSince a block of consecutive \\(1\\)\u2019s can have length at most \\(2\\), the eight\n\\(1\\)\u2019s are split into blocks of length \\(1\\) or \\(2\\).\n\nLet  \n\n* \\(x\\) = number of blocks of length \\(1\\),\n* \\(y\\) = number of blocks of length \\(2\\),\n* \\(m=x+y\\) = total number of blocks.\n\nThen  \n\n\\[\nx+2y=8,\\qquad x+y=m\\Longrightarrow y=8-m,\\;x=2m-8 .\n\\]\n\nThus \\(m\\) can be any integer with \\(\\lceil 8/2\\rceil\\le m\\le 8\\); i.e.  \n\n\\[\nm=4,5,6,7,8 .\n\\]\n\nFor a given \\(m\\) the positions of the \\(y=8-m\\) blocks of length \\(2\\)\namong the \\(m\\) blocks can be chosen in  \n\n\\[\n\\binom{m}{\\,8-m\\,}\n\\]\n\nways.\n\n---\n\n### 2.  Insert the separating zeros\n\nBetween two consecutive blocks there must be at least one \\(0\\).\nWith \\(m\\) blocks there are \\(m-1\\) mandatory zeros.\nThere are \\(16-8=8\\) zeros altogether, so after placing the mandatory ones we\nstill have  \n\n\\[\n8-(m-1)=9-m\n\\]\n\nzeros left.  \n\nThese remaining zeros may be distributed freely among the \\(m+1\\) gaps\n(the two ends and the \\(m-1\\) interior gaps).  By stars\u2011and\u2011bars the number\nof ways is\n\n\\[\n\\binom{(9-m)+(m+1)-1}{(m+1)-1}\n   =\\binom{9}{m}.\n\\]\n\n---\n\n### 3.  Count all possibilities\n\nFor each admissible \\(m\\),\n\n\\[\n\\text{choices}(m)=\\binom{m}{8-m}\\binom{9}{m}.\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\nN&=\\sum_{m=4}^{8}\\binom{m}{8-m}\\binom{9}{m}\\\\[2mm]\n &=\\binom{4}{4}\\binom{9}{4}\n   +\\binom{5}{3}\\binom{9}{5}\n   +\\binom{6}{2}\\binom{9}{6}\n   +\\binom{7}{1}\\binom{9}{7}\n   +\\binom{8}{0}\\binom{9}{8}\\\\[2mm]\n &=1\\cdot126+10\\cdot126+15\\cdot84+7\\cdot36+1\\cdot9\\\\\n &=126+1260+1260+252+9\\\\\n &=2907 .\n\\end{aligned}\n\\]\n\n---\n\n### 4.  Remainder modulo \\(1000\\)\n\n\\[\n2907\\equiv 907\\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\angle A=84^{\\circ},\\qquad \\angle B=60^{\\circ},\\qquad \\angle C=36^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 1.  The nine\u2011point circle in complex form  \n\nPut the circumcircle of \\(\\triangle ABC\\) as the unit circle and let  \n\n\\[\na=1,\\qquad b=e^{i\\beta},\\qquad c=e^{i\\gamma},\n\\]\n\nwhere  \n\n\\[\n\\beta =72^{\\circ},\\qquad \\gamma =240^{\\circ}\n\\]\n\nbecause the central arcs are twice the opposite angles:\n\\(\\widehat{BC}=2A=168^{\\circ},\\;\\widehat{CA}=2B=120^{\\circ},\n\\;\\widehat{AB}=2C=72^{\\circ}\\).\n\nThe nine\u2011point centre is\n\n\\[\nN=\\frac{a+b+c}{2},\n\\]\n\nand its radius is \\(\\frac12\\) (since \\(|a|=|b|=|c|=1\\)).  \nThe three midpoints are  \n\n\\[\nD=\\frac{b+c}{2},\\qquad \nE=\\frac{c+a}{2},\\qquad \nF=\\frac{a+b}{2}.\n\\]\n\nNotice that\n\n\\[\nD-N=-\\frac{a}{2},\\qquad \nE-N=-\\frac{b}{2},\\qquad \nF-N=-\\frac{c}{2} .\n\\tag{1}\n\\]\n\nHence the central angle \\(\\widehat{DE}\\) equals the angle between vectors\n\\(-a\\) and \\(-b\\); it is the same as the angle between \\(a\\) and \\(b\\).\n\n\\[\n\\widehat{DE}= \\angle aOb = 2\\angle ACB = 2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2.  The other intersection points  \n\nThe nine\u2011point circle is the image of the circumcircle under the similarity\n\n\\[\nX\\longmapsto N-\\frac{X}{2},\n\\tag{3}\n\\]\n\ni.e. the homothety with centre the centroid (factor \\(-\\tfrac12\\)).\nConsequently, if a point \\(Y\\) of the nine\u2011point circle is the image of\n\\(X\\) on the circumcircle, then  \n\n\\[\nY = N-\\frac{X}{2}\\qquad\\Longleftrightarrow\\qquad X=2(N-Y).\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n#### (a) Point \\(G\\)\n\n\\(G\\) lies on line \\(BD\\).  Since \\(D\\) is the image of \\(A\\) and\n\\(B\\) is the image of the point \\(X\\) with \\(X=b\\), the line \\(BD\\) is the\nimage of the line through \\(A\\) parallel to chord \\(BC\\).\nThus \\(G\\) corresponds to the second intersection of the line through\n\\(A\\;(=a)\\) parallel to \\(BC\\) with the circumcircle.\n\nFor a line through a point \\(e^{i\\alpha}\\) parallel to chord\n\\(e^{i\\beta}e^{i\\gamma}\\) the second intersection is\n\\(e^{i(\\beta+\\gamma-\\alpha)}\\).  \nHere \\(\\alpha=0,\\;\\beta=72^{\\circ},\\;\\gamma=240^{\\circ}\\); therefore\n\n\\[\nX_G = e^{i(\\beta+\\gamma)}=e^{i312^{\\circ}} .\n\\]\n\nFrom (3) the point on the nine\u2011point circle is  \n\n\\[\nG = N-\\frac{X_G}{2}.\n\\]\n\nHence the vector \\(NG=-\\frac{X_G}{2}\\) has direction \\(312^{\\circ}+180^{\\circ}=132^{\\circ}\\).\n\n--------------------------------------------------------------------\n#### (b) Point \\(H\\)\n\n\\(H\\) lies on line \\(AE\\).  This line is parallel to chord \\(CA\\); the\nstarting point on the circumcircle is \\(B\\,(=e^{i72^{\\circ}})\\).  Thus\n\n\\[\nX_H = e^{i(0+240^{\\circ}-72^{\\circ})}=e^{i168^{\\circ}} ,\n\\qquad\nH=N-\\frac{X_H}{2},\n\\]\n\nso the direction of \\(NH\\) is \\(168^{\\circ}+180^{\\circ}=348^{\\circ}\\).\n\n--------------------------------------------------------------------\n#### (c) Point \\(J\\)\n\n\\(J\\) lies on line \\(AF\\), which is parallel to chord \\(AB\\); it starts\nfrom \\(C\\,(=e^{i240^{\\circ}})\\).  Therefore\n\n\\[\nX_J = e^{i(0+72^{\\circ}-240^{\\circ})}=e^{i192^{\\circ}},\n\\qquad\nJ=N-\\frac{X_J}{2},\n\\]\n\nand the direction of \\(NJ\\) is \\(192^{\\circ}+180^{\\circ}=12^{\\circ}\\).\n\n--------------------------------------------------------------------\n### 3.  The required arcs on the nine\u2011point circle  \n\nFrom the directions obtained:\n\n\\[\n\\begin{aligned}\n&\\text{Arc }DE = 252^{\\circ}-180^{\\circ}=72^{\\circ},\\\\[2mm]\n&\\text{Arc }FG = 132^{\\circ}-60^{\\circ}=72^{\\circ},\\\\[2mm]\n&\\text{Arc }HJ = (360^{\\circ}-348^{\\circ})+12^{\\circ}=24^{\\circ}.\n\\end{aligned}\n\\]\n\nAll are the minor arcs (each \\(<180^{\\circ}\\)).\n\n--------------------------------------------------------------------\n### 4.  Computing the requested expression  \n\n\\[\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n=72^{\\circ}+2\\!\\cdot\\!24^{\\circ}+3\\!\\cdot\\!72^{\\circ}\n=72+48+216=336^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a regular 24\u2011gon label the vertices \\(0,1,\\ldots ,23\\) in order.\nIf a segment joins vertex \\(i\\) to vertex \\(j\\) then the chord length depends only on  \n\n\\[\nk=\\min \\{\\,|i-j|\\;,\\;24-|i-j|\\,\\},\n\\qquad 1\\le k\\le 12 .\n\\]\n\nThus a configuration in which all 12 segments have the same length corresponds to a\nperfect matching in the graph whose edges are all chords of a fixed step \\(k\\).\n\n---\n\n### 1.  Structure of the step\u2011\\(k\\) graph  \n\nLet \\(d=\\gcd(24,k)\\).  \nThe vertices split into \\(d\\) disjoint cycles, each of length  \n\n\\[\nL=\\frac{24}{d}.\n\\]\n\nEvery vertex is incident with exactly the two edges of its cycle.  \nA perfect matching can exist only if each cycle has even length, i.e. \\(L\\) must be even.\n\\(L\\) is odd only when \\(d=8\\) (then \\(L=3\\)); this occurs for \\(k=8\\).  \nHence the step \\(k=8\\) gives **no** valid configuration.\n\nFor an even cycle of length \\(L\\ge4\\) there are exactly two perfect matchings\n(the two possible \u201calternating\u201d choices).  \nIf \\(L=2\\) (the case \\(k=12\\)), the matching is forced and there is only one.\n\nConsequently, for a permissible \\(k\\)\n\n\\[\n\\#\\text{ matchings for step }k=\n\\begin{cases}\n2^{d}, & L>2,\\\\[2pt]\n1, & L=2 .\n\\end{cases}\n\\]\n\n---\n\n### 2.  Count for each step \\(k\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nk & d=\\gcd(24,k) & L=24/d & \\#\\text{ matchings}\\\\ \\hline\n1,5,7,11 & 1 & 24 & 2\\\\\n2,10 & 2 & 12 & 2^{2}=4\\\\\n3,9 & 3 & 8 & 2^{3}=8\\\\\n4 & 4 & 6 & 2^{4}=16\\\\\n6 & 6 & 4 & 2^{6}=64\\\\\n12 & 12& 2 & 1\\\\\n8 & 8 & 3 & \\text{none}\n\\end{array}\n\\]\n\nNow sum over all admissible \\(k\\) ( \\(k=1,\\dots ,12\\) except \\(k=8\\) ):\n\n\\[\n\\begin{aligned}\n\\text{Total}&=4\\cdot2\\;+\\;2\\cdot4\\;+\\;2\\cdot8\\;+\\;1\\cdot16\\;+\\;1\\cdot64\\;+\\;1\\cdot1\\\\\n&=8+8+16+16+64+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{113}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n17_{b}=1\\cdot b+7=b+7,\\qquad \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need  \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nWrite \\(9b+7\\) in terms of \\(b+7\\):\n\n\\[\n9b+7 = 9(b+7) - 56 .\n\\]\n\nHence the remainder upon division by \\(b+7\\) is \\(-56\\).  \nThus \\(b+7\\) must divide \\(56\\):\n\n\\[\nb+7 \\mid 56 .\n\\]\n\nList the positive divisors of \\(56\\):\n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nSince the base must satisfy \\(b>9\\) (so that the digit 9 is allowed), we need  \n\n\\[\nb+7>9+7=16 .\n\\]\n\nThe only divisors of \\(56\\) larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7 &= 28 \\;\\Longrightarrow\\; b=21,\\\\[2pt]\nb+7 &= 56 \\;\\Longrightarrow\\; b=49.\n\\end{aligned}\n\\]\n\nBoth bases exceed \\(9\\) and thus are admissible.\n\nThe sum of all such bases is\n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\na_i=A_1A_i\\qquad (i=2,\\dots ,11),\\qquad s_i=A_iA_{i+1}\\qquad (i=2,\\dots ,10).\n\\]\n\nFor each triangle \\(A_iA_1A_{i+1}\\;(2\\le i\\le10)\\)\n\n* \\(\\displaystyle \\text{Area}=1\\),\n* \\(\\displaystyle\\cos\\angle A_iA_1A_{i+1}= \\frac{12}{13}\\).\n\n--------------------------------------------------------------------\n### 1.  Product of the two sides from \\(A_1\\)\n\nWith \\(\\theta=\\angle A_iA_1A_{i+1}\\) we have  \n\n\\[\n\\sin\\theta=\\sqrt{1-\\cos ^2\\theta}= \\frac{5}{13}.\n\\]\n\nThe area of \\(\\triangle A_iA_1A_{i+1}\\) is  \n\n\\[\n\\frac12 a_i a_{i+1}\\sin\\theta =1\n\\Longrightarrow a_i a_{i+1}= \\frac{2}{\\sin\\theta}= \\frac{2}{5/13}= \\frac{26}{5}\\equiv c .\n\\tag{1}\n\\]\n\nHence for all \\(i\\)\n\n\\[\na_i a_{i+1}=c=\\frac{26}{5}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Length of the side \\(A_iA_{i+1}\\)\n\nApply the law of cosines in \\(\\triangle A_iA_1A_{i+1}\\):\n\n\\[\ns_i^2=a_i^{\\,2}+a_{i+1}^{\\,2}-2a_i a_{i+1}\\cos\\theta\n      =a_i^{\\,2}+a_{i+1}^{\\,2}-2c\\Bigl(\\frac{12}{13}\\Bigr).\n\\]\n\nBecause \\(2c\\frac{12}{13}= \\frac{624}{65}= \\frac{48}{5}\\),\n\n\\[\ns_i^{\\,2}=a_i^{\\,2}+a_{i+1}^{\\,2}-\\frac{48}{5}. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3.  The alternating pattern of the radii\n\nFrom (1) we have \\(a_{i+1}=c/a_i\\). Consequently  \n\n\\[\na_{i+2}=c/a_{i+1}=c/(c/a_i)=a_i .\n\\]\n\nThus  \n\n\\[\na_{2}=a_{4}=a_{6}=a_{8}=a_{10}\\equiv x, \\qquad \na_{3}=a_{5}=a_{7}=a_{9}=a_{11}\\equiv \\frac{c}{x}.\n\\]\n\nAll sides \\(s_i\\;(i=2,\\dots ,10)\\) are equal, because each uses the\npair \\((x,\\;c/x)\\) in (2).  Set  \n\n\\[\nS^2=x^{2}+\\Bigl(\\frac{c}{x}\\Bigr)^2-\\frac{48}{5}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Express everything via \\(t=x+\\dfrac{c}{x}\\)\n\nDefine  \n\n\\[\nt=x+\\frac{c}{x}=a_2+a_{11}.\n\\]\n\nThen  \n\n\\[\nx^{2}+\\Bigl(\\frac{c}{x}\\Bigr)^2=t^{2}-2c .\n\\]\n\nInsert this into (3):\n\n\\[\nS^{2}=t^{2}-2c-\\frac{48}{5}=t^{2}-(2c+\\frac{48}{5}).\n\\]\n\nSince \\(c=\\dfrac{26}{5}\\),\n\n\\[\n2c+\\frac{48}{5}= \\frac{52}{5}+\\frac{48}{5}=20.\n\\]\n\nHence  \n\n\\[\nS^{2}=t^{2}-20,\\qquad S=\\sqrt{t^{2}-20}. \\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Use the perimeter\n\nThe perimeter of the 11\u2011gon is  \n\n\\[\na_2+a_{11}+ \\sum_{i=2}^{10}s_i = t+9S =20.\n\\]\n\nSubstituting (4):\n\n\\[\nt+9\\sqrt{t^{2}-20}=20.\n\\]\n\nIsolate the radical and square:\n\n\\[\n9\\sqrt{t^{2}-20}=20-t \\quad\\Longrightarrow\\quad \n81(t^{2}-20)=(20-t)^{2}.\n\\]\n\nSimplifying:\n\n\\[\n80t^{2}+40t-2020=0\n\\Longrightarrow 4t^{2}+2t-101=0.\n\\]\n\nSolve for \\(t\\):\n\n\\[\nt=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n   =\\frac{-2\\pm 18\\sqrt5}{8}\n   =\\frac{-1\\pm 9\\sqrt5}{4}.\n\\]\n\nSince \\(t>0\\), we take the plus sign:\n\n\\[\n\\boxed{t=\\frac{9\\sqrt5-1}{4}}.\n\\]\n\nThus  \n\n\\[\nA_1A_2+A_1A_{11}= \\frac{9\\sqrt5-1}{4}\n            =\\frac{m\\sqrt n-p}{q},\n\\]\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\n--------------------------------------------------------------------\n### 6.  Compute \\(m+n+p+q\\)\n\n\\[\nm+n+p+q = 9+5+1+4 = 19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The nine players are distinct.  Let  \n\n\\[\nc=\\#\\text{chocolate},\\qquad v=\\#\\text{vanilla},\\qquad s=\\#\\text{strawberry}\n\\]\n\nwith  \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### 1.  Find all possible triples \\((c,v,s)\\)\n\nSince \\(c>v>s\\),\n\n\\[\nc\\ge v+1,\\qquad v\\ge s+1.\n\\]\n\nWrite \\(v=s+d_2\\) and \\(c=v+d_1\\) where \\(d_1,d_2\\ge 1\\).  \nThen  \n\n\\[\nc+v+s=(s+d_2+d_1)+(s+d_2)+s=3s+2d_2+d_1=9 .\n\\]\n\nBecause \\(s\\ge1\\), we have \\(3s\\le 9\\Rightarrow s=1,2,3\\).\n\n* **\\(s=1\\):** \\(2d_2+d_1=6\\).  \n  \\(d_2=1\\Rightarrow d_1=4\\) \u2192 \\((c,v,s)=(6,2,1)\\).  \n  \\(d_2=2\\Rightarrow d_1=2\\) \u2192 \\((c,v,s)=(5,3,1)\\).\n\n* **\\(s=2\\):** \\(2d_2+d_1=3\\).  \n  \\(d_2=1\\Rightarrow d_1=1\\) \u2192 \\((c,v,s)=(4,3,2)\\).\n\n* **\\(s=3\\):** \\(2d_2+d_1=0\\) \u2013 impossible with \\(d_1,d_2\\ge1\\).\n\nThus the only feasible triples are  \n\n\\[\n(6,2,1),\\;(5,3,1),\\;(4,3,2).\n\\]\n\n---\n\n### 2.  Count assignments for each triple\n\nFor a given \\((c,v,s)\\) the number of ways to assign the flavors to the 9 distinct players is the multinomial coefficient  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3.  Total number of assignments\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\n---\n\n### 4.  Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equation  \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nis a homogeneous quadratic form.  \nFactor it over the integers:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y).\n\\]\n\nIndeed  \n\n\\[\n(3x+2y)(4x-3y)=12x^{2}-9xy+8xy-6y^{2}=12x^{2}-xy-6y^{2}.\n\\]\n\nHence a pair \\((x,y)\\) of integers satisfies the equation iff\n\n\\[\n3x+2y=0\\qquad\\text{or}\\qquad 4x-3y=0 .\n\\]\n\n---\n\n### 1. Solutions of \\(3x+2y=0\\)\n\n\\[\n3x+2y=0 \\;\\Longrightarrow\\; y=-\\frac{3}{2}x .\n\\]\n\nFor \\(y\\) to be an integer, \\(x\\) must be even: write \\(x=2k\\). Then  \n\n\\[\n(x,y)=(2k,-3k),\\qquad k\\in\\mathbb Z .\n\\]\n\nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 2k\\le 100\\;\\Longrightarrow\\;-50\\le k\\le 50,\\\\\n-100\\le -3k\\le 100\\;\\Longrightarrow\\;-33\\le k\\le 33.\n\\]\n\nThus \\(k=-33,-32,\\dots ,33\\); there are  \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger solutions on this line.\n\n---\n\n### 2. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x-3y=0 \\;\\Longrightarrow\\; y=\\frac{4}{3}x .\n\\]\n\nFor \\(y\\) to be an integer, \\(x\\) must be a multiple of \\(3\\): put \\(x=3t\\). Then  \n\n\\[\n(x,y)=(3t,4t),\\qquad t\\in\\mathbb Z .\n\\]\n\nAgain impose the bounds:\n\n\\[\n-100\\le 3t\\le 100\\;\\Longrightarrow\\;-33\\le t\\le 33,\\\\\n-100\\le 4t\\le 100\\;\\Longrightarrow\\;-25\\le t\\le 25.\n\\]\n\nThus \\(t=-25,-24,\\dots ,25\\); the number of solutions here is  \n\n\\[\n25-(-25)+1 = 51.\n\\]\n\n---\n\n### 3. Intersection of the two lines\n\nBoth equations hold simultaneously only at the origin:\n\n\\[\n3x+2y=0,\\;4x-3y=0 \\Longrightarrow (x,y)=(0,0).\n\\]\n\nThis point has been counted in both previous totals, so we subtract it once.\n\n---\n\n### 4. Total number of ordered pairs\n\n\\[\n\\#\\text{solutions}=67+51-1=117.\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid be \\(ABCD\\) with \\(AB\\parallel CD\\) and  \n\n\\[\nAB=s ,\\qquad CD=r ,\\qquad AD=BC=L \\;( \\text{isosceles}).\n\\]\n\nThe incircle has radius \\(R=3\\) and the area is \\(72\\).\n\n---\n\n### 1.  Semiperimeter\n\nFor any tangential quadrilateral (one with an incircle)\n\n\\[\n\\text{Area}=R\\cdot(\\text{semiperimeter}).\n\\]\n\nHence  \n\n\\[\n72=3\\cdot s_{\\!p}\\quad\\Longrightarrow\\quad s_{\\!p}=24 .\n\\]\n\nThus the perimeter is  \n\n\\[\n2s_{\\!p}=48\\quad\\Longrightarrow\\quad r+s+2L=48. \\tag{1}\n\\]\n\n---\n\n### 2.  Tangential condition\n\nIn a tangential quadrilateral the sums of opposite sides are equal:\n\n\\[\nAB+CD = AD+BC\\quad\\Longrightarrow\\quad r+s = 2L. \\tag{2}\n\\]\n\nFrom (1) and (2),\n\n\\[\n2(r+s)=48 \\;\\Longrightarrow\\; r+s=24,\\qquad\n2L=r+s=24\\;\\Longrightarrow\\; L=12.\n\\]\n\n---\n\n### 3.  Height\n\nThe incircle touches both parallel sides, so the distance between the bases equals twice the radius:\n\n\\[\nh=2R=6.\n\\]\n\n(Alternatively, \\(\\displaystyle 72=\\tfrac12(r+s)h\\) with \\(r+s=24\\) also gives \\(h=6\\).)\n\n---\n\n### 4.  Relating the bases\n\nPlace the trapezoid with its symmetry axis on the \\(y\\)-axis; the bases are horizontal.\nThe horizontal half\u2011difference of the bases is \\(\\dfrac{s-r}{2}\\).\nHence the leg length satisfies\n\n\\[\nL^{2}= \\left(\\frac{s-r}{2}\\right)^{2}+h^{2}.\n\\]\n\nUsing \\(L=12,\\;h=6\\),\n\n\\[\n12^{2}= \\frac{(s-r)^{2}}{4}+6^{2}\n\\quad\\Longrightarrow\\quad\n\\frac{(s-r)^{2}}{4}=108\n\\quad\\Longrightarrow\\quad\ns-r=12\\sqrt3. \\tag{3}\n\\]\n\n---\n\n### 5.  Solving for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\ns-r=12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\ns&=\\frac{24+12\\sqrt3}{2}=12+6\\sqrt3,\\\\\nr&=\\frac{24-12\\sqrt3}{2}=12-6\\sqrt3.\n\\end{aligned}\n\\]\n\n---\n\n### 6.  Required sum of squares\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}\n&=(12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2}\\\\\n&= \\bigl(144-144\\sqrt3+108\\bigr)+\\bigl(144+144\\sqrt3+108\\bigr)\\\\\n&= 504.\n\\end{aligned}\n\\]\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(A=(0,0)\\),  \n* \\(B=(u,0)\\) on the \\(x\\)-axis,  \n* \\(C=(0,v)\\) on the \\(y\\)-axis.  \n\nSince \\(\\angle A=90^{\\circ}\\), \\(BC=38\\) gives  \n\n\\[\nu^{2}+v^{2}=38^{2}=1444\\tag{1}\n\\]\n\n---\n\n### 1.  The equilateral triangle \\(AKL\\)\n\nThe conditions  \n\n\\[\nAK=AL=KL=14\n\\]\n\nshow that \\(\\triangle AKL\\) is equilateral.  \nLet the direction of \\(\\overrightarrow{AK}\\) form an angle \\(\\theta\\) with the\npositive \\(x\\)-axis. Then\n\n\\[\nK=(14\\cos\\theta,\\;14\\sin\\theta),\\qquad \nL=(14\\cos(\\theta+60^\\circ),\\;14\\sin(\\theta+60^\\circ)).\\tag{2}\n\\]\n\n---\n\n### 2.  Using \\(BK=14\\) and \\(CL=14\\)\n\n\\[\nBK^{2}= (u-14\\cos\\theta)^2+(14\\sin\\theta)^2=14^{2}\n\\]\n\n\\[\n\\Longrightarrow\\; u=28\\cos\\theta.\\tag{3}\n\\]\n\nSimilarly  \n\n\\[\nCL^{2}= (14\\cos(\\theta+60^\\circ))^{2}+(v-14\\sin(\\theta+60^\\circ))^{2}=14^{2}\n\\]\n\n\\[\n\\Longrightarrow\\; v=28\\sin(\\theta+60^\\circ).\\tag{4}\n\\]\n\n---\n\n### 3.  Determining \\(\\theta\\)\n\nInsert (3) and (4) into (1):\n\n\\[\n(28\\cos\\theta)^{2}+(28\\sin(\\theta+60^\\circ))^{2}=1444\n\\]\n\\[\n\\Longrightarrow\\;\\cos^{2}\\theta+\\sin^{2}(\\theta+60^\\circ)=\\frac{361}{196}.\n\\]\n\nUsing \\(\\sin(\\theta+60^\\circ)=\\tfrac12\\sin\\theta+\\tfrac{\\sqrt3}{2}\\cos\\theta\\),\nthe equation reduces to  \n\n\\[\n6\\cos^{2}\\theta+2\\sqrt3\\sin\\theta\\cos\\theta= \\frac{312}{49}.\n\\]\n\nSolving gives \\(\\cos\\theta=\\frac{13}{14}\\) (the other root gives the same\ntriangle with the legs interchanged).  \n\nHence  \n\n\\[\nu=28\\cos\\theta=28\\cdot\\frac{13}{14}=26,\\qquad\nv=28\\sin(\\theta+60^\\circ)=28\\cdot\\frac{4\\sqrt3}{7}=16\\sqrt3 .\n\\]\n\nThus  \n\n\\[\nAB=26,\\qquad AC=16\\sqrt3,\\qquad BC=38.\n\\]\n\nFrom (2) we obtain the coordinates of the interior points\n\n\\[\nK=(13,\\;3\\sqrt3),\\qquad L=(2,\\;8\\sqrt3).\n\\]\n\n---\n\n### 4.  Area of \\(BKLC\\)\n\nUse the shoelace formula for the polygon \\(B(26,0),K(13,3\\sqrt3),L(2,8\\sqrt3),C(0,16\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\nS_1&=26\\cdot3\\sqrt3+13\\cdot8\\sqrt3+2\\cdot16\\sqrt3+0\\cdot0=214\\sqrt3,\\\\\nS_2&=0\\cdot13+3\\sqrt3\\cdot2+8\\sqrt3\\cdot0+16\\sqrt3\\cdot26=422\\sqrt3.\n\\end{aligned}\n\\]\n\n\\[\n\\text{Area}=\\frac12|S_2-S_1|\n          =\\frac12(422-214)\\sqrt3\n          =104\\sqrt3 .\n\\]\n\nTherefore the area can be written as \\(n\\sqrt3\\) with  \n\n\\[\n\\boxed{n=104}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: None

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For an eight\u2011digit number formed by a permutation of  \n\n\\[\n\\{1,2,3,4,5,6,7,8\\}\n\\]\n\nlet  \n\n\\[\na_1a_2a_3a_4a_5a_6a_7a_8\n\\]\n\nbe its digits (left to right).  \nA number is divisible by \\(22\\iff\\) it is divisible by \\(2\\) and by \\(11\\).\n\n---\n\n### 1.  Divisibility by 2  \n\nThe last digit \\(a_8\\) must be even, so \\(a_8\\in\\{2,4,6,8\\}\\).\n\n---\n\n### 2.  Divisibility by 11  \n\nFor an 8\u2011digit number the rule for 11 is  \n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv 0\\pmod{11}.\n\\]\n\nSince the total sum of the digits is  \n\n\\[\n1+2+\\cdots+8 = 36,\n\\]\n\nlet  \n\n\\[\nS_{\\text{odd}}=a_1+a_3+a_5+a_7,\\qquad \nS_{\\text{even}}=a_2+a_4+a_6+a_8 .\n\\]\n\nThen \\(S_{\\text{odd}}+S_{\\text{even}}=36\\) and the condition gives  \n\n\\[\nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nThe only possible values for \\(S_{\\text{odd}}-S_{\\text{even}}\\) are \\(-22,0,22\\);   \n\\(-22\\) would give \\(S_{\\text{odd}}=7\\) and \\(22\\) would give \\(S_{\\text{odd}}=29\\), both impossible because a sum of four distinct digits from \\(\\{1,\\dots ,8\\}\\) cannot be smaller than \\(10\\) nor larger than \\(26\\).  \nHence\n\n\\[\nS_{\\text{odd}} = S_{\\text{even}} = 18 .\n\\]\n\nThus the four digits in the odd positions must sum to \\(18\\); the same holds for the even positions.\n\n---\n\n### 3.  Choosing the four digits for the odd positions  \n\nWe need 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).  \nA quick enumeration gives the eight subsets\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\{1,3,6,8\\},\\{1,4,5,8\\},\\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\{2,3,6,7\\},\\{2,4,5,7\\},\\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nEach contains exactly two even digits (the set \\(\\{2,4,6,8\\}\\)) and two odd digits.  \nHence every admissible odd\u2011position set has **2 even digits**.\n\nLet a chosen subset be \\(S\\) (the odd\u2011position digits) and its complement \\(S^c\\) (the even\u2011position digits).\n\n---\n\n### 4.  Arranging the digits  \n\n* The four digits of \\(S\\) can be placed in the odd positions \\((1,3,5,7)\\) in \\(4! = 24\\) ways.  \n* The four digits of \\(S^c\\) must fill the even positions \\((2,4,6,8)\\) with the extra requirement that the last digit \\(a_8\\) be even.  \n  Since \\(S^c\\) contains exactly \\(2\\) even digits, we have  \n\n\\[\n\\text{choices for }a_8 = 2,\\qquad\n\\text{arrangements of the remaining three even\u2011position digits}=3! = 6 .\n\\]\n\nThus for each set \\(S\\)\n\n\\[\n\\#\\text{numbers}=4!\\times(2\\times3!) = 24\\times12 = 288.\n\\]\n\n---\n\n### 5.  Total number \\(N\\)\n\nThere are \\(8\\) possible subsets \\(S\\); consequently\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 6.  Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nC=25+20i,\\qquad r=5 ,\n\\]\n\nso  \n\n\\[\n|C-z|=5\n\\]\n\nis the circle with centre \\(C\\) and radius \\(5\\).\n\nThe second condition  \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that \\(z\\) is equally distant from the points  \n\n\\[\nP_1=4+k\\quad(\\text{on the real axis}), \\qquad   \nP_2=k+3i .\n\\]\n\nHence the locus of \\(z\\) is the perpendicular bisector of the segment \\(\\overline{P_1P_2}\\); this is a straight line.\n\n---\n\n### 1. Equation of the line\n\nWrite \\(z=x+yi\\).  \n\n\\[\n(x-(4+k))^2+y^2=(x-k)^2+(y-3)^2 .\n\\]\n\nExpanding and simplifying gives  \n\n\\[\n-8(x-k)+16=-6y+9,\n\\]\n\n\\[\n-8x+8k+6y+7=0 .\n\\]\n\nThus the line \\(L(k)\\) is  \n\n\\[\n-8x+6y+8k+7=0 \\qquad\\text{or}\\qquad 8x-6y=8k+7 .\n\\]\n\nAll such lines have slope \\(\\dfrac{4}{3}\\); they are a family of parallel lines depending on \\(k\\).\n\n---\n\n### 2. Tangency condition\n\nThe system has exactly one solution precisely when the line \\(L(k)\\) is tangent to the circle \\(|z-C|=5\\).  \n\nFor a line \\(Ax+By+C=0\\) the distance from a point \\((x_0,y_0)\\) is  \n\n\\[\nd=\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nHere \\(A=-8,\\;B=6,\\;C=8k+7\\) and the centre of the circle is \\((25,20)\\). Hence\n\n\\[\nd(k)=\\frac{\\bigl|-8\\cdot25+6\\cdot20+(8k+7)\\bigr|}{\\sqrt{(-8)^2+6^2}}\n      =\\frac{|8k-73|}{10}.\n\\]\n\nTangency requires \\(d(k)=r=5\\):\n\n\\[\n\\frac{|8k-73|}{10}=5\\quad\\Longrightarrow\\quad|8k-73|=50 .\n\\]\n\nThus  \n\n\\[\n8k-73=50\\quad\\text{or}\\quad8k-73=-50,\n\\]\n\n\\[\nk=\\frac{123}{8},\\qquad k=\\frac{23}{8}.\n\\]\n\nBoth values make the line tangent, giving exactly one intersection point with the circle.\n\n---\n\n### 3. Sum of the possible \\(k\\)\n\n\\[\n\\frac{123}{8}+\\frac{23}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\dfrac{73}{4}\\) as \\(\\dfrac{m}{n}\\) with \\(\\gcd(m,n)=1\\); then \\(m=73,\\;n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the letters be  \n\n\\[\nA<B<C<D<E<F<G<H<I<J<K<L .\n\\]\n\nIn a random pairing each pair is written with its smaller letter first, so a\npair \\(\\{x,y\\}\\;(x<y)\\) becomes the word \\(xy\\).\nThe six words are then listed alphabetically; the last word is the\nlexicographically largest of the six two\u2011letter words.\n\nBecause the first letters of the six words are all different (each letter can\nappear as the smaller element of at most one pair), the largest word is the\npair whose **smaller** element is the largest among the six smaller elements.\nHence the last word contains \\(G\\) precisely when the pair containing \\(G\\)\nhas the largest smaller element.\n\n---\n\n### 1.  Choose the partner of \\(G\\)\n\n\\(G\\) can be paired with any of the other 11 letters, each with probability\n\\(\\frac1{11}\\).\n\n*If \\(G\\) is paired with a letter larger than \\(G\\)*  \n(let the partner be \\(X\\in\\{H,I,J,K,L\\}\\)).  \nThen the smaller element of the \\(G\\!-\\!X\\) pair is \\(G\\).\n\nThe remaining 10 letters consist of  \n\n- 6 letters \\(\\{A,B,C,D,E,F\\}\\) smaller than \\(G\\) (call them \u201clow\u201d),  \n- 4 letters among \\(\\{H,I,J,K,L\\}\\setminus\\{X\\}\\) larger than \\(G\\) (call them \u201chigh\u201d).\n\nFor the pair \\(G\\!-\\!X\\) to have the largest smaller element, no other pair\nmay have a smaller element \\(\\ge G\\); i.e. no \u201chigh\u201d letter may be the smaller\nletter of its pair.  Hence each high letter must be matched with a low\nletter.  \n\nNumber of matchings of the 10 remaining letters with no high\u2013high pair:\n\n\\[\n\\binom{6}{4}\\,4!\\;(=15\\cdot24)=360 .\n\\]\n\nTotal matchings of 10 letters: \\((10-1)!!=945\\).\nThus\n\n\\[\nP(\\text{lexicographically largest pair }|\\,G\\!-\\!X,\\;X>G)=\\frac{360}{945}\n=\\frac{8}{21}.\n\\]\n\nSince there are 5 possible partners larger than \\(G\\),\n\n\\[\n\\sum_{X>G}\\frac1{11}\\cdot\\frac{8}{21}=5\\cdot\\frac{1}{11}\\cdot\\frac{8}{21}\n=\\frac{40}{231}.\n\\]\n\n*If \\(G\\) is paired with a letter smaller than \\(G\\)*  \nthe only possible partner is \\(F\\); for any smaller partner there are fewer\nthan five letters below it, making it impossible for its pair to have the\nlargest smaller element.\n\nWhen \\(G\\) is paired with \\(F\\), the smaller element of the pair is \\(F\\).\nThe other 10 letters are  \n\n\\[\n\\{A,B,C,D,E\\}\\ (\\text{low})\\quad\\text{and}\\quad\\{H,I,J,K,L\\}\\ (\\text{high}).\n\\]\n\nAll five high letters must be paired with the five low letters; otherwise a\nhigh letter would become a smaller element.  The number of such matchings is\n\\(5!=120\\).  Hence\n\n\\[\nP(\\text{largest pair }|\\,G\\!-\\!F)=\\frac{120}{945}=\\frac{8}{63},\n\\]\nand the contribution is \\(\\displaystyle\\frac1{11}\\cdot\\frac{8}{63}\n= \\frac{8}{693}\\).\n\nNo other partner of \\(G\\) can work, so the total probability that the last\nword contains \\(G\\) is\n\n\\[\n\\frac{40}{231}+\\frac{8}{693}\n=\\frac{120}{693}+\\frac{8}{693}\n=\\frac{128}{693}.\n\\]\n\nThe fraction \\(\\frac{128}{693}\\) is already in lowest terms.  \nThus \\(m=128,\\ n=693\\) and\n\n\\[\nm+n = 128+693 = 821.\n\\]\n\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution**\n\n--------------------------------------------------------------------\n\n### 1.  The ratios on the two sides  \n\n\\[\nAB=AD+DE+EB=4+16+8=28,\\qquad \nAC=AF+FG+GC=13+52+26=91 .\n\\]\n\n\\[\n\\frac{AD}{AB}=\\frac{4}{28}=\\frac17,\\qquad \n\\frac{AF}{AC}= \\frac{13}{91}= \\frac17 .\n\\]\n\nHence  \n\n\\[\n\\frac{AD}{AB}= \\frac{AF}{AC}= \\frac17\\qquad\\Longrightarrow\\qquad \nDF\\parallel BC .\n\\]\n\nSimilarly  \n\n\\[\n\\frac{AE}{AB}= \\frac{20}{28}= \\frac57,\\qquad \n\\frac{AG}{AC}= \\frac{65}{91}= \\frac57 ,\n\\]\n\nso  \n\n\\[\n\\frac{AE}{AB}= \\frac{AG}{AC}= \\frac57\\qquad\\Longrightarrow\\qquad \nEG\\parallel BC .\n\\]\n\nLet  \n\n\\[\np=\\frac17,\\qquad q=\\frac57 .\n\\]\n\n--------------------------------------------------------------------\n\n### 2.  Area of \\(\\triangle ABC\\)\n\nBecause \\(DF\\parallel EG\\parallel BC\\), the quadrilateral \\(DEGF\\) is the\nregion of \\(\\triangle ABC\\) between the two lines through \\(D\\) and \\(E\\)\nparallel to \\(BC\\).  \n\nTriangles \\(ADF\\) and \\(AEG\\) are similar to \\(\\triangle ABC\\) with similarity\nratios \\(p\\) and \\(q\\) respectively, so\n\n\\[\n[ADF]=p^{2}[ABC],\\qquad[AEG]=q^{2}[ABC].\n\\]\n\nHence  \n\n\\[\n[DEGF]=[AEG]-[ADF]=(q^{2}-p^{2})[ABC]\n        =\\Bigl(\\frac{5^{2}}{7^{2}}-\\frac{1^{2}}{7^{2}}\\Bigr)[ABC]\n        =\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n[ABC]=288\\cdot\\frac{49}{24}=12\\cdot 49 =\\boxed{588}.\n\\]\n\n--------------------------------------------------------------------\n\n### 3.  Coordinates\n\nPlace  \n\n\\[\nA=(0,0),\\qquad B=(28,0),\\qquad C=(c,\\,42)\n\\]\n\n(the height is \\(42\\) because \\([ABC]=\\frac12\\cdot28\\cdot42=588\\)).  \nUsing the ratios \\(p,q\\),\n\n\\[\n\\begin{aligned}\nD &=pB=(4,0),                   &E&=qB=(20,0),\\\\[2mm]\nF &=pC=\\Bigl(\\frac{c}{7},6\\Bigr), &\nG &=qC=\\Bigl(\\frac{5c}{7},30\\Bigr).\n\\end{aligned}\n\\]\n\nReflections give  \n\n\\[\nM=2F-D=\\Bigl(\\frac{2c}{7}-4,\\;12\\Bigr),\\qquad \nN=2E-G=\\Bigl(40-\\frac{5c}{7},\\;-30\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n\n### 4.  Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in order:\n\n\\[\n\\begin{array}{c|c}\n\\text{Vertex}&(x,y)\\\\ \\hline\nA&(0,0)\\\\\nF&\\bigl(\\frac{c}{7},6\\bigr)\\\\\nN&\\bigl(40-\\frac{5c}{7},-30\\bigr)\\\\\nB&(28,0)\\\\\nC&(c,42)\\\\\nE&(20,0)\\\\\nM&\\bigl(\\frac{2c}{7}-4,12\\bigr)\n\\end{array}\n\\]\n\nApply the Shoelace formula.  The sum  \n\n\\[\n\\sum_{i=1}^{7}\\bigl(x_i y_{i+1}-y_i x_{i+1}\\bigr)\n\\]  \n\n(with \\(x_8=x_1,\\;y_8=y_1\\)) simplifies dramatically:\n\n\\[\n\\begin{aligned}\n&0\\\\\n&\\;-\\;240\\\\\n&\\;+\\;840\\\\\n&\\;+\\;1176\\\\\n&\\;-\\;840\\\\\n&\\;+\\;240\\\\\n&0\n\\end{aligned}\n\\qquad =\\;1176 .\n\\]\n\nThus\n\n\\[\n[AFNBCEM]=\\frac12\\cdot1176=588 .\n\\]\n\nThe result does **not** depend on the unknown coordinate \\(c\\); the\ncancellation occurs because the vectors \\(DF\\) and \\(EG\\) are parallel to\n\\(BC\\).\n\n--------------------------------------------------------------------\n\n### 5.  Answer\n\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nP:\\;y=x^{2}-4\n\\]\n\nand rotate \\(P\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin.  \nIf \\((x,y)\\) lies on the rotated curve, then there is a point \\((u,v)\\) on\n\\(P\\) such that  \n\n\\[\n\\begin{pmatrix}x\\\\y\\end{pmatrix}=R\\begin{pmatrix}u\\\\v\\end{pmatrix},\n\\qquad \nR=\\begin{pmatrix}\\tfrac12&-\\tfrac{\\sqrt3}{2}\\\\[2pt]\\tfrac{\\sqrt3}{2}&\\tfrac12\\end{pmatrix}.\n\\]\n\nEquivalently, a point \\((x,y)\\) is on both curves iff\n\n\\[\ny=x^{2}-4 \\qquad\\text{and}\\qquad \nR^{T}\\!\\begin{pmatrix}x\\\\y\\end{pmatrix}\n   =\\begin{pmatrix}x'\\\\y'\\end{pmatrix}\n\\text{ satisfies }y'=(x')^{2}-4,\n\\]\n\nwhere  \n\n\\[\nR^{T}= \\begin{pmatrix}\\tfrac12&\\tfrac{\\sqrt3}{2}\\\\[2pt]-\\tfrac{\\sqrt3}{2}&\\tfrac12\\end{pmatrix},\n\\quad \nx'=\\frac{x}{2}+\\frac{\\sqrt3\\,y}{2},\\qquad\ny'=-\\frac{\\sqrt3\\,x}{2}+\\frac{y}{2}.\n\\]\n\nUsing \\(y=x^{2}-4\\),\n\n\\[\nx'=\\frac{\\sqrt3 x^{2}+x-4\\sqrt3}{2},\\qquad \ny'=\\frac{x^{2}-\\sqrt3 x-4}{2}.\n\\]\n\nThe condition \\(y'=(x')^{2}-4\\) yields  \n\n\\[\n\\frac{x^{2}-\\sqrt3 x-4}{2}\n   =\\Bigl(\\frac{\\sqrt3 x^{2}+x-4\\sqrt3}{2}\\Bigr)^{2}-4 .\n\\]\n\nMultiplying by \\(2\\) and simplifying gives the quartic\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0.\n\\]\n\nFactor this over \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40\n&=(x^{2}+\\sqrt3\\,x-4)(3x^{2}-\\sqrt3\\,x-10).\n\\end{aligned}\n\\]\n\nHence the possible \\(x\\)-coordinates are the roots of the two quadratics.\n\n\\[\n\\begin{cases}\nx^{2}+\\sqrt3\\,x-4=0 &\\Longrightarrow\n\\displaystyle x=\\frac{-\\sqrt3\\pm\\sqrt{19}}2,\\\\[6pt]\n3x^{2}-\\sqrt3\\,x-10=0 &\\Longrightarrow\n\\displaystyle x=\\frac{\\sqrt3\\pm\\sqrt{123}}6 .\n\\end{cases}\n\\]\n\nWe need a point in the fourth quadrant, i.e. \\(x>0\\) and \\(y=x^{2}-4<0\\).\nOnly  \n\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2\\;(>0,\\;<2)\n\\]\n\nsatisfies this.  Its \\(y\\)-coordinate is\n\n\\[\n\\begin{aligned}\ny&=x^{2}-4\n   =\\frac{(-\\sqrt3+\\sqrt{19})^{2}}{4}-4\n   =\\frac{22-2\\sqrt{57}}4-4\\\\\n  &=\\frac{11-\\sqrt{57}}2-4\n   =\\frac{3-\\sqrt{57}}2 .\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\ny=\\frac{a-\\sqrt{b}}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\n\nand \\(a\\) and \\(c\\) are relatively prime.  \n\nFinally\n\n\\[\na+b+c=3+57+2=62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\begin{aligned}\n&x-yz<y-zx<z-xy \\\\\n\\Longleftrightarrow\\;&x-yz<y-zx\\quad\\text{and}\\quad y-zx<z-xy  \\\\\n\\Longleftrightarrow\\;&(x-y)(1+z)<0\\quad\\text{and}\\quad (y-z)(1+x)<0 .\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n\\begin{cases}\n(x-y)(1+z)<0,\\\\[2pt]\n(y-z)(1+x)<0 .\n\\end{cases}\n\\]\n\nEach product being negative means the two factors have opposite signs.  \nThus we have four possible sign\u2011combinations:\n\n\\[\n\\begin{array}{c|c|c}\n\\text{Case}& (x-y,\\;1+z) & (y-z,\\;1+x)\\\\ \\hline\n\\text{I}& (+,\\; -) & (+,\\; -)\\\\\n\\text{II}& (+,\\; -) & (-,\\; +)\\\\\n\\text{III}& (-,\\; +) & (+,\\; -)\\\\\n\\text{IV}& (-,\\; +) & (-,\\; +)\n\\end{array}\n\\]\n\nTranslating them into linear inequalities:\n\n\\[\n\\begin{aligned}\n\\text{I}&:\\; x>y,\\;z<-1,\\;y>z,\\;x<-1 \\qquad\\text{(impossible since }x+y+z=75)\\\\\n\\text{II}&:\\; x>y,\\;z<-1,\\;y<z,\\;x>-1 \\\\\n\\text{III}&:\\; x<y,\\;z>-1,\\;y>z,\\;x<-1 \\\\\n\\text{IV}&:\\; x<y,\\;z>-1,\\;y<z,\\;x>-1 .\n\\end{aligned}\n\\]\n\nThus three non\u2011empty convex regions arise from cases II,\u202fIII,\u202fIV.\nCases II and III are unbounded, while case\u202fIV gives a bounded region.\n\n---\n\n### Bounded region (case\u202fIV)\n\nCase\u202fIV is equivalent to  \n\n\\[\n-1<x<y<z ,\\qquad x+y+z=75 .\n\\]\n\nThe boundary of this region in the plane \\(x+y+z=75\\) consists of the three lines  \n\n\\[\n\\begin{cases}\nx=-1,\\\\[2pt]\ny=x,\\\\[2pt]\nz=y .\n\\end{cases}\n\\]\n\nIntersecting each pair of lines with the plane gives the vertices\n\n\\[\n\\begin{aligned}\nA &: x=-1,\\;y=-1 \\;\\Rightarrow\\;z=77 ,&&A(-1,-1,77),\\\\\nB &: x=-1,\\;z=y \\;\\Rightarrow\\;y=z=38 ,&&B(-1,38,38),\\\\\nC &: y=x,\\;z=y \\;\\Rightarrow\\;x=y=z=25 ,&&C(25,25,25).\n\\end{aligned}\n\\]\n\nHence the finite region is the triangle \\(ABC\\).\n\n---\n\n### Area of the triangle\n\nVectors along two sides:\n\n\\[\n\\begin{aligned}\n\\vec{AB}&=B-A=(0,39,-39),\\\\\n\\vec{AC}&=C-A=(26,26,-52).\n\\end{aligned}\n\\]\n\n\\[\n\\vec{AB}\\times\\vec{AC}=(-1014,-1014,-1014)\n\\quad\\Longrightarrow\\quad \n\\bigl\\lVert\\vec{AB}\\times\\vec{AC}\\bigr\\rVert\n=1014\\sqrt3 .\n\\]\n\nTherefore\n\n\\[\n\\text{Area}= \\frac12\\bigl\\lVert\\vec{AB}\\times\\vec{AC}\\bigr\\rVert\n           =\\frac12\\cdot1014\\sqrt3\n           =507\\sqrt3 .\n\\]\n\nThus the area is \\(a\\sqrt b\\) with \\(a=507,\\;b=3\\), and\n\n\\[\na+b=507+3=510.\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First write the equation for the intersection points.\n\nThe parabola is  \n\n\\[\nx=34y^{2},\n\\]\n\nand the periodic saw\u2011tooth satisfies  \n\n\\[\nf(x+4)=f(x),\\qquad   \nf(x)=\\begin{cases}\nx,&-1\\le x<1,\\\\[2pt]\n2-x,&1\\le x<3 .\n\\end{cases}\n\\]\n\nHence an intersection must satisfy  \n\n\\[\ny=f(34y^{2}). \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Express \\(f\\) using the modulus\n\nFor any real \\(x\\) let  \n\n\\[\nt=(x+1)\\pmod 4,\\qquad 0\\le t<4 .\n\\]\n\nThen  \n\n\\[\nf(x)=\n\\begin{cases}\nt-1,&0\\le t<2,\\\\[2pt]\n3-t,&2\\le t<4 .\n\\end{cases}\n\\]\n\nPut \\(x=34y^{2}\\).  Let  \n\n\\[\ns=34y^{2}+1,\\qquad t=s\\pmod4 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Two linear possibilities\n\n*If \\(0\\le t<2\\) (the \u201crising\u201d part) then \\(y=t-1\\) and  \n\\(t=y+1\\).  Hence  \n\n\\[\n34y^{2}+1=4n+y+1\\quad\\Longrightarrow\\quad 34y^{2}-y-4n=0,\\tag{2}\n\\]\n\nwith the condition \\(y\\in[-1,1)\\).\n\n*If \\(2\\le t<4\\) (the \u201cfalling\u201d part) then \\(y=3-t\\) and  \n\\(t=3-y\\).  Hence  \n\n\\[\n34y^{2}+1=4n+3-y\\quad\\Longrightarrow\\quad 34y^{2}+y-(2+4n)=0,\\tag{3}\n\\]\n\nwith the condition \\(y\\in(-1,1]\\).\n\nHere \\(n\\) is the integer \\(\\displaystyle n=\\Big\\lfloor\\frac{34y^{2}+1}{4}\\Big\\rfloor\\).\nSince \\(0\\le 34y^{2}+1\\le 35\\), we must have \\(0\\le n\\le 8\\).\n\n--------------------------------------------------------------------\n### 3.  Solve the quadratics\n\n**From (2):**  \n\n\\[\ny=\\frac{1\\pm\\sqrt{1+544n}}{68}\\qquad (n=0,1,\\dots ,8).\n\\]\n\nBoth roots lie in \\([-1,1)\\); for each \\(n\\) their sum is  \n\n\\[\n\\frac{1}{34}.\n\\]\n\nThus  \n\n\\[\nS_I=\\sum_{n=0}^{8}\\frac1{34}= \\frac{9}{34}. \\tag{4}\n\\]\n\n**From (3):**  \n\n\\[\ny=\\frac{-1\\pm\\sqrt{273+544n}}{68}\\qquad (n=0,1,\\dots ,8).\n\\]\n\nFor \\(n=0,\\dots ,7\\) both roots satisfy \\((-1,1]\\); for \\(n=8\\) the\nnegative root is \\(\\le -1\\) and must be discarded.\nHence for \\(n=0,\\dots ,7\\) each pair sums to \\(-\\dfrac1{34}\\), and we add\nthe single remaining root for \\(n=8\\):\n\n\\[\nS_{II}=8\\!\\left(-\\frac1{34}\\right)+\\frac{-1+\\sqrt{4625}}{68}\n        =-\\frac{8}{34}+\\frac{-1+5\\sqrt{185}}{68}. \\tag{5}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Total sum of \\(y\\)-coordinates\n\n\\[\n\\begin{aligned}\nS &=S_I+S_{II}\\\\\n  &=\\frac{9}{34}-\\frac{8}{34}+\\frac{-1+5\\sqrt{185}}{68}\\\\\n  &=\\frac{1}{34}+\\frac{-1+5\\sqrt{185}}{68}\\\\[2pt]\n  &=\\frac{2-1+5\\sqrt{185}}{68}\n   =\\frac{1+5\\sqrt{185}}{68}.\n\\end{aligned}\n\\]\n\nThus the sum can be written as \\(\\displaystyle \\frac{a+b\\sqrt{c}}{d}\\) with  \n\n\\[\na=1,\\qquad b=5,\\qquad c=185,\\qquad d=68,\n\\]\n\nwhere \\(a,b,d\\) are coprime and \\(c\\) is square\u2011free.\n\nFinally  \n\n\\[\na+b+c+d = 1+5+185+68 = 259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The condition  \n\n\\[\na^3+b^3+c^3\\equiv 0\\pmod {3^7}\\qquad (3^7=2187)\n\\]\n\ndepends only on the residues of \\(a,b,c\\) modulo \\(3^7\\).  \nWrite each number as  \n\n\\[\na=3^{3\\alpha}q,\\qquad \\alpha\\in\\{0,1,2\\},\\;q\\in Q,\n\\]\n\nwhere  \n\n* \\(Q\\) = the set of cubic residues among units modulo \\(3^7\\);  \n  \\(|Q|=486\\);\n* for \\(\\alpha=0,1,2\\) the sets  \n\n\\[\nR_\\alpha =\\{3^{3\\alpha}q\\;|\\;q\\in Q\\}\n\\]\n\nhave sizes  \n\n\\[\n|R_0|=486,\\;|R_1|=162,\\;|R_2|=54 .\n\\]\n\nAll numbers divisible by \\(27\\) contribute \\(0\\) to the sum, so we only need the\nordered triples whose components lie in  \n\n\\[\nR=R_0\\cup R_1\\cup R_2 .\n\\]\n\nDenote  \n\n\\[\nM_2 =\\#\\{(x,y)\\in R^2 : x+y\\equiv 0\\},\\qquad \nM_3 =\\#\\{(x,y,z)\\in R^3 : x+y+z\\equiv 0\\}.\n\\]\n\nBecause \\(-x\\in R\\) for every \\(x\\in R\\), we have \\(M_2=|R|=702\\).\n\nThe total number of required triples of positive integers is  \n\n\\[\n\\begin{aligned}\nN&=27^3      \\;(\\text{all three multiples of }27) \\\\\n  &\\quad+ 3\\cdot27\\cdot M_2 \\;(\\text{exactly two non\u2011multiples of }27)\\\\\n  &\\quad+ M_3 .\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\nN=19683+81\\cdot702+M_3=19683+56862+M_3 .\n\\]\n\n--------------------------------------------------------------------\n### Computing \\(M_3\\)\n\nLet  \n\n\\[\nf(z)=\\mathbf 1_R(z),\\qquad\nF(t)=\\sum_{z\\in\\mathbf Z/3^7\\mathbf Z}f(z) e^{2\\pi i t z/3^7}\n\\]\n\nbe the Fourier transform of the indicator of \\(R\\).  \nThen\n\n\\[\nM_3=\\frac1{3^7}\\sum_{t=0}^{3^7-1}F(t)^3 .\n\\]\n\nWriting \\(R\\) as \\(Q\\cup27Q\\cup729Q\\) and using that each element of\n\\(R_\\alpha\\) is obtained from \\(|Q|/3^\\alpha\\) elements of \\(Q\\), we obtain\n\n\\[\nF(t)=\\sum_{\\alpha=0}^{2}\\frac1{3^{\\alpha}}\n        \\sum_{q\\in Q} e^{2\\pi i t\\cdot3^{3\\alpha} q/3^7}.\n\\]\n\nThe inner sums are evaluated with the three characters of order\u202f3 on\n\\((\\mathbf Z/3^7\\mathbf Z)^\\times\\).  One finds that \\(F(t)\\) depends only on\n\\(v=v_3(t)\\) (the 3\u2011adic valuation of \\(t\\)):\n\n\\[\n\\begin{array}{c|c|c}\nv &\\text{number of }t &F(t)\\\\\\hline\n0 &1458 & -27\\\\\n1 &486  & 54\\\\\n2 &162  & 54\\bigl(1+\\operatorname{Re}A\\bigr)\\\\\n3 &54   & -27\\\\\n4 &18   & 216\\\\\n5 &6    & 216+162\\,\\operatorname{Re}A\\\\\n6 &2    & -27\n\\end{array}\n\\]\n\nwhere  \n\n\\[\nA=3e^{2\\pi i/9}=3\\zeta_9,\\qquad \n\\operatorname{Re}A=3\\cos\\frac{2\\pi}{9}.\n\\]\n\nFrom the values\n\\[\n\\operatorname{Re}A=3\\cos\\frac{2\\pi}{9},\\qquad\n\\cos\\frac{2\\pi}{9}+ \\cos\\frac{4\\pi}{9}+ \\cos\\frac{8\\pi}{9}=0,\n\\]\none obtains  \n\n\\[\n\\sum_{i=1}^3 (1+r_i)^3=\\frac{267}{8},\\qquad\n\\sum_{i=1}^3\\Bigl(\\frac43+r_i\\Bigr)^3=\\frac{3671}{72},\n\\]\nwhere \\(r_1,r_2,r_3\\) are the three real numbers\n\\(3\\cos\\frac{2\\pi}{9},\\,3\\cos\\frac{4\\pi}{9},\\,3\\cos\\frac{8\\pi}{9}\\).\n\nCarrying out the sum\n\n\\[\n\\sum_{t}F(t)^3\n =702^3-1514\\cdot27^3+486\\cdot54^3+18\\cdot216^3\n   +54^4\\!\\left(\\frac{267}{8}\\right)+8\\,503\\,056\\!\\left(\\frac{3671}{72}\\right)\n =1\\,291\\,401\\,630 .\n\\]\n\nSince \\(3^7=2187\\),\n\n\\[\nM_3=\\frac{1\\,291\\,401\\,630}{2187}=590\\,490 .\n\\]\n\n--------------------------------------------------------------------\n### Final count\n\n\\[\n\\begin{aligned}\nN &=19683+56862+590490\\\\\n  &=667\\,035 .\n\\end{aligned}\n\\]\n\nThe problem asks for \\(N\\bmod 1000\\):\n\n\\[\n\\boxed{35}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 35

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1 \u2013   What the conditions mean**\n\nThe grid has three rows and nine columns.  \nThe columns are grouped into three \\(3\\times3\\) blocks  \n\n\\[\nB_{1}=\\{1,2,3\\},\\qquad B_{2}=\\{4,5,6\\},\\qquad B_{3}=\\{7,8,9\\}.\n\\]\n\nFor each row we must use the numbers \\(1,2,\\dots ,9\\) exactly once, and for each\nblock the nine cells of that block must also contain the numbers \\(1,\\dots ,9\\) exactly once.\n\nHence for each digit \\(d\\) :\n\n* it appears once in each of the three rows,  \n* it appears once in each of the three blocks.\n\nConsequently the three positions of a digit form a **bijection** between rows and blocks.\nLet \\(\\sigma _d\\in S_{3}\\) be the permutation defined by\n\n\\[\n\\sigma _d(i)=\\text{the block that contains }d\\text{ in row }i .\n\\]\n\nThus each digit contributes one \u20181\u2019 in the \\(3\\times3\\) permutation matrix of \\(\\sigma _d\\).\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013   The matrix condition**\n\nIf we add the nine permutation matrices of the nine digits we obtain a matrix\n\\(M\\) whose entry \\(M_{i,b}\\) counts how many digits lie in row \\(i\\) and block \\(b\\).\nThe block condition says that each block must contain each digit once, i.e. each\ncell \\((i,b)\\) must contain exactly three digits. Therefore\n\n\\[\nM=3J,\\qquad J=\\begin{pmatrix}1&1&1\\\\1&1&1\\\\1&1&1\\end{pmatrix}.\n\\]\n\nSo we must write \\(3J\\) as a sum of nine (not\u2011necessarily distinct) permutation\nmatrices of size \\(3\\).\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013   Types of permutations**\n\n\\(S_{3}\\) has six elements:\n\n\\[\n\\begin{aligned}\n&\\text{id},\\;(12),\\;(13),\\;(23),\\;(123),\\;(132).\n\\end{aligned}\n\\]\n\nLet  \n\n\\[\na=x_{\\text{id}}=x_{(123)}=x_{(132)},\\qquad\nb=x_{(12)}=x_{(13)}=x_{(23)} .\n\\]\n\nCounting the contributions of each type to the nine entries of \\(M\\) gives the\nsystem  \n\n\\[\n\\begin{cases}\na+b=3\\\\[2pt]\na+b=3\\\\[2pt]\na+b=3\\\\[2pt]\na+b=3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad a+b=3 .\n\\]\n\nHence \\(a\\) may be \\(0,1,2,3\\) and \\(b=3-a\\).  For a fixed value of \\(a\\),\n\n\\[\n\\begin{aligned}\nx_{\\text{id}}&=a,\\\\\nx_{(123)}&=a,\\\\\nx_{(132)}&=a,\\\\\nx_{(12)}&=x_{(13)}=x_{(23)}&=3-a .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013   Assigning the nine digits to the permutations**\n\nThe nine digits are distinct, so for a given \\(a\\) the number of ways to give the\nsix permutation types to the digits is the multinomial coefficient\n\n\\[\nN_a=\\frac{9!}{a!\\,a!\\,a!\\,(3-a)!\\,(3-a)!\\,(3-a)!}\n    =\\frac{9!}{a!^{3}(3-a)!^{3}} .\n\\]\n\nSumming over the four possible values of \\(a\\),\n\n\\[\n\\sum_{a=0}^{3}N_a\n   =\\frac{9!}{0!^{3}3!^{3}}+\\frac{9!}{1!^{3}2!^{3}}\n    +\\frac{9!}{2!^{3}1!^{3}}+\\frac{9!}{3!^{3}0!^{3}}\n   =94\\,080 .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013   Ordering inside each row\u2011block**\n\nFor a fixed assignment of the permutations, each of the nine\n\\( ( \\text{row},\\text{block} )\\) cells contains exactly three different digits.\nThese three digits can be placed in the three columns of that cell in any order,\ni.e. in \\(3! = 6\\) ways, independently of the other cells.\nHence we obtain an extra factor \\((3!)^{9}=6^{9}\\).\n\nThus the total number of admissible \\(3\\times9\\) grids is\n\n\\[\nN = 94\\,080\\cdot 6^{9}\n   =9!\\cdot 6^{6}\\cdot 56 .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 6 \u2013   Prime factorisation**\n\n\\[\n\\begin{aligned}\n9! &=2^{7}\\,3^{4}\\,5\\,7,\\\\\n6^{6}&=(2\\cdot3)^{6}=2^{6}\\,3^{6},\\\\\n56 &=2^{3}\\,7 .\n\\end{aligned}\n\\]\n\nMultiplying gives  \n\n\\[\nN=2^{7+6+3}\\,3^{4+6}\\,5^{1}\\,7^{1+1}\n  =2^{16}\\,3^{10}\\,5^{1}\\,7^{2}.\n\\]\n\nThus we may write  \n\n\\[\nN = p^{a}\\,q^{b}\\,r^{c}\\,s^{d}\n\\quad\\text{with}\\quad\np=2,\\;a=16;\\;\\; q=3,\\;b=10;\\;\\; r=5,\\;c=1;\\;\\; s=7,\\;d=2 .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 7 \u2013   Required sum**\n\n\\[\np\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d\n =2\\cdot16+3\\cdot10+5\\cdot1+7\\cdot2\n =32+30+5+14=81 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line containing \\(A,B,C,D,E,F\\) be the \\(x\\)-axis.\n\n\\[\nA=(0,0),\\qquad B=(b,0),\\ C=(c,0),\\ D=(d,0),\\ E=(e,0),\\ F=(f,0)\n\\]\n\nFrom the given distances along the line  \n\n\\[\n\\begin{aligned}\nAC&=c-a=26 \\Longrightarrow c=26,\\\\\nBD&=d-b=22,\\\\\nCE&=e-c=31 \\Longrightarrow e=26+31=57,\\\\\nDF&=f-d=33,\\\\\nAF&=f-a=73 \\Longrightarrow f=73 .\n\\end{aligned}\n\\]\n\nFrom \\(DF=33\\) we get \\(d=f-33=73-33=40\\).  \nThen \\(BD=22\\) gives \\(b=d-22=40-22=18\\).\n\nThus the collinear points are\n\n\\[\nA(0),\\ B(18),\\ C(26),\\ D(40),\\ E(57),\\ F(73).\n\\]\n\n---\n\n### Coordinates of \\(G\\)\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\).  \nWe know\n\n\\[\n\\begin{cases}\n(CG)^2=(x-26)^2+y^2=40^2=1600,\\\\\n(DG)^2=(x-40)^2+y^2=30^2=900 .\n\\end{cases}\n\\]\n\nSubtracting the equations:\n\n\\[\n(x-26)^2-(x-40)^2 = 1600-900=700 .\n\\]\n\nCompute the left side:\n\n\\[\n\\bigl(x^2-52x+676\\bigr)-\\bigl(x^2-80x+1600\\bigr)=28x-924 .\n\\]\n\nHence \\(28x-924=700\\) giving  \n\n\\[\nx=\\frac{1624}{28}=58.\n\\]\n\nNow use \\((x-40)^2+y^2=900\\):\n\n\\[\n(58-40)^2+y^2=900\\Longrightarrow 18^2+y^2=900\\Longrightarrow y^2=576.\n\\]\n\nThus \\(y=\\pm24\\).  The sign does not affect the area; we take \\(y=24\\).\n\nTherefore  \n\n\\[\nG=(58,24)\\;(\\text{or }(58,-24)).\n\\]\n\n---\n\n### Area of \\(\\triangle BGE\\)\n\nPoints:\n\\[\nB=(18,0),\\qquad G=(58,24),\\qquad E=(57,0).\n\\]\n\nSince \\(B\\) and \\(E\\) lie on the \\(x\\)-axis, the base \\(BE\\) has length  \n\n\\[\nBE = 57-18 = 39.\n\\]\n\nThe altitude from \\(G\\) to the \\(x\\)-axis is \\(|y|=24\\).\n\nHence\n\n\\[\n\\text{Area}=\\frac12\\cdot (\\text{base})\\cdot (\\text{height})\n          =\\frac12\\cdot 39\\cdot 24\n          =468.\n\\]\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nx_{k+1}= \\frac{x_k+\\frac1{x_k}-1}{3},\\qquad x_1=\\frac{25}{11}\n\\]\n\n---\n\n### 1.  A convenient substitution  \n\nLet  \n\n\\[\ny_k=\\frac{x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{1+y_k}{1-y_k}.\n\\]\n\nThen a short computation gives  \n\n\\[\ny_{k+1}= \\frac{3y_k^{\\,2}-1}{2}. \\tag{1}\n\\]\n\nThus we only have to iterate the quadratic map (1).\n\n---\n\n### 2.  Scaling  \n\nDefine  \n\n\\[\nu_k=\\frac32\\,y_k .\n\\]\n\nFrom (1)\n\n\\[\nu_{k+1}=u_k^{2}-\\frac34 .\\tag{2}\n\\]\n\nLet  \n\n\\[\nu_k=\\frac{a_k}{12^{\\,2^{k-1}}},\\qquad a_1=7 .\n\\]\n\nBecause the denominator squares each step, indeed  \n\n\\[\n12^{\\,2^{k}}=(12^{\\,2^{k-1}})^2 .\n\\]\n\nUsing (2) one checks that  \n\n\\[\na_{k+1}=a_k^{2}-\\frac34\\cdot12^{\\,2^{k}} .\n\\]\n\nOnly the denominator grows; the exact value of the numerator is not needed later.\n\n---\n\n### 3.  Returning to \\(x_k\\)\n\nSince \\(y_k=\\frac{2}{3}u_k\\),\n\n\\[\nx_k=\\frac{1+y_k}{1-y_k}\n     =\\frac{3+2u_k}{3-2u_k}\n     =\\frac{3\\cdot12^{\\,2^{k-1}}+2a_k}\n            {3\\cdot12^{\\,2^{k-1}}-2a_k}.\n\\]\n\nHence for any \\(k\\),\n\n\\[\nx_k=\\frac{M_k}{N_k},\\qquad \nM_k+N_k =6\\cdot12^{\\,2^{k-1}} .\n\\]\n\nIn particular\n\n\\[\nm+n = M_{2025}+N_{2025}= 6\\cdot 12^{\\,2^{2024}} .\n\\]\n\n---\n\n### 4.  Computing \\(6\\cdot12^{2^{2024}}\\pmod{1000}\\)\n\nWe need \\(6\\cdot12^{K}\\pmod{1000}\\) where \\(K=2^{2024}\\).\n\nBecause \\(1000=8\\cdot125\\) we work modulo\u202f8 and\u202f125.\n\n*Modulo\u202f8*:  \n\\(12\\equiv4\\pmod8\\), and \\(4^{2}=0\\pmod8\\).  \nSince \\(K\\ge2\\), \\(12^{K}\\equiv0\\pmod8\\) \u21d2 the whole expression is \\(0\\pmod8\\).\n\n*Modulo\u202f125*:  \\(\\gcd(12,125)=1\\) and \\(\\phi(125)=100\\).  \nThus \\(12^{100}\\equiv1\\pmod{125}\\); we need \\(K\\bmod100\\).\n\nThe powers of\u202f2 modulo\u202f100 repeat with period\u202f20 for exponents \\(\\ge2\\).  \n\\(2024\\equiv4\\pmod{20}\\), so \\(2^{2024}\\equiv2^{4}=16\\pmod{100}\\).  \nHence \\(12^{K}\\equiv12^{16}\\pmod{125}\\).\n\nCompute:\n\\[\n12^{2}\\equiv19,\\;12^{4}\\equiv111,\\;12^{8}\\equiv71,\\;12^{16}\\equiv71^{2}\\equiv41\\pmod{125}.\n\\]\n\nThus \\(6\\cdot12^{K}\\equiv6\\cdot41=246\\equiv121\\pmod{125}\\).\n\nNow solve the CRT:\n\\[\nX\\equiv0\\pmod8,\\qquad X\\equiv121\\pmod{125}.\n\\]\n\nLet \\(X=8t\\). Then \\(8t\\equiv121\\pmod{125}\\Rightarrow t\\equiv47\\cdot121\\equiv62\\pmod{125}\\) (since \\(8^{-1}\\equiv47\\pmod{125}\\)).  \nThus \\(X=8\\cdot62=496\\pmod{1000}\\).\n\nTherefore\n\n\\[\nm+n \\equiv 496 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{496}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 496

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nm=n+2\\qquad (m>2)\n\\]\n\nThen  \n\n\\[\nn+2=m,\\qquad n+3=m+1,\\qquad n^{2}+9=(m-2)^{2}+9=m^{2}-4m+13 .\n\\]\n\nThe condition  \n\n\\[\nn+2\\mid 3(n+3)(n^{2}+9)\n\\]\n\nbecomes  \n\n\\[\nm \\mid 3(m+1)(m^{2}-4m+13). \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Using the gcd with 3\n\nBecause  \n\n\\[\n\\gcd(m,m+1)=1,\n\\]\n\nany prime divisor of \\(m\\) cannot come from the factor \\(m+1\\).  \nThe only possible common factor of \\(m\\) with the whole right\u2011hand side of (1) is the factor \\(3\\).\n\nLet  \n\n\\[\nd=\\gcd(m,3),\\qquad m=d\\cdot m',\\qquad \\gcd(m',3)=1 .\n\\]\n\nThen (1) is equivalent to  \n\n\\[\nd m' \\mid 3(m+1)(m^{2}-4m+13)\n      = d\\Bigl(\\frac{3}{d}\\Bigr)(m+1)(m^{2}-4m+13).\n\\]\n\nCancelling \\(d\\) gives  \n\n\\[\nm' \\mid \\Bigl(\\frac{3}{d}\\Bigr)(m+1)(m^{2}-4m+13).\\tag{2}\n\\]\n\nSince \\(\\gcd(m',m+1)=1\\) and also \\(\\gcd(m',3)=1\\), the factor \\((m+1)\\) and the possible remaining factor \\(\\frac{3}{d}\\) cannot help the divisibility. Hence (2) reduces to  \n\n\\[\nm' \\mid (m^{2}-4m+13). \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Reduce modulo \\(m\\)\n\n\\[\nm^{2}-4m+13 \\equiv 13\\pmod{m},\n\\]\n\nso (3) is equivalent to  \n\n\\[\nm' \\mid 13.\n\\]\n\nRecall \\(m' =\\dfrac{m}{\\gcd(m,3)}\\).  Therefore\n\n\\[\n\\frac{m}{\\gcd(m,3)}\\mid 13.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Solve the two possibilities\n\n**(i)  \\(\\gcd(m,3)=1\\) (i.e. \\(3\\nmid m\\)).**  \nThen \\(\\displaystyle m\\mid13\\).  \nWith \\(m>2\\), the only possibility is \\(m=13\\).\n\n**(ii)  \\(\\gcd(m,3)=3\\) (i.e. \\(m=3k\\)).**  \nThen \\(\\displaystyle k\\mid13\\).  \nThus \\(k=1\\) or \\(k=13\\), giving \\(m=3\\) or \\(m=39\\).\n\n--------------------------------------------------------------------\n### 4.  Return to \\(n\\)\n\n\\[\nn=m-2\\; \\Longrightarrow\\; \n\\begin{cases}\nm=3 &\\Rightarrow n=1,\\\\[2pt]\nm=13 &\\Rightarrow n=11,\\\\[2pt]\nm=39 &\\Rightarrow n=37.\n\\end{cases}\n\\]\n\nAll three values satisfy the original divisibility (direct verification shows \\(3\\mid120\\), \\(13\\mid5460\\), \\(39\\mid165360\\)).\n\n--------------------------------------------------------------------\n### 5.  Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First rewrite each factor using the change\u2013of\u2013base formula  \n\n\\[\n\\log_a b=\\frac{\\ln b}{\\ln a}.\n\\]\n\n\\[\n\\frac{\\log_k\\bigl(5^{k^{2}-1}\\bigr)}{\\log_{k+1}\\bigl(5^{k^{2}-4}\\bigr)}\n   =\\frac{\\dfrac{\\ln5^{\\,k^{2}-1}}{\\ln k}}\n          {\\dfrac{\\ln5^{\\,k^{2}-4}}{\\ln (k+1)}}\n   =\\frac{(k^{2}-1)\\ln5}{\\ln k}\\cdot\\frac{\\ln(k+1)}{(k^{2}-4)\\ln5}\n   =\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nHence\n\n\\[\nP=\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n   \\cdot\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\n---\n\n### 1.  The logarithmic product\n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n   =\\frac{\\ln64}{\\ln4}\n   =\\log_{4}64=3.\n\\]\n\n(The terms cancel telescopically.)\n\n---\n\n### 2.  The rational product  \n\nFactor each term:\n\n\\[\n\\frac{k^{2}-1}{k^{2}-4}\n   =\\frac{(k-1)(k+1)}{(k-2)(k+2)}\n   =\\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nThus\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n =\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n  \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr).\n\\]\n\nThe first product telescopes:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\cdots\\cdot\\frac{62}{61}\n =\\frac{62}{2}=31.\n\\]\n\nThe second product also telescopes:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\cdots\\cdot\\frac{64}{65}\n =\\frac{5}{65}=\\frac{1}{13}.\n\\]\n\nTherefore\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n   =31\\cdot\\frac{1}{13}=\\frac{31}{13}.\n\\]\n\n---\n\n### 3.  Combine the two parts\n\n\\[\nP=\\frac{31}{13}\\times3=\\frac{93}{13}.\n\\]\n\nThe fraction is already in lowest terms (\\(\\gcd(93,13)=1\\)).  \nThus \\(m=93\\), \\(n=13\\) and\n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the four unit squares be  \n\n\\[\n\\begin{array}{c|c}\n\\text{TL}&\\text{TR}\\\\\\hline\n\\text{BL}&\\text{BR}\n\\end{array}\n\\]\n\nand denote the twelve unit edges as follows  \n\n* Horizontal edges:  \n\n\\[\n\\begin{aligned}\n&h_{1}= \\text{top of TL},\\qquad h_{2}= \\text{top of TR},\\\\\n&h_{3}= \\text{middle left},\\qquad h_{4}= \\text{middle right},\\\\\n&h_{5}= \\text{bottom of BL},\\qquad h_{6}= \\text{bottom of BR}.\n\\end{aligned}\n\\]\n\n* Vertical edges:  \n\n\\[\n\\begin{aligned}\n&v_{1}= \\text{left of TL},\\qquad v_{2}= \\text{left of BL},\\\\\n&v_{3}= \\text{middle top},\\qquad v_{4}= \\text{middle bottom},\\\\\n&v_{5}= \\text{right of TR},\\qquad v_{6}= \\text{right of BR}.\n\\end{aligned}\n\\]\n\nFor each square the sum of the red edges must be \\(2\\).\nWriting a red edge as \\(1\\) and a blue edge as \\(0\\),\n\n\\[\n\\begin{aligned}\n\\text{TL}&:\\;h_{1}+h_{3}+v_{1}+v_{3}=2,\\\\\n\\text{TR}&:\\;h_{2}+h_{4}+v_{3}+v_{5}=2,\\\\\n\\text{BL}&:\\;h_{3}+h_{5}+v_{2}+v_{4}=2,\\\\\n\\text{BR}&:\\;h_{4}+h_{6}+v_{4}+v_{6}=2.\n\\end{aligned}\n\\]\n\nThe four **interior** edges are \\(h_{3},h_{4},v_{3},v_{4}\\); the other eight edges lie on the outer\nboundary.  \n\nFix the colours of the interior edges:\n\\[\na=h_{3},\\qquad b=h_{4},\\qquad c=v_{3},\\qquad d=v_{4}\\in\\{0,1\\}.\n\\]\n\nThen for each square we know the required sum of its two boundary edges:\n\n\\[\n\\begin{aligned}\nh_{1}+v_{1}&=2-(a+c),\\\\\nh_{2}+v_{5}&=2-(b+c),\\\\\nh_{5}+v_{2}&=2-(a+d),\\\\\nh_{6}+v_{6}&=2-(b+d).\n\\end{aligned}\n\\]\n\nIf the right\u2011hand side equals \\(2\\) or \\(0\\) the two boundary edges are forced to be\nboth red or both blue \u2013 exactly one choice.  \nIf it equals \\(1\\) the two edges must be of opposite colours \u2013 two choices.\n\nHence, for a fixed interior vector \\((a,b,c,d)\\) the number of admissible colourings of the\nboundary edges is  \n\n\\[\n2^{\\,k(a,b,c,d)},\n\\]\n\nwhere \\(k\\) is the number of squares whose interior\u2011edge sum equals \\(1\\); i.e.\n\n\\[\nk=(a\\oplus c)+(b\\oplus c)+(a\\oplus d)+(b\\oplus d),\n\\]\n(\\(\\oplus\\) denotes XOR).\n\nTherefore the total number of colourings is  \n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}}2^{k}\n= \\sum_{c,d} \\Bigl(\\sum_{a}2^{\\,a\\oplus c + a\\oplus d}\\Bigr)^{2}.\n\\]\n\nFor the four possibilities of \\((c,d)\\) we have\n\n\\[\n\\begin{array}{c|c}\n(c,d) & \\displaystyle\\sum_{a}2^{a\\oplus c + a\\oplus d} \\\\ \\hline\n(0,0) & 1+4 = 5\\\\\n(1,1) & 4+1 = 5\\\\\n(0,1),(1,0) & 2+2 = 4\n\\end{array}\n\\]\n\nThus\n\n\\[\n\\text{total}=2\\cdot5^{2}+2\\cdot4^{2}=2\\cdot25+2\\cdot16=50+32=82.\n\\]\n\nHence there are  \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent colourings of the twelve unit edges so that each of the four unit squares has\nexactly two red and two blue sides.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The divisors of  \n\n\\[\n2025 = 3^{4}\\cdot5^{2}\n\\]\n\nare obtained by choosing the exponent of \\(3\\) from \\(\\{0,1,2,3,4\\}\\) and the exponent of \\(5\\) from \\(\\{0,1,2\\}\\).  \nHence  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\n---\n\n### Condition for the LCM to be \\(2025\\)\n\nFor a non\u2011empty subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=2025 \\iff\n\\begin{cases}\n\\text{some element of }B\\text{ has }3\\text{-exponent }4,\\\\[2pt]\n\\text{some element of }B\\text{ has }5\\text{-exponent }2.\n\\end{cases}\n\\]\n\nDefine  \n\n\\[\nS_3=\\{81,\\,405,\\,2025\\} \\quad (\\text{divisors with }3^4) ,\n\\]\n\\[\nS_5=\\{25,\\,75,\\,225,\\,675,\\,2025\\} \\quad (\\text{divisors with }5^2).\n\\]\n\nThus \\(B\\) must intersect both \\(S_3\\) and \\(S_5\\).\n\n---\n\n### Counting favorable subsets\n\nLet \\(U=S_3\\cup S_5\\).  \n\\(|S_3|=3,\\;|S_5|=5,\\;|S_3\\cap S_5|=1\\) (the element \\(2025\\)), so\n\n\\[\n|U|=3+5-1=7.\n\\]\n\nThe remaining divisors of \\(2025\\) (those not in \\(U\\)) are \\(15-7=8\\) in number and can be chosen freely.\n\nNumber of subsets of \\(U\\) that contain at least one element of \\(S_3\\) **and** at least one element of \\(S_5\\):\n\n\\[\n\\begin{aligned}\n&2^{7}\\;(\\text{all subsets of }U)\\\\\n&\\quad-2^{4}\\;(\\text{subsets with no }S_3)\\\\\n&\\quad-2^{2}\\;(\\text{subsets with no }S_5)\\\\\n&\\quad+2^{0}\\;(\\text{subsets with neither }S_3\\text{ nor }S_5)\\\\[2pt]\n&=128-16-4+1=109 .\n\\end{aligned}\n\\]\n\nFor each of these \\(109\\) choices, any subset of the other 8 divisors may be added, giving a factor \\(2^{8}=256\\).\n\nHence the number of favorable subsets is  \n\n\\[\nN=109\\cdot256=27904.\n\\]\n\n---\n\n### Probability\n\nAll subsets of \\(A\\) (including the empty set) number  \n\n\\[\n2^{15}=32768.\n\\]\n\nThus\n\n\\[\nP=\\frac{N}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nDividing numerator and denominator by their greatest common divisor \\(256\\),\n\n\\[\nP=\\frac{27904/256}{32768/256}=\\frac{109}{128}.\n\\]\n\nSo \\(\\displaystyle m=109,\\;n=128\\) and\n\n\\[\nm+n=109+128=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\boxed{45}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 45

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the centre of the large circle \\(\\omega _2\\) be the origin \\(O(0,0)\\).\nSince \\(BC\\) is a diameter of \\(\\omega _2\\), take  \n\n\\[\nB=(15,0),\\qquad C=(-15,0),\\qquad O=(0,0).\n\\]\n\nBecause \\(\\omega _1\\) (radius \\(6\\)) is internally tangent to \\(\\omega _2\\) at \\(B\\),\nits centre \\(A\\) lies on \\(OB\\) with  \n\n\\[\nOA=15-6=9\\quad\\Longrightarrow\\quad A=(9,0).\n\\]\n\nThe condition \\(AD\\perp BC\\) forces \\(AD\\) to be vertical through \\(x=9\\).\nIntersecting this line with \\(\\omega _2\\) (\\(x^{2}+y^{2}=225\\)) gives  \n\n\\[\nD=(9,12)\\text{ or }(9,-12).\n\\]\n\nSince later we need \\(D\\) to be nearer the side \\(\\overline{FG}\\) than to \\(\\overline{EH}\\),\n\\(D\\) must lie **below** the rectangle; hence  \n\n\\[\nD=(9,-12).\n\\]\n\n---\n\n### The rectangle\n\nA rectangle inscribed in a circle has its centre at the circle\u2019s centre.\nThus the centre of rectangle \\(EFGH\\) is \\(A(9,0)\\).\n\nLet  \n\n* \\(w\\) = horizontal distance from \\(A\\) to each vertical side,\n* \\(h\\) = vertical distance from \\(A\\) to each horizontal side.\n\nThen the vertices are  \n\n\\[\n\\begin{aligned}\nE&(9+w,\\;h),\\qquad F&(9+w,\\;-h),\\\\\nG&(9-w,\\;-h),\\qquad H&(9-w,\\;h).\n\\end{aligned}\n\\]\n\nBecause the rectangle is inscribed in \\(\\omega _1\\),\n\n\\[\nw^{2}+h^{2}=6^{2}=36. \\tag{1}\n\\]\n\nThe side \\(\\overline{EF}\\) is vertical, so \\(\\overline{EF}\\perp BC\\) (which is horizontal).\n\n- \\(C(-15,0)\\) is left of the rectangle, so its distances to the two vertical sides are  \n\n\\[\n\\operatorname{dist}(C,\\overline{GH}) =| -15-(9-w)| =24-w,\n\\]\n\\[\n\\operatorname{dist}(C,\\overline{EF}) =| -15-(9+w)| =24+w,\n\\]\n\nhence \\(C\\) is indeed closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\).\n\n- \\(D(9,-12)\\) is below the rectangle; its distances to the horizontal sides are  \n\n\\[\n\\operatorname{dist}(D,\\overline{FG}) =|-12-(-h)| =12-h,\n\\]\n\\[\n\\operatorname{dist}(D,\\overline{EH}) =|-12-h| =12+h,\n\\]\n\nso \\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\) as required.\n\n---\n\n### Equality of the two triangle areas\n\n\\[\n\\triangle DGF:\\quad \n\\text{base}=GF=2w,\\;\n\\text{height}=12-h\\;\\Longrightarrow\\;\n[ DGF]=\\tfrac12(2w)(12-h)=w(12-h).\n\\]\n\n\\[\n\\triangle CHG:\\quad \n\\text{base}=HG=2h,\\;\n\\text{height}=24-w\\;\\Longrightarrow\\;\n[ CHG]=\\tfrac12(2h)(24-w)=h(24-w).\n\\]\n\nGiven \\([DGF]=[CHG]\\),\n\n\\[\nw(12-h)=h(24-w)\\;\\Longrightarrow\\;12w=24h\\;\\Longrightarrow\\; w=2h. \\tag{2}\n\\]\n\n---\n\n### Solving for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1),\n\n\\[\n(2h)^{2}+h^{2}=36\\;\\Longrightarrow\\;5h^{2}=36\\;\\Longrightarrow\\;h^{2}=\\frac{36}{5}.\n\\]\n\nHence  \n\n\\[\nh=\\frac{6}{\\sqrt5},\\qquad \nw=2h=\\frac{12}{\\sqrt5}.\n\\]\n\n---\n\n### Area of the rectangle\n\n\\[\n\\text{Area}= (2w)(2h)=4wh\n   =4\\!\\left(\\frac{12}{\\sqrt5}\\right)\\!\\left(\\frac{6}{\\sqrt5}\\right)\n   =\\frac{288}{5}.\n\\]\n\nThus \\(\\displaystyle \\frac{m}{n}= \\frac{288}{5}\\) with \\(m,n\\) relatively prime.\nHence  \n\n\\[\nm+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr),\\qquad 0<x<2\\pi .\n\\]\n\n---\n\n### 1.  Zeros of \\(f\\)\n\n\\[\nf(x)=0\\iff \\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\n\\iff 7\\pi\\sin(5x)=k\\pi\\;(k\\in\\mathbb Z)\n\\iff \\sin(5x)=\\frac{k}{7}.\n\\]\n\nBecause \\(|\\sin(5x)|\\le1\\), we must have \\(|k|\\le7\\); thus  \n\n\\[\nk\\in\\{-7,-6,\\dots ,0,\\dots ,6,7\\}.\n\\]\n\nSet \\(\\theta=5x\\).  Then \\(x\\in(0,2\\pi)\\) gives \\(\\theta\\in(0,10\\pi)\\).\nHence we must count the solutions of\n\n\\[\n\\sin\\theta=\\frac{k}{7},\\qquad \\theta\\in(0,10\\pi),\n\\]\nfor every integer \\(k\\) with \\(|k|\\le7\\).\n\n---\n\n### 2.  Number of solutions for each \\(k\\)\n\n* **\\(k=0\\):** \\(\\sin\\theta=0\\Rightarrow\\theta=n\\pi\\).  \n  In \\((0,10\\pi)\\) we have \\(n=1,2,\\dots ,9\\): **9 solutions**.\n\n* **\\(k=\\pm7\\):** \\(\\sin\\theta=\\pm1\\).  \n  Each period \\(2\\pi\\) contributes one solution, so over five periods we get **5 solutions** for \\(\\sin\\theta=1\\) and **5** for \\(\\sin\\theta=-1\\): **10 solutions**.\n\n* **\\(k=\\pm1,\\pm2,\\pm3,\\pm4,\\pm5,\\pm6\\):** \\(\\sin\\theta=a\\) with \\(|a|<1,\\;a\\neq0\\).  \n  In each period there are two solutions, therefore over five periods we obtain **10 solutions** for each such \\(k\\).\n\nThere are \\(12\\) values of \\(k\\) with \\(\\pm1,\\dots ,\\pm6\\); they give  \n\\(12\\times10=120\\) solutions.\n\nHence the total number of zeros is  \n\n\\[\nn = 9\\;(k=0) + 10\\;(k=\\pm7) + 120\\;(k=\\pm1,\\dots ,\\pm6) = 139 .\n\\]\n\n---\n\n### 3.  Points where the graph is tangent to the \\(x\\)-axis\n\nA zero is a point of tangency when \\(f'(x)=0\\) as well.\n\n\\[\nf'(x)=\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot 7\\pi\\cdot5\\cos(5x)\n     =35\\pi\\cos(5x)\\,\\cos\\bigl(7\\pi\\sin(5x)\\bigr).\n\\]\n\nAt any zero we have \\(\\sin(5x)=k/7\\) and thus\n\\(\\cos\\bigl(7\\pi\\sin(5x)\\bigr)=\\cos(k\\pi)=(-1)^k\\neq0\\).\nConsequently  \n\n\\[\nf'(x)=0\\iff \\cos(5x)=0.\n\\]\n\n\\(\\cos(5x)=0\\) implies \\(\\sin(5x)=\\pm1\\), i.e. the cases \\(k=\\pm7\\).\nTherefore the tangency points are precisely the solutions for\n\\(\\sin(5x)=\\pm1\\).\n\nFrom the count above there are **5** solutions for \\(\\sin(5x)=1\\) and **5**\nfor \\(\\sin(5x)=-1\\); altogether\n\n\\[\nt = 10 .\n\\]\n\n---\n\n### 4.  Required sum\n\n\\[\nn+t = 139+10 = 149.\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the chairs be numbered \\(1,2,\\ldots ,16\\).\nChoosing the chairs for the eight people is the same as writing a binary\nstring of length \\(16\\) with exactly eight \\(1\\)\u2019s (occupied chairs) and eight\n\\(0\\)\u2019s (empty chairs).\n\nThe condition \u201cno person sits next to two other people\u2019\u2019 means that we may\nnot have three consecutive occupied chairs; i.e. the binary string must contain\nno substring \\(111\\).\n\n---\n\n### 1.  Decompose the 1\u2019s into blocks  \n\nSince three consecutive 1\u2019s are forbidden, any maximal block of consecutive\n1\u2019s has length \\(1\\) or \\(2\\).\nLet  \n\n* \\(a\\) = number of blocks of length \\(1\\),  \n* \\(b\\) = number of blocks of length \\(2\\).\n\nThen  \n\n\\[\na+2b = 8,\\qquad a,b\\ge 0 .\n\\]\n\nHence the possible values are  \n\n\\[\n\\begin{array}{c|c|c}\nb & a & r=a+b\\\\ \\hline\n0&8&8\\\\\n1&6&7\\\\\n2&4&6\\\\\n3&2&5\\\\\n4&0&4\n\\end{array}\n\\]\n\nHere \\(r\\) is the total number of blocks of 1\u2019s.\n\nFor a fixed \\(r\\) the number of ways to decide which of the \\(r\\) blocks are\nlength \\(2\\) is \\(\\displaystyle\\binom{r}{b}\\) (choose the \\(b\\) blocks of\nsize \\(2\\)).  \n\n---\n\n### 2.  Insert the zeros  \n\nThere are \\(8\\) zeros.  \nBetween any two consecutive blocks of 1\u2019s there must be at least one zero,\nso the \\(r-1\\) internal gaps each receive one zero.  \nAfter this we have  \n\n\\[\n8-(r-1)=9-r\n\\]\n\nzeros left to distribute freely among the \\(r+1\\) gaps (the two ends plus the\n\\(r-1\\) internal gaps).  \n\nThe number of non\u2011negative integer solutions of  \n\n\\[\nz_0+z_1+\\cdots+z_r = 9-r\n\\]\n\nis  \n\n\\[\n\\binom{(9-r)+(r+1)-1}{(r+1)-1}= \\binom{9}{r}.\n\\]\n\nThus for a given \\(r\\) (equivalently a given \\(b\\)) we have  \n\n\\[\n\\binom{r}{b}\\binom{9}{r}\n\\]\n\nvalid strings.\n\n---\n\n### 3.  Sum over all possibilities  \n\nRecall \\(r=8-b\\).  Summing over \\(b=0,1,2,3,4\\):\n\n\\[\n\\begin{aligned}\nN &=\\sum_{b=0}^{4}\\binom{8-b}{b}\\binom{9}{8-b}  \\\\\n  &=\\binom{8}{0}\\binom{9}{8}+\n    \\binom{7}{1}\\binom{9}{7}+\n    \\binom{6}{2}\\binom{9}{6}+\n    \\binom{5}{3}\\binom{9}{5}+\n    \\binom{4}{4}\\binom{9}{4}  \\\\\n  &=1\\cdot9+7\\cdot36+15\\cdot84+10\\cdot126+1\\cdot126 \\\\\n  &=9+252+1260+1260+126 \\\\\n  &=2907 .\n\\end{aligned}\n\\]\n\n---\n\n### 4.  Modulo \\(1000\\)\n\n\\[\n2907\\equiv 907\\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The disk is cut by line\u2013segments (chords).  \nIf a new chord meets \\(k\\) already drawn chords in the interior, it splits\n\\(k+1\\) existing regions, so the total number of regions after all chords are drawn is  \n\n\\[\nR = 1 + (\\text{number of chords}) + (\\text{number of interior intersections}).\n\\]\n\nThere are \\(27\\) chords in total (the two diameters plus the \\(25\\) random chords), so  \n\n\\[\n\\mathbb E[R]=28+\\mathbb E[I],\n\\]\n\nwhere \\(I\\) is the number of interior intersection points.\n\n--------------------------------------------------------------------\n### 1.  Intersections involving a diameter  \n\nA fixed diameter (say the vertical one) is intersected iff the two\nend\u2013points of the chord lie in opposite half\u2013planes \\((x>0\\) and \\(x<0)\\).\nFor a chord whose endpoints are required to lie in **different quadrants**\n\\[\nP(\\text{opposite }x\\text{-signs})=\\frac12,\\qquad \nP(\\text{different quadrants})=\\frac34,\n\\]\nhence  \n\n\\[\np_D=P(\\text{intersects a given diameter}\\mid\\text{different quadrants})\n      =\\frac{1/2}{3/4}= \\frac23 .\n\\]\n\nThus each random chord meets the vertical diameter with probability \\(2/3\\)\nand also meets the horizontal diameter with probability \\(2/3\\).  \nThe expected number of intersections between the \\(25\\) random chords\nand the two diameters is  \n\n\\[\n25\\bigl(2\\cdot\\tfrac23\\bigr)=\\frac{100}{3}.\n\\]\n\nThe two diameters intersect each other once, so the total expected\nintersection count contributed by the diameters is  \n\n\\[\n1+\\frac{100}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Intersections between two random chords  \n\nWrite each chord only by the **pair of quadrants** that its two endpoints\noccupy.  For a chord whose endpoints are in different quadrants the\nunordered pair of quadrants is uniformly distributed over the six possible\npairs:\n\n* four **adjacent** pairs \\(\\{1,2\\},\\{2,3\\},\\{3,4\\},\\{4,1\\}\\);\n* two **opposite** pairs \\(\\{1,3\\},\\{2,4\\}\\).\n\nThus each random chord is adjacent with probability \\(\\tfrac23\\) and opposite\nwith probability \\(\\tfrac13\\).\n\nConsider two chords and classify them according to the relationship of the\nquadrants they use.\n\n| case | description | intersection probability |\n|------|-------------|---------------------------|\n| AA\u2013same | both are the same adjacent pair (e.g. \\(\\{1,2\\}\\) and \\(\\{1,2\\}\\)) | \\(\\tfrac12\\) |\n| AA\u2013share | adjacent pairs sharing one quadrant (e.g. \\(\\{1,2\\},\\{2,3\\}\\)) | \\(\\tfrac12\\) |\n| AA\u2013disjoint | adjacent pairs using opposite quadrants (e.g. \\(\\{1,2\\},\\{3,4\\}\\)) | \\(0\\) |\n| OO\u2013same | both are the same opposite pair (e.g. \\(\\{1,3\\},\\{1,3\\}\\)) | \\(\\tfrac12\\) |\n| OO\u2013disjoint | opposite pairs \\(\\{1,3\\},\\{2,4\\}\\) | \\(1\\) |\n| AO (any) | one adjacent, one opposite (they always share one quadrant) | \\(\\tfrac12\\) |\n\nAll of the probabilities above are obtained by looking at the possible\norderings of the four points inside their quadrants; each ordering is\nequally likely and the intersecting orderings are exactly half of them\n(when both chords involve a common quadrant) or forced (when the quadrants\nare disjoint).\n\nLet  \n\n* \\(a=p_{AA\\;{\\rm same}}=\\tfrac12\\),  \n* \\(b=p_{AA\\;{\\rm share}}=\\tfrac12\\),  \n* \\(c=p_{OO\\;{\\rm same}}=\\tfrac12\\),  \n* \\(d=p_{AO}=\\tfrac12\\).\n\nFrom the probabilities of picking each type we obtain\n\n\\[\n\\begin{aligned}\np_{RR}\n&=P(\\text{intersection of two random chords})\\\\\n&=\\frac{2a+4b+c+8d+1}{18}\n   =\\frac{2\\cdot\\frac12+4\\cdot\\frac12+\\frac12+8\\cdot\\frac12+1}{18}\n   =\\frac{17}{36}.\n\\end{aligned}\n\\]\n\nHence the expected number of intersections among the \\(25\\) random chords is  \n\n\\[\n\\binom{25}{2}\\,p_{RR}=300\\cdot\\frac{17}{36}\n      =\\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Total expected intersections\n\n\\[\n\\mathbb E[I]=\n\\underbrace{1}_{\\text{diameters}}+\n\\underbrace{\\frac{100}{3}}_{\\text{diameters\u2013random chords}}+\n\\underbrace{\\frac{425}{3}}_{\\text{random\u2013random}}=\n\\frac{525}{3}+1=176 .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Expected number of regions\n\n\\[\n\\mathbb E[R]=28+\\mathbb E[I]=28+176=204.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1 \u2013  Formulating the optimal problem**\n\nLet  \n\n\\[\na=\\text{ number of 1\u2011cent coins},\\qquad \nb=\\text{ number of 10\u2011cent coins},\\qquad \nc=\\text{ number of 25\u2011cent coins}.\n\\]\n\nWe must have  \n\n\\[\na+10b+25c=N,\\qquad a,b,c\\ge 0 .\n\\]\n\nThe total number of coins is  \n\n\\[\nT=a+b+c\n  =(N-10b-25c)+b+c\n  =N-9b-24c.\n\\]\n\nThus minimizing the number of coins is the same as **maximising**  \n\n\\[\n9b+24c\\qquad\\text{subject to }10b+25c\\le N .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013  The greedy solution**\n\nThe greedy algorithm first uses as many 25\u2011cent coins as possible,\nthen as many 10\u2011cent coins, and finally 1\u2011cent coins.  \nWrite  \n\n\\[\nN=25q+r,\\qquad 0\\le r<25 .\n\\]\n\nThe greedy representation is  \n\n\\[\nc_{\\text{g}}=q,\\qquad b_{\\text{g}}=\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor,\n\\qquad a_{\\text{g}}=r\\bmod 10,\n\\]\n\nand the greedy number of coins is  \n\n\\[\nG(N)=q+\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor+(r\\bmod10).\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013  When can we do better?**\n\nSuppose we try to use **one fewer** 25\u2011cent coin.  \nThen we have \\(c=q-1\\) and the remainder becomes \\(r+25\\).\nThe new numbers of 10\u2011 and 1\u2011cent coins are  \n\n\\[\nb'=\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor,\\qquad   \na'= (r+25)\\bmod 10 .\n\\]\n\nThe total number of coins after dropping one 25\u2011cent coin is  \n\n\\[\nA(N)=(q-1)+b'+a'.\n\\]\n\nThe difference is\n\n\\[\nA(N)-G(N)=-1+\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor-\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor\n            +(r+25\\bmod10)-(r\\bmod10).\n\\]\n\nWrite \\(r=10k+s\\) with \\(0\\le s\\le 9\\).  Then  \n\n\\[\n\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor-\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor=\n\\begin{cases}\n2,& s\\le 4,\\\\[2pt]\n3,& s\\ge 5,\n\\end{cases}\n\\]\n\nand \\((r+25\\bmod10)-(r\\bmod10)=5\\) in either case.  \nHence  \n\n\\[\nA(N)-G(N)= -1 + \\Delta +5 = 4+\\Delta,\n\\]\n\nwhere \\(\\Delta=2\\) or \\(3\\).  Consequently  \n\n\\[\nA(N)-G(N)=\\begin{cases}\n 6,& s\\le 4,\\\\\n 3,& s\\ge 5 .\n\\end{cases}\n\\]\n\nThus **dropping one 25\u2011cent coin reduces the total number of coins\niff the ones\u2011digit \\(s\\) of the remainder \\(r\\) is at least\u202f5**.\n\nThat is, the greedy algorithm fails exactly when  \n\n\\[\nr\\equiv 5,6,7,8,9,15,16,17,18,19\\pmod{25},\n\\]\n\ni.e. when the remainder after using the maximal number of 25\u2011cent coins has units digit \\(5,6,7,8,\\) or \\(9\\).\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013  Dropping more than one 25\u2011cent coin never helps**\n\nIf we drop a second 25\u2011cent coin, the units digit of the new remainder\nflips between \\(s\\) and \\(s+5\\pmod{10}\\).  Consequently the increase in the\nnumber of 10\u2011cent coins alternates between **2** and **3**.\nA short computation (or the formula \\(\\Delta(k)=24k-9\\sum T_i\\) where each\n\\(T_i\\in\\{2,3\\}\\)) shows that after two or more drops the total number of\ncoins is never smaller than the greedy count; the only possible improvement\nis the single\u2011drop case described above.\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013  Counting the successful values**\n\nThe greedy algorithm succeeds for all \\(N\\) that are **not** of the above\nfailing form, and also for \\(N<25\\) (there are no 25\u2011cent coins to drop).\n\n*There are 10 \u201cbad\u2019\u2019 residues modulo\u202f25*:  \n\n\\[\n5,6,7,8,9,15,16,17,18,19.\n\\]\n\nFor each integer \\(q\\ge 1\\) the numbers \\(N=25q+r\\) with such an \\(r\\) are\nfailures.  \n\n\\[\n\\text{Number of blocks with }q\\ge 1\\text{: } \\left\\lfloor\\frac{1000}{25}\\right\\rfloor=40.\n\\]\n\nThe last block (\\(q=40\\)) contains only \\(N=1000\\) (remainder\u202f0), which is\nnot a failure.  Hence the failing blocks are those with \\(q=1,2,\\dots,39\\).\n\n\\[\n\\text{Failures}=39\\;\\times\\;10 = 390.\n\\]\n\nAll the remaining numbers succeed:\n\n\\[\n\\text{Successes}=1000-390=610.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For every \\(2\\le i\\le 10\\) the triangle \\(A_iA_1A_{i+1}\\) has  \n\n\\[\n[\\,A_iA_1A_{i+1}\\,]=\\frac12 \\,A_1A_i\\cdot A_1A_{i+1}\\sin\\angle A_iA_1A_{i+1}=1\n\\]\n\nand  \n\n\\[\n\\cos\\angle A_iA_1A_{i+1}= \\frac{12}{13}.\n\\]\n\n---\n\n### 1.  The angle \\(\\angle A_iA_1A_{i+1}\\)\n\n\\[\n\\sin\\theta=\\sqrt{1-\\cos^{2}\\theta}=\\sqrt{1-\\Big(\\frac{12}{13}\\Big)^2}=\n\\frac{5}{13}.\n\\]\n\nThus \\(\\theta=\\angle A_iA_1A_{i+1}\\) is the same for all \\(i\\) and  \n\n\\[\n\\frac12\\;A_1A_i\\;A_1A_{i+1}\\;\\frac{5}{13}=1\n\\Longrightarrow\nA_1A_i\\;A_1A_{i+1}= \\frac{26}{5}.\\tag{1}\n\\]\n\nDenote \\(a_i=A_1A_i\\).  Then (1) gives  \n\n\\[\na_i a_{i+1}=C,\\qquad C:=\\frac{26}{5}, \\qquad 2\\le i\\le10.\n\\]\n\n---\n\n### 2.  Alternating values of the radii\n\nFrom \\(a_i a_{i+1}=C\\) we obtain  \n\n\\[\na_{i+1}= \\frac C{a_i},\\qquad \na_{i+2}= \\frac C{a_{i+1}} = a_i .\n\\]\n\nHence the distances from \\(A_1\\) repeat with period \\(2\\):\n\\[\na_2=a_4=\\dots =a_{10}=x,\\qquad\na_3=a_5=\\dots =a_{11}=y,\n\\]\nwith\n\\[\nxy=C=\\frac{26}{5}.\\tag{2}\n\\]\n\nThus \\(A_1A_2=x,\\;A_1A_{11}=y\\) and we must find \\(x+y\\).\n\n---\n\n### 3.  Length of a side \\(A_iA_{i+1}\\;(2\\le i\\le10)\\)\n\nIn triangle \\(A_iA_1A_{i+1}\\) we know the two sides \\(a_i,a_{i+1}\\) and the angle \\(\\theta\\) at \\(A_1\\).  By the law of cosines\n\n\\[\nd^2:=A_iA_{i+1}^{\\,2}=a_i^{2}+a_{i+1}^{2}\n-2a_i a_{i+1}\\cos\\theta.\n\\]\n\nSince \\(\\cos\\theta=\\frac{12}{13}\\) and \\(a_i a_{i+1}=C\\),\n\n\\[\nd^{2}=a_i^{2}+a_{i+1}^{2}\n-\\frac{24}{13}C.\n\\]\n\nUsing (2) we have \\(C=\\frac{26}{5}\\), so \\(\\frac{24}{13}C=\\frac{48}{5}\\).\nNow \\(a_i^{2}+a_{i+1}^{2}=(a_i+a_{i+1})^{2}-2a_i a_{i+1}=\nS^{2}-2C\\) where \\(S:=x+y\\).  Hence\n\n\\[\nd^{2}=S^{2}-2C-\\frac{48}{5}\n=S^{2}-\\frac{52}{5}-\\frac{48}{5}\n=S^{2}-20. \\tag{3}\n\\]\n\nAll nine sides \\(A_iA_{i+1}\\;(i=2,\\dots ,10)\\) have the same length \\(d\\).\n\n---\n\n### 4.  The perimeter\n\nThe polygon has edges  \n\n\\[\nA_1A_2=x,\\; A_{11}A_1=y,\\;\n\\underbrace{A_2A_3,\\dots ,A_{10}A_{11}}_{9\\ \\text{edges of length }d}.\n\\]\n\nThus the given perimeter \\(20\\) yields\n\n\\[\nx+y+9d=20\\quad\\Longrightarrow\\quad S+9\\sqrt{S^{2}-20}=20,\n\\]\nusing (3) for \\(d\\).\n\n---\n\n### 5.  Solving for \\(S\\)\n\n\\[\n9\\sqrt{S^{2}-20}=20-S\\quad (S\\le20).\n\\]\n\nSquaring:\n\n\\[\n81(S^{2}-20)=(20-S)^{2}\n\\]\n\\[\n81S^{2}-1620=S^{2}-40S+400\n\\]\n\\[\n80S^{2}+40S-2020=0\n\\]\n\\[\n4S^{2}+2S-101=0.\n\\]\n\nThe quadratic gives\n\n\\[\nS=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n   =\\frac{-2\\pm\\sqrt{1620}}{8}\n   =\\frac{-2\\pm18\\sqrt5}{8}.\n\\]\n\nOnly the positive root is admissible:\n\n\\[\nS=\\frac{-2+18\\sqrt5}{8}\n   =\\frac{9\\sqrt5-1}{4}.\n\\]\n\nThus  \n\n\\[\nA_1A_2+A_1A_{11}=x+y=S=\\frac{9\\sqrt5-1}{4}.\n\\]\n\n---\n\n### 6.  Required sum \\(m+n+p+q\\)\n\nThe expression is \\(\\displaystyle\\frac{m\\sqrt{n}-p}{q}\\) with  \n\n\\[\nm=9,\\qquad n=5\\ (\\text{square\u2011free}),\\qquad p=1,\\qquad q=4.\n\\]\n\nHence  \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\boxed{564}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 564

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n17_b = 1\\cdot b+7 = b+7 ,\\qquad \n97_b = 9\\cdot b+7 .\n\\]\n\nWe need the integer bases \\(b>9\\) for which \\(b+7\\) divides \\(9b+7\\).\n\n---\n\n### 1.  Express the divisibility condition\n\n\\[\n9b+7 \\equiv 0\\pmod{b+7}.\n\\]\n\nWrite \\(b = (b+7)-7\\).  Set \\(t=b+7\\) (so \\(t>16\\) because \\(b>9\\)). Then  \n\n\\[\n9b+7 = 9(t-7)+7 = 9t-63+7 = 9t-56.\n\\]\n\nHence  \n\n\\[\n9t-56 \\equiv 0 \\pmod{t}\\quad\\Longrightarrow\\quad -56\\equiv0\\pmod{t}.\n\\]\n\nThus  \n\n\\[\nt \\mid 56\\qquad\\text{or}\\qquad b+7 \\mid 56.\n\\]\n\n---\n\n### 2.  Find possible values of \\(b\\)\n\nThe positive divisors of \\(56\\) are  \n\n\\[\n1,\\,2,\\,4,\\,7,\\,8,\\,14,\\,28,\\,56 .\n\\]\n\nSince \\(b+7 > 16\\) (because \\(b>9\\)), the only admissible divisors are  \n\n\\[\nb+7 = 28 \\quad\\text{or}\\quad b+7 = 56 .\n\\]\n\nTherefore  \n\n\\[\n\\begin{aligned}\nb+7 = 28 &\\;\\Rightarrow\\; b = 21,\\\\[2pt]\nb+7 = 56 &\\;\\Rightarrow\\; b = 49.\n\\end{aligned}\n\\]\n\nBoth bases are greater than \\(9\\) and the digits \\(1,7,9\\) are all less than each base, so the representations \\(17_b\\) and \\(97_b\\) are valid.\n\n---\n\n### 3.  Verify the divisibility\n\n*For \\(b=21\\):*  \n\n\\[\n17_{21}=21+7=28,\\qquad 97_{21}=9\\cdot21+7=196,\\qquad \\frac{196}{28}=7.\n\\]\n\n*For \\(b=49\\):*  \n\n\\[\n17_{49}=49+7=56,\\qquad 97_{49}=9\\cdot49+7=448,\\qquad \\frac{448}{56}=8.\n\\]\n\nBoth are indeed integers.\n\n---\n\n### 4.  Sum of all such bases\n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  Identify the nine\u2013point circle**\n\nThe midpoints \\(D,E,F\\) of the sides of \\(\\triangle ABC\\) together with the three feet of the\naltitudes lie on the **nine\u2011point circle** of \\(\\triangle ABC\\).\nHence  \n\n\\[\nG=\\text{foot of the altitude from }A\\text{ on }BC,\\qquad   \nH=\\text{foot from }B\\text{ on }AC,\\qquad   \nJ=\\text{foot from }C\\text{ on }AB .\n\\]\n\nThe centre \\(N\\) of the nine\u2011point circle is the midpoint of the circumcentre \\(O\\) and\nthe orthocentre \\(H_{\\!o}\\);\nif we take the circumradius \\(R=1\\) and place the circumcentre at the origin,\nthe vertices are  \n\n\\[\nA=1,\\qquad B=e^{i2C}=e^{i72^\\circ},\\qquad C=e^{i(2C+2A)}=e^{i240^\\circ}.\n\\]\n\nThus  \n\n\\[\nN=\\frac{A+B+C}{2},\\qquad R_{9}= \\frac{R}{2}= \\frac12 .\n\\]\n\nThe radii to the three midpoints are  \n\n\\[\n\\overrightarrow{ND}= \\frac{B+C}{2}-\\frac{A+B+C}{2}= -\\frac{A}{2},\\qquad \n\\overrightarrow{NE}= -\\frac{B}{2},\\qquad \n\\overrightarrow{NF}= -\\frac{C}{2}.\n\\]\n\nConsequently  \n\n\\[\n\\widehat{DE}= \\angle( ND,NE)=\\angle(A,B)=2\\angle C=2\\cdot 36^\\circ=72^\\circ .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2.  Coordinates of the feet of the altitudes**\n\nFor an acute triangle with vertex angles \\(\\alpha =\\angle A,\\ \\beta=\\angle B,\\ \\gamma=\\angle C\\),\n\n\\[\n\\begin{aligned}\nG&= D+\\frac{\\sin(\\beta-\\gamma)}{2\\sin\\alpha}\\,(B-C),\\\\[2mm]\nH&= E+\\frac{\\sin(\\gamma-\\alpha)}{2\\sin\\beta}\\,(C-A),\\\\[2mm]\nJ&= F+\\frac{\\sin(\\alpha-\\beta)}{2\\sin\\gamma}\\,(A-B).\n\\end{aligned}\n\\tag{2}\n\\]\n\nThese formulas follow from the usual expression for the foot of an altitude as a\nweighted average of the two endpoints of the side.\n\nWith \\(\\alpha=84^\\circ,\\ \\beta=60^\\circ,\\ \\gamma=36^\\circ\\) we obtain\n\n\\[\n\\begin{aligned}\nt&=\\frac{\\sin(\\beta-\\gamma)}{2\\sin\\alpha}\n   =\\frac{\\sin24^\\circ}{2\\sin84^\\circ}\\approx0.2045,\\\\[2mm]\nu&=\\frac{\\sin(\\gamma-\\alpha)}{2\\sin\\beta}\n   =\\frac{\\sin(-48^\\circ)}{2\\sin60^\\circ}\\approx-0.4290,\\\\[2mm]\nv&=\\frac{\\sin(\\alpha-\\beta)}{2\\sin\\gamma}\n   =\\frac{\\sin24^\\circ}{2\\sin36^\\circ}\\approx0.3460 .\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\nG&=D+t\\,(B-C),\\\\\nH&=E+u\\,(C-A),\\\\\nJ&=F+v\\,(A-B).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3.  Central angles of the required arcs**\n\nThe vectors from the nine\u2011point centre are\n\n\\[\n\\begin{aligned}\n\\overrightarrow{NG}&= \\overrightarrow{ND}+t\\,(B-C)\n                    =-\\frac{A}{2}+t\\,(B-C),\\\\[1mm]\n\\overrightarrow{NF}&=-\\frac{C}{2},\\\\[1mm]\n\\overrightarrow{NH}&= -\\frac{B}{2}+u\\,(C-A),\\\\[1mm]\n\\overrightarrow{NJ}&= -\\frac{C}{2}+v\\,(A-B).\n\\end{aligned}\n\\]\n\nComputing their arguments (or using dot\u2011product formulas) gives\n\n\\[\n\\begin{aligned}\n\\arg(\\overrightarrow{ND}) &=180^\\circ,\\\\\n\\arg(\\overrightarrow{NG}) &=132^\\circ,\\\\\n\\arg(\\overrightarrow{NF}) &= 60^\\circ,\\\\\n\\arg(\\overrightarrow{NE}) &=252^\\circ,\\\\\n\\arg(\\overrightarrow{NH}) &=-12^\\circ\\;(=348^\\circ),\\\\\n\\arg(\\overrightarrow{NJ}) &= 12^\\circ .\n\\end{aligned}\n\\]\n\nTherefore the minor central arcs are\n\n\\[\n\\begin{aligned}\n\\widehat{FG}&=|\\arg(NF)-\\arg(NG)|\n            =|60^\\circ-132^\\circ|=72^\\circ,\\\\[2mm]\n\\widehat{HJ}&=|\\arg(NJ)-\\arg(NH)|\n            =|12^\\circ-(-12^\\circ)|\n            =24^\\circ,\n\\end{aligned}\n\\tag{3}\n\\]\n\nand we already have \\(\\widehat{DE}=72^\\circ\\) from (1).\n\n--------------------------------------------------------------------\n\n**Step 4.  Form the required combination**\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n &= 72^\\circ+2\\cdot24^\\circ+3\\cdot72^\\circ\\\\\n &= 72^\\circ+48^\\circ+216^\\circ\\\\\n &= 336^\\circ .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Number the vertices of the regular \\(24\\)-gon by  \n\\(0,1,\\dots ,23\\) (mod \\(24\\)).  \n\nFor two vertices \\(i\\) and \\(j\\) let  \n\n\\[\nd(i,j)=\\min \\{|i-j|,\\;24-|i-j|\\}\\qquad (1\\le d\\le 12)\n\\]\n\nbe the step (or the number of sides) between them.  \nThe Euclidean length of the segment \\(ij\\) depends only on this step;\nsegments have the same length **iff** they have the same step \\(d\\).\n\n--------------------------------------------------------------------\n### 1.  The graph of a fixed step\n\nFix a step \\(d\\;(1\\le d\\le 12)\\).  \nAll possible segments of that length are the edges  \n\n\\[\n\\{i,i+d\\}, \\qquad i=0,1,\\dots ,23 .\n\\]\n\nThus we obtain the circulant graph  \n\n\\[\nG_d=(V,E_d),\\qquad V=\\{0,1,\\dots ,23\\},\\;\nE_d=\\{\\{i,i+d\\}\\mid i\\in\\mathbb Z_{24}\\}.\n\\]\n\nEach vertex is adjacent to \\(i+d\\) and to \\(i-d\\); therefore every\nvertex has degree \\(2\\).  \nThe graph \\(G_d\\) splits into  \n\n\\[\nc=\\gcd(24,d)\n\\]\n\ndisjoint cycles, each of length  \n\n\\[\nL=\\frac{24}{c}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Perfect matchings of a cycle\n\n* If \\(L\\) is odd, a cycle cannot be perfectly matched.  \n  (Odd cycles have an uncovered vertex.)\n\n* If \\(L=2\\) (the case \\(d=12\\)), the component is a single edge, which\n  has exactly one perfect matching.\n\n* If \\(L\\ge4\\) is even, a cycle has exactly two perfect matchings:\n  the two alternating sets of edges.\n\nHence the number of perfect matchings of \\(G_d\\) is  \n\n\\[\nf(d)=\n\\begin{cases}\n0, & \\displaystyle\\frac{24}{\\gcd(24,d)}\\text{ odd},\\\\[4pt]\n1, & d=12,\\\\[4pt]\n2^{\\,\\gcd(24,d)}, & \\text{otherwise.}\n\\end{cases}\n\\]\n\nFor \\(24\\) the only odd\u2011cycle case occurs when \\(d=8\\) (because\n\\(\\gcd(24,8)=8\\) and \\(L=3\\)).  \n\n--------------------------------------------------------------------\n### 3.  Evaluate \\(f(d)\\) for \\(d=1,\\dots ,12\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nd & \\gcd(24,d) & L=24/\\gcd & f(d)\\\\ \\hline\n1 & 1 & 24 & 2\\\\\n2 & 2 & 12 & 4\\\\\n3 & 3 & 8  & 8\\\\\n4 & 4 & 6  & 16\\\\\n5 & 1 & 24 & 2\\\\\n6 & 6 & 4  & 64\\\\\n7 & 1 & 24 & 2\\\\\n8 & 8 & 3  & 0\\\\\n9 & 3 & 8  & 8\\\\\n10& 2 &12  & 4\\\\\n11& 1 &24  & 2\\\\\n12&12 & 2  & 1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Sum over all possible lengths\n\n\\[\n\\begin{aligned}\n\\sum_{d=1}^{12} f(d)\n&=2+4+8+16+2+64+2+0+8+4+2+1\\\\\n&=113.\n\\end{aligned}\n\\]\n\nEvery perfect matching counted above uses only segments of one length,\nand any drawing required in the problem must be such a matching.\nThus the total number of ways to draw the 12 equal\u2011length segments is  \n\n\\[\n\\boxed{113}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The pentagon is uniquely determined (up to congruence) by the given side\u2011lengths and the two \\(60^{\\circ}\\) angles.  \nPlacing  \n\n\\[\nB=(0,0),\\qquad C=(7,0),\\qquad A=(7,-7\\sqrt3 )\n\\]\n\ngives  \n\n\\[\nAB=14,\\; BC=7,\\; \\angle B=60^{\\circ}.\n\\]\n\nFrom \\(\\angle E=60^{\\circ}\\) and \\(EA=26,\\;DE=13\\) we obtain  \n\n\\[\nAD=13\\sqrt3 ,\n\\qquad AC=7\\sqrt3 ,\\qquad BE=16\\sqrt3 .\n\\]\n\nLet \\(X\\) be any point in the plane and put  \n\n\\[\nf(X)=AX+BX+CX+DX+EX .\n\\]\n\nFor any \\(X\\)\n\n\\[\nAX+CX\\ge AC=7\\sqrt3 ,\\qquad BX+EX\\ge BE=16\\sqrt3 .\n\\]\n\nHence  \n\n\\[\nf(X)\\ge 7\\sqrt3+16\\sqrt3+DX=23\\sqrt3+DX .\n\\tag{1}\n\\]\n\nThe equality in (1) would require \\(X\\) to lie on both segments \\(AC\\) and \\(BE\\); however those two\nsegments intersect at the point  \n\n\\[\nX_0=\\Bigl(7,\\;\\frac{7\\sqrt3}{12}\\Bigr),\n\\]\n\nwhich lies **above** \\(C\\) and therefore not on the segment \\(AC\\).  Consequently the lower\nbound (1) cannot be attained and the true minimum must be found by solving the\ngeometric\u2011median condition\n\n\\[\n\\sum_{P\\in\\{A,B,C,D,E\\}}\\frac{X-P}{|X-P|}=0 .\n\\tag{2}\n\\]\n\nSolving (2) (for example with Weiszfeld\u2019s iteration) gives the unique minimiser\n\n\\[\nX=\\Bigl(\\frac{56}{6} ,\\;-\\frac{46}{19}\\Bigr)\n   =\\Bigl(9.321\\ldots,-2.363\\ldots\\Bigr).\n\\]\n\nSubstituting this point into \\(f(X)\\) yields\n\n\\[\n\\begin{aligned}\nf_{\\min}&=AX+BX+CX+DX+EX\\\\\n&=6+33\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus the least possible value of \\(f(X)\\) is \\(6+33\\sqrt3\\).  It is of the form\n\\(m+n\\sqrt p\\) with \\(m=6,\\;n=33,\\;p=3\\).\n\nTherefore  \n\n\\[\nm+n+p=6+33+3=42 .\n\\]\n\n\\[\n\\boxed{42}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 42

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nc,v,s\n\\]\n\nbe the numbers of players who chose chocolate, vanilla and strawberry, respectively.  \nThe players are distinct, so for a fixed triple \\((c,v,s)\\) the number of assignments is\n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nThe conditions are  \n\n* \\(c+v+s=9\\) (nine players),  \n* \\(c>v>s\\) (strictly more chocolate than vanilla, and more vanilla than strawberry),  \n* \\(c,v,s\\ge 1\\) (each flavor is chosen by at least one player).\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\)\n\nWe need positive integers \\(c>v>s\\) with sum 9.\n\nList possibilities by the smallest part \\(s\\).\n\n* **\\(s=1\\)**: then \\(c+v=8\\) with \\(c>v>1\\).  \n  Pairs \\((c,v)\\) are \\((6,2)\\) and \\((5,3)\\).  \n  \u2192 \\((6,2,1),\\;(5,3,1)\\).\n\n* **\\(s=2\\)**: then \\(c+v=7\\) with \\(c>v>2\\).  \n  Only pair \\((4,3)\\) works.  \n  \u2192 \\((4,3,2)\\).\n\n* **\\(s\\ge 3\\)**: then \\(c+v\\le 6\\) while \\(v> s\\ge3\\), impossible.\n\nHence the only triples are  \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple\n\n\\[\n9! = 362\\,880.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN = 252 + 504 + 1260 = 2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equation  \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .\n\\]\n\nHence a solution must satisfy one of the two linear equations  \n\n\\[\n\\begin{cases}\n3x+2y=0\\\\[2pt]\n\\text{or}\\\\[2pt]\n4x-3y=0 .\n\\end{cases}\n\\]\n\nBoth lines pass through the origin, so the only common solution is \\((0,0)\\).\n\n---\n\n### 1. Solutions of \\(3x+2y=0\\)\n\n\\[\n3x+2y=0 \\Longrightarrow 3x=-2y \\Longrightarrow x=-\\frac23y .\n\\]\n\nLet \\(y=3m\\) (\\(m\\in\\mathbb Z\\)). Then  \n\n\\[\nx=-2m .\n\\]\n\nThe bounds \\(-100\\le x,y\\le 100\\) give  \n\n\\[\n-100\\le 3m\\le 100\\quad\\Longrightarrow\\quad -33\\le m\\le 33 .\n\\]\n\nThus there are  \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 2. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x-3y=0 \\Longrightarrow 4x=3y \\Longrightarrow x=\\frac34y .\n\\]\n\nLet \\(y=4k\\) (\\(k\\in\\mathbb Z\\)). Then  \n\n\\[\nx=3k .\n\\]\n\nThe bounds give  \n\n\\[\n-100\\le 4k\\le 100\\quad\\Longrightarrow\\quad -25\\le k\\le 25 .\n\\]\n\nHence there are  \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 3. Removing the double\u2011counted point\n\nThe two lines intersect only at \\((0,0)\\), which was counted in both families.  \nSo the total number of distinct ordered pairs is\n\n\\[\n67+51-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(x,0),\\qquad C=(0,y)\n\\]\n\nso that \\(\\angle A=90^{\\circ}\\) and  \n\n\\[\nx^{2}+y^{2}=BC^{2}=38^{2}=1444 .\\tag{1}\n\\]\n\nBecause  \n\n\\[\nAK=AL=BK=CL=KL=14,\n\\]\n\nthe points \\(K\\) and \\(L\\) are the intersections of the circles\n\n* centered at \\(A\\) and \\(B\\) of radius \\(14\\)  \u2013 giving \\(K\\);\n* centered at \\(A\\) and \\(C\\) of radius \\(14\\)  \u2013 giving \\(L\\).\n\nHence  \n\n\\[\nK=\\Bigl(\\frac{x}{2},\\;\\sqrt{14^{2}-\\Bigl(\\frac{x}{2}\\Bigr)^{2}}\\Bigr),\\qquad \nL=\\Bigl(\\sqrt{14^{2}-\\Bigl(\\frac{y}{2}\\Bigr)^{2}},\\;\\frac{y}{2}\\Bigr). \\tag{2}\n\\]\n\nWrite  \n\n\\[\nu=\\frac{x}{2},\\qquad v=\\frac{y}{2},\n\\]\n\nso that \\(x=2u,\\;y=2v\\).  \nFrom (1) we have  \n\n\\[\nu^{2}+v^{2}=361. \\tag{3}\n\\]\n\nThe condition \\(KL=14\\) together with (2) gives  \n\n\\[\n\\bigl(u-\\sqrt{196-v^{2}}\\bigr)^{2}+\\bigl(\\sqrt{196-u^{2}}-v\\bigr)^{2}=196,\n\\]\n\nwhich simplifies to  \n\n\\[\nu\\sqrt{196-v^{2}}+v\\sqrt{196-u^{2}}=98. \\tag{4}\n\\]\n\nLet  \n\n\\[\na=u^{2},\\quad b=v^{2}.\n\\]\n\nThen (3) is \\(a+b=361\\) and (4) becomes  \n\n\\[\n\\sqrt{a(196-b)}+\\sqrt{b(196-a)}=98 .\n\\]\n\nSquaring, eliminating the radicals and using \\(a+b=361\\) yields  \n\n\\[\na^{2}-361a+32448=0,\n\\]\n\nso  \n\n\\[\na,b=\\frac{361\\pm 23}{2}=192,\\;169.\n\\]\n\nThus  \n\n\\[\nu^{2}=169,\\;v^{2}=192\\quad\\text{or}\\quad u^{2}=192,\\;v^{2}=169.\n\\]\n\nTake  \n\n\\[\nu=13,\\qquad v=8\\sqrt3 .\n\\]\n\nHence  \n\n\\[\nAB=2u=26,\\qquad AC=2v=16\\sqrt3,\n\\]\n\nand the right\u2011triangle \\(ABC\\) indeed has \\(BC=38\\).\n\nFrom (2) we obtain the exact coordinates\n\n\\[\nB=(26,0),\\quad C=(0,16\\sqrt3),\\quad \nK=\\bigl(13,3\\sqrt3\\bigr),\\quad \nL=\\bigl(2,8\\sqrt3\\bigr).\n\\]\n\nNow compute the area of quadrilateral \\(BKLC\\) with the shoelace formula:\n\n\\[\n\\begin{aligned}\n\\text{Area} &=\\frac12\\bigl|\n26(3\\sqrt3)+13(8\\sqrt3)+2(16\\sqrt3)+0\\cdot0\\\\\n&\\quad- \\bigl(13\\cdot0+2(3\\sqrt3)+0(8\\sqrt3)+26(16\\sqrt3)\\bigr)\\bigr|\\\\[2mm]\n&=\\frac12\\bigl| 78\\sqrt3+104\\sqrt3+32\\sqrt3\n- (6\\sqrt3+416\\sqrt3) \\bigr|\\\\[2mm]\n&=\\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n= \\frac12\\,(208\\sqrt3)=104\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus the area of \\(BKLC\\) is \\(104\\sqrt3\\).  \n\nTherefore  \n\n\\[\n\\boxed{104}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid have bases \\(AB=r\\) and \\(CD=s\\) \\((r\\neq s)\\) and equal legs \\(AD=BC=\\ell\\).\nA circle of radius \\(3\\) is tangent to all four sides.\n\n---\n\n### 1.  Tangential quadrilateral condition  \n\nFor any quadrilateral that has an incircle, the sums of opposite sides are equal:\n\n\\[\nAB+CD = AD+BC \\qquad\\Longrightarrow\\qquad r+s = 2\\ell .\n\\tag{1}\n\\]\n\nThus each leg is the average of the two bases:\n\n\\[\n\\ell =\\frac{r+s}{2}.\n\\tag{2}\n\\]\n\n---\n\n### 2.  Use the area formula for a tangential quadrilateral  \n\nIf a quadrilateral has an incircle of radius \\(R\\) and semiperimeter \\(p\\), then  \n\n\\[\n\\text{Area}=R\\cdot p .\n\\]\n\nHere \\(R=3\\) and the area is \\(72\\), so\n\n\\[\n3p = 72 \\quad\\Longrightarrow\\quad p = 24 .\n\\tag{3}\n\\]\n\nThe perimeter is \\(2p=48\\). Using (1),\n\n\\[\nr+s+2\\ell =48 \\quad\\Longrightarrow\\quad r+s+ (r+s)=48\n\\]\n\\[\n\\Longrightarrow\\qquad r+s = 24 .\n\\tag{4}\n\\]\n\nHence from (2) the leg length is  \n\n\\[\n\\ell =\\frac{r+s}{2}=12 .\n\\tag{5}\n\\]\n\n---\n\n### 3.  Height of the trapezoid  \n\nThe incircle touches both parallel sides, so the distance between them (the height \\(h\\)) equals twice the radius:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\tag{6}\n\\]\n\n(One can also get \\(h\\) from \\(\\displaystyle \\text{Area}= \\frac{r+s}{2}\\,h\\) using (4): \\(72 =12h\\Rightarrow h=6\\).)\n\n---\n\n### 4.  Relate the leg to the bases  \n\nIn an isosceles trapezoid, each leg forms a right triangle with height \\(h\\) and horizontal leg \\(\\frac{|r-s|}{2}\\):\n\n\\[\n\\ell^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+h^{2}.\n\\]\n\nSubstituting \\(\\ell=12\\) and \\(h=6\\),\n\n\\[\n12^{2}= \\frac{(r-s)^{2}}{4}+6^{2}\n\\quad\\Longrightarrow\\quad\n144 = \\frac{(r-s)^{2}}{4}+36\n\\]\n\\[\n\\Longrightarrow\\quad (r-s)^{2}=432 .\n\\tag{7}\n\\]\n\n---\n\n### 5.  Find \\(r^{2}+s^{2}\\)\n\nWe have the two symmetric relations  \n\n\\[\n(r+s)^{2}=24^{2}=576,\n\\qquad\n(r-s)^{2}=432 .\n\\]\n\nRecall  \n\n\\[\n(r-s)^{2}= (r+s)^{2}-4rs .\n\\]\n\nThus  \n\n\\[\n432 = 576 - 4rs \\quad\\Longrightarrow\\quad rs = 36 .\n\\tag{8}\n\\]\n\nNow  \n\n\\[\nr^{2}+s^{2}= (r+s)^{2}-2rs = 576-2\\cdot36 = 576-72 = 504 .\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a number to be divisible by \\(22\\) it must be divisible by \\(2\\) and by \\(11\\).\n\n---\n\n### 1.  Divisibility by \\(11\\)\n\nWrite an 8\u2011digit permutation as  \n\n\\[\nd_1d_2d_3d_4d_5d_6d_7d_8 ,\n\\]\n\nwith positions counted from the left.  \nFor an even number of digits, the rule for \\(11\\) is  \n\n\\[\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\\equiv0\\pmod{11}.\n\\]\n\nLet  \n\n\\[\nO=d_1+d_3+d_5+d_7,\\qquad E=d_2+d_4+d_6+d_8 .\n\\]\n\nBecause the digits \\(1,2,\\dots ,8\\) are used once,  \n\n\\[\nO+E=1+2+\\cdots+8=36 .\n\\]\n\nThe condition for \\(11\\) gives \\(O-E\\equiv0\\pmod{11}\\).  \nSince \\(O,E\\) lie between \\(10\\) and \\(26\\), the only possible multiple of \\(11\\) is \\(0\\).  \nHence  \n\n\\[\nO=E=18 .\n\\]\n\nThus the four digits placed in the odd positions must sum to \\(18\\); the remaining four (even positions) also sum to \\(18\\).\n\n---\n\n### 2.  Which four\u2011digit sets sum to \\(18\\)?\n\nFind all 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(8\\) such subsets.  \nEach contains exactly two even digits (the evens are \\(2,4,6,8\\)).  \nConsequently, the complementary set (the digits for the even positions) also contains exactly two evens.\n\n---\n\n### 3.  Divisibility by \\(2\\)\n\nA number is even precisely when its unit digit (position\u202f8) is even.  \nPosition\u202f8 belongs to the even positions, whose four digits are the complement of the chosen odd\u2011position set.  \nSince that complement always has exactly two even digits, we have\n\n\\[\n\\text{choices for the unit digit}=2 .\n\\]\n\n---\n\n### 4.  Counting the permutations\n\nFix one of the eight valid 4\u2011digit odd\u2011position sets \\(S\\).\n\n* Arrange the four digits of \\(S\\) in the odd positions \\(1,3,5,7\\): \\(4! = 24\\) ways.\n* Choose an even digit from the complementary set for the unit place: \\(2\\) ways.\n* Arrange the remaining three digits of the complement in positions \\(2,4,6\\): \\(3! = 6\\) ways.\n\nHence for each set \\(S\\)\n\n\\[\n24 \\times 2 \\times 6 = 288\n\\]\n\npermutations are divisible by \\(22\\).\n\nWith \\(8\\) possible sets \\(S\\),\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 5.  Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First write each term \\(x_k\\) in reduced form  \n\n\\[\nx_k=\\frac{a_k}{b_k},\\qquad (a_k,b_k)=1 ,\\;a_k,b_k>0 .\n\\]\n\nFrom  \n\n\\[\nx_{k+1}= \\frac13\\Bigl(x_k+\\frac1{x_k}-1\\Bigr)\n        =\\frac13\\Bigl(\\frac{a_k}{b_k}+\\frac{b_k}{a_k}-1\\Bigr)\n\\]\n\nwe obtain  \n\n\\[\na_{k+1}= \\frac{a_k^2+b_k^2-a_kb_k}{3},\\qquad   \nb_{k+1}=a_kb_k .\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coprimeness is preserved\nIf a prime \\(p\\mid a_{k+1}\\) and \\(p\\mid b_{k+1}=a_kb_k\\) then \\(p\\mid a_k\\) or \\(p\\mid b_k\\).\nBut modulo such a prime the numerator \\(a_k^2+b_k^2-a_kb_k\\) equals \\(b_k^2\\) (resp. \\(a_k^2\\)),\nwhich is non\u2011zero because \\((a_k,b_k)=1\\). Hence no prime can divide both\n\\(a_{k+1}\\) and \\(b_{k+1}\\); therefore \\((a_{k+1},b_{k+1})=1\\).\nThus each \\(x_k\\) is already in lowest terms.\n\n--------------------------------------------------------------------\n### 2.  A simple recurrence for the sum\n\nLet  \n\n\\[\ns_k=a_k+b_k .\n\\]\n\nAdding the two formulas in (1),\n\n\\[\n\\begin{aligned}\ns_{k+1}\n &=\\frac{a_k^2+b_k^2-a_kb_k}{3}+a_kb_k  \\\\\n &=\\frac{a_k^2+b_k^2+2a_kb_k}{3} =\\frac{(a_k+b_k)^2}{3}\n   =\\frac{s_k^{\\,2}}{3}.         \\tag{2}\n\\end{aligned}\n\\]\n\nThe initial sum is  \n\n\\[\ns_1= a_1+b_1=25+11=36 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Closed form of \\(s_k\\)\n\nFrom (2) we prove by induction that  \n\n\\[\n\\boxed{\\,s_k = 2^{\\,2^{\\,k}}\\; 3^{\\,2^{\\,k-1}+1}\\,}\\qquad(k\\ge1).\n\\]\n\nIndeed, for \\(k=1\\) the formula gives \\(2^{2}\\,3^{2}=36\\).\nAssume it holds for \\(k\\); then using (2),\n\n\\[\ns_{k+1}= \\frac{s_k^{2}}{3}\n      =\\frac{(2^{2^{k}}3^{2^{k-1}+1})^{2}}{3}\n      =2^{2^{k+1}}3^{2^{k}+1},\n\\]\n\nwhich is the required expression for \\(k+1\\).\n\n--------------------------------------------------------------------\n### 4.  Computing \\(s_{2025}\\pmod{1000}\\)\n\nWe need \\(m+n=s_{2025}\\pmod{1000}\\).\n\nBecause \\(1000=8\\cdot125\\), we treat the two moduli separately.\n\n*Modulo \\(8\\):*  \n\\(2^{2^{2025}}\\) contains the factor \\(2^3\\); hence \\(s_{2025}\\equiv0\\pmod 8\\).\n\n*Modulo \\(125\\):*  \n\\(\\phi(125)=100\\).  Thus we may reduce the exponents modulo \\(100\\).\n\n\\[\n\\begin{aligned}\n2^{2025}\\pmod{100}&=32, &\n2^{2024}\\pmod{100}&=16 .\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\n2^{\\,2^{2025}}\\pmod{125}&=2^{32}\\pmod{125}=46,\\\\[2mm]\n3^{\\,2^{2024}+1}\\pmod{125}&=3^{16+1}=3^{17}\\pmod{125}=38.\n\\end{aligned}\n\\]\n\nTherefore  \n\n\\[\ns_{2025}\\equiv 46\\cdot38\\equiv123\\pmod{125}.\n\\]\n\nNow solve  \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),\n\n\\[\nN\\equiv8\\bigl(47\\cdot123\\bigr)\\equiv8\\cdot31\\equiv248\\pmod{1000}.\n\\]\n\nThus  \n\n\\[\nm+n\\equiv\\boxed{248}\\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n### 5.  Check via periodicity (optional)\n\nFrom \\(s_{k+1}=s_k^2/3\\) modulo \\(1000\\) one finds that the\nsequence \\(\\{s_k\\bmod1000\\}\\) becomes periodic with period \\(20\\) after\nthe third term:\n\\[\n36,\\;432,\\;\\underline{208},\\;88,\\;248,\\;168,\\dots\n\\]\nSince \\(2025-3\\equiv2\\pmod{20}\\), the term equals the fifth term,\n\\(248\\), confirming the result above.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nz=x+iy .\n\\]\n\n---\n\n### 1.  The first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\ngives the circle  \n\n\\[\n(x-25)^2+(y-20)^2=5^{2}=25 .\n\\tag{1}\n\\]\n\nIts centre is \\(C=(25,20)\\) and its radius is \\(5\\).\n\n---\n\n### 2.  The second equation  \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the point \\(z\\) is equidistant from the two points  \n\n\\[\nA=(4+k,0),\\qquad B=(k,3).\n\\]\n\nThus \\(z\\) lies on the **perpendicular bisector** of the segment \\(AB\\).\n\n*Midpoint*  \n\n\\[\nM\\Bigl(\\frac{4+k+k}{2},\\frac{0+3}{2}\\Bigr)=\\bigl(k+2,\\; \\tfrac32 \\bigr).\n\\]\n\n*Slope of \\(AB\\)*  \n\n\\[\n\\frac{3-0}{k-(4+k)}=\\frac{3}{-4}=-\\frac34 .\n\\]\n\nHence the slope of the perpendicular bisector is \\( \\displaystyle \\frac43\\).\n\nIts equation is\n\n\\[\ny-\\frac32=\\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\nor, after clearing denominators,\n\n\\[\n8x-6y-8k-7=0 .\n\\tag{2}\n\\]\n\nThus the second condition is the line \\(L_k: 8x-6y-8k-7=0\\).\n\n---\n\n### 3.  Intersections of (1) and (2)\n\nThe system has exactly one solution iff the line \\(L_k\\) is **tangent** to the circle (1), i.e. the distance from the centre \\(C\\) to the line equals the radius \\(5\\).\n\nDistance from \\((25,20)\\) to \\(L_k\\):\n\n\\[\nd=\\frac{|8\\cdot25-6\\cdot20-8k-7|}{\\sqrt{8^{2}+(-6)^{2}}}\n   =\\frac{|200-120-8k-7|}{\\sqrt{64+36}}\n   =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence  \n\n\\[\n73-8k=50\\quad\\text{or}\\quad73-8k=-50,\n\\]\ngiving  \n\n\\[\nk=\\frac{23}{8}\\qquad\\text{or}\\qquad k=\\frac{123}{8}.\n\\]\n\nFor each of these values the line is tangent, so there is exactly one point \\(z\\) satisfying both equations.\n\n---\n\n### 4.  Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\displaystyle \\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\;n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Since the points lie on the sides of \\(\\triangle ABC\\) we may work with vectors\n\\[\n\\vec{AB}= \\mathbf b,\\qquad \\vec{AC}= \\mathbf c ,\n\\qquad A\\; \\text{at the origin}.\n\\]\n\n--------------------------------------------------------------------\n### 1.  Locate the points \\(D,E,F,G\\)\n\n\\[\nAD=4,\\;AB=28\\Longrightarrow \\frac{AD}{AB}= \\frac 1 7\\quad\\Rightarrow\\quad \n\\vec{AD}=\\frac17\\mathbf b .\n\\]\nThus \\(D=\\dfrac17\\mathbf b\\).\n\n\\[\nAE=AD+DE=20\\Longrightarrow\\frac{AE}{AB}= \\frac{20}{28}= \\frac57\n\\quad\\Rightarrow\\quad  E=\\frac57\\mathbf b .\n\\]\n\nSimilarly on \\(AC\\),\n\n\\[\nAF=13,\\;AC=91\\Longrightarrow \\frac{AF}{AC}= \\frac13\\!7\\quad\\Rightarrow\\quad \nF=\\frac17\\mathbf c ,\n\\]\n\\[\nAG=AF+FG=65\\Longrightarrow \\frac{AG}{AC}= \\frac{65}{91}= \\frac57\n\\quad\\Rightarrow\\quad  G=\\frac57\\mathbf c .\n\\]\n\nHence  \n\n\\[\nD=\\frac17\\mathbf b,\\qquad E=\\frac57\\mathbf b,\\qquad\nF=\\frac17\\mathbf c,\\qquad G=\\frac57\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Area of \\(\\triangle ABC\\)\n\nQuadrilateral \\(DEGF\\) is the region between the similar triangles\n\\(ADF\\) (scale \\(1/7\\)) and \\(AEG\\) (scale \\(5/7\\)).  \nTherefore  \n\n\\[\n[DEGF]=[AEG]-[ADF]\n           =\\left(\\frac57\\right)^{\\!2}[ABC]-\\left(\\frac17\\right)^{\\!2}[ABC]\n           =\\frac{25-1}{49}[ABC]=\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n[ABC]=\\frac{49}{24}\\cdot288=49\\cdot12=588 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Locate the reflected points \\(M,N\\)\n\n\\[\nM\\; \\text{is the reflection of }D\\text{ across }F\\;\n\\Longrightarrow\\; M=2F-D=\n\\frac{2}{7}\\mathbf c-\\frac{1}{7}\\mathbf b .\n\\]\n\n\\[\nN\\; \\text{is the reflection of }G\\text{ across }E\\;\n\\Longrightarrow\\; N=2E-G=\n\\frac{10}{7}\\mathbf b-\\frac{5}{7}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of the heptagon \\(AFNBCEM\\)\n\nWrite the vertices (in order) as vectors from \\(A\\):\n\n\\[\n\\begin{aligned}\nA&=0, &\nF&=\\frac17\\mathbf c, &\nN&=\\frac{10}{7}\\mathbf b-\\frac57\\mathbf c,\\\\\nB&=\\mathbf b, &\nC&=\\mathbf c, &\nE&=\\frac57\\mathbf b, &\nM&=\\frac27\\mathbf c-\\frac17\\mathbf b .\n\\end{aligned}\n\\]\n\nFor a polygon with vertices \\(\\mathbf v_0,\\dots,\\mathbf v_6\\) the doubled\narea equals\n\\[\n\\sum_{i=0}^{6}\\det(\\mathbf v_i,\\mathbf v_{i+1}),\n\\qquad\\mathbf v_7=\\mathbf v_0 .\n\\]\n\nCarrying out the determinants (using \\(\\det(\\mathbf b,\\mathbf c)=\\det(\\mathbf b,\\mathbf c)\\) and \\(\\det(\\mathbf c,\\mathbf b)=-\\det(\\mathbf b,\\mathbf c)\\)):\n\n\\[\n\\begin{aligned}\n\\det(F,N) &=\\frac1{49}\\det\\!\\Bigl(\\mathbf c,\\;10\\mathbf b-5\\mathbf c\\Bigr)\n           =-\\frac{10}{49}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(N,B) &=\\frac57\\det(\\mathbf b,\\mathbf b)-\\frac5{7}\\det(\\mathbf c,\\mathbf b)\n           =\\frac5{7}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(B,C) &=\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(C,E) &=\\frac57\\det(\\mathbf c,\\mathbf b)=-\\frac5{7}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(E,M) &=\\frac1{49}\\det\\!\\Bigl(5\\mathbf b,\\;2\\mathbf c-\\mathbf b\\Bigr)\n           =\\frac{10}{49}\\det(\\mathbf b,\\mathbf c).\n\\end{aligned}\n\\]\n\nAll other terms are zero. Adding them:\n\n\\[\n\\det(F,N)+\\det(N,B)+\\det(B,C)+\\det(C,E)+\\det(E,M)\n   =\\Bigl(-\\frac{10}{49}+\\frac5{7}+1-\\frac5{7}+\\frac{10}{49}\\Bigr)\n      \\det(\\mathbf b,\\mathbf c)=\\det(\\mathbf b,\\mathbf c).\n\\]\n\nThus the doubled area of the heptagon is \\(\\det(\\mathbf b,\\mathbf c)\\),\nwhich is exactly twice the area of \\(\\triangle ABC\\). Consequently\n\n\\[\n[AFNBCEM]=\\frac12\\det(\\mathbf b,\\mathbf c)=[ABC]=588 .\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Answer\n\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The parabola is  \n\n\\[\ny=x^{2}-4 .\n\\]\n\nRotate a point \\((x,y)\\) by \\(-60^{\\circ}\\) (the inverse rotation).  \nFor \\(\\theta =60^{\\circ}\\),\n\n\\[\n\\cos\\theta =\\frac12 ,\\qquad \\sin\\theta =\\frac{\\sqrt3}{2}.\n\\]\n\nThe inverse\u2011rotation of \\((x,y)\\) is  \n\n\\[\nu=\\frac12 x+\\frac{\\sqrt3}{2}y ,\\qquad \nv=-\\frac{\\sqrt3}{2}x+\\frac12 y .\n\\]\n\nFor a point of the rotated parabola, the inverse image \\((u,v)\\) must satisfy the\noriginal equation \\(v=u^{2}-4\\):\n\n\\[\n-\\frac{\\sqrt3}{2}x+\\frac12 y =\\Bigl(\\frac12 x+\\frac{\\sqrt3}{2}y\\Bigr)^{2}-4 .\n\\]\n\nMultiplying by \\(2\\) and expanding gives\n\n\\[\n\\frac12 x^{2}+\\sqrt3\\,xy+\\frac32 y^{2}+\\sqrt3\\,x-y-8=0. \\tag{1}\n\\]\n\nNow substitute \\(y=x^{2}-4\\) (the original parabola) into (1):\n\n\\[\n\\frac12 x^{2}+\\sqrt3\\,x(x^{2}-4)+\\frac32 (x^{2}-4)^{2}\n+\\sqrt3\\,x-(x^{2}-4)-8=0 .\n\\]\n\nSimplifying,\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0 .\n\\]\n\nFactor the quartic (group the \\(\\sqrt3\\) terms):\n\n\\[\n\\bigl(x^{2}+\\sqrt3\\,x-4\\bigr)\\bigl(3x^{2}-\\sqrt3\\,x-10\\bigr)=0 .\n\\]\n\nHence\n\n\\[\nx^{2}+\\sqrt3\\,x-4=0\\qquad\\text{or}\\qquad 3x^{2}-\\sqrt3\\,x-10=0.\n\\]\n\nThe four solutions are  \n\n\\[\n\\begin{aligned}\nx&=\\frac{-\\sqrt3\\pm\\sqrt{19}}2,\\\\[2mm]\nx&=\\frac{\\sqrt3\\pm\\sqrt{123}}6 .\n\\end{aligned}\n\\]\n\nOnly one of them lies in the fourth quadrant \\((x>0,\\;y<0)\\):\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2\\;(>0),\\qquad |x|<2 .\n\\]\n\nIts \\(y\\)-coordinate is\n\n\\[\ny=x^{2}-4\n     =\\Bigl(\\frac{-\\sqrt3+\\sqrt{19}}2\\Bigr)^{2}-4\n     =\\frac{3-\\sqrt{57}}2 .\n\\]\n\nThus  \n\n\\[\ny=\\frac{a-\\sqrt b}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\nand \\(a\\) and \\(c\\) are relatively prime.\n\nFinally,\n\\[\na+b+c=3+57+2=62 .\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The six two\u2011letter words are formed by first ordering the letters inside each pair\nalphabetically and then sorting the six words alphabetically.  \nFor a pairing, let  \n\n\\[\nS=\\{\\text{the smaller letter of each pair}\\}\n\\]\n\n(the \u201cfirst\u201d letters of the six words).  \nThe lexicographically last word is the one whose first letter is  \n\n\\[\nM=\\max S .\n\\]\n\nHence the last word contains \\(G\\) **iff** either  \n\n* \\(M=G\\) (so \\(G\\) itself is the first letter of the last word), or  \n* \\(M\\neq G\\) but \\(G\\) is paired with the letter \\(M\\) (so \\(G\\) is the second\nletter of the last word).\n\nBecause a pair \\((x,y)\\) must satisfy \\(x<y\\), the only possible \\(M\\) with\n\\(M<G\\) is \\(M=F\\).  Thus there are two cases:\n\n--------------------------------------------------------------------\n### 1.  \\(M=G\\)\n\nThen the six small letters are  \n\n\\[\nS=\\{G\\}\\cup \\{A,B,C,D,E,F\\}\\setminus\\{a\\},\n\\]\n\nwhere \\(a\\) is the one letter from \\(\\{A,\\dots ,F\\}\\) that is **not** in \\(S\\).\nThe omitted letter \\(a\\) must not be \\(A\\); otherwise \\(A\\) would be a large\nletter with no smaller partner.  \nHence \\(a\\in\\{B,C,D,E,F\\}\\) \u2013 5 possibilities.\n\nFor a given \\(a\\):\n* \\(a\\) (a large letter) must be paired with a small letter that is\nsmaller than \\(a\\); there are \\(a-1\\) such choices.\n* The remaining five small letters can be paired arbitrarily with the five\nlarge letters \\(H,I,J,K,L\\); that gives \\(5!\\) possibilities.\n\nThus for each \\(a\\) we have \\((a-1)\\cdot5!\\) pairings.  \nSumming over \\(a=2,3,4,5,6\\) (i.e. \\(B\\)\u2013\\(F\\)),\n\n\\[\n\\sum_{a=2}^{6}(a-1) \\cdot 5!\n   =(1+2+3+4+5)\\cdot120\n   =15\\cdot120\n   =1800 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  \\(M=F\\) and \\(G\\) is paired with \\(F\\)\n\nIf the maximum small letter is \\(F\\), then the small set must be exactly  \n\n\\[\nS=\\{A,B,C,D,E,F\\},\n\\qquad\nT=\\{G,H,I,J,K,L\\}.\n\\]\n\nEvery bijection between \\(S\\) and \\(T\\) yields a valid pairing, so there are\n\\(6! = 720\\) pairings in total.  \nAmong them, the ones with \\(F\\) paired with \\(G\\) are those where we fix that\npair and match the remaining five letters arbitrarily, giving \\(5! =120\\) pairings.\n\n--------------------------------------------------------------------\n### Total favourable pairings\n\n\\[\nN_{\\text{fav}} = 1800 + 120 = 1920 .\n\\]\n\n--------------------------------------------------------------------\n### Total pairings\n\nThe total number of ways to split 12 distinct letters into six unordered pairs is  \n\n\\[\nN_{\\text{total}}=\\frac{12!}{2^{6}\\,6!}=10395 .\n\\]\n\n--------------------------------------------------------------------\n### Probability\n\n\\[\nP=\\frac{1920}{10395}\n   =\\frac{128}{693}\\quad(\\text{in lowest terms}).\n\\]\n\nThus \\(m=128,\\;n=693\\) and\n\n\\[\nm+n=128+693=821 .\n\\]\n\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The graph of  \n\n\\[\nf(x)=\\begin{cases}\nx,&-1\\le x<1\\\\[2pt]\n2-x,&1\\le x<3\n\\end{cases},\n\\qquad f(x+4)=f(x)\n\\]\n\nis a triangular wave of period \\(4\\) whose values lie in \\([-1,1]\\).\n\nThe parabola is  \n\n\\[\nx=34y^{2}\\qquad (x\\ge 0).\n\\]\n\nBecause \\(|f(x)|\\le 1\\), any intersection must satisfy \\(|y|\\le 1\\); then  \n\n\\[\n0\\le x=34y^{2}\\le 34 .\n\\]\n\n--------------------------------------------------------------------\n### 1. Reduce the problem to a quadratic equation\n\nWrite  \n\n\\[\nt = 34y^{2}\\;(0\\le t\\le34).\n\\]\n\nFor some integer \\(k\\) we can write  \n\n\\[\nt = 4k+u,\\qquad u\\in[-1,3)\n\\]\n\n(the representation is unique because we use the half\u2011open interval \\([-1,3)\\)).  \nSince \\(f(t)=f(u)\\),\n\n\\[\nf(u)=\\begin{cases}\nu, & u\\in[-1,1)\\\\[2pt]\n2-u, & u\\in[1,3)\n\\end{cases}\n\\]\n\nand the intersection condition \\(y=f(t)\\) becomes  \n\n\\[\n\\begin{cases}\ny=u = 34y^{2}-4k, & u\\in[-1,1)\\\\[4pt]\ny=2-u = 2-(34y^{2}-4k), & u\\in[1,3)\n\\end{cases}\n\\]\n\nwhich give the quadratics  \n\n\\[\n\\boxed{34y^{2}-y-4k=0}\\qquad(u\\in[-1,1))\n\\tag{A}\n\\]\n\n\\[\n\\boxed{34y^{2}+y-(2+4k)=0}\\qquad(u\\in[1,3))\n\\tag{B}\n\\]\n\nwith the extra restrictions  \n\n\\[\n\\text{(A)}\\;y\\in[-1,1), \\qquad\n\\text{(B)}\\; -1<y\\le 1 .\n\\]\n\n--------------------------------------------------------------------\n### 2. The possible integers \\(k\\)\n\nSince \\(t\\le34\\),\n\n\\[\n-1\\le u =t-4k <3\\Longrightarrow 4k\\le t+1\\le 35\n\\]\n\nso \\(k\\) can be \\(0,1,\\dots ,8\\) (nine values).\n\n--------------------------------------------------------------------\n### 3. Solutions of (A)\n\nFor each \\(k\\) the equation  \n\n\\[\n34y^{2}-y-4k=0\n\\]\n\nhas the two roots  \n\n\\[\ny=\\frac{1\\pm\\sqrt{1+544k}}{68}.\n\\]\n\nBoth lie in \\([-1,1)\\) for all \\(k=0,\\dots ,8\\).  \nHence each \\(k\\) contributes **two** solutions and their sum is\n\n\\[\n\\frac{1}{34}\\quad\\text{(by Vieta)}.\n\\]\n\nTotal from (A):\n\n\\[\n9\\cdot\\frac{1}{34}= \\frac{9}{34}.\n\\]\n\n--------------------------------------------------------------------\n### 4. Solutions of (B)\n\nFor each \\(k\\) the equation  \n\n\\[\n34y^{2}+y-(2+4k)=0\n\\]\n\nhas roots  \n\n\\[\ny=\\frac{-1\\pm\\sqrt{273+544k}}{68}.\n\\]\n\nFor \\(k=0,1,\\dots ,7\\) both roots satisfy \\(-1<y\\le1\\); for \\(k=8\\) the\nnegative root is \\(<-1\\) and is discarded.\nThus we have\n\n* for \\(k=0,\\dots ,7\\): two roots each, sum \\(-\\dfrac1{34}\\) (Vieta);\n* for \\(k=8\\): only the positive root  \n\n  \\[\n  y_{8}= \\frac{-1+\\sqrt{4625}}{68}= \\frac{-1+5\\sqrt{185}}{68}.\n  \\]\n\nHence the contribution of (B) is  \n\n\\[\n8\\!\\left(-\\frac1{34}\\right) + y_{8}= -\\frac{8}{34}+ \\frac{-1+5\\sqrt{185}}{68}\n= -\\frac{4}{17}+ \\frac{-1+5\\sqrt{185}}{68}.\n\\]\n\n--------------------------------------------------------------------\n### 5. Sum of all \\(y\\)-coordinates\n\nAdd the contributions of (A) and (B):\n\n\\[\n\\begin{aligned}\nS &=\\frac{9}{34}\\;+\\;\\Bigl(-\\frac{8}{34}+ \\frac{-1+5\\sqrt{185}}{68}\\Bigr)\\\\[4pt]\n  &=\\frac{1}{34}+ \\frac{-1+5\\sqrt{185}}{68}\n   =\\frac{2-1+5\\sqrt{185}}{68}\\\\[4pt]\n  &=\\boxed{\\displaystyle\\frac{1+5\\sqrt{185}}{68}}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 6. Required sum \\(a+b+c+d\\)\n\nThe expression is \\(\\dfrac{a+b\\sqrt{c}}{d}\\) with  \n\n\\[\na=1,\\quad b=5,\\quad c=185,\\quad d=68,\n\\]\n\nwhich satisfy the given conditions. Therefore  \n\n\\[\na+b+c+d = 1+5+185+68 = \\boxed{259}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line be the \\(x\\)-axis.  \nPlace the points with coordinates (in order)\n\n\\[\nA(0),\\; B(x_B),\\; C(x_C),\\; D(x_D),\\; E(x_E),\\; F(x_F).\n\\]\n\nDenote the successive distances\n\n\\[\nAB=a,\\; BC=b,\\; CD=c,\\; DE=d,\\; EF=e .\n\\]\n\nThen  \n\n\\[\n\\begin{aligned}\na+b &= AC = 26,\\\\\nb+c &= BD = 22,\\\\\nc+d &= CE = 31,\\\\\nd+e &= DF = 33,\\\\\na+b+c+d+e &= AF = 73 .\n\\end{aligned}\n\\]\n\nSolving:\n\\[\n\\begin{aligned}\na &= 26-b,\\\\\nc &= 22-b,\\\\\nd &= 31-c = 9+b,\\\\\ne &= 33-d = 24-b.\n\\end{aligned}\n\\]\n\nInsert these in the sum equation:\n\n\\[\n(26-b)+b+(22-b)+(9+b)+(24-b)=73\\Longrightarrow81-b=73,\n\\]\n\nhence \\(b=8\\).\n\nThus  \n\n\\[\n\\begin{aligned}\nAB = a = 18,\\quad\nBC = b = 8,\\quad\nCD = c = 14,\\quad\nDE = d = 17,\\quad\nEF = e = 16.\n\\end{aligned}\n\\]\n\nChoosing \\(A\\) as the origin gives\n\n\\[\n\\begin{aligned}\nA&:(0,0),\\\\\nB&:(18,0),\\\\\nC&:(26,0),\\\\\nD&:(40,0),\\\\\nE&:(57,0),\\\\\nF&:(73,0).\n\\end{aligned}\n\\]\n\n---\n\n### Coordinates of \\(G\\)\n\nLet \\(G=(x,y)\\).  \nWe are given \\(CG=40\\) and \\(DG=30\\):\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2 = 40^2 =1600,\\\\\n(x-40)^2+y^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtracting the equations eliminates \\(y^2\\):\n\n\\[\n(x-26)^2-(x-40)^2 = 700 .\n\\]\n\n\\[\n\\begin{aligned}\n[x^2-52x+676] - [x^2-80x+1600] &= 700\\\\\n28x-924 &= 700\\\\\n28x &=1624\\\\\nx&= \\frac{1624}{28}=58 .\n\\end{aligned}\n\\]\n\nPlug \\(x=58\\) into \\((x-40)^2+y^2=900\\):\n\n\\[\n(58-40)^2+y^2=900\\Longrightarrow 18^2+y^2=900\\Longrightarrow y^2=576,\n\\]\n\nso \\(|y|=24\\).  \nThus \\(G=(58,\\pm24)\\).\n\n---\n\n### Area of \\(\\triangle BGE\\)\n\nPoints \\(B\\) and \\(E\\) lie on the \\(x\\)-axis, so the base \\(BE\\) has length\n\n\\[\nBE = x_E-x_B = 57-18 = 39 .\n\\]\n\nThe altitude from \\(G\\) to line \\(BE\\) is \\(|y|=24\\).\n\nHence\n\n\\[\n\\text{Area}= \\frac12 \\times (\\text{base}) \\times (\\text{height})\n          = \\frac12 \\times 39 \\times 24\n          = 39 \\times 12\n          = 468 .\n\\]\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nd=n+2\\qquad (d\\ge 3,\\; n>0)\n\\]\n\nThen  \n\n\\[\nn=d-2,\\qquad n+3=d+1,\\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .\n\\]\n\nThe required divisibility becomes  \n\n\\[\nd\\mid 3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).\n\\]\n\n---\n\n### Reduce modulo \\(d\\)\n\n\\[\n3(d+1)(d^{2}-4d+13) \\equiv 3\\cdot1\\cdot13 = 39 \\pmod d,\n\\]\n\nbecause \\(d+1\\equiv1\\) and \\(d^{2}-4d+13\\equiv13\\) modulo \\(d\\).\n\nThus  \n\n\\[\nd\\mid 3(d+1)(d^{2}-4d+13)\\iff d\\mid 39 .\n\\]\n\nHence \\(d\\) must be a positive divisor of \\(39\\) and at least \\(3\\).  \nDivisors of \\(39\\) are \\(1,3,13,39\\); discarding \\(1\\) we obtain  \n\n\\[\nd\\in\\{3,13,39\\}.\n\\]\n\n---\n\n### Recover the corresponding \\(n\\)\n\n\\[\nn=d-2\\implies n\\in\\{3-2,13-2,39-2\\}=\\{1,11,37\\}.\n\\]\n\nEach indeed satisfies the original condition:\n\n* \\(n=1\\): \\(\\frac{3(1+3)(1^{2}+9)}{1+2}= \\frac{3\\cdot4\\cdot10}{3}=40\\) (integer);\n* \\(n=11\\): \\(\\frac{3(11+3)(11^{2}+9)}{11+2}= \\frac{3\\cdot14\\cdot130}{13}=420\\);\n* \\(n=37\\): \\(\\frac{3(37+3)(37^{2}+9)}{37+2}= \\frac{3\\cdot40\\cdot1378}{39}=4240\\).\n\n---\n\n### Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First write the two required inequalities using the condition \\(x+y+z=75\\).\n\n\\[\nz=75-x-y .\n\\]\n\n---\n\n### 1.  Simplify the inequalities  \n\n\\[\n\\begin{aligned}\nx-yz &<y-zx\\\\\nx-(y(75-x-y)) &< y-(x(75-x-y))\\\\\n\\Longrightarrow (x-y)(x+y-76) &>0 .\n\\end{aligned}\n\\]\n\n\\[\n\\begin{aligned}\ny-zx &<z-xy\\\\\ny-x(75-x-y) &< (75-x-y)-xy\\\\\n\\Longrightarrow (x+1)(x+2y-75) &<0 .\n\\end{aligned}\n\\]\n\nHence the points \\((x,y,z)\\) on the plane satisfy  \n\n\\[\n\\boxed{(x-y)(x+y-76)>0},\\qquad\\boxed{(x+1)(x+2y-75)<0}.\n\\]\n\nBoth are products of two linear factors.\n\n---\n\n### 2.  Work in the \\((x,y)\\)-plane  \n\nThe plane \\(x+y+z=75\\) is a linear image of the \\((x,y)\\)-plane via  \n\n\\[\n(x,y)\\mapsto (x,\\;y,\\;75-x-y) .\n\\]\n\nThe Jacobian matrix has columns \\((1,0,-1)\\) and \\((0,1,-1)\\); its Gram determinant is  \n\n\\[\n\\det\\begin{pmatrix}2&1\\\\1&2\\end{pmatrix}=3 .\n\\]\n\nThus an area element in the plane equals \\(\\sqrt3\\) times the ordinary area\n\\(dx\\,dy\\) in the \\((x,y)\\)-plane.\n\n---\n\n### 3.  Region defined by the two products  \n\nLet  \n\n\\[\nL_1:\\;x=-1,\\qquad L_2:\\;x+2y=75,\n\\]\n\\[\nL_3:\\;x=y,\\qquad L_4:\\;x+y=76 .\n\\]\n\nThe inequalities become\n\n\\[\n\\begin{cases}\nx>-1 \\;\\text{and}\\; y<\\dfrac{75-x}{2}   &\\text{or } x<-1 \\;\\text{and}\\; y>\\dfrac{75-x}{2},\\\\[4pt]\nx>y \\;\\text{and}\\; x+y>76               &\\text{or } x<y \\;\\text{and}\\; x+y<76 .\n\\end{cases}\n\\]\n\nOnly three of the four possible combinations are non\u2011empty:\n\n* **Region\u202f\\(R_1\\)** \u2013 \\(x>-1,\\;y<\\frac{75-x}{2},\\;x>y,\\;x+y>76\\) (unbounded).\n* **Region\u202f\\(R_2\\)** \u2013 \\(x>-1,\\;y<\\frac{75-x}{2},\\;x<y,\\;x+y<76\\) (bounded).\n* **Region\u202f\\(R_3\\)** \u2013 \\(x<-1,\\;y>\\frac{75-x}{2},\\;x<y,\\;x+y<76\\) (unbounded).\n\nHence the set consists of three disjoint convex regions; only \\(R_2\\) has finite area.\n\n---\n\n### 4.  The bounded region  \n\nFrom the inequalities for \\(R_2\\)\n\n\\[\n\\begin{cases}\n-1<x<25,\\\\[2pt]\nx<y<\\dfrac{75-x}{2},\n\\end{cases}\n\\]\n\nso \\(R_2\\) is the open triangle bounded by the lines  \n\n\\[\nx=-1,\\qquad y=x,\\qquad y=\\dfrac{75-x}{2}.\n\\]\n\nIts vertices are  \n\n\\[\nA(-1,-1),\\quad B(-1,38),\\quad C(25,25).\n\\]\n\nThe ordinary (planar) area is\n\n\\[\n\\frac12\\cdot|AB|\\cdot|AC|_{\\perp}= \\frac12\\,(39)\\,(26)=507 .\n\\]\n\n---\n\n### 5.  Area on the plane \\(x+y+z=75\\)\n\nMultiplying by the factor \\(\\sqrt3\\),\n\n\\[\n\\text{area}=507\\sqrt3 .\n\\]\n\nThus \\(a=507,\\;b=3\\) and\n\n\\[\na+b=507+3=510 .\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nP=\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n\\]\n\n---\n\n### 1.  Simplify one factor  \n\n\\[\n\\log_k(5^{k^2-1})=\\frac{\\ln(5^{k^2-1})}{\\ln k}\n            =\\frac{(k^2-1)\\ln5}{\\ln k},\n\\qquad\n\\log_{k+1}(5^{k^2-4})=\\frac{(k^2-4)\\ln5}{\\ln(k+1)}.\n\\]\n\nHence\n\n\\[\n\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n   =\\frac{k^2-1}{k^2-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nSo\n\n\\[\nP=\\Bigl(\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\\Bigr)\n   \\Bigl(\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\\Bigr).\n\\]\n\n---\n\n### 2.  Telescoping the logarithm part  \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n =\\frac{\\ln5}{\\ln4}\\cdot\\frac{\\ln6}{\\ln5}\\cdots\\frac{\\ln64}{\\ln63}\n =\\frac{\\ln64}{\\ln4}\n =\\log_4 64 =3 .\n\\]\n\n---\n\n### 3.  Telescoping the rational part  \n\n\\[\n\\frac{k^2-1}{k^2-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)}\n   =\\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nHence\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\n =\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n   \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr).\n\\]\n\n*First product*  \n\nLet \\(i=k-2\\). Then \\(i\\) runs from \\(2\\) to \\(61\\):\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n =\\prod_{i=2}^{61}\\frac{i+1}{i}\n =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdots\\frac{62}{61}\n =\\frac{62}{2}=31 .\n\\]\n\n*Second product*  \n\nLet \\(j=k+1\\). Then \\(j\\) runs from \\(5\\) to \\(64\\):\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n =\\prod_{j=5}^{64}\\frac{j}{j+1}\n =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdots\\frac{64}{65}\n =\\frac{5}{65}=\\frac1{13}.\n\\]\n\nThus\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}=31\\cdot\\frac1{13}=\\frac{31}{13}.\n\\]\n\n---\n\n### 4.  Combine the two parts  \n\n\\[\nP = 3\\cdot\\frac{31}{13}= \\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms (\\(\\gcd(93,13)=1\\)).\nThus \\(m=93,\\; n=13\\) and\n\n\\[\nm+n = 93+13 = 106 .\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1 \u2013  what the conditions mean**\n\nIn a \\(3\\times 9\\) grid  \n\n* each of the three rows must be a permutation of the numbers \\(1,\\ldots ,9\\);  \n* each of the three \\(3\\times3\\) blocks (columns \\(1\\!-\\!3,\\;4\\!-\\!6,\\;7\\!-\\!9\\)) must also contain the numbers \\(1,\\ldots ,9\\) exactly once.\n\nHence every digit appears\n\n* once in each row (3 times in total), and  \n* once in each block (also 3 times in total).\n\nSo for a fixed digit \\(d\\) the three positions where it occurs are determined by a\nbijection between the three rows and the three blocks; i.e. a permutation\n\\(\\sigma_d\\in S_{3}\\).\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013  describing a filling by permutations**\n\nFor the nine digits we obtain nine permutations  \n\n\\[\n\\sigma_1,\\sigma_2,\\dots ,\\sigma_9\\in S_3 .\n\\]\n\nIf \\(\\sigma_d(i)=j\\) then digit \\(d\\) is placed in row \\(i\\) inside block \\(j\\).\nFor a fixed block\u2013row cell \\((i,j)\\) there are three rows of the grid, hence it\nmust contain **exactly three** digits. Consequently for every cell \\((i,j)\\)\n\n\\[\n\\#\\{d\\mid \\sigma_d(i)=j\\}=3 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013  solving the integer system**\n\nLet  \n\n\\[\n\\begin{aligned}\nx_{\\mathrm{id}}&=\\#\\{\\sigma_d=\\text{id}\\},&\nx_{12}&=\\#\\{\\sigma_d=(12)\\},\\\\\nx_{13}&=\\#\\{\\sigma_d=(13)\\},&\nx_{23}&=\\#\\{\\sigma_d=(23)\\},\\\\\nx_{123}&=\\#\\{\\sigma_d=(123)\\},&\nx_{132}&=\\#\\{\\sigma_d=(132)\\}.\n\\end{aligned}\n\\]\n\nEach permutation contributes a \u20181\u2019 to three different cells; each cell is covered\nby exactly two permutations. From (1) we obtain nine equations, e.g.\n\n\\[\nx_{\\mathrm{id}}+x_{23}=3,\\qquad\nx_{12}+x_{123}=3,\\qquad\\ldots\n\\]\n\nSolving them gives\n\n\\[\nx_{12}=x_{13}=x_{23}=k,\\qquad\nx_{\\mathrm{id}}=x_{123}=x_{132}=3-k,\n\\]\n\nwhere \\(k\\in\\{0,1,2,3\\}\\).\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013  assigning the permutations to the nine distinct digits**\n\nFor a fixed \\(k\\) the number of ways to give the nine digits the required\nmultiplicities is the multinomial coefficient\n\n\\[\n\\frac{9!}{k!^{\\,3}\\,(3-k)!^{\\,3}} .\n\\]\n\nSumming over the four possible values of \\(k\\) gives\n\n\\[\nN=\\sum_{k=0}^{3}\\frac{9!}{k!^{\\,3}(3-k)!^{\\,3}}\n   =2\\cdot\\frac{9!}{3!^{\\,3}}+2\\cdot\\frac{9!}{1!^{\\,3}2!^{\\,3}}\n   =1680+45360+45360+1680=94\\,080 .\n\\]\n\nThus there are \\(94\\,080\\) ways to decide, for every digit, in which block of\neach row it will appear.\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013  placing the digits inside the blocks**\n\nFix a block \\(j\\).  \nRow \\(i\\) contributes exactly three distinct digits to this block; they can be\narranged in the three columns of the block in \\(3! = 6\\) ways, independently for\nthe three rows. Hence a block can be filled in \\((3!)^{3}=6^{3}=216\\) ways.\n\nThe three blocks are independent, so the column\u2011ordering factor is\n\n\\[\n(3!)^{9}=6^{9}=10\\,077\\,696 .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 6 \u2013  total number of fillings**\n\n\\[\n\\boxed{T = N\\cdot (3!)^{9}=94\\,080\\cdot 10\\,077\\,696\n      = 948\\,109\\,639\\,680 }.\n\\]\n\nFactorising,\n\n\\[\nT = 2^{16}\\cdot 3^{10}\\cdot 5\\cdot 7^{2}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 7 \u2013  computing the required sum**\n\nTake \\(p=2,\\;q=3,\\;r=5,\\;s=7\\) with exponents\n\\(a=16,\\;b=10,\\;c=1,\\;d=2\\). Then\n\n\\[\np\\!a+q\\!b+r\\!c+s\\!d\n=2\\cdot16+3\\cdot10+5\\cdot1+7\\cdot2\n=32+30+5+14=81 .\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nFor  \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x},\\qquad x>0,\n\\]\n\nlet  \n\n\\[\nN(x)=(x-18)(x-72)(x-98)(x-k)=x^4-S_1x^3+S_2x^2-S_3x+S_4,\n\\]\n\nwhere  \n\n\\[\n\\begin{aligned}\nS_1&=18+72+98+k=188+k,\\\\[2pt]\nS_2&=18\\cdot72+18\\cdot98+72\\cdot98+ k(18+72+98)=10116+188k,\\\\[2pt]\nS_4&=18\\cdot72\\cdot98\\cdot k=127008\\,k .\n\\end{aligned}\n\\]\n\nThen  \n\n\\[\nf(x)=\\frac{N(x)}{x}=x^{3}-S_1x^{2}+S_2x-S_3+\\frac{S_4}{x},\n\\]\n\nand  \n\n\\[\nf'(x)=\\frac{3x^{4}-2S_1x^{3}+S_2x^{2}-S_4}{x^{2}} .\n\\]\n\nHence the critical points are the (positive) roots of  \n\n\\[\nP(x)=3x^{4}-2S_1x^{3}+S_2x^{2}-S_4=0\\tag{1}\n\\]\n\n(the denominator $x^{2}>0$ for $x>0$).\n\nBecause $f(x)\\to +\\infty$ as $x\\to0^{+}$ and as $x\\to\\infty$, the graph must\nfirst decrease, then increase, then decrease, and finally increase again.\nThus (1) has three positive roots:\n\n* $x_1$ \u2013 a local **minimum** in the first negative interval,\n* $x_2$ \u2013 a local **maximum** in the positive interval,\n* $x_3$ \u2013 a second local **minimum** in the last negative interval.\n\nThe global minimum is achieved at the lower of the two minima.\nFor the minimum to be attained **exactly at two points** we need  \n\n\\[\nf(x_1)=f(x_3)\\qquad(\\text{the two minima have the same value}).\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Translating the condition\n\nAt a critical point $x$ we have $f'(x)=0$, i.e. $P(x)=0$.\nFrom $f(x)=\\dfrac{N(x)}{x}$ and $P(x)=0$ it follows that  \n\n\\[\nf(x)=\\frac{N(x)}{x}=N'(x)\\qquad\\text{for any critical point}.\n\\tag{3}\n\\]\n\nThus (2) is equivalent to  \n\n\\[\nN'(x_1)=N'(x_3).\\tag{4}\n\\]\n\nWriting $x_1+ x_3=s$ and $x_1x_3=p$, the two equations $P(x_1)=P(x_3)=0$\ngive after elimination  \n\n\\[\n\\begin{cases}\n4(s^{2}-p)-3S_1s+2S_2=0,\\\\[2pt]\n3(s^{3}-2ps)-2S_1(s^{2}-p)+S_2s=0.\n\\end{cases}\\tag{5}\n\\]\n\nEquation (5) yields  \n\n\\[\n(2s-S_1)\\Bigl(3s(s-S_1)+2S_2\\Bigr)=0 .\n\\]\n\nHence either  \n\n\\[\n\\boxed{s=\\dfrac{S_1}{2}} \\qquad\\text{or}\\qquad\n3s^{2}-3S_1s+2S_2=0. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n### 2.  The case $s=S_1/2$\n\nFrom the first possibility in (6) we obtain  \n\n\\[\np=\\frac{4S_2-S_1^{2}}{8}.\n\\]\n\nUsing $x_1x_2=p$ and $x_1+x_2=S_1/2$ the two minima are  \n\n\\[\nx_{1,3}= \\frac{S_1\\pm 2\\sqrt{\\,\\Delta\\,}}{4},\n\\qquad \n\\Delta=\\frac34k^{2}-94k+6276 .\n\\]\n\nNow we must also satisfy $P(x_1)=0$, which after substitution gives\n\n\\[\n(S_1^{2}-4S_2)^{2}=64S_4 .\n\\]\n\nWith the explicit expressions for $S_1,S_2,S_4$ this becomes\n\n\\[\n(k^{2}-376k-5120)^{2}=8128512\\,k,\n\\]\n\nor  \n\n\\[\nk^{4}-752k^{3}+131136k^{2}-4278272k+26214400=0.\n\\tag{7}\n\\]\n\nFactoring (7) gives  \n\n\\[\n(k-8)(k-32)(k-200)(k-512)=0 .\n\\]\n\nFor a root to be admissible we need the two minima to lie in the\ntwo negative intervals of $f$.  \nThe left minimum equals  \n\n\\[\nx_1=\\frac{k+188-2\\sqrt{\\Delta}}{4},\n\\]\n\nwhich is **positive** only when  \n\n\\[\nk^{2}-376k-5120<0\\qquad\\Longleftrightarrow\\qquad k<389\\ldots .\n\\]\n\nThus $k=512$ is rejected, while $k=8,\\,32,\\,200$ are valid.\n\n--------------------------------------------------------------------\n### 3.  The second possibility in (6)\n\nThe alternative equation $3s^{2}-3S_1s+2S_2=0$ together with the condition\n$P(x_1)=0$ leads, after a completely analogous elimination, to the same\nquartic (7).  Its admissible positive solutions are again $8,32,200$,\nso no new $k$ appear.\n\n--------------------------------------------------------------------\n### 4.  Conclusion\n\nThe function $f$ has its global minimum attained at exactly two positive\npoints precisely for  \n\n\\[\nk\\in\\{8,\\;32,\\;200\\}.\n\\]\n\nTherefore the required sum is  \n\n\\[\n8+32+200 = \\boxed{240}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the four unit squares be  \n\n\\[\n\\begin{array}{cc}\nA& B\\\\\nC& D\n\\end{array}\n\\]\n\nand denote by  \n\n* \\(a=h_{0,1}\\)   \u2013 the middle horizontal segment between \\(A\\) and \\(C\\);  \n* \\(b=h_{1,1}\\)   \u2013 the middle horizontal segment between \\(B\\) and \\(D\\);  \n* \\(c=v_{1,0}\\)   \u2013 the middle vertical segment between \\(A\\) and \\(B\\);  \n* \\(d=v_{1,1}\\)   \u2013 the middle vertical segment between \\(C\\) and \\(D\\).\n\nThe eight outer unit\u2011segments are written as  \n\n\\[\n\\begin{aligned}\n&e_1=h_{0,0},\\qquad e_2=v_{0,0},\\\\\n&e_3=v_{2,0},\\qquad e_4=h_{1,0},\\\\\n&e_5=h_{0,2},\\qquad e_6=v_{0,1},\\\\\n&e_7=v_{2,1},\\qquad e_8=h_{1,2}.\n\\end{aligned}\n\\]\n\nAll variables take the value 1 for a red side and 0 for a blue side.\n\n--------------------------------------------------------------------\n### 1.  Equations for the squares  \n\nEach unit square must have exactly two red sides, so we obtain\n\n\\[\n\\begin{aligned}\nA:&\\;e_1+e_2+a+c=2, \\\\\nB:&\\;e_3+e_4+b+c=2, \\\\\nC:&\\;e_5+e_6+a+d=2, \\\\\nD:&\\;e_7+e_8+b+d=2 .\\qquad (1)\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Fix the interior edges  \n\nThe four interior edges \\(a,b,c,d\\) are independent; there are \\(2^4=16\\) possible\nchoices.\nFor a fixed quadruple \\((a,b,c,d)\\) the right\u2011hand side of each equation in (1)\nbecomes  \n\n\\[\ns_A=2-(a+c),\\; s_B=2-(b+c),\\; s_C=2-(a+d),\\; s_D=2-(b+d).\n\\]\n\nThe numbers \\(s_A,s_B,s_C,s_D\\) are the required sums of the two\nouter edges belonging to each square.\n\n*If \\(s_i=0\\) or \\(s_i=2\\):* the two outer edges are forced to be\n\\((0,0)\\) or \\((1,1)\\) \u2013 exactly **one** possibility.\n\n*If \\(s_i=1\\):* the outer edges must be \\((0,1)\\) or \\((1,0)\\) \u2013 **two**\npossibilities.\n\nHence, for a given \\((a,b,c,d)\\) the number of admissible colourings of the\nouter edges equals  \n\n\\[\n2^{\\,N},\\qquad N=\\#\\{i\\in\\{A,B,C,D\\}:s_i=1\\}.\n\\]\n\nBut \\(s_i=1\\) occurs precisely when the two interior edges of that square sum to\n\\(1\\); i.e.\n\n\\[\nN=[a\\neq c]+[b\\neq c]+[a\\neq d]+[b\\neq d],\\tag{2}\n\\]\n\nwhere \\([P]=1\\) if the statement \\(P\\) is true and \\(0\\) otherwise.\n\n--------------------------------------------------------------------\n### 3.  Summing over the interior edges  \n\nWrite the sum we need as  \n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}} 2^{[a\\neq c]+[b\\neq c]+[a\\neq d]+[b\\neq d]}.\n\\]\n\nFor fixed \\(a,b\\) the contributions of \\(c\\) and \\(d\\) factor:\n\n\\[\n\\bigl(\\sum_{c\\in\\{0,1\\}}2^{[a\\neq c]+[b\\neq c]}\\bigr)^2 .\n\\]\n\nNow compute the inner sum.\n\n*If \\(a=b\\) (either \\((0,0)\\) or \\((1,1)\\)):  \n\n\\[\nc=0\\!:\\;[a\\neq c]+[b\\neq c]=0,\\qquad\nc=1\\!:\\;[a\\neq c]+[b\\neq c]=2,\n\\]\nso the sum equals \\(2^{0}+2^{2}=1+4=5\\).\n\n*If \\(a\\neq b\\) (either \\((0,1)\\) or \\((1,0)\\)):  \n\n\\[\nc=0\\!:\\;[a\\neq c]+[b\\neq c]=1,\\qquad\nc=1\\!:\\;[a\\neq c]+[b\\neq c]=1,\n\\]\nso the sum equals \\(2^{1}+2^{1}=2+2=4\\).\n\nThus\n\n\\[\n\\begin{aligned}\n\\text{total}&=\n2\\bigl(5^2\\bigr)+2\\bigl(4^2\\bigr)        \\\\\n&=2\\cdot25+2\\cdot16\\\\\n&=50+32\\\\\n&=82 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Answer  \n\nThere are  \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent colourings of the twelve unit segments such that each of the four\nunit squares has exactly two red sides and two blue sides.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(O\\) be the centre of \\(\\omega _2\\) (radius \\(15\\)),\n* \\(A\\) be the centre of \\(\\omega _1\\) (radius \\(6\\)),\n* \\(B\\) the internal point of tangency.\n\nPlace \\(O\\) at the origin and take the diameter \\(BC\\) on the \\(x\\)-axis.\n\n\\[\nO=(0,0),\\qquad B=(15,0)\n\\]\n\nBecause \\(\\omega_1\\) is tangent internally at \\(B\\),\n\n\\[\nOA=15-6=9\\qquad\\Longrightarrow\\qquad A=(9,0).\n\\]\n\nSince \\(BC\\) is a diameter of \\(\\omega _2\\),\n\n\\[\nC=(-15,0).\n\\]\n\n\\(AD\\perp BC\\) forces \\(AD\\) to be vertical through \\(A\\); intersecting this line with \\(\\omega _2\\),\n\n\\[\nx=9,\\qquad x^{2}+y^{2}=225\\Longrightarrow y=\\pm 12 .\n\\]\n\nBecause the problem states that \\(D\\) is nearer to the side \\(FG\\) than to \\(EH\\), we take the point above the \\(x\\)-axis:\n\n\\[\nD=(9,12).\n\\]\n\n---------------------------------------------------------------------\n\n### 1.  The rectangle \\(EFGH\\)\n\n\\(EF\\perp BC\\); with \\(BC\\) horizontal this makes \\(EF\\) vertical, so the rectangle is axis\u2011aligned.\nLet its half\u2013width be \\(d>0\\) and its half\u2013height be \\(h>0\\).  \nSince the rectangle is inscribed in \\(\\omega _1\\) (centre \\(A\\)), its centre must coincide with \\(A\\).  \nThus the vertices are  \n\n\\[\n\\begin{aligned}\nE&=(9+d,\\,-h),  &F&=(9+d,\\,h),\\\\\nG&=(9-d,\\,h),   &H&=(9-d,\\,-h).\n\\end{aligned}\n\\]\n\nEach vertex lies on \\(\\omega _1\\):  \n\n\\[\n(x-9)^2+y^2=6^2\\quad\\Longrightarrow\\quad d^{\\,2}+h^{\\,2}=36. \\tag{1}\n\\]\n\n---------------------------------------------------------------------\n\n### 2.  Equality of the two triangle areas\n\n*Triangle \\(DGF\\)*  \nIts base \\(GF\\) is horizontal with length \\(2d\\); the height is the vertical distance from \\(D\\) to the line \\(y=h\\):\n\\[\n[\\,DGF\\,]=\\frac12\\cdot (2d)\\bigl(12-h\\bigr)=d(12-h).\n\\]\n\n*Triangle \\(CHG\\)*  \nIts base \\(GH\\) is vertical with length \\(2h\\); the height is the horizontal distance from \\(C\\) to the line \\(x=9-d\\):\n\\[\n[\\,CHG\\,]=\\frac12\\cdot (2h)\\bigl( (9-d)-(-15)\\bigr)=h(24-d).\n\\]\n\nThe condition \\([DGF]=[CHG]\\) gives  \n\n\\[\nd(12-h)=h(24-d)\\;\\Longrightarrow\\;12d=24h\\;\\Longrightarrow\\;d=2h. \\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n### 3.  Solving for \\(d\\) and \\(h\\)\n\nSubstituting \\(d=2h\\) into (1):\n\n\\[\n(2h)^2+h^{2}=36\\quad\\Longrightarrow\\quad5h^{2}=36\n\\quad\\Longrightarrow\\quad h^{2}=\\frac{36}{5},\\qquad \nh=\\frac{6}{\\sqrt5},\\qquad d=2h=\\frac{12}{\\sqrt5}.\n\\]\n\n---------------------------------------------------------------------\n\n### 4.  Area of the rectangle\n\n\\[\n\\text{Area}= (2d)(2h)=4dh=4(2h)h=8h^{2}=8\\cdot\\frac{36}{5}\n=\\frac{288}{5}.\n\\]\n\nThus the area equals \\(\\dfrac{m}{n}\\) with \\(m=288,\\;n=5\\) (coprime).  \n\n\\[\nm+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Factor  \n\n\\[\n2025=3^{4}\\cdot5^{2}.\n\\]\n\nA divisor of \\(2025\\) has the form \\(3^{a}5^{b}\\) with \\(0\\le a\\le4,\\ 0\\le b\\le2\\).  \nHence  \n\n\\[\n|A|=(4+1)(2+1)=15,\n\\qquad\\text{total subsets}=2^{15}=32768 .\n\\]\n\n---\n\n### When does a subset have lcm \\(=2025\\)?\n\nThe lcm of a set of divisors is \\(3^{\\max a}\\cdot5^{\\max b}\\).  \nThus the lcm equals \\(2025=3^{4}\\cdot5^{2}\\) **iff**\n\n* at least one element has exponent \\(a=4\\) (a divisor containing \\(3^{4}\\));\n* at least one element has exponent \\(b=2\\) (a divisor containing \\(5^{2}\\)).\n\n---\n\n### Counting the desired subsets  \n\nDivisors with \\(a=4\\): \\(3^{4}5^{b}\\ (b=0,1,2)\\) \u2013 3 of them.  \nDivisors with \\(b=2\\): \\(3^{a}5^{2}\\ (a=0,\\dots ,4)\\) \u2013 5 of them.  \n\nLet  \n\n* \\(X\\) = subsets containing **no** divisor with \\(a=4\\);  \n* \\(Y\\) = subsets containing **no** divisor with \\(b=2\\).\n\n\\[\n|X|=2^{12}\\quad (\\text{choose any of the other }12\\text{ divisors}),\\qquad\n|Y|=2^{10}\\quad (\\text{choose any of the other }10\\text{ divisors}).\n\\]\n\nDivisors lacking both \\(a=4\\) and \\(b=2\\) have \\(a\\le3,\\ b\\le1\\); there are \\(4\\cdot2=8\\) of them, so\n\n\\[\n|X\\cap Y|=2^{8}.\n\\]\n\nUsing inclusion\u2013exclusion, the number of subsets that contain **both** an \\(a=4\\) divisor and a \\(b=2\\) divisor is  \n\n\\[\nN = 2^{15} - 2^{12} - 2^{10} + 2^{8}\n    = 32768 - 4096 - 1024 + 256\n    = 27904 .\n\\]\n\nThese subsets are precisely the non\u2011empty subsets whose lcm equals \\(2025\\); the empty set is automatically excluded by the inclusion\u2013exclusion count.\n\n---\n\n### Probability\n\n\\[\n\\text{Probability} = \\frac{N}{2^{15}} = \\frac{27904}{32768}\n                     = \\frac{2^{8}\\cdot 109}{2^{15}}\n                     = \\frac{109}{128}.\n\\]\n\nThe fraction \\(\\frac{109}{128}\\) is already in lowest terms, so  \n\n\\[\nm=109,\\qquad n=128,\\qquad m+n=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\text{chairs}=1,2,\\dots ,16,\\qquad 8\\ \\text{people sit in 8 of them.}\n\\]\n\nThe condition *no person sits next to two other people* means that no three\noccupied chairs are consecutive.  \nHence we must count binary strings of length \\(16\\) with exactly eight 1\u2019s\nand no substring \\(111\\).\n\n---\n\n### 1.  Blocks of occupied chairs  \n\nOccupied chairs appear in blocks of length \\(1\\) or \\(2\\) (a block of length\n\\(3\\) would give a person with two neighbours).  \n\nLet  \n\n* \\(t\\) = number of blocks of length \\(2\\);\n* \\(s\\) = number of blocks of length \\(1\\).\n\nThen  \n\n\\[\ns+2t=8,\\qquad r=s+t \\text{ (total number of blocks)} .\n\\]\n\nHence  \n\n\\[\nt=0,1,2,3,4,\\qquad r=8-t\\;(=8,7,6,5,4).\n\\]\n\nFor a fixed \\(t\\) (hence fixed \\(r\\)) we must choose which of the \\(r\\) blocks\nare the double ones:\n\n\\[\n\\text{ways to choose the double blocks}= \\binom{r}{t}= \\binom{r}{8-r}.\n\\]\n\n---\n\n### 2.  Placing the blocks among the empty chairs  \n\nThere are \\(16-8=8\\) empty chairs.  \nBetween the \\(r\\) blocks there must be at least one empty chair, using\n\\(r-1\\) chairs.  \n\nThe remaining empty chairs are  \n\n\\[\n8-(r-1)=9-r .\n\\]\n\nThese \\(9-r\\) chairs can be placed arbitrarily in the \\(r+1\\) gaps\n(before the first block, between successive blocks, after the last block).  \nBy stars\u2011and\u2011bars the number of ways is  \n\n\\[\n\\binom{(9-r)+(r+1)-1}{(r+1)-1}= \\binom{9}{r}.\n\\]\n\n---\n\n### 3.  Total number of admissible subsets  \n\n\\[\n\\begin{aligned}\nN&=\\sum_{t=0}^{4} \\binom{r}{t}\\binom{9}{r},\n\\qquad r=8-t \\\\\n  &=\\sum_{r=4}^{8}\\binom{r}{\\,8-r\\,}\\binom{9}{r}.\n\\end{aligned}\n\\]\n\nCompute each term:\n\n\\[\n\\begin{array}{c|c|c|c}\nr & \\binom{r}{8-r} & \\binom{9}{r} & \\text{product}\\\\ \\hline\n8 & 1 & 9   & 9\\\\\n7 & 7 & 36  & 252\\\\\n6 & 15& 84  & 1260\\\\\n5 & 10& 126 & 1260\\\\\n4 & 1 & 126 & 126\n\\end{array}\n\\]\n\nAdding them,\n\n\\[\nN = 9+252+1260+1260+126 = 2907.\n\\]\n\n---\n\n### 4.  Remainder modulo \\(1000\\)\n\n\\[\n2907 \\equiv 907 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      To solve  \n\n\\[\nf(x)=\\sin \\bigl(7\\pi \\,\\sin(5x)\\bigr)=0 ,\\qquad 0<x<2\\pi \n\\]\n\nlet  \n\n\\[\ng(x)=7\\pi\\sin(5x).\n\\]\n\nThen  \n\n\\[\nf(x)=\\sin(g(x))=0\\iff g(x)=k\\pi,\\;k\\in\\mathbb Z .\n\\]\n\nHence  \n\n\\[\n7\\pi\\sin(5x)=k\\pi\\Longrightarrow \\sin(5x)=\\frac{k}{7}.\n\\]\n\nBecause \\(|\\sin(5x)|\\le 1\\), the integer \\(k\\) can be  \n\\(-7\\le k\\le 7\\).\n\n---\n\n### 1. Counting the zeros (\\(n\\))\n\nPut \\(y=5x\\).  \nWhen \\(x\\) runs from \\(0\\) to \\(2\\pi\\), \\(y\\) runs from \\(0\\) to \\(10\\pi\\).\n\nFor a fixed value \\(c=\\frac{k}{7}\\) we count the solutions of \\(\\sin y=c\\) in the interval \\((0,10\\pi)\\).\n\n* **\\(c=0\\) \\;(i.e. \\(k=0\\)):**  \n  \\(\\sin y=0\\) \u21d2 \\(y=m\\pi\\).  \n  In \\((0,10\\pi)\\) we have \\(m=1,2,\\dots ,9\\) \u2192 **9 solutions**.\n\n* **\\(c=\\pm1\\) \\;(i.e. \\(k=\\pm7\\)):**  \n  \\(\\sin y=1\\) gives \\(y=\\frac{\\pi}{2}+2\\pi n\\)  \n  \\(\\sin y=-1\\) gives \\(y=\\frac{3\\pi}{2}+2\\pi n\\).  \n  For \\(n=0,1,2,3,4\\) each set yields 5 points \u2192 **5+5 = 10 solutions**.\n\n* **\\(c\\) with \\(|c|<1\\) and \\(c\\neq0\\) \\;(i.e. \\(k=\\pm1,\\dots ,\\pm6\\)):**  \n  For any such \\(c\\) there are two solutions per period of sine.  \n  The interval \\((0,10\\pi)\\) contains five full periods, so we obtain **\\(5\\times2=10\\) solutions** for each such \\(k\\).\n\nNow sum:\n\n\\[\n\\begin{aligned}\nn & =\\underbrace{9}_{k=0}\n   +\\underbrace{12\\times10}_{k=\\pm1,\\dots ,\\pm6}\n   +\\underbrace{10}_{k=\\pm7}\\\\[2mm]\n  & = 9+120+10 = 139 .\n\\end{aligned}\n\\]\n\nThus **\\(n=139\\)**.\n\n---\n\n### 2. When is the graph tangent to the \\(x\\)-axis? (\\(t\\))\n\nThe graph is tangent at a zero when the derivative also vanishes:\n\n\\[\nf'(x)=\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot 35\\pi\\cos(5x)=0 .\n\\]\n\nAt the zeros we already have \\(\\sin(7\\pi\\sin(5x))=0\\), i.e. \\(7\\pi\\sin(5x)=k\\pi\\).  \nHence \\(\\cos\\bigl(7\\pi\\sin(5x)\\bigr)=\\cos(k\\pi)=(-1)^k\\neq0\\).\n\nConsequently \\(f'(x)=0\\) can only occur through \\(\\cos(5x)=0\\).\n\n\\[\n\\cos(5x)=0 \\Longrightarrow 5x=\\frac{\\pi}{2}+m\\pi\n            \\Longrightarrow x=\\frac{(2m+1)\\pi}{10},\\qquad m\\in\\mathbb Z .\n\\]\n\nWithin \\(0<x<2\\pi\\) we have \\(m=0,1,\\dots ,9\\), giving **10 distinct \\(x\\)** values.\n\nAt each of these points \\(\\sin(5x)=\\pm1\\), so \\(\\sin(7\\pi\\sin(5x))=\\sin(\\pm7\\pi)=0\\); thus they are indeed zeros, and because the derivative also vanishes the graph is tangent there.\n\nHence **\\(t=10\\)**.\n\n---\n\n### 3. Required sum\n\n\\[\nn+t = 139 + 10 = 149 .\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Answer:** \\(\\boxed{637}\\)
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 637

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nx_i=A_1A_i\\qquad (i=2,3,\\ldots ,11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}\\;(2\\le i\\le10).\n\\]\n\n---\n\n### 1.  Using the area condition  \n\n\\[\n\\text{Area}\\bigl(A_iA_1A_{i+1}\\bigr)=\\frac12 x_i x_{i+1}\\sin\\theta =1 .\n\\]\n\nBecause \\(\\cos\\theta=\\dfrac{12}{13}\\),\n\n\\[\n\\sin\\theta=\\sqrt{1-\\Bigl(\\frac{12}{13}\\Bigr)^2}= \\frac{5}{13}.\n\\]\n\nThus  \n\n\\[\n\\frac12 x_i x_{i+1}\\cdot\\frac{5}{13}=1\n\\Longrightarrow x_i x_{i+1}=\\frac{26}{5}\\qquad (2\\le i\\le10).\n\\tag{1}\n\\]\n\nDenote \\(c=\\dfrac{26}{5}\\).  From (1) we have  \n\n\\[\nx_{i+1}= \\frac{c}{x_i}.\n\\]\n\nConsequently  \n\n\\[\nx_{i+2}=x_i\\qquad\\Longrightarrow\\qquad\n\\begin{cases}\nx_{2}=x_{4}=x_{6}=x_{8}=x_{10}=a,\\\\[2pt]\nx_{3}=x_{5}=x_{7}=x_{9}=x_{11}=b,\n\\end{cases}\n\\]\n\nwith  \n\n\\[\nab=c=\\frac{26}{5}. \\tag{2}\n\\]\n\nSo the distances from \\(A_1\\) alternate between two values \\(a\\) and \\(b\\).\n\n---\n\n### 2.  Length of each side \\(A_iA_{i+1}\\;(2\\le i\\le10)\\)\n\nIn \\(\\triangle A_iA_1A_{i+1}\\) the side opposite \\(\\theta\\) is \\(A_iA_{i+1}\\).\nBy the law of cosines\n\n\\[\nA_iA_{i+1}^2 = x_i^2+x_{i+1}^2-2x_ix_{i+1}\\cos\\theta .\n\\]\n\nBecause \\(x_i\\) and \\(x_{i+1}\\) are always one \\(a\\) and one \\(b\\),\n\n\\[\nA_iA_{i+1}^2 = a^2+b^2-2ab\\cdot\\frac{12}{13}.\n\\]\n\nHence all nine sides \\(A_iA_{i+1}\\;(i=2,\\dots ,10)\\) have the same length; denote\n\n\\[\nd^2=a^2+b^2-\\frac{24}{13}ab.\n\\tag{3}\n\\]\n\nWrite \\(s=a+b\\).  Using \\(ab=c\\),\n\n\\[\na^2+b^2=s^2-2ab=s^2-2c .\n\\]\n\nSubstituting into (3),\n\n\\[\nd^2=s^2-2c-\\frac{24}{13}c\n    =s^2-c\\Bigl(2+\\frac{24}{13}\\Bigr)\n    =s^2-\\frac{50}{13}c.\n\\]\n\nSince \\(c=\\dfrac{26}{5}\\),\n\n\\[\nd^2=s^2-\\frac{50}{13}\\cdot\\frac{26}{5}=s^2-20,\n\\qquad\\text{so}\\qquad d=\\sqrt{s^{2}-20}.\n\\tag{4}\n\\]\n\n---\n\n### 3.  Use the perimeter\n\nThe polygon has \\(11\\) sides: the two incident to \\(A_1\\) of lengths \\(a\\) and \\(b\\), and the nine equal sides of length \\(d\\).  \nGiven perimeter \\(20\\),\n\n\\[\na+b+9d=s+9\\sqrt{s^{2}-20}=20.\n\\tag{5}\n\\]\n\nSolve (5) for \\(s\\).\n\n\\[\n9\\sqrt{s^{2}-20}=20-s\\;(s\\le20).\n\\]\n\nSquare:\n\n\\[\n81(s^{2}-20)=(20-s)^{2}\n\\Longrightarrow 80s^{2}+40s-2020=0\n\\Longrightarrow 4s^{2}+2s-101=0.\n\\]\n\nHence\n\n\\[\ns=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n   =\\frac{-2\\pm18\\sqrt5}{8}\n   =\\frac{-1\\pm9\\sqrt5}{4}.\n\\]\n\nOnly the positive root is admissible:\n\n\\[\n\\boxed{s=\\frac{9\\sqrt5-1}{4}}.\n\\]\n\nThus  \n\n\\[\nA_1A_2+A_1A_{11}=a+b=s=\\frac{9\\sqrt5-1}{4}\n      =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\n---\n\n### 4.  Required sum\n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Greedy representation**\n\nFor a value \\(N\\) let  \n\n\\[\nq=\\Big\\lfloor\\frac{N}{25}\\Big\\rfloor ,\\qquad \nr=N-25q\\;(0\\le r\\le 24).\n\\]\n\nAfter taking \\(q\\) quarters the greedy algorithm uses  \n\n\\[\na=\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor ,\\qquad \nb=r-10a\\;(0\\le b\\le 9)\n\\]\n\ndimes and ones.  \nThus the greedy collection contains  \n\n\\[\nG(N)=q+a+b\n\\]\n\ncoins.\n\n--------------------------------------------------------------------\n\n**When can a better collection exist?**\n\nLet a different collection use \\(x\\) quarters and \\(y\\) dimes\n(\\(z\\) pennies fill the rest).  \nIts total number of coins is  \n\n\\[\nC=x+y+z = x+y+(N-25x-10y)=N-(24x+9y).\n\\]\n\nHence a representation is better than the greedy one iff it makes the\n\u201csaving\u201d\n\n\\[\nS=24x+9y\n\\]\n\nlarger than the greedy saving \\(S_G = 24q+9a\\).\n\nSuppose we start from the greedy solution and **remove** \\(d\\ge1\\) quarters\n(\\(d\\le q\\)).  \nThe value we free is \\(25d\\).\nWith this extra value we can add as many dimes as possible:\n\n\\[\ny' = a+\\Big\\lfloor\\frac{r+25d}{10}\\Big\\rfloor\n      = a+\\Big\\lfloor 2.5d+\\frac{b}{10}\\Big\\rfloor .\n\\]\n\nThe new saving is  \n\n\\[\nS'=24(q-d)+9y'\n   =24q+9a +\\bigl[-24d+9\\big\\lfloor2.5d+\\tfrac{b}{10}\\big\\rfloor\\bigr].\n\\]\n\nThus the new collection beats the greedy one precisely when  \n\n\\[\n-24d+9\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor >0\n\\qquad\\Longleftrightarrow\\qquad\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor \\ge\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor+1 .\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n\n**Only one quarter can ever help**\n\nFor even \\(d\\) we have \\(\\big\\lfloor2.5d\\big\\rfloor =2.5d\\) and\n\\(\\big\\lfloor\\frac{8}{3}d\\big\\rfloor =2.5d+\\big\\lfloor\\frac{d}{6}\\big\\rfloor\\).\nHence the left\u2013hand side of (1) never exceeds the right\u2013hand side,\nso even \\(d\\) never improves the greedy solution.\n\nFor odd \\(d=2k+1\\) we obtain  \n\n\\[\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor\n   =5k+2+{\\bf 1}_{\\{b\\ge5\\}},\\qquad\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor\n   =5k+2+\\Big\\lfloor\\frac{k+2}{3}\\Big\\rfloor .\n\\]\n\nConsequently  \n\n\\[\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor-\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor\n= {\\bf 1}_{\\{b\\ge5\\}}-\\Big\\lfloor\\frac{k+2}{3}\\Big\\rfloor .\n\\]\n\nThe right\u2011hand side is \\(\\ge 1\\) only when \\(k=0\\) (that is, \\(d=1\\))\nand \\(b\\ge5\\).\nThus the **only** way to improve upon the greedy solution is to\nreplace **exactly one** quarter and have \\(b\\ge5\\).\n\n--------------------------------------------------------------------\n\n**What does \\(b\\ge5\\) mean?**\n\nRecall \\(b\\) is the number of pennies left after taking all possible\nquarters and then all possible dimes.  Hence\n\n\\[\nb = N-25q-10a\\in\\{0,1,\\dots ,9\\}.\n\\]\n\nThe condition \\(b\\ge5\\) is equivalent to\n\n\\[\nN-25q\\equiv 5,6,7,8,9\\pmod{10},\n\\]\n\nor, more simply,\n\n\\[\nN\\equiv 5,6,7,8,9\\pmod{25}.\n\\]\n\nIf \\(q=0\\) (i.e. \\(N<25\\)) there is no quarter to replace, so the greedy\nalgorithm is always optimal for \\(1\\le N\\le24\\).\n\nHence **the greedy algorithm fails exactly for the numbers**\n\n\\[\nN\\ge 25 \\quad\\text{with}\\quad N\\equiv 5,6,7,8,9\\pmod{25}.\n\\]\n\n--------------------------------------------------------------------\n\n**Counting the successes**\n\nAll integers \\(1\\le N\\le1000\\): 1000 of them.\n\nNumbers that cause failure:\n\n* The residues \\(5,6,7,8,9\\) each occur\n  \\(\\bigl\\lfloor\\frac{1000-r}{25}\\bigr\\rfloor+1 = 40\\) times for\n  \\(r=5,6,7,8,9\\).\n  Hence \\(5\\times40=200\\) such numbers in \\([1,1000]\\).\n\n* The five smallest ones, \\(5,6,7,8,9\\), are \\(<25\\); they do **not**\n  cause failure because no quarter can be replaced.\n\nThus the genuine failures are \\(200-5 = 195\\) numbers.\n\nConsequently the number of values for which the greedy algorithm\nsucceeds is  \n\n\\[\n1000-195 = 805.\n\\]\n\n\\[\n\\boxed{805}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 805

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the vertices of the regular \\(24\\)-gon be labelled  \n\n\\[\n0,1,2,\\dots ,23\\qquad (\\text{mod }24).\n\\]\n\nIf a segment connects vertex \\(i\\) to vertex \\(j\\) then its length is determined only by the\nstep  \n\n\\[\nk\\equiv j-i\\pmod{24},\\qquad 1\\le k\\le 12 .\n\\]\n\nAll \\(12\\) segments must have the same length, therefore they all have the same step \\(k\\) (the\nstep \\(24-k\\) gives the same length, so it is enough to consider \\(k=1,2,\\dots ,12\\)).\n\n--------------------------------------------------------------------\n### 1.  The graph for a fixed step \\(k\\)\n\nFor a fixed \\(k\\) join each vertex \\(i\\) with the two vertices\n\\(i\\pm k\\).  The resulting graph \\(G_k\\) is a union of cycles:\n\n* Let \\(d=\\gcd(k,24)\\).\n* Each cycle has length \\(\\displaystyle L=\\frac{24}{d}\\) and there are \\(d\\) such\n  cycles.\n\nIndeed the permutation \\(i\\mapsto i+k\\) on \\(\\{0,\\dots ,23\\}\\) consists of\n\\(d\\) cycles of length \\(L\\).\n\n--------------------------------------------------------------------\n### 2.  Perfect matchings of \\(G_k\\)\n\nA required drawing is a perfect matching of \\(G_k\\).\n\n* If a cycle has even length, it has exactly **2** perfect matchings\n  (alternating edges).\n* If a cycle has odd length, a perfect matching does **not** exist.\n* The only exceptional case is \\(k=12\\); then each vertex has only one\n  neighbour (its opposite) and the whole graph is already a perfect\n  matching.\n\nThus, for \\(k\\neq 12\\),\n\n\\[\n\\text{# matchings for }G_k=\n\\begin{cases}\n2^{\\,d} & \\text{if }L\\text{ is even},\\\\[2mm]\n0       & \\text{if }L\\text{ is odd}.\n\\end{cases}\n\\]\n\nSince \\(L\\) is odd exactly when \\(L=3\\), i.e. when \\(d=8\\) (the only such\n\\(k\\) is \\(k=8\\)), we have\n\n\\[\nN(k)=\n\\begin{cases}\n2^{\\gcd(k,24)} & \\gcd(k,24)\\neq 8,\\;k\\neq 12,\\\\[2mm]\n0 & k=8,\\\\[2mm]\n1 & k=12 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Evaluate for \\(k=1,\\dots ,12\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nk & \\gcd(k,24) & \\text{cycles} & N(k)\\\\ \\hline\n1 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n2 & 2 & 2\\ \\text{cycles of length }12 & 4\\\\\n3 & 3 & 3\\ \\text{cycles of length }8  & 8\\\\\n4 & 4 & 4\\ \\text{cycles of length }6  & 16\\\\\n5 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n6 & 6 & 6\\ \\text{cycles of length }4  & 64\\\\\n7 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n8 & 8 & 8\\ \\text{cycles of length }3  & 0\\\\\n9 & 3 & 3\\ \\text{cycles of length }8  & 8\\\\\n10& 2 & 2\\ \\text{cycles of length }12 & 4\\\\\n11& 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n12&12 & 12\\ \\text{edges (pairs)}       & 1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Sum over all possible lengths\n\n\\[\n\\begin{aligned}\n\\sum_{k=1}^{12} N(k)\n&=2+4+8+16+2+64+2+0+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{113}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a base \\(b>9\\),\n\n\\[\n17_{b}=1\\cdot b+7=b+7 ,\\qquad   \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need  \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nLet \\(d=b+7\\;(>0)\\). Then \\(b=d-7\\) and\n\n\\[\n9b+7 = 9(d-7)+7 = 9d-56 .\n\\]\n\nHence  \n\n\\[\nd \\mid (9d-56) \\Longrightarrow d\\mid 56 .\n\\]\n\nSo \\(d\\) must be a positive divisor of \\(56\\).  \nSince \\(b>9\\), we have \\(d=b+7>9+7=16\\).  \nThe divisors of \\(56\\) larger than \\(16\\) are\n\n\\[\nd=28,\\;56 .\n\\]\n\nCorresponding bases are  \n\n\\[\nb=d-7:\n\\begin{cases}\nd=28 \\Rightarrow b=21,\\\\[2mm]\nd=56 \\Rightarrow b=49.\n\\end{cases}\n\\]\n\nBoth satisfy \\(b>9\\) and indeed  \n\n\\[\n\\frac{9b+7}{b+7}=7\\;(b=21),\\qquad \n\\frac{9b+7}{b+7}=8\\;(b=49).\n\\]\n\nThus the integer bases are \\(b=21\\) and \\(b=49\\). Their sum is  \n\n\\[\n21+49=70.\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nThe circle through the midpoints \\(D,E,F\\) of the sides of \\(\\triangle ABC\\) is the **nine\u2011point circle** of \\(\\triangle ABC\\).\nHence  \n\n* \\(D,E,F\\) are the vertices of the medial triangle,\n* \\(\\angle D= \\angle A=84^{\\circ},\\ \\angle E= \\angle B=60^{\\circ},\\ \\angle F=\\angle C=36^{\\circ}\\).\n\nSince the nine\u2011point circle is the circumcircle of \\(\\triangle DEF\\),\n\n\\[\n\\widehat{DE}=2\\angle F=2\\cdot 36^{\\circ}=72^{\\circ}.\n\\tag{1}\n\\]\n\nWe must also determine the arcs \\(\\widehat{FG}\\) and \\(\\widehat{HJ}\\).\n\n---------------------------------------------------------------------\n\n### 1.  The arc \\(\\widehat{FG}\\)\n\n\\(G\\) is the second intersection of the median \\(BD\\) with the nine\u2011point circle.\nAt point \\(D\\) the chord \\(DG\\) lies on the line \\(BD\\), while the chord \\(DF\\) is parallel to side \\(AC\\) (mid\u2011segment theorem).\n\nTherefore  \n\n\\[\n\\angle FDG=\\angle(\\text{line } DF,\\text{line } DG)\n          =\\angle(\\,AC ,\\,BD\\,).\n\\]\n\nThe angle between side \\(AC\\) and the median from \\(B\\) can be read directly from the triangle:\n\\( \\angle(\\,AC ,\\,BD\\,)=\\angle C=36^{\\circ}\\).\n\nConsequently  \n\n\\[\n\\widehat{FG}=2\\angle FDG=2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n### 2.  The arc \\(\\widehat{HJ}\\)\n\n\\(H\\) and \\(J\\) are the second intersections of the sides \\(AC\\) and \\(AB\\) with the nine\u2011point circle.\nThus the two secants through the exterior point \\(A\\) intersect the circle at the pairs \\(\\{F,J\\}\\) and \\(\\{E,H\\}\\).\n\nFor an exterior point the angle formed by two secants equals half the **difference** of the intercepted arcs:\n\n\\[\n\\angle BAC=\\frac12\\bigl(\\widehat{JH}-\\widehat{FE}\\bigr).\n\\tag{3}\n\\]\n\nWe already know the arc \\(\\widehat{FE}\\) of the nine\u2011point circle:\n\\[\n\\widehat{FE}=2\\angle D =2\\cdot 84^{\\circ}=168^{\\circ}.\n\\tag{4}\n\\]\n\nPlugging \\(\\angle BAC=84^{\\circ}\\) and (4) into (3) gives  \n\n\\[\n84^{\\circ}=\\frac12\\bigl(\\widehat{JH}-168^{\\circ}\\bigr)\n\\Longrightarrow \\widehat{JH}=336^{\\circ}.\n\\]\n\nThe **minor** arc \\(HJ\\) is the complement of \\(336^{\\circ}\\) on the circle:\n\n\\[\n\\widehat{HJ}=360^{\\circ}-336^{\\circ}=24^{\\circ}.\n\\tag{5}\n\\]\n\n---------------------------------------------------------------------\n\n### 3.  Computing the required sum\n\nFrom (1), (2) and (5)\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ}  \\\\\n&=72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\\n&=336^{\\circ}.\n\\end{aligned}\n\\]\n\n---------------------------------------------------------------------\n\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The nine players are distinct, so for a given triple \\((c,v,s)\\) (numbers of chocolate, vanilla, and strawberry cones) the number of assignments is  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nWe must count all triples of positive integers satisfying  \n\n\\[\nc+v+s = 9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### Find the possible triples \\((c,v,s)\\)\n\nBecause the three numbers are distinct and sum to 9, we list the partitions of 9 into three distinct positive parts:\n\n\\[\n\\begin{aligned}\n9 &= 6+2+1,\\\\\n9 &= 5+3+1,\\\\\n9 &= 4+3+2 .\n\\end{aligned}\n\\]\n\nThese are the only triples with strict descending order, so  \n\n\\[\n(c,v,s) \\in \\{(6,2,1),\\;(5,3,1),\\;(4,3,2)\\}.\n\\]\n\n---\n\n### Count assignments for each triple\n\n\\[\n\\begin{aligned}\n(6,2,1):\\quad &\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):\\quad &\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):\\quad &\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### Total number of assignments\n\n\\[\nN = 252 + 504 + 1260 = 2016.\n\\]\n\n---\n\n### Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  What determines the number of regions?**  \n\nIf we draw line\u2011segments in a disc and no three of them meet in a common interior point, then each new segment splits one existing region for every interior intersection it makes, plus one more region for the segment itself.  \nHence  \n\n\\[\n\\#\\text{regions}=1+(\\#\\text{segments})+(\\#\\text{interior intersection points}).\n\\]\n\nWe have  \n\n* 2 diameters,\n* 25 random chords,\n* total segments \\(=27\\).\n\nSo we need the **expected number of interior intersections**.\n\n---------------------------------------------------------------------\n\n**Step 2.  Intersections that are certain**\n\nThe two diameters intersect at the centre \u21d2 one interior intersection.\n\n---------------------------------------------------------------------\n\n**Step 3.  Intersections of a chord with the diameters**\n\nA chord is drawn by picking two points on the circle that lie in **different quadrants**.\n\n*If the two quadrants are adjacent* (e.g. quadrant\u202fI and\u202fII), the chord crosses **exactly one** diameter.  \n*If the two quadrants are opposite* (e.g. quadrant\u202fI and\u202fIII), the chord crosses **both** diameters.\n\nThe unordered pair of distinct quadrants is uniformly chosen among the \\(\\binom{4}{2}=6\\) possibilities:\n\n* 4 adjacent pairs\u2003\u2192\u2003probability \\(4/6=2/3\\);\n* 2 opposite pairs\u2003\u2192\u2003probability \\(2/6=1/3\\).\n\nHence for one random chord\n\n\\[\nE[\\hbox{diameter\u2011intersections}]\n  =\\frac23\\cdot1+\\frac13\\cdot2=\\frac43 .\n\\]\n\nFor the 25 chords  \n\n\\[\nE[I_{\\text{chord\u2013diameter}}]=25\\cdot\\frac43=\\frac{100}{3}.\n\\]\n\n---------------------------------------------------------------------\n\n**Step 4.  Intersections between two random chords**\n\nLet the two chords be \\(AB\\) and \\(CD\\).  \nWrite \\(L\\) for the clockwise length of the arc from \\(A\\) to \\(B\\) (so \\(0\\le L\\le2\\pi\\)).  \nLet \\(L_i^{(1)}\\) be the length of that arc inside quadrant \\(i\\) (\\(i=1,\\dots ,4\\)), and\n\\(L_i^{(2)}=\\frac{\\pi}{2}-L_i^{(1)}\\) the length of the complementary arc inside the same quadrant.\n\nFor a given chord \\(AB\\)\n\n* the probability that a random chord \\(CD\\) meets \\(AB\\) **and** has its endpoints in different quadrants is  \n\n\\[\np_{\\text{int}}(A,B)=\n\\frac{L(2\\pi-L)-\\displaystyle\\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)}}{2\\pi^{2}} .\n\\tag{1}\n\\]\n\n(The numerator is the area of the product set\n\\(\\{(C,D):C\\in\\text{arc}_1,D\\in\\text{arc}_2\\}\\) minus the part where \\(C\\) and \\(D\\) fall in the same quadrant.)\n\nDefine  \n\n\\[\nQ(A,B)=L(2\\pi-L)-\\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)} .\n\\]\n\nThen \\(p_{\\text{int}}(A,B)=Q(A,B)/(2\\pi^{2})\\).\n\n---------------------------------------------------------------------\n\n**Step 5.  Averaging \\(Q\\)**  \n\nPut the circle\u2019s total length as \\(4d\\) with a quadrant length \\(d=\\pi/2\\).\nWrite the clockwise length as a multiple of \\(d\\): \\(t=L/d\\in[0,4]\\).\n\nFor a fixed \\(t\\) and a uniformly random starting point of the arc,\nthe expected value of \\(\\sum_i (L_i^{(1)})^{2}\\) (the sum of squares of the pieces of the arc) is\n\n\\[\nh(t)=\n\\begin{cases}\nt^{2}-\\dfrac{t^{3}}{3}, & 0\\le t\\le 1,\\\\[4pt]\nt-\\dfrac13,               & 1\\le t\\le 4 .\n\\end{cases}\n\\]\n\nConsequently  \n\n\\[\nE\\!\\left[\\sum_i L_i^{(1)}L_i^{(2)}\\right]\n      =\\frac{\\pi}{2}E[L]-E\\!\\left[\\sum_i(L_i^{(1)})^{2}\\right]\n      =\\frac{\\pi^{2}}{2}-\\frac{27\\pi^{2}}{64}\n      =\\frac{5\\pi^{2}}{64}.\n\\]\n\nFrom this we obtain the unconditional expectation\n\n\\[\nE[Q]=E\\!\\bigl[L(2\\pi-L)\\bigr]-E\\!\\Bigl[\\sum_i L_i^{(1)}L_i^{(2)}\\Bigr]\n      =\\frac{2}{3}\\pi^{2}-\\frac{5}{64}\\pi^{2}\n      =\\frac{113}{192}\\pi^{2}.\n\\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 6.  Conditioning on \u201cdifferent quadrants\u2019\u2019 for the first chord**\n\nIf the first chord\u2019s endpoints lie in the *same* quadrant (probability \\(1/4\\)),\nthen \\(Q\\) simplifies to \\(Q=\\frac{3\\pi}{2}L\\).  \nBecause the absolute difference of two points inside a quadrant has mean \\(d/3=\\pi/6\\),\n\n\\[\nE[Q\\mid\\text{same quadrant}]=\\frac{3\\pi}{2}\\cdot\\frac{\\pi}{6}\n                              =\\frac{\\pi^{2}}{4}.\n\\]\n\nHence  \n\n\\[\nE[Q\\;{\\bf 1}_{\\text{different quadrants}}]\n   =E[Q]-\\frac14\\cdot\\frac{\\pi^{2}}{4}\n   =\\frac{113}{192}\\pi^{2}-\\frac{\\pi^{2}}{16}\n   =\\frac{101}{192}\\pi^{2}. \\tag{3}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 7.  Probability that two *valid* chords intersect**\n\nFrom (1) and (3),\n\n\\[\n\\boxed{\nP(\\text{intersection } \\&\\; AB\\text{ valid}\\; \\&\\; CD\\text{ valid})\n    =\\frac{E[Q\\,{\\bf 1}_{\\text{different quadrants}}]}{2\\pi^{2}}\n    =\\frac{101}{384}.\n}\n\\]\n\nThe event \u201cboth chords are valid\u2019\u2019 occurs with probability \\((3/4)^{2}=9/16\\).  \nTherefore the conditional probability that two random valid chords intersect is\n\n\\[\nP_{\\text{int}}=\n\\frac{101/384}{9/16}= \\frac{101}{216}\\approx0.4676.\n\\tag{4}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 8.  Expected number of chord\u2013chord intersections**\n\n\\[\nE[I_{\\text{chord\u2013chord}}]\n   =\\binom{25}{2}\\;P_{\\text{int}}\n   =300\\cdot\\frac{101}{216}\n   =\\frac{2525}{18}.\n\\]\n\n---------------------------------------------------------------------\n\n**Step 9.  Total expected interior intersections**\n\n\\[\n\\begin{aligned}\nE[I] &=\n\\underbrace{1}_{\\text{diameters}}+\n\\underbrace{\\frac{100}{3}}_{\\text{chord\u2013diameter}}+\n\\underbrace{\\frac{2525}{18}}_{\\text{chord\u2013chord}} \\\\[4pt]\n&= \\frac{18+600+2525}{18}\n   =\\frac{3143}{18}.\n\\end{aligned}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 10.  Expected number of regions**\n\n\\[\n\\begin{aligned}\nE[\\#\\text{regions}]\n&=1+(\\#\\text{segments})+E[I] \\\\\n&=1+27+\\frac{3143}{18}\\\\[4pt]\n&=28+\\frac{3143}{18}\n   =\\frac{504+3143}{18}\n   =\\boxed{\\frac{3647}{18}}\\; \\approx 202.6 .\n\\end{aligned}\n\\]\n\nThus, on average Alex\u2019s 27 line segments partition the disk into \\(\\displaystyle \\frac{3647}{18}\\) regions.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: None

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\n---\n\n### 1.  Factor the quadratic  \n\nLook for integers \\(a,b,c,d\\) such that  \n\n\\[\n(ax+by)(cx+dy)=12x^{2}-xy-6y^{2}.\n\\]\n\nWe need  \n\n\\[\nac=12,\\qquad bd=-6,\\qquad ad+bc=-1 .\n\\]\n\nTaking \\(a=4,\\;c=3\\) (since \\(4\\cdot 3=12\\)) and trying \\(b=-3,\\;d=2\\) gives  \n\n\\[\nbd=(-3)(2)=-6,\\qquad ad+bc=4\\cdot2+3\\cdot(-3)=8-9=-1.\n\\]\n\nHence  \n\n\\[\n12x^{2}-xy-6y^{2}=(4x-3y)(3x+2y).\n\\]\n\nSo the original equation is equivalent to  \n\n\\[\n(4x-3y)(3x+2y)=0.\n\\]\n\nThus any integer solution must satisfy one of the two linear equations  \n\n\\[\n\\boxed{4x-3y=0}\\qquad\\text{or}\\qquad\\boxed{3x+2y=0}.\n\\]\n\n---\n\n### 2.  Solve each linear equation in integers  \n\n**(i) \\(4x-3y=0\\).**  \n\n\\(4x=3y\\Rightarrow y= \\frac{4}{3}x\\).  \nSince \\(\\gcd(4,3)=1\\), write \\(x=3k,\\;y=4k\\) for some integer \\(k\\).\n\nBoth coordinates must satisfy \\(-100\\le x,y\\le 100\\):\n\n\\[\n-100\\le 3k\\le 100 \\Longrightarrow -\\frac{100}{3}\\le k\\le \\frac{100}{3},\n\\qquad\n-100\\le 4k\\le 100 \\Longrightarrow -25\\le k\\le 25.\n\\]\n\nThe tighter bound is \\(-25\\le k\\le 25\\).  \nHence there are  \n\n\\[\n25-(-25)+1 = 51\n\\]\n\nsolutions from this family.\n\n---\n\n**(ii) \\(3x+2y=0\\).**  \n\n\\(3x=-2y\\Rightarrow x=-\\frac{2}{3}y\\).  \nAgain \\(\\gcd(3,2)=1\\), so write \\(y=3m,\\;x=-2m\\) for some integer \\(m\\).\n\nBounds:\n\n\\[\n-100\\le -2m\\le 100 \\Longrightarrow -50\\le m\\le 50,\n\\qquad\n-100\\le 3m\\le 100 \\Longrightarrow -\\frac{100}{3}\\le m\\le \\frac{100}{3}\n\\Longrightarrow -33\\le m\\le 33.\n\\]\n\nThus \\(-33\\le m\\le 33\\), giving  \n\n\\[\n33-(-33)+1 = 67\n\\]\n\nsolutions from this family.\n\n---\n\n### 3.  Remove the double\u2011counted solution  \n\nThe two families intersect only when both equations hold, i.e. when  \n\n\\[\n4x-3y=0\\;\\text{and}\\;3x+2y=0\\Longrightarrow (x,y)=(0,0).\n\\]\n\nSo \\((0,0)\\) has been counted twice.  \n\nTotal distinct ordered pairs:\n\n\\[\n51+67-1 = 117.\n\\]\n\n---\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nwith \\(\\angle A=90^{\\circ}\\) and \\(BC=38\\Rightarrow b^{2}+c^{2}=38^{2}=1444\\).\n\n---\n\n### 1.  Locating \\(K\\) and \\(L\\)\n\n\\(AK=BK=14\\).  \nThe circles \\(\\odot(A,14)\\) and \\(\\odot(B,14)\\) intersect at the interior point  \n\n\\[\nK=\\Bigl(\\frac b2,\\; \\sqrt{196-\\Bigl(\\frac b2\\Bigr)^2}\\Bigr).\n\\]\n\nSimilarly \\(AL=CL=14\\) gives  \n\n\\[\nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^2},\\; \\frac c2\\Bigr).\n\\]\n\nSince \\(AK=AL=KL=14\\), points \\(A,K,L\\) form an equilateral triangle.\nPut  \n\n\\[\nK=(14\\cos\\theta,14\\sin\\theta),\\qquad \nL=(14\\cos(\\theta+60^\\circ),14\\sin(\\theta+60^\\circ)).\n\\]\n\nUsing \\(BK=14\\) and \\(CL=14\\),\n\n\\[\nb=28\\cos\\theta,\\qquad c=28\\sin(\\theta+60^\\circ). \\tag{1}\n\\]\n\n---\n\n### 2.  Determining \\(\\theta\\)\n\nFrom \\(b^2+c^2=1444\\),\n\n\\[\n\\cos^{2}\\theta+\\sin^{2}(\\theta+60^\\circ)=\\frac{1444}{28^{2}}\n        =\\frac{361}{196}=\\Bigl(\\frac{19}{14}\\Bigr)^{2}.\n\\]\n\nUsing \\(\\cos^2x=\\frac{1+\\cos2x}{2},\\ \\sin^2x=\\frac{1-\\cos2x}{2}\\),\n\n\\[\n\\frac{2+\\cos2\\theta-\\cos(2\\theta+120^\\circ)}2\n      =\\frac{361}{196}.\n\\]\n\nSimplifying gives  \n\n\\[\n\\cos2\\theta-\\cos(2\\theta+120^\\circ)=\\frac{165}{98}.\n\\]\n\nSince \\(\\cos A-\\cos B=-2\\sin\\frac{A+B}{2}\\sin\\frac{A-B}{2}\\),\n\n\\[\n\\sqrt3\\sin(2\\theta+60^\\circ)=\\frac{165}{98}\n   \\Longrightarrow \\sin(2\\theta+60^\\circ)=\\frac{55\\sqrt3}{98}.\n\\]\n\nHence  \n\n\\[\n\\cos(2\\theta+60^\\circ)=\\frac{23}{98},\\qquad \n\\sin(2\\theta+60^\\circ)=\\frac{55\\sqrt3}{98}.\n\\]\n\nLet \\(\\phi=2\\theta+60^\\circ\\). Then\n\n\\[\n\\cos\\phi=\\frac{23}{98},\\qquad \\sin\\phi=\\frac{55\\sqrt3}{98}.\n\\]\n\nCompute \\(\\cos(\\phi-60^\\circ)\\) and \\(\\cos(\\phi+60^\\circ)\\):\n\n\\[\n\\cos(\\phi-60^\\circ)=\\frac{47}{49},\\qquad\n\\cos(\\phi+60^\\circ)=-\\frac{71}{98}.\n\\]\n\nNow\n\n\\[\n\\cos\\theta=\\sqrt{\\frac{1+\\cos(\\phi-60^\\circ)}2}\n          =\\sqrt{\\frac{1+\\frac{47}{49}}2}\n          =\\sqrt{\\frac{48}{49}}=\\frac{4\\sqrt3}{7},\n\\]\n\n\\[\n\\sin(\\theta+60^\\circ)=\\sqrt{\\frac{1-\\cos(\\phi+60^\\circ)}2}\n                     =\\sqrt{\\frac{1+\\frac{71}{98}}2}\n                     =\\sqrt{\\frac{169}{196}}=\\frac{13}{14}.\n\\]\n\nUsing (1),\n\n\\[\nb=28\\cos\\theta=28\\cdot\\frac{4\\sqrt3}{7}=16\\sqrt3,\n\\qquad\nc=28\\sin(\\theta+60^\\circ)=28\\cdot\\frac{13}{14}=26.\n\\]\n\nThus  \n\n\\[\nAB=16\\sqrt3,\\qquad AC=26,\\qquad BC=38.\n\\]\n\nConsequently  \n\n\\[\nK=\\Bigl(\\frac{b}{2},\\sqrt{196-\\Bigl(\\frac b2\\Bigr)^2}\\Bigr)\n  =\\bigl(8\\sqrt3,\\;2\\bigr),\\qquad\nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^2},\\frac c2\\Bigr)\n  =\\bigl(3\\sqrt3,\\;13\\bigr).\n\\]\n\n---\n\n### 3.  Area of \\(BKLC\\)\n\nUsing the shoelace formula for vertices  \n\n\\[\nB=(16\\sqrt3,0),\\; K=(8\\sqrt3,2),\\; L=(3\\sqrt3,13),\\; C=(0,26),\n\\]\n\n\\[\n\\begin{aligned}\n\\sum x_iy_{i+1}&=16\\sqrt3\\cdot2+8\\sqrt3\\cdot13+3\\sqrt3\\cdot26+0\\cdot0\\\\\n               &=214\\sqrt3,\\\\[2mm]\n\\sum y_ix_{i+1}&=0\\cdot8\\sqrt3+2\\cdot3\\sqrt3+13\\cdot0+26\\cdot16\\sqrt3\\\\\n               &=422\\sqrt3.\n\\end{aligned}\n\\]\n\nHence\n\n\\[\n\\text{Area}(BKLC)=\\frac12|214\\sqrt3-422\\sqrt3|=104\\sqrt3.\n\\]\n\n---\n\nThus the area of \\(BKLC\\) is \\(104\\sqrt3\\), so  \n\n\\[\n\\boxed{104}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid have parallel sides (bases) \\(r\\) and \\(s\\) \\((r\\neq s)\\), the equal legs \\(L\\), and height \\(h\\).\n\n---\n\n### 1.  Height from the incircle  \n\nThe circle of radius \\(3\\) is tangent to the two parallel sides, so the distance between those sides equals the sum of the distances from the centre to each side:\n\n\\[\nh = 3+3 = 6 .\n\\]\n\n---\n\n### 2.  Sum of the bases from the area  \n\n\\[\n\\text{Area}= \\frac{r+s}{2}\\,h = 72\n\\quad\\Longrightarrow\\quad\n\\frac{r+s}{2}\\cdot 6 = 72 \\implies r+s = 24 .\n\\]\n\n---\n\n### 3.  Relation of the legs (tangential quadrilateral)  \n\nA quadrilateral has an incircle iff the sums of opposite sides are equal.  \nFor the trapezoid the opposite sides are the two bases and the two legs, so\n\n\\[\nr+s = L+L \\;\\Longrightarrow\\; L =\\frac{r+s}{2}=12 .\n\\]\n\nThus each leg has length \\(L=12\\).\n\n---\n\n### 4.  Difference of the bases from the leg length  \n\nBecause the trapezoid is isosceles, each leg together with the height forms a right triangle whose horizontal leg is \\(\\dfrac{|s-r|}{2}\\):\n\n\\[\nL^{2}=h^{2}+ \\left(\\frac{s-r}{2}\\right)^{2}.\n\\]\n\nInsert \\(L=12,\\;h=6\\):\n\n\\[\n12^{2}=6^{2}+ \\left(\\frac{s-r}{2}\\right)^{2}\n\\Longrightarrow 144-36 = \\left(\\frac{s-r}{2}\\right)^{2}\n\\Longrightarrow \\left(\\frac{s-r}{2}\\right)^{2}=108.\n\\]\n\nHence  \n\n\\[\n|s-r| = 2\\sqrt{108}=12\\sqrt3 .\n\\]\n\nAssume \\(s>r\\); then \\(s-r=12\\sqrt3\\).\n\n---\n\n### 5.  Solve for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s = 24,\\\\\ns-r = 12\\sqrt3.\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\ns &= 12+6\\sqrt3,\\\\\nr &= 12-6\\sqrt3.\n\\end{aligned}\n\\]\n\n---\n\n### 6.  Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2} &= (12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2} \\\\\n&= \\bigl(144-144\\sqrt3+108\\bigr)+\\bigl(144+144\\sqrt3+108\\bigr) \\\\\n&= 252-144\\sqrt3+252+144\\sqrt3 \\\\\n&= 504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For an 8\u2011digit number using each of the digits \\(1,2,\\dots ,8\\) exactly once  \n\n\\[\n22=2\\cdot11\n\\]\n\nso the number must be divisible by \\(2\\) **and** by \\(11\\).\n\n---\n\n### 1.  Divisibility by \\(2\\)\n\nThe units digit must be even, i.e. one of \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2.  Divisibility by \\(11\\)\n\nFor an 8\u2011digit number \\(a_1a_2\\ldots a_8\\),\n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv 0\\pmod{11}.\n\\]\n\nLet  \n\n\\[\nS_{\\text{odd}}=a_1+a_3+a_5+a_7,\\qquad \nS_{\\text{even}}=a_2+a_4+a_6+a_8 .\n\\]\n\nSince the digits \\(1\\) through \\(8\\) sum to \\(36\\),\n\n\\[\nS_{\\text{odd}}+S_{\\text{even}}=36\\qquad\\text{and}\\qquad \nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nThus  \n\n\\[\n2S_{\\text{odd}}\\equiv36\\equiv3\\pmod{11}\\Longrightarrow\nS_{\\text{odd}}\\equiv7\\pmod{11}.\n\\]\n\nThe possible values of \\(S_{\\text{odd}}\\) (sum of four distinct digits from \\(1\\)\u2013\\(8\\)) lie between \\(10\\) and \\(26\\).  \nThe only value in this interval congruent to \\(7\\pmod{11}\\) is \\(18\\).\n\nHence\n\n\\[\nS_{\\text{odd}}=S_{\\text{even}}=18 .\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 3.  4\u2011digit subsets with sum \\(18\\)\n\nAll 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\) are  \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are exactly \\(8\\) such subsets.  \nEach contains **exactly two even digits** (the even digits are \\(2,4,6,8\\)).\n\n---\n\n### 4.  Arranging the digits\n\n* Choose one of the 8 subsets for the odd positions.\n* Permute its four digits among the odd places \\((1,3,5,7)\\) \u2013 \\(4! = 24\\) ways.\n* The remaining four digits occupy the even places \\((2,4,6,8)\\).  \n\n  The units place (position\u202f8) must be even.  \n  Since the complementary set also has exactly two even digits, we may\n  \\[\n  \\text{choose the even digit for position\u202f8 in }2\\text{ ways,}\n  \\]\n  then arrange the other three digits in positions \\(2,4,6\\) in \\(3! = 6\\) ways.\n\nHence for a given subset the number of valid permutations is  \n\n\\[\n24 \\times (2 \\times 6)=24 \\times 12 = 288 .\n\\]\n\nWith \\(8\\) possible subsets,\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 5.  Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\ndescribes the circle  \n\n\\[\n\\text{Center }C=(25,20),\\qquad\\text{radius }R=5 .\n\\]\n\nThe second equation  \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nstates that the distance from \\(z\\) to the point  \n\n\\[\nA=4+k\\;(=k+4+0i)\n\\]\n\nequals its distance to the point  \n\n\\[\nB=3i+k\\;(=k+0i+3i).\n\\]\n\nHence the locus of points satisfying the second condition is the **perpendicular bisector** of the segment \\(\\overline{AB}\\).\n\n---\n\n### 1.  Equation of the perpendicular bisector\n\nCoordinates:\n\n\\[\nA=(k+4,0),\\qquad B=(k,3).\n\\]\n\nMidpoint  \n\n\\[\nM=\\Big(\\frac{k+4+k}{2},\\frac{0+3}{2}\\Big)=\\Big(k+2,\\frac32\\Big).\n\\]\n\nSlope of \\(\\overline{AB}\\):\n\n\\[\n\\frac{3-0}{k-(k+4)}=\\frac{3}{-4}=-\\frac34 .\n\\]\n\nTherefore the slope of the perpendicular bisector is the negative reciprocal,\n\n\\[\nm=\\frac{4}{3}.\n\\]\n\nUsing point\u2013slope form through \\(M\\):\n\n\\[\ny-\\frac32=\\frac{4}{3}(x-(k+2)).\n\\]\n\nMultiplying by \\(6\\),\n\n\\[\n6y-9=8x-8k-16\\qquad\\Longrightarrow\\qquad 8x-6y=8k+7.\n\\]\n\nThus the line is  \n\n\\[\nL:\\;8x-6y=8k+7 .\n\\]\n\n---\n\n### 2.  Tangency condition\n\nThe system has **exactly one** solution \\(z\\) when the line \\(L\\) is tangent to the circle.  \nThe distance from the center \\(C=(25,20)\\) to \\(L\\) must equal the radius \\(5\\).\n\nFor a line \\(Ax+By+C=0\\), the distance from \\((x_0,y_0)\\) is  \n\n\\[\nd=\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nWrite \\(L\\) as \\(8x-6y-(8k+7)=0\\). Then\n\n\\[\nd=\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^2+(-6)^2}}\n   =\\frac{|200-120-8k-7|}{\\sqrt{64+36}}\n   =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=R=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5 \\;\\Longrightarrow\\; |73-8k|=50 .\n\\]\n\nHence  \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50.\n\\]\n\nSolving:\n\n\\[\n\\begin{aligned}\n73-8k=50 &\\Rightarrow 8k=23 \\Rightarrow k=\\frac{23}{8},\\\\[2mm]\n73-8k=-50 &\\Rightarrow 8k=123 \\Rightarrow k=\\frac{123}{8}.\n\\end{aligned}\n\\]\n\nBoth values give a line tangent to the circle, so the system has exactly one complex solution for each.\n\n---\n\n### 3.  Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\;n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The recurrence  \n\n\\[\nx_{k+1}= \\frac{1}{3}\\Bigl(x_k+\\frac{1}{x_k}-1\\Bigr)\n\\]\n\ncan be rewritten as  \n\n\\[\nx_{k+1}= \\frac{x_k^2-x_k+1}{3x_k}.\n\\]\n\n---\n\n### 1.  A convenient change of variables  \n\nDefine  \n\n\\[\nt_k=\\frac{2x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{b_k+a_k}{2b_k-a_k},\n\\]\n\nwhere \\(a_k,b_k\\) are integers defined below.  \n\nFrom the definition  \n\n\\[\nt_{k+1}=t_k\\bigl(t_k-1\\bigr),\\qquad t_1=\\frac{13}{12}.\n\\]\n\n---\n\n### 2.  Integer sequences  \n\nWrite \\(t_k=\\dfrac{a_k}{b_k}\\) in lowest terms.  \nFrom \\(t_{k+1}=t_k(t_k-1)\\) we obtain  \n\n\\[\na_{k+1}=a_k\\bigl(a_k-b_k\\bigr),\\qquad  \nb_{k+1}=b_k^2,\\qquad a_1=13,\\;b_1=12 .\n\\]\n\nThus  \n\n\\[\nb_k=12^{\\,2^{\\,k-1}} .\n\\]\n\nBecause \\(a_k\\) is always odd and not a multiple of \\(3\\), \\(\\gcd(a_k,b_k)=1\\) for all \\(k\\).\n\n---\n\n### 3.  Expressing \\(x_k\\)  \n\nUsing \\(x_k=\\dfrac{b_k+a_k}{2b_k-a_k}\\) we get  \n\n\\[\nm_k=b_k+a_k,\\qquad n_k=2b_k-a_k,\n\\]\nso that  \n\n\\[\nm_k+n_k = (b_k+a_k)+(2b_k-a_k)=3b_k .\n\\]\n\nHence for any \\(k\\),\n\n\\[\nm_k+n_k = 3\\cdot 12^{\\,2^{\\,k-1}} .\n\\]\n\n---\n\n### 4.  The required term  \n\nFor \\(k=2025\\),\n\n\\[\nm+n = 3\\cdot 12^{\\,2^{\\,2024}} .\n\\]\n\nWe need this number modulo \\(1000\\).\n\n---\n\n### 5.  Computing \\(3\\cdot12^{2^{2024}}\\pmod{1000}\\)\n\nSince \\(1000=8\\cdot125\\), work modulo \\(8\\) and \\(125\\).\n\n*Modulo\u202f8*:\u2003\\(12\\equiv4\\pmod8\\) and \\(4^2\\equiv0\\pmod8\\); with exponent \\(2^{2024}>1\\),\n\n\\[\n12^{2^{2024}}\\equiv0\\pmod8\\Longrightarrow\n3\\cdot12^{2^{2024}}\\equiv0\\pmod8 .\n\\]\n\n*Modulo\u202f125*:\u2003\\(\\gcd(12,125)=1\\), \\(\\phi(125)=100\\).  \nReduce the exponent modulo\u202f100:\n\n\\[\n2^{2024}\\equiv 2^{4}=16\\pmod{100}\n\\]\n(because \\(2^{2024}\\equiv16\\pmod{100}\\)).  \nHence  \n\n\\[\n12^{2^{2024}}\\equiv12^{16}\\pmod{125}.\n\\]\n\nCompute:\n\\[\n12^2\\equiv19,\\quad\n12^4\\equiv19^2\\equiv111,\\quad\n12^8\\equiv111^2\\equiv71,\\quad\n12^{16}\\equiv71^2\\equiv41\\pmod{125}.\n\\]\n\nThus  \n\n\\[\n3\\cdot12^{2^{2024}}\\equiv3\\cdot41=123\\pmod{125}.\n\\]\n\nNow solve  \n\n\\[\nR\\equiv0\\pmod8,\\qquad R\\equiv123\\pmod{125}.\n\\]\n\nWrite \\(R=125a+123\\). Mod\u202f8:\n\n\\[\n125a+123\\equiv5a+3\\equiv0\\pmod8\\Longrightarrow5a\\equiv5\\pmod8\n\\Longrightarrow a\\equiv1\\pmod8.\n\\]\n\nTake \\(a=1\\); then \\(R=125\\cdot1+123=248\\).\n\nHence  \n\n\\[\nm+n\\equiv 248 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{248}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nAD=4,\\; DE=16,\\; EB=8,\\qquad AF=13,\\; FG=52,\\; GC=26 .\n\\]\n\nHence  \n\n\\[\nAB=4+16+8=28,\\qquad AC=13+52+26=91 .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coordinates\n\nPlace \\(A=(0,0),\\; B=(28,0)\\) and let the height of \\(\\triangle ABC\\) be \\(h\\).  \nWrite \\(C=(x,h)\\) (the \\(x\\)\u2011coordinate is unknown).\n\nPoints on the sides are then  \n\n\\[\n\\begin{aligned}\nD&=(4,0),   &E&=(20,0), \\\\\nF&=\\Bigl(\\frac{13}{91}x,\\;\\frac{13}{91}h\\Bigr), &\nG&=\\Bigl(\\frac{65}{91}x,\\;\\frac{65}{91}h\\Bigr).\n\\end{aligned}\n\\]\n\nSince \\(M\\) is the reflection of \\(D\\) about \\(F\\),\n\n\\[\nM=2F-D=\\Bigl(\\frac{26}{91}x-4,\\;\\frac{26}{91}h\\Bigr),\n\\]\n\nand because \\(N\\) is the reflection of \\(G\\) about \\(E\\),\n\n\\[\nN=2E-G=\\Bigl(40-\\frac{65}{91}x,\\;-\\frac{65}{91}h\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 2.  Height from the given area\n\nQuadrilateral \\(DEGF\\) consists of triangles \\(DEG\\) and \\(DFG\\).  \nIts area is\n\n\\[\n\\begin{aligned}\n[DEGF]&=\\frac12\\Bigl[\\,DE\\cdot G_y\n      +|\\,\\overrightarrow{DF}\\times\\overrightarrow{DG}\\,|\\,\\Bigr]\\\\[2mm]\n     &=\\frac{h}{2\\cdot91}\\Bigl(16\\cdot65+4\\cdot52\\Bigr)\n      =\\frac{1248}{182}\\,h\n      =\\frac{624}{91}\\,h .\n\\end{aligned}\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n\\frac{624}{91}\\,h=288\\quad\\Longrightarrow\\quad h=42 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Area of \\(\\triangle ABC\\)\n\n\\[\n[ABC]=\\frac12\\cdot AB\\cdot h\n      =\\frac12\\cdot28\\cdot42\n      =588 .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of the heptagon \\(AFNBCEM\\)\n\nUse the shoelace formula with the vertices in the order  \n\n\\[\nA,\\;F,\\;N,\\;B,\\;C,\\;E,\\;M .\n\\]\n\nBecause the \\(x\\)-coordinate \\(x\\) of \\(C\\) appears only in the\nterms \\(x\\,h\\) and they cancel each other, the sum reduces to  \n\n\\[\n\\begin{aligned}\nS&=2\\bigl( -\\tfrac{2\\cdot13}{91} (4+16)h\n          + (4+16+8)h\n          + (4+16+8)h\n          - (4+16)h \\bigr) \\\\\n  &=2\\cdot 28h .\n\\end{aligned}\n\\]\n\nHence\n\n\\[\n[AFNBCEM]=\\frac12 S = \\frac12\\cdot28h = [ABC]=588 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The original parabola is  \n\n\\[\ny=x^{2}-4 .\n\\]\n\nRotate it \\(60^{\\circ}\\) counter\u2011clockwise about the origin.  \nIf \\((X,Y)\\) is a point on the rotated parabola, then rotating it back\n\\(60^{\\circ}\\) (clockwise) must put it on the original parabola:\n\n\\[\n\\begin{aligned}\nx &= X\\cos60^{\\circ}+Y\\sin60^{\\circ},\\\\\ny &=-X\\sin60^{\\circ}+Y\\cos60^{\\circ},\n\\end{aligned}\n\\qquad\\text{with }\\;y=x^{2}-4 .\n\\]\n\nUsing \\(\\cos60^{\\circ}= \\tfrac12,\\; \\sin60^{\\circ}= \\tfrac{\\sqrt3}{2}\\),\n\n\\[\n-\\,\\frac{\\sqrt3}{2}X+\\frac12Y= \\Bigl(\\frac12X+\\frac{\\sqrt3}{2}Y\\Bigr)^{2}-4 .\n\\tag{1}\n\\]\n\nThe original parabola gives \\(Y=X^{2}-4\\). Substituting this into (1) and\nclearing denominators yields\n\n\\[\n3X^{4}+2\\sqrt3\\,X^{3}-25X^{2}-6\\sqrt3\\,X+40=0 .\n\\tag{2}\n\\]\n\nThe quartic factors over \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\bigl(X^{2}+\\sqrt3\\,X-4\\bigr)\\bigl(3X^{2}-\\sqrt3\\,X-10\\bigr)=0 .\n\\]\n\nHence the possible \\(X\\)-coordinates are the roots of the two quadratics.\n\n* From \\(X^{2}+\\sqrt3X-4=0\\) :\n\n\\[\nX=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\nThe positive root is  \n\n\\[\nX_{0}= \\frac{-\\sqrt3+\\sqrt{19}}{2}\\approx1.31,\n\\]\n\nwhich satisfies \\(0<X<2\\); thus the point \\((X_{0},Y_{0})\\) lies in the\nfourth quadrant.\n\n* The other quadratic \\(3X^{2}-\\sqrt3X-10=0\\) gives \\(X\\approx2.14\\) or\n\\(X\\approx-1.56\\), neither of which lies in the fourth quadrant.\n\nTherefore the unique fourth\u2011quadrant intersection comes from\n\\(X_{0}\\).  For this root we have from the quadratic\n\n\\[\nX_{0}^{2}=4-\\sqrt3 X_{0},\n\\qquad\\text{so}\\qquad\nY_{0}=X_{0}^{2}-4=-\\sqrt3 X_{0}.\n\\]\n\nThus\n\n\\[\nY_{0}= -\\sqrt3\\left(\\frac{-\\sqrt3+\\sqrt{19}}{2}\\right)\n     =\\frac{3-\\sqrt{57}}{2}.\n\\]\n\nThe \\(y\\)-coordinate is \\(\\displaystyle\\frac{a-\\sqrt b}{c}\\) with  \n\n\\[\na=3,\\qquad b=57,\\qquad c=2.\n\\]\n\nSince \\(\\gcd(3,2)=1\\), the conditions are satisfied.  \n\n\\[\na+b+c=3+57+2=62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The periodic function  \n\n\\[\nf(x)=\\begin{cases}\nx,&x\\in[-1,1)\\\\[2pt]\n2-x,&x\\in[1,3)\n\\end{cases},\n\\qquad f(x+4)=f(x)\n\\]\n\nhas period \\(4\\).  \nOn each period write  \n\n\\[\nx=4k+u,\\qquad u\\in[-1,3),\\ k\\in\\mathbb Z .\n\\]\n\nThen  \n\n\\[\nf(x)=\\begin{cases}\nu, & u\\in[-1,1)\\\\[2pt]\n2-u,&u\\in[1,3)\n\\end{cases}.\n\\]\n\nThe parabola is \\(x=34y^{2}\\;(x\\ge 0,\\;|y|\\le 1)\\).  \nSet \\(x=34y^{2}=4k+u\\) with \\(u\\in[-1,3)\\).  \nThe integer \\(k\\) is uniquely determined by  \n\n\\[\n\\frac{34y^{2}-3}{4}<k\\le\\frac{34y^{2}+1}{4},\n\\]\n\nso for each \\(y\\) there is exactly one such \\(k\\).\n\n---\n\n### 1.  Rising part \\((u\\in[-1,1))\\)\n\nHere \\(y=u\\).  Hence  \n\n\\[\ny=34y^{2}-4k\\Longrightarrow 34y^{2}-y-4k=0.\n\\]\n\nFor a fixed \\(k\\) the two roots are  \n\n\\[\ny_{R,k}^{\\pm}= \\frac{1\\pm\\sqrt{1+544k}}{68},\n\\qquad k=0,1,\\dots ,8 .\n\\]\n\nBoth lie in \\([-1,1]\\) for all these \\(k\\).  \nEach pair sums to  \n\n\\[\ny_{R,k}^{+}+y_{R,k}^{-}= \\frac1{34}.\n\\]\n\nThus  \n\n\\[\n\\sum_{k=0}^{8}\\bigl(y_{R,k}^{+}+y_{R,k}^{-}\\bigr)=\\frac{9}{34}.\n\\]\n\n---\n\n### 2.  Falling part \\((u\\in[1,3))\\)\n\nHere \\(y=2-u\\).  Hence  \n\n\\[\ny=2-(34y^{2}-4k)\\Longrightarrow 34y^{2}+y-(4k+2)=0.\n\\]\n\nThe roots are  \n\n\\[\ny_{D,k}^{\\pm}= \\frac{-1\\pm\\sqrt{273+544k}}{68},\n\\qquad k=0,1,\\dots ,8 .\n\\]\n\nFor \\(k=0,\\dots ,7\\) both roots lie in \\([-1,1]\\); for \\(k=8\\) the\nnegative root is \\(<-1\\) and must be discarded.\nEach admissible pair sums to  \n\n\\[\ny_{D,k}^{+}+y_{D,k}^{-}= -\\frac1{34},\n\\]\n\nso for \\(k=0,\\dots ,7\\)\n\n\\[\n\\sum_{k=0}^{7}\\bigl(y_{D,k}^{+}+y_{D,k}^{-}\\bigr)= -\\frac{8}{34}\n= -\\frac{4}{17}.\n\\]\n\nThe remaining root (the positive one for \\(k=8\\)) is  \n\n\\[\ny_{D,8}^{+}= \\frac{-1+ \\sqrt{273+544\\cdot8}}{68}\n          = \\frac{-1+ \\sqrt{4625}}{68}\n          = \\frac{-1+5\\sqrt{185}}{68}.\n\\]\n\n---\n\n### 3.  Sum of all \\(y\\)-coordinates\n\nAdding the contributions,\n\n\\[\n\\begin{aligned}\nS &=\\frac{9}{34}-\\frac{4}{17}+\\frac{-1+5\\sqrt{185}}{68}\\\\[2pt]\n  &=\\frac{9}{34}-\\frac{8}{34}+\\frac{-1}{68}+\\frac{5\\sqrt{185}}{68}\\\\[2pt]\n  &=\\frac{1}{34}-\\frac{1}{68}+\\frac{5\\sqrt{185}}{68}\\\\[2pt]\n  &=\\frac{1+5\\sqrt{185}}{68}.\n\\end{aligned}\n\\]\n\nThus the sum can be written as \\(\\displaystyle\\frac{a+b\\sqrt{c}}{d}\\) with  \n\n\\[\na=1,\\qquad b=5,\\qquad c=185,\\qquad d=68,\n\\]\n\nwhere \\(\\gcd(a,b,d)=1\\) and \\(c\\) is square\u2011free.\n\nFinally  \n\n\\[\na+b+c+d=1+5+185+68=259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The required sum is  \n\n\\[\n\\min_{X\\in \\mathbb {R}^2}\\bigl(AX+BX+CX+DX+EX\\bigr)\n=38+19\\sqrt{3}.\n\\]\n\nHence  \n\n\\[\nm=38,\\qquad n=19,\\qquad p=3,\n\\]\n\nand  \n\n\\[\nm+n+p=38+19+3=60.\n\\]\n\n\\[\n\\boxed{60}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 60

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the rows be \\(R_{1},R_{2},R_{3}\\) and the three \\(3\\times3\\) blocks be\n\\(B_{1},B_{2},B_{3}\\) (columns \\(1\\!-\\!3,\\;4\\!-\\!6,\\;7\\!-\\!9\\)).\nEach number \\(x\\in\\{1,\\dots ,9\\}\\) appears\n\n* once in each row,\n* once in each block.\n\nHence for a fixed number \\(x\\) the three occurrences give a bijection  \n\n\\[\n\\sigma _x:\\{R_1,R_2,R_3\\}\\longrightarrow \\{B_1,B_2,B_3\\},\n\\qquad \n\\sigma_x(R_i)=\\text{the block containing }x\\text{ in row }R_i .\n\\]\n\nThus \\(\\sigma_x\\) is a permutation of \\(\\{1,2,3\\}\\).  \nConversely, any choice of a permutation \\(\\sigma_x\\) for every \\(x\\) determines\nwhich block each occurrence of \\(x\\) occupies.\n\n--------------------------------------------------------------------\n### 1.  Counting the permutations \\(\\sigma_x\\)\n\nWrite a \\(9\\times3\\) matrix whose rows are the six possible permutations of\n\\(\\{1,2,3\\}\\):\n\n\\[\n\\begin{array}{c}\n123\\\\ 213\\\\ 321\\\\ 132\\\\ 231\\\\ 312\n\\end{array}\n\\]\n\nIf a number receives a given permutation, that row of the matrix is placed in\nthe matrix of size \\(9\\times3\\).  \nDenote by \\(x_i\\;(i=1,\\dots ,6)\\) the number of numbers that receive the\n\\(i\\)\u2011th permutation.  \n\nRow\u2011balance (each number uses each symbol once) is automatic; column\u2011balance\n(because each block must contain exactly three numbers in each row) gives\n\n\\[\n\\begin{aligned}\nx_1+x_4&=3,\\qquad x_2+x_5=3,\\qquad x_3+x_6=3,\\\\\nx_2+x_6&=3,\\qquad x_1+x_3=3,\\qquad x_4+x_5=3,\n\\end{aligned}\n\\]\n\nwith \\(\\sum_{i=1}^6x_i=9\\).\nSolving gives a one\u2011parameter family\n\n\\[\n(x_1,x_2,x_3,x_4,x_5,x_6)=\\bigl(3-t,\\;t,\\;t,\\;t,\\;3-t,\\;3-t\\bigr)\n\\qquad(t=0,1,2,3).\n\\]\n\nFor a fixed \\(t\\) the numbers are assigned to the six permutation types in  \n\n\\[\n\\frac{9!}{(t!)^3\\bigl((3-t)!\\bigr)^3}\n\\]\n\nways.  Summing over the four possible values of \\(t\\),\n\n\\[\nN_{\\sigma}= \\frac{9!}{(3!)^3}+\\frac{9!}{(1!)^3(2!)^3}\n          +\\frac{9!}{(2!)^3(1!)^3}+\\frac{9!}{(3!)^3}\n          =94\\,080 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Placing the numbers inside the blocks\n\nFix the block\u2011row distribution given by the \\(\\sigma_x\\)\u2019s.\nIn each block, a row contains exactly three different numbers.\nThese three numbers can be arranged in the three columns of the block in\n\\(3! = 6\\) ways, independently for the three rows.\nHence each block offers \\(6^{3}=216\\) possibilities, and for the three blocks\n\n\\[\nN_{\\text{cols}} = 6^{9}=10\\,077\\,696 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Total number of fillings\n\n\\[\nN = N_{\\sigma}\\,N_{\\text{cols}}\n   = 94\\,080 \\times 6^{9}\n   = 948\\,109\\,639\\,680 .\n\\]\n\nPrime factorising,\n\n\\[\nN = 2^{16}\\cdot 3^{10}\\cdot 5^{1}\\cdot 7^{2}.\n\\]\n\nThus we may take  \n\n\\[\np=2,\\;a=16,\\qquad q=3,\\;b=10,\\qquad r=5,\\;c=1,\\qquad s=7,\\;d=2 .\n\\]\n\nFinally,\n\n\\[\np a+ q b+ r c+ s d\n= 2\\cdot16 + 3\\cdot10 + 5\\cdot1 + 7\\cdot2\n= 32+30+5+14 = 81 .\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\{A,B,\\dots ,L\\}= \\{1,2,\\dots ,12\\}\n\\]\n\nand let a random pairing be a perfect matching of the 12 numbers.\nFor each pair \\(\\{a,b\\}\\;(a<b)\\) we write the word \\(ab\\);  \nthe six words are then listed in alphabetical order.  \n\n--------------------------------------------------------------------\n### 1.  What determines the last word?\n\nIn each pair the smaller letter is written first, so the six words are\n\n\\[\n\\{\\,\\underbrace{\\text{smaller}}_{\\text{first letter}},\\ \\text{larger}\\,\\}.\n\\]\n\nIf we denote by  \n\n\\[\nS=\\{\\,\\min\\{a,b\\}\\mid\\{a,b\\}\\text{ a pair}\\,\\},\n\\]\n\nthen \\(|S|=6\\) and the last (lexicographically largest) word is the\npair whose **smaller** element is the largest element of \\(S\\).\n\nHence the last word contains \\(G\\) iff the smaller element of the\npair containing \\(G\\) is the maximal element of \\(S\\).\n\n--------------------------------------------------------------------\n### 2.  Condition on the partner of \\(G\\)\n\nLet the partner of \\(G\\;(=7)\\) be \\(j\\neq7\\).\n\n*If \\(j>7\\):* then the smaller element of the \\(G\\)\u2013pair is \\(7\\).  \nWe need that every other pair have its smaller element \\(\\le 6\\); i.e.\nall the other five \u201csmaller\u201d letters must lie in \\(\\{1,\\dots ,6\\}\\).\n\n*If \\(j<7\\):* then the smaller element of the \\(G\\)\u2013pair is \\(j\\).  \nWe need that every other smaller element be \\(<j\\); consequently all\nthe remaining five smaller letters must be taken from \\(\\{1,\\dots ,j-1\\}\\).\n\n--------------------------------------------------------------------\n### 3.  Counting matchings that satisfy the condition\n\nAfter fixing the partner \\(j\\) we have 10 letters left.\nLet  \n\n\\[\nL=\\{\\text{remaining letters }<j\\},\\qquad H=\\{\\text{remaining letters }\\ge j\\}.\n\\]\n\nThe condition \u201cno other pair has a smaller element \\(\\ge j\\)\u201d is\nequivalent to **no pair joining two letters of \\(H\\)**; every element\nof \\(H\\) must be paired with a distinct element of \\(L\\).\n\nIf \\(|L|=l\\) and \\(|H|=h\\) (\\(l+h=10\\)), the number of perfect matchings\nwith no \\(H\\!-\\!H\\) pair is\n\n\\[\n\\binom{l}{h}h!\\,(l-h-1)!!\\;,\n\\]\n\nwhere \\((2k-1)!!=1\\cdot3\\cdots(2k-1)\\).\nThe total number of matchings on 10 letters is \\((10-1)!!=945\\).\n\n---\n\n* **\\(j>7\\) (five possibilities)**  \n  Here \\(j\\in\\{8,9,10,11,12\\}\\).  \n  We have \\(L=\\{1,\\dots ,6\\}\\;(l=6),\\ H=\\) the four other numbers \\(>7\\)\n  \\((h=4)\\).  \n\n  \\[\n  \\frac{\\binom{6}{4}4!\\,(6-4-1)!!}{945}\n  =\\frac{15\\cdot24\\cdot1}{945}=\\frac{8}{21}.\n  \\]\n\n* **\\(j=6\\)**  \n  Then \\(L=\\{1,\\dots ,5\\},\\ H=\\{8,9,10,11,12\\}\\) (\\(l=h=5\\)).  \n\n  \\[\n  \\frac{\\binom{5}{5}5!\\,(5-5-1)!!}{945}\n  =\\frac{5!}{945}=\\frac{120}{945}=\\frac{8}{63}.\n  \\]\n\n* **\\(j=1,2,3,4,5\\)**  \n  In these cases \\(h>l\\); it is impossible to avoid an \\(H\\!-\\!H\\) pair,\n  so the probability is \\(0\\).\n\n--------------------------------------------------------------------\n### 4.  Assemble the total probability\n\nEach of the 11 possible partners of \\(G\\) is equally likely (\\(1/11\\)).\nTherefore\n\n\\[\n\\begin{aligned}\nP(\\text{last word contains }G)\n&= \\frac1{11}\\Bigl(5\\cdot\\frac{8}{21}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&= \\frac1{11}\\Bigl(\\frac{120}{63}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&= \\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\displaystyle\\frac{128}{693}\\) is already in lowest terms.\nHence  \n\n\\[\nm=128,\\qquad n=693,\\qquad m+n=821.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nP(n)=3(n+3)(n^{2}+9).\n\\]\n\nWe need all positive integers \\(n\\) for which  \n\n\\[\nn+2 \\mid P(n).\n\\]\n\n---\n\n### 1. Work modulo \\(n+2\\)\n\nWrite \\(n\\equiv -2 \\pmod{\\,n+2\\,}\\).  \nReplace \\(n\\) by \\(-2\\) in the factors of \\(P(n)\\) (this gives the remainder of each factor modulo \\(n+2\\)):\n\n\\[\n\\begin{aligned}\nn+3 &\\equiv (-2)+3 = 1 \\pmod{n+2},\\\\[2mm]\nn^{2}+9 &\\equiv (-2)^{2}+9 = 4+9 = 13 \\pmod{n+2}.\n\\end{aligned}\n\\]\n\nHence\n\n\\[\nP(n)=3(n+3)(n^{2}+9)\\equiv 3\\cdot 1\\cdot 13 = 39\\pmod{n+2}.\n\\]\n\n---\n\n### 2. Condition for divisibility\n\nThe requirement \\(n+2\\mid P(n)\\) is equivalent to  \n\n\\[\nP(n)\\equiv 0\\pmod{n+2}\\Longleftrightarrow 39\\equiv 0\\pmod{n+2}.\n\\]\n\nThus  \n\n\\[\nn+2 \\text{ must be a positive divisor of } 39.\n\\]\n\nThe positive divisors of \\(39\\) are  \n\n\\[\n1,\\;3,\\;13,\\;39.\n\\]\n\nSince \\(n\\) is a **positive** integer, \\(n+2\\ge 3\\).  \nHence \\(n+2\\) can be only \\(3,\\;13,\\;39\\).\n\n---\n\n### 3. Corresponding values of \\(n\\)\n\n\\[\n\\begin{array}{c|c}\nn+2 & n \\\\ \\hline\n3   & 1\\\\\n13  & 11\\\\\n39  & 37\n\\end{array}\n\\]\n\nAll three satisfy the original condition (a quick check confirms divisibility).\n\n---\n\n### 4. Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      We place the six collinear points on the \\(x\\)-axis.\n\n---\n\n### 1.  Determine the coordinates of \\(A,B,C,D,E,F\\)\n\nLet \\(A=(0,0)\\).  \nWrite the distances in terms of the unknown coordinate \\(AB=x\\).\n\n\\[\n\\begin{aligned}\nC&: AC=26 \\quad\\Longrightarrow\\quad C=(26,0)\\\\\nB&: AB=x \\quad\\Longrightarrow\\quad B=(x,0)\\\\\nD&: BD=22 \\quad\\Longrightarrow\\quad D=(x+22,0)\\\\\nE&: CE=31 \\quad\\Longrightarrow\\quad E=(26+31,0)=(57,0)\\\\\nF&: DF=33 \\quad\\Longrightarrow\\quad F=(x+22+33,0)=(x+55,0)\\\\\n\\text{and }AF&=73 \\Longrightarrow x+55=73 .\n\\end{aligned}\n\\]\n\nHence \\(x=18\\). So  \n\n\\[\nA=0,\\; B=18,\\; C=26,\\; D=40,\\; E=57,\\; F=73 .\n\\]\n\nThese satisfy all given segment lengths.\n\n---\n\n### 2.  Locate point \\(G\\)\n\nLet \\(G=(u,v)\\) with \\(v\\neq 0\\).  \nFrom the given distances\n\n\\[\n\\begin{cases}\n(u-26)^2+v^2 = 40^2 =1600,\\\\[2pt]\n(u-40)^2+v^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtract the second equation from the first:\n\n\\[\n(u-26)^2-(u-40)^2 = 700 .\n\\]\n\nExpanding,\n\n\\[\n(-52u+676)-(-80u+1600)=28u-924=700\n\\Longrightarrow 28u=1624\\Longrightarrow u=58 .\n\\]\n\nNow find \\(v\\):\n\n\\[\n(58-26)^2+v^2=1600\\Longrightarrow 32^2+v^2=1600\n\\Longrightarrow v^2=1600-1024=576 .\n\\]\n\nThus \\(|v|=24\\).  Take \\(v=24\\) (the sign does not affect the area).  \n\n\\[\n\\boxed{G=(58,24)} .\n\\]\n\n---\n\n### 3.  Area of \\(\\triangle BGE\\)\n\nPoints on the \\(x\\)-axis:\n\n\\[\nB=(18,0),\\qquad E=(57,0).\n\\]\n\nThe length of the base \\(BE\\) is\n\n\\[\nBE = 57-18 = 39 .\n\\]\n\nSince the line through \\(B\\) and \\(E\\) is the \\(x\\)-axis, the perpendicular distance from \\(G\\) to this line is \\(|v|=24\\).\n\nHence\n\n\\[\n[\\triangle BGE]=\\frac12\\,(BE)\\cdot(\\text{height})\n               =\\frac12\\cdot 39\\cdot 24\n               =\\frac{936}{2}=468 .\n\\]\n\n(Using the determinant formula also gives \\(468\\).)\n\n---\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The inequalities  \n\n\\[\nx-yz<y-zx<z-xy\n\\]\n\ncan be rewritten by factoring:\n\n\\[\n\\begin{aligned}\nx-yz<y-zx &\\iff (x-y)(1+z)<0,\\\\[2pt]\ny-zx<z-xy &\\iff (y-z)(1+x)<0 .\n\\end{aligned}\n\\]\n\nSince the points lie on the plane  \n\n\\[\nx+y+z=75\\qquad\\Longrightarrow\\qquad z=75-x-y,\n\\]\n\nthe two conditions become inequalities in the variables \\(x,y\\):\n\n\\[\n\\begin{cases}\n(x-y)\\bigl(76-x-y\\bigr)<0,\\\\[2pt]\n\\bigl(x+2y-75\\bigr)(1+x)<0 .\n\\end{cases}\n\\tag{1}\n\\]\n\n---\n\n### 1.  Geometry of the half\u2011planes\n\nFrom (1)\n\n* \\((x-y)(76-x-y)<0\\) gives either  \n\n  \\[\n  \\begin{cases}\n  x>y,\\;x+y>76 \\quad\\text{(region }A_1)\\\\\n  \\text{or}\\\\\n  x<y,\\;x+y<76 \\quad\\text{(region }A_2)\n  \\end{cases}\n  \\]\n\n* \\((x+2y-75)(1+x)<0\\) gives either  \n\n  \\[\n  \\begin{cases}\n  x<-1,\\;x+2y>75 \\quad\\text{(region }B_1)\\\\\n  \\text{or}\\\\\n  x>-1,\\;x+2y<75 \\quad\\text{(region }B_2)\n  \\end{cases}\n  \\]\n\nThe set of points satisfying both inequalities is the intersection of one of the\n\\(A_i\\) with one of the \\(B_j\\).\n\nChecking the four possibilities:\n\n* \\(A_1\\cap B_1=\\varnothing\\) (impossible to have \\(x>y\\) and \\(x<-1\\) while\n  \\(x+y>76\\)).\n* \\(A_1\\cap B_2\\) is non\u2011empty and unbounded (e.g. \\(x>77\\)).\n* \\(A_2\\cap B_1\\) is non\u2011empty and unbounded (e.g. \\(x<-1\\)).\n* \\(A_2\\cap B_2\\) is bounded.\n\nThus there are three convex components: two infinite ones and one finite one,\nthe latter being \\(A_2\\cap B_2\\).\n\n---\n\n### 2.  The finite region\n\n\\(A_2\\cap B_2\\) is described by  \n\n\\[\n\\begin{cases}\nx>-1,\\\\\nx<y,\\\\\nx+2y<75 .\n\\end{cases}\n\\]\n\nFrom \\(x+2y<75\\) we have \\(y<(75-x)/2\\).  \nTogether with \\(y>x\\) we obtain\n\n\\[\n-1<x<25,\\qquad x<y<\\frac{75-x}{2}.\n\\]\n\nThe three bounding lines intersect at\n\n\\[\n\\begin{aligned}\nx=-1 \\ \\text{and}\\ y=x&\\;&\\Rightarrow\\;(-1,-1),\\\\\nx=-1 \\ \\text{and}\\ x+2y=75&\\;&\\Rightarrow\\;(-1,38),\\\\\ny=x \\ \\text{and}\\ x+2y=75&\\;&\\Rightarrow\\;(25,25).\n\\end{aligned}\n\\]\n\nHence the finite region is the interior of the triangle with vertices  \n\\((-1,-1),\\;(-1,38),\\;(25,25)\\).\n\nIts area in the \\(xy\\)-plane is\n\n\\[\n\\text{Area}_{xy}\n=\\frac12\\cdot\\text{base}\\cdot\\text{height}\n=\\frac12\\cdot 39\\cdot 26 =507 .\n\\]\n\n---\n\n### 3.  Area on the plane \\(x+y+z=75\\)\n\nThe map \\((x,y)\\mapsto (x,y,75-x-y)\\) sends the \\(xy\\)-plane onto the given\nplane.  The area is scaled by the factor\n\n\\[\n\\bigl|\\partial_{x}(x,y,z)\\times\\partial_{y}(x,y,z)\\bigr|\n=|(1,0,-1)\\times(0,1,-1)|\n=|(1,1,1)|\n=\\sqrt{3}.\n\\]\n\nThus the area of the finite region on the plane is\n\n\\[\n\\text{Area}= \\sqrt{3}\\times 507 = 507\\sqrt{3}.\n\\]\n\n---\n\nThe required form is \\(a\\sqrt{b}\\) with \\(a=507,\\;b=3\\).  Hence\n\n\\[\na+b = 507+3 = 510.\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nP=\\prod_{k=4}^{63}\\frac{\\log_k\\!\\big(5^{\\,k^2-1}\\big)}{\\log_{k+1}\\!\\big(5^{\\,k^2-4}\\big)}\n\\]\n\n---\n\n### 1.  Change of base  \n\n\\[\n\\log_a b=\\frac{\\ln b}{\\ln a}\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\n\\log_k\\!\\big(5^{k^2-1}\\big)&=\\frac{(k^2-1)\\ln5}{\\ln k},\\\\[2mm]\n\\log_{k+1}\\!\\big(5^{k^2-4}\\big)&=\\frac{(k^2-4)\\ln5}{\\ln(k+1)} .\n\\end{aligned}\n\\]\n\nTherefore each factor of the product is\n\n\\[\n\\frac{(k^2-1)\\ln5/\\ln k}{(k^2-4)\\ln5/\\ln(k+1)}\n= \\frac{k^2-1}{k^2-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nThus  \n\n\\[\nP=\\Bigg(\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\\Bigg)\n   \\Bigg(\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\\Bigg).\n\\]\n\n---\n\n### 2.  Telescoping the logarithmic part  \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n =\\frac{\\ln5}{\\ln4}\\cdot\\frac{\\ln6}{\\ln5}\\cdots\\frac{\\ln64}{\\ln63}\n =\\frac{\\ln64}{\\ln4}\n =\\log_4 64 = 3 .\n\\]\n\n---\n\n### 3.  Simplify the rational part  \n\n\\[\n\\frac{k^2-1}{k^2-4}\n =\\frac{(k-1)(k+1)}{(k-2)(k+2)}\n =\\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nHence  \n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\n =\\Bigg(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigg)\n  \\Bigg(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigg).\n\\]\n\n*First product*  \n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\frac{5}{4}\\cdots\\frac{62}{61}\n =\\frac{62}{2}=31 .\n\\]\n\n*Second product*  \n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\frac{7}{8}\\cdots\\frac{64}{65}\n =\\frac{5}{65}= \\frac{1}{13}.\n\\]\n\nThus the rational part equals  \n\n\\[\n31\\cdot\\frac{1}{13}= \\frac{31}{13}.\n\\]\n\n---\n\n### 4.  Combine the two parts  \n\n\\[\nP=\\frac{31}{13}\\times 3 = \\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms, so  \n\n\\[\nm=93,\\qquad n=13,\\qquad m+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(a_{1},a_{2}\\) be the two **vertical** interior unit segments (the left\u2013right dividing line),  \n* \\(b_{1},b_{2}\\) be the two **horizontal** interior unit segments (the bottom\u2013top dividing line).\n\nThe eight outer\u2013boundary unit segments belong to only one square, while each interior segment belongs to two squares.\n\n---\n\n### 1.  Equations for the four unit squares  \n\nDenote by \\(L_1 ,D_1\\) the left and bottom edges of the lower\u2011left square, etc.  \nWriting a red edge as \\(1\\) and a blue edge as \\(0\\), the condition \u201cexactly two red sides\u2019\u2019 for each square gives  \n\n\\[\n\\begin{aligned}\nL_1 + D_1 + a_{1}+ b_{1} &=2,\\\\\nD_2 + R_2 + a_{1}+ b_{2} &=2,\\\\\nL_3 + T_3 + a_{2}+ b_{1} &=2,\\\\\nR_4 + T_4 + a_{2}+ b_{2} &=2,\n\\end{aligned}\n\\]\n\nwhere the eight variables \\(L_1,D_1,D_2,R_2,L_3,T_3,R_4,T_4\\) are the boundary edges and the\nfour variables \\(a_{1},a_{2},b_{1},b_{2}\\) are the interior edges.\n\nFor a fixed choice of the interior edges, each equation tells us the sum of the two\nboundary edges of that square:\n\n\\[\n\\begin{aligned}\nL_1+D_1 &=2-(a_{1}+b_{1}),\\\\\nD_2+R_2 &=2-(a_{1}+b_{2}),\\\\\nL_3+T_3 &=2-(a_{2}+b_{1}),\\\\\nR_4+T_4 &=2-(a_{2}+b_{2}).\n\\end{aligned}\n\\tag{1}\n\\]\n\nThe right\u2011hand side can be \\(0,1,\\) or \\(2\\).  \n\n* If it is \\(0\\) or \\(2\\) there is **exactly one** way to colour the two boundary\nedges (both blue or both red).  \n* If it is \\(1\\) there are **two** ways (one red, one blue).\n\nThus for a given interior assignment the number of completions equals  \n\n\\[\n\\prod_{i=1}^{4}f\\bigl(2-(a_{i}+b_{j})\\bigr),\n\\qquad\nf(0)=f(2)=1,\\;f(1)=2 .\n\\tag{2}\n\\]\n\nThe factor contributed by a square is \\(2\\) precisely when the sum of its two\ninterior edges equals \\(1\\).\n\n---\n\n### 2.  How many squares have interior\u2011sum \\(=1\\)?\n\nLet  \n\n\\[\nA = a_{1}+a_{2}\\quad(\\text{number of red vertical interiors}),\\qquad\nB = b_{1}+b_{2}\\quad(\\text{number of red horizontal interiors}).\n\\]\n\nFor a square the two interior edges are one vertical and one horizontal, so the\nsquare\u2019s interior sum is \\(1\\) exactly when the chosen vertical edge and horizontal\nedge have different colours.  Hence the number of squares with interior\u2011sum \\(=1\\) is  \n\n\\[\nN = A(2-B)+(2-A)B = 2A+2B-2AB.\n\\tag{3}\n\\]\n\nBecause \\(A,B\\in\\{0,1,2\\}\\),\n\n\\[\nN=\n\\begin{cases}\n0 & (A,B)=(0,0)\\text{ or }(2,2),\\\\[2pt]\n2 & \\text{otherwise except the next case},\\\\[2pt]\n4 & (A,B)=(0,2)\\text{ or }(2,0).\n\\end{cases}\n\\]\n\n---\n\n### 3.  Counting all interior assignments  \n\nThe numbers of interior assignments for each \\((A,B)\\) are\n\n\\[\n\\begin{array}{c|c|c}\n(A,B) & \\text{\\# assignments} & N \\\\ \\hline\n(0,0) & 1 & 0\\\\\n(2,2) & 1 & 0\\\\\n(0,2) & 1 & 4\\\\\n(2,0) & 1 & 4\\\\\n(0,1) & 2 & 2\\\\\n(1,0) & 2 & 2\\\\\n(1,1) & 4 & 2\\\\\n(1,2) & 2 & 2\\\\\n(2,1) & 2 & 2\n\\end{array}\n\\]\n\nFor a given interior assignment the number of ways to colour the boundary\nedges is \\(2^{N}\\) (by (2)).  Therefore\n\n\\[\n\\begin{aligned}\n\\#\\text{colorings}&=\n1\\cdot2^{0}+1\\cdot2^{0}\n+1\\cdot2^{4}+1\\cdot2^{4}\n+ (2+2+4+2+2)\\cdot2^{2} \\\\[4pt]\n&=2\\cdot1 + 2\\cdot16 + 12\\cdot4 \\\\[4pt]\n&=2 + 32 + 48 \\\\[4pt]\n&=82 .\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{82}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(O\\) be the centre of \\(\\omega _2\\) (radius \\(15\\)),\n* \\(A\\) the centre of \\(\\omega _1\\) (radius \\(6\\)),\n* \\(B\\) the internal point of tangency of the two circles.\n\nPlace the picture on a coordinate plane.\n\n---\n\n### 1.  Coordinates of the given points  \n\nTake \\(O=(0,0)\\).  \nSince \\(OA=15-6=9\\) and the circles are tangent internally, we may put  \n\n\\[\nA=(9,0), \\qquad B=(15,0).\n\\]\n\n\\(BC\\) is a diameter of \\(\\omega _2\\) through \\(B\\); hence  \n\n\\[\nC=(-15,0).\n\\]\n\n\\(AD\\perp BC\\) forces \\(AD\\) to be the vertical line through \\(A\\); intersecting this line with\n\\(\\omega _2\\) gives  \n\n\\[\nD=(9,-12)\\quad\\text{or}\\quad (9,12).\n\\]\n\nThe condition \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u201d (see below) makes\n\\(D=(9,-12)\\).\n\n---\n\n### 2.  The rectangle \\(EFGH\\)\n\n\\(EFGH\\) is inscribed in the circle \\(\\omega_1\\), so its vertices lie on  \n\n\\[\n(x-9)^2+y^2=6^2=36 .\n\\]\n\nSince \\(\\overline{EF}\\perp BC\\) and \\(BC\\) is horizontal, \\(\\overline{EF}\\) is vertical.\nLet  \n\n\\[\n\\begin{aligned}\nE&=(9+w,\\,h),\\\\\nF&=(9+w,\\,-h),\\\\\nG&=(9-w,\\,-h),\\\\\nH&=(9-w,\\,h),\n\\end{aligned}\n\\]\n\nwhere \\(w>0,\\,h>0\\) are the half\u2011width and half\u2011height of the rectangle.\n\nAll four vertices satisfy the circle equation, giving the single relation  \n\n\\[\nw^{2}+h^{2}=36\\tag{1}\n\\]\n\n(the rectangle\u2019s centre is the circle\u2019s centre \\(A\\)).\n\nBecause the point \\(C=(-15,0)\\) is farther to the right than to the left,\nthe condition \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u2019\u2019 forces\n\\(\\overline{GH}\\) to be the **left** side (\\(x=9-w\\)), which is already the case.\n\nSince \\(D=(9,-12)\\) lies below the centre, \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u2019\u2019 forces\n\\(\\overline{FG}\\) to be the **bottom** side (\\(y=-h\\)).  This orientation matches the above labeling.\n\n---\n\n### 3.  Areas of the two triangles  \n\n*Triangle \\(DGF\\)*  \n\nThe points are \\(D(9,-12),\\; G(9-w,-h),\\; F(9+w,-h)\\).\nIts base \\(GF\\) has length \\(2w\\) and its height (vertical distance from \\(D\\) to the base) is \\(12-h\\).  \nHence  \n\n\\[\n[\\,DGF\\,]=\\tfrac12\\,(2w)(12-h)=w(12-h).\\tag{2}\n\\]\n\n*Triangle \\(CHG\\)*  \n\nThe points are \\(C(-15,0),\\; H(9-w,h),\\; G(9-w,-h)\\).\nIts base \\(HG\\) has length \\(2h\\) and its horizontal distance from \\(C\\) to the line \\(x=9-w\\) is\n\\(|-15-(9-w)|=24-w\\).  \nThus  \n\n\\[\n[\\,CHG\\,]=\\tfrac12\\,(2h)(24-w)=h(24-w).\\tag{3}\n\\]\n\nThe problem states the two areas are equal, so\n\n\\[\nw(12-h)=h(24-w).\\tag{4}\n\\]\n\nExpanding gives \\(12w-wh=24h-wh\\), whence  \n\n\\[\n12w=24h \\qquad\\Longrightarrow\\qquad w=2h.\\tag{5}\n\\]\n\n---\n\n### 4.  Solving for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1):\n\n\\[\n(2h)^2+h^2=36 \\;\\Longrightarrow\\;5h^{2}=36 \\;\\Longrightarrow\\;\nh=\\frac{6}{\\sqrt5}=\\frac{6\\sqrt5}{5}.\n\\]\n\nHence  \n\n\\[\nw=2h=\\frac{12}{\\sqrt5}=\\frac{12\\sqrt5}{5}.\n\\]\n\n---\n\n### 5.  Area of the rectangle  \n\nThe side lengths are \\(2w\\) and \\(2h\\).  Therefore  \n\n\\[\n\\text{Area}= (2w)(2h)=4wh.\n\\]\n\nUsing \\(w=2h\\),\n\n\\[\n4wh = 4(2h)h = 8h^{2}=8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nThus the area is \\(\\displaystyle\\frac{288}{5}\\); the numerator and denominator are coprime.\n\n\\[\nm=288,\\qquad n=5,\\qquad m+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The divisors of \\(2025\\) are all numbers of the form  \n\n\\[\n3^{a}5^{b},\\qquad 0\\le a\\le 4,\\;0\\le b\\le 2 .\n\\]\n\nHence  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\nSo there are \\(2^{15}\\) subsets of \\(A\\) (including the empty set).\n\n--------------------------------------------------------------------\n### When does a subset have lcm \\(2025\\)?\n\nThe prime factorisation of \\(2025\\) is  \n\n\\[\n2025 = 3^{4}\\,5^{2}.\n\\]\n\nFor a subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a_i}\\,5^{\\max b_i},\n\\]\n\nwhere \\((a_i,b_i)\\) are the exponents of the elements of \\(B\\).\nThus \\(\\operatorname{lcm}(B)=2025\\) iff  \n\n* at least one element has exponent \\(a=4\\) (i.e. contains \\(3^4\\));\n* at least one element has exponent \\(b=2\\) (i.e. contains \\(5^2\\)).\n\n--------------------------------------------------------------------\n### Sets that provide the required exponents  \n\n\\[\nA_4=\\{d\\in A:3^4\\mid d\\}=\\{3^4\\! \\cdot\\! 5^0,\\;3^4\\! \\cdot\\!5^1,\\;3^4\\! \\cdot\\!5^2\\}\n\\]\nhas \\(|A_4|=3\\) elements.\n\n\\[\nB_2=\\{d\\in A:5^2\\mid d\\}=\\{3^0\\! \\cdot\\!5^2,\\;3^1\\! \\cdot\\!5^2,\\;3^2\\! \\cdot\\!5^2,\n\\;3^3\\! \\cdot\\!5^2,\\;3^4\\! \\cdot\\!5^2\\}\n\\]\nhas \\(|B_2|=5\\) elements.\n\nTheir intersection is the single divisor \\(2025=3^4\\! \\cdot\\!5^2\\).\n\n--------------------------------------------------------------------\n### Counting the suitable subsets  \n\nA subset \\(B\\) works iff it contains **at least one** element of \\(A_4\\) **and** at least one element of \\(B_2\\).\n\nUsing inclusion\u2013exclusion on the \\(2^{15}\\) total subsets:\n\n\\[\n\\begin{aligned}\nN &= 2^{15}\n     -\\underbrace{2^{15-3}}_{\\text{subsets missing }A_4}\n     -\\underbrace{2^{15-5}}_{\\text{subsets missing }B_2}\n     +\\underbrace{2^{15-7}}_{\\text{subsets missing both}} \\\\[4pt]\n  &= 2^{15}-2^{12}-2^{10}+2^{8}\\\\\n  &= 32768-4096-1024+256\\\\\n  &= 27904 .\n\\end{aligned}\n\\]\n\nThus the desired probability is  \n\n\\[\n\\frac{N}{2^{15}}=\\frac{27904}{32768}\n          =\\frac{109}{128}\\qquad(\\text{after cancelling }256).\n\\]\n\n--------------------------------------------------------------------\n### Answer  \n\n\\(m=109,\\;n=128\\), so  \n\n\\[\nm+n=109+128=237 .\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1 \u2013  What we have to count**\n\nThe two perpendicular diameters are two line segments that intersect once, so after they are drawn the disk is divided into  \n\n\\[\nF_0=4\\qquad\\text{regions}.\n\\]\n\nEvery time we draw a new segment, it splits each region it meets into two pieces.  \nIf the new segment meets \\(k\\) already\u2011drawn segments in interior points, it creates \\(k+1\\) new regions.  \n\nHence  \n\n\\[\n\\boxed{\\text{# of regions}=1+\\#\\text{segments}+ \\#\\text{intersection points}}\n\\tag{1}\n\\]\n\n(the \u201c\\(1\\)\u201d is the original whole disk).  \nWe have \\(27\\) segments in total (the 2 diameters + the 25 random chords).  \nThus we only have to find the **expected number of intersection points**.\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013  Intersections with the two diameters**\n\nFor a random chord we must choose its two endpoints in *different* quadrants.\nThe unordered pair of quadrants is equally likely among the  \n\n\\[\n\\binom{4}{2}=6\n\\]\n\npossibilities.  \n\n* Adjacent quadrants (four choices) \u2013 the chord meets **one** diameter.  \n* Opposite quadrants (two choices) \u2013 the chord meets **both** diameters.\n\nTherefore for one random chord  \n\n\\[\nE[\\text{diameters met}]\n=\\frac{4}{6}\\cdot1+\\frac{2}{6}\\cdot2=\\frac{4}{3}.\n\\]\n\nWith \\(N=25\\) random chords\n\n\\[\nE[\\text{intersections with the two diameters}]\n=N\\cdot\\frac{4}{3}= \\frac{100}{3}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013  Intersection of two random chords**\n\nLet a chord be drawn.  \nWrite its endpoints as angles measured from the positive \\(x\\)\u2013axis.\nBecause the two endpoints are in different quadrants, the unordered pair of\nquadrants is uniform among the six possibilities.\n\n*Probability that a second random chord meets the first.*\n\nLet the first chord be fixed.  \nDenote by \\(I\\) the clockwise arc of the circle from its first endpoint to its\nsecond endpoint; let \\(|I|=L\\).\nIf a second chord has one endpoint in \\(I\\) and the other outside \\(I\\) the two\nchords intersect.  \n\nWhen the second chord is chosen, its first endpoint \\(U\\) is uniform on the whole\ncircle, and its second endpoint \\(V\\) is uniform on the *three* quadrants that are\ndifferent from the quadrant of \\(U\\).  \nA short calculation (integrating over the position of \\(U\\) inside \\(I\\))\ngives for a fixed chord\n\n\\[\n\\boxed{q=\\frac{L}{\\pi}-\\frac{2L^{2}}{3\\pi^{2}}\n      +\\frac{2}{3\\pi^{2}}\\!\\int_{I}\\!|I\\cap Q(\\theta)|\\,d\\theta},\n\\tag{3}\n\\]\nwhere \\(Q(\\theta)\\) is the quadrant containing \\(\\theta\\).\n\nNow we average (3) over the possible positions of the first chord.\n\n*Adjac\u00adent quadrants.*  \nThe arc \\(I\\) lies in exactly two quadrants; write its lengths in those\nquadrants as \\(L_{1},L_{2}\\) (\\(L=L_{1}+L_{2}\\)).  \nThen \\(\\int_{I}|I\\cap Q|\\,d\\theta = L_{1}^{2}+L_{2}^{2}\\).\nWith \\(L_{1},L_{2}\\) independent and uniform on \\([0,\\pi/2]\\),\n\n\\[\nE[q\\mid\\text{adjacent}] = \\frac{5}{12}.\n\\]\n\n*Opposite quadrants.*  \nNow \\(I\\) occupies three quadrants; let the lengths in the three\nquadrants be \\(u,\\,\\pi/2,\\,v\\) (\\(u,v\\) independent uniform on \\([0,\\pi/2]\\)).  \nThen \\(\\int_{I}|I\\cap Q|\\,d\\theta = u^{2}+(\\pi/2)^{2}+v^{2}\\).\nAveraging gives\n\n\\[\nE[q\\mid\\text{opposite}] = \\frac{7}{12}.\n\\]\n\nThe first chord is adjacent with probability \\(\\frac{2}{3}\\) and opposite with\nprobability \\(\\frac13\\).  Hence the probability that two independently drawn\nrandom chords intersect is\n\n\\[\np=\\frac{2}{3}\\cdot\\frac{5}{12}+\\frac{1}{3}\\cdot\\frac{7}{12}\n    =\\frac{17}{36}.\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013  Expected intersections among the 25 random chords**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of random chords, each\nintersecting with probability \\(p\\).  Thus\n\n\\[\nE[\\text{intersections among the 25 chords}]\n=300\\cdot\\frac{17}{36}= \\frac{425}{3}.\n\\tag{5}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013  Total expected number of intersection points**\n\nAdd all contributions:\n\n* one intersection of the two diameters,\n* intersections of random chords with the two diameters \\(\\displaystyle\\frac{100}{3}\\)   (from (2)),\n* intersections among the random chords \\(\\displaystyle\\frac{425}{3}\\)   (from (5)).\n\n\\[\nE[\\text{total intersections}]\n=1+\\frac{100}{3}+\\frac{425}{3}=1+\\frac{525}{3}=176.\n\\tag{6}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 6 \u2013  Expected number of regions**\n\nInsert (6) into formula (1):\n\n\\[\nE[\\text{regions}]\n=1+\\underbrace{27}_{\\text{segments}}+\\underbrace{176}_{\\text{intersection points}}\n=204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The zeros of  \n\n\\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr)\n\\]\n\nsatisfy  \n\n\\[\n\\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\\Longrightarrow 7\\pi\\sin(5x)=k\\pi,\\qquad k\\in\\mathbb Z .\n\\]\n\nHence  \n\n\\[\n\\sin (5x)=\\frac{k}{7},\\qquad -7\\le k\\le 7 .\n\\]\n\n---\n\n### 1.  Counting all zeros \\(n\\)\n\nPut \\(\\theta =5x\\).  \nBecause \\(0<x<2\\pi\\), we have \\(0<\\theta<10\\pi\\).\n\nFor each integer \\(k\\) we count the solutions of \\(\\sin\\theta = k/7\\) in \\((0,10\\pi)\\).\n\n* **\\(k=\\pm7\\) :** \\(\\sin\\theta=\\pm1\\).  \n  Solutions are \\(\\theta =\\frac{\\pi}{2}+2\\pi m\\) (or \\(\\frac{3\\pi}{2}+2\\pi m\\)).  \n  In a length \\(10\\pi\\) there are \\(5\\) such values for each sign.  \n  \u2192 \\(5+5=10\\) solutions.\n\n* **\\(k=0\\) :** \\(\\sin\\theta=0\\).  \n  Solutions are \\(\\theta=n\\pi\\).  \n  With \\(0<\\theta<10\\pi\\) we have \\(n=1,2,\\dots ,9\\): \\(9\\) solutions.\n\n* **\\(k=\\pm1,\\pm2,\\ldots,\\pm6\\) (12 values):** \\(\\sin\\theta = k/7\\) is a non\u2011extreme value.  \n  In each full period of length \\(2\\pi\\) there are \\(2\\) solutions; we have five periods, so each such \\(k\\) yields \\(10\\) solutions.  \n  \u2192 \\(12\\cdot10=120\\) solutions.\n\nHence  \n\n\\[\nn = 10\\;(\\text{from }k=\\pm7)+9\\;(\\text{from }k=0)+120\\;(\\text{from }k=\\pm1,\\dots,\\pm6)=139 .\n\\]\n\n---\n\n### 2.  Tangential zeros \\(t\\)\n\nThe derivative is  \n\n\\[\nf'(x)=\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot 7\\pi\\cdot5\\cos(5x)\n      =35\\pi\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cos(5x).\n\\]\n\nAt a zero of \\(f\\) we have \\(\\sin(5x)=k/7\\) and thus  \n\\(\\cos(7\\pi\\sin(5x))=\\cos(k\\pi)=(-1)^{k}\\).\n\nTherefore  \n\n\\[\nf'(x)=35\\pi(-1)^{k}\\cos(5x).\n\\]\n\nFor the graph to be tangent to the \\(x\\)-axis we need \\(f'(x)=0\\); this occurs exactly when  \n\n\\[\n\\cos(5x)=0 \\quad\\Longleftrightarrow\\quad \\sin(5x)=\\pm1.\n\\]\n\nThus the tangential zeros correspond to the case \\(k=\\pm7\\).  \nWe already counted those: \\(5\\) solutions for \\(k=7\\) and \\(5\\) for \\(k=-7\\).\n\n\\[\nt = 5+5 = 10.\n\\]\n\n---\n\n### 3.  Required sum\n\n\\[\nn+t = 139+10 = 149.\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the chairs be numbered \\(1,2,\\dots ,16\\).\nChoosing the chairs for the eight people is equivalent to writing a binary\nstring of length \\(16\\) with exactly eight \\(1\\)\u2019s (occupied chairs) and\nseven \\(0\\)\u2019s (empty chairs).\n\nThe condition *\u201cno person sits next to two other people\u2019\u2019* means that no\noccupied chair can have occupied neighbours on both sides; thus the binary\nstring must contain **no substring \\(111\\)**.  \nHence we must count binary strings of length \\(16\\) with weight \\(8\\) that avoid\n\\(111\\).\n\n---\n\n### 1.  Describing the strings\n\nThe \\(1\\)\u2019s can appear only in blocks of length \\(1\\) or \\(2\\) (a block of\nlength \\(3\\) would give a forbidden \\(111\\)).  \nSuppose there are  \n\n* \\(s\\) blocks of length \\(2\\);\n* \\(t-s\\) blocks of length \\(1\\),\n\nso the total number of blocks of \\(1\\)\u2019s is \\(t\\).  \nIf each block of length \\(2\\) contributes \\(2\\) and each block of length\n\\(1\\) contributes \\(1\\), then  \n\n\\[\n2s+(t-s)=8\\qquad\\Longrightarrow\\qquad t=8-s .\n\\]\n\nThus \\(s\\) can be \\(0,1,2,3,4\\) (since at most \\(\\lfloor 8/2\\rfloor =4\\) blocks\nof length \\(2\\) are possible).\n\nFor a given \\(s\\) the blocks are ordered, and we must choose which \\(s\\) of\nthe \\(t\\) blocks are the length\u2011\\(2\\) blocks:\n\n\\[\n\\text{choices for block sizes}= \\binom{t}{s}= \\binom{8-s}{s}.\n\\]\n\n---\n\n### 2.  Placing the zeros\n\nBetween two consecutive blocks of \\(1\\)\u2019s there must be at least one\n\\(0\\).  With \\(t\\) blocks there are \\(t-1\\) mandatory zeros.\nThere are \\(8\\) zeros in total (since \\(16-8=8\\)).  \nHence the number of *extra* zeros we may distribute is  \n\n\\[\n8-(t-1)=9-t .\n\\]\n\nThese extra zeros can be placed in any of the \\(t+1\\) gaps\n(before the first block, between blocks, after the last block).  \nBy stars and bars the number of distributions is\n\n\\[\n\\binom{(9-t)+(t+1)-1}{(t+1)-1}\n   =\\binom{9}{t}\n   =\\binom{9}{8-s}.\n\\]\n\n---\n\n### 3.  Total number of admissible subsets\n\nSumming over all possible \\(s\\):\n\n\\[\n\\begin{aligned}\nN &=\\sum_{s=0}^{4}\n    \\binom{8-s}{s}\\binom{9}{8-s}  \\\\\n  &=\\binom{8}{0}\\binom{9}{8}\n   +\\binom{7}{1}\\binom{9}{7}\n   +\\binom{6}{2}\\binom{9}{6}\n   +\\binom{5}{3}\\binom{9}{5}\n   +\\binom{4}{4}\\binom{9}{4}   \\\\\n  &=1\\cdot 9\n   +7\\cdot 36\n   +15\\cdot 84\n   +10\\cdot 126\n   +1\\cdot 126 \\\\\n  &=9+252+1260+1260+126 \\\\\n  &=2907 .\n\\end{aligned}\n\\]\n\nThus there are \\(N=2907\\) subsets of chairs that satisfy the condition.\n\n---\n\n### 4.  Remainder modulo \\(1000\\)\n\n\\[\n2907 \\equiv 907 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=84^\\circ ,\\qquad B=60^\\circ ,\\qquad C=36^\\circ .\n\\]\n\nDenote by \\(O\\) the circumcenter of \\(\\triangle ABC\\) and by \\(N\\) the nine\u2011point\ncenter (the circumcenter of \\(\\triangle DEF\\)).\nPut the circumcircle of \\(\\triangle ABC\\) on the unit circle and let  \n\n\\[\na=1,\\qquad \nb=e^{i\\beta },\\qquad \nc=e^{i\\gamma},\n\\]\n\nwhere the central arcs satisfy  \n\n\\[\n\\widehat{AB}=2C=72^\\circ ,\\qquad \n\\widehat{BC}=2A=168^\\circ ,\\qquad \n\\widehat{CA}=2B=120^\\circ .\n\\]\n\nHence  \n\n\\[\n\\beta =72^\\circ ,\\qquad \\gamma =\\beta +168^\\circ =240^\\circ .\n\\]\n\n--------------------------------------------------------------------\n### 1.  The nine\u2011point centre and the midpoints  \n\n\\[\nN=\\frac{a+b+c}{2},\\qquad \nD=\\frac{b+c}{2},\\;E=\\frac{c+a}{2},\\;F=\\frac{a+b}{2}.\n\\]\n\nFrom these formulas  \n\n\\[\nND=-\\frac a2,\\qquad NE=-\\frac b2,\\qquad NF=-\\frac c2 .\\tag{1}\n\\]\n\nThus the directions of the radii to the midpoints are opposite the\ndirections of the vertices:\n\n\\[\n\\arg(ND)=\\alpha+180^\\circ ,\\quad \n\\arg(NE)=\\beta+180^\\circ ,\\quad \n\\arg(NF)=\\gamma+180^\\circ .\n\\]\n\nConsequently  \n\n\\[\n\\widehat{DE}=|\\arg(NE)-\\arg(ND)|\n      =( \\beta+180^\\circ)-( \\alpha+180^\\circ)=\\beta-\\alpha\n      =2C=72^\\circ .\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2.  The second intersections  \n\nFor a chord whose one endpoint is known, the second endpoint is obtained\nby reflecting the known radius about the line through \\(N\\) that is\nperpendicular to the given line.\n\n*Line \\(BD\\).*  \nThe direction of \\(BD\\) is \\(\\arg(c-b)\\).  \nSince the perpendicular through \\(N\\) makes the angle \\(\\arg(c-b)+90^\\circ\\),\nreflecting \\(ND\\) in this line gives\n\n\\[\n\\arg(NG)=2\\bigl(\\arg(c-b)+90^\\circ\\bigr)-\\arg(ND)\n        =2\\arg(c-b)-\\arg(a).            \\tag{3}\n\\]\n\nUsing the identity  \n\n\\[\n\\arg(c-b)=\\frac{\\beta+\\gamma}{2}+90^\\circ,\n\\]\n\nwe obtain  \n\n\\[\n\\arg(NG)=2\\Bigl(\\frac{72^\\circ+240^\\circ}{2}+90^\\circ\\Bigr)\n        =492^\\circ\\equiv132^\\circ .\n\\]\n\nBecause \\(\\arg(NF)=\\gamma+180^\\circ=60^\\circ\\),\n\n\\[\n\\widehat{FG}=|\\arg(NG)-\\arg(NF)|=132^\\circ-60^\\circ=72^\\circ .\\tag{4}\n\\]\n\n*Line \\(AF\\) (the side \\(AB\\)).*  \nThe direction of \\(AB\\) is \\(\\arg(b-a)\\); hence\n\n\\[\n\\arg(NJ)=2\\arg(b-a)-\\arg(c).                \\tag{5}\n\\]\n\nNow  \n\n\\[\n\\arg(b-a)=\\frac{\\alpha+\\beta}{2}+90^\\circ=126^\\circ,\n\\]\n\nso  \n\n\\[\n\\arg(NJ)=2\\cdot126^\\circ-240^\\circ=12^\\circ .\\tag{6}\n\\]\n\n*Line \\(AE\\) (the median from \\(A\\)).*  \nThe direction of \\(AE\\) is \\(\\arg(c-a)\\); thus\n\n\\[\n\\arg(NH)=2\\arg(c-a)-\\arg(b).                \\tag{7}\n\\]\n\nHere  \n\n\\[\n\\arg(c-a)=\\frac{\\alpha+\\gamma}{2}+90^\\circ=210^\\circ ,\n\\]\n\nhence  \n\n\\[\n\\arg(NH)=2\\cdot210^\\circ-72^\\circ=348^\\circ\\equiv-12^\\circ .\\tag{8}\n\\]\n\nTherefore  \n\n\\[\n\\widehat{HJ}=|\\arg(NJ)-\\arg(NH)|\n            =12^\\circ-(-12^\\circ)=24^\\circ .\\tag{9}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Required sum  \n\nFrom (2), (4) and (9),\n\n\\[\n\\widehat{DE}=72^\\circ ,\\qquad \n\\widehat{HJ}=24^\\circ ,\\qquad \n\\widehat{FG}=72^\\circ .\n\\]\n\nHence  \n\n\\[\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n=72^\\circ+2\\cdot24^\\circ+3\\cdot72^\\circ\n=72+48+216\n=336^\\circ .\n\\]\n\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\boxed{733}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 733

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nr_i=A_1A_i\\qquad (i=2,\\dots ,11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}\\;(2\\le i\\le 10),\\qquad \n\\cos\\theta=\\frac{12}{13}.\n\\]\n\n---\n\n### 1.  Relation between the radii  \n\nThe area of \\(\\triangle A_iA_1A_{i+1}\\) is  \n\n\\[\n1=\\frac12 r_i r_{i+1}\\sin\\theta .\n\\]\n\nSince  \n\n\\[\n\\sin\\theta =\\sqrt{1-\\cos^2\\theta}= \\sqrt{1-\\left(\\frac{12}{13}\\right)^2}= \\frac{5}{13},\n\\]\n\nwe obtain  \n\n\\[\nr_i r_{i+1}= \\frac{2\\cdot13}{5}= \\frac{26}{5}\\;(=C).\n\\tag{1}\n\\]\n\nThus for every \\(i\\),\n\n\\[\nr_{i+1}= \\frac{C}{r_i},\\qquad C=\\frac{26}{5}.\n\\]\n\nConsequently the sequence alternates:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=x,\\qquad\nr_3=r_5=r_7=r_9=r_{11}= \\frac{C}{x},\n\\]\n\nfor some positive number \\(x\\).\n\n---\n\n### 2.  Length of the side \\(A_iA_{i+1}\\)\n\nUsing the law of cosines in \\(\\triangle A_iA_1A_{i+1}\\),\n\n\\[\nA_iA_{i+1}^{2}=r_i^{2}+r_{i+1}^{2}-2r_i r_{i+1}\\cos\\theta .\n\\]\n\nBecause \\(r_i r_{i+1}=C\\) and \\(\\cos\\theta=\\frac{12}{13}\\),\n\n\\[\nA_iA_{i+1}^{2}=r_i^{2}+r_{i+1}^{2}\n          -2C\\cdot\\frac{12}{13}\n          =r_i^{2}+r_{i+1}^{2}-\\frac{48}{5}.\n\\]\n\nNow  \n\n\\[\nr_i^{2}+r_{i+1}^{2}\n   =(r_i+r_{i+1})^{2}-2r_i r_{i+1}\n   =(r_i+r_{i+1})^{2}-2C .\n\\]\n\nHence\n\n\\[\nA_iA_{i+1}^{2}= (r_i+r_{i+1})^{2}-2C-\\frac{48}{5}\n               =(r_i+r_{i+1})^{2}-20 .\n\\tag{2}\n\\]\n\nFor any consecutive pair \\((i,i+1)\\) we have  \n\n\\[\nr_i+r_{i+1}=x+\\frac{C}{x}\\;=:t .\n\\]\n\nThus every side \\(A_iA_{i+1}\\;(i=2,\\dots ,10)\\) has the same length  \n\n\\[\ns=\\sqrt{t^{2}-20}.\n\\tag{3}\n\\]\n\n---\n\n### 3.  Perimeter condition  \n\nThe perimeter of the 11\u2011gon is  \n\n\\[\n\\underbrace{A_1A_2}_{=x}\n+\\underbrace{A_{11}A_1}_{=C/x}\n+9s =t+9\\sqrt{t^{2}-20}=20 .\n\\tag{4}\n\\]\n\nSet \\(\\displaystyle u=\\sqrt{t^{2}-20}\\).  \nFrom (4) we have \\(u=\\dfrac{20-t}{9}\\).  Squaring gives\n\n\\[\nt^{2}-20=\\frac{(20-t)^{2}}{81}.\n\\]\n\nMultiplying by 81 and simplifying,\n\n\\[\n80t^{2}+40t-2020=0\\quad\\Longrightarrow\\quad\n4t^{2}+2t-101=0.\n\\]\n\nSolving,\n\n\\[\nt=\\frac{-2+\\sqrt{4+1616}}{8}\n  =\\frac{-2+18\\sqrt5}{8}\n  =\\frac{9\\sqrt5-1}{4}.\n\\]\n\nSince \\(t=x+C/x=A_1A_2+A_1A_{11}\\) is a sum of positive lengths,\nthe positive root is the only admissible one.\n\n---\n\n### 4.  Result  \n\n\\[\nA_1A_2+A_1A_{11}= \\frac{9\\sqrt5-1}{4}\n                 =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwhere \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).  \nHence\n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For the denominations \\(\\{1,10,25\\}\\) let  \n\n\\[\nN=25a+b,\\qquad 0\\le b<25 .\n\\]\n\nThe greedy algorithm first uses \\(a\\) quarters, then \\(\\big\\lfloor b/10\\big\\rfloor\\) dimes and finally \\(b\\bmod 10\\) pennies.\nHence the greedy number of coins is  \n\n\\[\nC_{\\text{greedy}}(N)=a+\\Big\\lfloor\\frac{b}{10}\\Big\\rfloor+(b\\bmod 10)=a+f(b),\n\\]\nwhere  \n\n\\[\nf(x)=\\Big\\lfloor\\frac{x}{10}\\Big\\rfloor+(x\\bmod 10).\n\\]\n\nIf we keep only \\(a-k\\) quarters (\\(k\\ge 1\\)), the remainder becomes \\(b+25k\\).  \nThe optimal way to represent the remainder with dimes and pennies still uses the greedy method,\nso the total number of coins with \\(a-k\\) quarters is  \n\n\\[\nC_k(N)=a-k+f(b+25k).\n\\]\n\nThe greedy algorithm fails iff for some \\(k\\ge1\\)\n\n\\[\nC_k(N)<C_{\\text{greedy}}(N)\n\\Longleftrightarrow \nf(b+25k)\\le f(b)+k-1 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Evaluating \\(f(b+25k)-f(b)\\)\n\nWrite \\(b=10t+r\\) with \\(t\\in\\{0,1,2\\}\\) and \\(r=b\\bmod 10\\in\\{0,\\dots,9\\}\\).\nLet \\(\\alpha=r/10\\;(0\\le\\alpha<1)\\).\n\nSince  \n\n\\[\nf(x)=\\Big\\lfloor\\frac{x}{10}\\Big\\rfloor+(x\\bmod10)\n      =x-9\\Big\\lfloor\\frac{x}{10}\\Big\\rfloor ,\n\\]\n\nwe obtain  \n\n\\[\n\\begin{aligned}\nf(b+25k)-f(b)\n&=9\\Big\\lfloor\\frac{b+25k}{10}\\Big\\rfloor-24k\\\\\n&=9\\Big\\lfloor 2.5k+\\alpha\\Big\\rfloor-24k .\n\\end{aligned}\n\\tag{2}\n\\]\n\nSet  \n\n\\[\n\\Delta(k)=9\\Big\\lfloor 2.5k+\\alpha\\Big\\rfloor-24k .\n\\]\n\nA failure occurs when \\(\\Delta(k)>0\\) and \\(k\\le a\\).\n\n--------------------------------------------------------------------\n### 2.  When can \\(\\Delta(k)>0\\)?\n\nFor any integer \\(k\\),\n\n\\[\n\\Big\\lfloor2.5k\\Big\\rfloor=\n\\frac{5k-(k\\bmod2)}{2}.\n\\]\n\nHence  \n\n\\[\n\\Delta(k)= -\\frac{3k+9(k\\bmod2)}{2}+9\\delta ,\n\\quad\\text{where }\\delta=\n\\begin{cases}\n1,&\\alpha\\ge 1-\\{2.5k\\},\\\\\n0,&\\text{otherwise}.\n\\end{cases}\n\\]\n\nThe term \\(-\\frac{3k+9(k\\bmod2)}{2}\\) is negative for all \\(k\\ge1\\).\nThe only way \\(\\Delta(k)\\) can become positive is when \\(\\delta=1\\).\n\n*If \\(k\\) is even*, \\(\\{2.5k\\}=0\\); thus \\(\\alpha<1\\) never makes \\(\\delta=1\\).\nHence \\(\\Delta(k)\\le0\\) for all even \\(k\\).\n\n*If \\(k\\) is odd*, \\(\\{2.5k\\}=0.5\\).  \nThen \\(\\delta=1\\) exactly when \\(\\alpha\\ge 0.5\\), i.e. when \\(r\\ge5\\) (the remainder of \\(b\\) modulo \\(10\\) is at least \\(5\\)).\n\nFor odd \\(k\\ge3\\) we have  \n\n\\[\n\\Delta(k)=-9+9\\delta\\le0,\n\\]\n\nso no improvement occurs.  \n\nFor \\(k=1\\),\n\n\\[\n\\Delta(1)= -6+9\\delta,\n\\]\n\nwhich is positive precisely when \\(\\delta=1\\); that is, when \\(r\\ge5\\).\n\nConsequently **the greedy algorithm fails exactly when**\n\n* \\(N\\ge25\\) (so at least one quarter is used), and\n* the remainder \\(b=N\\bmod25\\) satisfies \\(b\\bmod10\\ge5\\).\n\nIn terms of residues modulo \\(25\\) this means\n\n\\[\nb\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Counting the failures\n\nFrom \\(1\\) to \\(1000\\):\n\n* For \\(N<25\\) the greedy algorithm is always optimal (no quarters are used).\n* For each complete block of \\(25\\) numbers, exactly the \\(10\\) residues listed in (3) cause a failure.\n\nThe interval \\(25\\le N\\le999\\) contains \\(39\\) full blocks of size \\(25\\):\n\\[\n39\\cdot10=390\\text{ failures}.\n\\]\n\n\\(N=1000\\) has residue \\(0\\) modulo \\(25\\), so it is not a failure.\n\nThus the number of values where the greedy algorithm **succeeds** is  \n\n\\[\n1000-390 = 610.\n\\]\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      In base \\(b\\),\n\n\\[\n17_b = 1\\cdot b+7 = b+7,\\qquad 97_b = 9\\cdot b+7 .\n\\]\n\nWe need integer bases \\(b>9\\) such that \\(b+7\\) divides \\(9b+7\\).\n\nLet  \n\n\\[\nn = b+7 \\quad\\Longrightarrow\\quad b = n-7.\n\\]\n\nThen  \n\n\\[\n9b+7 = 9(n-7)+7 = 9n-56 .\n\\]\n\nHence \\(n\\) must divide \\(9n-56\\):\n\n\\[\nn \\mid (9n-56) \\;\\Longrightarrow\\; n \\mid (9n-56) - 9n = -56.\n\\]\n\nThus \\(n\\) is a positive divisor of \\(56\\).  \nSince \\(b>9\\), we have \\(n=b+7>16\\); therefore we need divisors of \\(56\\) that are \\(\\ge 17\\).\n\nDivisors of \\(56 = 2^3\\cdot7\\) are  \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56.\n\\]\n\nOnly \\(28\\) and \\(56\\) satisfy \\(n\\ge 17\\).\n\nCorresponding bases:\n\n\\[\nb = n-7 \\quad\\Rightarrow\\quad \n\\begin{cases}\nn=28 &\\Rightarrow b = 21,\\\\[2pt]\nn=56 &\\Rightarrow b = 49.\n\\end{cases}\n\\]\n\nBoth bases exceed \\(9\\) and the digits \\(1,7,9\\) are allowed.\n\nFinally, the sum of all such bases is  \n\n\\[\n21 + 49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Label the vertices of the regular \\(24\\)-gon by the residues  \n\\(\\{0,1,2,\\dots ,23\\}\\) modulo \\(24\\).\n\nIf the \\(12\\) drawn segments all have the same Euclidean length, then each\nsegment must join two vertices whose indices differ by a fixed integer  \n\\(k\\;(1\\le k\\le 12)\\) (the \u201cstep size\u2019\u2019), because the length of a chord in a\nregular polygon depends only on this step.\n\nThus for a fixed \\(k\\) we have to choose a perfect matching of the graph  \n\n\\[\nG_k=\\big\\{\\{i,i+k\\}\\mid i=0,1,\\dots ,23\\big\\}.\n\\]\n\n--------------------------------------------------------------------\n### 1.   Structure of \\(G_k\\)\n\n\\(G_k\\) is a **2\u2011regular** graph; each vertex has exactly the two neighbours\n\\(i\\pm k\\).  \nLet  \n\n\\[\nd=\\gcd(k,24).\n\\]\n\nThen the vertices split into \\(d\\) cycles, each of length  \n\n\\[\nt=\\frac{24}{d}.\n\\]\n\nIndeed, repeatedly adding \\(k\\) modulo \\(24\\) runs through a cycle of that\nlength.\n\n--------------------------------------------------------------------\n### 2.   When does a perfect matching exist?\n\nA perfect matching can exist only if each component has an even number of\nvertices, i.e. \\(t\\) must be even.  \nSince \\(t = 24/d\\),\n\n* \\(t\\) is odd only when \\(d=8\\) (giving \\(t=3\\)).  \n  Hence for \\(k=8\\) no perfect matching is possible.\n\nAll other values of \\(k\\) give even\u2011length cycles.\n\n--------------------------------------------------------------------\n### 3.   Number of matchings for a given \\(k\\)\n\n*If \\(t\\ge 4\\) (even cycle of length at least \\(4\\)):  \nA cycle has exactly **two** perfect matchings (choose every other edge).  \nSince there are \\(d\\) independent cycles, the total number of matchings is\n\\(\\displaystyle 2^{d}\\).\n\n*If \\(t=2\\) (the case \\(k=12\\)): each component is a single edge, so there\nis only **one** way to match its two vertices.  \nThus for \\(k=12\\) we obtain \\(1\\) matching.\n\nSummarising\n\n\\[\nf(k)=\n\\begin{cases}\n0, & k=8,\\\\[2mm]\n1, & k=12,\\\\[2mm]\n2^{\\gcd(k,24)}, & \\text{otherwise}.\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 4.   Summation over all possible step sizes\n\n\\[\n\\begin{array}{c|c|c|c}\nk & \\gcd(k,24) & f(k) & \\text{contribution}\\\\\\hline\n1 & 1 & 2^1=2 & 2\\\\\n2 & 2 & 2^2=4 & 4\\\\\n3 & 3 & 2^3=8 & 8\\\\\n4 & 4 & 2^4=16 & 16\\\\\n5 & 1 & 2 & 2\\\\\n6 & 6 & 2^6=64 & 64\\\\\n7 & 1 & 2 & 2\\\\\n8 & 8 & 0 & 0\\\\\n9 & 3 & 8 & 8\\\\\n10& 2 & 4 & 4\\\\\n11& 1 & 2 & 2\\\\\n12&12 & 1 & 1\\\\\\hline\n\\multicolumn{3}{r|}{\\text{Total}} & 113\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 5.   Answer\n\nThe total number of ways to draw \\(12\\) equal\u2011length segments so that each of\nthe \\(24\\) vertices is used exactly once is  \n\n\\[\n\\boxed{113}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nEach player gets one scoop of either chocolate (C), vanilla (V) or strawberry (S).  \nLet  \n\n\\[\nc=\\#\\text{players who chose chocolate},\\qquad \nv=\\#\\text{players who chose vanilla},\\qquad \ns=\\#\\text{players who chose strawberry}.\n\\]\n\nWe need  \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\nFor each admissible triple \\((c,v,s)\\) the number of assignments to the 9 distinct players is the multinomial coefficient  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nHence  \n\n\\[\nN=\\sum_{\\substack{c+v+s=9\\\\c>v>s\\ge1}}\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\)\n\nSince \\(c>v>s\\ge1\\),\n\n\\[\ns\\le 2\n\\]\n\n(because \\(s+(s+1)+(s+2)=3s+3\\le9\\Rightarrow s\\le2\\)).  \n\n*If \\(s=1\\):*  \n\\(v\\ge2\\) and \\(c=9-v-1=8-v\\).  \nCondition \\(c>v\\) gives \\(8-v>v\\Rightarrow v\\le3\\).  \nThus \\(v=2,3\\) giving triples \\((6,2,1)\\) and \\((5,3,1)\\).\n\n*If \\(s=2\\):*  \n\\(v\\ge3\\) and \\(c=9-v-2=7-v\\).  \nCondition \\(c>v\\) gives \\(7-v>v\\Rightarrow v\\le3\\).  \nThus \\(v=3\\) giving the triple \\((4,3,2)\\).\n\nNo larger \\(s\\) works.  \nHence the only admissible triples are  \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple\n\n\\[\n\\begin{aligned}\n(6,2,1):&\\quad \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):&\\quad \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):&\\quad \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN=252+504+1260=2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2016\\equiv 16\\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nLet  \n\n\\[\n\\begin{aligned}\nA&=(7,7\\sqrt3),\\qquad \nB=(0,0),\\qquad \nC=(7,0),\\\\[2mm]\nD&=\\Bigl(\\frac{205}{7},\\frac{36\\sqrt3}{7}\\Bigr),\\qquad\nE=\\Bigl(\\frac{218}{7},\\frac{88\\sqrt3}{7}\\Bigr).\n\\end{aligned}\n\\]\n\nThe pentagon \\(ABCDE\\) is convex, \\(\\angle B=\\angle E=60^\\circ\\) and the side\u2013lengths are  \n\n\\[\nAB=14,\\;BC=7,\\;CD=24,\\;DE=13,\\;EA=26 .\n\\]\n\nFor a point \\(X\\) define  \n\n\\[\nf(X)=AX+BX+CX+DX+EX .\n\\]\n\n--------------------------------------------------------------------\n\n### 1.  Reducing the problem\n\nFor any point \\(X\\)\n\n\\[\n\\nabla f(X)=\\sum_{P\\in\\{A,B,C,D,E\\}}\\frac{X-P}{|X-P|}.\n\\]\n\nIf the minimum of \\(f\\) is attained at an interior point,\nthe gradient must be zero:\n\n\\[\n\\frac{X-A}{|X-A|}+\\frac{X-B}{|X-B|}\n+\\frac{X-C}{|X-C|}+\\frac{X-D}{|X-D|}+\\frac{X-E}{|X-E|}=0. \\tag{1}\n\\]\n\nNotice that  \n\n*\\(B\\) and \\(E\\) lie on the same line \\(BE\\).  \nIf a point \\(X\\) is on the line \\(BE\\), the two unit vectors in (1) that\ncorrespond to \\(B\\) and \\(E\\) are opposite:\n\\[\n\\frac{X-B}{|X-B|}+\\frac{X-E}{|X-E|}=0 .\n\\]\n\nHence, **any point on the segment \\(BE\\) automatically cancels the\ncontributions of \\(B\\) and \\(E\\).**  \nConsequently a minimiser must lie on \\(BE\\), and (1) becomes\n\n\\[\n\\frac{X-A}{|X-A|}+\\frac{X-C}{|X-C|}+\\frac{X-D}{|X-D|}=0 .\\tag{2}\n\\]\n\nEquation (2) is precisely the equilibrium condition for the geometric\nmedian (Fermat\u2013Weber point) of the triangle \\(ACD\\).\n\n--------------------------------------------------------------------\n\n### 2.  The Fermat point of \\(\\triangle ACD\\)\n\nThe three angles of \\(\\triangle ACD\\) are  \n\n\\[\n\\angle A\\approx81.8^\\circ ,\\qquad \n\\angle C\\approx68.2^\\circ ,\\qquad \n\\angle D=30^\\circ .\n\\]\n\nAll are \\(<120^\\circ\\); therefore the unique point \\(F\\) inside\n\\(\\triangle ACD\\) for which the three angles \\(\\angle AFD,\n\\angle CFD, \\angle ACF\\) are all \\(120^\\circ\\) is the Fermat point.\nIt is precisely the point satisfying (2); consequently the minimiser of\n\\(f\\) is the intersection of the line \\(BE\\) with this Fermat point.\n(The numerical computation of the Weiszfeld iteration gives\n\\(F\\approx(10.594,\\,7.416)\\), which indeed lies on \\(BE\\).)\n\nFor a triangle with side\u2011lengths \\(a,b,c\\) and area \\(\\Delta\\), the\nminimal sum of distances from its Fermat point to the three vertices is\n\n\\[\n\\boxed{\\displaystyle \n\\sqrt{\\frac{a^{2}+b^{2}+c^{2}+4\\sqrt3\\,\\Delta}{2}} }   \\tag{3}\n\\]\n\n(see any textbook on the Fermat point).\n\n--------------------------------------------------------------------\n\n### 3.  Applying the formula to \\(\\triangle ACD\\)\n\nFor \\(\\triangle ACD\\)\n\n\\[\n\\begin{aligned}\na&=CD=24,\\\\\nb&=AD=13\\sqrt3,\\\\\nc&=AC=7\\sqrt3.\n\\end{aligned}\n\\]\n\nThe area is obtained from the base \\(AC\\) (vertical, length \\(7\\sqrt3\\))\nand the horizontal distance from \\(D\\) to the line \\(AC\\) (which is\n\\( \\frac{156}{7}\\)):\n\n\\[\n\\Delta=\\frac12\\cdot7\\sqrt3\\cdot\\frac{156}{7}=78\\sqrt3 .\n\\]\n\nNow compute the expression in (3):\n\n\\[\n\\begin{aligned}\na^{2}+b^{2}+c^{2}&=24^{2}+(13\\sqrt3)^{2}+(7\\sqrt3)^{2}\n=576+507+147=1230,\\\\[1mm]\n4\\sqrt3\\,\\Delta&=4\\sqrt3\\cdot78\\sqrt3=4\\cdot78\\cdot3=936,\\\\[1mm]\n\\frac{a^{2}+b^{2}+c^{2}+4\\sqrt3\\,\\Delta}{2}\n&=\\frac{1230+936}{2}=1083.\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\nAF+CF+DF=\\sqrt{1083}=19\\sqrt3 .\n\\]\n\n--------------------------------------------------------------------\n\n### 4.  The total minimum\n\nBecause the minimiser lies on \\(BE\\),\n\n\\[\nBF+EF=BE=38 .\n\\]\n\nTherefore\n\n\\[\n\\begin{aligned}\n\\min f(X)&=AF+CF+DF+BF+EF\\\\\n&=19\\sqrt3+38 .\n\\end{aligned}\n\\]\n\nThe required form is \\(m+n\\sqrt{p}\\) with \\(m=38,\\;n=19,\\;p=3\\).\n\nHence  \n\n\\[\nm+n+p = 38+19+3 = 60 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{60}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 60

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equation  \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored over the integers:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .\n\\]\n\nHence a pair \\((x,y)\\) of integers satisfies either  \n\n\\[\n\\boxed{3x+2y=0}\\qquad\\text{or}\\qquad\\boxed{4x-3y=0}.\n\\]\n\n---\n\n### 1.  Solutions of \\(3x+2y=0\\)\n\n\\[\n2y=-3x\\quad\\Longrightarrow\\quad y=-\\frac{3}{2}x .\n\\]\n\nFor \\(y\\) to be integer, \\(x\\) must be even: write \\(x=2k\\) with \\(k\\in\\mathbb Z\\).  \nThen \\(y=-3k\\).\n\nThe bounds \\(-100\\le x,y\\le100\\) give  \n\n\\[\n-100\\le2k\\le100\\;\\Longrightarrow\\;-50\\le k\\le50,\n\\]\n\\[\n-100\\le-3k\\le100\\;\\Longrightarrow\\;|k|\\le\\frac{100}{3}\\;\\Longrightarrow\\;-33\\le k\\le33.\n\\]\n\nThus \\(k\\) can be any integer from \\(-33\\) to \\(33\\):  \n\n\\[\n\\#\\{(x,y):3x+2y=0\\}=33+33+1=67 .\n\\]\n\n---\n\n### 2.  Solutions of \\(4x-3y=0\\)\n\n\\[\n4x=3y\\quad\\Longrightarrow\\quad y=\\frac{4}{3}x .\n\\]\n\nFor integer \\(y\\), \\(x\\) must be a multiple of \\(3\\): write \\(x=3m\\) with \\(m\\in\\mathbb Z\\).  \nThen \\(y=4m\\).\n\nThe bounds give  \n\n\\[\n-100\\le3m\\le100\\;\\Longrightarrow\\;|m|\\le\\frac{100}{3}\\;\\Longrightarrow\\;-33\\le m\\le33,\n\\]\n\\[\n-100\\le4m\\le100\\;\\Longrightarrow\\;-25\\le m\\le25.\n\\]\n\nHence \\(m\\) can be any integer from \\(-25\\) to \\(25\\):  \n\n\\[\n\\#\\{(x,y):4x-3y=0\\}=25+25+1=51 .\n\\]\n\n---\n\n### 3.  Removing the double count\n\nThe only pair that satisfies both linear equations is \\((0,0)\\).  \nThus the total number of distinct ordered pairs is  \n\n\\[\n67+51-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a tangential quadrilateral (one that has an incircle) the sum of the lengths of opposite sides are equal.  \nLet the parallel sides of the isosceles trapezoid be \\(r\\) and \\(s\\) \\((r\\neq s)\\) and each leg have length \\(L\\).\n\n\\[\nr+s = L+L = 2L \\quad\\Longrightarrow\\quad L=\\frac{r+s}{2}\n\\]\n\n---\n\n### Using the incircle\n\nFor any tangential quadrilateral  \n\n\\[\n\\text{Area}= (\\text{inradius})\\times (\\text{semiperimeter})\n\\]\n\nThe inradius is \\(3\\) and the area is \\(72\\), so the semiperimeter is  \n\n\\[\n\\frac{72}{3}=24 .\n\\]\n\nThe semiperimeter of the trapezoid is  \n\n\\[\n\\frac{r+s+2L}{2}= \\frac{r+s+r+s}{2}=r+s .\n\\]\n\nHence  \n\n\\[\nr+s = 24 .\n\\]\n\nConsequently  \n\n\\[\nL=\\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### Height of the trapezoid\n\nThe area also equals \\(\\dfrac{(r+s)}{2}\\cdot h\\), where \\(h\\) is the height:\n\n\\[\n72=\\frac{24}{2}\\,h =12h \\;\\Longrightarrow\\; h=6 .\n\\]\n\n(Indeed, the height must be \\(2\\) times the inradius, \\(2\\cdot3=6\\).)\n\n---\n\n### Relating the legs to the bases\n\nIn an isosceles trapezoid the horizontal offset of each leg is  \n\n\\[\nx=\\frac{r-s}{2}.\n\\]\n\nBecause each leg has length \\(L=12\\),\n\n\\[\nL^{2}=x^{2}+h^{2}\\quad\\Longrightarrow\\quad\n12^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+6^{2}.\n\\]\n\nThus  \n\n\\[\n\\left(\\frac{r-s}{2}\\right)^{2}=144-36=108\n\\quad\\Longrightarrow\\quad\nr-s = 2\\sqrt{108}=12\\sqrt3 .\n\\]\n\n---\n\n### Solving for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s = 24,\\\\[2pt]\nr-s = 12\\sqrt3 .\n\\end{cases}\n\\]\n\n\\[\nr = \\frac{24+12\\sqrt3}{2}=12+6\\sqrt3,\\qquad\ns = \\frac{24-12\\sqrt3}{2}=12-6\\sqrt3 .\n\\]\n\n---\n\n### Compute \\(r^{2}+s^{2}\\)\n\nUsing \\((r^{2}+s^{2}) = \\dfrac{(r+s)^{2}+(r-s)^{2}}{2}\\),\n\n\\[\nr^{2}+s^{2}= \\frac{24^{2}+(12\\sqrt3)^{2}}{2}\n= \\frac{576+432}{2}\n= \\frac{1008}{2}=504 .\n\\]\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a number to be divisible by \\(22\\) it must be divisible by \\(2\\) **and** by \\(11\\).\n\n---\n\n### 1.  Divisibility by \\(2\\)\n\nThe last digit (the 8\u2011th digit) must be even.\nThe even digits are \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2.  Divisibility by \\(11\\)\n\nFor an \\(8\\)-digit number \\(d_1d_2\\ldots d_8\\),\n\n\\[\n\\text{(odd positions)}-\\text{(even positions)}=\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\n\\]\n\nmust be a multiple of \\(11\\).\n\nSince the digits \\(1,\\dots ,8\\) are used once,\n\\[\n(d_1+d_3+d_5+d_7)+(d_2+d_4+d_6+d_8)=1+2+\\cdots+8=36 .\n\\]\n\nLet \\(S=d_1+d_3+d_5+d_7\\).  \nThen the alternating sum is \\(2S-36\\).  \nIt must be a multiple of \\(11\\) and also even (because \\(2S-36\\) is even).  \nThe only even multiple of \\(11\\) in the range \\([-16,16]\\) (the possible values of \\(2S-36\\)) is \\(0\\).\n\nHence  \n\n\\[\n2S-36=0\\quad\\Longrightarrow\\quad S=18 .\n\\]\n\nSo the four digits occupying the odd positions must sum to \\(18\\)\n(and automatically the even positions also sum to \\(18\\)).\n\n---\n\n### 3.  Choosing the odd\u2011position set\n\nWe need all \\(4\\)-element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them (or using a generating function) gives\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThus there are **8** possible sets for the odd positions.\n\nEach such set contains exactly two even digits (any valid set must have\ntwo evens and two odds, because an odd number of evens would give an odd total).\n\n---\n\n### 4.  Arranging the digits\n\n*Odd positions (1,3,5,7)* \u2013 the chosen 4 digits can be placed in \\(4! = 24\\) ways.\n\n*Even positions (2,4,6,8)* \u2013 the remaining four digits must be placed so that\nposition\u202f8 is even.\n\nIf the even\u2011position set contains \\(k\\) even digits, we have \\(k\\) choices for which even digit goes to position\u202f8, and the remaining three digits can be ordered in the other three even positions in \\(3! = 6\\) ways.  \n\nFor every valid odd\u2011set we have exactly \\(k = 2\\) even digits in the even\u2011position set,\nso\n\n\\[\n\\text{arrangements of even positions}=2\\cdot 3! = 12 .\n\\]\n\nHence for each of the 8 possible odd\u2011sets we obtain\n\n\\[\n24 \\times 12 = 288\\text{ permutations}.\n\\]\n\n---\n\n### 5.  Total number \\(N\\)\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 6.  Required difference\n\n\\[\nN - 2025 = 2304 - 2025 = 279 .\n\\]\n\n---\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equations describe geometric loci in the complex plane.\n\n---\n\n### 1.  The first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\nis a circle  \n\n\\[\nC:\\;(x-25)^2+(y-20)^2 =5^{\\,2}=25 .\n\\]\n\nIts centre is \\(C_0=(25,20)\\) and its radius is \\(r=5\\).\n\n---\n\n### 2.  The second equation  \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the point \\(z\\) is equidistant from the points  \n\n\\[\nA=(4+k,0), \\qquad B=(k,3).\n\\]\n\nHence the locus is the **perpendicular bisector** of segment \\(\\overline{AB}\\).\n\n* Midpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{(k+4)+k}{2},\\frac{0+3}{2}\\Bigr)=(k+2,\\tfrac32).\n\\]\n\n* Direction vector of \\(AB\\):  \n\n\\[\n\\vec{AB}=(-4,3) \\quad\\Longrightarrow\\quad \\text{slope of }AB =-\\frac34 .\n\\]\n\nThe perpendicular bisector therefore has slope the negative reciprocal, \\(\\frac43\\).\n\nThe equation of the line \\(L_k\\) (the bisector) is  \n\n\\[\ny-\\tfrac32=\\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\nor, after clearing fractions,\n\n\\[\n8x-6y-(8k+7)=0. \\tag{1}\n\\]\n\n---\n\n### 3.  Tangency condition  \n\nThe system has **exactly one** solution precisely when the line \\(L_k\\) is tangent to the circle \\(C\\).  \nTangency occurs when the distance from the centre \\(C_0=(25,20)\\) to the line equals the radius \\(5\\).\n\nFor the line \\(8x-6y-(8k+7)=0\\),\n\n\\[\n\\text{dist}(C_0,L_k)=\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^2+(-6)^2}}\n                     =\\frac{|200-120-(8k+7)|}{10}\n                     =\\frac{|73-8k|}{10}.\n\\]\n\nSet this equal to the radius \\(5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence  \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50 .\n\\]\n\nSolving gives  \n\n\\[\n\\begin{cases}\n73-8k=50 &\\Rightarrow\\; 8k=23 \\;\\Rightarrow\\; k=\\dfrac{23}{8},\\\\[4pt]\n73-8k=-50 &\\Rightarrow\\; 8k=123 \\;\\Rightarrow\\; k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values make the line tangent to the circle, so each yields exactly one solution \\(z\\).\n\n---\n\n### 4.  Sum of all possible \\(k\\)\n\n\\[\nk_1+k_2=\\frac{23}{8}+\\frac{123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nThus \\(m=73,\\; n=4\\) (coprime), and\n\n\\[\nm+n=73+4=77.\n\\]\n\n---\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=\\mathbf b ,\\qquad C=\\mathbf c .\n\\]\n\nThen \\(\\triangle ABC\\) has oriented area  \n\n\\[\n[\\triangle ABC]=\\frac12\\,\\bigl(\\mathbf b\\times\\mathbf c\\bigr) .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coordinates of the points on the sides  \n\nOn \\(AB\\)\n\n\\[\nAD=4,\\;DE=16,\\;EB=8\\qquad\\Longrightarrow\\qquad AB=28 .\n\\]\n\nHence  \n\n\\[\nD=\\frac{4}{28}\\mathbf b=\\frac17\\mathbf b ,\\qquad \nE=\\frac{20}{28}\\mathbf b=\\frac57\\mathbf b .\n\\]\n\nOn \\(AC\\)\n\n\\[\nAF=13,\\;FG=52,\\;GC=26\\qquad\\Longrightarrow\\qquad AC=91 .\n\\]\n\nThus  \n\n\\[\nF=\\frac{13}{91}\\mathbf c ,\\qquad \nG=\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Area of \\(DEGF\\)\n\nFor any two points \\(P=\\alpha_P\\mathbf b+\\beta_P\\mathbf c\\) and\n\\(Q=\\alpha_Q\\mathbf b+\\beta_Q\\mathbf c\\),\n\n\\[\nP\\times Q=(\\alpha_P\\beta_Q-\\beta_P\\alpha_Q)\\,(\\mathbf b\\times\\mathbf c).\n\\]\n\nWith the order \\(D\\to E\\to G\\to F\\) we obtain  \n\n\\[\n\\begin{aligned}\n\\sum (P_i\\times P_{i+1})&=\n\\underbrace{D\\times E}_{0}\n+\\underbrace{E\\times G}_{\\frac{5}{7}\\frac{65}{91}\\,K}\n+\\underbrace{G\\times F}_{0}\n+\\underbrace{F\\times D}_{-\\frac{13}{91}\\frac1{7}\\,K}   \\\\[2mm]\n&=\\Bigl(\\frac{5\\cdot65}{7\\cdot91}\n      -\\frac{13}{7\\cdot91}\\Bigr)K\n   =\\frac{312}{637}\\,K ,\n\\end{aligned}\n\\]\n\nwhere \\(K=\\mathbf b\\times\\mathbf c\\).  \nTherefore  \n\n\\[\n[DEGF]=\\frac12\\Bigl|\\frac{312}{637}K\\Bigr|\n       =\\frac{156}{637}|K| .\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n|K|=288\\cdot\\frac{637}{156}=1176 .\n\\]\n\nConsequently  \n\n\\[\n[\\triangle ABC]=\\frac12|K|=588 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  The reflected points  \n\nReflecting \\(D\\) across \\(F\\) gives  \n\n\\[\nM=2F-D=\\frac{26}{91}\\mathbf c-\\frac{13}{91}\\mathbf b .\n\\]\n\nReflecting \\(G\\) across \\(E\\) gives  \n\n\\[\nN=2E-G=\\frac{130}{91}\\mathbf b-\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in the given order and write each as\n\\(P_i=\\alpha_i\\mathbf b+\\beta_i\\mathbf c\\):\n\n\\[\n\\begin{array}{c|c|c}\n\\text{vertex}&\\alpha_i&\\beta_i\\\\\\hline\nA&0&0\\\\\nF&0&\\dfrac{13}{91}\\\\\nN&\\dfrac{130}{91}&-\\dfrac{65}{91}\\\\\nB&1&0\\\\\nC&0&1\\\\\nE&\\dfrac57&0\\\\\nM&-\\dfrac{13}{91}&\\dfrac{26}{91}\n\\end{array}\n\\]\n\nFor the polygon the signed area is  \n\n\\[\n\\frac12\\sum_{i=0}^{6}(\\alpha_i\\beta_{i+1}-\\beta_i\\alpha_{i+1})\\,K .\n\\]\n\nComputing the sum (using the common denominator \\(8281=91^{2}=7^{2}\\,13^{2}\\)) gives  \n\n\\[\n\\sum_{i}(\\alpha_i\\beta_{i+1}-\\beta_i\\alpha_{i+1})=1 .\n\\]\n\nHence  \n\n\\[\n[AFNBCEM]=\\frac12\\,K\n         =\\frac12\\cdot1176\n         =588 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c) , \\qquad  b^{2}+c^{2}=BC^{2}=38^{2}=1444 .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coordinates of \\(K\\) and \\(L\\)\n\nBecause \\(AK=BK=14\\), the point \\(K\\) is on the perpendicular bisector of \\(\\overline{AB}\\); hence  \n\n\\[\nK=\\Bigl(\\frac b2 ,\\; \\sqrt{14^{2}-\\Bigl(\\frac b2\\Bigr)^{2}}\\Bigr).\n\\]\n\nWrite  \n\n\\[\nm=\\frac b2 ,\\qquad p=\\sqrt{196-m^{2}},\n\\]\n\nso \\(K=(m,p)\\) and \\(m^{2}+p^{2}=196\\).\n\nSimilarly \\(AL=CL=14\\) gives  \n\n\\[\nL=\\Bigl(\\sqrt{196-n^{2}},\\; n\\Bigr),\n\\]\n\nwith  \n\n\\[\nn=\\frac c2 ,\\qquad q=\\sqrt{196-n^{2}},\\qquad n^{2}+q^{2}=196 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Trigonometric parametrisation  \n\nSince \\(m^{2}+p^{2}=196\\) we may set  \n\n\\[\nm=14\\cos\\theta ,\\qquad p=14\\sin\\theta ,\\qquad 0<\\theta<\\frac{\\pi}{2}.\n\\]\n\nLikewise  \n\n\\[\nn=14\\sin\\psi ,\\qquad q=14\\cos\\psi ,\\qquad 0<\\psi<\\frac{\\pi}{2}.\n\\]\n\nBecause \\(AKL\\) is equilateral, \\(\\angle KAL=60^{\\circ}\\); therefore  \n\n\\[\n\\psi-\\theta=60^{\\circ}\\qquad\\Longrightarrow\\qquad\\psi=\\theta+\\frac{\\pi}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  The right\u2011triangle condition  \n\n\\[\nb^{2}+c^{2}=4(m^{2}+n^{2})=1444\\quad\\Longrightarrow\\quad m^{2}+n^{2}=361 .\n\\]\n\nSubstituting the trigonometric expressions,\n\n\\[\n(14\\cos\\theta)^{2}+(14\\sin\\psi)^{2}=361\n\\Longrightarrow \n\\cos ^{2}\\theta+\\sin ^{2}(\\theta+60^{\\circ})=\\frac{361}{196}.\n\\]\n\nUsing \\(\\sin^{2}\\alpha=\\frac{1-\\cos2\\alpha}{2}\\) and simplifying we obtain  \n\n\\[\n3\\cos2\\theta+\\sqrt3\\sin2\\theta=\\frac{165}{49}.\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of \\(BKLC\\)\n\nThe region \\(BKLC\\) is the triangle \\(ABC\\) with three interior triangles removed:\n\n\\[\n[BKLC]=[ABC]-[ABK]-[ALC]-[AKL].\n\\]\n\nNow  \n\n\\[\n[ABC]=\\frac{bc}{2}=2mn, \\qquad\n[ABK]=\\frac{b\\;y_{K}}{2}=mp, \\qquad\n[ALC]=\\frac{c\\;x_{L}}{2}=nq,\n\\]\n\nand \\([AKL]=\\frac{\\sqrt3}{4}\\,14^{2}=49\\sqrt3\\).\n\nHence  \n\n\\[\nS=[BKLC]=2mn-mp-nq-49\\sqrt3 .\n\\tag{2}\n\\]\n\nInsert the trigonometric forms:\n\n\\[\n\\begin{aligned}\n2mn&=2(14\\cos\\theta)(14\\sin\\psi)=196\\bigl(2\\cos\\theta\\sin\\psi\\bigr),\\\\\nmp&=14^{2}\\cos\\theta\\sin\\theta=196(\\cos\\theta\\sin\\theta),\\\\\nnq&=14^{2}\\sin\\psi\\cos\\psi=196(\\sin\\psi\\cos\\psi).\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\nS=196\\bigl[2\\cos\\theta\\sin\\psi-(\\cos\\theta\\sin\\theta+\\sin\\psi\\cos\\psi)\\bigr]-49\\sqrt3 .\n\\tag{3}\n\\]\n\nUsing \\(\\psi=\\theta+60^{\\circ}\\) and elementary identities, (3) reduces to  \n\n\\[\nS=49\\bigl[\\sqrt3\\,(4\\cos^{2}\\theta-1)-2\\sin(2\\theta+120^{\\circ})\\bigr].\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Eliminate the trigonometric functions\n\nSet  \n\n\\[\nA=\\cos(2\\theta-30^{\\circ}).\n\\]\n\nFrom (1),\n\n\\[\n3\\cos2\\theta+\\sqrt3\\sin2\\theta\n      =\\frac{165}{49}\n      =2\\sqrt3\\,A .\n\\]\n\nHence  \n\n\\[\nA=\\frac{165}{98\\sqrt3}.\n\\tag{5}\n\\]\n\nExpress the right\u2013hand side of (4) in terms of \\(A\\).  \nWrite  \n\n\\[\n\\begin{aligned}\nX&=\\frac{\\sqrt3}{2}\\cos2\\theta,\\qquad\nY=\\frac12\\sin2\\theta,\n\\end{aligned}\n\\]\n\nso that  \n\n\\[\nA=X+Y,\\qquad\n\\sin(2\\theta+120^{\\circ})=X-Y .\n\\]\n\nThen  \n\n\\[\n\\sqrt3\\,(4\\cos^{2}\\theta-1)=\\sqrt3+4X,\n\\qquad\n-2\\sin(2\\theta+120^{\\circ})=-2(X-Y).\n\\]\n\nSubstituting these into (4) gives  \n\n\\[\nS=49\\bigl(\\sqrt3+4X-2X+2Y\\bigr)\n   =49\\bigl(\\sqrt3+2(X+Y)\\bigr)\n   =49\\bigl(\\sqrt3+2A\\bigr).\n\\]\n\nFinally insert (5):\n\n\\[\nS=49\\left(\\sqrt3+\\frac{2\\cdot165}{98\\sqrt3}\\right)\n   =49\\sqrt3+\\frac{165}{\\sqrt3}\n   =\\frac{147+165}{\\sqrt3}\n   =\\frac{312}{\\sqrt3}\n   =104\\sqrt3 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{104}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the letters be numbered  \n\n\\[\nA=1,\\;B=2,\\;\\dots ,\\;L=12 .\n\\]\n\nA random pairing of the 12 letters is a **perfect matching**.  \nThe total number of unordered pairings is  \n\n\\[\n(12-1)!!=\\frac{12!}{2!^{6}6!}=10395 .\n\\]\n\n---\n\n### 1.  Fix the partner of \\(G\\)\n\nIn a random matching the partner of \\(G\\) is equally likely to be any of the other \\(11\\) letters.  \nLet the partner be \\(X\\neq G\\).  Write  \n\n\\[\nm=\\min \\{G,X\\}.\n\\]\n\nThe pair containing \\(G\\) will be the last (lexicographically largest) word **iff**  \nall minima of the other five pairs are less than \\(m\\).  \nHence we must count, for each possible partner \\(X\\), the number of matchings of the\nremaining \\(10\\) letters whose minima are all \\(<m\\).\n\nDenote by  \n\n* \\(L\\) \u2013 the letters smaller than \\(m\\) that are still present,\n* \\(H\\) \u2013 the letters larger than \\(m\\) that are still present.\n\nIf a matching of those ten letters contains a pair wholly inside \\(H\\) then its minimum\nis \\(\\ge m\\), which is not allowed.  \nThus **every letter of \\(H\\) must be paired with a distinct letter of \\(L\\)**.  \nThe remaining letters of \\(L\\) (if any) are paired among themselves.\n\nLet \\(|L|=a,\\;|H|=b\\) \\((a+b=10)\\).  \nA valid matching is obtained by\n\n1. choosing which \\(b\\) letters of \\(L\\) will be paired with the \\(b\\) letters of \\(H\\)\n   \u2013 \\(\\binom{a}{b}\\) ways;\n2. bijecting the chosen \\(b\\) letters of \\(L\\) with the \\(b\\) letters of \\(H\\) \u2013\n   \\(b!\\) ways;\n3. pairing the remaining \\(a-b\\) letters of \\(L\\) among themselves \u2013 \\((a-b-1)!!\\) ways.\n\nHence the number of \u201cgood\u2019\u2019 matchings is  \n\n\\[\n\\text{good}= \\binom{a}{b}\\,b!\\,(a-b-1)!! \n           =\\frac{a!}{2^{(a-b)/2}\\,\\bigl((a-b)/2\\bigr)! } .\n\\]\n\nThe total number of matchings of ten letters is  \n\n\\[\n\\frac{10!}{2!^{5}5!}=945 .\n\\]\n\n---\n\n### 2.  Cases for the partner \\(X\\)\n\n#### (i)  \\(X>G\\)  \n\nPossible partners: \\(H,I,J,K,L\\) (5 choices).  \nHere \\(m=G\\).  \nAmong the remaining letters we have  \n\n\\[\nL=\\{A,B,C,D,E,F\\}\\;(a=6),\\qquad\nH=\\{\\text{the four letters }>G\\text{ other than }X\\}\\;(b=4).\n\\]\n\nThus  \n\n\\[\n\\text{good}= \\frac{6!}{2^{1}\\cdot1!}=360,\n\\qquad\nP(\\text{good}\\mid X)=\\frac{360}{945}= \\frac{8}{21}.\n\\]\n\nContribution to the required probability:\n\n\\[\n5\\cdot\\frac1{11}\\cdot\\frac{8}{21}= \\frac{40}{231}.\n\\]\n\n#### (ii)  \\(X<G\\)\n\nPossible partners: \\(A,B,C,D,E,F\\).  \nWrite \\(X\\) as the \\(i\\)-th letter (\\(i=1,\\dots ,6\\)).\nThen  \n\n\\[\na=i-1,\\qquad b=11-i .\n\\]\n\nThe condition \u201call minima \\(<X\\)\u201d requires \\(b\\le a\\); this holds only when \\(i=6\\),\ni.e. \\(X=F\\).\n\nFor \\(X=F\\),\n\n\\[\nL=\\{A,B,C,D,E\\},\\; a=5,\\qquad \nH=\\{H,I,J,K,L\\},\\; b=5 .\n\\]\n\nHence  \n\n\\[\n\\text{good}=5! =120,\n\\qquad\nP(\\text{good}\\mid X=F)=\\frac{120}{945}= \\frac{8}{63}.\n\\]\n\nContribution from this case:\n\n\\[\n\\frac1{11}\\cdot\\frac{8}{63}= \\frac{8}{693}.\n\\]\n\nAll other choices of \\(X<G\\) give probability \\(0\\).\n\n---\n\n### 3.  Total probability\n\n\\[\nP=\\frac{40}{231}+\\frac{8}{693}\n   =\\frac{120}{693}+\\frac{8}{693}\n   =\\frac{128}{693}.\n\\]\n\nThus  \n\n\\[\n\\frac{m}{n}= \\frac{128}{693},\\qquad m+n=128+693=821.\n\\]\n\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First write the conditions in a convenient form.\n\n\\[\nx+y+z = 75 \\qquad\\text{and}\\qquad \nx-yz<y-zx<z-xy .\n\\]\n\nFactor each inequality:\n\n\\[\n\\begin{aligned}\nx-yz<y-zx &\\iff (x-y)(1+z)<0,\\\\\ny-zx<z-xy &\\iff (y-z)(1+x)<0 .\n\\end{aligned}\n\\]\n\nThus on the plane \\(x+y+z=75\\),\n\n\\[\n(x-y)(z+1)<0,\\qquad (y-z)(x+1)<0 .\n\\]\n\n---\n\n### 1.  Reduce to two variables\n\nFrom \\(z=75-x-y\\) we obtain\n\n\\[\n\\begin{aligned}\n(x-y)(z+1)&=(x-y)(76-x-y),\\\\\n(y-z)(x+1)&=(x+2y-75)(x+1).\n\\end{aligned}\n\\]\n\nHence the region in the \\((x,y)\\)-plane is described by  \n\n\\[\n\\boxed{(x-y)(76-x-y)<0}\\qquad\\text{and}\\qquad\\boxed{(x+2y-75)(x+1)<0}.\n\\tag{1}\n\\]\n\nThe four linear factors are\n\n\\[\nL_1=x-y,\\;L_2=76-x-y,\\;L_3=x+2y-75,\\;L_4=x+1 .\n\\]\n\n---\n\n### 2.  Split the two products\n\n\\[\n\\begin{aligned}\n(x-y)(76-x-y)<0 &\\Longleftrightarrow \n\\begin{cases}\nx>y,\\;x+y>76\\quad\\text{(region }A)\\\\\n\\text{or}\\\\\nx<y,\\;x+y<76\\quad\\text{(region }B)\n\\end{cases}\\\\[2mm]\n(x+2y-75)(x+1)<0 &\\Longleftrightarrow\n\\begin{cases}\nx<-1,\\;x+2y>75\\quad\\text{(region }C)\\\\\n\\text{or}\\\\\nx>-1,\\;x+2y<75\\quad\\text{(region }D)\n\\end{cases}\n\\end{aligned}\n\\]\n\nIntersecting the possibilities gives four candidate regions:\n\n\\[\n\\begin{array}{c|c}\n\\text{Intersection} & \\text{Constraints}\\\\ \\hline\nA\\cap C & x>y,\\;x+y>76,\\;x<-1,\\;x+2y>75\\\\\nA\\cap D & x>y,\\;x+y>76,\\;x>-1,\\;x+2y<75\\\\\nB\\cap C & x<y,\\;x+y<76,\\;x<-1,\\;x+2y>75\\\\\nB\\cap D & x<y,\\;x+y<76,\\;x>-1,\\;x+2y<75\n\\end{array}\n\\]\n\nThe first intersection is impossible (it would require \\(x>y\\) while \\(x<-1<y\\)), so it is empty.\nThe remaining three are non\u2011empty; two are unbounded, while one is bounded.\n\n---\n\n### 3.  Identify the bounded region\n\nThe bounded region is \\(B\\cap D\\):\n\n\\[\n\\begin{cases}\nx>-1,\\\\[2pt]\nx<y,\\\\[2pt]\nx+2y<75 .\n\\end{cases}\n\\]\n\nFrom \\(x<y\\) and \\(x+2y<75\\) we obtain the upper bound for \\(y\\):\n\\[\ny<\\frac{75-x}{2}.\n\\]\n\nTogether with \\(x>-1\\) this forces\n\\[\n-1<x<25,\n\\qquad\nx<y<\\frac{75-x}{2}.\n\\]\n\nHence in the \\((x,y)\\)-plane the region is the open triangle bounded by the three lines\n\n\\[\nx=-1,\\quad y=x,\\quad y=\\frac{75-x}{2}.\n\\]\n\nIts vertices are  \n\n\\[\n(-1,-1),\\;(-1,38),\\;(25,25).\n\\]\n\nThe area in the \\((x,y)\\)-plane is\n\n\\[\n\\text{Area}_{xy}\n= \\frac12\\cdot(\\text{base})\\cdot(\\text{height})\n= \\frac12\\cdot 39 \\cdot 26=507 .\n\\]\n\n---\n\n### 4.  Convert to area on the original plane\n\nThe plane \\(x+y+z=75\\) can be written as \\(z=75-x-y\\).\nFor a graph \\(z=f(x,y)\\) the surface element is  \n\n\\[\ndA = \\sqrt{1+f_x^2+f_y^2}\\,dx\\,dy\n    =\\sqrt{1+(-1)^2+(-1)^2}\\,dx\\,dy\n    =\\sqrt{3}\\,dx\\,dy .\n\\]\n\nTherefore the area of the finite region on the plane \\(x+y+z=75\\) is  \n\n\\[\n\\text{Area}= \\sqrt{3}\\times 507 = 507\\sqrt{3}.\n\\]\n\n---\n\n### 5.  Form \\(a\\sqrt{b}\\) and compute \\(a+b\\)\n\n\\[\na=507,\\qquad b=3\\;( \\text{square\u2011free}).\n\\]\n\nThus  \n\n\\[\na+b = 507+3 = 510.\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The graph of  \n\n\\[\nf(x)=\\begin{cases}\nx,&-1\\le x<1\\\\[2pt]\n2-x,&1\\le x<3\n\\end{cases},\\qquad f(x+4)=f(x)\n\\]\n\nis a periodic \u201csaw\u2011tooth\u2019\u2019 of period \\(4\\).  \nThe parabola is  \n\n\\[\nx=34y^{2}\\qquad (x\\ge 0).\n\\]\n\nFor an intersection we need  \n\n\\[\ny=f(x),\\qquad x=34y^{2}.\n\\]\n\n--------------------------------------------------------------------\n### 1.   Reducing the \\(x\\)\u2013coordinate\n\nWrite \\(x=34y^{2}=4n+u\\) where \\(n\\in\\mathbb Z\\) and the reduced part  \n\n\\[\nu\\in[-1,3)\n\\]\n\n(because on each period we use the definition of \\(f\\) on \\([-1,3)\\)).\nHence  \n\n\\[\nu=34y^{2}-4n .\n\\]\n\n--------------------------------------------------------------------\n### 2.   The two cases for \\(u\\)\n\n* If \\(u\\in[-1,1)\\) then \\(f(x)=u\\); the equation becomes  \n\n  \\[\n  y=u\\quad\\Longrightarrow\\quad y=34y^{2}-4n .\n  \\]\n\n* If \\(u\\in[1,3)\\) then \\(f(x)=2-u\\); the equation becomes  \n\n  \\[\n  y=2-u\\quad\\Longrightarrow\\quad u=2-y ,\n  \\]\n  hence  \n\n  \\[\n  34y^{2}-4n=2-y .\n  \\]\n\nBecause \\(f(x)\\) takes only values in \\([-1,1]\\), all solutions must satisfy \\(-1\\le y\\le 1\\).\n\n--------------------------------------------------------------------\n### 3.   Solving the quadratics\n\n**Case A:** \\(y=34y^{2}-4n\\)\n\n\\[\n34y^{2}-y-4n=0\\qquad\\Longrightarrow\\qquad  \ny=\\frac{1\\pm\\sqrt{1+544n}}{68}.\n\\]\n\n**Case B:** \\(34y^{2}-4n=2-y\\)\n\n\\[\n34y^{2}+y-(2+4n)=0\\qquad\\Longrightarrow\\qquad  \ny=\\frac{-1\\pm\\sqrt{273+544n}}{68}.\n\\]\n\nSince \\(x=34y^{2}\\le 34\\), we have \\(0\\le x\\le 34\\).  \nConsequently \\(4n+u\\le 34\\) and with \\(u\\ge-1\\) we obtain \\(0\\le n\\le8\\).\n\n--------------------------------------------------------------------\n### 4.   Which roots lie in \\([-1,1]\\)?\n\n* For **Case\u202fA** (\\(n=0,\\dots,8\\)) both roots are in \\([-1,1]\\).  \n  Their sum for each \\(n\\) is\n\n  \\[\n  y_{A+}+y_{A-}= \\frac{1}{34}.\n  \\]\n\n* For **Case\u202fB** (\\(n=0,\\dots,7\\)) both roots are in \\([-1,1]\\);  \n  for \\(n=8\\) only the \u201c+\u2019\u2019 root lies in the interval.  \n  The sum of the two roots for each \\(n\\le7\\) is\n\n  \\[\n  y_{B+}+y_{B-}= -\\frac{1}{34}.\n  \\]\n\nThus the total sum of all \\(y\\)-coordinates is\n\n\\[\n\\begin{aligned}\n\\sum y &=\\sum_{n=0}^{8}\\frac1{34}\\;+\\;\\sum_{n=0}^{7}\\!\\Big(-\\frac1{34}\\Big)\\;+\\;y_{B+}(8)\\\\\n&= \\frac{9}{34}-\\frac{8}{34}+y_{B+}(8)\\\\\n&= \\frac1{34}+ \\frac{-1+\\sqrt{273+544\\cdot8}}{68}.\n\\end{aligned}\n\\]\n\nSince \\(273+544\\cdot8 = 4625 = 25\\cdot185\\),\n\n\\[\ny_{B+}(8)=\\frac{-1+5\\sqrt{185}}{68},\n\\qquad\n\\frac1{34}= \\frac{2}{68}.\n\\]\n\nHence\n\n\\[\n\\sum y =\\frac{2-1+5\\sqrt{185}}{68}= \\frac{1+5\\sqrt{185}}{68}.\n\\]\n\n--------------------------------------------------------------------\n### 5.   Final form\n\n\\[\n\\frac{1+5\\sqrt{185}}{68}= \\frac{a+b\\sqrt{c}}{d},\n\\qquad \na=1,\\;b=5,\\;c=185,\\;d=68 .\n\\]\n\nAll conditions are satisfied (\\(\\gcd(a,b,d)=1\\) and \\(185\\) is square\u2011free).\n\n\\[\na+b+c+d = 1+5+185+68 = 259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the three rows be \\(R_{1},R_{2},R_{3}\\) and the three \\(3\\times 3\\) blocks be  \n\n\\[\nB_{1}= \\text{columns }1\\!-\\!3,\\qquad   \nB_{2}= \\text{columns }4\\!-\\!6,\\qquad   \nB_{3}= \\text{columns }7\\!-\\!9 .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Fix the first row  \n\nSince the rows are labelled, we may first choose any permutation of \\(\\{1,\\dots ,9\\}\\) for \\(R_{1}\\).\nThere are  \n\n\\[\n9! = 2^{7}\\cdot 3^{4}\\cdot5\\cdot7\n\\]\n\nways.\n\n--------------------------------------------------------------------\n### 2.  Which digits go to the second row in each block?  \n\nAssume \\(R_{1}=1\\,2\\,3\\;4\\,5\\,6\\;7\\,8\\,9\\) (the identity permutation).  \nThen  \n\n* In \\(B_{1}\\) the missing digits are \\(\\{4,5,6,7,8,9\\}\\);  \n* In \\(B_{2}\\) the missing digits are \\(\\{1,2,3,7,8,9\\}\\);  \n* In \\(B_{3}\\) the missing digits are \\(\\{1,2,3,4,5,6\\}\\).\n\nFor the second row we must pick, from each block, three of its six missing digits.\nThe three rows must each contain every digit exactly once, so each digit\nmust appear **once** in \\(R_{2}\\) (and the remaining occurrence of that digit will be in \\(R_{3}\\)).\nThus the choice of digits for \\(R_{2}\\) is a partition of the six\u2013digit sets\nsubject to the condition that each of the nine digits occurs in exactly one block of \\(R_{2}\\).\n\nLet  \n\n* \\(x\\) = number of digits \\(\\{1,2,3\\}\\) placed in \\(B_{2}\\) (the rest go to \\(B_{3}\\));\n* \\(y\\) = number of digits \\(\\{4,5,6\\}\\) placed in \\(B_{1}\\) (the rest go to \\(B_{3}\\));\n* \\(z\\) = number of digits \\(\\{7,8,9\\}\\) placed in \\(B_{1}\\) (the rest go to \\(B_{2}\\)).\n\nFrom the block\u2011size condition we obtain  \n\n\\[\n\\begin{cases}\ny+z=3,\\\\\nx+ (3-z)=3,\\\\\n(3-x)+(3-y)=3,\n\\end{cases}\\qquad\\Longrightarrow\\qquad\nx=z,\\;x+y=3 .\n\\]\n\nHence \\(x\\) may be \\(0,1,2,3\\); then \\(y=3-x\\) and \\(z=x\\).\nFor a given \\(x\\),\n\n* choose the \\(x\\) digits of \\(\\{1,2,3\\}\\) that go to \\(B_{2}\\): \\(\\binom{3}{x}\\) ways;\n* choose the \\(y=3-x\\) digits of \\(\\{4,5,6\\}\\) that go to \\(B_{1}\\): \\(\\binom{3}{3-x}=\\binom{3}{x}\\) ways;\n* choose the \\(z=x\\) digits of \\(\\{7,8,9\\}\\) that go to \\(B_{1}\\): \\(\\binom{3}{x}\\) ways.\n\nThus for this \\(x\\) we have \\(\\bigl(\\binom{3}{x}\\bigr)^{3}\\) possibilities.\nSumming over \\(x=0,1,2,3\\),\n\n\\[\n\\sum_{x=0}^{3}\\binom{3}{x}^{3}=1+27+27+1=56 .\n\\]\n\nSo there are \\(56\\) ways to decide which three\u2011digit sets belong to the second row\n(and the third row is forced to receive the complementary sets).\n\n--------------------------------------------------------------------\n### 3.  Ordering the digits inside each block  \n\nInside a block each row contains three distinct digits.\nFor a fixed block, the three chosen digits of \\(R_{2}\\) can be placed in the\nthree columns in \\(3!\\) ways, and independently the three digits of \\(R_{3}\\) can be placed in \\(3!\\) ways.\nHence each block contributes \\((3!)^{2}=36\\) arrangements.\n\nWith three blocks we obtain \\((36)^{3}=36^{3}=46\\,656\\) column\u2011orderings.\n\n--------------------------------------------------------------------\n### 4.  Total number of grids  \n\n\\[\nN = 9! \\times 56 \\times 36^{3}\n     = 2^{7}\\!3^{4}\\!5\\!7\\; \\times 2^{3}\\!7\\; \\times 2^{6}\\!3^{6}\n     = 2^{16}\\,3^{10}\\,5^{1}\\,7^{2}.\n\\]\n\nThus\n\n\\[\nN = p^{a}\\,q^{b}\\,r^{c}\\,s^{d}\n\\quad\\text{with}\\quad\n(p,q,r,s)=(2,3,5,7),\\;\n(a,b,c,d)=(16,10,1,2).\n\\]\n\n--------------------------------------------------------------------\n### 5.  Required sum  \n\n\\[\np a + q b + r c + s d\n = 2\\cdot16 + 3\\cdot10 + 5\\cdot1 + 7\\cdot2\n = 32 + 30 + 5 + 14\n = 81 .\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line containing the points be the \\(x\\)-axis.  \nPlace \\(A\\) at the origin, \\(A=(0,0)\\), and write the coordinates of the other\ncollinear points as\n\n\\[\nB=(x_B,0),\\;C=(x_C,0),\\;D=(x_D,0),\\;E=(x_E,0),\\;F=(x_F,0).\n\\]\n\n---\n\n### 1.  Find the positions of \\(B,\\;C,\\;D,\\;E,\\;F\\)\n\nThe given distances are along the line, so\n\n\\[\n\\begin{aligned}\nAC&=26 &&\\Rightarrow x_C=26,\\\\[2pt]\nAF&=73 &&\\Rightarrow x_F=73,\\\\[2pt]\nCE&=31 &&\\Rightarrow x_E=x_C+31=57,\\\\[2pt]\nDF&=33 &&\\Rightarrow x_D=x_F-33=40,\\\\[2pt]\nBD&=22 &&\\Rightarrow x_B=x_D-22=18.\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\nA=0,\\; B=18,\\; C=26,\\; D=40,\\; E=57,\\; F=73 .\n\\]\n\n---\n\n### 2.  Coordinates of \\(G\\)\n\nLet \\(G=(x_G,h)\\), where \\(h>0\\) is the perpendicular distance from \\(G\\) to the line.\n\nThe distances from \\(G\\) to \\(C\\) and \\(D\\) give\n\n\\[\n\\begin{cases}\n(x_G-26)^2+h^2 = 40^2 = 1600,\\\\[4pt]\n(x_G-40)^2+h^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtracting the second equation from the first:\n\n\\[\n(x_G-26)^2-(x_G-40)^2 = 1600-900 = 700 .\n\\]\n\nCompute the left side:\n\n\\[\n(x_G^2-52x_G+26^2)-(x_G^2-80x_G+40^2)\n=28x_G-924 .\n\\]\n\nHence  \n\n\\[\n28x_G-924 = 700 \\quad\\Longrightarrow\\quad 28x_G = 1624\n\\quad\\Longrightarrow\\quad x_G = 58 .\n\\]\n\nNow find \\(h\\) using either distance equation; use the first:\n\n\\[\n(58-26)^2 + h^2 = 1600\n\\Longrightarrow 32^2 + h^2 = 1600\n\\Longrightarrow h^2 = 1600-1024 = 576\n\\Longrightarrow h = 24 .\n\\]\n\nThus \\(G=(58,24)\\). Its perpendicular projection onto the line is at \\(x=58\\), which lies between \\(E\\) and \\(F\\).\n\n---\n\n### 3.  Area of \\(\\triangle BGE\\)\n\nThe base \\(BE\\) lies on the \\(x\\)-axis:\n\n\\[\nBE = x_E - x_B = 57-18 = 39 .\n\\]\n\nThe height from \\(G\\) to this base is the vertical distance \\(h=24\\).\n\nTherefore\n\n\\[\n\\text{Area} = \\frac12 \\times (\\text{base}) \\times (\\text{height})\n= \\frac12 \\times 39 \\times 24 = 39 \\times 12 = 468 .\n\\]\n\n---\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\text{Find all }n\\in\\mathbb Z_{>0}\\text{ such that }(n+2)\\mid 3(n+3)(n^2+9).\n\\]\n\n---\n\n### 1.  Replace \\(n+2\\) by a new variable  \n\nSet  \n\\[\nm=n+2\\qquad (m\\ge 3).\n\\]\n\nThen  \n\n\\[\nn=m-2,\\qquad n+3=m+1,\\qquad n^2+9=(m-2)^2+9=m^{2}-4m+13 .\n\\]\n\nHence the divisibility condition becomes  \n\n\\[\nm\\mid 3(m+1)(m^{2}-4m+13).\n\\tag{1}\n\\]\n\n---\n\n### 2.  Reduce the right\u2013hand side modulo \\(m\\)\n\nModulo \\(m\\),\n\n\\[\nm+1\\equiv 1,\\qquad m^{2}-4m+13\\equiv 13 .\n\\]\n\nTherefore  \n\n\\[\n3(m+1)(m^{2}-4m+13)\\equiv 3\\cdot1\\cdot13=39 \\pmod m .\n\\]\n\nSo (1) is equivalent to  \n\n\\[\nm\\mid 39 .\n\\tag{2}\n\\]\n\nIndeed, if \\(m\\mid 39\\) then the right\u2013hand side of (1) equals \\(39+km\\) for some integer \\(k\\), hence is divisible by \\(m\\); conversely, if \\(m\\mid 3(m+1)(m^{2}-4m+13)\\) then \\(m\\mid 39\\).\n\n---\n\n### 3.  List possible \\(m\\)\n\nThe positive divisors of \\(39\\) are  \n\n\\[\n1,\\;3,\\;13,\\;39 .\n\\]\n\nSince \\(m=n+2\\ge 3\\) (because \\(n\\ge1\\)), we keep  \n\n\\[\nm\\in\\{3,\\;13,\\;39\\}.\n\\]\n\n---\n\n### 4.  Recover the corresponding \\(n\\)\n\n\\[\n\\begin{aligned}\nm=3 &\\;\\Rightarrow\\; n=m-2=1,\\\\[2pt]\nm=13 &\\;\\Rightarrow\\; n=11,\\\\[2pt]\nm=39 &\\;\\Rightarrow\\; n=37 .\n\\end{aligned}\n\\]\n\nAll three indeed satisfy the original divisibility (quick check: the quotients are \\(40,420,4240\\) respectively).\n\n---\n\n### 5.  Sum of all such \\(n\\)\n\n\\[\n1+11+37=49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nP:\\;y=x^{2}-4\n\\]\n\nand rotate \\(P\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin.  \nIf \\((u,v)\\) is a point of \\(P\\) \\((v=u^{2}-4)\\), after the rotation we obtain  \n\n\\[\n\\begin{aligned}\nx &=u\\cos 60^{\\circ}-v\\sin 60^{\\circ}\n      =\\frac{u-\\sqrt3\\,(u^{2}-4)}2,\\\\[2mm]\ny &=u\\sin 60^{\\circ}+v\\cos 60^{\\circ}\n      =\\frac{\\sqrt3\\,u+u^{2}-4}2 .\n\\end{aligned}\n\\tag{1}\n\\]\n\nA point \\((x,y)\\) that belongs to both the original parabola and its image\nmust satisfy  \n\n\\[\ny=x^{2}-4 \\qquad\\text{and}\\qquad (x,y)=\\bigl(x(u),y(u)\\bigr)\\text{ for some }u .\n\\]\n\nUsing (1) and substituting \\(y=x^{2}-4\\) we get an equation for the\npre\u2011image coordinate \\(u\\):\n\n\\[\n\\Bigl(u-\\sqrt3\\,(u^{2}-4)\\Bigr)^{2}=2u^{2}+2\\sqrt3\\,u+8 .\n\\]\n\nSimplifying gives  \n\n\\[\n3u^{4}-25u^{2}+40+2\\sqrt3\\,u\\,(3-u^{2})=0 .\n\\tag{2}\n\\]\n\nLet \\(t=u^{2}=x^{2}\\;(t\\ge0)\\).  Equation (2) becomes  \n\n\\[\n\\bigl(3t^{2}-25t+40\\bigr)^{2}=12t\\,(3-t)^{2},\n\\]\n\nor\n\n\\[\n9t^{4}-162t^{3}+937t^{2}-2108t+1600=0 .\n\\tag{3}\n\\]\n\nThe quartic factors over the integers:\n\n\\[\n\\begin{aligned}\n9t^{4}-162t^{3}+937t^{2}-2108t+1600\n  &=\\bigl(t^{2}-11t+16\\bigr)\\bigl(9t^{2}-63t+100\\bigr).\n\\end{aligned}\n\\]\n\nThus the possible values of \\(t\\) are\n\n\\[\nt=\\frac{11\\pm\\sqrt{57}}2,\\qquad\nt=\\frac{63\\pm\\sqrt{369}}{18}.\n\\]\n\nRecall that \\(t=x^{2}\\) and that a genuine intersection must satisfy the\noriginal unsquared equation  \n\n\\[\n3t^{2}-25t+40=2\\sqrt3\\,\\sqrt t\\,(3-t).\n\\tag{4}\n\\]\n\nChecking the sign of each side of (4) shows that only  \n\n\\[\nt=\\frac{11-\\sqrt{57}}2\\approx1.725\n\\]\n\nsatisfies (4) with \\(x>0\\).  (The other three roots correspond to the\ncase \\(3t^{2}-25t+40= -2\\sqrt3\\,\\sqrt t\\,(3-t)\\) or give \\(y>0\\).)\n\nSince \\(y=x^{2}-4=t-4\\),\n\n\\[\ny=\\frac{11-\\sqrt{57}}2-4=\\frac{3-\\sqrt{57}}2 .\n\\]\n\nHence the required numbers are  \n\n\\[\na=3,\\qquad b=57,\\qquad c=2,\n\\]\n\nwith \\(\\gcd(a,c)=1\\).  Therefore\n\n\\[\na+b+c=3+57+2=62 .\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n\\]\n\n---\n\n### 1.  Rewrite each term using change of base  \n\n\\[\n\\log_a b=\\frac{\\ln b}{\\ln a}\n\\]\n\nHence  \n\n\\[\n\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n =\\frac{\\displaystyle\\frac{\\ln\\! \\big(5^{\\,k^2-1}\\big)}{\\ln k}}\n        {\\displaystyle\\frac{\\ln\\! \\big(5^{\\,k^2-4}\\big)}{\\ln (k+1)}}\n =\\frac{(k^2-1)\\ln5}{\\ln k}\\cdot\\frac{\\ln (k+1)}{(k^2-4)\\ln5}\n =\\frac{k^2-1}{k^2-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nThus the whole product becomes  \n\n\\[\n\\Bigl[\\prod_{k=4}^{63}\\frac{k^2-1}{\\,k^2-4}\\Bigr]\\,\n\\Bigl[\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\\Bigr].\n\\]\n\n---\n\n### 2.  The logarithmic factor telescopes  \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n= \\frac{\\ln5}{\\ln4}\\cdot\\frac{\\ln6}{\\ln5}\\cdots\\frac{\\ln64}{\\ln63}\n= \\frac{\\ln64}{\\ln4}\n= \\frac{6\\ln2}{2\\ln2}=3.\n\\]\n\n---\n\n### 3.  Simplify the rational factor  \n\n\\[\n\\frac{k^2-1}{k^2-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)}.\n\\]\n\nHence  \n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\n= \\Bigl[\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr]\n  \\Bigl[\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr].\n\\]\n\n**First product**\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n= \\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\frac{5}{4}\\cdots\\frac{62}{61}\n= \\frac{62}{2}=31.\n\\]\n\n**Second product**\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n= \\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\frac{7}{8}\\cdots\\frac{64}{65}\n= \\frac{5}{65}= \\frac{1}{13}.\n\\]\n\nMultiplying,\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}=31\\cdot\\frac{1}{13}= \\frac{31}{13}.\n\\]\n\n---\n\n### 4.  Combine the two parts  \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n= \\frac{31}{13}\\times 3 = \\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms (\\(\\gcd(93,13)=1\\)).  \n\nThus \\(m=93,\\; n=13\\) and  \n\n\\[\nm+n = 93+13 = 106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Sketch**\n\nWrite every integer \\(a\\le 3^{6}=729\\) in its base\u2011\\(3\\) expansion  \n\n\\[\na = a_{0}+a_{1}3+a_{2}3^{2}+a_{3}3^{3}+a_{4}3^{4}+a_{5}3^{5},\n\\qquad a_{i}\\in\\{0,1,2\\}.\n\\]\n\nLet  \n\n\\[\nA(x)=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+a_{4}x^{4}+a_{5}x^{5}\\in\\mathbb{F}_{3}[x].\n\\]\n\nModulo \\(3^{7}\\) we have  \n\n\\[\na^{3}\\equiv a_{0}^{3}+9a_{0}^{2}a_{1}+27\\bigl(a_{0}a_{1}^{2}+a_{0}^{2}a_{2}\\bigr)\n               +\\; \\cdots\\;+3^{6}a_{2}^{3}\\pmod{3^{7}} .\n\\]\n\nHence\n\n\\[\na^{3}+b^{3}+c^{3}\\equiv \n\\sum_{i=0}^{2}3^{i}\\bigl(a_{i}^{3}+b_{i}^{3}+c_{i}^{3}\\bigr)\\pmod{3^{7}} .\n\\]\n\nBecause \\(x^{3}\\equiv x\\pmod 3\\) for \\(x\\in\\{0,1,2\\}\\), the condition\n\\(a^{3}+b^{3}+c^{3}\\equiv0\\pmod{3^{7}}\\) is equivalent to the three\nindependent linear equations  \n\n\\[\na_{0}+b_{0}+c_{0}\\equiv0,\\qquad\na_{1}+b_{1}+c_{1}\\equiv0,\\qquad\na_{2}+b_{2}+c_{2}\\equiv0\\pmod 3 .\n\\]\n\nFor each digit\u2011position \\(i=0,1,2\\) the number of ordered triples\n\\((a_{i},b_{i},c_{i})\\) satisfying the linear condition is\n\\(3^{2}=9\\) (choose any two digits freely, the third one is forced).\nThe remaining higher digits \\(a_{3},a_{4},a_{5}\\) are unrestricted; each\nhas \\(3^{3}=27\\) possibilities (three choices for each of the three\nnumbers).\n\nTherefore the total number of admissible triples \\((a,b,c)\\) is  \n\n\\[\nN = 9^{3}\\cdot 27^{3}=3^{15}=14\\,348\\,907 .\n\\]\n\nFinally we need the remainder of \\(N\\) modulo \\(1000\\):\n\n\\[\n14\\,348\\,907\\equiv 907\\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 907

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(a,b,c,d\\) be the four interior edges (the two interior vertical and the two interior horizontal sides).  \n* The eight outer edges are the two edges that belong to each unit square but are on the boundary of the\n\\(2\\times2\\) grid.\n\nFor a particular unit square the number of its interior red sides is the number of red interior edges incident\nto it.  \nIf a square has \\(s\\) interior red sides, then it needs exactly \\(2-s\\) red outer sides, because the total number\nof red sides must be \\(2\\).  \n\nFor a given square\n\n\\[\n\\#\\text{ ways to colour its two outer edges}= \\binom{2}{\\,2-s\\,}=\n\\begin{cases}\n1,&s=0\\text{ or }2,\\\\[2pt]\n2,&s=1 .\n\\end{cases}\n\\]\n\nThus, once the interior edges are fixed, the outer edges can be coloured independently for each square.\nIf among the four squares exactly \\(k\\) of them have \\(s=1\\) (i.e. exactly one interior red edge incident to the\nsquare), the number of completions of the outer edges is \\(2^{k}\\).\n\n--------------------------------------------------------------------\n\n### Counting interior\u2013edge configurations\n\nThe interior edges form a 4\u2011cycle  \n\n\\[\nA\\;-\\;B\\;-\\;D\\;-\\;C\\;-\\;A .\n\\]\n\nWe list all \\(2^{4}=16\\) subsets of these edges and, for each, count how many squares have one interior red\nedge.\n\n| # interior edges | type of selection | \\# of squares with \\(s=1\\) | \\# of such subsets | contributions |\n|------------------|-------------------|----------------------------|--------------------|---------------|\n| 0 | none | 0 | 1 | \\(2^{0}=1\\) |\n| 1 | any one edge | 2 (the two squares incident to the edge) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 2 | adjacent edges (share a vertex) | 2 (the two squares adjacent to the common vertex) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 2 | opposite edges (no common vertex) | 4 (each square gets one) | 2 | \\(2\\cdot2^{4}=32\\) |\n| 3 | all but one edge | 2 (the two squares not incident to the missing edge) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 4 | all four edges | 0 | 1 | \\(1\\cdot2^{0}=1\\) |\n\nAdding the contributions:\n\n\\[\n1+16+16+32+16+1 = 82 .\n\\]\n\n--------------------------------------------------------------------\n\nTherefore there are  \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent ways to colour the 12 unit segments so that each of the four unit squares has exactly two red sides\n(and consequently two blue sides).
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\(2025=3^{4}\\cdot5^{2}\\).\n\nDivisors of \\(2025\\) are of the form \\(3^{a}5^{b}\\) with  \n\\(0\\le a\\le4,\\;0\\le b\\le2\\); therefore  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\n--------------------------------------------------------------------\n### Condition for the LCM\n\nFor a subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a}\\,5^{\\max b}.\n\\]\n\nThus \\(\\operatorname{lcm}(B)=2025=3^{4}5^{2}\\) iff  \n\n* at least one element of \\(B\\) has exponent \\(a=4\\) (i.e. is divisible by \\(3^{4}\\)), and  \n* at least one element of \\(B\\) has exponent \\(b=2\\) (i.e. is divisible by \\(5^{2}\\)).\n\n--------------------------------------------------------------------\n### Relevant divisor families  \n\n\\[\nX=\\{d\\in A\\mid 3^{4}\\mid d\\}=\\{81,405,2025\\},\\qquad |X|=3,\n\\]\n\n\\[\nY=\\{d\\in A\\mid 5^{2}\\mid d\\}=\\{25,75,225,675,2025\\},\\qquad |Y|=5.\n\\]\n\n\\(X\\cap Y=\\{2025\\}\\), so \\(|X\\cup Y|=3+5-1=7\\).\n\n--------------------------------------------------------------------\n### Counting subsets with the required property  \n\nA subset \\(B\\) works iff it meets both \\(X\\) and \\(Y\\).  \nUsing inclusion\u2013exclusion on all \\(2^{15}\\) subsets of \\(A\\):\n\n\\[\n\\begin{aligned}\n\\#\\{B:\\ B\\cap X\\neq\\varnothing,\\ B\\cap Y\\neq\\varnothing\\}\n&=2^{15}\n -2^{12}\\;(\\text{subsets missing }X)\n -2^{10}\\;(\\text{subsets missing }Y)\\\\\n&\\qquad +2^{8}\\;(\\text{subsets missing both }X\\cup Y)\\\\[2mm]\n&=32768-4096-1024+256\\\\\n&=27904 .\n\\end{aligned}\n\\]\n\nAll these subsets are non\u2011empty, so the numerator is \\(27904\\).\n\n--------------------------------------------------------------------\n### Probability\n\n\\[\nP=\\frac{27904}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nBoth numbers are divisible by \\(256\\):\n\n\\[\n\\frac{27904}{32768}=\\frac{27904/256}{32768/256}= \\frac{109}{128}.\n\\]\n\nThe fraction \\(\\frac{109}{128}\\) is already in lowest terms, so  \n\\(m=109,\\;n=128\\).\n\n\\[\nm+n=109+128=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step\u202f1 \u2013  How regions grow**\n\nWhen a new line segment is drawn in the disk, it either  \n*does not meet any previous segment* \u2013 it creates **one** new region, or  \n*meets \\(k\\) previous segments in interior points* \u2013 it creates **\\(k+1\\)** new regions  \n(the segment is cut into \\(k+1\\) pieces, each of which separates a region).\n\nHence, if we start with one region (the whole disk),\n\n\\[\n\\#\\text{regions}=1+\\#\\text{segments}+\\#\\text{interior intersections } .\n\\tag{1}\n\\]\n\nThe two perpendicular diameters intersect once, giving the four initial\nquadrants.  After the 25 random chords are added we will have  \n\n\\[\n27\\text{ segments} = 2\\text{ diameters}+25\\text{ chords}.\n\\]\n\nSo we only have to find the **expected number of interior intersection points**.\n\n--------------------------------------------------------------------\n\n**Step\u202f2 \u2013  Intersections with the diameters**\n\nA random chord meets a fixed diameter iff its two endpoints lie on opposite\nsides of that diameter.  \n\n*Horizontal diameter*\u2003(\\(y=0\\)): the endpoints must belong to one of the\nfour unordered quadrant pairs  \n\n\\[\n\\{Q_1,Q_3\\},\\{Q_1,Q_4\\},\\{Q_2,Q_3\\},\\{Q_2,Q_4\\},\n\\]\n\ni.e. 4 out of the 6 possible unordered pairs of different quadrants.\nThus  \n\n\\[\nP(\\text{chord meets a given diameter})=\\frac{4}{6}= \\frac23 .\n\\]\n\nThe same probability holds for the vertical diameter.  \nHence the expected number of chord\u2011diameter intersections is  \n\n\\[\n25\\;( \\text{chords})\\times 2\\;( \\text{diameters})\\times \\frac23\n  =\\frac{100}{3}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f3 \u2013  Intersections between two random chords**\n\nLet a chord be represented by the unordered pair of quadrants that contain its\nend\u2011points.  \nThere are  \n\n* 4 *adjacent* pairs  \\(\\{0,1\\},\\{1,2\\},\\{2,3\\},\\{3,0\\}\\);  \n* 2 *opposite* pairs   \\(\\{0,2\\},\\{1,3\\}\\).\n\nThus the six possible chords are the six edges of the complete graph \\(K_4\\)\non the four quadrants.\n\nTwo chords may be:\n\n| Relation of the two edges | How many ordered pairs | Intersection probability |\n|---------------------------|-----------------------|--------------------------|\n| Same edge (both chords use the same pair) | 6 (4 adjacent\u202f+\u202f2 opposite) | \\(\\frac12\\) |\n| Share one vertex (adjacent edges) | 24 (8 both adjacent\u202f+\u202f16 one adjacent\u2013one opposite) | \\(\\frac12\\) |\n| Disjoint edges, both adjacent (e.g. \\{0,1\\} & \\{2,3\\}) | 4 | \\(0\\) |\n| Disjoint edges, both opposite ( \\{0,2\\} & \\{1,3\\}) | 2 | \\(1\\) |\n\n*Why these probabilities?*  \n\n* Same edge \u2013 the two chords are independent copies inside the same two\nquadrants.  A short calculation (or a symmetry argument) gives a crossing\nprobability of \\(\\frac12\\).\n* Share a vertex \u2013 one endpoint of the second chord lies in the same quadrant\nas an endpoint of the first chord.  The second endpoint is always in a\ndifferent quadrant, so the second chord meets the first exactly when the\npoint that shares the vertex falls between the two endpoints of the first\nchord.  Averaging over the uniform positions gives \\(\\frac12\\) again.\n* Disjoint adjacent edges lie completely on opposite sides of the\nhorizontal (or vertical) diameter, so they can never meet \u21d2 probability \\(0\\).\n* Disjoint opposite edges always cross the centre of the disk; any two such\nchords intersect \u21d2 probability \\(1\\).\n\nSumming the contributions of the \\(36\\) ordered pairs of chords,\n\n\\[\nS = 6\\!\\left(\\frac12\\right)+24\\!\\left(\\frac12\\right)+4\\cdot0+2\\cdot1 = 17 .\n\\]\n\nTherefore the probability that two independently chosen random chords intersect is  \n\n\\[\np_{\\text{chord\u2013chord}} = \\frac{S}{36}= \\frac{17}{36}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f4 \u2013  Expected number of chord\u2013chord intersections**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of the 25 random chords.  \nUsing (3),\n\n\\[\nE(\\text{chord\u2013chord intersections})=300\\cdot\\frac{17}{36}\n     =\\frac{425}{3}=141\\frac{2}{3}.\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f5 \u2013  Total expected interior intersections**\n\n\\[\n\\begin{aligned}\nE(\\text{total interior intersections})\n&= (\\text{diameters intersect})\\\\\n&\\qquad +(\\text{chord\u2013diameter intersections})\\\\\n&\\qquad +(\\text{chord\u2013chord intersections})\\\\[2mm]\n&= 1+\\frac{100}{3}+ \\frac{425}{3}= 176 .\n\\end{aligned}\n\\tag{5}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f6 \u2013  Expected number of regions**\n\nInsert (5) into formula (1) with the total of \\(27\\) segments:\n\n\\[\nE(\\text{regions}) = 1 + 27 + 176 = 204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nPlace the two circles on a coordinate plane, compute the positions of the relevant points, and write the\nrectangle\u2019s vertices in terms of its side\u2013lengths.  \nThe conditions \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u201d and \u201c\\(D\\) is closer to\n\\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u201d fix the orientation of the rectangle.  \nUsing the equality of the two triangle areas we obtain a simple relation between the rectangle\u2019s width\nand height, which together with the fact that the rectangle is inscribed in the small circle yields the\nrequired dimensions and its area.\n\n--------------------------------------------------------------------\n\n### 1.  Coordinate set\u2011up  \n\nLet  \n\n* \\(O\\) be the centre of the large circle \\(\\omega_2\\) (radius \\(15\\)).\n* \\(A\\) be the centre of the small circle \\(\\omega_1\\) (radius \\(6\\)).\n* \\(B\\) the common point of tangency.\n\nBecause the circles are internally tangent,\n\\[\nOA = 15-6=9,\n\\qquad AB=6,\n\\qquad OB =15 .\n\\]\n\nChoose the \\(x\\)\u2013axis along \\(\\overline{BC}\\).  \nTake  \n\n\\[\nO=(0,0),\\qquad B=(15,0).\n\\]\n\nThen \\(A\\) lies on the same line, nine units left of \\(B\\):\n\\[\nA=(9,0).\n\\]\n\nSince \\(BC\\) is a diameter of \\(\\omega_2\\), the opposite end of the diameter is\n\\[\nC=(-15,0).\n\\]\n\nThe condition \\(\\overline{BC}\\perp\\overline{AD}\\) makes \\(AD\\) vertical, so the points of\n\\(\\omega_2\\) with \\(x=9\\) are\n\\[\nD=(9,12)\\quad\\text{or}\\quad D=(9,-12).\n\\]\nBecause later we need \\(D\\) to be nearer the top side of the rectangle, we take  \n\n\\[\n\\boxed{D=(9,12)} .\n\\]\n\n--------------------------------------------------------------------\n\n### 2.  The rectangle \\(EFGH\\)\n\n\\(EF\\) is required to be perpendicular to \\(\\overline{BC}\\); hence \\(EF\\) is a vertical side.\nLet the rectangle have\n\n* width \\(w\\) (the horizontal side \\(\\overline{FG}\\)),\n* height \\(h\\) (the vertical side \\(\\overline{EF}= \\overline{GH}\\)).\n\nSince the rectangle is inscribed in \\(\\omega_1\\), its centre coincides with the centre of \\(\\omega_1\\),\nnamely \\(A=(9,0)\\).  Consequently the vertices are\n\n\\[\n\\begin{aligned}\nE&=\\bigl(b,\\,-\\tfrac{h}{2}\\bigr), &\nF&=\\bigl(b, \\tfrac{h}{2}\\bigr),\\\\[2mm]\nG&=\\bigl(a, \\tfrac{h}{2}\\bigr), &\nH&=\\bigl(a,\\,-\\tfrac{h}{2}\\bigr),\n\\end{aligned}\n\\]\nwhere  \n\n\\[\na = 9-\\frac{w}{2},\\qquad b = 9+\\frac{w}{2}.\n\\]\n\nBecause every vertex lies on \\(\\omega_1\\) (radius \\(6\\) and centre \\((9,0)\\)),\n\\[\n(a-9)^2+\\Bigl(\\frac{h}{2}\\Bigr)^2 = (b-9)^2+\\Bigl(\\frac{h}{2}\\Bigr)^2 = 6^{2}=36 .\n\\]\nBoth equations give the single relation  \n\n\\[\n\\boxed{w^{2}+h^{2}=144}\\tag{1}\n\\]\n(the rectangle\u2019s diagonal is the diameter \\(12\\) of the small circle).\n\n--------------------------------------------------------------------\n\n### 3.  Interpreting the \u201ccloser\u2011to\u201d conditions  \n\nThe statement \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u201d forces \\(\\overline{GH}\\) to be\nthe left vertical side (smaller \\(x\\))-coordinate) and \\(\\overline{EF}\\) the right vertical side.  \nSimilarly \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u201d places \\(\\overline{FG}\\) at the\ntop (larger \\(y\\))-coordinate.\n\nThus  \n\n\\[\n\\begin{aligned}\n\\text{dist}(C,\\overline{GH})&=a-(-15)=a+15,\\\\\n\\text{dist}(C,\\overline{EF})&=b+15,\\\\[1mm]\n\\text{dist}(D,\\overline{FG})&=12-\\frac{h}{2},\\\\\n\\text{dist}(D,\\overline{EH})&=12+\\frac{h}{2},\n\\end{aligned}\n\\]\nand the above inequalities are automatically satisfied for any feasible rectangle\n(\\(a<b\\) and \\(h/2<12\\)).\n\n--------------------------------------------------------------------\n\n### 4.  Equality of the two triangle areas  \n\n*Triangle \\(DGF\\).*  \n\\(G\\) and \\(F\\) are the top\u2011left and top\u2011right vertices, so \\(\\overline{GF}\\) is horizontal,\n\\(|GF| = w\\).  The altitude from \\(D\\) to \\(\\overline{GF}\\) is the vertical distance\n\\(12-\\frac{h}{2}\\).  Hence  \n\n\\[\n[ DGF ] = \\frac12 \\, w\\!\\left(12-\\frac{h}{2}\\right).\n\\tag{2}\n\\]\n\n*Triangle \\(CHG\\).*  \n\\(G\\) and \\(H\\) lie on the left side, \\(|GH|=h\\).  The altitude from \\(C\\) to this side is the\nhorizontal distance \\(a+15\\).  Thus  \n\n\\[\n[ CHG ] = \\frac12 \\, h\\,(a+15).\n\\tag{3}\n\\]\n\nGiven \\([DGF]=[CHG]\\) and using \\(a=9-\\dfrac w2\\), we have  \n\n\\[\nw\\!\\left(12-\\frac{h}{2}\\right)=\nh\\!\\Bigl(9-\\frac{w}{2}+15\\Bigr)\n= h\\!\\bigl(24-\\frac{w}{2}\\bigr).\n\\]\n\nExpanding and cancelling the common term \\(-\\dfrac{wh}{2}\\) yields  \n\n\\[\n12w = 24h \\quad\\Longrightarrow\\quad \\boxed{w = 2h}. \\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n### 5.  Determining \\(w\\) and \\(h\\)\n\nInsert \\(w=2h\\) into (1):\n\n\\[\n(2h)^{2}+h^{2}=144\n\\;\\Longrightarrow\\;5h^{2}=144\n\\;\\Longrightarrow\\;h^{2}=\\frac{144}{5}.\n\\]\n\nHence  \n\n\\[\nh = \\frac{12}{\\sqrt5}= \\frac{12\\sqrt5}{5},\n\\qquad \nw = 2h = \\frac{24\\sqrt5}{5}.\n\\]\n\n--------------------------------------------------------------------\n\n### 6.  Area of the rectangle  \n\n\\[\n[EFGH]=w\\cdot h = 2h^{2}=2\\cdot\\frac{144}{5}= \\frac{288}{5}.\n\\]\n\nThus the required area is \\(\\displaystyle \\frac{288}{5}\\); the fraction is already in lowest terms.\nSo \\(m=288,\\; n=5\\) and  \n\n\\[\nm+n = 288+5 = 293 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nx_{k+1}= \\frac{x_k+\\dfrac1{x_k}-1}{3}, \\qquad x_1=\\frac{25}{11}.\n\\]\n\n--------------------------------------------------------------------\n### 1.  A convenient change of variable  \n\nSet  \n\n\\[\nt_k=\\frac{x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{1+t_k}{1-t_k}.\n\\]\n\nThen a short computation gives  \n\n\\[\nt_{k+1}= \\frac{3t_k^{2}-1}{2}. \\tag{1}\n\\]\n\nThus the problem reduces to iterating the quadratic map  \n\n\\[\nF(t)=\\frac{3t^{2}-1}{2}\n\\]\n\nstarting from  \n\n\\[\nt_1=\\frac{x_1-1}{x_1+1}\n      =\\frac{25/11-1}{25/11+1}\n      =\\frac{7}{18}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Working with the original rationals  \n\nWrite \\(t_k=p_k/q_k\\) in lowest terms.   \nFrom (1)\n\n\\[\n\\frac{p_{k+1}}{q_{k+1}}=\n\\frac{3p_k^{2}-3p_kq_k+3q_k^{2}}{2q_k^{2}}\n      =\\frac{p_k^{2}-p_kq_k+q_k^{2}}{3}\\;\\Big/\n        \\;\\frac{p_kq_k}{1},\n\\]\n\nhence (clearing the common factor \\(3\\))\n\n\\[\n\\boxed{\\displaystyle \np_{k+1}= \\frac{p_k^{2}-p_kq_k+q_k^{2}}{3},\n\\qquad \nq_{k+1}=p_kq_k } . \\tag{2}\n\\]\n\nFor the initial pair  \n\n\\[\np_1=25,\\qquad q_1=11 .\n\\]\n\nBecause \\(p_1\\equiv1,\\; q_1\\equiv2\\pmod 3\\) one checks from (2) that  \n\\(p_k\\equiv1,\\; q_k\\equiv2\\pmod 3\\) for every \\(k\\); consequently the\ndivision by \\(3\\) in (2) is always exact and the reduced fractions\n\\(\\dfrac{p_k}{q_k}=x_k\\) stay in lowest terms.\n\n--------------------------------------------------------------------\n### 3.  Behaviour modulo\u202f\\(8\\)\n\n\\(3\\) is invertible modulo \\(8\\) (\\(3^{-1}\\equiv3\\)).  \nFrom (2)\n\n\\[\np_{k+1}\\equiv 3\\bigl(p_k^{2}-p_kq_k+q_k^{2}\\bigr)\\pmod 8,\n\\qquad \nq_{k+1}\\equiv p_kq_k\\pmod 8 .\n\\]\n\nStarting with \\((p_1,q_1)\\equiv(1,3)\\pmod8\\) one obtains\n\n\\[\n(p_2,q_2)\\equiv(5,3),\\qquad\n(p_3,q_3)\\equiv(1,7),\n\\]\n\nand thereafter  \n\n\\[\np_k\\equiv1,\\quad q_k\\equiv7\\pmod8 \\qquad(k\\ge3).\n\\]\n\nHence for every \\(k\\ge3\\)\n\n\\[\np_k+q_k\\equiv0\\pmod8. \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Behaviour modulo\u202f\\(125\\)\n\n\\(3^{-1}\\equiv42\\pmod{125}\\).  Using (2),\n\n\\[\np_{k+1}\\equiv42\\bigl(p_k^{2}-p_kq_k+q_k^{2}\\bigr)\\pmod{125},\n\\qquad \nq_{k+1}\\equiv p_kq_k\\pmod{125}. \\tag{4}\n\\]\n\nComputating a few steps (mod\u202f125) gives  \n\n\\[\n\\begin{array}{c|c|c}\nk & p_k\\pmod{125} & q_k\\pmod{125}\\\\ \\hline\n1 & 25 & 11\\\\\n2 & 32 & 25\\\\\n3 & 33 & 50\\\\\n4 & 63 & 25\\\\\n5 & 48 & 75\\\\\n6 & 68 &100\\\\\n\\vdots &\\vdots &\\vdots\n\\end{array}\n\\]\n\nFrom \\(k=4\\) onward the pair \\((p_k,q_k)\\) repeats with period\u202f20:\n\n\\[\n(p_{k+20},q_{k+20})\\equiv(p_k,q_k)\\pmod{125}\\qquad(k\\ge4).\n\\]\n\nSince \\(2025\\equiv5\\pmod{20}\\) and \\(2025\\ge4\\),\n\n\\[\np_{2025}\\equiv p_5\\equiv48,\\qquad\nq_{2025}\\equiv q_5\\equiv75 \\pmod{125}. \\tag{5}\n\\]\n\nThus\n\n\\[\np_{2025}+q_{2025}\\equiv48+75=123\\pmod{125}. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Combination (Chinese Remainder)\n\nFrom (3) we have \\(p_{2025}+q_{2025}\\equiv0\\pmod8\\);   \nfrom (6) we have \\(p_{2025}+q_{2025}\\equiv123\\pmod{125}\\).\n\nLet \\(S=p_{2025}+q_{2025}\\).  \nWrite \\(S=8u\\); then \\(8u\\equiv123\\pmod{125}\\).\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),\n\n\\[\nu\\equiv47\\cdot123\\equiv31\\pmod{125},\n\\qquad\nS=8u\\equiv8\\cdot31=248\\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n### 6.  Answer\n\nThe required remainder is  \n\n\\[\n\\boxed{248}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step\u202f1.  Greedy representation**\n\nFor a value \\(N\\) write  \n\n\\[\nN = 25q + r ,\\qquad 0\\le r<25 .\n\\]\n\nThe greedy algorithm first uses \\(q\\) quarters, then as many dimes as possible from the remainder \\(r\\):\n\\[\nr = 10d + e ,\\qquad 0\\le e<10 .\n\\]\nHence the greedy collection has  \n\n\\[\n\\text{coins}_{\\text{greedy}} = q+d+e .\n\\tag{1}\n\\]\n\n**Step\u202f2.  When can we do better?**\n\nA collection using \\(a\\) quarters and \\(b\\) dimes (the pennies are forced) has  \n\n\\[\n25a+10b\\le N ,\\qquad \\text{pennies}=N-25a-10b .\n\\]\n\nIts total number of coins is  \n\n\\[\na+b+(N-25a-10b)=N-(24a+9b).\n\\]\n\nBecause \\(N\\) is fixed, the collection is optimal iff the quantity  \n\n\\[\nW=24a+9b\n\\tag{2}\n\\]\n\nis as large as possible under the constraint \\(25a+10b\\le N\\).  \n\n**Step\u202f3.  Compare the greedy choice with one fewer quarter**\n\nThe greedy choice uses \\(a=q\\) and \\(b=d\\).  \nConsider reducing the number of quarters by one: take \\(a'=q-1\\).  \nThe value that must now be made with dimes and pennies is \\(25+r\\); the maximal possible number\nof dimes is\n\n\\[\nb'=\\Big\\lfloor\\frac{25+r}{10}\\Big\\rfloor .\n\\]\n\nWrite \\(r=10d+e\\;(0\\le e\\le 9)\\). Then  \n\n\\[\n\\frac{25+r}{10}=2+d+\\frac{e+5}{10},\n\\qquad\nb'=d+2+f,\n\\]\nwhere  \n\n\\[\nf=\\Big\\lfloor\\frac{e+5}{10}\\Big\\rfloor=\n\\begin{cases}\n0,&e\\le4,\\\\[2pt]\n1,&e\\ge5 .\n\\end{cases}\n\\]\n\nThe weight (2) for the greedy choice is  \n\n\\[\nW_{\\text{gr}}=24q+9d .\n\\]\n\nFor the alternative with one fewer quarter we have  \n\n\\[\nW_{\\text{alt}}=24(q-1)+9(d+2+f)=W_{\\text{gr}}-24+18+9f\n      =W_{\\text{gr}}+( -6+9f).\n\\]\n\nThus  \n\n\\[\nW_{\\text{alt}}-W_{\\text{gr}}=\n\\begin{cases}\n-6, & e\\le 4,\\\\[2pt]\n+3, & e\\ge 5 .\n\\end{cases}\n\\]\n\nIf \\(e\\ge5\\) the alternative has **larger** weight, i.e. it uses **fewer** coins\n(three fewer, because the weight increases by 3).  \nIf \\(e\\le4\\) the alternative is worse.\n\nConsequently the greedy algorithm is **not optimal exactly when**\n\\[\ne = r \\bmod 10 \\ge 5 .\n\\tag{3}\n\\]\n\n**Step\u202f4.  Which remainders cause failure?**\n\nSince \\(r\\) ranges from \\(0\\) to \\(24\\), condition (3) means  \n\n\\[\nr\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\tag{4}\n\\]\n\nFor \\(N<25\\) we have \\(q=0\\); only 1\u2011cent and 10\u2011cent coins are usable, and the greedy\nchoice (as many dimes as possible) is obviously optimal.  Hence failures occur only for\n\\(N\\ge25\\) with remainder (4) upon division by \\(25\\).\n\n**Step\u202f5.  Counting the failures between 1 and\u202f1000**\n\nThe numbers \\(25\\le N\\le 1000\\) form 39 complete blocks of 25 consecutive integers\n(\\(25\\)\u2013\\(999\\)) and the single extra number \\(1000\\).\n\n- In each full block every residue modulo \\(25\\) appears once,\n  so each block contains exactly \\(10\\) failures (the residues in (4)).\n- Hence failures in the 39 blocks: \\(39\\times10=390\\).\n\nThe leftover number \\(1000\\) has residue \\(0\\) (not a failure).\n\nThus the total number of failures is \\(390\\).\n\n**Step\u202f6.  Successes**\n\nOut of the \\(1000\\) possible values of \\(N\\),\n\n\\[\n\\text{successful }N = 1000 - 390 = 610 .\n\\]\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For  \n\n\\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr)\n\\]\n\nwe need the solutions of  \n\n\\[\n\\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\\qquad(0<x<2\\pi).\n\\]\n\n---\n\n### 1.  Zeros of \\(f\\)\n\n\\[\n\\sin(A)=0\\iff A=m\\pi,\\;m\\in\\mathbb Z .\n\\]\n\nHence  \n\n\\[\n7\\pi\\sin(5x)=m\\pi\\Longrightarrow \\sin(5x)=\\frac{m}{7}.\n\\]\n\nBecause \\(\\sin(5x)\\in[-1,1]\\), the integer \\(m\\) must satisfy  \n\n\\[\n-7\\le m\\le 7 .\n\\]\n\nLet \\(k=m\\). For each integer \\(k\\) with \\(-7\\le k\\le 7\\) we solve  \n\n\\[\n\\sin(5x)=\\frac{k}{7}.\n\\]\n\nPut \\(\\theta =5x\\). Then \\(\\theta\\in(0,10\\pi)\\) and we need  \n\n\\[\n\\sin\\theta = \\frac{k}{7}.\n\\]\n\n* **\\(k=\\pm7\\)** (\\(\\sin\\theta=\\pm1\\)).  \n  In each \\(2\\pi\\)-period there is exactly one solution.  \n  Over the interval \\((0,10\\pi)\\) (5 periods) we obtain \\(5\\) solutions for \\(k=7\\) and\n  \\(5\\) solutions for \\(k=-7\\).\n\n* **\\(k=0\\)** (\\(\\sin\\theta=0\\)).  \n  Solutions are \\(\\theta=n\\pi\\).  \n  With \\(0<\\theta<10\\pi\\) we have \\(n=1,2,\\dots ,9\\): \\(9\\) solutions.\n\n* **\\(k=\\pm1,\\pm2,\\dots ,\\pm6\\)** (\\(|k/7|<1\\) and \\(\\neq0\\)).  \n  In each period there are two distinct solutions, so over \\(5\\) periods we get\n  \\(2\\cdot5=10\\) solutions for each such \\(k\\).\n\nThere are \\(12\\) values of \\(k\\) with \\(|k|\\le6\\) and \\(k\\neq0\\).\n\nHence the total number of zeros is  \n\n\\[\nn = 5+5+9+12\\cdot10 = 139 .\n\\]\n\n---\n\n### 2.  Tangent points\n\nDifferentiate:\n\n\\[\nf'(x)=\\cos\\!\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot7\\pi\\cdot5\\cos(5x)\n      =35\\pi\\cos(5x)\\cos\\!\\bigl(7\\pi\\sin(5x)\\bigr).\n\\]\n\nAt a zero of \\(f\\) we have \\(\\sin(5x)=k/7\\), so  \n\n\\[\n\\cos\\!\\bigl(7\\pi\\sin(5x)\\bigr)=\\cos(k\\pi)=(-1)^k\\neq0 .\n\\]\n\nThus \\(f'(x)=0\\) exactly when \\(\\cos(5x)=0\\), i.e. when \\(\\sin(5x)=\\pm1\\).\nThose correspond precisely to the cases \\(k=\\pm7\\).\n\nWe already counted \\(5\\) solutions for \\(k=7\\) and \\(5\\) for \\(k=-7\\); all of them are\ntangency points. Hence  \n\n\\[\nt = 5+5 = 10 .\n\\]\n\n---\n\n### 3.  Required sum\n\n\\[\nn+t = 139+10 = 149 .\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Label the vertices of the regular \\(24\\)-gon by  \n\n\\[\n0,1,2,\\ldots ,23\\qquad(\\text{mod }24).\n\\]\n\nIf a segment connects vertices \\(i\\) and \\(j\\) then the chord length is determined by the\nshorter distance  \n\n\\[\nk=\\min\\{|i-j|,\\;24-|i-j|\\},\\qquad 1\\le k\\le 12 .\n\\]\n\nAll 12 drawn segments must have the same length, so every segment must join two vertices that\nare exactly \\(k\\) steps apart for one fixed \\(k\\in\\{1,2,\\ldots ,12\\}\\).\n\n---------------------------------------------------------------------\n\n### 1.  The graph for a fixed \\(k\\)\n\nFor a given \\(k\\) consider the graph  \n\n\\[\nG_k=\\{\\,\\{i,i+k\\}:i=0,1,\\ldots ,23\\}\\ .\n\\]\n\nEach vertex has degree \\(2\\) (edges to \\(i+k\\) and to \\(i-k\\)), so \\(G_k\\) is a disjoint union\nof cycles.  \n\nLet  \n\n\\[\ng=\\gcd(24,k).\n\\]\n\nThen \\(G_k\\) consists of \\(g\\) cycles, each of length  \n\n\\[\nL=\\frac{24}{g}.\n\\]\n\n---------------------------------------------------------------------\n\n### 2.  Perfect matchings of \\(G_k\\)\n\nA required drawing is exactly a perfect matching (1\u2011factor) of \\(G_k\\).\n\n* If \\(L\\) is odd, a perfect matching is impossible.  \n  This occurs only for \\(k=8\\) (\\(g=8,\\;L=3\\)).\n\n* If \\(L=2\\) (the case \\(k=12\\)), each component is a single edge, so the matching is\nforced \u2013 exactly **one** way.\n\n* If \\(L\\) is even and \\(\\,L\\ge4\\), each even cycle has exactly two perfect matchings\n(alternating edges).  \n  Hence for such a \\(k\\) the number of matchings is  \n\n  \\[\n  2^{\\,\\text{number of cycles}}=2^{g}.\n  \\]\n\n---------------------------------------------------------------------\n\n### 3.  Count for each possible \\(k\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nk & g=\\gcd(24,k) & L=24/g & \\text{matchings }N(k)\\\\ \\hline\n1 & 1 & 24 & 2\\\\\n2 & 2 & 12 & 4\\\\\n3 & 3 & 8  & 8\\\\\n4 & 4 & 6  & 16\\\\\n5 & 1 & 24 & 2\\\\\n6 & 6 & 4  & 64\\\\\n7 & 1 & 24 & 2\\\\\n8 & 8 & 3  & 0\\\\\n9 & 3 & 8  & 8\\\\\n10& 2 & 12 & 4\\\\\n11& 1 & 24 & 2\\\\\n12&12 & 2  & 1\n\\end{array}\n\\]\n\n---------------------------------------------------------------------\n\n### 4.  Total number of drawings\n\n\\[\n\\begin{aligned}\n\\sum_{k=1}^{12} N(k)&=\n2+4+8+16+2+64+2+0+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n---------------------------------------------------------------------\n\nThus there are  \n\n\\[\n\\boxed{113}\n\\]\n\ndifferent ways to draw 12 equal\u2011length segments so that every vertex of the regular 24\u2011gon\nis an endpoint of exactly one segment.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\na_i=|A_iA_1|\\qquad (i=2,\\dots ,11),\\qquad b_i=|A_iA_{i+1}|\\;(i=2,\\dots ,10)\n\\]\n\nand let \\(\\theta =\\angle A_iA_1A_{i+1}\\) for \\(2\\le i\\le10\\).\n\n--------------------------------------------------------------------\n### 1.  The radii from \\(A_1\\)\n\nFor each triangle \\(A_iA_1A_{i+1}\\)\n\n\\[\n\\text{area}=1,\\qquad \\cos\\theta=\\frac{12}{13}.\n\\]\n\nHence  \n\n\\[\n\\sin\\theta =\\sqrt{1-\\cos^2\\theta}\n          =\\sqrt{1-\\frac{144}{169}}\n          =\\frac{5}{13}.\n\\]\n\nThe area formula gives  \n\n\\[\n1=\\frac12 a_i a_{i+1}\\sin\\theta\n   \\Longrightarrow a_i a_{i+1}= \\frac{2}{\\sin\\theta}\n   =\\frac{2}{5/13}= \\frac{26}{5}\\qquad (1)\n\\]\n\nfor every \\(i=2,\\dots ,10\\).\n\nThus every adjacent pair of radii satisfies the same product.\nConsequently the lengths alternate:\n\n\\[\na_2=a_4=a_6=a_8=a_{10}=x,\\qquad \na_3=a_5=a_7=a_9=a_{11}=y,\n\\]\n\nwith  \n\n\\[\nxy=\\frac{26}{5}. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Lengths of the polygon sides not incident with \\(A_1\\)\n\nIn \\(\\triangle A_iA_1A_{i+1}\\) the side \\(b_i=|A_iA_{i+1}|\\) satisfies the law of cosines:\n\n\\[\nb_i^2 = a_i^2 + a_{i+1}^2 -2a_i a_{i+1}\\cos\\theta .\n\\]\n\nUsing \\(\\cos\\theta=\\frac{12}{13}\\) and (1),\n\n\\[\nb_i^2 = a_i^2 + a_{i+1}^2\n        - 2\\!\\left(\\frac{26}{5}\\right)\\!\\frac{12}{13}\n      = a_i^2 + a_{i+1}^2 - \\frac{624}{65}\n      = a_i^2 + a_{i+1}^2 - 9.6 .\n\\]\n\nBecause each adjacent pair consists of one \\(x\\) and one \\(y\\), the quantity\n\\(a_i^2+a_{i+1}^2\\) is the same for all \\(i\\).  Hence all \\(b_i\\) are equal; denote this common length by \\(b\\).\n\nLet  \n\n\\[\nS=x+y .\n\\]\n\nThen \\(x^2+y^2=S^2-2xy\\).  Using (2) we obtain\n\n\\[\nb^{2}=S^{2}-2xy-2xy\\cos\\theta\n      =S^{2}-2xy(1+\\cos\\theta).\n\\]\n\nSince \\(\\cos\\theta=\\frac{12}{13}\\),  \n\n\\[\n1+\\cos\\theta = \\frac{25}{13},\\qquad\n2xy(1+\\cos\\theta)=2\\!\\left(\\frac{26}{5}\\right)\\!\\frac{25}{13}=20.\n\\]\n\nThus  \n\n\\[\nb^{2}=S^{2}-20,\\qquad b=\\sqrt{S^{2}-20}. \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Using the perimeter\n\nThe perimeter of the 11\u2011gon is\n\n\\[\n|A_1A_2|+|A_1A_{11}|+\\sum_{i=2}^{10}|A_iA_{i+1}|\n= x + y + 9b = S + 9\\sqrt{S^{2}-20}=20.\n\\]\n\nLet \\(t=\\sqrt{S^{2}-20}\\;(t\\ge0)\\).  Then  \n\n\\[\n\\sqrt{t^{2}+20}+9t=20\\quad\\Longrightarrow\\quad \n\\sqrt{t^{2}+20}=20-9t.\n\\]\n\nSquaring yields  \n\n\\[\nt^{2}+20 = (20-9t)^{2}=400-360t+81t^{2},\n\\]\n\\[\n80t^{2}-360t+380=0\\;\\Longrightarrow\\;\n4t^{2}-18t+19=0.\n\\]\n\nThe discriminant is \\(D=18^{2}-4\\cdot4\\cdot19=324-304=20\\), so\n\n\\[\nt=\\frac{18\\pm\\sqrt{20}}{8}\n   =\\frac{9\\pm\\sqrt5}{4}.\n\\]\n\nSince \\(20-9t\\ge0\\), we take the minus sign:\n\n\\[\nt=\\frac{9-\\sqrt5}{4}.\n\\]\n\nNow \\(S = 20-9t\\):\n\n\\[\nS = 20 - 9\\!\\left(\\frac{9-\\sqrt5}{4}\\right)\n   = \\frac{80-(81-9\\sqrt5)}{4}\n   = \\frac{9\\sqrt5-1}{4}.\n\\]\n\nThus  \n\n\\[\n|A_1A_2|+|A_1A_{11}| = S = \\frac{9\\sqrt5-1}{4}.\n\\]\n\n--------------------------------------------------------------------\n### 4.  Putting it into the required form\n\n\\[\n\\frac{9\\sqrt5-1}{4}=\\frac{m\\sqrt{n}-p}{q},\n\\qquad m=9,\\; n=5,\\; p=1,\\; q=4.\n\\]\n\nThese satisfy the given conditions ( \\(n\\) square\u2011free, no prime divides all of \\(m,p,q\\) ).\n\nFinally  \n\n\\[\nm+n+p+q = 9+5+1+4 = 19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nLet the 16 chairs be numbered \\(1,2,\\dots ,16\\).  \nA selection of 8 chairs corresponds to a binary string of length \\(16\\) with exactly eight \\(1\\)\u2019s (occupied chairs) and eight \\(0\\)\u2019s (empty chairs).\n\nA person \u201csits next to two other people\u2019\u2019 exactly when a chair is occupied **and** its two neighbours are also occupied.  \nHence the forbidden pattern in the binary string is the block \\(111\\).  \n\nThus we must count the binary strings of length \\(16\\) containing exactly eight \\(1\\)\u2019s and **no** occurrence of \\(111\\).\n\n--------------------------------------------------------------------\n\n### 1.  Decomposing the 1\u2011blocks\n\nBecause a block of three or more consecutive \\(1\\)\u2019s is not allowed, every maximal block of 1\u2019s is of length **1** or **2**.\n\nSuppose the string contains  \n\n* \\(a\\) blocks of length \\(1\\) and  \n* \\(c\\) blocks of length \\(2\\).\n\nThen  \n\n\\[\na+2c = 8\\qquad(\\text{total number of }1\\text{'s}),\n\\]\n\\[\nb = a+c = 8-c\\qquad(\\text{total number of blocks}).\n\\]\n\n--------------------------------------------------------------------\n\n### 2.  Placing the blocks among the 0\u2019s\n\nBetween any two consecutive blocks we need at least one \\(0\\).  \nWith \\(b\\) blocks we need at least \\(b-1\\) separating zeros.\n\nThe total number of zeros is \\(16-8 = 8\\).  \nAfter reserving the mandatory \\(b-1\\) zeros, there remain  \n\n\\[\n8-(b-1)=9-b\n\\]\n\nextra zeros that may be placed arbitrarily in the \\(b+1\\) gaps\n(before the first block, between blocks, after the last block).\n\nThe number of ways to distribute these extra zeros is a stars\u2011and\u2011bars count:\n\n\\[\n\\binom{(9-b)+(b+1)-1}{b}= \\binom{9}{b}.\n\\]\n\n--------------------------------------------------------------------\n\n### 3.  Ordering the blocks\n\nAmong the \\(b\\) blocks, we must choose which \\(c\\) of them are the length\u20112 blocks.\nThat can be done in  \n\n\\[\n\\binom{b}{c}=\\binom{8-c}{c}\n\\]\n\nways.\n\n--------------------------------------------------------------------\n\n### 4.  Summation\n\nSumming over all feasible values of \\(c\\) (from \\(0\\) to \\(\\lfloor 8/2\\rfloor =4\\)) we obtain\n\n\\[\n\\begin{aligned}\nN &=\\sum_{c=0}^{4}\\binom{8-c}{c}\\binom{9}{\\,8-c\\,} \\\\[2mm]\n  &=\\binom{8}{0}\\binom{9}{8}\n    +\\binom{7}{1}\\binom{9}{7}\n    +\\binom{6}{2}\\binom{9}{6}\n    +\\binom{5}{3}\\binom{9}{5}\n    +\\binom{4}{4}\\binom{9}{4}\\\\[2mm]\n  &=1\\cdot9\\;+\\;7\\cdot36\\;+\\;15\\cdot84\\;+\\;10\\cdot126\\;+\\;1\\cdot126\\\\[2mm]\n  &=9+252+1260+1260+126\\\\[2mm]\n  &=2907.\n\\end{aligned}\n\\]\n\nThus there are \\(N=2907\\) possible selections of 8 chairs satisfying the condition.\n\n--------------------------------------------------------------------\n\n### 5.  Required remainder\n\n\\[\nN \\bmod 1000 = 2907 \\bmod 1000 = 907.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      In base \\(b\\) the numbers  \n\n\\[\n17_b = 1\\cdot b + 7 = b+7 ,\\qquad  \n97_b = 9\\cdot b + 7 .\n\\]\n\nWe need bases \\(b>9\\) (so that the digits \\(7\\) and \\(9\\) are allowed) such that  \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\n---\n\n### Reduce the divisibility condition\n\nIf \\(b+7\\) divides \\(9b+7\\), then it also divides any integer linear combination of these two numbers.  \nConsider  \n\n\\[\n9(b+7) - (9b+7) = 9b+63 - 9b - 7 = 56 .\n\\]\n\nHence  \n\n\\[\nb+7 \\mid 56 .\n\\]\n\nConversely, if \\(b+7\\) divides \\(56\\) then\n\n\\[\n9b+7 = 9(b+7) - 56\n\\]\n\nis also a multiple of \\(b+7\\). Thus the condition is equivalent to  \n\n\\[\nb+7 \\text{ is a positive divisor of } 56 .\n\\]\n\n---\n\n### Find admissible divisors\n\nThe positive divisors of \\(56\\) are  \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nSince \\(b>9\\), we have \\(b+7>16\\). The only divisors of \\(56\\) exceeding \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7 &= 28 &\\implies&\\; b = 21,\\\\[2mm]\nb+7 &= 56 &\\implies&\\; b = 49 .\n\\end{aligned}\n\\]\n\nBoth satisfy \\(b>9\\) and the original divisibility:\n\\[\n\\begin{aligned}\nb=21:&\\quad 17_{21}=28,\\; 97_{21}=196=28\\cdot7;\\\\\nb=49:&\\quad 17_{49}=56,\\; 97_{49}=448=56\\cdot8.\n\\end{aligned}\n\\]\n\nNo other bases work.\n\n---\n\n### Sum of all such bases\n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c),\\qquad b^2+c^2=BC^2=38^2=1444 .\n\\]\n\nPut  \n\n\\[\nK=(x_k ,y_k),\\qquad L=(x_l ,y_l).\n\\]\n\nThe given distances give  \n\n\\[\n\\begin{aligned}\n&AK=AL=BK=CL=KL=14,\\\\\n&x_k^2+y_k^2=196,\\quad (x_k-b)^2+y_k^2=196,\\\\[2mm]\n&x_l^2+y_l^2=196,\\quad x_l^2+(y_l-c)^2=196,\\\\[2mm]\n&(x_k-x_l)^2+(y_k-y_l)^2=196 .\n\\end{aligned}\n\\]\n\nFrom the first two equations  \n\n\\[\nb=2x_k,\\qquad y_k=\\sqrt{196-x_k^2}.\n\\]\n\nFrom the next two  \n\n\\[\nc=2y_l,\\qquad x_l=\\sqrt{196-y_l^2}.\n\\]\n\nThus  \n\n\\[\nK=(b/2,\\;\\sqrt{196-b^{2}/4}),\\qquad \nL=(\\sqrt{196-c^{2}/4},\\;c/2).\n\\]\n\nSince \\(AK=AL=KL=14\\), the triangle \\(AKL\\) is equilateral; hence\nthe angle \\(\\angle KAL=60^\\circ\\).  Write\n\n\\[\nK=14(\\cos\\alpha,\\sin\\alpha),\\qquad  \nL=14(\\cos(\\alpha+60^\\circ),\\sin(\\alpha+60^\\circ))\n\\]\n\nfor some \\(\\alpha\\) with \\(0^\\circ<\\alpha<30^\\circ\\).\nComparing with the expressions for \\(K\\) and \\(L\\) gives  \n\n\\[\nb=28\\cos\\alpha,\\qquad c=28\\sin(\\alpha+60^\\circ).\n\\]\n\nThe hypotenuse length yields\n\n\\[\nb^{2}+c^{2}=28^{2}\\bigl(\\cos^{2}\\alpha+\\sin^{2}(\\alpha+60^\\circ)\\bigr)=38^{2}=1444,\n\\]\n\nso  \n\n\\[\n\\cos^{2}\\alpha+\\sin^{2}(\\alpha+60^\\circ)=\\frac{361}{196}.\n\\tag{1}\n\\]\n\nFrom (1) we obtain, after using \\(\\sin^{2}\\theta= \\tfrac12(1-\\cos2\\theta)\\),\n\n\\[\n\\sqrt3\\sin(2\\alpha+60^\\circ)=\\frac{165}{98},\n\\qquad\\Longrightarrow\\qquad\n\\sin(2\\alpha+60^\\circ)=\\frac{165}{98\\sqrt3}.\n\\tag{2}\n\\]\n\nNow compute the required area.\n\n*Area of \\(\\triangle ABC\\)*  \n\n\\[\n[ABC]=\\tfrac12bc=\\tfrac12\\,(28\\cos\\alpha)(28\\sin(\\alpha+60^\\circ))\n      =392\\cos\\alpha\\sin(\\alpha+60^\\circ).\n\\tag{3}\n\\]\n\n*Area of \\(\\triangle AKB\\)*  \n\nThe altitude from \\(K\\) to \\(AB\\) is \\(y_k=14\\sin\\alpha\\), and \\(AB=28\\cos\\alpha\\); thus  \n\n\\[\n[AKB]=\\tfrac12\\,(28\\cos\\alpha)(14\\sin\\alpha)=98\\sin2\\alpha .\n\\tag{4}\n\\]\n\n*Area of \\(\\triangle ALC\\)*  \n\nAnalogously  \n\n\\[\n[ALC]=\\tfrac12\\,(28\\sin(\\alpha+60^\\circ))(14\\cos(\\alpha+60^\\circ))\n      =98\\sin\\bigl(2\\alpha+120^\\circ\\bigr).\n\\tag{5}\n\\]\n\n*Area of the equilateral \\(\\triangle AKL\\)*  \n\n\\[\n[AKL]=\\frac{\\sqrt3}{4}\\cdot14^{2}=49\\sqrt3.\n\\tag{6}\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\n[BKLC]&=[ABC]-[AKB]-[ALC]-[AKL] \\\\[2mm]\n&=392\\cos\\alpha\\sin(\\alpha+60^\\circ)\n   -98\\sin2\\alpha-98\\sin(2\\alpha+120^\\circ)-49\\sqrt3 .\n\\end{aligned}\n\\]\n\nUsing \\(\\sin(\\alpha+60^\\circ)=\\tfrac12\\sin\\alpha+\\tfrac{\\sqrt3}{2}\\cos\\alpha\\) and\nsimplifying, the expression reduces to  \n\n\\[\n[BKLC]=49\\Bigl(\\sin2\\alpha+\\sqrt3\\bigl(1+\\cos2\\alpha\\bigr)\\Bigr).\n\\tag{7}\n\\]\n\nFrom (2),\n\n\\[\n\\sin2\\alpha+\\sqrt3\\cos2\\alpha\n    =2\\sin(2\\alpha+60^\\circ)=\\frac{165}{49\\sqrt3}.\n\\]\n\nInsert this into (7):\n\n\\[\n\\begin{aligned}\n[BKLC]&=49\\Bigl(\\frac{165}{49\\sqrt3}+\\sqrt3\\Bigr)\n       =\\frac{165}{\\sqrt3}+49\\sqrt3\\\\[2mm]\n      &=\\frac{165\\sqrt3}{3}+49\\sqrt3\n       =55\\sqrt3+49\\sqrt3=104\\sqrt3.\n\\end{aligned}\n\\]\n\nThus the area of quadrilateral \\(BKLC\\) equals \\(104\\sqrt3\\).\n\n\\[\n\\boxed{104}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(A,B,C\\) be the vertices of the acute triangle with  \n\\(\\angle A=84^{\\circ},\\ \\angle B=60^{\\circ},\\ \\angle C=36^{\\circ}\\);\n* \\(D,E,F\\) the midpoints of \\(BC,CA,AB\\);\n* \\(G,H,J\\) the second intersections of the nine\u2011point circle with\n\\(BC,CA,AB\\) respectively.\n\nThe circumcircle of \\(\\triangle DEF\\) is the nine\u2011point circle of \\(\\triangle ABC\\).\nHence \\(G,H,J\\) are the three feet of the altitudes of \\(\\triangle ABC\\);  \nthey form the orthic triangle \\(G\\!H\\!J\\).\n\n--------------------------------------------------------------------\n### 1.  Arc \\(\\widehat{DE}\\)\n\nOn the nine\u2011point circle the vectors from its centre \\(N\\) to the\nmidpoints are  \n\n\\[\nND=-\\frac{\\mathbf a}{2},\\qquad NE=-\\frac{\\mathbf b}{2},\n\\]\n\nwhere \\(\\mathbf a,\\mathbf b,\\mathbf c\\) are the unit vectors of the\ncircumcircle of \\(\\triangle ABC\\).  Consequently\n\n\\[\n\\widehat{DE}= \\angle(-\\mathbf a,-\\mathbf b)=\\angle(\\mathbf a,\\mathbf b)\n          =2\\angle ACB=2C = 2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Arc \\(\\widehat{HJ}\\)\n\n\\(H\\) and \\(J\\) are the feet of the altitudes from \\(B\\) and \\(C\\);\nthey are vertices of the orthic triangle \\(G\\!H\\!J\\).\nFor an acute triangle the angles of its orthic triangle are  \n\n\\[\n\\angle G =180^{\\circ}-2A,\\qquad \n\\angle H =180^{\\circ}-2B,\\qquad \n\\angle J =180^{\\circ}-2C .\n\\]\n\nWith \\(A=84^{\\circ},B=60^{\\circ},C=36^{\\circ}\\),\n\n\\[\n\\angle G =12^{\\circ},\\quad\n\\angle H =60^{\\circ},\\quad\n\\angle J =108^{\\circ}.\n\\]\n\nSince the nine\u2011point circle is the circumcircle of\n\\(\\triangle G\\!H\\!J\\), the central arc opposite a vertex equals twice the\nopposite interior angle.  Hence\n\n\\[\n\\widehat{HJ}= \\widehat{B'C'} = 2\\angle G\n            =2\\bigl(180^{\\circ}-2A\\bigr)=360^{\\circ}-4A\n            =360^{\\circ}-4\\cdot84^{\\circ}=24^{\\circ}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Arc \\(\\widehat{FG}\\)\n\nThe points \\(D,E,F\\) are the midpoints of the sides; they satisfy  \n\n\\[\n\\angle N D F =\\angle(-\\mathbf a,-\\mathbf c)=120^{\\circ},\n\\]\n\nso the minor arc \\(\\widehat{DF}\\) of the nine\u2011point circle measures\n\\(120^{\\circ}\\).  The arc \\(\\widehat{DF}\\) is the sum of the two\nconsecutive arcs \\(\\widehat{DG}\\) and \\(\\widehat{GF}\\).\n\nThe central arc \\(\\widehat{DG}\\) equals the angle between the\nvectors \\(ND\\) (direction \\(-\\mathbf a\\)) and \\(NG\\) (direction of the\nfoot from \\(A\\) onto \\(BC\\)).\nA short angle chase using the orthic triangle gives\n\n\\[\n\\widehat{DG}=48^{\\circ}.\n\\]\n\nTherefore\n\n\\[\n\\widehat{FG}= \\widehat{DF}-\\widehat{DG}=120^{\\circ}-48^{\\circ}=72^{\\circ}.\n\\tag{3}\n\\]\n\n(One can also obtain \\(\\widehat{FG}=72^{\\circ}\\) directly from the fact\nthat the chord \\(FJ\\) subtends the angle \\(60^{\\circ}\\) at the centre,\nso the complementary chord \\(FG\\) subtends \\(72^{\\circ}\\).)\n\n--------------------------------------------------------------------\n### 4.  Required sum\n\nFrom (1)\u2013(3),\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&= 72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ}\\\\[2mm]\n&= 72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\\n&= 336^{\\circ}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The players are distinct, so an assignment of flavors is a function from the nine players to the three flavors.  \nLet  \n\n\\[\nc=\\#\\text{chocolate},\\qquad v=\\#\\text{vanilla},\\qquad s=\\#\\text{strawberry}.\n\\]\n\nWe need  \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### 1.  Find all possible triples \\((c,v,s)\\).\n\nWrite \\(s=a\\), \\(v=a+d\\), \\(c=a+d+e\\) with \\(a,d,e\\ge1\\).  \nThen  \n\n\\[\na+(a+d)+(a+d+e)=9\\Longrightarrow 3a+2d+e=9 .\n\\]\n\nSearching integer solutions with \\(a,d,e\\ge1\\) gives only three possibilities:\n\n* \\(a=1,d=1,e=4\\)\u2003\u2192 \\((c,v,s)=(6,2,1)\\)\n* \\(a=1,d=2,e=2\\)\u2003\u2192 \\((c,v,s)=(5,3,1)\\)\n* \\(a=2,d=1,e=1\\)\u2003\u2192 \\((c,v,s)=(4,3,2)\\)\n\nNo other triples satisfy \\(c>v>s\\) and sum to 9.\n\n---\n\n### 2.  Count assignments for each triple.\n\nFor a fixed triple \\((c,v,s)\\) the number of assignments equals the multinomial coefficient  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1)&:\\ \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1)&:\\ \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2)&:\\ \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3.  Total number of assignments.\n\n\\[\nN=252+504+1260=2016.\n\\]\n\n---\n\n### 4.  Remainder modulo \\(1000\\).\n\n\\[\n2016\\equiv 16 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      First factor the quadratic form.\n\n\\[\n12x^{2}-xy-6y^{2}= (4x-3y)(3x+2y)\n\\]\n\nHence  \n\n\\[\n(4x-3y)(3x+2y)=0\\Longrightarrow \n\\begin{cases}\n4x-3y=0\\\\[2mm]\n\\text{or}\\\\[2mm]\n3x+2y=0\n\\end{cases}\n\\]\n\n---\n\n### 1.  Solutions of \\(4x-3y=0\\)\n\n\\(4x=3y\\Rightarrow y=\\dfrac{4}{3}x\\).  \nSince \\(x,y\\) are integers, \\(x\\) must be a multiple of \\(3\\): set \\(x=3k\\), then  \n\n\\[\ny=4k,\\qquad k\\in\\mathbb Z .\n\\]\n\nBoth coordinates must satisfy \\(-100\\le x,y\\le100\\):\n\n\\[\n|3k|\\le100,\\qquad|4k|\\le100\\Longrightarrow |k|\\le \\Big\\lfloor\\frac{100}{4}\\Big\\rfloor =25 .\n\\]\n\nThus \\(k=-25,-24,\\dots ,25\\):  \\(51\\) integer pairs.\n\n---\n\n### 2.  Solutions of \\(3x+2y=0\\)\n\n\\(3x=-2y\\Rightarrow y=-\\dfrac{3}{2}x\\).  \nFor integers we need \\(x\\) even: write \\(x=2m\\), then  \n\n\\[\ny=-3m,\\qquad m\\in\\mathbb Z .\n\\]\n\nAgain \\(-100\\le x,y\\le100\\) gives  \n\n\\[\n|2m|\\le100,\\qquad|3m|\\le100\\Longrightarrow |m|\\le\\Big\\lfloor\\frac{100}{3}\\Big\\rfloor =33 .\n\\]\n\nThus \\(m=-33,-32,\\dots ,33\\):  \\(67\\) integer pairs.\n\n---\n\n### 3.  Remove double counting\n\nThe two families intersect only at \\((0,0)\\) (when \\(k=m=0\\)).  \nHence the total number of distinct ordered pairs is  \n\n\\[\n51+67-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The function  \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}\\qquad (x>0)\n\\]\n\nhas zeros at \\(x=18,\\;72,\\;98,\\;k\\) and  \n\\(\\displaystyle \\lim_{x\\to0^+}f(x)=\\lim_{x\\to\\infty}f(x)=+\\infty\\).\nHence \\(f\\) is positive near the ends and negative on each of the two\nintervals bounded by the smallest two zeros and by the largest two zeros.\nConsequently \\(f\\) has exactly two local minima (one in each negative\ninterval).\n\nLet the common minimal value be \\(m<0\\).  At a minimum the graph of\n\\(y=f(x)\\) is tangent to the horizontal line \\(y=m\\); therefore the\nequation  \n\n\\[\nf(x)=m\\quad\\Longleftrightarrow\\quad (x-18)(x-72)(x-98)(x-k)-mx=0\n\\]\n\nmust have a **double root** at each minimum.  Thus the quartic polynomial\nmust be a perfect square of a quadratic:\n\n\\[\n(x-18)(x-72)(x-98)(x-k)-mx=(x^{2}-Sx+P)^{2},\n\\]\nwhere \\(S,P,m\\) are constants.\n\nExpanding and equating coefficients with  \n\n\\[\nN(x)-mx=x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k+m)x+127008k\n\\]\n\ngives  \n\n\\[\n\\begin{cases}\nS=\\dfrac{188+k}{2},\\\\[4pt]\nS^{2}+2P=10116+188k,\\\\[4pt]\nm=2SP-(127008+10116k),\\\\[4pt]\nP^{2}=127008\\,k .\n\\end{cases}\n\\]\n\nFrom \\(P^{2}=127008k\\) set \\(t=\\sqrt{2k}>0\\); then  \n\n\\[\nP=252t,\\qquad k=\\dfrac{t^{2}}{2},\n\\quad S=\\frac{188+k}{2}=94+\\frac{t^{2}}{4}.\n\\]\n\nSubstituting these into \\(S^{2}+2P=10116+188k\\) yields an equation in\n\\(t\\):\n\n\\[\n\\frac{(188+k)^{2}}{4}+504\\sqrt{2k}=10116+188k\n\\Longrightarrow\nt^{4}-752t^{2}+8064t-20480=0 .\n\\]\n\nFactoring,\n\n\\[\nt^{4}-752t^{2}+8064t-20480=(t-4)(t-8)(t-20)(t+32)=0 .\n\\]\n\nSince \\(t>0\\), we obtain  \n\n\\[\nt=4,\\;8,\\;20\\quad\\Longrightarrow\\quad \nk=\\frac{t^{2}}{2}=8,\\;32,\\;200 .\n\\]\n\nFor each of these \\(k\\) one computes \\(\\Delta=S^{2}-4P>0\\), so the\nquadratic \\(x^{2}-Sx+P\\) has two distinct real roots.  They lie exactly in\nthe two negative intervals, giving two distinct points where \\(f\\) attains\nthe value \\(m\\).  Moreover \\(m<0\\), while all zeros of \\(f\\) are at\n\\(0\\), so these are the global minima.  \nNo other positive \\(k\\) satisfies the required condition.\n\nHence the three admissible values of \\(k\\) are \\(8,\\;32,\\;200\\), and their\nsum is\n\n\\[\n8+32+200 = 240.\n\\]\n\n\\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For a quadrilateral that has an incircle (a **tangential quadrilateral**)  \n\n\\[\n\\text{area}=r_{\\text{in}}\\cdot\\frac{\\text{perimeter}}2 .\n\\tag{1}\n\\]\n\n---\n\n### 1.  Using the given area\n\nLet the parallel sides be \\(r\\) and \\(s\\) \\((r\\neq s)\\) and the equal legs be \\(\\ell\\).\nThe incircle radius is \\(r_{\\text{in}}=3\\) and the area is \\(72\\).\n\nFrom (1),\n\n\\[\n72=3\\cdot\\frac{r+s+2\\ell}{2}\\Longrightarrow\nr+s+2\\ell=48.\n\\tag{2}\n\\]\n\n---\n\n### 2.  Pitot\u2019s theorem\n\nA tangential quadrilateral satisfies Pitot\u2019s theorem: the sum of opposite sides are equal.  \nThus for our isosceles trapezoid  \n\n\\[\nr+s= \\ell+\\ell =2\\ell \\Longrightarrow \\ell=\\frac{r+s}{2}.\n\\tag{3}\n\\]\n\nSubstituting (3) into (2),\n\n\\[\nr+s+2\\Bigl(\\frac{r+s}{2}\\Bigr)=48\\Longrightarrow 2(r+s)=48\n\\Longrightarrow r+s=24.\n\\tag{4}\n\\]\n\nHence each leg is  \n\n\\[\n\\ell=\\frac{r+s}{2}=12.\n\\]\n\n---\n\n### 3.  Height of the trapezoid\n\nA circle tangent to two parallel lines must have its centre midway between them, so the distance (the height \\(h\\)) between the bases equals twice the radius:\n\n\\[\nh=2\\cdot3=6.\n\\]\n\nThe area of a trapezoid is also  \n\n\\[\n\\text{Area}= \\frac{r+s}{2}\\,h = \\frac{24}{2}\\cdot6 = 72,\n\\]\n\nwhich checks with the given data.\n\n---\n\n### 4.  Relating the legs, height, and bases  \n\nIn an isosceles trapezoid the leg \\(\\ell\\) together with the height \\(h\\) and half the difference of the bases forms a right triangle:\n\n\\[\n\\ell^{2}=h^{2}+\\Bigl(\\frac{s-r}{2}\\Bigr)^{2}.\n\\]\n\nPlugging \\(\\ell=12\\) and \\(h=6\\),\n\n\\[\n12^{2}=6^{2}+\\Bigl(\\frac{s-r}{2}\\Bigr)^{2}\n\\Longrightarrow 144=36+\\frac{(s-r)^{2}}{4}\n\\Longrightarrow (s-r)^{2}=432.\n\\]\n\nThus  \n\n\\[\ns-r= \\sqrt{432}=12\\sqrt3 .\n\\tag{5}\n\\]\n\n---\n\n### 5.  Solving for \\(r\\) and \\(s\\)\n\nFrom (4) and (5):\n\n\\[\n\\begin{cases}\ns+r = 24,\\\\[2pt]\ns-r = 12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\ns = 12+6\\sqrt3,\\;\\; r = 12-6\\sqrt3.\n\\]\n\n---\n\n### 6.  Computing \\(r^{2}+s^{2}\\)\n\n\\[\nr^{2}+s^{2}= (12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2}\n= (252-144\\sqrt3)+(252+144\\sqrt3)=504.\n\\]\n\n(Alternatively, using \\((r+s)^{2}=r^{2}+s^{2}+2rs\\) and \\(rs=36\\) from \\((s+r)^{2}-(s-r)^{2}=4rs\\) also gives \\(r^{2}+s^{2}=504\\).)\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The number must be divisible by \\(22=2\\cdot 11\\).\n\n---\n\n### 1.  Divisibility by \\(2\\)\n\nThe last digit (the 8\u2011th digit) must be even, i.e. one of \\(2,4,6,8\\).\n\n---\n\n### 2.  Divisibility by \\(11\\)\n\nFor an 8\u2011digit number \\(d_1d_2\\ldots d_8\\)\n\n\\[\nd_1-d_2+d_3-d_4+d_5-d_6+d_7-d_8\\equiv0\\pmod{11}.\n\\]\n\nLet  \n\n\\[\nS_{\\text{odd}}=d_1+d_3+d_5+d_7,\\qquad  \nS_{\\text{even}}=d_2+d_4+d_6+d_8 .\n\\]\n\nThen the condition becomes  \n\n\\[\nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nSince the digits \\(1,2,\\dots ,8\\) are used exactly once,  \n\n\\[\nS_{\\text{odd}}+S_{\\text{even}}=1+2+\\cdots +8=36 .\n\\]\n\nHence  \n\n\\[\n2S_{\\text{even}}\\equiv36\\pmod{11}\\Longrightarrow2S_{\\text{even}}\\equiv3\\pmod{11}\n\\]\n\\[\n\\Longrightarrow S_{\\text{even}}\\equiv3\\cdot 6\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe possible values for a sum of four distinct digits from \\(\\{1,\\ldots ,8\\}\\) lie between \\(10\\) and \\(26\\); the only value congruent to \\(7\\pmod{11}\\) in this interval is \\(18\\).  \nThus we must have  \n\n\\[\nS_{\\text{even}}=18\\qquad\\text{and}\\qquad S_{\\text{odd}}=18 .\n\\]\n\n---\n\n### 3.  Choosing the four digits that go to even positions\n\nWe need all 4\u2011element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them:\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are **8** such subsets.  \nEach of them contains exactly two even digits (the evens are \\(2,4,6,8\\)).\n\n---\n\n### 4.  Arranging the digits\n\nFor a fixed subset \\(S\\) (the digits that occupy the even positions 2,4,6,8):\n\n* The last position (position 8) must be even.  \n  Since \\(S\\) has exactly two evens, we have \\(2\\) choices for the digit that goes to position\u202f8.\n* The remaining three digits of \\(S\\) can be placed in positions 2,4,6 in any order: \\(3! = 6\\) ways.\n\nHence the even positions can be filled in \\(2\\cdot6 = 12\\) ways.\n\nThe four digits not in \\(S\\) occupy the odd positions \\(1,3,5,7\\) and may be arranged arbitrarily:\n\\(4! = 24\\) ways.\n\nThus each subset contributes  \n\n\\[\n12 \\times 24 = 288\n\\]\n\ndifferent 8\u2011digit numbers.\n\nWith 8 admissible subsets, the total number of 8\u2011digit numbers divisible by 22 is  \n\n\\[\nN = 8 \\times 288 = 2304.\n\\]\n\n---\n\n### 5.  Required difference\n\n\\[\nN-2025 = 2304-2025 = 279.\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nx_{k+1}=\\frac{x_k+\\dfrac1{x_k}-1}{3}\n      =\\frac{x_k^2-x_k+1}{3x_k}\\qquad (k\\ge 1),\\qquad \nx_1=\\frac{25}{11}.\n\\]\n\n--------------------------------------------------------------------\n### 1.  A convenient change of variable  \n\nPut  \n\n\\[\ny_k=\\frac{x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{1+y_k}{1-y_k}.\n\\]\n\nThen  \n\n\\[\ny_{k+1}= \\frac{x_{k+1}-1}{x_{k+1}+1}\n        =\\frac{3y_k^{2}-1}{2}.\n\\tag{1}\n\\]\n\nIndeed,\n\\[\n\\frac{x_k+1/x_k-1}{3}= \\frac{1+y_k}{1-y_k}\n        \\Longrightarrow\ny_{k+1}= \\frac{3y_k^{2}-1}{2}.\n\\]\n\nFrom \\(x_1=25/11\\) we obtain\n\n\\[\ny_1=\\frac{25/11-1}{25/11+1}= \\frac{14/11}{36/11}= \\frac{7}{18}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Removing the common factor  \n\nWrite \\(y_k =\\dfrac{a_k}{b_k}\\) with \\(\\gcd(a_k,b_k)=1\\).\nFrom (1)\n\n\\[\n\\frac{a_{k+1}}{b_{k+1}}=\\frac{3a_k^{2}-b_k^{2}}{2b_k^{2}} .\n\\]\n\nBecause \\(b_k\\) is always a multiple of \\(3\\), the fraction can be reduced by the\nfactor \\(3\\) and we obtain the **integer** recurrences\n\n\\[\n\\boxed{\\;\n\\begin{aligned}\na_{k+1}&=\\frac{3a_k^{2}-b_k^{2}}{3},\\\\[2mm]\nb_{k+1}&=\\frac{2b_k^{2}}{3},\n\\end{aligned}\\qquad a_1=7,\\;b_1=18.}\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Closed form for \\(b_k\\)\n\nFrom the second line of (2)\n\n\\[\nb_{k+1}=\\frac{2}{3}b_k^{2}, \\qquad b_1=18.\n\\]\n\nInduction gives  \n\n\\[\n\\boxed{\\,b_k=2^{\\,2^{\\,k}-1}\\;3^{\\,2^{\\,k-1}+1}\\,}\\qquad(k\\ge1).   \\tag{3}\n\\]\n\nCheck: \\(b_1=2^{2-1}3^{1+1}=2\\cdot 9=18\\).\n\n--------------------------------------------------------------------\n### 4.  The reduced form of \\(x_k\\)\n\nSince \\(x_k=\\dfrac{1+y_k}{1-y_k}\\) and \\(y_k=a_k/b_k\\),\n\n\\[\nx_k=\\frac{a_k+b_k}{\\,b_k-a_k\\,}.\n\\]\n\nThus the reduced numerator and denominator are  \n\n\\[\nm_k=a_k+b_k,\\qquad n_k=b_k-a_k,\n\\]\n\nand\n\n\\[\nm_k+n_k=2b_k. \\tag{4}\n\\]\n\nConsequently we only need \\(2b_{2025}\\pmod{1000}\\).\n\n--------------------------------------------------------------------\n### 5.  Computing \\(2b_{2025}\\pmod{1000}\\)\n\nFrom (3)\n\n\\[\n2b_{2025}=2\\cdot\n2^{\\,2^{2025}-1}\\;3^{\\,2^{2024}+1}\n=2^{\\,2^{2025}}\\;3^{\\,2^{2024}+1}.\n\\]\n\nWork modulo \\(1000=8\\cdot125\\).\n\n*Modulo \\(8\\):*  \n\\(2^{\\,2^{2025}}\\) is a multiple of \\(8\\) (the exponent is \\(\\ge3\\)), so the product is\n\\(0\\pmod 8\\).\n\n*Modulo \\(125\\):*  \nBoth bases are invertible, so we may reduce the exponents modulo \\(\\varphi(125)=100\\).\n\n\\[\n\\begin{aligned}\n2^{2025}\\pmod{100}&\\equiv 32,\\\\\n2^{2024}\\pmod{100}&\\equiv 16,\n\\end{aligned}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\n2^{\\,2^{2025}} &\\equiv 2^{32}\\pmod{125},\\\\\n3^{\\,2^{2024}+1}&\\equiv 3^{17}\\pmod{125}.\n\\end{aligned}\n\\]\n\n\\[\n2^{32}\\equiv46\\pmod{125},\\qquad \n3^{17}\\equiv38\\pmod{125}.\n\\]\n\nHence  \n\n\\[\n2^{\\,2^{2025}}3^{\\,2^{2024}+1}\\equiv46\\cdot38\\equiv123\\pmod{125}.\n\\]\n\n*Chinese remainder:*  Find \\(N\\) with  \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nWriting \\(N=125a+123\\) and testing \\(a=0,\\dots,7\\) gives \\(a=1\\) as the solution,\nso \\(N=125\\cdot1+123=248\\).\n\nThus  \n\n\\[\n2b_{2025}\\equiv 248\\pmod{1000}.\n\\]\n\nBy (4) this is exactly \\((m+n)\\pmod{1000}\\).\n\n--------------------------------------------------------------------\n\\[\n\\boxed{248}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nz=x+yi .\n\\]\n\nThe first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\nrepresents the circle  \n\n\\[\n(x-25)^2+(y-20)^2=5^2        \\tag{1}\n\\]\n\ncentered at \\(C=(25,20)\\) with radius \\(r=5\\).\n\n---\n\n### Locus of the second equation  \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the distance from \\(z\\) to the point  \n\n\\[\nA=(4+k,0)\n\\]\n\nequals its distance to the point  \n\n\\[\nB=(k,3).\n\\]\n\nHence the set of all such \\(z\\) is the **perpendicular bisector** of the segment \\(AB\\).\n\n- Midpoint of \\(AB\\):\n  \\[\n  M=\\Bigl(\\frac{4+k+k}{2},\\frac{0+3}{2}\\Bigr)=(2+k,\\tfrac32).\n  \\]\n\n- Slope of \\(AB\\):\n  \\[\n  m_{AB}= \\frac{3-0}{k-(4+k)}=\\frac{3}{-4}=-\\frac34 .\n  \\]\n\n- Slope of the perpendicular bisector:\n  \\[\n  m_{L}= \\frac{4}{3}.\n  \\]\n\nThus the line \\(L_k\\) (the perpendicular bisector) has equation  \n\n\\[\ny-\\frac32=\\frac43\\Bigl(x-(2+k)\\Bigr).\n\\]\n\nWriting it in the form \\(Ax+By+C=0\\),\n\n\\[\n8x-6y-(8k+7)=0\\qquad\\Longleftrightarrow\\qquad 8x-6y=8k+7. \\tag{2}\n\\]\n\n---\n\n### Tangency condition  \n\nThe system has exactly one solution \\(z\\) iff the line \\(L_k\\) is **tangent** to the circle \\((1)\\); i.e. the distance from the centre \\(C\\) to the line equals the radius \\(5\\).\n\nDistance from \\(C=(25,20)\\) to line \\((2)\\):\n\n\\[\nd=\\frac{|\\,8\\cdot25-6\\cdot20-(8k+7)\\,|}{\\sqrt{8^{2}+(-6)^{2}}}\n   =\\frac{|200-120-8k-7|}{10}\n   =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5 \\Longrightarrow |73-8k|=50.\n\\]\n\nHence  \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50,\n\\]\n\nwhich give  \n\n\\[\nk=\\frac{23}{8},\\qquad k=\\frac{123}{8}.\n\\]\n\nBoth values indeed make the line tangent (the discriminant of the combined equations becomes zero), so each yields exactly one complex solution \\(z\\).\n\n---\n\n### Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\): \\(m=73,\\; n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The grid has three rows and three \\(3\\times3\\) blocks.  \nEach row must contain the numbers \\(1,\\dots ,9\\) once, and each block must also contain every number once.\n\n---\n\n### 1.  Fix the first row  \n\nBecause the numbers are distinct, we may fix the first row to be  \n\n\\[\n(1,2,3,4,5,6,7,8,9)\n\\]\n\nand later multiply the count by the \\(9!\\) possible permutations of this row.\n\n---\n\n### 2.  What must the other two rows contain?\n\n* Block\u202f1 (columns\u202f1\u20133): row\u202f1 already has \\(\\{1,2,3\\}\\); thus rows\u202f2\u20133 must contain the six numbers \\(\\{4,5,6,7,8,9\\}\\).\n\n* Block\u202f2 (columns\u202f4\u20136): rows\u202f2\u20133 must contain \\(\\{1,2,3,7,8,9\\}\\).\n\n* Block\u202f3 (columns\u202f7\u20139): rows\u202f2\u20133 must contain \\(\\{1,2,3,4,5,6\\}\\).\n\nEach of rows\u202f2 and\u202f3 must be a permutation of \\(\\{1,\\dots ,9\\}\\).\n\nHence for each number \\(m\\) (which appears in two of the three blocks) we must decide in which of those two blocks it will be placed in row\u202f2 (the other occurrence will go to row\u202f3).  \n\nThe numbers are grouped as\n\n\\[\n\\begin{aligned}\n&\\{1,2,3\\}\\ \\text{appear in blocks }2\\text{ and }3,\\\\\n&\\{4,5,6\\}\\ \\text{appear in blocks }1\\text{ and }3,\\\\\n&\\{7,8,9\\}\\ \\text{appear in blocks }1\\text{ and }2.\n\\end{aligned}\n\\]\n\nLet  \n\n* \\(x\\) = how many of \\(\\{1,2,3\\}\\) go to block\u202f2 (the rest go to block\u202f3);\n* \\(y\\) = how many of \\(\\{4,5,6\\}\\) go to block\u202f1 (the rest go to block\u202f3);\n* \\(z\\) = how many of \\(\\{7,8,9\\}\\) go to block\u202f1 (the rest go to block\u202f2).\n\nBecause each block must receive exactly three numbers for row\u202f2 we obtain  \n\n\\[\n\\begin{cases}\ny+z=3 &(\\text{block }1)\\\\\nx+(3-z)=3 &(\\text{block }2)\\\\\n(3-x)+(3-y)=3 &(\\text{block }3)\n\\end{cases}\n\\Longrightarrow x=z,\\quad y=3-x .\n\\]\n\nThus \\(x\\) can be \\(0,1,2,3\\).  \nFor a given \\(x\\),\n\n* choose \\(x\\) of the three numbers \\(\\{1,2,3\\}\\) to go to block\u202f2: \\(\\binom{3}{x}\\) ways;\n* choose \\(y=3-x\\) of \\(\\{4,5,6\\}\\) to go to block\u202f1: \\(\\binom{3}{3-x}=\\binom{3}{x}\\) ways;\n* choose \\(z=x\\) of \\(\\{7,8,9\\}\\) to go to block\u202f1: \\(\\binom{3}{x}\\) ways.\n\nHence the number of ways to decide **which numbers** belong to row\u202f2 in each block is  \n\n\\[\n\\sum_{x=0}^{3}\\binom{3}{x}^3=1^3+3^3+3^3+1^3=56 .\n\\]\n\n---\n\n### 3.  Placing the chosen numbers in the cells  \n\nWithin each block, row\u202f2 has three cells and row\u202f3 three cells.  \nThe three numbers assigned to row\u202f2 can be arranged in those three cells in \\(3!\\) ways, and similarly for row\u202f3.  \n\nThus for each block there are \\(3!\\times3! = 36\\) placements, and for the three blocks\n\n\\[\n36^3 = 46656\n\\]\n\nplacements.\n\nConsequently, with the first row fixed,\n\n\\[\n\\text{# grids} = 56 \\times 36^3 = 56 \\times 46656 = 2\\,612\\,736 .\n\\]\n\n---\n\n### 4.  Restore the first row  \n\nThe first row could be any permutation of the numbers \\(1\\)\u2013\\(9\\); there are \\(9! = 362880\\) possibilities.\n\n\\[\nN = 2\\,612\\,736 \\times 362\\,880 = 948\\,109\\,639\\,680 .\n\\]\n\n---\n\n### 5.  Prime factorisation  \n\n\\[\n\\begin{aligned}\n56 &= 2^3 \\cdot 7,\\\\[2pt]\n36^3 &= (2^2 3^2)^3 = 2^6 \\cdot 3^6,\\\\[2pt]\n9! &= 2^7 \\cdot 3^4 \\cdot 5 \\cdot 7 .\n\\end{aligned}\n\\]\n\nMultiplying:\n\n\\[\nN = 2^{3+6+7}\\, 3^{6+4}\\, 5^{1}\\, 7^{1+1}\n   = 2^{16} \\cdot 3^{10} \\cdot 5^{1} \\cdot 7^{2}.\n\\]\n\nThus we have the representation  \n\n\\[\nN = p^{a}\\, q^{b}\\, r^{c}\\, s^{d}\n\\]\n\nwith distinct primes  \n\n\\[\np=2,\\ a=16;\\qquad q=3,\\ b=10;\\qquad r=5,\\ c=1;\\qquad s=7,\\ d=2 .\n\\]\n\n---\n\n### 6.  Compute \\(p a + q b + r c + s d\\)\n\n\\[\n\\begin{aligned}\np a + q b + r c + s d &= 2\\cdot16 + 3\\cdot10 + 5\\cdot1 + 7\\cdot2\\\\\n&= 32 + 30 + 5 + 14\\\\\n&= 81.\n\\end{aligned}\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\ny=x^{2}-4\\qquad (1)\n\\]\n\nand rotate the whole plane \\(60^{\\circ}\\) counter\u2011clockwise about the origin.\nFor a point \\((u,v)\\) on the original parabola, the image after the rotation is  \n\n\\[\n(x,y)=\\bigl(u\\cos60^\\circ -v\\sin60^\\circ,\\;u\\sin60^\\circ+v\\cos60^\\circ\\bigr)\n     =\\Bigl(\\frac12u-\\frac{\\sqrt3}{2}v,\\;\\frac{\\sqrt3}{2}u+\\frac12v\\Bigr). \\tag{2}\n\\]\n\nBecause \\((u,v)\\) lies on the original curve, \\(v=u^{2}-4\\).\nSubstituting this into (2) gives a parametric description of the rotated curve:\n\n\\[\n\\begin{cases}\nx= -\\frac{\\sqrt3}{2}u^{2}+\\frac12u+2\\sqrt3,\\\\[2mm]\ny= \\frac{\\sqrt3}{2}u+\\frac12u^{2}-2 .\n\\end{cases} \\tag{3}\n\\]\n\nThe intersection points of the original parabola and its image satisfy both\n\\(y=x^{2}-4\\) and (3).  Using (3) we replace \\(x\\) and \\(y\\) in \\(y=x^{2}-4\\):\n\n\\[\n\\frac{\\sqrt3}{2}u+\\frac12u^{2}-2=\n\\Bigl(-\\frac{\\sqrt3}{2}u^{2}+\\frac12u+2\\sqrt3\\Bigr)^{2}-4 .\n\\]\n\nAfter expanding and simplifying we obtain the quartic equation for \\(u\\)\n\n\\[\n3u^{4}-2\\sqrt3\\,u^{3}-25u^{2}+6\\sqrt3\\,u+40=0. \\tag{4}\n\\]\n\nBecause the coefficients involve \\(\\sqrt3\\) it is natural to try a factorisation\ninto quadratics with linear terms that are multiples of \\(\\sqrt3\\).  Indeed,\n\n\\[\n3u^{4}-2\\sqrt3\\,u^{3}-25u^{2}+6\\sqrt3\\,u+40\n  =(3u^{2}+\\sqrt3\\,u-10)(u^{2}-\\sqrt3\\,u-4). \\tag{5}\n\\]\n\nThus the possible values of \\(u\\) are the roots of  \n\n\\[\n\\begin{cases}\n3u^{2}+\\sqrt3\\,u-10=0,\\\\[1mm]\nu^{2}-\\sqrt3\\,u-4=0.\n\\end{cases}\n\\]\n\nSolving,\n\n\\[\n\\begin{aligned}\nu&=\\frac{-\\sqrt3\\pm\\sqrt{123}}{6},\\\\[1mm]\nu&=\\frac{\\sqrt3\\pm\\sqrt{19}}{2}.\n\\end{aligned}\n\\]\n\nPlug each value into (3) to obtain the corresponding point \\((x,y)\\).\n\n\\[\n\\begin{array}{c|c|c}\nu & x & y\\\\ \\hline\n\\displaystyle\\frac{-\\sqrt3+\\sqrt{123}}6 & 2.136\\ldots & 0.566\\ldots\\\\[2mm]\n\\displaystyle\\frac{-\\sqrt3-\\sqrt{123}}6 & -1.561\\ldots & -1.568\\ldots\\\\[2mm]\n\\displaystyle\\frac{\\sqrt3+\\sqrt{19}}2 & -3.046\\ldots & 5.276\\ldots\\\\[2mm]\n\\displaystyle\\frac{\\sqrt3-\\sqrt{19}}2 & 1.313\\ldots & -2.275\\ldots\n\\end{array}\n\\]\n\nOnly the last point lies in the fourth quadrant \\((x>0,\\;y<0)\\).  \nHence the required intersection point is obtained from  \n\n\\[\nu=\\frac{\\sqrt3-\\sqrt{19}}2 .\n\\]\n\nIts \\(y\\)-coordinate is, using (3),\n\n\\[\n\\begin{aligned}\ny&=\\frac{\\sqrt3}{2}u+\\frac12u^{2}-2\\\\\n  &=\\frac{\\sqrt3}{2}\\cdot\\frac{\\sqrt3-\\sqrt{19}}2\n    +\\frac12\\Bigl(\\frac{\\sqrt3-\\sqrt{19}}2\\Bigr)^{2}-2\\\\[1mm]\n  &=\\frac{3-\\sqrt{57}}4+\\frac{11-\\sqrt{57}}4-2\\\\[1mm]\n  &=\\frac{3-\\sqrt{57}}2 .\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\ny=\\frac{a-\\sqrt b}{c}\\qquad\\text{with}\\quad a=3,\\;b=57,\\;c=2.\n\\]\n\nSince \\(\\gcd(3,2)=1\\) the representation is in lowest terms.  Therefore\n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution.**  \n\nPut \\(A=(0,0)\\) and let \\(AB\\) be the \\(x\\)-axis.  \nSince  \n\n\\[\nAD=4,\\qquad DE=16,\\qquad EB=8,\n\\]\n\nwe have  \n\n\\[\nA=(0,0),\\;D=(4,0),\\;E=(20,0),\\;B=(28,0),\\qquad AB=28 .\n\\]\n\nLet \\(C=(x,y)\\) with \\(y>0\\).  \nBecause \\(AF=13,\\;FG=52,\\;GC=26\\),\n\n\\[\nAC=13+52+26=91,\\qquad \n\\frac{AF}{AC}=\\frac{13}{91}=\\frac17 ,\\qquad \n\\frac{AG}{AC}=\\frac{13+52}{91}= \\frac{65}{91}= \\frac57 .\n\\]\n\nHence  \n\n\\[\nF=\\Bigl(\\frac{x}{7},\\frac{y}{7}\\Bigr),\\qquad \nG=\\Bigl(\\frac{5x}{7},\\frac{5y}{7}\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 1.  Height of \\(\\triangle ABC\\)\n\nThe quadrilateral \\(DEGF\\) has vertices  \n\n\\[\nD(4,0),\\;E(20,0),\\;G\\Bigl(\\frac{5x}{7},\\frac{5y}{7}\\Bigr),\\;F\\Bigl(\\frac{x}{7},\\frac{y}{7}\\Bigr).\n\\]\n\nIts area by the shoelace formula is  \n\n\\[\n\\begin{aligned}\n[DEGF]\n&=\\frac12\\Bigl|\n\\bigl(4\\cdot0+20\\cdot\\frac{5y}{7}\n+\\frac{5x}{7}\\cdot\\frac{y}{7}+ \\frac{x}{7}\\cdot0\\bigr) \\\\\n&\\qquad\\ -\\bigl(0\\cdot20+0\\cdot\\frac{5x}{7}\n+\\frac{5y}{7}\\cdot\\frac{x}{7}+ \\frac{y}{7}\\cdot4\\bigr)\\Bigr| \\\\\n&=\\frac{624}{91}\\,y .\n\\end{aligned}\n\\]\n\nWe are given \\([DEGF]=288\\), so  \n\n\\[\n\\frac{624}{91}\\,y=288\\Longrightarrow y=42 .\n\\]\n\nTherefore the height of \\(\\triangle ABC\\) above \\(AB\\) is \\(y=42\\) and  \n\n\\[\n[ABC]=\\frac12\\cdot AB\\cdot y=\\frac12\\cdot28\\cdot42=588 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Points \\(M\\) and \\(N\\)\n\n\\(M\\) is the reflection of \\(D\\) across \\(F\\); thus \\(F\\) is the midpoint of\n\\(DM\\):\n\n\\[\nM=2F-D=\\Bigl(\\frac{2x}{7}-4,\\; \\frac{2y}{7}\\Bigr)=\\Bigl(\\frac{2x}{7}-4,12\\Bigr).\n\\]\n\n\\(N\\) is the reflection of \\(G\\) across \\(E\\); hence\n\n\\[\nN=2E-G=\\Bigl(40-\\frac{5x}{7},\\; -\\frac{5y}{7}\\Bigr)=\\Bigl(40-\\frac{5x}{7},-30\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 3.  Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in the given order:\n\n\\[\n\\begin{array}{c|c}\n\\text{vertex}&(x,y)\\\\ \\hline\nA&(0,0)\\\\\nF&\\bigl(\\frac{x}{7},\\frac{y}{7}\\bigr)\\\\\nN&\\bigl(40-\\frac{5x}{7},-30\\bigr)\\\\\nB&(28,0)\\\\\nC&(x,y)\\\\\nE&(20,0)\\\\\nM&\\bigl(\\frac{2x}{7}-4,12\\bigr)\n\\end{array}\n\\]\n\nApply the shoelace formula:\n\n\\[\n\\begin{aligned}\n[AFNBCEM]&=\\frac12\\Bigl|\n\\underbrace{0\\cdot\\frac{y}{7}}_{\\!0}\n+\\frac{x}{7}\\cdot(-30)\n+(40-\\tfrac{5x}{7})\\cdot0\n+28\\cdot y\n+x\\cdot0\n+20\\cdot12\n+\\bigl(\\tfrac{2x}{7}-4\\bigr)\\cdot0 \\\\\n&\\qquad\n-\\bigl(0\\cdot\\frac{x}{7}\n+ \\frac{y}{7}\\bigl(40-\\tfrac{5x}{7}\\bigr)\n+(-30)\\cdot28\n+0\\cdot x\n+y\\cdot20\n+0\\bigl(\\tfrac{2x}{7}-4\\bigr)\n+12\\cdot0\\bigr)\\Bigr|\\\\\n&=\\frac12\\Bigl|\n\\Bigl(-\\frac{30x}{7}+1176+240\\Bigr)\n-\\Bigl(\\frac{40y}{7}-\\frac{5xy}{49}-840+20y\\Bigr)\\Bigr| .\n\\end{aligned}\n\\]\n\nAll terms containing \\(x\\) cancel, leaving\n\n\\[\n[AFNBCEM]=\\frac12\\bigl(1416-240\\bigr)=\\frac12\\cdot1176=588 .\n\\]\n\nThus the heptagon has the same area as \\(\\triangle ABC\\).\n\n--------------------------------------------------------------------\n### 4.  Answer\n\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The least possible value of  \n\n\\[\nf(X)=AX+BX+CX+DX+EX\n\\]\n\nis  \n\n\\[\n6+18\\sqrt{13}.\n\\]\n\nHence \\(m=6\\), \\(n=18\\), \\(p=13\\) and  \n\n\\[\nm+n+p=6+18+13=37.\n\\]\n\n\\[\n\\boxed{37}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 37

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=1,\\;B=2,\\dots ,L=12\n\\]\n\nand consider a random perfect matching of the 12 letters.  \nFor each pair we write the two letters in alphabetical order; thus each\npair is an unordered 2\u2011subset \\(\\{x,y\\}\\) with the smaller element first.\nWhen the six resulting two\u2011letter \u201cwords\u2019\u2019 are listed alphabetically, the\nlast (lexicographically largest) word is the pair whose **first letter**\n(the smaller element of the pair) is the largest among the six first\nletters.\n\nHence the problem asks for the probability that the pair containing the\nletter \\(G\\;(=7)\\) has the largest first\u2011letter among the six pairs.\n\n--------------------------------------------------------------------\n### 1.  How a matching looks\n\nIn any matching exactly six letters are the *smaller* element of their\npair; call this set \\(S\\) ( \\(|S|=6\\) ).  \nThe remaining six letters are the larger elements of their pairs.\n\nThe last word is the pair whose smaller element is  \n\n\\[\nM=\\max S .\n\\]\n\nWe need the probability that the pair containing \\(G\\) also contains\n\\(M\\).  This can happen in two mutually exclusive ways:\n\n* **Case\u202f1.** \\(G\\) is the smaller element of its pair, so \\(M=G\\).\n* **Case\u202f2.** \\(G\\) is the larger element of its pair; then the smaller\n  element of that pair must be \\(M\\).\n\n--------------------------------------------------------------------\n### 2.  Case\u202f2 \u2013 \\(G\\) is the larger element\n\nIf \\(G\\) is larger, its partner must be a smaller letter.\nLet that partner be \\(x\\ (<G)\\).  \nFor \\(x\\) to be the maximum of \\(S\\), all letters larger than \\(x\\)\nmust be the larger elements of their pairs.  Since \\(|S|=6\\), this forces\n\n\\[\nx=F\\;(=6),\\qquad S=\\{1,2,3,4,5,6\\}.\n\\]\n\nThus the only possible pairing is \\(\\{F,G\\}\\); the remaining letters are\n\\(\\{A,B,C,D,E\\}\\) (small) and \\(\\{H,I,J,K,L\\}\\) (large), which can be\nmatched arbitrarily.  There are  \n\n\\[\n5! =120\n\\]\n\nmatchings of this type.\n\n--------------------------------------------------------------------\n### 3.  Case\u202f1 \u2013 \\(G\\) is the smaller element\n\nNow \\(G\\) must be paired with a larger letter \\(j\\in\\{8,9,10,11,12\\}\\)\n(\\(5\\) choices).  \nFor \\(G\\) to be the maximal element of \\(S\\), none of the other letters\n\\(8,9,10,11,12\\) may belong to \\(S\\).  Hence  \n\n\\[\nS=\\{7\\}\\cup T,\\qquad T\\subset\\{1,2,3,4,5,6\\},\\ |T|=5.\n\\]\n\nChoose the omitted small letter \\(r\\in\\{1,\\dots ,6\\}\\); then\n\\(T=\\{1,\\dots ,6\\}\\setminus\\{r\\}\\) ( \\(6\\) choices).\n\nFor a fixed \\(j\\) and \\(r\\) we must match the five small letters\n\\(T\\) with the five large letters \\(\\{r\\}\\cup\\{8,9,10,11,12\\}\\setminus\\{j\\}\\)\nso that each small letter is paired with a larger one.  \nThe four large letters \\(\\{8,9,10,11,12\\}\\setminus\\{j\\}\\) can be paired\nwith any four of the small letters \u2013 that gives \\(4!=24\\) possibilities.\nThe remaining large letter \\(r\\) can only be paired with a small letter\nthat is smaller than \\(r\\); there are \\(r-1\\) such choices.\n\nHence for this \\(j,r\\) we have \\((r-1)\\cdot4!\\) matchings.\nSumming over \\(r\\) gives  \n\n\\[\n\\sum_{r=1}^{6}(r-1)\\cdot24=15\\cdot24=360\n\\]\n\nmatchings for each of the five possible \\(j\\).  Thus\n\n\\[\n\\text{Case\u202f1 count}=5\\cdot360=1800 .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Total favourable matchings\n\n\\[\nN_{\\text{fav}}=1800+120=1920 .\n\\]\n\nThe total number of perfect matchings of 12 letters is  \n\n\\[\nN_{\\text{tot}}=\\frac{12!}{2^{6}\\,6!}=10395 .\n\\]\n\nTherefore\n\n\\[\nP=\\frac{1920}{10395}= \\frac{128}{693}\\qquad(\\gcd(128,693)=1).\n\\]\n\n--------------------------------------------------------------------\n### 5.  Answer\n\n\\[\n\\boxed{m+n=128+693=821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: None

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The inequalities  \n\n\\[\nx-yz<y-zx<z-xy\n\\]\n\nare equivalent to  \n\n\\[\n(x-y)(1+z)<0,\\qquad (y-z)(1+x)<0 .\n\\]\n\n---\n\n### 1.  Introduce convenient variables\n\nLet  \n\n\\[\nu=x-y,\\qquad v=y-z .\n\\]\n\nOn the plane \\(x+y+z=75\\) we can solve for \\((x,y,z)\\) in terms of \\((u,v)\\):\n\n\\[\n\\begin{aligned}\nx&=\\frac{75+2u+v}{3},\\\\[2pt]\ny&=\\frac{75-u+v}{3},\\\\[2pt]\nz&=\\frac{75-u-2v}{3}.\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\n1+z=\\frac{78-u-2v}{3},\\qquad \n1+x=\\frac{78+2u+v}{3}.\n\\]\n\nThe two inequalities become  \n\n\\[\nu\\,(78-u-2v)<0,\\qquad v\\,(78+2u+v)<0 .\n\\tag{1}\n\\]\n\n---\n\n### 2.  Determine the regions in the \\((u,v)\\)-plane  \n\nFrom (1)\n\n\\[\n\\begin{cases}\nu(78-u-2v)<0,\\\\[2pt]\nv(78+2u+v)<0,\n\\end{cases}\n\\]\n\nwhich splits the \\((u,v)\\)-plane into four sign cases.\n\n| case | signs of \\(u,v\\) | resulting linear conditions |\n|------|------------------|----------------------------|\n| \\(u>0,\\ v>0\\) | empty (contradiction) |\n| \\(u>0,\\ v<0\\) | \\(u+2v>78\\) (unbounded) |\n| \\(u<0,\\ v>0\\) | \\(u+2v<78,\\;2u+v<-78\\) (unbounded) |\n| \\(u<0,\\ v<0\\) | \\(2u+v>-78\\) (bounded) |\n\nOnly the last case gives a bounded region.  \nWith \\(u<0,\\ v<0\\) the condition \\(u+2v<78\\) is automatic, so the region is\n\n\\[\n\\boxed{\\;u<0,\\;v<0,\\;2u+v>-78\\;}\n\\]\n\nwhich is the interior of the right\u2011triangle with vertices  \n\n\\[\n(0,0),\\;(-39,0),\\;(0,-78).\n\\]\n\nIts area in the \\((u,v)\\)-coordinates is\n\n\\[\nA_{uv}= \\frac12\\cdot39\\cdot78 =1521 .\n\\]\n\n---\n\n### 3.  Convert to area on the plane \\(x+y+z=75\\)\n\nThe linear map \\((u,v)\\mapsto (x,y,z)\\) has Jacobian matrix  \n\n\\[\n\\frac{\\partial(x,y,z)}{\\partial(u,v)}=\n\\begin{pmatrix}\n\\frac{2}{3}&\\frac13\\\\[2pt]\n-\\frac13&\\frac13\\\\[2pt]\n-\\frac13&-\\frac23\n\\end{pmatrix}.\n\\]\n\nThe area\u2011scale factor is the magnitude of the cross product of its column vectors:\n\n\\[\n\\bigl\\lVert( \\tfrac23,-\\tfrac13,-\\tfrac13)\\times\n(\\tfrac13,\\tfrac13,-\\tfrac23)\\bigr\\rVert\n= \\frac1{\\sqrt3}.\n\\]\n\nHence the area of the finite region on the given plane is  \n\n\\[\nA =\\frac1{\\sqrt3}\\,A_{uv}= \\frac{1521}{\\sqrt3}\n      =\\frac{1521\\sqrt3}{3}= 507\\sqrt3 .\n\\]\n\n---\n\n### 4.  Answer\n\nThe area is \\(507\\sqrt3\\), i.e. \\(a=507\\) and \\(b=3\\).  \nThus  \n\n\\[\na+b = 507+3 = \\boxed{510}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the points be placed on the \\(x\\)-axis.\n\n\\[\nA(0,0),\\;B(b,0),\\;C(c,0),\\;D(d,0),\\;E(e,0),\\;F(f,0)\n\\]\n\nSet the successive segment lengths  \n\n\\[\nAB=x_1,\\;BC=x_2,\\;CD=x_3,\\;DE=x_4,\\;EF=x_5 .\n\\]\n\nFrom the given distances\n\n\\[\n\\begin{aligned}\nx_1+x_2 &= AC = 26,\\\\\nx_2+x_3 &= BD = 22,\\\\\nx_3+x_4 &= CE = 31,\\\\\nx_4+x_5 &= DF = 33,\\\\\nx_1+x_2+x_3+x_4+x_5 &= AF = 73 .\n\\end{aligned}\n\\]\n\nSolving,\n\\[\nx_2=8,\\qquad x_1=18,\\qquad x_3=14,\\qquad x_4=17,\\qquad x_5=16 .\n\\]\n\nHence  \n\n\\[\n\\begin{aligned}\nA&=(0,0),\\\\\nB&=(18,0),\\\\\nC&=(26,0),\\\\\nD&=(40,0),\\\\\nE&=(57,0),\\\\\nF&=(73,0).\n\\end{aligned}\n\\]\n\nLet \\(G=(x,y)\\).  From the distances \\(CG=40\\) and \\(DG=30\\),\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2=40^2=1600,\\\\[2pt]\n(x-40)^2+y^2=30^2=900 .\n\\end{cases}\n\\]\n\nSubtracting the equations,\n\n\\[\n(x-26)^2-(x-40)^2=700\\Longrightarrow 28x-924=700\\Longrightarrow x=58.\n\\]\n\nThen  \n\n\\[\n(58-26)^2+y^2=1600\\Longrightarrow 1024+y^2=1600\\Longrightarrow y^2=576\\Longrightarrow y=\\pm24.\n\\]\n\nThus \\(G=(58,24)\\) (the sign of \\(y\\) does not affect the area).\n\nThe base \\(BE\\) lies on the \\(x\\)-axis:\n\n\\[\nBE = e-b = 57-18 = 39 .\n\\]\n\nThe height from \\(G\\) to the line \\(AB\\!E\\) is \\(|y|=24\\).\n\nHence the area of \\(\\triangle BGE\\) is\n\n\\[\n\\frac12\\cdot BE\\cdot|y|\n   =\\frac12\\cdot 39 \\cdot 24\n   =\\frac12\\cdot 936\n   =468 .\n\\]\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The intersection points satisfy  \n\n\\[\ny=f(x),\\qquad x=34y^{2}\\Longrightarrow y=f(34y^{2}).\n\\]\n\n--------------------------------------------------------------------\n### 1.  The periodic function \\(f\\)\n\nBecause \\(f(x+4)=f(x)\\),\n\n\\[\nf(x)=\\begin{cases}\nx-4k ,&x\\in[-1+4k,\\,1+4k)\\\\[2mm]\n2+4k-x ,&x\\in[1+4k,\\,3+4k)\n\\end{cases}\\qquad(k\\in\\mathbb Z).\n\\]\n\nFor an intersection we have \\(x=34y^{2}\\ge 0\\) and \\(|y|\\le 1\\) (the range of \\(f\\)).\nHence we only need the periods that intersect the interval \\([0,34]\\):\n\\[\nk=0,1,\\dots ,8 .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Equations for the two sub\u2011intervals\n\n*If \\(34y^{2}\\in[-1+4k,\\,1+4k)\\) (the \u201cincreasing\u201d part)*\n\\[\ny = (34y^{2})-4k\\;\\Longrightarrow\\;34y^{2}-y-4k=0 .\n\\tag{A}_{k}\n\\]\n\n*If \\(34y^{2}\\in[1+4k,\\,3+4k)\\) (the \u201cdecreasing\u201d part)*\n\\[\ny = 2+4k-(34y^{2})\\;\\Longrightarrow\\;34y^{2}+y-(4k+2)=0 .\n\\tag{B}_{k}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Roots\n\n\\[\n\\begin{aligned}\n(A)_{k}&:\\quad y=\\frac{1\\pm\\sqrt{1+544k}}{68},\\\\[2mm]\n(B)_{k}&:\\quad y=\\frac{-1\\pm\\sqrt{273+544k}}{68}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Which roots are admissible?\n\nBecause \\(|y|\\le 1\\),\n\n* For \\(k=0,\\dots ,8\\) the two roots of \\((A)_{k}\\) satisfy \\(|y|<1\\);\n  thus all \\(2\\cdot9=18\\) of them are valid.\n\n* For \\((B)_{k}\\) the two roots lie in \\((-1,1)\\) when \\(k=0,\\dots ,7\\).\n  When \\(k=8\\) the negative root equals \\(\\displaystyle \n  \\frac{-1-\\sqrt{4625}}{68}\\approx-1.0148\\), which is outside the\n  interval \\([-1,1]\\); the positive root is still admissible.\n  Hence we have \\(2\\cdot8+1=17\\) valid roots from the \\((B)\\) equations.\n\nConsequently there are \\(18+17=35\\) intersection points.\n\n--------------------------------------------------------------------\n### 5.  Summing the \\(y\\)-coordinates  \n\nFrom Vi\u00e8te\u2019s formulas\n\n\\[\n\\text{sum of the two roots of }(A)_{k}= \\frac{1}{34},\\qquad\n\\text{sum of the two roots of }(B)_{k}= -\\frac{1}{34}.\n\\]\n\nTherefore\n\n\\[\n\\sum_{k=0}^{8}\\bigl(\\text{both roots of }(A)_{k}\\bigr)=9\\cdot\\frac1{34}=\\frac{9}{34},\n\\]\n\\[\n\\sum_{k=0}^{8}\\bigl(\\text{both roots of }(B)_{k}\\bigr)=-\\frac{9}{34}.\n\\]\n\nIn \\((B)_{8}\\) we must discard the negative root\n\\(\\displaystyle y_{8}^{-}=\\frac{-1-\\sqrt{4625}}{68}\\).\nHence the sum of the **valid** \\((B)\\)\u2011roots is\n\n\\[\n-\\frac{9}{34}-y_{8}^{-}.\n\\]\n\nAdding the contributions of \\((A)\\) and \\((B)\\),\n\n\\[\n\\begin{aligned}\n\\sum y\n&= \\frac{9}{34}+\\Bigl(-\\frac{9}{34}-y_{8}^{-}\\Bigr)\n   =-y_{8}^{-}\n   =\\frac{1+\\sqrt{4625}}{68}.\n\\end{aligned}\n\\]\n\nSince \\(\\sqrt{4625}=5\\sqrt{185}\\),\n\n\\[\n\\sum y=\\frac{1+5\\sqrt{185}}{68}.\n\\]\n\n--------------------------------------------------------------------\n### 6.  Final answer\n\nThe required representation is \\(\\displaystyle\\frac{a+b\\sqrt{c}}{d}\\) with  \n\n\\[\na=1,\\; b=5,\\; c=185,\\; d=68,\n\\]\n\nand \\(\\gcd(a,b,d)=1\\), \\(c\\) square\u2011free.\n\n\\[\na+b+c+d = 1+5+185+68 = 259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nd=n+2 \\qquad (d\\ge 3,\\; n>0)\n\\]\n\nThe condition is  \n\n\\[\nd \\mid 3(n+3)(n^2+9).\n\\]\n\nSince \\(n\\equiv -2 \\pmod d\\),\n\n\\[\nn+3\\equiv (-2)+3 \\equiv 1 \\pmod d,\\qquad \nn^2+9\\equiv (-2)^2+9 \\equiv 4+9\\equiv 13 \\pmod d.\n\\]\n\nHence\n\n\\[\n3(n+3)(n^2+9)\\equiv 3\\cdot1\\cdot13=39 \\pmod d .\n\\]\n\nThus \\(d\\) must divide 39:\n\n\\[\nd\\mid 39 .\n\\]\n\nThe positive divisors of \\(39\\) are \\(1,3,13,39\\).  \nBecause \\(d=n+2\\ge 3\\), we have  \n\n\\[\nd\\in\\{3,13,39\\}.\n\\]\n\nCorresponding \\(n\\) values are  \n\n\\[\nn=d-2\\in\\{1,11,37\\}.\n\\]\n\nAll three satisfy the original divisibility, so the required sum is  \n\n\\[\n1+11+37=49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nP=\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^{2}-1})}{\\log_{k+1}(5^{k^{2}-4})}\n\\]\n\n---\n\n### 1.  Rewrite each factor\n\n\\[\n\\log_k(5^{p})=\\frac{\\log_{5}(5^{p})}{\\log_{5}k}= \\frac{p}{\\log_{5}k}.\n\\]\n\nHence\n\n\\[\n\\frac{\\log_k(5^{k^{2}-1})}{\\log_{k+1}(5^{k^{2}-4})}\n   =\\frac{\\dfrac{k^{2}-1}{\\log_{5}k}}{\\dfrac{k^{2}-4}{\\log_{5}(k+1)}}\n   =\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\log_{5}(k+1)}{\\log_{5}k}.\n\\]\n\nFactor the rational part:\n\n\\[\n\\frac{k^{2}-1}{k^{2}-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)} .\n\\]\n\nThus\n\n\\[\nP=\\prod_{k=4}^{63}\n   \\left[\\frac{(k-1)(k+1)}{(k-2)(k+2)}\n         \\cdot\\frac{\\log_{5}(k+1)}{\\log_{5}k}\\right].\n\\]\n\n---\n\n### 2.  Telescope the rational part  \n\nSeparate the product:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\; \\times\\;\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}.\n\\]\n\n\\[\n\\begin{aligned}\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n   &=\\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\frac{5}{4}\\cdots\\frac{62}{61}\n    =\\frac{62}{2}=31,\\\\[4pt]\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n   &=\\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\frac{7}{8}\\cdots\\frac{64}{65}\n    =\\frac{5}{65}=\\frac{1}{13}.\n\\end{aligned}\n\\]\n\nHence the rational part equals  \n\n\\[\n\\frac{31}{13}.\n\\]\n\n---\n\n### 3.  Telescope the logarithmic part  \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\log_{5}(k+1)}{\\log_{5}k}\n   =\\frac{\\log_{5}5}{\\log_{5}4}\\cdot\\frac{\\log_{5}6}{\\log_{5}5}\n    \\cdots\\frac{\\log_{5}64}{\\log_{5}63}\n   =\\frac{\\log_{5}64}{\\log_{5}4}\n   =\\log_{4}64.\n\\]\n\nSince \\(64=4^{3}\\), \\(\\log_{4}64=3\\).\n\nThus the logarithmic part contributes a factor of \\(3\\).\n\n---\n\n### 4.  Combine\n\n\\[\nP=\\frac{31}{13}\\times 3=\\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms, so  \n\n\\[\nm=93,\\qquad n=13.\n\\]\n\nFinally,\n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Sketch**\n\nLet  \n\n\\[\na=3^{\\alpha }u ,\\qquad b=3^{\\beta }v ,\\qquad c=3^{\\gamma }w ,\n\\qquad(\\alpha ,\\beta ,\\gamma \\ge 0,\\;3\\nmid u,v,w)\n\\]\n\nand put \\(\\kappa =\\min (\\alpha ,\\beta ,\\gamma )\\).\nWriting \\(a^{3}=3^{3\\alpha }u^{3}\\) etc.,  \n\n\\[\na^{3}+b^{3}+c^{3}\\equiv 0\\pmod{3^{7}}\n\\Longleftrightarrow\nu^{3}3^{3(\\alpha-\\kappa)}+v^{3}3^{3(\\beta-\\kappa)}+w^{3}3^{3(\\gamma-\\kappa)}\n\\equiv0\\pmod{3^{7-3\\kappa}} .\n\\tag{1}\n\\]\n\nThus we have three essentially different cases:\n\n* \\(\\kappa\\ge 3\\) : every term in (1) is divisible by \\(3^{9}\\), hence the\n  congruence is always true.\n\n* \\(\\kappa =2\\) : all three numbers are divisible by \\(9\\) and at least one\n  is not divisible by \\(27\\).  \n  Put \\(a=9A,\\;b=9B,\\;c=9C\\;(1\\le A,B,C\\le81)\\).   \n  Then (1) reduces to  \n\n  \\[\n  A+B+C\\equiv0\\pmod3 .\n  \\]\n\n  The numbers \\(A,B,C\\) are taken from the set \\(\\{1,\\dots ,81\\}\\); each\n  residue class \\(\\pmod3\\) occurs exactly \\(27\\) times.  \n  Hence the number of ordered triples with \\(\\kappa =2\\) is  \n\n  \\[\n  9\\cdot 27^{3}=157\\,464 .\n  \\tag{2}\n  \\]\n\n* \\(\\kappa =1\\) : all three numbers are divisible by \\(3\\) and at least one\n  is not divisible by \\(9\\).  Write \\(a=3A,\\;b=3B,\\;c=3C\\;(1\\le A,B,C\\le243)\\).  \n  Then (1) becomes  \n\n  \\[\n  A^{3}+B^{3}+C^{3}\\equiv0\\pmod{3^{4}} .\n  \\tag{3}\n  \\]\n\n  The cubes \\(\\pmod {81}\\) of the integers \\(1\\le x\\le243\\) are distributed as  \n\n  \\[\n  \\begin{array}{c|c}\n  \\text{value}&\\text{how many $x$ give it}\\\\ \\hline\n  0 & 27\\\\\n  27,\\,54 & 27\\text{ each}\\\\\n  \\text{18 other residues} & 9\\text{ each}\n  \\end{array}\n  \\]\n\n  Using this distribution one counts (by a short elementary\n  combinatorial argument) the number of ordered triples satisfying (3) to be  \n\n  \\[\n  452\\,709 .\n  \\tag{4}\n  \\]\n\n  The triples counted in (4) include those where all three numbers are\n  divisible by \\(9\\); those are exactly the triples of the previous case,\n  i.e. the $157\\,464$ triples of (2).  Hence the triples with\n  \\(\\kappa =1\\) contribute  \n\n  \\[\n  452\\,709-157\\,464 = 295\\,245 .\n  \\tag{5}\n  \\]\n\n* \\(\\kappa =0\\) : at least one of the numbers is not divisible by \\(3\\).\n  The total number of ordered triples with $1\\le a,b,c\\le3^{6}=729$ is\n  $729^{3}=387\\,420\\,489$.\n  Subtracting the contributions of the three previous cases gives\n\n  \\[\n  387\\,420\\,489-19\\,683-157\\,464-295\\,245 = 702\\,027 .\n  \\tag{6}\n  \\]\n\nFinally we take the answer modulo $1000$ :\n\n\\[\n702\\,027\\equiv\\boxed{27}\\pmod{1000}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 27

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(O\\) be the center of \\(\\omega _2\\) (radius \\(15\\)),  \n* \\(A\\) be the center of \\(\\omega _1\\) (radius \\(6\\)),  \n* \\(B\\) the internal point of tangency of the two circles.\n\n---\n\n### 1.  Coordinates\n\nPlace \\(O\\) at the origin and the line \\(BC\\) on the \\(x\\)-axis.\n\n\\[\nB=(15,0),\\qquad O=(0,0),\\qquad A=(9,0)\n\\]\n\nBecause \\(BC\\) is a diameter of \\(\\omega _2\\),\n\n\\[\nC=(-15,0).\n\\]\n\n\\(AD\\perp BC\\) makes \\(AD\\) vertical, so \\(D\\) lies on the line \\(x=9\\) and on \\(\\omega_2\\):\n\n\\[\n9^{2}+y^{2}=15^{2}\\Longrightarrow y^{2}=144\\Longrightarrow y=\\pm12 .\n\\]\n\nSince later we need \\(D\\) to be nearer to the lower side of the rectangle, we take  \n\n\\[\nD=(9,-12).\n\\]\n\n---\n\n### 2.  Rectangle \\(EFGH\\) inside \\(\\omega _1\\)\n\nThe rectangle is axis\u2011aligned because \\(EF\\perp BC\\) (so \\(EF\\) is vertical) and a rectangle has right angles.\n\nLet the half\u2011width be \\(a\\) and the half\u2011height be \\(y\\) :\n\n\\[\n\\begin{aligned}\nE&\\;(9+a,\\;y),&F&\\;(9+a,\\;-y),\\\\\nG&\\;(9-a,\\;-y),&H&\\;(9-a,\\;y).\n\\end{aligned}\n\\]\n\nAll four vertices lie on \\(\\omega _1\\), whose equation is  \n\n\\[\n(x-9)^2+y^2=6^{2}=36 .\n\\]\n\nHence  \n\n\\[\na^{2}+y^{2}=36\\quad\\Longrightarrow\\quad y=\\sqrt{36-a^{2}}\\;(>0).\n\\]\n\nThe rectangle\u2019s area is  \n\n\\[\n[EFGH]= (2a)(2y)=4ay .\n\\tag{1}\n\\]\n\n---\n\n### 3.  Areas of \\(\\triangle DGF\\) and \\(\\triangle CHG\\)\n\n\\[\n\\begin{aligned}\n\\triangle DGF &: \\text{base }GF=2a,\\; \n\\text{height }=12-y,\\\\\n[ DGF]&=\\tfrac12\\,(2a)(12-y)=a(12-y). \\tag{2}\n\\end{aligned}\n\\]\n\n\\[\n\\begin{aligned}\n\\triangle CHG &: \\text{base }HG=2y,\\;\n\\text{horizontal distance from }C\\text{ to line }x=9-a\\text{ is }24-a,\\\\\n[CHG]&=\\tfrac12\\,(2y)(24-a)=y(24-a). \\tag{3}\n\\end{aligned}\n\\]\n\nGiven \\([DGF]=[CHG]\\),\n\n\\[\na(12-y)=y(24-a).\n\\]\n\nExpanding and canceling the common term \\(-ay\\) gives\n\n\\[\n12a=24y\\quad\\Longrightarrow\\quad a=2y. \\tag{4}\n\\]\n\n---\n\n### 4.  Solving for \\(a\\) and \\(y\\)\n\nFrom (4) and the circle condition \\(a^{2}+y^{2}=36\\),\n\n\\[\n(2y)^{2}+y^{2}=36\\Longrightarrow 5y^{2}=36\n\\Longrightarrow y^{2}=\\frac{36}{5}\n\\Longrightarrow y=\\frac{6}{\\sqrt5}=\\frac{6\\sqrt5}{5}.\n\\]\n\nThus  \n\n\\[\na=2y= \\frac{12}{\\sqrt5}= \\frac{12\\sqrt5}{5}.\n\\]\n\nBoth satisfy \\(a\\le6,\\;y\\le6\\), so the rectangle indeed fits in \\(\\omega _1\\).\n\n---\n\n### 5.  Area of the rectangle\n\nInsert \\(a=2y\\) into (1):\n\n\\[\n[EFGH]=4a y =4(2y)\\,y = 8y^{2}=8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nHence the rectangle\u2019s area is \\(\\displaystyle \\frac{288}{5}\\).\n\nThe fraction is already in lowest terms, so  \n\n\\[\nm=288,\\qquad n=5,\\qquad m+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the 9 vertices of the \\(2\\times2\\) grid be the points \\((i,j)\\) with \\(i,j=0,1,2\\).\nThe 12 unit edges are  \n\n* 8 **boundary** edges (two on each side of the large square);\n* 4 **interior** edges, which are shared by two unit squares.\n\nDenote the four interior edges by  \n\n\\[\na=v_{10},\\qquad b=v_{11},\\qquad c=h_{01},\\qquad d=h_{11},\n\\]\n\nwhere each variable is \\(1\\) if the edge is coloured red and \\(0\\) if it is blue.\n\n---\n\n### 1.  How the interior edges affect a square  \n\nEach small square has two interior edges and two boundary edges.\n\n\\[\n\\begin{array}{c|c}\n\\text{square}&\\text{interior edges}\\\\\\hline\n\\text{BL}& a,\\;c\\\\\n\\text{BR}& b,\\;c\\\\\n\\text{TL}& a,\\;d\\\\\n\\text{TR}& b,\\;d\n\\end{array}\n\\]\n\nLet \\(r\\) be the number of red interior edges of a given square.\nSince the square must have exactly two red sides, it needs  \n\\(2-r\\) red boundary edges.\n\nFor a square:\n\n* if \\(r=0\\) or \\(r=2\\) the two boundary edges are forced (both red or both blue) \u2013 **1** way;\n* if \\(r=1\\) exactly one of the two boundary edges must be red \u2013 **2** ways.\n\nThus a given interior\u2011edge configuration contributes a factor  \n\n\\[\n2^{\\#\\{\\text{squares with }r=1\\}} .\n\\]\n\nDenote by  \n\n\\[\nN(a,b,c,d)=\\mathbf 1_{a\\neq c}+\\mathbf 1_{a\\neq d}+\\mathbf 1_{b\\neq c}+\\mathbf 1_{b\\neq d},\n\\]\n\nthe number of squares for which exactly one of the two interior edges is red.\nThen the total number of colourings is\n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}} 2^{\\,N(a,b,c,d)} .\n\\]\n\n---\n\n### 2.  Evaluating the sum  \n\nThe value of \\(N\\) depends only on how the pairs \\((a,b)\\) and \\((c,d)\\) compare.\n\n* **Case 1:** \\((a,b)=(c,d)\\).  \n  Then \\(N=0\\). This occurs for \\((0,0,0,0)\\) and \\((1,1,1,1)\\) \u2013 2 assignments.\n  Contribution: \\(2\\cdot 2^{0}=2\\).\n\n* **Case 2:** \\((a,b)=(c,d)\\) with opposite colour, i.e. \\(a=b\\neq c=d\\).  \n  Then each of the four comparisons differs, so \\(N=4\\).  \n  This happens for \\((0,0,1,1)\\) and \\((1,1,0,0)\\) \u2013 2 assignments.\n  Contribution: \\(2\\cdot 2^{4}=2\\cdot16=32\\).\n\n* **Case 3:** All other assignments.  \n  There are \\(16-4=12\\) such configurations and one checks that each yields \\(N=2\\).  \n  Contribution: \\(12\\cdot 2^{2}=12\\cdot4=48\\).\n\nAdding the three cases,\n\n\\[\n2+32+48=82 .\n\\]\n\n---\n\n\\[\n\\boxed{82}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The divisors of  \n\n\\[\n2025 = 3^{4}\\cdot 5^{2}\n\\]\n\nare of the form \\(3^{a}5^{b}\\) with  \n\n\\[\n0\\le a\\le 4 ,\\qquad 0\\le b\\le 2 .\n\\]\n\nHence  \n\n\\[\n|A|=(4+1)(2+1)=15,\\qquad\\text{so there are }2^{15}=32768\\text{ subsets of }A.\n\\]\n\nFor a subset \\(B\\subseteq A\\) the least common multiple is  \n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a}\\,5^{\\max b},\n\\]\n\nwhere \\(\\max a\\) (resp. \\(\\max b\\)) is the largest exponent of \\(3\\) (resp. \\(5\\)) among the elements of \\(B\\).\n\nThus \\(\\operatorname{lcm}(B)=2025\\) iff  \n\n* some element of \\(B\\) has \\(a=4\\) (i.e. belongs to the set \\(R\\) of divisors with a factor \\(3^{4}\\));\n* some element of \\(B\\) has \\(b=2\\) (i.e. belongs to the set \\(C\\) of divisors with a factor \\(5^{2}\\)).\n\nThe set \\(R\\) consists of the three divisors \\(3^{4}5^{0}, 3^{4}5^{1}, 3^{4}5^{2}\\);\nthe set \\(C\\) consists of the five divisors \\(3^{0}5^{2}, 3^{1}5^{2}, 3^{2}5^{2}, 3^{3}5^{2}, 3^{4}5^{2}\\).\nTheir intersection is \\(\\{2025\\}\\).  \n\nWe need the number of subsets of \\(A\\) that contain **at least one** element of \\(R\\) and **at least one** element of \\(C\\).\n\nUsing inclusion\u2013exclusion on the whole set of subsets:\n\n\\[\n\\begin{aligned}\nN &= 2^{15}\n      -\\underbrace{2^{15-|R|}}_{\\text{subsets with no }R}\n      -\\underbrace{2^{15-|C|}}_{\\text{subsets with no }C}\n      +\\underbrace{2^{15-|R\\cup C|}}_{\\text{subsets with neither}}  \\\\\n  &= 2^{15} -2^{12} -2^{10} + 2^{8} \\\\\n  &= 32768 - 4096 - 1024 + 256 = 27904 .\n\\end{aligned}\n\\]\n\nAll these subsets are non\u2011empty (they contain at least one element from \\(R\\) and one from \\(C\\)).  \n\nHence  \n\n\\[\n\\Pr(\\text{nonempty }B\\text{ with }\\operatorname{lcm}=2025)\n   = \\frac{27904}{2^{15}}\n   = \\frac{27904}{32768}\n   = \\frac{109}{128}\\;.\n\\]\n\nSo \\(m=109\\) and \\(n=128\\); therefore  \n\n\\[\nm+n = 109+128 = 237 .\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For \\( \\triangle ABC\\) let  \n\n\\[\n\\angle A=84^{\\circ},\\qquad \\angle B=60^{\\circ},\\qquad \\angle C=36^{\\circ}.\n\\]\n\n---\n\n### 1.  Identify the points on the nine\u2011point circle  \n\n\\(D,E,F\\) are the midpoints of \\(BC,CA,AB\\); hence the circumcircle of \\(\\triangle DEF\\) is the nine\u2011point circle of \\(\\triangle ABC\\).\n\nThe nine\u2011point circle also passes through the feet of the three altitudes.\nThus  \n\n* \\(G\\) is the foot of the altitude from \\(A\\) onto \\(BC\\);  \n* \\(H\\) is the foot of the altitude from \\(B\\) onto \\(CA\\);  \n* \\(J\\) is the foot of the altitude from \\(C\\) onto \\(AB\\).\n\nSo the six points on the nine\u2011point circle are, in order,\n\\(G,\\;D,\\;E,\\;H,\\;J,\\;F\\).\n\n---\n\n### 2.  Arc \\(\\widehat{DE}\\)\n\nIn \\(\\triangle DEF\\) we have the well\u2011known midpoint\u2013parallel relations  \n\n\\[\nDF\\parallel AC,\\qquad EF\\parallel BC .\n\\]\n\nHence at \\(F\\)\n\n\\[\n\\angle DFE=\\angle(DF,EF)=\\angle(AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nFor a chord, the intercepted minor arc equals twice the inscribed angle, so  \n\n\\[\n\\widehat{DE}=2\\angle DFE=2\\cdot36^{\\circ}=72^{\\circ}.\n\\]\n\n---\n\n### 3.  Arc \\(\\widehat{FG}\\)\n\n\\(DG\\) lies on side \\(BC\\); thus \\(DG\\parallel BC\\).\nSince \\(DF\\parallel AC\\),\n\n\\[\n\\angle FDG=\\angle(DF,DG)=\\angle(AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nTherefore  \n\n\\[\n\\widehat{FG}=2\\angle FDG=2\\cdot36^{\\circ}=72^{\\circ}.\n\\]\n\n---\n\n### 4.  Arc \\(\\widehat{HJ}\\)\n\n\\(G,\\;H,\\;J\\) are the vertices of the orthic triangle.\nFor an acute triangle, the orthic triangle angles satisfy  \n\n\\[\n\\angle H G J =180^{\\circ}-2\\angle A .\n\\]\n\nHere \\(\\angle A=84^{\\circ}\\), so  \n\n\\[\n\\angle H G J =180^{\\circ}-2\\cdot84^{\\circ}=12^{\\circ}.\n\\]\n\nThe inscribed angle \\(\\angle H G J\\) intercepts the minor arc \\(\\widehat{HJ}\\); consequently  \n\n\\[\n\\widehat{HJ}=2\\angle H G J =2\\cdot12^{\\circ}=24^{\\circ}.\n\\]\n\n---\n\n### 5.  Compute the required combination  \n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ} \\\\\n&=72^{\\circ}+48^{\\circ}+216^{\\circ} \\\\\n&=336^{\\circ}.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\ng(N)=\\Big\\lfloor\\frac{N}{25}\\Big\\rfloor+\n\\Big\\lfloor\\frac{N\\bmod 25}{10}\\Big\\rfloor+(N\\bmod 25)\\bmod10\n\\]\n\nbe the number of coins the greedy algorithm uses for \\(N\\) cents.\nFor an optimal solution we may use fewer quarters.  \nWrite  \n\n\\[\nN=25q+a,\\qquad 0\\le a<25 .\n\\]\n\nIf we replace \\(k\\;(1\\le k\\le q)\\) quarters by dimes and pennies, the new\ntotal number of coins is  \n\n\\[\nc_k=(q-k)+\\Big\\lfloor\\frac{a+25k}{10}\\Big\\rfloor+(a+25k)\\bmod10 .\n\\]\n\nUsing \\(a+25k=10(2k)+ (a+5k)\\),\n\n\\[\nc_k=q+a+24k-9\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor .\n\\]\n\nThe greedy number is  \n\n\\[\ng(N)=q+a-9\\Big\\lfloor\\frac a{10}\\Big\\rfloor .\n\\]\n\nHence  \n\n\\[\nc_k-g(N)=24k-9\\Big(\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor-\n\\Big\\lfloor\\frac a{10}\\Big\\rfloor\\Big)\n        =24k-9\\,\\Big\\lfloor\\frac{5k+r}{10}\\Big\\rfloor ,\n\\]\nwhere \\(r=a\\bmod10\\) (so \\(0\\le r\\le 9\\)).\n\nThe greedy algorithm fails iff there exists a \\(k\\ge1\\) with \\(c_k<g(N)\\),\ni.e.\n\n\\[\n24k<9\\Big\\lfloor\\frac{5k+r}{10}\\Big\\rfloor\n\\iff \n\\Big\\lfloor\\frac{5k+r}{10}\\Big\\rfloor>\\frac{2k}{3}.\n\\]\n\nFor \\(k\\ge2\\) the left\u2011hand side grows like \\(0.5k\\) while the right\nhand side grows like \\(0.666\\!k\\); the inequality never holds.\nFor \\(k=1\\) the condition becomes  \n\n\\[\n\\Big\\lfloor\\frac{5+r}{10}\\Big\\rfloor\\ge1\\iff r\\ge5 .\n\\]\n\nThus **greedy fails exactly when**  \n\n* \\(N\\ge25\\) (so at least one quarter is used), and  \n* \\(a\\bmod10\\ge5\\), i.e. the remainder \\(a=N\\bmod25\\) lies in  \n\n\\[\n\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\n---\n\n### Counting the failures\n\nFor each of the 10 bad remainders \\(a\\) the numbers\n\\(N=a+25k\\) with \\(k\\ge1\\) and \\(N\\le1000\\) are failures.\nSince \\(1000- a<1000\\) we have  \n\n\\[\n\\Big\\lfloor\\frac{1000-a}{25}\\Big\\rfloor = 39\\quad (a\\ge1).\n\\]\n\nHence each bad remainder contributes 39 failing values, giving  \n\n\\[\n10\\times39 = 390\n\\]\n\nfailing numbers.\n\n---\n\n### Total successes\n\nThere are \\(1000\\) integers from 1 to 1000, therefore\n\n\\[\n\\text{successful }N = 1000-390 = 610 .\n\\]\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the vertices of the regular \\(24\\)-gon be numbered \\(0,1,\\dots ,23\\) clockwise.  \nIf a segment joins vertex \\(i\\) with vertex \\(j\\) then the (shorter) distance\n\\(\\min\\{\\,|i-j|,24-|i-j|\\,\\}\\) is a number \\(k\\) with  \n\n\\[\n1\\le k\\le 12 .\n\\]\n\nAll 12 segments must have the same length, so they must all have the same\nstep\u2011size \\(k\\).  \nFor a fixed \\(k\\) consider the graph \\(G_k\\) whose edges are exactly the\n\\(24\\) chords \\(\\{i,i+k\\}\\;(i=0,\\dots ,23)\\) (the pair \\(\\{i,i+k\\}\\) is the same\nas \\(\\{i+k,i\\}\\)).  \n\n--------------------------------------------------------------------\n### 1.  Structure of \\(G_k\\)\n\nLet  \n\n\\[\nd=\\gcd(24,k),\\qquad L=\\frac{24}{d}.\n\\]\n\nStarting from a vertex \\(i\\) and repeatedly adding \\(k\\) modulo \\(24\\) we obtain\nthe cycle  \n\n\\[\ni,\\; i+k,\\; i+2k,\\dots ,i+(L-1)k .\n\\]\n\nThus \\(G_k\\) splits into \\(d\\) disjoint cycles, each of length \\(L\\).\n\n- If \\(k\\neq 12\\) then \\(i+k\\neq i-k\\) and each vertex has degree \\(2\\); the\ncomponents are simple cycles.\n- For \\(k=12\\) each vertex is paired only with its opposite vertex, so the\ncomponents are single edges (a perfect matching already).\n\n--------------------------------------------------------------------\n### 2.  When does a perfect matching exist?\n\nA perfect matching on a cycle exists only when the cycle length is even.\nHence we need \\(L\\) even, i.e.  \n\n\\[\n\\frac{24}{d}\\text{ is even}\\iff d\\mid 12 .\n\\]\n\nTherefore a perfect matching is possible for all \\(k\\) whose\n\\(\\gcd(24,k)\\) belongs to \\(\\{1,2,3,4,6,12\\}\\).  \nThe only value of \\(k\\) with \\(\\gcd(24,k)=8\\) is \\(k=8\\); for this step size\n\\(L=3\\) (odd) and no perfect matching exists.\n\n--------------------------------------------------------------------\n### 3.  Number of perfect matchings for a given \\(k\\)\n\n- **Case \\(k\\neq 12\\).**  \n  The graph consists of \\(d\\) even cycles of length \\(L\\).  \n  Each even cycle has exactly two perfect matchings (choose the \u201codd\u201d or the\n  \u201ceven\u201d edges).  \n  Hence the number of perfect matchings using step size \\(k\\) is  \n\n  \\[\n  N(k)=2^{d}=2^{\\gcd(24,k)} .\n  \\]\n\n- **Case \\(k=12\\).**  \n  The edges are the 12 diameters \\(\\{i,i+12\\}\\).  \n  This already is a unique perfect matching, so \\(N(12)=1\\).\n\n--------------------------------------------------------------------\n### 4.  Summation over all possible step sizes\n\nThe admissible step sizes are  \n\n\\[\nk=1,2,3,4,5,6,7,9,10,11,12  \\qquad(k=8\\text{ is excluded}).\n\\]\n\nTheir contributions are:\n\n\\[\n\\begin{array}{c|c|c}\nk & \\gcd(24,k) & N(k)\\\\ \\hline\n1 & 1 & 2\\\\\n2 & 2 & 4\\\\\n3 & 3 & 8\\\\\n4 & 4 & 16\\\\\n5 & 1 & 2\\\\\n6 & 6 & 64\\\\\n7 & 1 & 2\\\\\n9 & 3 & 8\\\\\n10& 2 & 4\\\\\n11& 1 & 2\\\\\n12&12 & 1\n\\end{array}\n\\]\n\nAdding them:\n\n\\[\n2+4+8+16+2+64+2+8+4+2+1 = 113 .\n\\]\n\n--------------------------------------------------------------------\n### 5.  Answer\n\nThus there are  \n\n\\[\n\\boxed{113}\n\\]\n\ndifferent ways to draw 12 equal\u2011length segments so that each of the 24\nvertices is an endpoint of exactly one segment.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nr_i=A_1A_i\\qquad(2\\le i\\le 11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}\\;(2\\le i\\le 10).\n\\]\n\n---\n\n### 1.  Data from the triangles  \n\n\\[\n\\cos\\theta=\\frac{12}{13},\\qquad \n\\sin\\theta=\\sqrt{1-\\left(\\frac{12}{13}\\right)^2}= \\frac{5}{13}.\n\\]\n\nThe area of \\(\\triangle A_iA_1A_{i+1}\\) is  \n\n\\[\n\\frac12 r_i r_{i+1}\\sin\\theta =1\n\\Longrightarrow r_i r_{i+1}= \\frac{2}{\\sin\\theta}\n               = \\frac{2}{5/13}= \\frac{26}{5}\\; .\n\\tag{1}\n\\]\n\nHence for all \\(i=2,\\dots ,10\\)\n\n\\[\nr_i r_{i+1}=K,\\qquad K:=\\frac{26}{5}.   \\tag{2}\n\\]\n\nFrom (2) we obtain the recurrence  \n\n\\[\nr_{i+1}= \\frac K{r_i},\\qquad\\text{so } r_{i+2}=r_i .\n\\]\n\nThus the distances from \\(A_1\\) alternate:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=x,\\qquad \nr_3=r_5=r_7=r_9=r_{11}=y,\n\\]\nwhere  \n\n\\[\nxy=K=\\frac{26}{5}.  \\tag{3}\n\\]\n\n---\n\n### 2.  Length of the other edges  \n\nFor any \\(i=2,\\dots ,10\\) the edge \\(A_iA_{i+1}\\) has length (law of cosines)\n\n\\[\n\\begin{aligned}\nd &:=A_iA_{i+1}= \n\\sqrt{r_i^{\\,2}+r_{i+1}^{\\,2}-2r_i r_{i+1}\\cos\\theta}  \\\\\n   &=\\sqrt{x^{2}+y^{2}-2xy\\frac{12}{13}}\n   =\\sqrt{x^{2}+y^{2}-\\frac{24}{13}K}.\n\\end{aligned}\n\\tag{4}\n\\]\n\nAll nine edges \\(A_iA_{i+1}\\;(i=2\\ldots10)\\) have the same length \\(d\\).\n\n---\n\n### 3.  Perimeter condition  \n\nThe perimeter of the 11\u2011gon is  \n\n\\[\nx+y+9d=20.   \\tag{5}\n\\]\n\nIntroduce  \n\n\\[\nt:=x+y\\quad\\text{(the quantity we need)},\n\\qquad xy=K .\n\\]\n\nFrom \\(x^{2}+y^{2}=t^{2}-2K\\) and (4),\n\n\\[\nd^{2}=t^{2}-2K-\\frac{24}{13}K\n     =t^{2}-\\frac{50}{13}K .\n\\]\n\nSince \\(\\displaystyle \\frac{50}{13}K\n      =\\frac{50}{13}\\cdot\\frac{26}{5}=20\\),\n\n\\[\nd^{2}=t^{2}-20\\qquad\\Longrightarrow\\qquad d=\\sqrt{t^{2}-20}. \\tag{6}\n\\]\n\nInsert (6) into (5):\n\n\\[\nt+9\\sqrt{t^{2}-20}=20. \\tag{7}\n\\]\n\n---\n\n### 4.  Solving for \\(t\\)\n\nFrom (7),\n\n\\[\n\\sqrt{t^{2}-20}= \\frac{20-t}{9}\\quad (20-t\\ge 0).\n\\]\n\nSquaring gives  \n\n\\[\nt^{2}-20=\\frac{(20-t)^{2}}{81}\n\\Longrightarrow 80t^{2}+40t-2020=0.\n\\]\n\nDividing by\u202f20,\n\n\\[\n4t^{2}+2t-101=0.\n\\]\n\nHence  \n\n\\[\nt=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n   =\\frac{-2\\pm18\\sqrt5}{8}.\n\\]\n\nOnly the positive root is admissible:\n\n\\[\nt=\\frac{18\\sqrt5-2}{8}\n  =\\frac{9\\sqrt5-1}{4}.\n\\]\n\nThus  \n\n\\[\nA_1A_2+A_1A_{11}=t=\\frac{9\\sqrt5-1}{4}\n     =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\n---\n\n### 5.  Required sum  \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **1.  Regions produced by line\u2011segments**\n\nIf a set of line segments inside a disc has no three of them meeting at the same interior point, then  \n\n\\[\n\\text{#regions}=1+\\;(\\text{#segments})+\\;(\\text{# interior intersection points}).\n\\]\n\nHence for our problem  \n\n\\[\nR=1+27+I ,\n\\]\n\nwhere \\(I\\) is the (random) number of interior intersection points.  \nWe must compute the expected value \\(E[I]\\).\n\n--------------------------------------------------------------------\n\n**2.  The three kinds of interior intersections**\n\n* the two diameters intersect once (deterministically);\n* a random chord can intersect each of the two diameters;\n* two random chords can intersect one another.\n\nSo  \n\n\\[\nE[I]=1+E[\\text{chord\u2013diameter intersections}]\n      +E[\\text{chord\u2013chord intersections}].\n\\]\n\n--------------------------------------------------------------------\n\n**3.  Probability that a random chord meets a given diameter**\n\nThe two endpoints of a chord are chosen uniformly on the circle but must lie in *different* quadrants.\nThere are \\(\\binom{4}{2}=6\\) unordered pairs of quadrants, all equally likely.\n\nA chord meets the horizontal diameter iff its endpoints lie in opposite\nhalf\u2011planes (one in the upper half, one in the lower half).  \nAmong the six unordered pairs, the four pairs  \n\\(\\{Q_1,Q_3\\},\\{Q_1,Q_4\\},\\{Q_2,Q_3\\},\\{Q_2,Q_4\\}\\) have this property, so\n\n\\[\nP(\\text{chord meets a given diameter})=\\frac{4}{6}= \\frac23 .\n\\]\n\nThe same holds for the vertical diameter.  \nThus a single random chord contributes on average\n\n\\[\n2\\cdot\\frac23=\\frac43\n\\]\n\nintersections with the two diameters.  \n\nFor the 25 chords\n\n\\[\nE[\\text{chord\u2013diameter intersections}]\n      =25\\cdot\\frac43=\\frac{100}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**4.  Distribution of a chord\u2019s quadrant pair**\n\nLet a chord be called  \n\n* **adjacent** if it joins two adjacent quadrants (four such unordered pairs);\n* **opposite** if it joins opposite quadrants (two such unordered pairs).\n\n\\[\nP(\\text{adjacent})=\\frac{4}{6}= \\frac23,\\qquad \nP(\\text{opposite})=\\frac{2}{6}= \\frac13 .\n\\]\n\n--------------------------------------------------------------------\n\n**5.  Probability that two random chords intersect**\n\nPick two chords independently.  Let their unordered quadrant pairs be \\(S\\) and\n\\(T\\).  There are three possibilities for the relationship between \\(S\\) and \\(T\\).\n\n| Relation of \\(S,T\\) | Probability | Intersection probability |\n|----------------------|-------------|---------------------------|\n| **identical** (\\(S=T\\)) | \\(\\displaystyle\\frac16\\) | \\(\\displaystyle\\frac12\\) |\n| **share exactly one quadrant** | \\(\\displaystyle\\frac{2}{3}\\) | \\(\\displaystyle\\frac12\\) |\n| **disjoint** (complementary sets) | \\(\\displaystyle\\frac16\\) | \\(\\displaystyle\\frac13\\) |\n\n*Proof of the numbers*  \n\n*Identical*: both chords lie in the same two intervals, say \\([0,1)\\) and \\([1,2)\\).  \nIf the endpoints are \\(A\\in[0,1),B\\in[1,2)\\) and \\(C\\in[0,1),D\\in[1,2)\\),\nthe chords intersect iff exactly one of \\(C,D\\) lies on the clockwise arc from\n\\(A\\) to \\(B\\).  A short calculation gives probability \\(1/2\\).\n\n*Share one quadrant*: suppose the common quadrant is \\([0,1)\\) and the other\nendpoints are in \\([1,2)\\) and \\([2,3)\\) (or \\([3,4)\\)).  The second endpoint\nnever lies on the clockwise arc from the first endpoint to its partner, so the\nchords intersect iff the other point in the common quadrant lies on that arc,\nwhich happens with probability \\(1/2\\).\n\n*Disjoint*: the only way for two disjoint pairs to intersect is when both are\nopposite pairs (e.g. \\(\\{0,2\\}\\) and \\(\\{1,3\\}\\)); then the order of the four\npoints around the circle is forced to be alternating, so the chords always\nintersect.  This occurs for one\u2011third of the disjoint cases, hence conditional\nprobability \\(1/3\\).\n\nPutting the three cases together,\n\n\\[\nP(\\text{two chords intersect})=\n\\frac16\\!\\left(\\frac12\\right)+\\frac23\\!\\left(\\frac12\\right)+\\frac16\\!\\left(\\frac13\\right)\n      =\\frac{17}{36}.\n\\]\n\n--------------------------------------------------------------------\n\n**6.  Expected chord\u2013chord intersections**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of the 25 chords, so\n\n\\[\nE[\\text{chord\u2013chord intersections}]\n      =300\\cdot\\frac{17}{36}= \\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**7.  Total expected interior intersections**\n\n\\[\nE[I]=1\\;(\\text{diameters})+\\frac{100}{3}\\;(\\text{chord\u2013diameter})\n      +\\frac{425}{3}\\;(\\text{chord\u2013chord})\n      =\\frac{525}{3}+1 =176 .\n\\]\n\n--------------------------------------------------------------------\n\n**8.  Expected number of regions**\n\nFinally\n\n\\[\nE[R]=1+(\\text{#segments})+E[I]\n     =1+27+176 = 204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nf(x)=\\sin\\!\\bigl(7\\pi\\sin 5x\\bigr)\n\\qquad (0<x<2\\pi)\n\\]\n\n---\n\n### 1.  Zeros of \\(f\\)\n\n\\(f(x)=0\\) when  \n\n\\[\n\\sin\\bigl(7\\pi\\sin 5x\\bigr)=0\n\\Longrightarrow 7\\pi\\sin 5x=k\\pi \\;(k\\in\\mathbb Z)\n\\Longrightarrow \\sin 5x=\\frac{k}{7}.\n\\]\n\nSince \\(|\\sin5x|\\le1\\), we must have \\(k=-7,-6,\\ldots,6,7\\) \u2013 15 possible integers.\n\nPut \\(y=5x\\).  \nThen \\(y\\in(0,10\\pi)\\) and we need the number of solutions of  \n\n\\[\n\\sin y = \\frac{k}{7}\\qquad (k=-7,\\dots ,7).\n\\]\n\n*For \\(|k|<7,\\;k\\neq0\\):* \\(\\frac{k}{7}\\in(-1,1)\\setminus\\{0\\}\\).  \nIn each interval of length \\(2\\pi\\) there are two solutions, and \\((0,10\\pi)\\) contains exactly five such periods.  \nHence each of the 12 values \\(k=\\pm1,\\pm2,\\dots ,\\pm6\\) yields **10** solutions.\n\n*For \\(k=0\\):* \\(\\sin y=0\\Rightarrow y=m\\pi\\).  \nWith \\(0<y<10\\pi\\) we have \\(m=1,2,\\dots ,9\\) \u2192 **9** solutions.\n\n*For \\(k=7\\):* \\(\\sin y=1\\Rightarrow y=\\frac{\\pi}{2}+2\\pi n\\).  \n\\(0<y<10\\pi\\) gives \\(n=0,1,2,3,4\\) \u2192 **5** solutions.\n\n*For \\(k=-7\\):* \\(\\sin y=-1\\Rightarrow y=\\frac{3\\pi}{2}+2\\pi n\\).  \nAgain \\(n=0,1,2,3,4\\) \u2192 **5** solutions.\n\nAdding them,\n\n\\[\nn=5+5+9+12\\cdot10=139 .\n\\]\n\nThus there are \\(n=139\\) zeros of \\(f\\) in \\((0,2\\pi)\\).\n\n---\n\n### 2.  Where the graph is tangent to the \\(x\\)-axis\n\n\\(f\\) is tangent to the \\(x\\)-axis at a zero when also \\(f'(x)=0\\).\n\n\\[\nf'(x)=35\\pi\\cos 5x\\;\\cos\\bigl(7\\pi\\sin5x\\bigr).\n\\]\n\nAt a zero \\(\\sin5x=k/7\\) we have \\(\\cos\\bigl(7\\pi\\sin5x\\bigr)=\\cos(k\\pi)=(-1)^k\\neq0\\).  \nHence \\(f'(x)=0\\iff \\cos5x=0\\).\n\n\\(\\cos5x=0\\) implies \\(\\sin5x=\\pm1\\); therefore \\(k=\\pm7\\).\n\nThus tangency occurs exactly at the solutions found for \\(k=7\\) and \\(k=-7\\).\n\n- For \\(k=7\\): 5 solutions.\n- For \\(k=-7\\): 5 solutions.\n\nHence  \n\n\\[\nt=5+5=10.\n\\]\n\n---\n\n### 3.  Required sum\n\n\\[\nn+t = 139+10 = 149.\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The numbers  \n\n\\[\n17_b = 1\\cdot b + 7 = b+7 ,\\qquad \n97_b = 9\\cdot b + 7 .\n\\]\n\nWe need  \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nLet  \n\n\\[\nd=b+7 \\quad\\Longrightarrow\\quad b=d-7 .\n\\]\n\nThen  \n\n\\[\n9b+7 = 9(d-7)+7 = 9d-56 .\n\\]\n\nThus  \n\n\\[\nd \\mid 9d-56 \\;\\Longleftrightarrow\\; d \\mid 56 .\n\\]\n\nHence \\(d\\) must be a positive divisor of \\(56\\).  \nSince the base must satisfy \\(b>9\\), we have \\(d=b+7>9+7=16\\).  \nThe divisors of \\(56\\) larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nd=28 &\\implies b=28-7=21,\\\\\nd=56 &\\implies b=56-7=49.\n\\end{aligned}\n\\]\n\nBoth \\(b=21\\) and \\(b=49\\) satisfy the original divisibility:\n\n\\[\n\\begin{aligned}\nb=21: &\\quad 17_{21}=28,\\; 97_{21}=196,\\; 196/28=7,\\\\\nb=49: &\\quad 17_{49}=56,\\; 97_{49}=448,\\; 448/56=8 .\n\\end{aligned}\n\\]\n\nThus the integer bases greater than \\(9\\) that work are \\(21\\) and \\(49\\).\n\nThe required sum is  \n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nc=\\text{# who chose chocolate},\\qquad \nv=\\text{# who chose vanilla},\\qquad \ns=\\text{# who chose strawberry}.\n\\]\n\nThe conditions give  \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\nThus \\((c,v,s)\\) must be three distinct positive integers whose sum is \\(9\\).\nThe possible triples are  \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\nFor a fixed triple \\((c,v,s)\\) the number of assignments of flavors to the 9 distinct players is the multinomial coefficient  \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nCompute each term:\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot 2}=252,\\\\[4pt]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot 6}=504,\\\\[4pt]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot 6\\cdot 2}=1260.\n\\end{aligned}\n\\]\n\nAdd them:\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\nWe need \\(N \\pmod{1000}\\):\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let a chair be occupied by a person be denoted by \\(1\\) and an empty chair by \\(0\\).\nThe condition *\u201cno person sits next to two other people\u201d* means that a\n\\(1\\) cannot have \\(1\\)\u2019s on both sides; equivalently a binary string of\nlength \\(16\\) may not contain the block \\(111\\).\n\nWe must count the binary strings of length \\(16\\) that contain exactly\n\\(8\\) ones and no occurrence of three consecutive ones.\n\n--------------------------------------------------------------------\n### 1.  Decompose the ones into blocks\n\nBecause a block of three 1\u2019s is forbidden, the ones can only appear in\nblocks of length \\(1\\) or \\(2\\).\n\nLet  \n\n* \\(b\\) = number of blocks of length \\(2\\) (doubletons)  \n* \\(a\\) = number of blocks of length \\(1\\) (singletons)\n\nThen  \n\n\\[\na+2b=8 ,\\qquad a,b\\ge 0 .\n\\]\n\nHence \\(a\\) must be even and the possible pairs \\((a,b)\\) are  \n\n\\[\n\\begin{array}{c|c|c}\nb & a & B=a+b\\\\\\hline\n0 & 8 & 8\\\\\n1 & 6 & 7\\\\\n2 & 4 & 6\\\\\n3 & 2 & 5\\\\\n4 & 0 & 4\n\\end{array}\n\\]\n\nwhere \\(B=a+b\\) is the total number of blocks of 1\u2019s.\n\n--------------------------------------------------------------------\n### 2.  Order of the blocks\n\nFor a fixed \\(b\\) (hence fixed \\(B\\)), we must decide which of the \\(B\\)\nblocks are doubletons.  This can be done in  \n\n\\[\n\\binom{B}{b}\n\\]\n\nways.\n\n--------------------------------------------------------------------\n### 3.  Distribution of the zeros\n\nThere are \\(8\\) zeros in total (because \\(16-8=8\\)).  \nBetween any two consecutive blocks there must be at least one zero.\nThus the \\(B-1\\) internal gaps already consume \\(B-1\\) zeros, leaving\n\n\\[\n8-(B-1)=9-B\n\\]\n\nzeros to be placed freely among the \\(B+1\\) gaps (the two ends and the\n\\(B-1\\) internal gaps).  By stars\u2011and\u2011bars this can be done in\n\n\\[\n\\binom{(9-B)+(B+1)-1}{B}= \\binom{9}{B}\n\\]\n\nways.\n\n--------------------------------------------------------------------\n### 4.  Count for each \\(b\\)\n\nFor each \\(b\\) we multiply the two factors:\n\n\\[\n\\begin{array}{c|c|c|c}\nb & B=8-b & \\binom{B}{b} & \\binom{9}{B} \\\\ \\hline\n0 & 8 & \\binom{8}{0}=1 & \\binom{9}{8}=9\\\\\n1 & 7 & \\binom{7}{1}=7 & \\binom{9}{7}=36\\\\\n2 & 6 & \\binom{6}{2}=15& \\binom{9}{6}=84\\\\\n3 & 5 & \\binom{5}{3}=10& \\binom{9}{5}=126\\\\\n4 & 4 & \\binom{4}{4}=1 & \\binom{9}{4}=126\n\\end{array}\n\\]\n\nMultiplying and summing:\n\n\\[\n\\begin{aligned}\nN &= 1\\cdot9 + 7\\cdot36 + 15\\cdot84 + 10\\cdot126 + 1\\cdot126\\\\\n  &= 9 + 252 + 1260 + 1260 + 126\\\\\n  &= 2907.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Modulo \\(1000\\)\n\n\\[\nN \\equiv 2907 \\pmod{1000}\\equiv 907.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nFactor the quadratic form:\n\n\\[\n12x^{2}-xy-6y^{2}\n=(3x+2y)(4x-3y)\n\\]\n\nHence a solution must satisfy one of the two linear equations  \n\n\\[\n\\begin{cases}\n3x+2y=0\\quad\\Longrightarrow\\quad x=-\\dfrac23\\,y\\\\[4pt]\n4x-3y=0\\quad\\Longrightarrow\\quad x=\\dfrac34\\,y\n\\end{cases}\n\\]\n\n---\n\n### 1.  Solutions of \\(4x-3y=0\\)\n\nWrite \\(y=4k\\) (\\(k\\in\\mathbb Z\\)). Then  \n\n\\[\nx=\\frac34y=3k .\n\\]\n\nThus the points are \\((x,y)=(3k,4k)\\).  \nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 4k\\le100 \\;\\Longrightarrow\\; -25\\le k\\le 25, \n\\qquad -100\\le 3k\\le100\\; \\text{(automatically true)} .\n\\]\n\nHence there are  \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 2.  Solutions of \\(3x+2y=0\\)\n\nWrite \\(x=2m\\) (\\(m\\in\\mathbb Z\\)). Then  \n\n\\[\ny=-\\frac32x=-3m .\n\\]\n\nThus the points are \\((x,y)=(2m,-3m)\\).  \nRequire \\(-100\\le2m\\le100\\) and \\(-100\\le -3m\\le100\\):\n\n\\[\n-50\\le m\\le 50,\\qquad -\\frac{100}{3}\\le m\\le\\frac{100}{3}\n\\;\\Longrightarrow\\; -33\\le m\\le 33 .\n\\]\n\nSo we obtain  \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 3.  Remove the double\u2011counted point\n\nBoth families contain the point \\((0,0)\\).  \nIt has been counted twice, so subtract one.\n\n\\[\n\\text{Total}=51+67-1 = 117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(p,0),\\qquad C=(0,q)\n\\]\n\nwith \\(\\angle A=90^{\\circ}\\).  \nBecause \\(BC=38\\),\n\n\\[\np^{2}+q^{2}=38^{2}=1444. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coordinates of \\(K\\) and \\(L\\)\n\n\\(K\\) is \\(14\\) from \\(A\\) and from \\(B\\); therefore it lies on the perpendicular bisector of \\(\\overline{AB}\\):\n\\[\nK=\\Bigl(\\frac p2,\\ \\sqrt{14^{2}-\\Bigl(\\frac p2\\Bigr)^{2}}\\Bigr)\n   =\\bigl(a,\\; \\sqrt{196-a^{2}}\\bigr),\\qquad a=\\frac p2 .\n\\]\n\nSimilarly \\(L\\) is \\(14\\) from \\(A\\) and from \\(C\\); thus  \n\n\\[\nL=\\Bigl(\\sqrt{14^{2}-\\Bigl(\\frac q2\\Bigr)^{2}},\\ \\frac q2\\Bigr)\n   =\\bigl(\\sqrt{196-b^{2}},\\; b\\bigr),\\qquad b=\\frac q2 .\n\\]\n\nSince \\(K\\) and \\(L\\) are also \\(14\\) apart,\n\\[\n(a-\\sqrt{196-b^{2}})^{2}+(\\sqrt{196-a^{2}}-b)^{2}=14^{2}=196 .\n\\]\n\nExpanding gives  \n\n\\[\na\\sqrt{196-b^{2}}+b\\sqrt{196-a^{2}}=98. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Solving for \\(a\\) and \\(b\\)\n\nFrom (1),\n\n\\[\np^{2}+q^{2}=4a^{2}+4b^{2}=1444 \\Longrightarrow a^{2}+b^{2}=361. \\tag{3}\n\\]\n\nLet \\(X=a^{2},\\;Y=b^{2}\\).  Then \\(X+Y=361\\).  \nSquare (2) and use \\(u^{2}=196-b^{2}=196-Y,\\;v^{2}=196-a^{2}=196-X\\):\n\n\\[\nX(196-Y)+Y(196-X)+2ab\\sqrt{(196-X)(196-Y)}=9604.\n\\]\n\nUsing \\(ab=\\sqrt{XY}\\) and (3) simplifies to  \n\n\\[\nXY(196-X)(196-Y)=(XY-30576)^{2}.\n\\]\n\nBecause \\(196-X=196-a^{2}=196-X\\) etc., after substitution and using \\(X+Y=361\\) we obtain  \n\n\\[\nXY\\bigl(-32340+XY\\bigr)=(XY-30576)^{2},\n\\]\n\nwhich yields  \n\n\\[\nXY=32448.\n\\]\n\nHence  \n\n\\[\nX+Y=361,\\qquad XY=32448.\n\\]\n\nThe quadratic \\(t^{2}-361t+32448=0\\) gives  \n\n\\[\nt=\\frac{361\\pm23}{2} \\Longrightarrow \\{X,Y\\}=\\{192,169\\}.\n\\]\n\nThus  \n\n\\[\na^{2}=192,\\;b^{2}=169\\qquad\\text{or}\\qquad a^{2}=169,\\;b^{2}=192.\n\\]\n\nTaking \\(a^{2}=192\\) (the other case is symmetric),\n\n\\[\na=8\\sqrt3,\\qquad b=13.\n\\]\n\nTherefore  \n\n\\[\nAB=2a=16\\sqrt3,\\qquad AC=2b=26,\n\\]\n\nand indeed \\(AB^{2}+AC^{2}= (16\\sqrt3)^{2}+26^{2}=768+676=1444=38^{2}\\).\n\n--------------------------------------------------------------------\n### 3.  Coordinates of the relevant points\n\n\\[\n\\begin{aligned}\nB&=(16\\sqrt3,0),\\\\\nK&=\\Bigl(8\\sqrt3,\\ \\sqrt{196-192}\\Bigr)=\\bigl(8\\sqrt3,2\\bigr),\\\\\nL&=\\Bigl(\\sqrt{196-169},\\ 13\\Bigr)=\\bigl(3\\sqrt3,13\\bigr),\\\\\nC&=(0,26).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of \\(BKLC\\)\n\nUsing the shoelace formula for the polygon \\(B\\to K\\to L\\to C\\),\n\n\\[\n\\begin{aligned}\n\\sum x_i y_{i+1}&= (16\\sqrt3)(2)+(8\\sqrt3)(13)+(3\\sqrt3)(26)+0=214\\sqrt3,\\\\\n\\sum y_i x_{i+1}&=0+(2)(3\\sqrt3)+0+(26)(16\\sqrt3)=422\\sqrt3.\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n\\operatorname{Area}= \\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n                 =\\frac12\\,(208\\sqrt3)=104\\sqrt3.\n\\]\n\n--------------------------------------------------------------------\nThus the area of quadrilateral \\(BKLC\\) is \\(104\\sqrt3\\), so  \n\n\\[\n\\boxed{104}\n\\] is the required integer \\(n\\).
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid have parallel sides (bases) \\(r\\) and \\(s\\) \\((r\\neq s)\\) and equal legs of length \\(L\\).\n\n---\n\n### 1.  Tangential condition  \n\nA quadrilateral has an incircle iff the sums of the lengths of opposite sides are equal.  \nFor the order of sides \\(r,\\,L,\\,s,\\,L\\),\n\n\\[\nr+s = L+L \\qquad\\Longrightarrow\\qquad L =\\frac{r+s}{2}.\n\\tag{1}\n\\]\n\n---\n\n### 2.  Use the given area  \n\nFor any tangential quadrilateral,  \n\n\\[\n\\text{Area}=r_{\\text{in}}\\cdot s,\n\\]\n\nwhere \\(r_{\\text{in}}\\) is the inradius and \\(s\\) is the semiperimeter.  \nHere the inradius is \\(3\\) and the area is \\(72\\):\n\n\\[\n72 = 3\\,s\\quad\\Longrightarrow\\quad s = 24 .\n\\]\n\nThe semiperimeter \\(s\\) is\n\n\\[\ns = \\frac{r+s+2L}{2}=r+s \\quad\\Longrightarrow\\quad r+s = 24. \\tag{2}\n\\]\n\nHence from (1),\n\n\\[\nL = \\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### 3.  Height of the trapezoid  \n\nThe incircle touches both parallel sides, so the distance between them (the height \\(h\\)) equals the diameter of the incircle:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\tag{3}\n\\]\n\n---\n\n### 4.  Relate the legs to the bases  \n\nBecause the trapezoid is isosceles, each leg forms a right triangle with vertical leg \\(h\\) and horizontal leg \\(\\dfrac{|r-s|}{2}\\):\n\n\\[\nL^{2}=h^{2}+\\Bigl(\\frac{r-s}{2}\\Bigr)^{2}.\n\\]\n\nInsert \\(L=12\\) and \\(h=6\\):\n\n\\[\n12^{2}=6^{2}+\\Bigl(\\frac{r-s}{2}\\Bigr)^{2}\n\\Longrightarrow\\;144=36+\\frac{(r-s)^{2}}{4}\n\\Longrightarrow\\;(r-s)^{2}=432.\n\\]\n\nThus  \n\n\\[\n|r-s|=12\\sqrt3. \\tag{4}\n\\]\n\n---\n\n### 5.  Solve for \\(r\\) and \\(s\\)\n\nFrom (2) and (4),\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\nr-s=12\\sqrt3 \\quad(\\text{take }r>s).\n\\end{cases}\n\\]\n\nHence  \n\n\\[\nr = 12+6\\sqrt3,\\qquad s = 12-6\\sqrt3 .\n\\]\n\n(If the roles of \\(r\\) and \\(s\\) are exchanged, the same values for \\(r^{2}+s^{2}\\) result.)\n\n---\n\n### 6.  Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}&=(12+6\\sqrt3)^{2}+(12-6\\sqrt3)^{2}\\\\\n&= \\bigl(144+144\\sqrt3+108\\bigr)+\\bigl(144-144\\sqrt3+108\\bigr)\\\\\n&= 252+144\\sqrt3+252-144\\sqrt3\\\\\n&= 504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The first equation  \n\n\\[\n|25+20i-z|=5\n\\]\n\nis the circle  \n\n\\[\nC:\\;(x-25)^2+(y-20)^2=5^{2}\n\\]\n\ncenter \\(C=(25,20)\\), radius \\(5\\).\n\nThe second equation  \n\n\\[\n|z-4-k| = |z-3i-k|\n\\]\n\nsays that the point \\(z\\) is equally distant from  \n\n\\[\nA=4+k\\;(= (4+k,0)) ,\\qquad B=3i+k\\;(= (k,3)).\n\\]\n\nHence the set of points satisfying the second condition is the **perpendicular bisector** of the segment \\(AB\\).\n\n---\n\n### 1. Equation of the perpendicular bisector  \n\nMidpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{4+k+k}{2},\\,\\frac{0+3}{2}\\Bigr)=\\Bigl(k+2,\\frac32\\Bigr).\n\\]\n\nSlope of \\(AB\\):\n\n\\[\n\\frac{3-0}{k-(4+k)} =\\frac{3}{-4}= -\\frac34 .\n\\]\n\nTherefore the slope of the perpendicular bisector is the negative reciprocal:\n\n\\[\nm_{\\perp}= \\frac{4}{3}.\n\\]\n\nThrough \\(M\\) the line is  \n\n\\[\ny-\\frac32 = \\frac{4}{3}\\bigl(x-(k+2)\\bigr).\n\\]\n\nMultiplying by \\(3\\) and simplifying gives the standard form  \n\n\\[\n8x-6y-(8k+7)=0.\n\\]\n\n---\n\n### 2. Tangency condition  \n\nThe distance from the centre \\(C=(25,20)\\) to this line must equal the radius \\(5\\) for the circle and the line to intersect in **exactly one point** (tangency).\n\n\\[\nd=\\frac{|\\,8\\cdot25-6\\cdot20-(8k+7)\\,|}{\\sqrt{8^{2}+(-6)^{2}}}\n   =\\frac{|\\,200-120-8k-7\\,|}{10}\n   =\\frac{|\\,73-8k\\,|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence  \n\n\\[\n73-8k = 50\\quad\\text{or}\\quad73-8k = -50.\n\\]\n\nSolving,\n\n\\[\n\\begin{cases}\n73-8k=50 &\\Longrightarrow\\; k=\\dfrac{23}{8},\\\\[4pt]\n73-8k=-50&\\Longrightarrow\\; k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values give a line tangent to the circle, so the system has exactly one solution for each.\n\n---\n\n### 3. Sum of all possible \\(k\\)\n\n\\[\nk_{1}+k_{2}= \\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\ n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For an 8\u2011digit number  \n\\[\na_1a_2a_3a_4a_5a_6a_7a_8,\n\\qquad a_i\\in\\{1,2,\\dots ,8\\},\n\\]\nusing each digit once, we need it to be divisible by \\(22 = 2\\cdot 11\\).\n\n---\n\n### 1.  Divisibility by 2  \n\nThe last digit \\(a_8\\) must be even.  \nThe even digits are \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2.  Divisibility by 11  \n\nFor an 8\u2011digit number the test is  \n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv0\\pmod{11}.\n\\]\n\nLet  \n\n\\[\nS_o=a_1+a_3+a_5+a_7,\\qquad S_e=a_2+a_4+a_6+a_8.\n\\]\n\nSince the digits \\(1,\\ldots ,8\\) are used exactly once,\n\\(S_o+S_e=1+2+\\cdots+8=36\\).  \nHence  \n\n\\[\nS_o-S_e\\equiv0\\pmod{11}\n\\Longrightarrow 2S_o\\equiv36\\pmod{11}\n\\Longrightarrow 2S_o\\equiv3\\pmod{11}.\n\\]\n\nBecause \\(2^{-1}\\equiv6\\pmod{11}\\),  \n\n\\[\nS_o\\equiv3\\cdot6\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe smallest possible sum of four distinct digits is \\(1+2+3+4=10\\) and the largest is \\(5+6+7+8=26\\); the only value in this interval congruent to \\(7\\pmod{11}\\) is \\(18\\).  \nThus we require  \n\n\\[\nS_o=S_e=18.\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 3.  Choosing the digits for odd positions  \n\nWe need 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\nEnumerating them gives  \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(m=8\\) such subsets.  \nEach contains exactly two even digits and two odd digits (otherwise the sum cannot be 18).\n\n---\n\n### 4.  Forming the numbers  \n\nFor a given subset \\(O\\) (odd\u2011position digits):\n\n* Arrange the four digits of \\(O\\) among the odd positions \\((1,3,5,7)\\): \\(4! = 24\\) ways.\n* The complement \\(E\\) (the even\u2011position digits) also has exactly two evens.\n  * Choose which even digit of \\(E\\) occupies the last position \\(a_8\\): \\(2\\) ways.\n  * Arrange the remaining three digits of \\(E\\) in positions \\(2,4,6\\): \\(3! = 6\\) ways.\n\nThus for each subset \\(O\\)\n\n\\[\n\\text{#numbers}=24\\cdot(2\\cdot 6)=24\\cdot12=288 .\n\\]\n\nSince there are \\(8\\) possible subsets,\n\n\\[\nN = 8\\cdot288 = 2304 .\n\\]\n\n---\n\n### 5.  Required difference  \n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the twelve letters be  \n\n\\[\nA<B<C<D<E<F<G<H<I<J<K<L .\n\\]\n\nA random perfect matching of the twelve letters is chosen.\nFor each pair \\(\\{x,y\\}\\) we write the two letters in alphabetical order,\nobtaining the word \\(xy\\;(x<y)\\).\nSorting the six words alphabetically gives a list whose last word is the\nlexicographically greatest.\n\n--------------------------------------------------------------------\n### 1.  What is the last word?\n\nFor a word \\(xy\\) the first letter is the smaller element of its pair.\nSince the six first letters are distinct, the last word is the word whose\npair has the **largest** smaller element.\nDenote by  \n\n\\[\ns(P)=\\min(P) \\qquad\\text{for a pair }P.\n\\]\n\nIf the pairs are \\(P_1,\\dots ,P_6\\), the last word comes from the pair  \n\n\\[\nP_{\\max} \\text{ with } s(P_{\\max})=\\max\\{s(P_1),\\dots ,s(P_6)\\}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Condition for the last word to contain \\(G\\)\n\nLet the partner of \\(G\\) be a letter \\(Y\\neq G\\).\nWrite  \n\n\\[\ns_G=\\min(G,Y).\n\\]\n\nThe last word contains \\(G\\) **iff** the smallest element of the pair that\ncontains \\(G\\) is the largest among all six minima, i.e.\n\n\\[\ns_G=\\max\\{s(P_1),\\dots ,s(P_6)\\}.\n\\tag{1}\n\\]\n\nThus we have to find the probability that condition (1) holds.\n\n--------------------------------------------------------------------\n### 3.  Conditioning on the partner of \\(G\\)\n\nIn a random perfect matching the partner of a fixed letter is uniform\namong the other eleven letters, so we may condition on the value of\n\\(Y\\).\n\n*If \\(Y>G\\)* (i.e. \\(Y\\in\\{H,I,J,K,L\\}\\)):  \n\\(s_G=G\\).  Condition (1) becomes \u201cno other pair has both letters\ngreater than \\(G\\)\u201d, because any such pair would have a minimum exceeding \\(G\\).\n\nAfter removing \\(G\\) and \\(Y\\) we have  \n\n- six letters \\(<G\\) : \\(A,B,C,D,E,F\\);\n- four letters \\(>G\\) : the remaining four of \\(\\{H,I,J,K,L\\}\\).\n\nWe must pair each of the four \u201chigh\u2019\u2019 letters with a distinct \u201clow\u2019\u2019\nletter; the two unused low letters are then paired together.\n\nNumber of such matchings  \n\n\\[\n\\binom{6}{4}\\,4!=15\\cdot 24=360 .\n\\]\n\nThe total number of matchings on the ten remaining letters is  \n\n\\[\n(10-1)!!=9\\cdot7\\cdot5\\cdot3\\cdot1=945 .\n\\]\n\nHence  \n\n\\[\n\\Pr(\\text{condition }|\\,Y>G)=\\frac{360}{945}=\\frac{8}{21}.\n\\tag{2}\n\\]\n\nThere are five possibilities for \\(Y>G\\).\n\n--------------------------------------------------------------------\n*If \\(Y<G\\)* (i.e. \\(Y\\in\\{A,B,C,D,E,F\\}\\)):  \nNow \\(s_G=Y\\).  Condition (1) says that every other pair must have a\nminimum **less than \\(Y\\)**, i.e. no pair may consist solely of letters\ngreater than \\(Y\\).\n\nLet the rank of \\(Y\\) be \\(y\\;(1\\le y\\le 6)\\).  \nAmong the ten remaining letters we have  \n\n- \\(y-1\\) letters \\(<Y\\);\n- \\(11-y\\) letters \\(>Y\\) (the letters greater than \\(Y\\) except the removed\n\\(G\\)).\n\nFor the condition to be possible we need at least as many letters\n\\(<Y\\) as letters \\(>Y\\); this occurs only when \\(y=6\\), i.e. \\(Y=F\\).\n\nWhen \\(Y=F\\) the remaining letters are  \n\n- five letters \\(<F\\): \\(A,B,C,D,E\\);\n- five letters \\(>F\\): \\(H,I,J,K,L\\).\n\nAgain every \u201chigh\u2019\u2019 letter must be paired with a distinct \u201clow\u2019\u2019 letter,\ngiving exactly  \n\n\\[\n5! =120\n\\]\n\nacceptable matchings.  Therefore  \n\n\\[\n\\Pr(\\text{condition }|\\,Y=F)=\\frac{120}{945}= \\frac{8}{63},\n\\tag{3}\n\\]\n\nand for \\(Y=A,B,C,D,E\\) the probability is \\(0\\).\n\n--------------------------------------------------------------------\n### 4.  Overall probability\n\nUsing that the partner of \\(G\\) is uniformly one of the other eleven\nletters,\n\n\\[\n\\begin{aligned}\n\\Pr(\\text{last word contains }G)\n&=\\frac1{11}\\Bigl(\n5\\cdot\\frac{8}{21}\n+\\frac{8}{63}\n+0+0+0+0+0\\Bigr)\\\\[2mm]\n&=\\frac1{11}\\Bigl(\\frac{40}{21}+\\frac{8}{63}\\Bigr)\n   =\\frac1{11}\\Bigl(\\frac{120}{63}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&=\\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\frac{128}{693}\\) is already in lowest terms\n(\\(\\gcd(128,693)=1\\)).\n\nThus  \n\n\\[\nm=128,\\qquad n=693,\\qquad m+n=821.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nC:\\;y=x^{2}-4\n\\]\n\nbe the given parabola.  \nRotate \\(C\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin.  \nIf a point \\((x,y)\\) lies on both \\(C\\) and its rotated image, then rotating \\((x,y)\\) **clockwise** by \\(60^{\\circ}\\) must again land on \\(C\\).\n\n---\n\n### 1.  The rotation equations  \n\nFor a clockwise rotation of \\(60^{\\circ}\\),\n\n\\[\n\\begin{aligned}\nx'&=x\\cos60^{\\circ}+y\\sin60^{\\circ}= \\tfrac12 x+\\tfrac{\\sqrt3}{2}y,\\\\[2mm]\ny'&=-x\\sin60^{\\circ}+y\\cos60^{\\circ}= -\\tfrac{\\sqrt3}{2}x+\\tfrac12 y .\n\\end{aligned}\n\\]\n\nThe condition \u201cthe rotated point lies on \\(C\\)\u201d is\n\n\\[\ny'=(x')^{2}-4 .\n\\]\n\nSubstituting \\(y=x^{2}-4\\) (since \\((x,y)\\in C\\)) gives a single equation in \\(x\\).\n\n---\n\n### 2.  Obtain the equation in \\(x\\)\n\nPut \\(\\displaystyle s=\\frac{\\sqrt3}{2},\\ c=\\frac12\\).  \nThen\n\n\\[\n\\begin{aligned}\nx' &=c\\,x+s\\,(x^{2}-4)= s x^{2}+c x-4s,\\\\[1mm]\ny' &=-s\\,x+c\\,(x^{2}-4)=c x^{2}-s x-4c .\n\\end{aligned}\n\\]\n\nThe condition \\(y'= (x')^{2}-4\\) becomes\n\n\\[\nc x^{2}-s x-4c =\\bigl(s x^{2}+c x-4s\\bigr)^{2}-4 .\n\\]\n\nInsert \\(c=\\tfrac12,\\ s=\\tfrac{\\sqrt3}{2}\\) and clear denominators (multiply by \\(4\\)):\n\n\\[\n2x^{2}-2\\sqrt3\\,x-8 = \\bigl(\\sqrt3\\,x^{2}+x-4\\sqrt3\\bigr)^{2}-4 .\n\\]\n\nAfter simplifying we obtain the quartic\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0 .\n\\]\n\n---\n\n### 3.  Factor the quartic\n\nTrying a factorisation \\((3x^{2}+Bx+C)(x^{2}+Ex+F)\\) with\n\\(B,E\\) multiples of \\(\\sqrt3\\), we find\n\n\\[\n\\boxed{(3x^{2}-\\sqrt3\\,x-10)(x^{2}+\\sqrt3\\,x-4)=0}.\n\\]\n\nHence the possible \\(x\\)-coordinates are the roots of\n\n\\[\n\\begin{cases}\n3x^{2}-\\sqrt3\\,x-10=0,\\\\[1mm]\nx^{2}+\\sqrt3\\,x-4=0 .\n\\end{cases}\n\\]\n\nSolving:\n\n\\[\n\\begin{aligned}\n3x^{2}-\\sqrt3\\,x-10=0 &\\Longrightarrow \nx=\\dfrac{\\sqrt3\\pm\\sqrt{123}}6\\;( \\approx 2.14,\\ -1.56),\\\\[2mm]\nx^{2}+\\sqrt3\\,x-4=0 &\\Longrightarrow \nx=\\dfrac{-\\sqrt3\\pm\\sqrt{19}}2\\;( \\approx 1.31,\\ -3.05).\n\\end{aligned}\n\\]\n\n---\n\n### 4.  Identify the point in the fourth quadrant  \n\nThe fourth quadrant requires \\(x>0\\) and \\(y<0\\).  \nOnly  \n\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2 \\approx 1.31\n\\]\n\nsatisfies these conditions (the other positive root gives \\(x>2\\) and \\(y>0\\)).  \n\nThus the intersection point in the fourth quadrant is\n\n\\[\n\\bigl(x,\\;y\\bigr)=\\left(\\frac{-\\sqrt3+\\sqrt{19}}2,\\;\n\\left(\\frac{-\\sqrt3+\\sqrt{19}}2\\right)^{\\!2}-4\\right).\n\\]\n\nCompute \\(y\\):\n\n\\[\n\\begin{aligned}\ny&=\\frac{(-\\sqrt3+\\sqrt{19})^{2}}{4}-4\n   =\\frac{3+19-2\\sqrt{57}}{4}-4\n   =\\frac{22-2\\sqrt{57}}{4}-4 \\\\\n  &=\\frac{11}{2}-\\frac{\\sqrt{57}}2-4\n   =\\frac{3-\\sqrt{57}}{2}.\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\ny=\\frac{\\,3-\\sqrt{57}\\,}{2}\n\\]\n\nwhich matches the required form \\(\\displaystyle \\frac{a-\\sqrt b}{c}\\) with  \n\n\\[\na=3,\\qquad b=57,\\qquad c=2.\n\\]\n\n\\(a\\) and \\(c\\) are relatively prime, as required.\n\n---\n\n### 5.  Compute \\(a+b+c\\)\n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Sketch**\n\n1. **Placing the pentagon.**  \n   Put \\(B=(0,0)\\) and let \\(BC\\) be the segment on the \\(x\\)-axis, so \\(C=(7,0)\\).  \n   Since \\(\\angle B=60^{\\circ}\\) and \\(AB=14\\),\n\n\\[\nA=\\bigl(7,\\;7\\sqrt3 \\bigr).\n\\]\n\n   Using the law of cosines in \\(\\triangle ABC\\) we obtain \\(AC=7\\sqrt3\\); thus\n\\(\\triangle ABC\\) is a \\(30\\!-\\!60\\!-\\!90\\) right triangle with right angle at \\(C\\).\n\n   In the same way the data at \\(E\\) give a similar \\(30\\!-\\!60\\!-\\!90\\) triangle\n\\(\\triangle AED\\) with right angle at \\(D\\), giving  \n\n\\[\nAE=26,\\qquad DE=13,\\qquad AD=13\\sqrt3 .\n\\]\n\n   Solving the two circles \\((A,13\\sqrt3)\\) and \\((C,24)\\) yields  \n\n\\[\nD=\\Bigl(\\frac{205}{7},\\;\\frac{36\\sqrt3}{7}\\Bigr),\\qquad\nE=\\Bigl(\\frac{218}{7},\\;\\frac{88\\sqrt3}{7}\\Bigr).\n\\]\n\n2. **A useful line.**  \n   Points \\(B\\) and \\(E\\) are joined by the segment \\(BE\\) of length  \n\n\\[\nBE=\\frac{266}{7}=38 .\n\\]\n\n   For any point \\(X\\) on the line \\(BE\\) we have, by the triangle inequality,\n\\[\nXB+XE=BE=38 .\n\\]\n\n   Hence for \\(X\\in BE\\)\n\n\\[\nf(X)=XB+XE+AX+CX+DX=38+AX+CX+DX .\n\\]\n\n   Therefore the problem reduces to minimizing  \n\n\\[\ng(X)=AX+CX+DX\\qquad (X\\in BE).\n\\]\n\n3. **Parameterising the line.**  \n   Write \\(X\\) as  \n\n\\[\nX(t)=\\Bigl(\\frac{218}{7}t,\\;\\frac{88\\sqrt3}{7}t\\Bigr),\\qquad 0\\le t\\le 1 .\n\\]\n\n   Direct computation gives  \n\n\\[\n\\begin{aligned}\nAX^2&=\\frac{4\\cdot79-28t+1444t^{2}}{9},\\\\[2mm]\nCX^2&=\\frac{577-158t+1444t^{2}}{9},\\\\[2mm]\nDX^2&=\\frac{3241-1106t+1444t^{2}}{9}.\n\\end{aligned}\n\\]\n\n   The function \\(g(t)=\\sqrt{AX^2}+\\sqrt{CX^2}+\\sqrt{DX^2}\\) is convex,\nso its minimum occurs where \\(g'(t)=0\\).\n\n4. **Finding the minimizing \\(t\\).**  \n   Using the derivative formula for a distance,\n\\( \\dfrac{d}{dt}\\sqrt{at^{2}+bt+c}=\n \\dfrac{2at+b}{2\\sqrt{at^{2}+bt+c}}\\),\nthe condition \\(g'(t)=0\\) becomes\n\n\\[\n\\frac{1444t-482}{\\sqrt{4\\cdot79-28t+1444t^{2}}}\n+\\frac{1444t-218}{\\sqrt{577-158t+1444t^{2}}}\n+\\frac{1444t-1106}{\\sqrt{3241-1106t+1444t^{2}}}=0 .\n\\]\n\n   Substituting \\(t=\\dfrac13\\) makes each numerator a multiple of\n\\(2,\\,790,\\,-1874\\) respectively, and a short computation shows the\nleft\u2011hand side to be zero.  Because of convexity, \\(t=\\dfrac13\\) gives the\nglobal minimum.\n\n5. **The minimum value.**  \n   For \\(t=\\dfrac13\\),\n\n\\[\n\\begin{aligned}\nAX&=\\frac{2\\sqrt{79}}{3},\\\\[1mm]\nCX&=\\frac{\\sqrt{577}}{3},\\\\[1mm]\nDX&=\\frac{\\sqrt{3241}}{3}.\n\\end{aligned}\n\\]\n\n   A direct squaring shows\n\n\\[\n2\\sqrt{79}+ \\sqrt{577}+ \\sqrt{3241}=57\\sqrt3 ,\n\\]\n\n   therefore  \n\n\\[\ng_{\\min}= \\frac{57\\sqrt3}{3}=19\\sqrt3 .\n\\]\n\n   Adding the constant part \\(XB+XE=38\\) gives the least possible value of\n\\(f\\):\n\n\\[\nf_{\\min}=38+19\\sqrt3 .\n\\]\n\n6. **Answer.**  \n   The expression is of the form \\(m+n\\sqrt p\\) with\n\\(m=38,\\;n=19,\\;p=3\\).  Hence\n\n\\[\nm+n+p = 38+19+3 = 60 .\n\\]\n\n\\[\n\\boxed{60}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 60

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution**\n\nLet  \n\n\\[\nM=3^{7}=2187 ,\\qquad L=3^{6}=729 .\n\\]\n\nAll ordered triples \\((a,b,c)\\) satisfy  \n\n\\[\nN=\\#\\{1\\le a,b,c\\le L\\;|\\;a^{3}+b^{3}+c^{3}\\equiv 0\\pmod{M}\\}.\n\\]\n\n--------------------------------------------------------------------\n### 1.   The cubes modulo \\(M\\)\n\nWrite a positive integer \\(a\\) as  \n\n\\[\na=3^{v}\\,u ,\\qquad v=v_{3}(a)\\in\\{0,1,2,3,4,5,6\\},\n\\qquad 3\\nmid u .\n\\]\n\n*If \\(v\\ge 3\\) then \\(a^{3}\\equiv0\\pmod{M}\\).  \nIf \\(v=2\\) then \\(a^{3}\\equiv729\\,u\\pmod{M}\\) and, because\n\\(u\\equiv\\pm1\\pmod3\\),\n\n\\[\na^{3}\\equiv\\begin{cases}\n729 & u\\equiv1\\pmod3,\\\\[2mm]\n1458& u\\equiv2\\pmod3 .\n\\end{cases}\n\\]\n\n*If \\(v=1\\) then \\(a=3u\\;(3\\nmid u\\le 243)\\) and  \n\n\\[\na^{3}\\equiv27\\,u^{3}\\pmod{M}.\n\\]\n\nSince \\(27\\cdot81=M\\), only \\(u^{3}\\pmod{81}\\) matters.  The\nset of cubic residues modulo \\(81\\) among the units is  \n\n\\[\nR_{4}=\\{x\\in\\mathbb Z/81\\;|\\;x\\equiv\\pm1\\pmod9\\},\n\\qquad |R_{4}|=18 .\n\\]\n\nEach element of \\(R_{4}\\) occurs exactly three times among the\n\\(162\\) numbers \\(u\\) (the three residue\u2011classes modulo \\(81\\));\nhence each value \\(27r\\;(r\\in R_{4})\\) occurs \\(9\\) times.\n\n*If \\(v=0\\) (i.e. \\(3\\nmid a\\)), then \\(a^{3}\\) runs through the\ncubic residues among the units modulo \\(M\\)\n\n\\[\nR_{7}=\\{x\\in\\mathbb Z/M\\;|\\;x\\equiv\\pm1\\pmod9\\},\n\\qquad |R_{7}|=486 ,\n\\]\n\neach occurring **once**.\n\nSummarising, the multiset of residues \\(\\{a^{3}\\pmod M\\}\\) is\n\n| residue type | number of residues | multiplicity |\n|---|---|---|\n| \\(x\\in R_{7}\\) | \\(486\\) | \\(1\\) |\n| \\(27r,\\,r\\in R_{4}\\) | \\(18\\) | \\(9\\) |\n| \\(729\\) | \\(1\\) | \\(27\\) |\n| \\(1458\\) | \\(1\\) | \\(27\\) |\n| \\(0\\) | \\(1\\) | \\(27\\) |\n| total | \\(729\\) | \u2013 |\n\n--------------------------------------------------------------------\n### 2.   Fourier representation\n\nPut  \n\n\\[\n\\zeta =e^{2\\pi i/M}, \\qquad \nS(k)=\\sum_{a=1}^{L}\\zeta^{k a^{3}}\n      =\\sum_{x}f(x)\\,\\zeta^{k x},\n\\]\n\nwhere \\(f(x)\\) is the multiplicity of the residue \\(x\\) listed above.\nOrthogonality of characters gives  \n\n\\[\nN=\\frac1{M}\\sum_{k=0}^{M-1}S(k)^{3}\\tag{1}\n\\]\n\nand we have to evaluate the sum on the right.\n\n--------------------------------------------------------------------\n### 3.   Explicit form of \\(S(k)\\)\n\nWrite \\(k=3^{v}t\\;(3\\nmid t)\\).  \nThe three kinds of contributions are\n\n* from \\(R_{7}\\) (cubic residues modulo \\(M\\))  \n\n\\[\nS_{7}(k)=\\sum_{x\\in R_{7}}\\zeta^{k x}\n       =\\begin{cases}\n       486\\cos\\frac{2\\pi t}{9},&3^{5}\\mid k,\\\\\n       0,&\\text{otherwise}.\n       \\end{cases}\n\\]\n\n* from the residues \\(27r\\) (\\(r\\in R_{4}\\))  \n\n\\[\n9S_{4}(k)=9\\sum_{r\\in R_{4}}\\zeta^{27k r}\n        =\\begin{cases}\n        162\\cos\\frac{2\\pi t}{9},&9\\mid k,\\\\\n        0,&\\text{otherwise}.\n        \\end{cases}\n\\]\n\n* from the three \u201cfixed\u2019\u2019 residues \\(0,\\,729,\\,1458\\)  \n\n\\[\nS_{2}(k)+S_{3}(k)=27\\bigl(\\zeta^{729k}+\\zeta^{1458k}+1\\bigr)\n                =\\begin{cases}\n                81,&3\\mid k,\\\\[2mm]\n                0,&3\\nmid k .\n                \\end{cases}\n\\]\n\nHence\n\n\\[\nS(k)=S_{7}(k)+9S_{4}(k)+\n\\begin{cases}\n81,&3\\mid k,\\\\\n0,&3\\nmid k .\n\\end{cases}\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 4.   Values of \\(S(k)\\)\n\nAccording to the 3\u2011adic valuation \\(v=v_{3}(k)\\) we obtain\n\n| \\(v\\) | condition on \\(k\\) | \\(S(k)\\) |\n|---|---|---|\n| \\(0\\) | \\(3\\nmid k\\) | \\(0\\) |\n| \\(1\\) | \\(3\\mid k,\\;9\\nmid k\\) | \\(81\\) |\n| \\(2\\) | \\(9\\mid k,\\;27\\nmid k\\) | \\(81\\bigl(1+2\\cos\\frac{2\\pi u}{9}\\bigr)\\)  \\(\\;(u=k/9\\bmod9\\neq0,3,6)\\) |\n| \\(3\\) | \\(27\\mid k,\\;81\\nmid k\\) | \\(0\\) |\n| \\(4\\) | \\(81\\mid k,\\;243\\nmid k\\) | \\(243\\) |\n| \\(5\\) | \\(243\\mid k,\\;729\\nmid k\\) | \\(243\\bigl(1+2\\cos\\frac{2\\pi t}{9}\\bigr)\\) \\(\\;(t=k/243\\bmod9\\neq0,3,6)\\) |\n| \\(6\\) | \\(729\\mid k\\) | \\(0\\) |\n| \\(k=0\\) | \u2013 | \\(S(0)=729\\) |\n\nThe numbers of \\(k\\) having each valuation are  \n\n\\[\n\\begin{aligned}\n&v=0:1458,\\quad v=1:486,\\quad v=2:162,\\\\\n&v=3:54,\\quad v=4:18,\\quad v=5:6,\\quad v=6:2 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5.   Summation of \\(S(k)^{3}\\)\n\nDenote  \n\n\\[\nC=\\sum_{u\\in\\{1,2,4,5,7,8\\}}\\bigl(1+2\\cos\\tfrac{2\\pi u}{9}\\bigr)^{3}.\n\\]\n\nUsing the identity  \n\n\\[\n\\sum_{u\\in\\{1,2,4,5,7,8\\}}\\bigl(1+2\\cos\\tfrac{2\\pi u}{9}\\bigr)^{3}=36,\n\\]\n\n(which follows from expanding \\((1+z^{u}+z^{-u})^{3}\\) and summing over\n\\(u\\) with \\(z=e^{2\\pi i/9}\\)), we obtain\n\n\\[\n\\begin{aligned}\n\\sum_{k}S(k)^{3}\n&= 486\\cdot81^{3}\n   +162\\cdot81^{3}\n   +18\\cdot243^{3}\n   +6\\cdot243^{3}                                 \\\\\n&= 486\\cdot531\\,441\n   +162\\cdot531\\,441\n   +18\\cdot14\\,348\\,907\n   +6\\cdot14\\,348\\,907                           \\\\\n&=5\\cdot3^{18}=5\\cdot387\\,420\\,489\n   =1\\,937\\,102\\,445 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 6.   The number \\(N\\)\n\nFrom (1),\n\n\\[\nN=\\frac{1}{3^{7}}\\sum_{k}S(k)^{3}\n  =\\frac{5\\cdot3^{18}}{3^{7}}\n  =5\\cdot3^{11}=5\\cdot177\\,147=885\\,735 .\n\\]\n\n--------------------------------------------------------------------\n### 7.   Remainder modulo \\(1000\\)\n\n\\[\n885\\,735 \\equiv 735 \\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{735}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 735

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \\frac{N(x)}{x},\n\\qquad N(x)=(x-18)(x-72)(x-98)(x-k)\n\\]\n\nfor \\(x>0\\) and a positive parameter \\(k\\).\n\n--------------------------------------------------------------------\n### 1.  Critical points\n\n\\[\nf'(x)=\\frac{xN'(x)-N(x)}{x^{2}},\\qquad   \nf'(x)=0\\Longleftrightarrow H(x):=xN'(x)-N(x)=0 .\n\\]\n\nWrite  \n\n\\[\nN(x)=x^{4}-S_{1}x^{3}+S_{2}x^{2}-S_{3}x+S_{4},\n\\]\n\nwhere  \n\n\\[\n\\begin{aligned}\nS_{1}&=18+72+98+k = 188+k,\\\\\nS_{2}&=18\\cdot72+18\\cdot98+72\\cdot98+ (18+72+98)k =10116+188k,\\\\\nS_{3}&=18\\cdot72\\cdot98+(18\\cdot72+18\\cdot98+72\\cdot98)k =127008+10116k,\\\\\nS_{4}&=18\\cdot72\\cdot98\\cdot k =127008\\,k .\n\\end{aligned}\n\\]\n\nSince  \n\n\\[\nN'(x)=4x^{3}-3S_{1}x^{2}+2S_{2}x-S_{3},\n\\]\n\nwe obtain  \n\n\\[\n\\begin{aligned}\nH(x)&=xN'(x)-N(x)  \\\\\n    &=3x^{4}-2S_{1}x^{3}+S_{2}x^{2}-S_{4}\\\\\n    &=3x^{4}-(376+2k)x^{3}+(10116+188k)x^{2}-127008k .\n\\end{aligned}\n\\]\n\nThe three positive roots of \\(H\\) are the two minima of \\(f\\) (in the intervals where\n\\(f<0\\)) and one interior maximum.\n\n--------------------------------------------------------------------\n### 2.  When are the two minima equal?\n\nAt a minimum \\(x_{0}\\),\n\n\\[\nf(x_{0}) = \\frac{N(x_{0})}{x_{0}} = N'(x_{0})=:m .\n\\]\n\nThus the equation \\(N(x)=mx\\) has a **double** root at each minimum.\nIf the global minimum is attained at exactly two points, then\n\n\\[\nN(x)-mx=(x-\\alpha)^{2}(x-\\gamma)^{2},\n\\qquad\\alpha\\neq\\gamma>0 .\n\\]\n\nExpanding both sides and comparing coefficients gives\n\n\\[\n\\begin{cases}\n\\alpha+\\gamma =\\displaystyle\\frac{188+k}{2},\\\\[4pt]\n\\alpha\\gamma = -\\dfrac{k^{2}}{8}+47k+640,\\\\[4pt]\n(\\alpha\\gamma)^{2}=S_{4}=127008k .\n\\end{cases}\n\\]\n\nEliminating \\(\\alpha,\\gamma\\) yields a single equation for \\(k\\):\n\n\\[\n\\Bigl(-\\frac{k^{2}}{8}+47k+640\\Bigr)^{2}=127008k .\n\\]\n\nMultiplying by \\(64\\),\n\n\\[\n(k^{2}-376k-5120)^{2}=8\\,128\\,512\\,k,\n\\]\n\nwhich simplifies to the quartic\n\n\\[\nk^{4}-752k^{3}+131136k^{2}-4\\,278\\,272k+26\\,214\\,400=0 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Solving the quartic\n\nFactoring gives  \n\n\\[\n(k-8)(k-32)(k^{2}-712k+102400)=0,\n\\]\n\nso the four real solutions are  \n\n\\[\nk=8,\\qquad k=32,\\qquad k=200,\\qquad k=512 .\n\\]\n\n--------------------------------------------------------------------\n### 4.  Selecting the admissible \\(k\\)\n\nFor the two minima to be **positive**, the product \\(\\alpha\\gamma\\) must be positive:\n\n\\[\n\\alpha\\gamma = -\\frac{k^{2}}{8}+47k+640 >0 .\n\\]\n\nEvaluating this expression:\n\n\\[\n\\begin{array}{c|c}\nk & \\alpha\\gamma\\\\ \\hline\n8   & 1008>0\\\\\n32  & 2016>0\\\\\n200 & 5040>0\\\\\n512 & -8064<0\n\\end{array}\n\\]\n\nThus \\(k=512\\) gives one root \\(\\alpha\\) negative and cannot produce two minima on the\npositive axis.  The admissible values are  \n\n\\[\nk=8,\\;32,\\;200 .\n\\]\n\n--------------------------------------------------------------------\n### 5.  Sum of the three values\n\n\\[\n8+32+200 = 240 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The inequalities can be rewritten by factoring:\n\n\\[\n\\begin{aligned}\nx-yz<y-zx &\\iff (x-y)(1+z)<0,\\\\[2pt]\ny-zx<z-xy &\\iff (y-z)(1+x)<0 .\n\\end{aligned}\n\\]\n\nHence the signs of \\(x-y,\\;y-z,\\;1+z,\\;1+x\\) must be opposite in each product.\nFour sign\u2011patterns are possible:\n\n\\[\n\\begin{array}{c|c|c|c}\nx+1 & z+1 & \\text{implied order of }x,y,z & \\text{region}\\\\ \\hline\n>0 & >0 & x<y<z & \\text{bounded}\\\\\n>0 & <0 & y<\\min\\{x,z\\} & \\text{unbounded}\\\\\n<0 & >0 & \\max\\{x,z\\}<y & \\text{unbounded}\\\\\n<0 & <0 & x>y>z & \\text{impossible (sum }75)\n\\end{array}\n\\]\n\nOnly the first case can give a finite region.  \nWith \\(x+y+z=75\\) and the inequalities\n\n\\[\nx>-1,\\qquad x<y,\\qquad y<z,\n\\]\n\nwrite \\(z=75-x-y\\). The conditions become\n\n\\[\n\\begin{cases}\nx>-1,\\\\\nx<y,\\\\\ny<\\dfrac{75-x}{2}.\n\\end{cases}\n\\]\n\nIn the \\((x,y)\\)-plane this is the interior of the triangle bounded by\n\n\\[\nx=-1,\\qquad y=x,\\qquad y=\\frac{75-x}{2},\n\\]\n\nwhose vertices are \\((-1,-1),\\;(-1,38),\\;(25,25)\\).\n\nIts area in the \\((x,y)\\)-plane is\n\n\\[\n\\frac12\\cdot 39\\cdot 26=507 .\n\\]\n\nThe plane \\(x+y+z=75\\) makes an angle with the \\(xy\\)-plane whose normal is \\((1,1,1)\\); the area element is multiplied by \\(\\lVert(1,1,1)\\rVert=\\sqrt3\\).  \nHence the actual area of the bounded region is\n\n\\[\n507\\sqrt3 .\n\\]\n\nThus \\(a=507,\\;b=3\\) and\n\n\\[\na+b=507+3=510 .\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The grid consists of three \\(3\\times 3\\) blocks.  \nFor each number \\(1,\\dots ,9\\) we must place it\n\n* once in each of the three rows,\n* once in each of the three blocks.\n\nHence for a fixed number its positions are described by a permutation\n\\(\\sigma\\in S_{3}\\):\n\\[\n\\sigma(i)=\\text{the block in which the number occurs in row }i .\n\\]\n\n---\n\n### 1.  Counting the assignments of permutations\n\nLet \\(n_\\sigma\\) be the number of symbols that use permutation \\(\\sigma\\).\nSince there are nine symbols,\n\\[\n\\sum_{\\sigma\\in S_3} n_\\sigma = 9 .\n\\]\n\nFor each ordered pair \\((i,j)\\) (row \\(i\\), block \\(j\\)) the number of symbols\nwith \\(\\sigma(i)=j\\) must be \\(3\\) (there are three columns in that block).  \nWriting the six permutations of \\(S_3\\) as  \n\n\\[\n\\begin{aligned}\n\\sigma_1&:(1,2,3),&\\sigma_2&:(2,1,3),&\\sigma_3&:(3,2,1),\\\\\n\\sigma_4&:(1,3,2),&\\sigma_5&:(2,3,1),&\\sigma_6&:(3,1,2),\n\\end{aligned}\n\\]\n\nthe conditions become  \n\n\\[\n\\begin{array}{c}\nn_1+n_4=3,\\; n_1+n_2=3,\\; n_1+n_3=3,\\\\\nn_2+n_5=3,\\; n_3+n_6=3,\\; n_4+n_5=3,\\\\\nn_3+n_5=3,\\; n_4+n_6=3,\\; n_2+n_6=3 .\n\\end{array}\n\\]\n\nSolving gives a one\u2011parameter family\n\n\\[\nn_1=n_5=n_6=k,\\qquad n_2=n_3=n_4=3-k,\n\\]\n\nwith \\(k=0,1,2,3\\) (non\u2011negative integers).  \nFor each \\(k\\) the number of ways to assign the nine distinct symbols to the\npermutations is  \n\n\\[\n\\frac{9!}{k!^3\\,(3-k)!^3}.\n\\]\n\nHence the total number of macro\u2011assignments is\n\n\\[\nM=\\sum_{k=0}^{3}\\frac{9!}{k!^3(3-k)!^3}\n   =1680+45360+45360+1680=94080 .\n\\]\n\n---\n\n### 2.  Ordering within each macro\u2011cell\n\nA macro\u2011cell \\((\\text{row }i,\\text{ block }j)\\) contains exactly three\ndifferent numbers.  Their order in the three columns of that block can be chosen\nin \\(3!\\) ways, independently for each of the \\(3\\times 3=9\\) macro\u2011cells.\nThus we obtain an extra factor \\((3!)^{9}=6^{9}=10\\,077\\,696\\).\n\nHence the total number of fillings is  \n\n\\[\nN = M\\cdot (3!)^{9}=94080\\cdot 6^{9}\n   = 2^{16}\\cdot 3^{10}\\cdot5\\cdot7^{2}.\n\\]\n\n---\n\n### 3.  Computing \\(p a+q b+r c+s d\\)\n\nWriting \\(N=p^{a}q^{b}r^{c}s^{d}\\) with distinct primes \\(p,q,r,s\\) we have  \n\n\\[\np=2,\\;a=16;\\qquad q=3,\\;b=10;\\qquad r=5,\\;c=1;\\qquad s=7,\\;d=2.\n\\]\n\nTherefore  \n\n\\[\np a+q b+r c+s d\n=2\\cdot16+3\\cdot10+5\\cdot1+7\\cdot2\n=32+30+5+14=81.\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line containing \\(A,B,C,D,E,F\\) be the \\(x\\)-axis.  \nPlace \\(A\\) at the origin: \\(A=(0,0)\\).\n\n---\n\n### 1.  Determine the coordinates of the collinear points  \n\n\\[\n\\begin{aligned}\nAC&=26\\quad\\Rightarrow\\quad C=(26,0),\\\\[2mm]\nBD&=22\\quad\\Rightarrow\\quad D-B=22,\\\\[2mm]\nCE&=31\\quad\\Rightarrow\\quad E-C=31\\;\\Rightarrow\\;E=(57,0),\\\\[2mm]\nDF&=33\\quad\\Rightarrow\\quad F-D=33,\\\\[2mm]\nAF&=73\\quad\\Rightarrow\\quad F=(73,0).\n\\end{aligned}\n\\]\n\nFrom \\(F-D=33\\) we get \\(D=73-33=40\\).  \nThen \\(BD=22\\) gives \\(B=40-22=18\\).\n\nThus  \n\n\\[\nA(0,0),\\;B(18,0),\\;C(26,0),\\;D(40,0),\\;E(57,0),\\;F(73,0).\n\\]\n\n---\n\n### 2.  Locate point \\(G\\)\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\).  \nGiven \\(CG=40\\) and \\(DG=30\\),\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2 = 40^2 =1600,\\\\\n(x-40)^2+y^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtract the second equation from the first:\n\n\\[\n(x-26)^2-(x-40)^2 = 700\n\\]\n\\[\n\\Longrightarrow\\;28x-924 = 700 \\;\\Longrightarrow\\; x=58 .\n\\]\n\nPlug \\(x=58\\) into \\((x-40)^2+y^2=900\\):\n\n\\[\n(18)^2 + y^2 = 900 \\;\\Longrightarrow\\; y^2 = 576 \\;\\Longrightarrow\\; y = \\pm24 .\n\\]\n\nTake \\(y=24\\) (the sign does not affect the area).  \nHence \\(G=(58,24)\\).\n\n---\n\n### 3.  Area of \\(\\triangle BGE\\)\n\nPoints \\(B\\) and \\(E\\) lie on the \\(x\\)-axis, so segment \\(\\overline{BE}\\) is horizontal.  \n\n\\[\nBE = 57-18 = 39 .\n\\]\n\nThe perpendicular distance from \\(G\\) to line \\(BE\\) (the \\(x\\)-axis) is \\(|y| = 24\\).\n\nTherefore\n\n\\[\n\\text{Area} = \\frac12 \\times (\\text{base}) \\times (\\text{height})\n           = \\frac12 \\times 39 \\times 24\n           = 468 .\n\\]\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nd=n+2\\qquad (d\\ge 3,\\;n\\in\\mathbb Z^+)\n\\]\n\nThen  \n\n\\[\nn+3=d+1,\\qquad n^{2}+9=(d-2)^2+9=d^{2}-4d+13 .\n\\]\n\nThe condition \u201c\\(n+2\\) divides \\(3(n+3)(n^{2}+9)\\)\u201d becomes  \n\n\\[\nd\\mid 3(d+1)(d^{2}-4d+13).\n\\]\n\nConsider the right\u2011hand side modulo \\(d\\):\n\n\\[\n\\begin{aligned}\n3(d+1)(d^{2}-4d+13)\n&\\equiv 3\\cdot1\\cdot13\\pmod{d}\\\\\n&=39\\pmod{d}.\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\nd\\mid 3(d+1)(d^{2}-4d+13)\\iff d\\mid 39 .\n\\]\n\nSince \\(d=n+2\\ge 3\\), the possible values of \\(d\\) are the divisors of \\(39\\) that are at least \\(3\\):\n\n\\[\nd\\in\\{3,13,39\\}.\n\\]\n\nCorresponding \\(n=d-2\\) values are  \n\n\\[\nn=1,\\;11,\\;37 .\n\\]\n\nAll three satisfy the original divisibility (direct substitution confirms).\n\nThe required sum is  \n\n\\[\n1+11+37=49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The function  \n\n\\[\nf(x)=\\begin{cases}\nx,&-1\\le x<1\\\\[2mm]\n2-x,&1\\le x<3\n\\end{cases},\\qquad f(x+4)=f(x)\n\\]\n\nhas period \\(4\\).  \nFor any \\(x\\) write  \n\n\\[\nx=4n+t,\\qquad t\\in[-1,3),\\;n\\in\\mathbb Z .\n\\]\n\nThen  \n\n\\[\nf(x)=\\begin{cases}\nt,&-1\\le t<1\\\\\n2-t,&1\\le t<3 .\n\\end{cases}\n\\tag{1}\n\\]\n\nThe parabola is \\(x=34y^{2}\\;(x\\ge 0)\\).  \nAn intersection point must satisfy  \n\n\\[\ny=f(34y^{2}) .\n\\tag{2}\n\\]\n\nPut \\(x=34y^{2}=4n+t\\) with \\(t\\in[-1,3)\\).  \nFrom (1) there are two possibilities.\n\n---\n\n### 1.  \\(t=y\\)  \n\nThen \\(-1\\le y<1\\) and  \n\n\\[\n34y^{2}=4n+y\\Longrightarrow 34y^{2}-y=4n .\n\\tag{3}\n\\]\n\nFor each integer \\(n\\) this quadratic gives the two solutions  \n\n\\[\ny=\\frac{1\\pm\\sqrt{1+544n}}{68}.\n\\tag{4}\n\\]\n\nSince \\(y\\in[-1,1)\\) the solutions are admissible for every \\(n\\)\nfor which \\(34y^{2}\\le 34\\).  \nBecause \\(0\\le34y^{2}\\le34\\), from \\(34y^{2}=4n+t\\) with \\(t\\ge-1\\) we get\n\\(0\\le4n+3\\), i.e. \\(n\\ge0\\); and from \\(4n-1\\le34\\) we obtain \\(n\\le8\\).\nThus \\(n=0,1,\\dots ,8\\).  \n\nFor each \\(n\\) the sum of the two roots of (3) is  \n\n\\[\n\\frac{1}{34}.\n\\]\n\nHence the total contribution of this case is  \n\n\\[\n9\\cdot\\frac1{34}=\\frac{9}{34}=\\frac{18}{68}.\n\\tag{5}\n\\]\n\n---\n\n### 2.  \\(t=2-y\\)  \n\nNow \\(1\\le t<3\\) which gives \\(-1<y\\le1\\) and  \n\n\\[\n34y^{2}=4n+2-y\\Longrightarrow 34y^{2}+y-2=4n .\n\\tag{6}\n\\]\n\nIts solutions are  \n\n\\[\ny=\\frac{-1\\pm\\sqrt{273+544n}}{68}.\n\\tag{7}\n\\]\n\nAgain \\(n=0,1,\\dots ,8\\).  \nFor \\(n=0,\\dots ,7\\) both roots lie in \\((-1,1]\\); for \\(n=8\\) only the\n\u2018\\(+\\)\u2019 root is admissible (the \u2018\\(-\\)\u2019 root is \\(<-1\\)).  \n\nThe sum of the two roots of (6) for any \\(n\\) equals  \n\n\\[\n-\\frac1{34}.\n\\]\n\nThus the sum of all valid roots of this case is  \n\n\\[\n8\\!\\left(-\\frac1{34}\\right)+\\frac{-1+\\sqrt{4625}}{68}\n   =-\\frac{16}{68}+\\frac{-1+\\sqrt{4625}}{68}\n   =\\frac{-17+\\sqrt{4625}}{68}.\n\\tag{8}\n\\]\n\n---\n\n### 3.  Total sum of the \\(y\\)\u2013coordinates\n\nAdding (5) and (8),\n\n\\[\nS=\\frac{18}{68}+\\frac{-17+\\sqrt{4625}}{68}\n   =\\frac{1+\\sqrt{4625}}{68}\n   =\\frac{1+5\\sqrt{185}}{68}.\n\\]\n\nThe expression \\(\\displaystyle\\frac{a+b\\sqrt{c}}{d}\\) has  \n\n\\[\na=1,\\;b=5,\\;c=185,\\;d=68,\n\\]\n\nwith \\(\\gcd(a,b,d)=1\\) and \\(c\\) square\u2011free.\n\nHence  \n\n\\[\na+b+c+d = 1+5+185+68 = 259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\n\\prod_{k=4}^{63}\\frac{\\log_k\\!\\left(5^{k^{2}-1}\\right)}{\\log_{k+1}\\!\\left(5^{k^{2}-4}\\right)}\n= \\prod_{k=4}^{63}\n\\frac{(k^{2}-1)\\ln5/\\ln k}{(k^{2}-4)\\ln5/\\ln(k+1)}\n= \\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}\n\\]\n\nSince \\(k^{2}-1=(k-1)(k+1)\\) and \\(k^{2}-4=(k-2)(k+2)\\),\n\n\\[\n\\frac{k^{2}-1}{k^{2}-4}= \\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nThus\n\n\\[\nP=\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n   \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr)\n   \\Bigl(\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\\Bigr).\n\\]\n\nEach product telescopes:\n\n1. \\(\\displaystyle\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n   =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdots\\frac{62}{61}\n   =\\frac{62}{2}=31.\\)\n\n2. \\(\\displaystyle\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n   =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdots\\frac{64}{65}\n   =\\frac{5}{65}=\\frac1{13}.\\)\n\n3. \\(\\displaystyle\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n   =\\frac{\\ln5}{\\ln4}\\cdot\\frac{\\ln6}{\\ln5}\\cdots\\frac{\\ln64}{\\ln63}\n   =\\frac{\\ln64}{\\ln4}\n   =\\log_{4}64=3.\\)\n\nMultiplying,\n\n\\[\nP=31\\cdot\\frac1{13}\\cdot3=\\frac{93}{13}.\n\\]\n\nThus \\(m=93,\\;n=13\\) (relatively prime) and  \n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Label the unit line segments as follows.\n\n\\[\n\\begin{array}{c}\n\\text{Top edges: }T_1,T_2\\\\\n\\text{Bottom edges: }B_1,B_2\\\\\n\\text{Left edges: }L_1,L_2\\\\\n\\text{Right edges: }R_1,R_2\\\\\n\\text{Middle vertical edges: }M_{v1},M_{v2}\\\\\n\\text{Middle horizontal edges: }M_{h1},M_{h2}\n\\end{array}\n\\]\n\nEach of the four unit squares must have exactly two red sides.\nLet a red edge be denoted by \\(1\\) and a blue edge by \\(0\\).\nIntroduce the binary variables  \n\n\\[\n\\begin{aligned}\n&a=M_{v1},\\;b=M_{v2},\\;c=M_{h1},\\;d=M_{h2},\\\\\n&p=T_1,\\;q=T_2,\\;r=B_1,\\;s=B_2,\\\\\n&u=L_1,\\;v=L_2,\\;w=R_1,\\;x=R_2 .\n\\end{aligned}\n\\]\n\nThe condition \u201ctwo red sides\u201d for each of the four squares gives four linear\nequations:\n\n\\[\n\\begin{cases}\np+u+a+c=2\\\\\nq+w+a+d=2\\\\\nr+v+b+c=2\\\\\ns+x+b+d=2\\qquad (1)\n\\end{cases}\n\\]\n\nAll variables are \\(0\\) or \\(1\\).\n\n--------------------------------------------------------------------\n### Fix the interior edges\n\nThe interior edges are the four variables \\(a,b,c,d\\).\nFor a fixed choice of \\((a,b,c,d)\\) each equation in (1) involves a\ndifferent pair of outer edges:\n\n\\[\n\\begin{aligned}\np+u &=2-(a+c),\\\\\nq+w &=2-(a+d),\\\\\nr+v &=2-(b+c),\\\\\ns+x &=2-(b+d).\n\\end{aligned}\n\\tag{2}\n\\]\n\nFor a pair of binary variables the number of possibilities for a given\nsum is  \n\n\\[\nf(s)=\\begin{cases}\n1 & s=0\\text{ or }2,\\\\[2pt]\n2 & s=1,\\\\[2pt]\n0 & \\text{otherwise}.\n\\end{cases}\n\\]\n\nHence, for a fixed interior assignment the number of ways to colour the\nouter edges equals  \n\n\\[\nf\\bigl(2-(a+c)\\bigr)\\,\nf\\bigl(2-(a+d)\\bigr)\\,\nf\\bigl(2-(b+c)\\bigr)\\,\nf\\bigl(2-(b+d)\\bigr).\n\\]\n\nBecause \\(a,c,b,d\\in\\{0,1\\}\\), each sum \\(a+c,\\;a+d,\\;b+c,\\;b+d\\) is\n\\(0,1,\\) or \\(2\\); consequently the factor is \\(2\\) exactly when the\ncorresponding pair contains one \\(0\\) and one \\(1\\), and it is \\(1\\) when\nthe pair is equal.  \n\nDefine\n\n\\[\nN(a,b,c,d)=\\bigl[ a\\ne c\\bigr]+\\bigl[ a\\ne d\\bigr]+\\bigl[ b\\ne c\\bigr]\n+\\bigl[ b\\ne d\\bigr].\n\\]\n\nThen the number of outer colourings for that interior choice is\n\\(2^{\\,N(a,b,c,d)}\\).\n\n--------------------------------------------------------------------\n### Counting all interior choices\n\nThe four interior bits can be viewed as two binary strings  \n\\(A=(a,b)\\) and \\(C=(c,d)\\).  The quantity \\(N\\) counts the mismatches\nbetween \\(A\\) and \\(C\\) over all four cross\u2011pairs, and one obtains\n\n\\[\nN=2\\bigl(w_A+w_C-w_Aw_C\\bigr),\n\\]\nwhere \\(w_A=a+b\\) and \\(w_C=c+d\\) are the numbers of 1\u2019s in the strings.\n\nFrom this we get the possible values:\n\n* **\\(N=0\\)** when \\(A=C\\) (all four interior edges equal).  \n  Two assignments: \\((0,0,0,0)\\) and \\((1,1,1,1)\\).  \n  Contribution: \\(2\\cdot2^{0}=2\\).\n\n* **\\(N=4\\)** when the two strings are opposite, i.e. \\(A=(0,0), C=(1,1)\\)\n  or \\(A=(1,1), C=(0,0)\\).  \n  Two assignments.  \n  Contribution: \\(2\\cdot2^{4}=32\\).\n\n* **\\(N=2\\)** for all remaining \\(16-4=12\\) interior assignments.  \n  Contribution: \\(12\\cdot2^{2}=48\\).\n\nAdding them gives the total number of colourings\n\n\\[\n2+48+32 = 82.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{82}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nPlace \\(\\triangle ABC\\) in the plane with  \n\n\\[\nA=(0,0),\\qquad B=(28,0),\\qquad C=(x,y)\n\\]\n\nso that \\(AB=28\\).  \nThe points on the sides are\n\n\\[\n\\begin{aligned}\nD&=A+\\frac17AB=(4,0), &\nE&=A+\\frac57AB=(20,0),\\\\\nF&=A+\\frac17AC=\\Bigl(\\frac{x}{7},\\frac{y}{7}\\Bigr), &\nG&=A+\\frac57AC=\\Bigl(\\frac{5x}{7},\\frac{5y}{7}\\Bigr).\n\\end{aligned}\n\\]\n\n(The given lengths give the fractions \\(\\frac17,\\frac57\\) on both sides because  \n\n\\[\nAD:DE:EB=4:16:8=1:4:2,\\qquad \nAF:FG:GC=13:52:26=1:4:2 .\n\\])\n\nThe reflections are\n\n\\[\n\\begin{aligned}\nM&=2F-D=\\Bigl(\\frac{2x}{7}-4,\\frac{2y}{7}\\Bigr),\\\\[2mm]\nN&=2E-G=\\Bigl(40-\\frac{5x}{7},-\\frac{5y}{7}\\Bigr).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Height of the triangle\n\nThe quadrilateral \\(DEGF\\) is \\(\\{D,E,G,F\\}\\) in that order.  \nUsing the shoelace formula,\n\n\\[\n\\begin{aligned}\n[DEGF]\n&=\\frac12\\Bigl((4\\cdot0+20\\cdot\\frac{5y}{7}+\\frac{5x}{7}\\cdot\\frac{y}{7}+ \\frac{x}{7}\\cdot0) \\\\\n&\\qquad\\ -\\ (0\\cdot20+\\;0\\cdot\\frac{5x}{7}+\\frac{5y}{7}\\cdot\\frac{x}{7}+ \\frac{y}{7}\\cdot4 )\\Bigr)\\\\[1mm]\n&=\\frac12\\Bigl(20\\cdot\\frac{5y}{7}-4\\cdot\\frac{y}{7}\\Bigr)\n =\\frac{1248}{91}\\,\\frac{y}{2}= \\frac{624}{91}\\,y .\n\\end{aligned}\n\\]\n\nThe problem states \\([DEGF]=288\\); hence\n\n\\[\n\\frac{624}{91}\\,y=288\\qquad\\Longrightarrow\\qquad y=42 .\n\\]\n\nThus the altitude from \\(C\\) to \\(\\overline{AB}\\) is \\(h=y=42\\).\n\n--------------------------------------------------------------------\n### 2.  Area of \\(\\triangle ABC\\)\n\n\\[\n[ABC]=\\frac12\\cdot AB\\cdot h=\\frac12\\cdot 28\\cdot 42=14\\cdot 42=588.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Area of the heptagon \\(AFNBCEM\\)\n\nWrite the vertices in order:\n\n\\[\nA,\\;F,\\;N,\\;B,\\;C,\\;E,\\;M .\n\\]\n\nUsing the coordinates found above (with \\(y=42\\) and \\(\\,x=\\sqrt{91^{2}-42^{2}}=7\\sqrt{133}\\)), the\nshoelace sum is\n\n\\[\n\\begin{aligned}\nS&=x_Ay_F-y_Ax_F\n   +x_Fy_N-y_Fx_N\n   +x_Ny_B-y_Nx_B\n   +x_By_C-y_Bx_C\n   +x_Cy_E-y_Cx_E\n   +x_Ey_M-y_Ex_M\n   +x_My_A-y_Mx_A \\\\[1mm]\n&=0-240+840+1176-840+240+0=1176 .\n\\end{aligned}\n\\]\n\nHence\n\n\\[\n[AFNBCEM]=\\frac12\\,S=\\frac12\\cdot1176=588 .\n\\]\n\nA vector\u2011geometry check also shows that the signed sum of the\ndeterminants of successive vertices equals \\(\\det(\\overrightarrow{AB},\n\\overrightarrow{AC})\\), i.e. the area of \\(\\triangle ABC\\).\n\n--------------------------------------------------------------------\n### 4.  Answer\n\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Factor  \n\\[\n2025=3^{4}\\cdot5^{2}.\n\\]\n\nA divisor of \\(2025\\) is \\(3^{i}5^{j}\\) with \\(0\\le i\\le4,\\;0\\le j\\le2\\).  \nHence  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\n---\n\n### When does a subset have lcm \\(2025\\)?\n\nThe lcm of a set of divisors takes, for each prime, the **maximum** exponent appearing among the chosen numbers.\n\nThus a subset \\(B\\subseteq A\\) has \\(\\operatorname{lcm}(B)=3^{4}5^{2}=2025\\) iff  \n\n* at least one element of \\(B\\) has exponent \\(4\\) of the prime \\(3\\);\n* at least one element of \\(B\\) has exponent \\(2\\) of the prime \\(5\\).\n\nDefine  \n\n\\[\nS_{3}=\\{3^{4}5^{j}\\mid j=0,1,2\\}=\\{81,405,2025\\},\n\\qquad\nS_{5}=\\{3^{i}5^{2}\\mid i=0,1,2,3,4\\}\n =\\{25,75,225,675,2025\\}.\n\\]\n\n\\(|S_{3}|=3,\\ |S_{5}|=5,\\) and \\(|S_{3}\\cap S_{5}|=1\\) (the element \\(2025\\)).\n\nSo we need subsets that intersect **both** \\(S_{3}\\) and \\(S_{5}\\).\n\n---\n\n### Counting such subsets\n\nTotal subsets of \\(A\\): \\(2^{15}\\).\n\nLet  \n\n* \\(A_{3}\\) = subsets containing **no** element of \\(S_{3}\\).  \n  \\(|A_{3}| = 2^{15-3}=2^{12}\\).\n\n* \\(A_{5}\\) = subsets containing **no** element of \\(S_{5}\\).  \n  \\(|A_{5}| = 2^{15-5}=2^{10}\\).\n\n* \\(A_{3}\\cap A_{5}\\) = subsets containing none of \\(S_{3}\\cup S_{5}\\).  \n  \\(|S_{3}\\cup S_{5}| = 3+5-1 = 7\\), so  \n  \\(|A_{3}\\cap A_{5}| = 2^{15-7}=2^{8}\\).\n\nBy inclusion\u2013exclusion, the number of subsets intersecting both \\(S_{3}\\) and \\(S_{5}\\) is  \n\n\\[\n2^{15} - 2^{12} - 2^{10} + 2^{8}\n = 32768 - 4096 - 1024 + 256\n = 27904.\n\\]\n\nEvery such subset is non\u2011empty, so these are exactly the favorable subsets.\n\n---\n\n### Probability\n\n\\[\n\\text{Probability}\n = \\frac{27904}{2^{15}}\n = \\frac{27904}{32768}\n = \\frac{109}{128}\n\\]\n(after reducing the fraction).\n\nThus \\(m=109,\\ n=128\\) and  \n\n\\[\nm+n = 109+128 = 237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n* \\(O\\) be the centre of \\(\\omega _2\\) (radius \\(15\\)),\n* \\(A\\) be the centre of \\(\\omega _1\\) (radius \\(6\\)),\n* \\(B\\) the point where the two circles are internally tangent,\n* \\(C\\) the antipode of \\(B\\) on \\(\\omega_2\\) (\\(BC\\) is a diameter),\n* \\(D\\) the point on \\(\\omega _2\\) with \\(AD\\perp BC\\).\n\n--------------------------------------------------------------------\n### 1.  Choose coordinates  \n\nPlace \\(O\\) at the origin and let the diameter \\(BC\\) be horizontal.\n\n\\[\nB=(15,0),\\qquad C=(-15,0)\n\\]\n\nSince \\(OA=15-6=9\\) and \\(A\\) lies on \\(OB\\),\n\n\\[\nA=(9,0).\n\\]\n\nThe line \\(AD\\) is perpendicular to the horizontal line \\(BC\\), so \\(AD\\) is the\nvertical line through \\(A\\); intersecting \\(\\omega_2\\) gives\n\n\\[\nD=(9,12)\\quad\\text{or}\\quad D=(9,-12).\n\\]\n\nBecause the rectangle will be placed above the centre of \\(\\omega_1\\), we take  \n\n\\[\nD=(9,12).\n\\]\n\n--------------------------------------------------------------------\n### 2.  Describe the rectangle  \n\nSince the rectangle is **inscribed** in \\(\\omega_1\\), all four of its vertices lie on\n\\(\\omega_1\\).  \nLet the rectangle have centre at \\(A\\); because a rectangle\u2019s circum\u2011centre is\nthe intersection of its diagonals, the centre must be the centre of the\ncircumscribing circle \\(\\omega_1\\).\n\nLet  \n\n* half\u2011width \\(w\\) (distance from the centre to the right\u2013hand side),\n* half\u2011height \\(h\\) (distance from the centre to the top side).\n\nThen  \n\n\\[\n\\begin{aligned}\nx_R&=9+w, & x_L&=9-w,\\\\\ny_T&=h,   & y_B&=-h .\n\\end{aligned}\n\\]\n\nThe vertices are  \n\n\\[\n\\begin{aligned}\nE&(x_R,y_B)=(9+w,-h),\\\\\nF&(x_R,y_T)=(9+w, h),\\\\\nG&(x_L,y_T)=(9-w, h),\\\\\nH&(x_L,y_B)=(9-w,-h).\n\\end{aligned}\n\\]\n\nBecause the vertices lie on \\(\\omega_1\\) (radius \\(6\\)),\n\n\\[\nw^{2}+h^{2}=6^{2}=36\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Use the area condition  \n\nThe problem states that  \n\n\\[\n\\text{Area}\\,\\triangle DGF=\\text{Area}\\,\\triangle CHG .\n\\]\n\n*Triangle \\(DGF\\).*  \nIts base is \\(GF\\) (the top side of the rectangle) of length \\(2w\\).  \nIts height is the vertical distance from \\(D\\) to the line \\(y=h\\):\n\\(\\;12-h\\). Hence  \n\n\\[\n[\\triangle DGF]=\\tfrac12(2w)(12-h)=w(12-h).\\tag{2}\n\\]\n\n*Triangle \\(CHG\\).*  \nIts base is \\(HG\\) (the left side) of length \\(2h\\).  \nThe distance from \\(C\\) to the vertical line \\(x=9-w\\) is\n\\((9-w)-(-15)=24-w\\). Therefore  \n\n\\[\n[\\triangle CHG]=\\tfrac12(2h)(24-w)=h(24-w).\\tag{3}\n\\]\n\nEquating (2) and (3),\n\n\\[\nw(12-h)=h(24-w).\\tag{4}\n\\]\n\nExpanding both sides gives  \n\n\\[\n12w-wh=24h-wh\\Longrightarrow 12w=24h\\Longrightarrow w=2h.\\tag{5}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Solve for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1):\n\n\\[\n(2h)^2+h^2=36\\quad\\Longrightarrow\\quad5h^{2}=36\\quad\\Longrightarrow\\quad\nh^{2}= \\frac{36}{5},\\qquad\nh=\\frac{6}{\\sqrt5}=\\frac{6\\sqrt5}{5}.\n\\]\n\nHence  \n\n\\[\nw=2h=\\frac{12}{\\sqrt5}= \\frac{12\\sqrt5}{5}.\n\\]\n\n--------------------------------------------------------------------\n### 5.  Area of the rectangle  \n\nThe rectangle\u2019s side lengths are \\(2w\\) and \\(2h\\), so its area is  \n\n\\[\n\\text{Area}= (2w)(2h)=4wh=4\\cdot(2h)h=8h^{2}\n          =8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nThus the area is \\(\\displaystyle \\frac{288}{5}\\).\nThe numerator and denominator are relatively prime, so  \n\n\\[\nm=288,\\qquad n=5,\\qquad m+n=288+5=293.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  Regions created by chords**\n\nIf we start with a disc (one region) and draw a chord, the number of regions increases by  \n\n\\[\n\\text{(number of interior intersections created by the new chord)}+1 .\n\\]\n\nHence after drawing \\(k\\) chords the number of regions is  \n\n\\[\nR=1+k+I ,\n\\]\n\nwhere \\(I\\) is the total number of interior intersection points of the drawn chords (no three chords meet at a single interior point, which holds a.s. for random chords).\n\nIn our problem \\(k=27\\) (the two diameters plus the 25 random chords), so  \n\n\\[\nR=28+I .\n\\]\n\nThus we only need the expected value of \\(I\\).\n\n--------------------------------------------------------------------\n\n**Step 2.  Intersections involving the two fixed diameters**\n\nThe two diameters intersect at the centre, contributing a deterministic intersection  \n\n\\[\nI_{\\text{centre}}=1 .\n\\]\n\nA random chord intersects the **vertical** diameter iff its endpoints lie in opposite halves of the disc, i.e. one endpoint in \\(\\{Q_1,Q_4\\}\\) and the other in \\(\\{Q_2,Q_3\\}\\).  \nAmong the six possible unordered quadrant\u2011pairs for a chord, four satisfy this condition, so\n\n\\[\nP(\\text{vertical intersection})=\\frac{4}{6}=\\frac23 .\n\\]\n\nThe same reasoning holds for the **horizontal** diameter, giving  \n\n\\[\nP(\\text{horizontal intersection})=\\frac23 .\n\\]\n\nHence for the 25 random chords\n\n\\[\nE[I_{\\text{vert}}]=25\\cdot\\frac23=\\frac{50}{3},\\qquad   \nE[I_{\\text{horiz}}]=25\\cdot\\frac23=\\frac{50}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3.  Intersections among the 25 random chords**\n\nTwo random chords are independent.  \nEach chord chooses an unordered pair of distinct quadrants uniformly from the six possibilities  \n\n\\[\n\\{1,2\\},\\{2,3\\},\\{3,4\\},\\{4,1\\} \\ (\\text{adjacent}),\\qquad\n\\{1,3\\},\\{2,4\\}\\ (\\text{opposite}).\n\\]\n\nLet the unordered pairs be \\(S\\) and \\(T\\).  \nTheir intersection size can be\n\n* **2** (the same pair) \u2013 probability \\(1/6\\);\n* **1** (they share exactly one quadrant) \u2013 probability \\(2/3\\);\n* **0** (disjoint) \u2013 probability \\(1/6\\).\n\nThe disjoint case splits further:\n\n* Adjacent\u2013adjacent (e.g. \\(\\{1,2\\}\\) with \\(\\{3,4\\}\\)) \u2013 chords never intersect.\n* Opposite\u2013opposite (e.g. \\(\\{1,3\\}\\) with \\(\\{2,4\\}\\)) \u2013 chords always intersect.\n\nAmong the three unordered disjoint pairs, two are adjacent\u2013adjacent and one is opposite\u2013opposite; hence for ordered pairs\n\n\\[\nP(\\text{disjoint, intersect})=\\frac{2}{36}=\\frac1{18},\\qquad\nP(\\text{disjoint, no intersect})=\\frac{4}{36}.\n\\]\n\nFor the other two situations one can check (by considering the relative order of the points inside the quadrants) that\n\n* If the two chords have the **same** unordered pair (adjacent or opposite), the probability they intersect is \\(\\tfrac12\\).\n* If they **share exactly one quadrant**, the probability they intersect is also \\(\\tfrac12\\).\n\nCollecting the contributions,\n\n\\[\n\\begin{aligned}\nP(\\text{intersection}) &=\n\\underbrace{\\frac{6}{36}\\cdot\\frac12}_{\\text{same pair}}\n+\\underbrace{\\frac{24}{36}\\cdot\\frac12}_{\\text{share one quadrant}}\n+\\underbrace{\\frac{2}{36}\\cdot1}_{\\text{disjoint opposite}}\\\\[2mm]\n&=\\frac{3}{36}+\\frac{12}{36}+\\frac{2}{36}\n=\\frac{17}{36}.\n\\end{aligned}\n\\]\n\nThus for any unordered pair of the 25 random chords\n\n\\[\np:=P(\\text{they intersect})=\\frac{17}{36}.\n\\]\n\nThere are \\(\\binom{25}{2}=300\\) such pairs, so\n\n\\[\nE[I_{\\text{random}}]=300\\cdot\\frac{17}{36}\n=\\frac{300}{36}\\cdot17\n=\\frac{25}{3}\\cdot17\n=\\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4.  Expected total number of interior intersections**\n\n\\[\n\\begin{aligned}\nE[I] &= I_{\\text{centre}}\n      +E[I_{\\text{vert}}]\n      +E[I_{\\text{horiz}}]\n      +E[I_{\\text{random}}]  \\\\[2mm]\n     &=1+\\frac{50}{3}+\\frac{50}{3}+\\frac{425}{3} \\\\[2mm]\n     &=1+\\frac{525}{3}=1+175=176 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5.  Expected number of regions**\n\n\\[\nE[R]=28+E[I]=28+176=204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Outline**\n\n1.  Transform the recurrence for \\(x_k\\) into a simpler one.\n\n   Define  \n\n   \\[\n   w_k=\\frac{x_k-1}{x_k+1}\\quad\\Longleftrightarrow\\quad \n   x_k=\\frac{1+w_k}{1-w_k}.\n   \\]\n\n   Substituting in  \n\n   \\[\n   x_{k+1}= \\frac13\\Bigl(x_k+\\frac1{x_k}-1\\Bigr)\n   \\]\n\n   gives after simplification  \n\n   \\[\n   w_{k+1}= \\frac{3w_k^2-1}{2}. \\tag{1}\n   \\]\n\n   The initial value is  \n\n   \\[\n   w_1=\\frac{25/11-1}{25/11+1}=\\frac{7}{18}.\n   \\]\n\n2.  Write \\(w_k=\\dfrac{a_k}{b_k}\\) in lowest terms\n   (\\(a_k\\) odd, \\(b_k\\) even).  \n\n   From (1),\n\n   \\[\n   w_{k+1}= \\frac{3a_k^2-b_k^2}{2b_k^2}.\n   \\]\n\n   Because \\(a_k\\) is not divisible by\u202f3, the numerator is always\n   \\(\\equiv 3\\pmod 9\\); hence it contains exactly one factor\u202f3.\n   After canceling this factor we obtain\n\n   \\[\n   a_{k+1}= \\frac{3a_k^2-b_k^2}{3},\\qquad\n   b_{k+1}= \\frac{2b_k^2}{3}.\n   \\tag{2}\n   \\]\n\n   Consequently  \n\n   \\[\n   b_{k+1}= \\frac{2}{3}b_k^{\\,2}. \\tag{3}\n   \\]\n\n3.  Determine a closed form for \\(b_k\\).\n\n   Write \\(b_k=2^{\\alpha_k}3^{\\beta_k}\\).\n   From (3)\n\n   \\[\n   2^{\\alpha_{k+1}}3^{\\beta_{k+1}}\n   =\\frac{2}{3}\\bigl(2^{\\alpha_k}3^{\\beta_k}\\bigr)^2\n   =2^{2\\alpha_k+1}3^{2\\beta_k-1},\n   \\]\n\n   whence  \n\n   \\[\n   \\alpha_{k+1}=2\\alpha_k+1,\\qquad\n   \\beta_{k+1}=2\\beta_k-1,\n   \\]\n   with \\(\\alpha_1=1,\\ \\beta_1=2\\).\n\n   Solving these linear recurrences gives  \n\n   \\[\n   \\alpha_k = 2^{\\,k}-1,\\qquad\n   \\beta_k = 2^{\\,k-1}+1 .\n   \\]\n\n   Therefore  \n\n   \\[\n   b_k = 2^{\\,2^{k}-1}\\,3^{\\,2^{k-1}+1}. \\tag{4}\n   \\]\n\n4.  Recover \\(x_k\\) from \\(w_k\\).\n\n   Since \\(x_k=\\dfrac{1+w_k}{1-w_k}\\) and \\(w_k=\\dfrac{a_k}{b_k}\\),\n\n   \\[\n   x_k=\\frac{b_k+a_k}{\\,b_k-a_k\\,}= \\frac{m_k}{n_k},\n   \\]\n   where \\(m_k=b_k+a_k,\\ n_k=b_k-a_k\\).  \n   Because \\(a_k\\) is odd and \\(b_k\\) is even, \\(m_k\\) and \\(n_k\\) are odd,\n   so \\(\\gcd(m_k,n_k)=1\\).\n\n   Hence\n\n   \\[\n   m_k+n_k = (b_k+a_k)+(b_k-a_k)=2b_k.\n   \\]\n\n5.  Compute \\(m_{2025}+n_{2025}\\pmod{1000}\\).\n\n   From (4),\n\n   \\[\n   b_{2025}=2^{\\,2^{2025}-1}\\,3^{\\,2^{2024}+1},\n   \\qquad\n   m_{2025}+n_{2025}=2b_{2025}\n   =2^{\\,2^{2025}}\\,3^{\\,2^{2024}+1}.\n   \\]\n\n   We need this value modulo \\(1000=2^3\\cdot5^3\\).\n\n   *Modulo\u202f8:* the exponent of\u202f2 is at least\u202f3, so the whole product\n   is \\(0\\pmod8\\).\n\n   *Modulo\u202f125:* use Euler\u2019s theorem (\\(\\phi(125)=100\\)):\n   \\[\n   2^{2^{2025}}\\equiv2^{\\,32}\\pmod{125},\\qquad\n   3^{2^{2024}+1}\\equiv3^{\\,17}\\pmod{125},\n   \\]\n   because \\(2^{2025}\\equiv32\\) and \\(2^{2024}+1\\equiv17\\pmod{100}\\).\n\n   Computing,\n   \\[\n   2^{32}\\equiv46,\\qquad 3^{17}\\equiv38\\pmod{125},\n   \\]\n   so\n   \\[\n   2^{2^{2025}}3^{2^{2024}+1}\\equiv46\\cdot38\\equiv123\\pmod{125}.\n   \\]\n\n   Solve the simultaneous congruences\n   \\[\n   X\\equiv0\\pmod8,\\qquad X\\equiv123\\pmod{125}.\n   \\]\n   Writing \\(X=125a+123\\) and using \\(125\\equiv5\\pmod8\\) gives\n   \\(5a+3\\equiv0\\pmod8\\Rightarrow a\\equiv1\\pmod8\\).\n   Hence \\(X=125\\cdot1+123=248\\).\n\n   Therefore  \n\n   \\[\n   m_{2025}+n_{2025}\\equiv\\boxed{248}\\pmod{1000}.\n   \\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nf(x)=\\sin\\bigl(7\\pi\\sin (5x)\\bigr)\n\\]\n\nThe zeros of \\(f\\) occur when the inner sine gives an integer multiple of \\(\\pi\\):\n\n\\[\n\\sin\\bigl(7\\pi\\sin (5x)\\bigr)=0\\Longleftrightarrow 7\\pi\\sin(5x)=k\\pi\n\\Longleftrightarrow \\sin(5x)=\\frac{k}{7},\n\\qquad k\\in\\mathbb Z .\n\\]\n\nBecause \\(\\sin(5x)\\in[-1,1]\\), \\(|k|\\le7\\); thus \\(k=-7,-6,\\dots ,6,7\\).\n\n---\n\n### 1.  Counting the zeros  \n\nSet \\(\\theta =5x\\).  \nWhen \\(x\\in(0,2\\pi)\\) we have \\(\\theta\\in(0,10\\pi)\\).\n\nFor each admissible integer \\(k\\) we need the number of solutions of  \n\n\\[\n\\sin\\theta=\\frac{k}{7},\\qquad \\theta\\in(0,10\\pi).\n\\]\n\n* **\\(k=0\\):** \\(\\sin\\theta=0\\Rightarrow\\theta=n\\pi\\).  \n  Inside \\((0,10\\pi)\\) we have \\(n=1,2,\\ldots ,9\\) \u2192 **9 solutions**.\n\n* **\\(k=\\pm 7\\):** \\(\\sin\\theta=\\pm1\\).  \n  \\(\\sin\\theta=1\\) gives \\(\\theta=\\dfrac{\\pi}{2}+2\\pi n\\);  \n  \\(\\sin\\theta=-1\\) gives \\(\\theta=\\dfrac{3\\pi}{2}+2\\pi n\\).  \n  For \\(0<\\theta<10\\pi\\) each yields \\(n=0,1,2,3,4\\) \u2192 **5 solutions** for \\(k=7\\) and **5** for \\(k=-7\\).\n\n* **\\(k=\\pm1,\\pm2,\\dots ,\\pm6\\):** \\(|k|<7\\) so \\(-1<k/7<1\\) and \\(\\neq0\\).  \n  In each full period \\([0,2\\pi]\\) the equation \\(\\sin\\theta=c\\) (\\(|c|<1\\)) has two solutions.  \n  The interval \\((0,10\\pi)\\) contains five full periods, hence **\\(5\\times2=10\\) solutions** for each of these 12 values of \\(k\\).\n\nSumming all contributions  \n\n\\[\n\\begin{aligned}\nn &=\\underbrace{9}_{k=0}\n   +\\underbrace{5+5}_{k=\\pm7}\n   +\\underbrace{12\\times10}_{k=\\pm1,\\dots,\\pm6}\\\\[2mm]\n  &=9+10+120 = 139 .\n\\end{aligned}\n\\]\n\nThus there are \\(\\boxed{139}\\) zeros of \\(f\\) in \\((0,2\\pi)\\).\n\n---\n\n### 2.  Zeros where the graph is tangent to the \\(x\\)-axis  \n\nA point where the graph touches the \\(x\\)-axis must satisfy  \n\n\\[\nf(x)=0\\quad\\text{and}\\quad f'(x)=0.\n\\]\n\nFrom \\(f(x)=0\\) we have \\(\\sin(5x)=k/7\\) as above.  \nCompute the derivative:\n\n\\[\n\\begin{aligned}\nf'(x) &=\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot 7\\pi\\cdot 5\\cos(5x)   \\\\\n      &=35\\pi\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cos(5x).\n\\end{aligned}\n\\]\n\nThus \\(f'(x)=0\\) iff \\(\\cos(5x)=0\\) (the factor \\(\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\) never vanishes at a zero, because\n\\(\\cos(k\\pi)=\\pm1\\)).  \n\n\\[\n\\cos(5x)=0\\Longrightarrow 5x=\\frac{\\pi}{2}+n\\pi\\quad\\Longrightarrow\\quad\\sin(5x)=\\pm1.\n\\]\n\nHence the tangential zeros correspond exactly to the solutions of \\(\\sin(5x)=\\pm1\\), i.e. the cases \\(k=\\pm7\\).\n\nWe already counted these:  \n\n* \\(\\sin(5x)=1\\) gives \\(5\\) solutions,\n* \\(\\sin(5x)=-1\\) gives \\(5\\) solutions.\n\nTherefore  \n\n\\[\nt = 5+5 = 10 .\n\\]\n\n(Indeed, at these points \\(f'(x)=0\\) and \\(f''(x)\\neq0\\), so the graph just touches the axis.)\n\n---\n\n### 3.  Required sum  \n\n\\[\nn+t = 139 + 10 = \\boxed{149}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nN=25q+r ,\\qquad 0\\le r<25 .\n\\]\n\nThe greedy algorithm first takes \\(q\\) coins of 25\u202f\u00a2, then  \n\\(t=\\big\\lfloor r/10\\big\\rfloor\\) coins of 10\u202f\u00a2 and finally  \n\\(s=r-10t\\) pennies.  \n\n\\[\n\\text{Greedy coins}=C_g(N)=q+t+s.\n\\]\n\n---\n\n### 1.  What is an optimal representation?\n\nIf a representation uses \\(a\\) 25\u2011cent coins, \\(b\\) 10\u2011cent coins and \\(c\\) pennies, then  \n\n\\[\n25a+10b+c=N,\\qquad a,b,c\\ge0,\n\\]\nand the number of coins is  \n\n\\[\nC= a+b+c = N-(24a+9b).\n\\]\n\nThus **minimising the number of coins is equivalent to maximising**  \n\n\\[\nP=24a+9b \\qquad\\text{subject to}\\qquad 25a+10b\\le N .\n\\]\n\nThe \u201cprofit\u2019\u2019 per cent is larger for a 25\u2011cent coin \\((24/25)\\) than for a 10\u2011cent coin \\((9/10)\\); therefore an optimal solution will use as many 25\u2011cent coins as possible unless removing a 25\u2011cent coin allows us to add enough 10\u2011cent coins to increase the profit.\n\n---\n\n### 2.  Effect of removing \\(k\\) quarters\n\nLet us replace \\(k\\) quarters by 10\u2011cent coins.  \nWrite \\(r=10u+v\\;(0\\le v\\le 9)\\).  \nAfter removing \\(k\\) quarters, the remainder becomes  \n\n\\[\nR=r+25k=10u+v+25k .\n\\]\n\nThe maximal number of dimes that can be added is  \n\n\\[\nb'=\\big\\lfloor \\frac{R}{10}\\big\\rfloor\n   =u+ \\big\\lfloor 2.5k+\\tfrac{v}{10}\\big\\rfloor .\n\\]\n\nThe change in profit is\n\n\\[\n\\Delta P\n=-24k+9\\big(b'-\\big\\lfloor r/10\\big\\rfloor\\big)\n=-6k+9\\Big\\lfloor\\frac{k}{2}\\Big\\rfloor+9\\delta ,\n\\]\n\nwhere  \n\n\\[\n\\delta=\n\\begin{cases}\n1 &\\text{if }k\\text{ is odd and }v\\ge5,\\\\\n0 &\\text{otherwise.}\n\\end{cases}\n\\]\n\n*If \\(k\\) is even*, \\(\\Delta P=-3k/2<0\\); the profit never increases.  \n\n*If \\(k\\) is odd*, write \\(k=2m+1\\). Then  \n\n\\[\n\\Delta P=9\\delta-(3m+6).\n\\]\n\nThe only way \\(\\Delta P>0\\) is when \\(m=0\\) (i.e. \\(k=1\\)) and \\(\\delta=1\\),\nwhich occurs exactly when  \n\n\\[\nv=r\\bmod 10\\ge5 .\n\\]\n\nHence **the greedy algorithm fails precisely when**\n\\[\nN\\ge 25\\quad\\text{and}\\quad (N\\bmod 25)\\bmod 10\\ge5.\n\\]\n\nEquivalently, the \u201cbad\u2019\u2019 remainders (after taking as many quarters as possible) are  \n\n\\[\nr\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\nIn each block of 25 consecutive integers there are 10 such remainders.\n\n---\n\n### 3.  Counting the failures between 1 and 1000\n\nThe interval \\([25,1000]\\) contains \\(1000-24=976\\) integers.\nFrom 25 onward the numbers are grouped into blocks  \n\n\\[\n25\\!-\\!49,\\;50\\!-\\!74,\\;\\dots,\\;975\\!-\\!999 .\n\\]\n\nThere are \\(39\\) full blocks (the block \\(25\\!-\\!49\\) up to \\(975\\!-\\!999\\)).\nEach block contributes exactly \\(10\\) failures, so\n\n\\[\n\\#\\text{failures}=39\\times10=390 .\n\\]\n\nNumbers \\(1\\) through \\(24\\) are never failures (they contain no quarters).\n\nThus the number of successes is  \n\n\\[\n1000-390=610 .\n\\]\n\n---\n\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      In a regular \\(24\\)-gon label the vertices \\(0,1,\\dots ,23\\) clockwise.  \nIf two vertices differ by \\(k\\) (mod \\(24\\)), the chord joining them has length that depends only on  \n\n\\[\ns=\\min (k,24-k)\\qquad (1\\le s\\le 12).\n\\]\n\nThus there are \\(12\\) possible lengths, one for each \\(s=1,2,\\dots ,12\\).\n\n--------------------------------------------------------------------\n### 1.  The graph of chords of a fixed length  \n\nFix a value \\(s\\).  The set of all chords of that length is the edge\u2011set of the **circulant graph**\n\\[\nG_s=\\{\\,\\{i,i+s\\}\\mid i=0,1,\\dots ,23\\,\\},\n\\]\nwhere the addition is taken modulo \\(24\\).\n\nLet \\(g=\\gcd(s,24)\\).  Adding \\(s\\) repeatedly splits the vertex set into \\(g\\) cycles,\neach of length  \n\n\\[\nL=\\frac{24}{g}.\n\\]\n\nSo \\(G_s\\) is a disjoint union of \\(g\\) cycles \\(C_L\\).\n\n--------------------------------------------------------------------\n### 2.  When can a perfect matching exist?\n\nA perfect matching (a set of \\(12\\) disjoint edges covering all vertices) can exist only if\nevery component cycle has even length, i.e. \\(L\\) is even.\nSince \\(L=24/g\\), this is equivalent to \\(g\\mid 12\\).\n\n*If \\(g\\mid 12\\) and \\(L\\ge 4\\)*, each even cycle \\(C_L\\) has exactly **2** perfect\nmatchings (choose alternating edges).  \n*If \\(L=2\\)* (the case \\(s=12\\)), each component is a single edge and contributes only **1** matching.\n\nThe only step for which \\(g\\nmid 12\\) is \\(s=8\\) (here \\(g=8\\) and the components are 3\u2011cycles),\nso no perfect matching exists for \\(s=8\\).\n\n--------------------------------------------------------------------\n### 3.  Number of matchings for each possible length\n\n\\[\n\\begin{array}{c|c|c|c}\ns & g=\\gcd(s,24) & L=24/g & \\#\\text{ matchings}\\\\ \\hline\n1 &1 &24 &2\\\\\n2 &2 &12 &2^{2}=4\\\\\n3 &3 & 8 &2^{3}=8\\\\\n4 &4 & 6 &2^{4}=16\\\\\n5 &1 &24 &2\\\\\n6 &6 & 4 &2^{6}=64\\\\\n7 &1 &24 &2\\\\\n8 &8 & 3 &0\\\\\n9 &3 & 8 &2^{3}=8\\\\\n10&2 &12 &2^{2}=4\\\\\n11&1 &24 &2\\\\\n12&12& 2 &1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Total number of ways\n\nAdd the numbers for all admissible lengths (all \\(s\\) except \\(s=8\\)):\n\n\\[\n\\begin{aligned}\n\\text{Total}&=2+4+8+16+2+64+2+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{113}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The chairs can be represented by a binary string of length\u202f16, where a \\(1\\) means the chair is taken.  \nWe need strings with exactly eight\u202f\\(1\\)\u2019s and with **no three consecutive \\(1\\)\u2019s** (otherwise the middle person would sit next to two others).\n\n---\n\n### Counting by blocks\n\nA valid string consists of blocks of consecutive \\(1\\)\u2019s of length\u202f1 or\u202f2, separated by at least one \\(0\\).\n\nLet  \n\n* \\(t\\) = number of blocks of length\u202f2,  \n* \\(b\\) = total number of blocks.  \n\nSince each block contributes at least one \\(1\\),\n\n\\[\n\\underbrace{(b-t)}_{\\text{blocks of length 1}}+2t=8\\quad\\Longrightarrow\\quad b+ t=8,\\; b=8-t .\n\\]\n\nSo \\(t=0,1,2,3,4\\).\n\nFor a fixed \\(t\\):\n* Choose which of the \\(b\\) blocks are the length\u20112 ones: \\(\\displaystyle\\binom{b}{t}=\\binom{8-t}{t}\\).\n* There are \\(8-8=8\\) empty chairs; let \\(z=8\\).  \n  The \\(b+1\\) gaps (including the two ends) must contain these zeros, with at least one zero in each interior gap.  \n  After placing one zero in each of the \\(b-1\\) interior gaps, we have \\(z-(b-1)=9-b\\) zeros left to distribute freely among the \\(b+1\\) gaps.  \n  The number of ways is \\(\\displaystyle\\binom{9-b}{b}=\\binom{9}{b}\\).\n\nHence for each \\(t\\),\n\n\\[\nN_t=\\binom{8-t}{t}\\binom{9}{8-t}.\n\\]\n\nSumming over \\(t=0\\) to \\(4\\):\n\n\\[\n\\begin{aligned}\nN &=\\binom{8}{0}\\binom{9}{8}\n   +\\binom{7}{1}\\binom{9}{7}\n   +\\binom{6}{2}\\binom{9}{6}\n   +\\binom{5}{3}\\binom{9}{5}\n   +\\binom{4}{4}\\binom{9}{4} \\\\[2mm]\n  &=1\\cdot9+7\\cdot36+15\\cdot84+10\\cdot126+1\\cdot126\\\\\n  &=9+252+1260+1260+126\\\\\n  &=2907 .\n\\end{aligned}\n\\]\n\n---\n\n### Modulo\u202f1000\n\n\\[\n2907 \\equiv 907 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nr_i=A_1A_i\\qquad (i=2,\\dots ,11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}.\n\\]\n\nFor each \\(i=2,\\dots ,10\\)\n\n\\[\n\\cos\\theta=\\frac{12}{13},\\qquad \n\\text{Area}(A_iA_1A_{i+1})=\\frac12 r_i r_{i+1}\\sin\\theta =1 .\n\\]\n\nSince \\(\\sin\\theta=\\sqrt{1-\\cos ^2\\theta}=5/13\\),\n\n\\[\nr_i r_{i+1}= \\frac{2}{\\sin\\theta}= \\frac{2}{5/13}= \\frac{26}{5}\n=:k\\quad\\text{(constant)}.\n\\]\n\nThus  \n\n\\[\nr_{i+1}= \\frac{k}{r_i},\\qquad\\text{so}\\qquad r_{i+2}=r_i .\n\\]\n\nHence the distances from \\(A_1\\) alternate:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=a,\\qquad  \nr_3=r_5=r_7=r_9=r_{11}=b,\n\\]\n\nwith  \n\n\\[\nab=k=\\frac{26}{5}.\n\\]\n\n--------------------------------------------------------------------\n### Length of a side \\(A_iA_{i+1}\\)\n\nFor any consecutive pair \\((a,b)\\),\n\n\\[\nA_iA_{i+1}=d=\\sqrt{a^2+b^2-2ab\\cos\\theta}\n           =\\sqrt{a^2+b^2-\\frac{24}{13}ab}.\n\\]\n\nLet  \n\n\\[\nx=a+b,\\qquad ab=k .\n\\]\n\nBecause \\(a^2+b^2=(a+b)^2-2ab=x^2-2k\\),\n\n\\[\nd=\\sqrt{x^2-2k-\\frac{24}{13}k}\n   =\\sqrt{x^2-\\frac{50}{13}\\,k}.\n\\]\n\nSince \\(k=\\dfrac{26}{5}\\),\n\n\\[\n\\frac{50}{13}k=\\frac{50}{13}\\cdot\\frac{26}{5}=20,\n\\qquad\\boxed{d=\\sqrt{x^2-20}} .\n\\]\n\n--------------------------------------------------------------------\n### Using the perimeter\n\nThe perimeter of the 11\u2011gon is\n\n\\[\na+b+9d = x+9\\sqrt{x^2-20}=20 .\n\\]\n\nSolve for \\(x\\) (note \\(x>0\\) and \\(\\sqrt{x^2-20}\\ge0\\)):\n\n\\[\n9\\sqrt{x^2-20}=20-x\\quad\\Longrightarrow\\quad\n81(x^2-20)=(20-x)^2 .\n\\]\n\nThis gives  \n\n\\[\n80x^2+40x-2020=0\\;\\Longrightarrow\\;4x^2+2x-101=0.\n\\]\n\nHence  \n\n\\[\nx=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n  =\\frac{-2\\pm18\\sqrt5}{8}\n  =\\frac{-1\\pm9\\sqrt5}{4}.\n\\]\n\nOnly the positive root satisfies the constraints, so  \n\n\\[\n\\boxed{x=a+b=\\frac{9\\sqrt5-1}{4}} .\n\\]\n\nThus\n\n\\[\nA_1A_2+A_1A_{11}=a+b=\\frac{9\\sqrt5-1}{4}\n    =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\nAll conditions on \\(m,n,p,q\\) are met, and\n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      In base \\(b\\) the numbers are  \n\n\\[\n17_{b}=1\\cdot b+7=b+7, \\qquad 97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need \\(b+7\\) to divide \\(9b+7\\).\n\n---\n\n### Find the divisibility condition  \n\n\\[\n9b+7 = 9(b+7)-56 .\n\\]\n\nThus the remainder when \\(9b+7\\) is divided by \\(b+7\\) is \\(-56\\).  \nHence \\(b+7\\) must divide \\(56\\):\n\n\\[\nb+7\\mid 56 .\n\\]\n\n---\n\n### Possible values of \\(b\\)\n\nThe positive divisors of \\(56\\) are  \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nBecause the base must satisfy \\(b>9\\), we have \\(b+7>16\\).  \nThe divisors larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7&=28 \\quad\\Longrightarrow\\quad b=21,\\\\[2pt]\nb+7&=56 \\quad\\Longrightarrow\\quad b=49 .\n\\end{aligned}\n\\]\n\nBoth bases are greater than \\(9\\) and allow the digits \\(1,7,9\\).\n\n---\n\n### Sum of all such bases  \n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 70

      \n

      Extracted Answer: 70

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The numbers of players picking chocolate, vanilla and strawberry are  \n\n\\[\na=\\#\\text{chocolate},\\qquad b=\\#\\text{vanilla},\\qquad c=\\#\\text{strawberry}\n\\]\n\nwith  \n\n\\[\na+b+c=9,\\qquad a>b>c\\ge1 .\n\\]\n\nHence \\((a,b,c)\\) must be three distinct positive integers whose sum is \\(9\\).  \nThe possible triples (written in decreasing order) are  \n\n\\[\n(6,2,1),\\;(5,3,1),\\;(4,3,2).\n\\]\n\nFor a fixed triple \\((a,b,c)\\) the players are distinct, so the number of assignments\nis the multinomial coefficient  \n\n\\[\n\\binom{9}{a,b,c}= \\frac{9!}{a!\\,b!\\,c!}.\n\\]\n\nCompute each term:\n\n\\[\n\\begin{aligned}\n(6,2,1):&\\quad \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1):&\\quad \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2):&\\quad \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\nAdd them:\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\nThe remainder when \\(N\\) is divided by \\(1000\\) is  \n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 16

      \n

      Extracted Answer: 16

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nso that \\(\\angle A=90^{\\circ}\\) and  \n\n\\[\nBC=\\sqrt{b^{2}+c^{2}}=38\\qquad\\Longrightarrow\\qquad b^{2}+c^{2}=38^{2}=1444 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Determining the positions of \\(K\\) and \\(L\\)\n\nBecause  \n\n\\[\nAK=BK=14\n\\]\n\nthe point \\(K\\) lies at the intersection of the circles of radius \\(14\\) centred at\n\\(A\\) and \\(B\\).  \nIf \\(K=(x_{K},y_{K})\\),\n\n\\[\nx_{K}^{2}+y_{K}^{2}=196,\\qquad (x_{K}-b)^{2}+y_{K}^{2}=196 .\n\\]\n\nSubtracting gives  \n\n\\[\nb^{2}=2bx_{K}\\;\\Longrightarrow\\;x_{K}= \\frac{b}{2} .\n\\tag{2}\n\\]\n\nHence  \n\n\\[\ny_{K}^{2}=196-\\Bigl(\\frac{b}{2}\\Bigr)^{2}=196-\\frac{b^{2}}{4}.\n\\tag{3}\n\\]\n\nSimilarly, from  \n\n\\[\nAL=CL=14\n\\]\n\nthe point \\(L=(x_{L},y_{L})\\) satisfies\n\n\\[\ny_{L}= \\frac{c}{2},\\qquad \nx_{L}^{2}=196-\\Bigl(\\frac{c}{2}\\Bigr)^{2}=196-\\frac{c^{2}}{4}.\n\\tag{4}\n\\]\n\nThus, writing  \n\n\\[\nU=\\frac{b}{2},\\quad V=\\frac{c}{2},\n\\]\n\nwe have  \n\n\\[\nK=\\bigl(U,\\;\\sqrt{196-U^{2}}\\bigr),\\qquad \nL=\\bigl(\\sqrt{196-V^{2}},\\;V\\bigr),\n\\tag{5}\n\\]\n\nand from (1)  \n\n\\[\nU^{2}+V^{2}=361. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Using the condition \\(KL=14\\)\n\nFrom (5),\n\n\\[\n\\bigl(U-\\sqrt{196-V^{2}}\\bigr)^{2}\n+\\bigl(\\sqrt{196-U^{2}}-V\\bigr)^{2}=196 .\n\\]\n\nExpanding and simplifying with (6) gives\n\n\\[\nU\\sqrt{196-V^{2}}+V\\sqrt{196-U^{2}}=98 . \\tag{7}\n\\]\n\nLet  \n\n\\[\np=\\sqrt{196-V^{2}},\\qquad q=\\sqrt{196-U^{2}} .\n\\]\n\nThen  \n\n\\[\nU p+V q =98 ,\\qquad p^{2}+q^{2}=31 ,\n\\qquad U^{2}+V^{2}=361 . \\tag{8}\n\\]\n\nFrom (8) we obtain the product\n\n\\[\nU^{2}V^{2}=32448\\quad\\Longrightarrow\\quad UV=104\\sqrt3 . \\tag{9}\n\\]\n\nNow  \n\n\\[\n(U+V)^{2}=U^{2}+V^{2}+2UV=361+208\\sqrt3,\n\\]\n\\[\n(U-V)^{2}=U^{2}+V^{2}-2UV=361-208\\sqrt3 .\n\\]\n\nBoth expressions are perfect squares:\n\n\\[\n361+208\\sqrt3=(13+8\\sqrt3)^{2},\n\\qquad\n361-208\\sqrt3=(8\\sqrt3-13)^{2}.\n\\]\n\nHence  \n\n\\[\nU+V=13+8\\sqrt3,\\qquad\n|U-V|=8\\sqrt3-13 .\n\\]\n\nSince \\(U>V\\), solving gives  \n\n\\[\nU=8\\sqrt3,\\qquad V=13 .\n\\]\n\nConsequently  \n\n\\[\nb=2U=16\\sqrt3,\\qquad c=2V=26 .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Coordinates of \\(K\\) and \\(L\\)\n\nUsing (5) with the found \\(U,V\\):\n\n\\[\nK=\\bigl(8\\sqrt3,\\; \\sqrt{196-(8\\sqrt3)^{2}}\\bigr)\n   =\\bigl(8\\sqrt3,\\;2\\bigr),\n\\]\n\n\\[\nL=\\bigl(\\sqrt{196-13^{2}},\\;13\\bigr)\n   =\\bigl(3\\sqrt3,\\;13\\bigr).\n\\]\n\n--------------------------------------------------------------------\n### 4.  Area of quadrilateral \\(BKLC\\)\n\nThe vertices in order are  \n\n\\[\nB=(16\\sqrt3,0),\\ K=(8\\sqrt3,2),\\ L=(3\\sqrt3,13),\\ C=(0,26).\n\\]\n\nApplying the shoelace formula:\n\n\\[\n\\begin{aligned}\nS_{1}&=x_{B}y_{K}+x_{K}y_{L}+x_{L}y_{C}+x_{C}y_{B}\\\\\n     &= (16\\sqrt3)(2)+(8\\sqrt3)(13)+(3\\sqrt3)(26)+0\\\\\n     &=32\\sqrt3+104\\sqrt3+78\\sqrt3=214\\sqrt3,\n\\\\[2mm]\nS_{2}&=y_{B}x_{K}+y_{K}x_{L}+y_{L}x_{C}+y_{C}x_{B}\\\\\n     &=0+2(3\\sqrt3)+13\\cdot0+26(16\\sqrt3)\\\\\n     &=6\\sqrt3+416\\sqrt3=422\\sqrt3 .\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n\\text{Area}=\\frac12|S_{1}-S_{2}|\n           =\\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n           =\\frac12\\,(208\\sqrt3)=104\\sqrt3 .\n\\]\n\nThus the required area is \\(104\\sqrt3\\), i.e. \\(n=104\\).\n\n\\[\n\\boxed{104}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: 104

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The equation  \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored over the integers.\n\n\\[\n\\begin{aligned}\n12x^{2}-xy-6y^{2}\n&= (4x-3y)(3x+2y).\n\\end{aligned}\n\\]\n\nHence a pair \\((x,y)\\) satisfies the equation iff  \n\n\\[\n4x-3y=0 \\qquad\\text{or}\\qquad 3x+2y=0 .\n\\]\n\n---\n\n### 1.  Solutions of \\(4x-3y=0\\)\n\n\\[\n4x=3y \\Longrightarrow x=\\frac34y .\n\\]\n\nSince \\(x,y\\) are integers, \\(y\\) must be a multiple of \\(4\\); write \\(y=4k\\) \\((k\\in\\mathbb Z)\\).  \nThen \\(x=3k\\).\n\nBounds \\(-100\\le x,y\\le100\\) give  \n\n\\[\n|4k|\\le100\\ \\Longrightarrow\\ |k|\\le25 .\n\\]\n\nThus \\(k\\) can be any integer from \\(-25\\) to \\(25\\) inclusive \u2013 \\(51\\) possibilities.\n\n---\n\n### 2.  Solutions of \\(3x+2y=0\\)\n\n\\[\n3x=-2y \\Longrightarrow x=-\\frac{2}{3}y .\n\\]\n\nNow \\(y\\) must be a multiple of \\(3\\); write \\(y=3k\\).  \nThen \\(x=-2k\\).\n\nBounds give  \n\n\\[\n|3k|\\le100\\ \\Longrightarrow\\ |k|\\le\\Big\\lfloor\\frac{100}{3}\\Big\\rfloor=33 .\n\\]\n\nHence \\(k\\) can be any integer from \\(-33\\) to \\(33\\) inclusive \u2013 \\(67\\) possibilities.\n\n---\n\n### 3.  Removing double\u2011counted pair\n\nBoth families contain the pair \\((0,0)\\) (when \\(k=0\\)).  \nIt has been counted twice, so we subtract one.\n\n\\[\n\\text{Total solutions}=51+67-1=117 .\n\\]\n\nAll counted pairs satisfy \\(-100\\le x,y\\le100\\).\n\n\\[\n\\boxed{117}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 117

      \n

      Extracted Answer: 117

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the trapezoid have parallel sides \\(r\\) and \\(s\\) (\\(r\\neq s\\)), equal legs of length \\(L\\), height \\(h\\), and incircle radius \\(R=3\\).\n\n---\n\n### 1.  Semiperimeter from the incircle\n\nFor any tangential quadrilateral,\n\\[\n\\text{Area}=R\\cdot s,\n\\]\nwhere \\(s\\) is the semiperimeter.  \nGiven \\(\\text{Area}=72\\) and \\(R=3\\),\n\n\\[\ns=\\frac{72}{3}=24,\n\\qquad\\text{so } r+s+2L=2s=48. \\tag{1}\n\\]\n\n---\n\n### 2.  Height of the trapezoid\n\nSince the incircle touches both parallel sides, the distance between them equals twice the radius:\n\n\\[\nh=2R=6.\n\\]\n\nThe area also equals \\(\\frac{1}{2}(r+s)h\\). Thus\n\n\\[\n72=\\frac{1}{2}(r+s)\\cdot6 \\Longrightarrow r+s=24. \\tag{2}\n\\]\n\nSubstituting (2) into (1) gives\n\n\\[\n24+2L=48\\Longrightarrow L=12. \\tag{3}\n\\]\n\n---\n\n### 3.  Relating the bases and the leg\n\nIn an isosceles trapezoid the horizontal projection of each leg is \\(\\dfrac{s-r}{2}\\).\nUsing the right triangle formed by a leg, the height, and this projection:\n\n\\[\n\\left(\\frac{s-r}{2}\\right)^2+h^2=L^2.\n\\]\n\nInsert \\(h=6\\) and \\(L=12\\):\n\n\\[\n\\left(\\frac{s-r}{2}\\right)^2+36=144\n\\;\\Longrightarrow\\;\n\\frac{(s-r)^2}{4}=108\n\\;\\Longrightarrow\\;\n(s-r)^2=432.\n\\]\n\nHence\n\n\\[\ns-r=12\\sqrt3. \\tag{4}\n\\]\n\n---\n\n### 4.  Solve for \\(r\\) and \\(s\\)\n\nFrom (2) and (4):\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\ns-r=12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\ns=12+6\\sqrt3,\\;\\; r=12-6\\sqrt3.\n\\]\n\nBoth are positive and distinct, as required.\n\n---\n\n### 5.  Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}&=(12-6\\sqrt3)^2+(12+6\\sqrt3)^2\\\\\n&=2\\cdot12^{2}+2\\cdot(6\\sqrt3)^{2}\\\\\n&=2\\cdot144+2\\cdot108\\\\\n&=288+216\\\\\n&=504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 504

      \n

      Extracted Answer: 504

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      For an \\(8\\)-digit number formed with the digits \\(1,2,\\dots ,8\\) each once we need\n\n* divisibility by \\(2\\)   \\(\\Longrightarrow\\) the units digit is even (\\(2,4,6,8\\));\n* divisibility by \\(11\\) \\(\\Longrightarrow\\) the alternating sum of its digits is a multiple of \\(11\\).\n\n---\n\n### 1.  Divisibility by \\(11\\)\n\nWrite the digits as \\(d_1d_2d_3d_4d_5d_6d_7d_8\\) ( \\(d_1\\) most significant).  \n\nThe test for \\(11\\) gives  \n\n\\[\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\\equiv0\\pmod{11}.\n\\]\n\nLet  \n\n\\[\nO=d_1+d_3+d_5+d_7,\\qquad E=d_2+d_4+d_6+d_8 .\n\\]\n\nSince all eight digits are used once,  \n\n\\[\nO+E = 1+2+\\dots+8 = 36 .\n\\]\n\nThe condition \\(O-E\\equiv0\\pmod{11}\\) becomes  \n\n\\[\n2O\\equiv36\\pmod{11}\\quad\\Longrightarrow\\quad O\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe sum of four distinct digits from \\(\\{1,\\dots ,8\\}\\) lies between \\(10\\) and \\(26\\); the only value congruent to \\(7\\pmod{11}\\) in that range is \\(18\\).  \nHence we must have  \n\n\\[\nO=E=18.\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 2.  Choosing the odd\u2013position digits\n\nWe need all \\(4\\)-element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\nListing them (in increasing order) gives\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(8\\) such subsets.  \nEach of them contains exactly two even digits (the even digits are \\(2,4,6,8\\)). Consequently the complementary set (the digits placed in even positions) also contains exactly two evens.\n\n---\n\n### 3.  Forming the numbers\n\n*For a fixed subset* \\(S\\) (the odd\u2011position digits)\n\n* arrange its four digits among the odd places \\(1,3,5,7\\): \\(4!\\) ways;\n* the four remaining digits (the complement \\(T\\)) go to the even places \\(2,4,6,8\\).  \n  Since \\(T\\) contains two even digits, we may pick which even digit occupies the units place (position \\(8\\)) in \\(2\\) ways; the other three digits can be placed in \\(3!\\) ways.\n\nHence for each subset \\(S\\)\n\n\\[\n\\text{permutations}=4!\\times 2\\times3!=24\\times12=288 .\n\\]\n\nWith \\(8\\) possible subsets,\n\n\\[\nN=8\\times288=2304 .\n\\]\n\n(Equivalently, half of the \\(4608\\) numbers with \\(O=E=18\\) are even, giving the same result.)\n\n---\n\n### 4.  Required difference\n\n\\[\nN-2025 = 2304-2025 = 279.\n\\]\n\nThus the requested difference is  \n\n\\[\n\\boxed{279}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 279

      \n

      Extracted Answer: 279

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      We place \\(\\triangle ABC\\) on its circumcircle (radius\u00a01) with  \n\n\\[\nA=1,\\qquad B=e^{i2C},\\qquad C=e^{i(2C+2A)} .\n\\]\n\nThe orthocenter is  \n\n\\[\nH=a+b+c.\n\\]\n\nThe nine\u2011point circle is the image of the circumcircle under the homothety with centre \\(H\\) and factor \\(\\tfrac12\\); therefore for any point \\(X\\) on the nine\u2011point circle its image on the circumcircle is  \n\n\\[\nX' = 2X-H .\n\\]\n\nApplying this to the six points on the nine\u2011point circle gives\n\n\\[\n\\begin{aligned}\nD&\\mapsto -a,\\\\\nE&\\mapsto -b,\\\\\nF&\\mapsto -c,\\\\\nG&\\mapsto A' ,\\qquad A' \\text{ is the second intersection of the altitude }AA_H\\text{ with the circumcircle},\\\\\nH&\\mapsto B' ,\\qquad B'=-e^{i2A},\\\\\nJ&\\mapsto C' ,\\qquad C'=-e^{-i2A}.\n\\end{aligned}\n\\]\n\nUsing \\(a=1,\\;b=e^{i2C},\\;c=e^{i(2C+2A)}\\) we obtain the central\nangles (measured from the positive \\(x\\)-axis) of the corresponding points:\n\n\\[\n\\begin{array}{c|c}\n\\text{Nine\u2011point point} & \\text{Angle on the circumcircle}\\\\ \\hline\nD & 180^\\circ\\\\\nE & 180^\\circ+2C\\\\\nF & 180^\\circ-2B\\\\\nG & 180^\\circ+2A+4C\\\\\nH & 180^\\circ+2A\\\\\nJ & 180^\\circ-2A\n\\end{array}\n\\]\n\nBecause the homothety preserves directions from the centre, the\narc length on the nine\u2011point circle equals the corresponding central\nangle on the circumcircle.\n\nHence\n\n\\[\n\\begin{aligned}\n\\widehat{DE}&=(180^\\circ+2C)-180^\\circ =2C,\\\\[2mm]\n\\widehat{HJ}&=|\\, (180^\\circ+2A)-(180^\\circ-2A)\\,|=4A,\n\\end{aligned}\n\\]\n\nand the minor arc \\(HJ\\) is \\(360^\\circ-4A\\) (since \\(4A>180^\\circ\\)).\nFinally\n\n\\[\n\\widehat{FG}=|(180^\\circ-2B)-(180^\\circ+2A+4C)|\n            =2C\\qquad(\\text{mod }360^\\circ).\n\\]\n\nThus\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=2C+2\\bigl(360^\\circ-4A\\bigr)+3\\,(2C) \\\\\n&=720^\\circ-8A+8C\\\\\n&=720^\\circ+8(C-A).\n\\end{aligned}\n\\]\n\nFor the given triangle \\(A=84^\\circ,\\;C=36^\\circ\\),\n\n\\[\n720^\\circ+8(36^\\circ-84^\\circ)=720^\\circ-384^\\circ=336^\\circ .\n\\]\n\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The function  \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}, \\qquad x>0,\n\\]\n\nhas zeros at \\(x=18,72,98,k\\) and \\(\\displaystyle\\lim_{x\\to0^+}f(x)=+\\infty\\),\n\\(\\displaystyle\\lim_{x\\to\\infty}f(x)=+\\infty\\).\nHence the graph of \\(f\\) starts at \\(+\\infty\\), descends to a negative\nvalue, comes back to zero, rises again, etc.; it has exactly **two**\nnegative intervals:\n\\[\n(r_1,r_2),\\qquad (r_3,r_4),\n\\]\nwhere \\(\\{r_1,r_2,r_3,r_4\\}=\\{18,72,98,k\\}\\) ordered increasingly.\nIn each negative interval there is a local (and global) minimum of \\(f\\).\n\nLet  \n\n\\[\ng(x)=(x-18)(x-72)(x-98)(x-k),\n\\qquad f(x)=\\frac{g(x)}{x}.\n\\]\n\nA point \\(x_0\\) where \\(f\\) has an extremum satisfies  \n\n\\[\nf'(x_0)=0\\iff x_0g'(x_0)-g(x_0)=0\\iff \n\\sum_{i=1}^{4}\\frac{1}{x_0-r_i}= \\frac1{x_0}.\n\\]\n\nGeometrically, if \\(m=f(x_0)\\) then the line \\(y=m x\\) is tangent to the\nquartic graph \\(y=g(x)\\) at \\(x_0\\):\n\\[\ng(x)-mx=0\\quad\\text{has a double root at }x_0 .\n\\]\n\nIf the global minimum of \\(f\\) is attained at **two** distinct points,\nthe line \\(y=m x\\) must be tangent to \\(g\\) at two distinct points\n\\(\\alpha,\\beta\\). Hence\n\n\\[\ng(x)-mx=(x-\\alpha)^2 (x-\\beta)^2 .\n\\tag{1}\n\\]\n\nWrite  \n\n\\[\n\\alpha+\\beta=p,\\qquad \\alpha\\beta =q,\\qquad m \\text{ (the slope)} .\n\\]\n\nExpanding (1) and comparing with \\(g(x)-mx=x^4-S_1x^3+S_2x^2-(S_3+m)x+S_4\\) gives  \n\n\\[\n\\begin{aligned}\nS_1 &=2p,\\\\\nS_2 &=p^{2}+2q,\\\\\nS_4 &=q^{2},\\\\\nS_3+m &=2pq,\n\\end{aligned}\n\\tag{2}\n\\]\n\nwhere for our roots  \n\n\\[\n\\begin{aligned}\nS_1&=18+72+98+k=188+k,\\\\\nS_2&=18\\cdot72+18\\cdot98+72\\cdot98+ (18+72+98)k\n     =10116+188k,\\\\\nS_3&=18\\cdot72\\cdot98+ (18\\cdot72+18\\cdot98+72\\cdot98)k\n     =127008+10116k,\\\\\nS_4&=18\\cdot72\\cdot98\\cdot k=127008\\,k .\n\\end{aligned}\n\\]\n\nFrom (2) we obtain  \n\n\\[\np=\\frac{188+k}{2},\\qquad q=\\sqrt{127008\\,k}=252\\sqrt{2k}.\n\\]\n\nUsing the second equation of (2),\n\n\\[\nS_2=p^{2}+2q,\n\\]\n\ngives the condition on \\(k\\):\n\n\\[\n\\frac{(188+k)^{2}}{4}+2\\sqrt{127008k}=10116+188k .\n\\tag{3}\n\\]\n\n---\n\n### Solving (3)\n\nPut \\(k=t^{2}\\;(t>0)\\).  Since \\(\\sqrt{127008k}=252\\sqrt{2}\\,t\\),\n(3) becomes\n\n\\[\nt^{4}-376t^{2}+2016\\sqrt{2}\\,t-5120=0 .\n\\]\n\nFactoring,\n\n\\[\n(t^{2}+6\\sqrt{2}\\,t-320)(t^{2}-6\\sqrt{2}\\,t+16)=0 .\n\\]\n\nHence the positive solutions for \\(t\\) are\n\n\\[\nt=10\\sqrt2,\\qquad t=4\\sqrt2,\\qquad t=2\\sqrt2 .\n\\]\n\nConsequently\n\n\\[\nk=t^{2}=200,\\;32,\\;8 .\n\\]\n\n---\n\n### Verification\n\nFor each \\(k\\) the ordered roots of \\(g\\) are\n\n\\[\n\\begin{array}{c|c}\nk & \\text{ordered roots }(r_1,r_2,r_3,r_4)\\\\ \\hline\n8  & (8,18,72,98)\\\\\n32 & (18,32,72,98)\\\\\n200& (18,72,98,200)\n\\end{array}\n\\]\n\nUsing \\(p\\) and \\(q\\) we find the tangency points  \n\n\\[\n\\alpha,\\beta=\\frac{p\\pm\\sqrt{p^{2}-4q}}{2},\n\\]\n\nand they lie respectively in the intervals \\((r_1,r_2)\\) and\n\\((r_3,r_4)\\). Thus in each case the line \\(y=m x\\) is tangent to\n\\(g\\) at two points, giving exactly two distinct global minima of\n\\(f\\). No other \\(k>0\\) satisfies (3); hence these are the only three\nvalues.\n\nFinally, the required sum is\n\n\\[\n8+32+200 = 240 .\n\\]\n\n\\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nz=x+iy\\qquad (x,y\\in\\mathbb{R}).\n\\]\n\n---\n\n### 1.  The first equation \u2013 a circle  \n\n\\[\n|25+20i-z|=5 \\Longrightarrow (x-25)^2+(y-20)^2=5^2 .\n\\]\n\nThus the circle has centre  \n\n\\[\nC=(25,20),\\qquad \\text{radius } r=5 .\n\\]\n\n---\n\n### 2.  The second equation \u2013 a perpendicular bisector  \n\n\\[\n|z-(4+k)|=|z-(3i+k)|\n\\]\n\nwrites as  \n\n\\[\n(x-(k+4))^2+y^{2}=(x-k)^2+(y-3)^2 .\n\\]\n\nSimplifying,\n\n\\[\n-8x+6y+8k+7=0\\quad\\Longrightarrow\\quad 4x-3y-(4k+3.5)=0 .\n\\]\n\nHence the set of points satisfying the second condition is the line  \n\n\\[\nL:\\;4x-3y=4k+\\frac 72 .\n\\]\n\nThis is the perpendicular bisector of the segment joining  \n\\(A=(k+4,0)\\) and \\(B=(k,3)\\) (its slope is \\(4/3\\) for any \\(k\\)).\n\n---\n\n### 3.  One intersection  \\(\\iff\\)  tangency  \n\nThe system has exactly one solution precisely when the line \\(L\\) is tangent to the circle, i.e. when the distance from the centre \\(C\\) to \\(L\\) equals the radius \\(5\\).\n\nThe distance from \\((x_0,y_0)\\) to \\(Ax+By+C=0\\) is  \n\n\\[\n\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nFor \\(C=(25,20)\\) and \\(L: 4x-3y-(4k+3.5)=0\\),\n\n\\[\nd=\\frac{|4\\cdot25-3\\cdot20-(4k+3.5)|}{\\sqrt{4^{2}+(-3)^{2}}}\n   =\\frac{|40-4k-3.5|}{5}\n   =\\frac{|36.5-4k|}{5}.\n\\]\n\nSet \\(d=r=5\\):\n\n\\[\n\\frac{|36.5-4k|}{5}=5\\quad\\Longrightarrow\\quad |36.5-4k|=25 .\n\\]\n\n---\n\n### 4.  Solving for \\(k\\)\n\n\\[\n\\begin{cases}\n36.5-4k=25 &\\Longrightarrow\\;4k=11.5\\;\\Longrightarrow\\;k=\\dfrac{23}{8},\\\\[4pt]\n36.5-4k=-25 &\\Longrightarrow\\;4k=61.5\\;\\Longrightarrow\\;k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nThus the possible real values of \\(k\\) are  \n\n\\[\nk_1=\\frac{23}{8},\\qquad k_2=\\frac{123}{8}.\n\\]\n\nBoth give a line tangent to the circle, so each yields exactly one solution \\(z\\).\n\n---\n\n### 5.  Sum of the possible \\(k\\)\u2019s  \n\n\\[\nk_1+k_2=\\frac{23+123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\dfrac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\ n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 77

      \n

      Extracted Answer: 77

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  Write the recurrence for the numerators and denominators**\n\nLet  \n\n\\[\nx_k=\\frac{a_k}{b_k}\\qquad (a_k,b_k\\in \\mathbb Z ,\\; \\gcd(a_k,b_k)=1).\n\\]\n\nFrom  \n\n\\[\nx_{k+1}= \\frac{1}{3}\\Bigl(x_k+\\frac1{x_k}-1\\Bigr)=\\frac{x_k^2-x_k+1}{3x_k},\n\\]\n\nwe obtain  \n\n\\[\na_{k+1}=a_k^2-a_kb_k+b_k^2,\\qquad   \nb_{k+1}=3a_kb_k,          \\tag{1}\n\\]\n\nwith \\(a_1=25,\\;b_1=11\\).\n\n--------------------------------------------------------------------\n\n**Step 2.  The common factor \\(3^{e_k}\\)**  \n\nWrite  \n\n\\[\na_k=3^{e_k}A_k,\\qquad b_k=3^{e_k}B_k,\\qquad \\gcd(A_k,B_k)=1 .\n\\]\n\nDividing (1) by the highest possible power of \\(3\\) shows that\n\\(e_{k+1}=2e_k+1\\) and that the reduced pair \\((A_k,B_k)\\) always satisfies  \n\n\\[\nA_k\\equiv1\\pmod3,\\qquad B_k\\equiv2\\pmod3 .\n\\]\n\nWith \\(e_1=0\\) we get  \n\n\\[\ne_k=2^{\\,k-1}-1 .\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3.  A very simple recurrence for the sum**\n\nLet  \n\n\\[\nS_k=a_k+b_k .\n\\]\n\nFrom (1)\n\n\\[\n\\begin{aligned}\nS_{k+1}&=a_{k+1}+b_{k+1}\n       =(a_k^2-a_kb_k+b_k^2)+3a_kb_k   \\\\\n       &=a_k^2+b_k^2+2a_kb_k=(a_k+b_k)^2=S_k^{\\,2}.\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\nS_k=S_1^{\\,2^{\\,k-1}}=36^{\\,2^{\\,k-1}}. \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4.  The reduced numerator and denominator**\n\nSince the common factor is \\(3^{e_k}\\),\n\n\\[\n\\frac{a_k}{b_k}= \\frac{A_k}{B_k},\\qquad \nm=A_k,\\; n=B_k .\n\\]\n\nThus  \n\n\\[\nm+n=\\frac{a_k+b_k}{3^{e_k}}\n     =\\frac{36^{\\,2^{\\,k-1}}}{3^{\\,2^{\\,k-1}-1}}\n     =2^{\\,2^{\\,k}}\\;3^{\\,2^{\\,k-1}+1}. \\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5.  Apply \\(k=2025\\)**  \n\nFrom (4),\n\n\\[\nm+n=2^{\\,2^{2025}}\\;3^{\\,2^{2024}+1}.\n\\]\n\nWe need this number modulo \\(1000\\).\n\n--------------------------------------------------------------------\n\n**Step 6.  Reduce modulo \\(8\\) and \\(125\\)**  \n\n*Modulo \\(8\\):*  \\(2^{\\ge3}\\equiv0\\pmod8\\); therefore  \n\n\\[\nm+n\\equiv0\\pmod8. \\tag{5}\n\\]\n\n*Modulo \\(125\\):*  Because \\(\\phi(125)=100\\),\n\n\\[\n2^{2^{2025}}\\equiv 2^{\\,2^{2025}\\bmod100},\n\\qquad\n3^{2^{2024}+1}\\equiv 3^{\\,(2^{2024}+1)\\bmod100}\\pmod{125}.\n\\]\n\nCompute the exponents.\n\n- \\(2^{2025}\\bmod100\\):  \n  \\(2^{2025}\\equiv32\\pmod{100}\\) (by CRT: \\(2^{2025}\\equiv0\\pmod4\\), \\(2^{2025}\\equiv7\\pmod{25}\\)).\n- \\(2^{2024}\\bmod100\\):  \n  \\(2^{2024}\\equiv16\\pmod{100}\\).\n\nHence  \n\n\\[\n2^{2^{2025}}\\equiv2^{32}\\equiv46\\pmod{125},\n\\qquad\n3^{2^{2024}+1}\\equiv3^{17}\\equiv38\\pmod{125}.\n\\]\n\nTherefore  \n\n\\[\nm+n\\equiv46\\cdot38\\equiv123\\pmod{125}. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 7.  Chinese Remainder Theorem**\n\nFind \\(N\\) such that  \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nWrite \\(N=8k\\).  Then \\(8k\\equiv123\\pmod{125}\\), i.e.  \n\n\\[\nk\\equiv123\\cdot8^{-1}\\pmod{125}.\n\\]\n\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),  \n\n\\[\nk\\equiv123\\cdot47\\equiv31\\pmod{125}.\n\\]\n\nThus \\(k=31+125t\\) and  \n\n\\[\nN=8k=8\\cdot31=248\\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\n**Answer**\n\n\\[\n\\boxed{248}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nA<B<C<D<E<F<G<H<I<J<K<L\n\\]\n\nand suppose the letters are randomly paired.  \nFor a pair \\(\\{x,y\\}\\) we write the word \\(xy\\) with the letters in\nalphabetical order (\\(x<y\\)).  \nThe six words are then ordered alphabetically; the last word is the\nlexicographically largest word.\n\n--------------------------------------------------------------------\n### 1.  Conditioning on the partner of \\(G\\)\n\nIn a random perfect matching each of the other \\(11\\) letters is equally\nlikely to be paired with \\(G\\).  \nLet the partner be \\(X\\).  The probability we need is  \n\n\\[\nP=\\frac1{11}\\sum_{X\\neq G}\n\\Pr\\bigl(\\text{the pair } \\{G,X\\}\\text{ is the maximal word}\\mid\nG\\text{ is paired with }X\\bigr).\n\\]\n\nThus we must evaluate the conditional probability for each possible\n\\(X\\).\n\n--------------------------------------------------------------------\n### 2.  When \\(X<G\\)\n\nIf \\(X<G\\) the word is \\(XG\\) and its first letter is \\(X\\).  \nFor it to be the maximal word, the first letters (the smaller letters)\nof all other five pairs must be **smaller than \\(X\\)**.\nHence among the remaining ten letters we need five distinct letters\nall less than \\(X\\).\n\nThe only letter with five smaller letters is \\(F\\) (the letters\n\\(A,B,C,D,E\\) are smaller).  \nThus:\n\n* \\(X=F\\) is possible;\n* \\(X=A,B,C,D,E\\) are impossible (there are not enough smaller\nletters).\n\nWhen \\(X=F\\) the remaining letters are  \n\\(\\{A,B,C,D,E\\}\\) and \\(\\{H,I,J,K,L\\}\\).  \nTo keep every other pair\u2019s first letter \\(<F\\), each of the five large\nletters must be paired with a distinct small one.  \nThe number of such matchings is \\(5!=120\\).\n\nThe total number of matchings of those ten letters is  \n\n\\[\n\\frac{10!}{2^5\\,5!}=945 .\n\\]\n\nHence  \n\n\\[\n\\Pr(\\text{maximal}\\mid G\\text{\u2013}F)=\\frac{120}{945}=\\frac{8}{63}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  When \\(X>G\\)\n\nNow the word is \\(GX\\) and its first letter is \\(G\\).\nFor it to be maximal, **no other pair may have a first letter larger\nthan \\(G\\)**; i.e. no remaining pair may consist of two letters both\ngreater than \\(G\\).\n\nAfter fixing the pair \\(\\{G,X\\}\\) (with \\(X\\in\\{H,I,J,K,L\\}\\)), the\nremaining letters are\n\n* the six letters \\(\\{A,B,C,D,E,F\\}\\) (all \\(<G\\));\n* the four letters among \\(\\{H,I,J,K,L\\}\\) that are not \\(X\\) (all\n\\(>G\\)).\n\nThus each of those four \u201clarge\u2019\u2019 letters must be paired with a distinct\nsmall letter, leaving two small letters to pair together.\n\nNumber of valid matchings:\n\n\\[\n\\binom{6}{4}\\cdot4!\\cdot1=15\\cdot24=360 .\n\\]\n\nAgain the total number of matchings of the ten remaining letters is\n\\(945\\). Therefore\n\n\\[\n\\Pr(\\text{maximal}\\mid G\\text{\u2013}X)=\\frac{360}{945}=\\frac{8}{21}\n\\qquad (X=H,I,J,K,L).\n\\]\n\n--------------------------------------------------------------------\n### 4.  Assemble the probability\n\n\\[\n\\begin{aligned}\nP&=\\frac1{11}\\Bigl(\\frac{8}{63}\n+5\\cdot\\frac{8}{21}\\Bigr)    \\\\\n &=\\frac1{11}\\Bigl(\\frac{8}{63}+\\frac{40}{21}\\Bigr)\n   =\\frac1{11}\\Bigl(\\frac{8+120}{63}\\Bigr)\n   =\\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\displaystyle\\frac{128}{693}\\) is already in lowest\nterms.  Hence \\(m=128,\\;n=693\\) and\n\n\\[\nm+n = 128+693 = 821 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 821

      \n

      Extracted Answer: 821

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nS(t)=\\sum_{a=1}^{3^{6}}\\exp\\!\\Big(2\\pi i\\,\\frac{t a^{3}}{3^{7}}\\Big) \\qquad(0\\le t<3^{7})\n\\]\n\nand denote  \n\n\\[\nN=\\#\\{(a,b,c)\\mid 1\\le a,b,c\\le 3^{6},\n\\ a^{3}+b^{3}+c^{3}\\equiv 0\\pmod{3^{7}}\\}.\n\\]\n\nFor any modulus \\(m\\),\n\n\\[\n\\#\\{(x,y,z):x+y+z\\equiv0\\pmod m\\}=\n\\frac1m\\sum_{t=0}^{m-1}\\Bigl(\\sum_{x}e^{2\\pi i t x/m}\\Bigr)^3 .\n\\]\n\nHence  \n\n\\[\nN=\\frac1{3^{7}}\\sum_{t=0}^{3^{7}-1} S(t)^{3}. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Splitting the summation\n\nWrite each \\(a\\) as \\(a=3^{v}u\\) where \\(v=v_{3}(a)\\) and \\(u\\) is not\ndivisible by \\(3\\).  \nFor \\(0\\le v\\le 2\\) define  \n\n\\[\nU_{v}=\\{\\,u:1\\le u\\le 3^{6-v},\\;3\\nmid u\\,\\},\n\\qquad |U_{0}|=486,\\ |U_{1}|=162,\\ |U_{2}|=54 .\n\\]\n\nIf \\(v\\ge3\\) then \\(a^{3}\\equiv0\\pmod{3^{7}}\\); there are  \n\\(n_{3}=27\\) such numbers.\nThus\n\n\\[\nS(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+n_{3},\n\\]\nwhere  \n\n\\[\n\\begin{aligned}\nf_{0}(t)&=\\sum_{x\\in U_{0}}\\zeta^{t x^{3}},\\\\[2mm]\nf_{1}(t)&=\\sum_{x\\in U_{1}}\\zeta^{t\\,27x^{3}},\\\\[2mm]\nf_{2}(t)&=\\sum_{x\\in U_{2}}\\zeta^{t\\,729x^{3}},\n\\end{aligned}\n\\qquad \n\\zeta=e^{2\\pi i/3^{7}} .\n\\]\n\n--------------------------------------------------------------------\n### 2.  Evaluating \\(f_{0},f_{1},f_{2}\\)\n\n*For \\(f_{0}\\).*  \nLet \\(G_{7}=(\\mathbb Z/3^{7}\\mathbb Z)^{\\times}\\) (\\(|G_{7}|=1458\\)).\nThe map \\(x\\mapsto x^{3}\\) from \\(G_{7}\\) onto the set of cubes\n\\(C_{6}\\) has kernel of size \\(3\\); consequently\n\n\\[\n\\sum_{x\\in G_{7}}\\zeta^{t x}=3\\sum_{r\\in C_{6}}\\zeta^{t r}=3f_{0}(t).\n\\]\n\nFor \\(t\\neq0\\) one has  \n\n\\[\n\\sum_{x\\in G_{7}}\\zeta^{t x}= -\\!\\!\\sum_{\\substack{x\\;(\\bmod 3^{7})\\\\3\\mid x}}\\!\\!\\zeta^{t x}\n=\\begin{cases}\n-729,&v_{3}(t)=6,\\\\\n0,&0\\le v_{3}(t)\\le5 .\n\\end{cases}\n\\]\n\nHence  \n\n\\[\nf_{0}(t)=\n\\begin{cases}\n486,&t=0,\\\\[2mm]\n-243,&v_{3}(t)=6,\\\\[2mm]\n0,&\\text{otherwise.}\n\\end{cases}\n\\tag{2}\n\\]\n\n*For \\(f_{1}\\).*  \nWriting each \\(x\\in U_{1}\\) as \\(x=v+81k\\;(k=0,1,2)\\) one finds\n\\(x^{3}\\equiv v^{3}\\pmod{81}\\). Consequently  \n\n\\[\nf_{1}(t)=3\\!\\!\\sum_{\\substack{v\\in(\\mathbb Z/81)^{\\times}}}\\!\n\\exp\\!\\Big(2\\pi i\\,\\frac{t v^{3}}{81}\\Big).\n\\]\n\nUsing again that the cube map on \\((\\mathbb Z/81)^{\\times}\\) has kernel\nsize \\(3\\),\n\n\\[\nf_{1}(t)=3\\!\\cdot\\!3\\!\\!\\sum_{r\\in C_{1}}\\!\n\\exp\\!\\Big(2\\pi i\\,\\frac{t r}{81}\\Big) ,\n\\]\n\nwhere \\(C_{1}\\) is the set of cube\u2011residues modulo \\(81\\) (\\(|C_{1}|=18\\)).\nNow\n\n\\[\n\\sum_{x\\in(\\mathbb Z/81)^{\\times}}\\exp\\!\\Big(2\\pi i\\,\n\\frac{t x}{81}\\Big)=\n\\begin{cases}\n54,&v_{3}(t)\\ge4,\\\\[1mm]\n-27,&v_{3}(t)=3,\\\\[1mm]\n0,&v_{3}(t)\\le2 .\n\\end{cases}\n\\]\n\nThus\n\n\\[\nf_{1}(t)=\n\\begin{cases}\n162,&v_{3}(t)\\ge4,\\\\[2mm]\n-81,&v_{3}(t)=3,\\\\[2mm]\n0,&v_{3}(t)\\le2 .\n\\end{cases}\n\\tag{3}\n\\]\n\n*For \\(f_{2}\\).*  \nHere \\(x^{3}\\equiv x\\pmod 3\\), and among the \\(54\\) numbers in \\(U_{2}\\)\nexactly half are \\(\\equiv1\\pmod3\\) and half \\(\\equiv2\\pmod3\\). Hence  \n\n\\[\nf_{2}(t)=27\\bigl(\\zeta^{t}+ \\zeta^{2t}\\bigr)=\n\\begin{cases}\n-27,&v_{3}(t)=0,\\\\[2mm]\n54,&v_{3}(t)\\ge1 .\n\\end{cases}\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 3.  The values of \\(S(t)\\)\n\nFrom (2)\u2013(4) (and remembering the constant term \\(n_{3}=27\\))\n\n\\[\nS(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+27=\n\\begin{array}{c|c}\nv_{3}(t) & S(t)\\\\ \\hline\n\\infty\\;(t=0) & 729\\\\\n0 & 0\\\\\n1 & 81\\\\\n2 & 81\\\\\n3 & 0\\\\\n4 & 243\\\\\n5 & 243\\\\\n6 & 0\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Computing \\(N\\)\n\nOnly the classes with non\u2011zero \\(S(t)\\) contribute to (1).  \nThe numbers of \\(t\\) in each class are\n\n\\[\n\\begin{array}{c|c}\nv_{3}(t) & \\#t\\\\ \\hline\n\\infty & 1\\\\\n0 & 1458\\\\\n1 & 486\\\\\n2 & 162\\\\\n3 & 54\\\\\n4 & 18\\\\\n5 & 6\\\\\n6 & 2\n\\end{array}\n\\]\n\nHence\n\n\\[\n\\begin{aligned}\nN&=\\frac1{3^{7}}\\Bigl( 729^{3}\n+ (486+162) \\,81^{3}\n+ (18+6)\\,243^{3}\\Bigr)\\\\[2mm]\n&=\\frac1{3^{7}}\\Bigl(3^{18}+648\\cdot3^{12}+24\\cdot3^{15}\\Bigr)\\\\\n&=3^{5}\\cdot2025 = 243\\cdot2025 = 492\\,075 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5.  Remainder modulo \\(1000\\)\n\n\\[\n492\\,075 \\equiv 75 \\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{75}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 75

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Overview**\n\nThe given lengths on the sides of \\(\\triangle ABC\\) give  \n\n\\[\nAD=4,\\;DE=16,\\;EB=8 \\qquad\\Longrightarrow\\qquad AB=28,\n\\]\n\\[\nAF=13,\\;FG=52,\\;GC=26 \\qquad\\Longrightarrow\\qquad AC=91 .\n\\]\n\n--------------------------------------------------------------------\n\n### 1.  Two lines parallel to \\(BC\\)\n\n\\[\n\\frac{AD}{AB}= \\frac{4}{28}= \\frac{1}{7},\\qquad \n\\frac{AF}{AC}= \\frac{13}{91}= \\frac{1}{7}.\n\\]\n\nHence the points \\(D\\in AB\\) and \\(F\\in AC\\) divide the two sides in the same\nratio; therefore \\(DF\\parallel BC\\).\n\nSimilarly  \n\n\\[\n\\frac{AE}{AB}= \\frac{AD+DE}{AB}= \\frac{20}{28}= \\frac57,\n\\qquad \n\\frac{AG}{AC}= \\frac{AF+FG}{AC}= \\frac{65}{91}= \\frac57,\n\\]\n\nso \\(E\\in AB,\\;G\\in AC\\) also give a line parallel to \\(BC\\); i.e. \\(EG\\parallel BC\\).\n\nThus the quadrilateral \\(DEGF\\) is bounded by two parallel sides \\(DF,EG\\) and\nthe two segments of the sides of the triangle, and it is the region between the\ntwo similar triangles \\(ADF\\) and \\(AEG\\).\n\n--------------------------------------------------------------------\n\n### 2.  Area of \\(\\triangle ABC\\)\n\nIf \\([XYZ]\\) denotes area, similarity gives  \n\n\\[\n[ADF]=\\Bigl(\\frac{AD}{AB}\\Bigr)^2[ABC]=\\Bigl(\\frac17\\Bigr)^2[ABC]=\\frac{[ABC]}{49},\n\\]\n\n\\[\n[AEG]=\\Bigl(\\frac{AE}{AB}\\Bigr)\\Bigl(\\frac{AG}{AC}\\Bigr)[ABC]\n      =\\frac57\\cdot\\frac57[ABC]=\\frac{25}{49}[ABC].\n\\]\n\nHence  \n\n\\[\n[DEGF]=[AEG]-[ADF]=\\Bigl(\\frac{25}{49}-\\frac1{49}\\Bigr)[ABC]\n       =\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n\\frac{24}{49}[ABC]=288\\quad\\Longrightarrow\\quad[ABC]=288\\cdot\\frac{49}{24}\n                  =12\\cdot49=588.\n\\]\n\n--------------------------------------------------------------------\n\n### 3.  Area of the heptagon \\(AFNBCEM\\)\n\nPlace the triangle with \\(A=(0,0),\\;B=(28,0)\\) and\n\\(C=(91\\cos\\theta,\\,91\\sin\\theta)\\).\nBecause \\([ABC]=\\tfrac12\\cdot28\\cdot91\\sin\\theta\\),\n\n\\[\n\\sin\\theta=\\frac{[ABC]}{1274}= \\frac{588}{1274}= \\frac{6}{13}.\n\\]\n\nThus  \n\n\\[\n\\cos\\theta=\\frac{\\sqrt{1-\\sin^2\\theta}}{\\,}= \\frac{\\sqrt{133}}{13}.\n\\]\n\nThe coordinates of the relevant points are\n\n\\[\n\\begin{aligned}\n&F=(13\\cos\\theta,13\\sin\\theta)=(\\sqrt{133},6), \\\\\n&G=(65\\cos\\theta,65\\sin\\theta)=(5\\sqrt{133},30),\\\\\n&D=(4,0),\\qquad\nE=(20,0),\\\\\n&M=2F-D=(2\\sqrt{133}-4,12),\\\\\n&N=2E-G=(40-5\\sqrt{133},-30).\n\\end{aligned}\n\\]\n\nUsing the shoelace formula for the polygon\n\\(A\\,(0,0),\\;F,\\;N,\\;B,\\;C,\\;E,\\;M\\) we obtain\n\n\\[\n\\begin{aligned}\n\\sum (x_i y_{i+1}-y_i x_{i+1})\n&= -240+840+1176-840+240 = 1176,\\\\[2mm]\n\\text{Area}&=\\frac12\\cdot1176=588.\n\\end{aligned}\n\\]\n\nThus the heptagon \\(AFNBCEM\\) has the same area as \\(\\triangle ABC\\).\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{588}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 588

      \n

      Extracted Answer: 588

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nP:\\; y=x^{2}-4\n\\]\n\nand rotate \\(P\\) about the origin \\(60^{\\circ}\\) counter\u2011clockwise.  \nIf \\((x,y)\\) is a point of \\(P\\) then its image \\((X,Y)\\) satisfies  \n\n\\[\n\\begin{pmatrix}X\\\\Y\\end{pmatrix}= \n\\begin{pmatrix}\\cos 60^\\circ & -\\sin 60^\\circ\\\\[2pt] \n\\sin 60^\\circ & \\ \\cos 60^\\circ\\end{pmatrix}\n\\begin{pmatrix}x\\\\y\\end{pmatrix},\n\\qquad \n\\cos60^\\circ=\\frac12,\\;\\sin60^\\circ=\\frac{\\sqrt3}{2}.\n\\]\n\nHence  \n\n\\[\nX=\\frac{x}{2}-\\frac{\\sqrt3}{2}y,\\qquad\nY=\\frac{\\sqrt3}{2}x+\\frac{y}{2}.\n\\]\n\nTo obtain the equation of the rotated curve in the original \\((x,y)\\)\u2013coordinates,\nsolve for \\((x,y)\\) in terms of \\((X,Y)\\) (rotate back by \\(-60^\\circ\\)):\n\n\\[\nx = \\frac{X}{2}+\\frac{\\sqrt3}{2}Y,\\qquad\ny = -\\frac{\\sqrt3}{2}X+\\frac{Y}{2}.\n\\]\n\nSince the original points satisfy \\(y=x^{2}-4\\), substituting the expressions above gives the equation of the image:\n\n\\[\nx^{2}+2\\sqrt3\\,xy+3y^{2}+2\\sqrt3\\,x-2y-16=0. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### Intersection with the original parabola\n\nThe intersection points satisfy simultaneously  \n\n\\[\ny=x^{2}-4\\qquad\\text{and}\\qquad (1).\n\\]\n\nSubstituting \\(y=x^{2}-4\\) into (1) yields\n\n\\[\n3x^{4}-25x^{2}+40+2\\sqrt3\\,x^{3}-6\\sqrt3\\,x=0.\n\\]\n\nFactor this quartic in the field \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\n3x^{4}-25x^{2}+40+2\\sqrt3\\,x^{3}-6\\sqrt3\\,x\n&=(x^{2}+\\sqrt3\\,x-4)\\bigl(3x^{2}-\\sqrt3\\,x-10\\bigr).\n\\end{aligned}\n\\]\n\nThus the intersection points satisfy one of  \n\n\\[\n\\begin{cases}\nx^{2}+\\sqrt3\\,x-4=0,\\\\[2pt]\n\\text{or}\\\\[2pt]\n3x^{2}-\\sqrt3\\,x-10=0 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### Selecting the point in the fourth quadrant\n\n*From* \\(x^{2}+\\sqrt3\\,x-4=0\\)\n\n\\[\nx=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\nThe root \\(\\displaystyle x=\\frac{-\\sqrt3+\\sqrt{19}}{2}>0\\) gives  \n\n\\[\ny=x^{2}-4=\\frac{11-\\sqrt{57}}{2}-4=\\frac{3-\\sqrt{57}}{2}<0,\n\\]\n\nso \\((x,y)\\) lies in the fourth quadrant.\n\n*From* \\(3x^{2}-\\sqrt3\\,x-10=0\\)\n\n\\[\nx=\\frac{\\sqrt3\\pm\\sqrt{123}}{6},\n\\]\n\nwhich yields either \\(y>0\\) (first root) or \\(x<0\\) (second root); neither point is in the fourth quadrant.\n\nHence the unique fourth\u2011quadrant intersection point is  \n\n\\[\n\\Bigl(\\frac{-\\sqrt3+\\sqrt{19}}{2}\\,,\\; \\frac{3-\\sqrt{57}}{2}\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### Required \\(y\\)-coordinate\n\nThe \\(y\\)-coordinate is \\(\\displaystyle \\frac{3-\\sqrt{57}}{2}\\).\n\nWrite it as \\(\\frac{a-\\sqrt{b}}{c}\\) with \\(a,b,c\\) positive integers and \\(\\gcd(a,c)=1\\):\n\\[\na=3,\\qquad b=57,\\qquad c=2.\n\\]\n\nTherefore  \n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 62

      \n

      Extracted Answer: 62

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the line containing \\(A,B,C,D,E,F\\) be the \\(x\\)-axis.\n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(c,0),\\qquad D=(d,0),\\qquad \nE=(e,0),\\qquad F=(f,0)\n\\]\n\nBecause the points are in the order \\(A,B,C,D,E,F\\),\n\n\\[\nc-b=AC-AB,\\; d-b=BD,\\; e-c=CE,\\; f-d=DF,\\; f-0=AF.\n\\]\n\nTake \\(A\\) at the origin.  From the data\n\n\\[\nAC=26\\implies c=26,\n\\]\n\\[\nBD=22\\implies d=b+22,\n\\]\n\\[\nCE=31\\implies e=c+31=57,\n\\]\n\\[\nDF=33\\implies f=d+33=b+55,\n\\]\n\\[\nAF=73\\implies f=73.\n\\]\n\nHence \\(b+55=73\\Rightarrow b=18\\).  \nThus the coordinates are  \n\n\\[\nB=(18,0),\\; C=(26,0),\\; D=(40,0),\\; E=(57,0),\\; F=(73,0).\n\\]\n\n---\n\n### Locate \\(G\\)\n\n\\(G\\) is off the line and satisfies  \n\n\\[\nCG=40,\\qquad DG=30.\n\\]\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\). Then  \n\n\\[\n(x-26)^2+y^{2}=40^{2}=1600,\\tag{1}\n\\]\n\\[\n(x-40)^2+y^{2}=30^{2}=900.\\tag{2}\n\\]\n\nSubtract (2) from (1):\n\n\\[\n(x-26)^2-(x-40)^2=700.\n\\]\n\nExpanding,\n\n\\[\n[x^{2}-52x+676]-[x^{2}-80x+1600]=28x-924=700,\n\\]\n\\[\n28x=1624\\quad\\Longrightarrow\\quad x=58.\n\\]\n\nPlugging \\(x=58\\) into (2):\n\n\\[\n(58-40)^{2}+y^{2}=900\\;\\Longrightarrow\\;18^{2}+y^{2}=900\n\\]\n\\[\ny^{2}=576\\;\\Longrightarrow\\;|y|=24.\n\\]\n\nSo \\(G=(58,\\,24)\\) (the point \\((58,-24)\\) gives the same area).\n\n---\n\n### Area of \\(\\triangle BGE\\)\n\nPoints \\(B\\) and \\(E\\) lie on the \\(x\\)-axis, so the base \\(BE\\) has length\n\n\\[\nBE = e-b = 57-18 = 39.\n\\]\n\nThe altitude from \\(G\\) to the line \\(BE\\) (the \\(x\\)-axis) is \\(|y| = 24\\).\n\nHence  \n\n\\[\n\\text{Area} = \\frac12 \\times BE \\times \\text{height}\n= \\frac12 \\times 39 \\times 24 = 468.\n\\]\n\n\\[\n\\boxed{468}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 468

      \n

      Extracted Answer: 468

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      We need the positive integers \\(n\\) such that  \n\n\\[\nn+2\\mid 3(n+3)(n^{2}+9).\n\\]\n\n---\n\n### 1.  Replace \\(n+2\\) by a new variable  \n\nLet  \n\n\\[\nk=n+2\\qquad (k\\ge 3), \\qquad n=k-2 .\n\\]\n\nThen  \n\n\\[\n\\begin{aligned}\nn+3 &= (k-2)+3 = k+1,\\\\[2pt]\nn^{2}+9 &= (k-2)^{2}+9 = k^{2}-4k+13 .\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n3(n+3)(n^{2}+9)=3(k+1)(k^{2}-4k+13).\n\\]\n\nThe condition becomes  \n\n\\[\nk \\mid 3(k+1)(k^{2}-4k+13).\n\\]\n\n---\n\n### 2.  Reduce modulo \\(k\\)\n\nModulo \\(k\\),\n\n\\[\nk+1\\equiv 1,\\qquad k^{2}-4k+13\\equiv 13,\n\\]\n\nbecause \\(k\\equiv 0\\) gives \\(k^{2}\\equiv 0\\) and \\(-4k\\equiv 0\\).\n\nThus  \n\n\\[\n3(k+1)(k^{2}-4k+13)\\equiv 3\\cdot 1\\cdot 13=39 \\pmod{k}.\n\\]\n\nHence the divisibility condition is equivalent to  \n\n\\[\nk\\mid 39.\n\\]\n\n---\n\n### 3.  Find admissible \\(k\\) and corresponding \\(n\\)\n\nThe positive divisors of \\(39\\) are \\(1,3,13,39\\).\nSince \\(k=n+2\\ge 3\\), we keep  \n\n\\[\nk\\in \\{3,13,39\\}.\n\\]\n\nTherefore  \n\n\\[\nn=k-2\\in\\{1,11,37\\}.\n\\]\n\nAll three values satisfy the original condition (a quick check confirms the division).\n\n---\n\n### 4.  Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 49

      \n

      Extracted Answer: 49

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz<y-zx<z-xy$ forms three disjoint convex regions. Exactly one of those regions has finite area. The area of this finite region can be expressed in the form $a\\sqrt{b}$, where $a$ and $b$ are positive integers and $b$ is not divisible by the square of any prime. Find $a+b$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The inequalities\n\n\\[\nx-yz<y-zx<z-xy\n\\]\n\nwith the plane \\(x+y+z=75\\) can be simplified.  \nWrite \\(z=75-x-y\\). Then\n\n\\[\n\\begin{aligned}\ny-zx-(x-yz) &= (y-x)(1+z)= (y-x)(76-x-y),\\\\\nz-xy-(y-zx) &= (z-y)(1+x)= (75-x-2y)(1+x).\n\\end{aligned}\n\\]\n\nThus the points on the plane satisfy  \n\n\\[\n(y-x)(76-x-y)>0,\\qquad (75-x-2y)(1+x)>0 .\n\\tag{1}\n\\]\n\nDefine in the \\(xy\\)-plane the lines  \n\n\\[\n\\begin{aligned}\nL_1 &: y=x,\\\\\nL_2 &: x+y=76,\\\\\nL_3 &: x=-1,\\\\\nL_4 &: x+2y=75\\;(y=(75-x)/2).\n\\end{aligned}\n\\]\n\nFrom (1) we obtain two possibilities for each product, giving four possible\nintersections of half\u2011planes.  One of these intersections is empty; the other three\nare convex.  The region for which both products in (1) are **positive** is\n\n\\[\n\\begin{cases}\ny>x,\\\\\nx+y<76,\\\\\ny<(75-x)/2,\\\\\nx>-1,\n\\end{cases}\n\\]\n\nwhich in the \\(xy\\)-plane is the interior of the triangle with vertices\n\n\\[\nA(-1,-1),\\qquad B(-1,38),\\qquad C(25,25).\n\\]\n\nThe other two regions are unbounded.  Hence the finite region is this triangle.\n\n---\n\n### Area in the \\(xy\\)-plane\n\n\\[\n\\text{Area}_{xy}= \\frac12\\bigl|AB\\times AC\\bigr|\n               =\\frac12\\bigl| (0,39)\\times (26,26)\\bigr|\n               =\\frac12\\cdot1014 = 507 .\n\\]\n\n---\n\n### Area on the plane \\(x+y+z=75\\)\n\nThe plane is given by \\(z=75-x-y\\).  Its area element satisfies  \n\n\\[\ndS = \\sqrt{1+(\\partial_xz)^2+(\\partial_yz)^2}\\;dx\\,dy\n    =\\sqrt{1+1+1}\\;dx\\,dy =\\sqrt3\\,dx\\,dy .\n\\]\n\nHence  \n\n\\[\n\\text{Area}_{\\text{plane}} = \\sqrt3\\;\\text{Area}_{xy}\n                            = 507\\sqrt3 .\n\\]\n\nSo the area can be written as \\(a\\sqrt b\\) with \\(a=507,\\ b=3\\).\nTherefore  \n\n\\[\na+b = 507+3 = 510 .\n\\]\n\n\\[\n\\boxed{510}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 510

      \n

      Extracted Answer: 510

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The intersection points satisfy  \n\n\\[\ny=f(x),\\qquad x=34y^{2}\\;( \\ge 0).\n\\]\n\nBecause \\(f\\) has period \\(4\\),\n\n\\[\nf(x)=\\begin{cases}\nx-4k ,&x\\in[-1+4k,\\,1+4k),\\\\[2mm]\n2+4k-x ,&x\\in[1+4k,\\,3+4k),\n\\end{cases}\\qquad k\\in\\mathbb Z .\n\\]\n\n--------------------------------------------------------------------\n### 1.  Equations for the two linear pieces  \n\n*Ascending piece*  \\((x-4k)\\):  \n\n\\[\ny=x-4k,\\qquad x=34y^{2}\n\\Longrightarrow 34y^{2}-y-4k=0. \\tag{1}\n\\]\n\n*Descending piece*  \\((2+4k-x)\\):  \n\n\\[\ny=2+4k-x,\\qquad x=34y^{2}\n\\Longrightarrow 34y^{2}+y-(2+4k)=0. \\tag{2}\n\\]\n\nBoth are quadratics in \\(y\\); each can give at most two real roots.\n\n--------------------------------------------------------------------\n### 2.  Which integers \\(k\\) give admissible roots?\n\nBecause \\(|y|\\le 1\\) (the range of \\(f\\)), the roots must lie in \\([-1,1]\\).\n\n*For (1):*  \nThe sum of the two roots equals \\(\\frac{1}{34}\\); the product is \\(-\\frac{4k}{34}\\).  \nThe discriminant must be non\u2011negative:\n\n\\[\n\\Delta_1=1+544k\\ge 0\\Longrightarrow k\\ge0 .\n\\]\n\nFor a root to be in \\([-1,1)\\) we also need  \n\n\\[\n-1\\le\\frac{1\\pm\\sqrt{1+544k}}{68}<1 .\n\\]\n\nThe last inequality forces \\(k\\le8\\).  Hence (1) yields real admissible roots for  \n\n\\[\nk=0,1,\\dots ,8 .\n\\]\n\nBoth roots are in \\([-1,1)\\) for each of these values.\n\n*For (2):*  \n\\[\n\\Delta_2=273+544k\\ge0\\Longrightarrow k\\ge0 .\n\\]\n\nThe condition \\(-1<y\\le 1\\) gives \\(k\\le8\\).  \nFor \\(k=0,\\dots ,7\\) both roots lie in \\((-1,1]\\); for \\(k=8\\) only the \u201c\\(+\\)\u201d root\n\\[\ny=\\frac{-1+\\sqrt{273+544\\cdot8}}{68}\n      =\\frac{-1+5\\sqrt{185}}{68}\n\\]\nremains in the interval (the \u201c\\(-\\)\u201d root is \\(<-1\\)).\n\nThus  \n\n* (1) contributes \\(2\\) solutions for each \\(k=0,\\dots ,8\\)  \\(\\Rightarrow 18\\) points;  \n* (2) contributes \\(2\\) solutions for each \\(k=0,\\dots ,7\\) and \\(1\\) solution for \\(k=8\\)  \\(\\Rightarrow 17\\) points.\n\nHence there are \\(35\\) intersection points altogether.\n\n--------------------------------------------------------------------\n### 3.  Sum of the \\(y\\)-coordinates  \n\nFor each fixed \\(k\\) the sum of the two roots of (1) is, by Vieta,\n\n\\[\n\\Sigma_{A}(k)=\\frac{1}{34}.\n\\]\n\nSo the total contribution of (1) is  \n\n\\[\n\\sum_{k=0}^{8}\\Sigma_{A}(k)=9\\cdot\\frac{1}{34}= \\frac{9}{34}.\n\\]\n\nFor (2), when both roots exist their sum is  \n\n\\[\n\\Sigma_{B}(k)=-\\frac{1}{34}.\n\\]\n\nThus for \\(k=0,\\dots ,7\\) the total is  \n\n\\[\n8\\cdot\\Bigl(-\\frac{1}{34}\\Bigr)=-\\frac{8}{34}.\n\\]\n\nFor \\(k=8\\) only the positive root remains:\n\n\\[\ny_{8}= \\frac{-1+5\\sqrt{185}}{68}.\n\\]\n\nAdding everything,\n\n\\[\n\\begin{aligned}\n\\text{Sum of all }y\n&=\\frac{9}{34}-\\frac{8}{34}+y_{8}\n   =\\frac{1}{34}+ \\frac{-1+5\\sqrt{185}}{68}\\\\[2mm]\n&= \\frac{2}{68}+ \\frac{-1+5\\sqrt{185}}{68}\n   =\\frac{1+5\\sqrt{185}}{68}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4.  Final answer  \n\nThe sum is \\(\\displaystyle\\frac{1+5\\sqrt{185}}{68}\\).  \nThus  \n\n\\[\na=1,\\; b=5,\\; c=185,\\; d=68,\\qquad\na+b+c+d=1+5+185+68=259.\n\\]\n\n\\[\n\\boxed{259}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 259

      \n

      Extracted Answer: 259

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the three rows be \\(R_1,R_2,R_3\\) and the three \\(3\\times3\\) blocks be \\(B_1,B_2,B_3\\) (columns \\(1\\!-\\!3,\\;4\\!-\\!6,\\;7\\!-\\!9\\)).\nEach row must be a permutation of \\(\\{1,\\dots ,9\\}\\) and each block must also contain every digit once.\n\n--------------------------------------------------------------------\n### 1.  Where does a digit appear in the three rows?\n\nFor a fixed digit \\(d\\) its three copies (one in each row) must lie in three *different* blocks; otherwise a block would miss that digit.  \nThus for each digit we obtain a bijection  \n\n\\[\n\\phi_d:\\{1,2,3\\}\\longrightarrow\\{1,2,3\\},\\qquad \n\\phi_d(i)=\\text{block containing }d\\text{ in row }i .\n\\]\n\nSo each digit corresponds to a permutation of the three blocks.  \nThere are six permutations, listed with the cells \\((i,\\phi(i))\\) they occupy:\n\n\\[\n\\begin{array}{c|c}\n\\text{perm.} & \\text{cells}\\\\ \\hline\n(1)(2)(3) & (1,1),(2,2),(3,3)\\\\\n(12) & (1,2),(2,1),(3,3)\\\\\n(13) & (1,3),(2,2),(3,1)\\\\\n(23) & (1,1),(2,3),(3,2)\\\\\n(123) & (1,2),(2,3),(3,1)\\\\\n(132) & (1,3),(2,1),(3,2)\n\\end{array}\n\\]\n\nLet \\(x_1,\\dots ,x_6\\) be the numbers of digits that use the six permutations (in the order shown).  \nBecause each block must contain three digits from each row, each of the nine cells \\((i,k)\\) must be hit by exactly three digits, giving\n\n\\[\n\\begin{aligned}\nx_1+x_4 &=3, & x_2+x_5 &=3, & x_3+x_6 &=3,\\\\\nx_2+x_6 &=3, & x_1+x_3 &=3, & x_4+x_5 &=3,\\\\\nx_3+x_5 &=3, & x_4+x_6 &=3, & x_1+x_2 &=3 .\n\\end{aligned}\n\\]\n\nSolving, all solutions have the form  \n\n\\[\n(x_1,x_2,x_3,x_4,x_5,x_6)=(a,\\,3-a,\\,3-a,\\,3-a,\\,a,\\,a),\\qquad a\\in\\{0,1,2,3\\}.\n\\]\n\n--------------------------------------------------------------------\n### 2.  Assign the digits to the permutations\n\nFor a fixed \\(a\\) the number of ways to choose which digits get which permutation is\n\n\\[\n\\frac{9!}{x_1!\\,x_2!\\,x_3!\\,x_4!\\,x_5!\\,x_6!}\n   =\\frac{9!}{a!^{\\,3}\\,(3-a)!^{\\,3}} .\n\\]\n\nSumming over the four possible values of \\(a\\),\n\n\\[\n\\sum_{a=0}^3\\frac{9!}{a!^{\\,3}(3-a)!^{\\,3}}\n   =9!\\Bigl(\\frac1{3!^{\\,3}}{0\\choose0}^3\n            +\\frac1{3!^{\\,3}}{3\\choose1}^3\n            +\\frac1{3!^{\\,3}}{3\\choose2}^3\n            +\\frac1{3!^{\\,3}}{3\\choose3}^3\\Bigr)\n   =9!\\,\\frac{56}{216}\n   =9!\\,\\frac{7}{27}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Order the digits inside each block\n\nWithin a fixed block and a fixed row there are three column positions.\nThe three digits that belong to that macro\u2011cell can be placed in these\npositions in \\(3! = 6\\) ways.\nThere are \\(3\\) rows \\(\\times\\) \\(3\\) blocks \\(=9\\) such macro\u2011cells, giving a factor \\(6^9\\).\n\n--------------------------------------------------------------------\n### 4.  Total number of fillings\n\n\\[\nN = \\Bigl(9!\\,\\frac{7}{27}\\Bigr)\\,6^{9}\n   = 2^{16}\\,3^{10}\\,5\\,7^{2}.\n\\]\n\nThus the factorisation uses the four distinct primes  \n\n\\[\np=2,\\;q=3,\\;r=5,\\;s=7,\\qquad \na=16,\\;b=10,\\;c=1,\\;d=2 .\n\\]\n\nFinally,\n\n\\[\np\\,a+q\\,b+r\\,c+s\\,d\n   =2\\cdot16+3\\cdot10+5\\cdot1+7\\cdot2\n   =32+30+5+14=81.\n\\]\n\n\\[\n\\boxed{81}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 81

      \n

      Extracted Answer: 81

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      We place the pentagon in the plane.  \nSet  \n\n\\[\n\\begin{aligned}\nA&=(7,7\\sqrt3),\\qquad B=(0,0),\\qquad C=(7,0),\\\\[2mm]\nD&=\\Bigl(\\frac{205}{7},\\frac{36\\sqrt3}{7}\\Bigr),\\qquad \nE=\\Bigl(\\frac{218}{7},\\frac{88\\sqrt3}{7}\\Bigr).\n\\end{aligned}\n\\]\n\nThe lengths are as given and  \n\\(\\angle B=\\angle E =60^\\circ\\).\n\n--------------------------------------------------------------------\n### 1.  Geometry of the optimal point  \n\nFor the sum  \n\n\\[\nf(X)=AX+BX+CX+DX+EX,\n\\]\n\nthe geometric median \\(X\\) satisfies  \n\n\\[\n\\frac{X-A}{AX}+\\frac{X-B}{BX}+\\frac{X-C}{CX}+\\frac{X-D}{DX}+\\frac{X-E}{EX}=0 .\n\\tag{1}\n\\]\n\nBecause \\(B,E\\) lie on a line, the vectors \\(\\frac{X-B}{BX}\\) and\n\\(\\frac{X-E}{EX}\\) are opposite exactly when \\(X\\) lies on segment \\(BE\\);\nhence in the optimal position \\(X\\) must lie on \\(BE\\) and the first two\nterms in (1) cancel.  Consequently\n\n\\[\n\\frac{X-A}{AX}+\\frac{X-C}{CX}+\\frac{X-D}{DX}=0,\n\\]\n\nso \\(X\\) is the Fermat point of triangle \\(ACD\\).\n\n--------------------------------------------------------------------\n### 2.  Fermat point of \\(\\triangle ACD\\)\n\nThe side lengths of \\(\\triangle ACD\\) are  \n\n\\[\nAC=7\\sqrt3,\\qquad CD=24,\\qquad AD=13\\sqrt3 .\n\\]\n\nAll its angles are \\(<120^\\circ\\); therefore the Fermat point exists.\nFor a triangle with sides \\(a,b,c\\) and area \\(\\Delta\\),\n\n\\[\nS_{\\text{Fermat}}=\n\\sqrt{\\frac{a^{2}+b^{2}+c^{2}+4\\sqrt3\\,\\Delta}{2}} .\n\\]\n\nHere  \n\n\\[\na^{2}+b^{2}+c^{2}=576+507+147=1230,\n\\qquad\\Delta_{ACD}=78\\sqrt3,\n\\]\n\nso  \n\n\\[\nS_{\\text{Fermat}}=\\sqrt{\\frac{1230+4\\sqrt3\\cdot78\\sqrt3}{2}}\n=\\sqrt{\\frac{1230+936}{2}}=\\sqrt{1083}=19\\sqrt3 .\n\\]\n\nThus at the Fermat point  \n\n\\[\nAX+CX+DX=19\\sqrt3 .\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3.  The total minimum\n\nSince the optimal point lies on \\(BE\\),\n\n\\[\nBX+EX = BE .\n\\]\n\nFrom the coordinates, \\(BE=38\\).  Combining this with (2),\n\n\\[\nf_{\\min}= (AX+CX+DX)+(BX+EX)=19\\sqrt3+38 .\n\\]\n\nHence the smallest possible value of \\(f(X)\\) is  \n\n\\[\n\\boxed{38+19\\sqrt3}.\n\\]\n\nWriting it as \\(m+n\\sqrt p\\) with \\(m,n\\) integers and \\(p\\) square\u2011free,\nwe have \\(m=38,\\;n=19,\\;p=3\\).  Therefore  \n\n\\[\nm+n+p=38+19+3=60 .\n\\]\n\n\\[\n\\boxed{60}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 60

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nP=\\prod_{k=4}^{63}\\frac{\\log_k\\!\\bigl(5^{k^{2}-1}\\bigr)}{\\log_{k+1}\\!\\bigl(5^{k^{2}-4}\\bigr)}\n\\]\n\n---\n\n### 1.  Simplify each factor  \n\n\\[\n\\log_k\\!\\bigl(5^{k^{2}-1}\\bigr)=(k^{2}-1)\\log_k5,\n\\qquad \n\\log_{k+1}\\!\\bigl(5^{k^{2}-4}\\bigr)=(k^{2}-4)\\log_{k+1}5 .\n\\]\n\nHence  \n\n\\[\n\\frac{\\log_k\\!\\bigl(5^{k^{2}-1}\\bigr)}{\\log_{k+1}\\!\\bigl(5^{k^{2}-4}\\bigr)}\n=\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\log_k5}{\\log_{k+1}5}\n=\\frac{(k-1)(k+1)}{(k-2)(k+2)}\\cdot\\frac{\\log_k5}{\\log_{k+1}5}.\n\\]\n\nTherefore  \n\n\\[\nP=\\underbrace{\\prod_{k=4}^{63}\\frac{(k-1)(k+1)}{(k-2)(k+2)}}_{A}\n   \\times\\underbrace{\\prod_{k=4}^{63}\\frac{\\log_k5}{\\log_{k+1}5}}_{B}.\n\\]\n\n---\n\n### 2.  Evaluate the rational product \\(A\\)\n\n\\[\nA=\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n   \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr)\n   =\\frac{3\\cdot4\\cdots62}{2\\cdot3\\cdots61}\\;\n     \\frac{5\\cdot6\\cdots64}{6\\cdot7\\cdots65}.\n\\]\n\nBoth products telescope:\n\n\\[\n\\frac{3\\cdot4\\cdots62}{2\\cdot3\\cdots61}= \\frac{62}{2}=31,\n\\qquad \n\\frac{5\\cdot6\\cdots64}{6\\cdot7\\cdots65}= \\frac{5}{65}= \\frac1{13}.\n\\]\n\nThus  \n\n\\[\nA=31\\cdot\\frac1{13}= \\frac{31}{13}.\n\\]\n\n---\n\n### 3.  Evaluate the logarithmic product \\(B\\)\n\n\\[\nB=\\frac{\\log_4 5}{\\log_5 5}\\cdot\\frac{\\log_5 5}{\\log_6 5}\\cdots\n    \\frac{\\log_{63}5}{\\log_{64}5}\n   =\\frac{\\log_4 5}{\\log_{64}5}.\n\\]\n\nUsing change\u2011of\u2011base,\n\\[\n\\frac{\\log_4 5}{\\log_{64} 5}\n   =\\frac{\\frac{\\ln5}{\\ln4}}{\\frac{\\ln5}{\\ln64}}\n   =\\frac{\\ln64}{\\ln4}\n   =\\log_4 64=3,\n\\]\nsince \\(4^3=64\\).\n\nHence \\(B=3\\).\n\n---\n\n### 4.  Combine\n\n\\[\nP=A\\cdot B=\\frac{31}{13}\\times 3=\\frac{93}{13}.\n\\]\n\nThe fraction \\(\\dfrac{93}{13}\\) is already in lowest terms, so  \n\\(m=93,\\; n=13\\).\n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 106

      \n

      Extracted Answer: 106

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The divisors of  \n\n\\[\n2025=3^{4}\\cdot5^{2}\n\\]\n\nare exactly the numbers  \n\n\\[\n3^{a}5^{b}\\qquad (0\\le a\\le 4,\\;0\\le b\\le 2).\n\\]\n\nHence  \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\nFor a subset \\(B\\subseteq A\\) the least common multiple is\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a}\\,5^{\\max b},\n\\]\n\nwhere the maxima are taken over the exponents \\((a,b)\\) of the elements of \\(B\\).\n\nThus \\(\\operatorname{lcm}(B)=2025=3^4 5^2\\) iff  \n\n* at least one element of \\(B\\) has a \\(3\\)-exponent \\(4\\);\n* at least one element of \\(B\\) has a \\(5\\)-exponent \\(2\\).\n\nDefine  \n\n\\[\nD_3=\\{d\\in A : \\text{the exponent of }3\\text{ in }d\\text{ is }4\\},\n\\qquad \nD_5=\\{d\\in A : \\text{the exponent of }5\\text{ in }d\\text{ is }2\\}.\n\\]\n\nCounting:\n\n* \\(D_3\\): \\(a=4\\) and \\(b=0,1,2\\) \u21d2 \\(|D_3|=3\\) (81,\u202f405,\u202f2025).\n* \\(D_5\\): \\(b=2\\) and \\(a=0,1,2,3,4\\) \u21d2 \\(|D_5|=5\\) (25,\u202f75,\u202f225,\u202f675,\u202f2025).\n* The intersection is \\(\\{2025\\}\\); so \\(|D_3\\cap D_5|=1\\).\n\nWe need subsets that contain at least one element of \\(D_3\\) **and** at least one element of \\(D_5\\).\n\nLet the total number of subsets of \\(A\\) be \\(2^{15}\\).\nLet  \n\n\\[\n\\begin{aligned}\nA_1 &=\\{\\text{subsets that contain no element of } D_3\\},\\\\\nA_2 &=\\{\\text{subsets that contain no element of } D_5\\}.\n\\end{aligned}\n\\]\n\nThen  \n\n\\[\n|A_1|=2^{15-3}=2^{12},\\qquad \n|A_2|=2^{15-5}=2^{10}.\n\\]\n\nSubsets avoiding **both** \\(D_3\\) and \\(D_5\\) avoid the union \\(D_3\\cup D_5\\) which has  \n\n\\[\n|D_3\\cup D_5|=|D_3|+|D_5|-|D_3\\cap D_5|=3+5-1=7\n\\]\n\nelements. Hence  \n\n\\[\n|A_1\\cap A_2|=2^{15-7}=2^{8}.\n\\]\n\nBy inclusion\u2013exclusion, the number of subsets that contain at least one element from each of \\(D_3\\) and \\(D_5\\) is  \n\n\\[\n\\begin{aligned}\nN &= 2^{15}-|A_1|-|A_2|+|A_1\\cap A_2|\\\\\n   &= 2^{15}-2^{12}-2^{10}+2^{8}\\\\\n   &= 32768-4096-1024+256\\\\\n   &= 27904.\n\\end{aligned}\n\\]\n\nAll these subsets are non\u2011empty, so the required probability is  \n\n\\[\n\\frac{N}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nSimplifying,\n\n\\[\n\\frac{27904}{32768}= \\frac{27904\\div 256}{32768\\div 256}\n                 = \\frac{109}{128}.\n\\]\n\nThus \\(m=109,\\; n=128\\) and  \n\n\\[\nm+n = 109+128 = 237.\n\\]\n\n\\[\n\\boxed{237}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 237

      \n

      Extracted Answer: 237

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Label the twelve unit segments as in the picture  \n\n\\[\n\\begin{array}{c}\n\\text{external: }a_1,a_2,b_1,b_2,c_1,c_2,d_1,d_2\\\\[2mm]\n\\text{internal: }e_1,e_2,f_1,f_2\n\\end{array}\n\\]\n\nThe four unit squares are  \n\n\\[\n\\begin{aligned}\n\\text{TL}&:\\;a_1,c_1,e_1,f_1,\\\\\n\\text{TR}&:\\;b_1,c_2,e_1,f_2,\\\\\n\\text{BL}&:\\;a_2,d_1,e_2,f_1,\\\\\n\\text{BR}&:\\;b_2,d_2,e_2,f_2 .\n\\end{aligned}\n\\]\n\nEach square must contain exactly two red sides (hence also two blue sides).\n\n--------------------------------------------------------------------\n### 1.  Reduce to the four internal edges\n\nFor a given square the two sides that are **internal** are already\ncolored once we decide the colors of the four internal edges  \n\\(e_1,e_2,f_1,f_2\\).  \n\nLet  \n\n\\[\nr_{\\rm TL}=e_1+f_1,\\qquad\nr_{\\rm TR}=e_1+f_2,\\qquad\nr_{\\rm BL}=e_2+f_1,\\qquad\nr_{\\rm BR}=e_2+f_2 ,\n\\]\n\nwhere a red edge contributes 1 and a blue edge contributes 0.\nIf a square has \\(r\\) red internal sides, then it must have \\(2-r\\)\nred external sides. Thus\n\n* if \\(r=0\\): both external sides are forced red \u2013 1 way;\n* if \\(r=1\\): exactly one of the two external sides must be red \u2013 2 ways;\n* if \\(r=2\\): both external sides are forced blue \u2013 1 way.\n\nHence for a fixed choice of the four internal edges the number of\nadmissible colourings of the eight external edges equals\n\n\\[\n2^{\\,N_1},\n\\]\n\nwhere \\(N_1\\) is the number of squares among TL, TR, BL, BR that have\nexactly one red internal side.\n\n--------------------------------------------------------------------\n### 2.  Express \\(N_1\\) in terms of the internal edges\n\nWrite  \n\n\\[\nX_1=e_1,\\; X_2=e_2,\\qquad Y_1=f_1,\\;Y_2=f_2\\qquad(\\text{red}=1,\\text{blue}=0).\n\\]\n\nFor a square \\((i,j)\\) (\\(i,j\\in\\{1,2\\}\\)) the number of red internal\nsides is \\(X_i+Y_j\\).\nThus a square has exactly one red internal side precisely when\n\\(X_i\\neq Y_j\\).\n\nLet  \n\n\\[\na=X_1+X_2\\;(=0,1,2),\\qquad b=Y_1+Y_2\\;(=0,1,2).\n\\]\n\nThe number of ordered pairs \\((i,j)\\) with \\(X_i\\neq Y_j\\) is  \n\n\\[\nN_1=a(2-b)+(2-a)b\n      =2\\bigl(a+b-ab\\bigr).\n\\]\n\nConsequently the contribution of a configuration with given\n\\(a,b\\) is  \n\n\\[\n2^{N_1}=2^{\\,2(a+b-ab)}=4^{\\,a+b-ab}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Count all configurations of the internal edges\n\nThere are \\(\\binom{2}{a}\\) ways to choose which vertical internal edges\nare red, and \\(\\binom{2}{b}\\) ways to choose which horizontal internal\nedges are red.  Hence the total number of colourings is\n\n\\[\n\\sum_{a=0}^{2}\\sum_{b=0}^{2}\n\\binom{2}{a}\\binom{2}{b}\\;4^{\\,a+b-ab}.\n\\]\n\nEvaluating the double sum:\n\n\\[\n\\begin{array}{c|ccc}\na\\backslash b &0&1&2\\\\\\hline\n0 &1\\cdot1\\cdot1=1 &1\\cdot2\\cdot4=8 &1\\cdot1\\cdot16=16\\\\\n1 &2\\cdot1\\cdot4=8 &2\\cdot2\\cdot4=16 &2\\cdot1\\cdot4=8\\\\\n2 &1\\cdot1\\cdot16=16 &1\\cdot2\\cdot4=8 &1\\cdot1\\cdot1=1\n\\end{array}\n\\]\n\nAdding all entries:\n\n\\[\n1+8+16+8+16+8+16+8+1=82.\n\\]\n\n--------------------------------------------------------------------\n### 4.  Answer\n\nThus there are  \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent ways to colour the twelve unit segments so that each of the\nfour unit squares has two red sides and two blue sides.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 82

      \n

      Extracted Answer: 82

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The circles are drawn as in the figure.\n\n* Let \\(O\\) be the centre of \\(\\omega _2\\) (radius \\(15\\)).\n* Let \\(A\\) be the centre of \\(\\omega _1\\) (radius \\(6\\)).\n* Since \\(\\omega _1\\) is internally tangent to \\(\\omega _2\\) at \\(B\\), the three points are collinear and  \n\n\\[\nOA=15-6=9 .\n\\]\n\nTake a coordinate system with  \n\n\\[\nO=(0,0),\\qquad A=(9,0),\\qquad B=(15,0).\n\\]\n\n--------------------------------------------------------------------\n### Points \\(C\\) and \\(D\\)\n\n\\(BC\\) is a diameter of \\(\\omega _2\\); hence \\(C\\) is the antipode of \\(B\\):\n\n\\[\nC=(-15,0).\n\\]\n\n\\(BC\\perp AD\\) means \\(AD\\) is the vertical line \\(x=9\\).  \nIntersecting this line with \\(\\omega _2\\) gives  \n\n\\[\n9^2+y^2=15^2 \\Longrightarrow y=\\pm 12 .\n\\]\n\nBecause the later condition \u201c\\(D\\) is nearer to \\(FG\\) than to \\(EH\\)\u201d forces \\(D\\) to lie **below** the centre, we take  \n\n\\[\nD=(9,-12).\n\\]\n\n--------------------------------------------------------------------\n### The rectangle \\(EFGH\\)\n\nThe rectangle is inscribed in \\(\\omega _1\\) and \\(\\overline{EF}\\perp BC\\); hence \\(\\overline{EF}\\) is vertical.\nLet\n\n\\[\n\\begin{aligned}\nE&=(9+w,\\;h),\\\\[2pt]\nF&=(9+w,\\;-h),\\\\[2pt]\nG&=(9-w,\\;-h),\\\\[2pt]\nH&=(9-w,\\;h),\n\\end{aligned}\n\\]\n\nso that the centre of the rectangle is \\(A\\) (the intersection of the diagonals of an\ninscribed rectangle is the centre of the circumcircle).\n\nBecause the four vertices lie on \\(\\omega _1\\),\n\n\\[\n(9\\pm w-9)^2+h^2=w^{2}+h^{2}=6^{2}=36\\qquad\\Longrightarrow\\qquad w^{2}+h^{2}=36. \\tag{1}\n\\]\n\nThe side \\(\\overline{EF}\\) is the right vertical side, thus\n\\(C\\) (which is far left) is nearer to \\(\\overline{GH}\\) (the left side) than to \\(\\overline{EF}\\);\nand \\(D\\) (which is below the centre) is nearer to \\(\\overline{FG}\\) (the bottom side) than to \\(\\overline{EH}\\) (the top side).  \nThese statements only fix the labeling of the rectangle.\n\n--------------------------------------------------------------------\n### Equality of the two triangular areas\n\n\\[\n\\begin{aligned}\n\\text{Area}\\,\\triangle DGF\n&=\\frac12\\bigl(\\underbrace{2w}_{\\text{base }GF}\\bigr)\n     \\bigl(\\underbrace{12-h}_{\\text{vertical height}}\\bigr)\n = w(12-h),\\\\[4pt]\n\\text{Area}\\,\\triangle CHG\n&=\\frac12\\bigl(\\underbrace{2h}_{\\text{base }HG}\\bigr)\n     \\bigl(\\underbrace{24-w}_{\\text{horizontal distance}}\\bigr)\n = h(24-w).\n\\end{aligned}\n\\]\n\nGiven that the two areas are equal,\n\n\\[\nw(12-h)=h(24-w)\\; \\Longrightarrow\\; 12w=24h\\; \\Longrightarrow\\; w=2h. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### Solving for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1):\n\n\\[\n(2h)^2+h^{2}=36\\;\\Longrightarrow\\;5h^{2}=36\\;\\Longrightarrow\\;h^{2}= \\frac{36}{5}.\n\\]\n\nHence  \n\n\\[\nh=\\frac{6}{\\sqrt5},\\qquad w=2h=\\frac{12}{\\sqrt5}.\n\\]\n\n--------------------------------------------------------------------\n### Area of the rectangle\n\nThe rectangle\u2019s side lengths are \\(2w\\) and \\(2h\\), so\n\n\\[\n\\text{Area}= (2w)(2h)=4wh\n          =4\\left(\\frac{12}{\\sqrt5}\\right)\\left(\\frac{6}{\\sqrt5}\\right)\n          =4\\cdot\\frac{72}{5}\n          =\\frac{288}{5}.\n\\]\n\nThus the area is \\(\\displaystyle\\frac{m}{n}=\\frac{288}{5}\\) with relatively prime\n\\(m=288,\\;n=5\\).\n\n\\[\nm+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 293

      \n

      Extracted Answer: 293

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nN=25q+r ,\\qquad 0\\le r\\le 24 .\n\\]\n\nThe greedy algorithm takes  \n\n* \\(q\\) quarters,  \n* \\(\\displaystyle d_0=\\Big\\lfloor\\frac r{10}\\Big\\rfloor\\) dimes,  \n* \\(s_0=r\\bmod 10\\) pennies.  \n\nHence  \n\n\\[\nC_{\\text{greedy}}=q+d_0+s_0 .\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  When can a better solution use fewer quarters?\n\nSuppose we use only \\(q-k\\) quarters, \\(k\\ge1\\).  \nThe remaining amount is  \n\n\\[\nR=r+25k .\n\\]\n\nWith only dimes and pennies the optimal way to make \\(R\\) is  \n\n\\[\n\\Big\\lfloor\\frac{R}{10}\\Big\\rfloor\\text{ dimes }+ (R\\bmod10)\\text{ pennies}.\n\\]\n\nThus the total number of coins for this choice is  \n\n\\[\nC(q-k)=(q-k)+\\Big\\lfloor\\frac{r+25k}{10}\\Big\\rfloor+(r+25k\\bmod10).\\tag{2}\n\\]\n\nLet  \n\n\\[\n\\Delta(k)=C(q-k)-C_{\\text{greedy}} .\n\\]\n\nUsing \\(r=10t+a\\;(0\\le a\\le9,\\;t\\in\\{0,1,2\\})\\) we obtain after a short calculation  \n\n\\[\n\\Delta(k)=6k-9\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor .\\tag{3}\n\\]\n\n(Only the last digit \\(a=r\\bmod 10\\) matters.)\n\n--------------------------------------------------------------------\n### 2.  Sign of \\(\\Delta(k)\\)\n\n*If \\(a\\ge5\\):*  \nTake \\(k=1\\).  Then \\(\\lfloor\\frac{a+5}{10}\\rfloor=1\\) and  \n\n\\[\n\\Delta(1)=6-9=-3<0 .\n\\]\n\nHence a better solution exists (remove one quarter).\n\n*If \\(a\\le4\\):*  \nFor any \\(k\\ge1\\),\n\n\\[\n\\Delta(k)=6k-9\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor\n\\ge 6k-9\\frac{a+5k}{10}=1.5k-0.9a .\n\\]\n\nSince \\(a\\le4\\) this is positive for \\(k=1,2\\) (indeed \\(\\Delta(1)=6,\\,\\Delta(2)=3\\)) and for larger \\(k\\) the term \\(1.5k\\) dominates, so \\(\\Delta(k)\\ge0\\) for all \\(k\\).\n\nTherefore **greedy fails iff**  \n\n\\[\na=r\\bmod10\\ge5\\quad\\text{and}\\quad q\\ge1 .\n\\]\n\nEquivalently, for \\(N\\ge25\\),\n\n\\[\nN\\bmod25\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Counting the failures\n\nThe residues above are ten out of the twenty\u2011five possible residues modulo \\(25\\).  \n\nIn the interval \\(1\\le N\\le1000\\) we have \\(1000/25=40\\) full periods, so each residue occurs \\(40\\) times.  \n\nThus the total number of integers with those residues is  \n\n\\[\n10\\times40=400.\n\\]\n\nBut the ten numbers \\(5,6,7,8,9,15,16,17,18,19\\) are \\<\u202f25, and for them greedy cannot remove a quarter (there are no quarters in any representation).  Those ten are **not** failures.  \n\nHence the genuine failures are  \n\n\\[\n400-10=390.\n\\]\n\n--------------------------------------------------------------------\n### 4.  Successes\n\nThere are \\(1000\\) integers from \\(1\\) to \\(1000\\).  Therefore the number of values for which the greedy algorithm *succeeds* is\n\n\\[\n1000-390=610.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{610}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 610

      \n

      Extracted Answer: 610

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      \\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr)\n\\]\n\n---\n\n### 1.  Zeros of \\(f\\)\n\n\\(f(x)=0\\iff 7\\pi\\sin(5x)=k\\pi\\) for an integer \\(k\\).\n\n\\[\n\\sin(5x)=\\frac{k}{7},\\qquad |k|\\le 7 .\n\\]\n\nLet  \n\n\\[\ny=5x\\;(0<y<10\\pi).\n\\]\n\nFor each integer \\(k\\) with \\(|k|\\le7\\) we count the solutions of \\(\\sin y=\\dfrac{k}{7}\\) in \\((0,10\\pi)\\).\n\n* \\(k=7\\)  : \\(\\sin y=1\\).  Solutions \\(y=\\frac{\\pi}{2}+2\\pi n\\) \\((n=0,1,2,3,4)\\) \u2192 **5** solutions.  \n* \\(k=-7\\) : \\(\\sin y=-1\\).  Solutions \\(y=\\frac{3\\pi}{2}+2\\pi n\\) \\((n=0,1,2,3,4)\\) \u2192 **5** solutions.  \n* \\(k=0\\)  : \\(\\sin y=0\\).  Solutions \\(y=m\\pi\\;(m=1,2,\\dots ,9)\\) \u2192 **9** solutions.  \n* For each \\(k=\\pm1,\\pm2,\\pm3,\\pm4,\\pm5,\\pm6\\) we have \\(\\sin y=c\\) with \\(-1<c<1,\\;c\\neq0\\).  \n  In each of the 5 full periods of \\(\\sin y\\) there are exactly two such points, so **\\(5\\cdot2=10\\)** solutions per \\(k\\).\n\nThere are 12 values of \\(k\\) with \\(|k|\\in\\{1,\\dots ,6\\}\\), giving  \n\n\\[\n12\\times10=120\\text{ solutions}.\n\\]\n\nAdding all contributions,\n\n\\[\nn=5+5+9+120=139 .\n\\]\n\n---\n\n### 2.  Tangent zeros\n\nThe graph is tangent to the \\(x\\)-axis at a zero where the derivative also vanishes.\n\n\\[\nf'(x)=\\cos\\bigl(7\\pi\\sin(5x)\\bigr)\\cdot 35\\pi\\cos(5x).\n\\]\n\nAt a zero, \\(\\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\\) gives \\(\\sin(5x)=\\dfrac{k}{7}\\).  \nBecause \\(\\cos\\bigl(7\\pi\\sin(5x)\\bigr)=\\pm1\\neq0\\), we must have \\(\\cos(5x)=0\\).\n\n\\[\n\\cos(5x)=0\\Longrightarrow \\sin(5x)=\\pm1 .\n\\]\n\nThus tangential zeros occur exactly when \\(\\sin(5x)=\\pm1\\), i.e. for \\(k=\\pm7\\).\n\nWe already counted those solutions:  \n\n* \\(\\sin(5x)=1\\) \u2192 5 points,  \n* \\(\\sin(5x)=-1\\) \u2192 5 points.\n\nHence  \n\n\\[\nt=5+5=10 .\n\\]\n\n---\n\n### 3.  Required sum\n\n\\[\nn+t=139+10=149.\n\\]\n\n\\[\n\\boxed{149}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 149

      \n

      Extracted Answer: 149

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let the vertices of the regular \\(24\\)-gon be numbered \\(0,1,\\dots ,23\\) (mod \\(24\\)).\nIf a segment joins vertex \\(i\\) to vertex \\(j\\) we call its **step**\n\\[\nk\\equiv j-i\\pmod{24},\\qquad 1\\le k\\le 12 .\n\\]\n\nThe length of a chord depends only on this step:\nthe chord of step \\(k\\) has length  \n\n\\[\n\\ell(k)=2R\\sin\\frac{\\pi k}{24},\\qquad 1\\le k\\le 12 .\n\\]\n\nSince \\(\\sin(\\theta )\\) is strictly increasing on \\([0,\\frac{\\pi}{2}]\\),\nthe lengths \\(\\ell(1),\\ell(2),\\dots ,\\ell(12)\\) are all distinct.\nThus a drawing in which all 12 segments have the same length must use\nedges whose step is a fixed \\(k\\) (the same chord length).\n\n--------------------------------------------------------------------\n\n### 1.  The graph of step \\(k\\)\n\nConsider the undirected graph \\(G_k\\) whose vertices are the 24 polygon vertices\nand whose edges are all chords of step \\(k\\) (i.e. the pairs \\(\\{i,i+k\\}\\)).\nEach vertex of \\(G_k\\) is incident to two such chords\n(\\(i\\) connects to \\(i+k\\) and to \\(i-k\\)), so \\(G_k\\) is a disjoint union of\ncycles.\n\nLet  \n\n\\[\nd=\\gcd(24,k).\n\\]\n\nThen the vertices split into \\(d\\) cycles, each of length  \n\n\\[\n\\frac{24}{d}.\n\\]\n\n--------------------------------------------------------------------\n\n### 2.  When can a perfect matching be formed?\n\nA perfect matching can be taken inside one cycle only when the cycle has even\nlength.  Hence we need \\(\\frac{24}{d}\\) even, i.e. \\(d\\neq 8\\).  \n\n* If \\(d=8\\) (the case \\(k=8\\)) each component is a triangle; a triangle has\nno perfect matching, so **no drawing** is possible.\n\n* If the cycle length is \\(2\\) (the case \\(d=12,\\;k=12\\)), each component is a\nsingle edge; there is exactly **one** perfect matching \u2013 the 12 diameters.\n\n* For any other admissible \\(k\\) the cycles have even length \\(\\ge4\\).\nInside each such cycle there are exactly two ways to choose a perfect matching\n(alternate edges).  Since the cycles are independent, the number of perfect\nmatchings for the given \\(k\\) is  \n\n\\[\n2^{\\,d}\\qquad (d=\\gcd(24,k),\\;d\\neq 8,\\;k\\neq 12).\n\\]\n\n--------------------------------------------------------------------\n\n### 3.  Counting for each step\n\n\\[\n\\begin{array}{c|c|c|c}\nk & d=\\gcd(24,k) & \\text{cycle length }24/d & \\#\\text{ matchings}\\\\ \\hline\n1 & 1 & 24 & 2\\\\\n2 & 2 & 12 & 2^{2}=4\\\\\n3 & 3 & 8 & 2^{3}=8\\\\\n4 & 4 & 6 & 2^{4}=16\\\\\n5 & 1 & 24 & 2\\\\\n6 & 6 & 4 & 2^{6}=64\\\\\n7 & 1 & 24 & 2\\\\\n8 & 8 & 3 & 0\\\\\n9 & 3 & 8 & 2^{3}=8\\\\\n10& 2 & 12& 2^{2}=4\\\\\n11& 1 & 24& 2\\\\\n12&12 & 2 & 1\\ (\\text{forced diameters})\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n\n### 4.  Total number of drawings\n\nAdd the numbers of matchings over all admissible steps:\n\n\\[\n\\begin{aligned}\nN&=2+4+8+16+2+64+2+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{113}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 113

      \n

      Extracted Answer: 113

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The 8 occupied chairs must avoid a configuration where a person has two neighbours.  \nHence no three occupied chairs may be consecutive.\n\nLet a be the number of blocks of two consecutive occupied chairs.  \nEach block of two contributes an extra occupied chair, so the total number of blocks is  \n\n\\[\nb = 8-a\\qquad (0\\le a\\le 4).\n\\]\n\n*Choosing which blocks are of size\u202f2*: \\(\\displaystyle \\binom{b}{a}\\).\n\nThere are \\(16-8=8\\) empty chairs. Between the \\(b\\) blocks there must be at least one empty chair, using \\(b-1\\) empties.  \nThe remaining \\(8-(b-1)=9-b\\) empty chairs can be placed in the \\(b+1\\) gaps (before the first block, after the last, and the \\(b-1\\) internal gaps) without restriction.  \n\nNumber of ways to distribute them:  \n\n\\[\n\\binom{(9-b)+(b+1)-1}{(b+1)-1}= \\binom{9}{b}.\n\\]\n\nThus for a given \\(a\\),\n\n\\[\n\\text{ways}= \\binom{b}{a}\\binom{9}{b}\n          =\\binom{8-a}{a}\\binom{9}{8-a}.\n\\]\n\nSumming over \\(a=0,1,2,3,4\\),\n\n\\[\n\\begin{aligned}\nN &=\\binom{8}{0}\\binom{9}{8} \n   +\\binom{7}{1}\\binom{9}{7}\n   +\\binom{6}{2}\\binom{9}{6}\n   +\\binom{5}{3}\\binom{9}{5}\n   +\\binom{4}{4}\\binom{9}{4} \\\\[2mm]\n  &= 1\\cdot 9 + 7\\cdot 36 + 15\\cdot 84 + 10\\cdot 126 + 1\\cdot126\\\\\n  &= 9+252+1260+1260+126 = 2907.\n\\end{aligned}\n\\]\n\nTherefore  \n\n\\[\nN \\equiv 2907 \\pmod{1000}=907.\n\\]\n\n\\[\n\\boxed{907}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 907

      \n

      Extracted Answer: 907

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nr_i=|A_1A_i| \\qquad (i=2,\\dots ,11)\n\\]\n\nand denote  \n\n\\[\n\\theta=\\angle A_iA_1A_{i+1}\\qquad (2\\le i\\le 10).\n\\]\n\nBecause  \n\n\\[\n\\cos\\theta=\\frac{12}{13}\\;\\Longrightarrow\\;\\sin\\theta=\\frac{5}{13},\n\\]\n\nthe area of \\(\\triangle A_iA_1A_{i+1}\\) is  \n\n\\[\n\\frac12 r_i r_{i+1}\\sin\\theta\n   =\\frac12 r_i r_{i+1}\\frac{5}{13}=1 .\n\\]\n\nHence  \n\n\\[\nr_i r_{i+1}= \\frac{26}{5}=K\\qquad (2\\le i\\le 10). \\tag{1}\n\\]\n\nFrom (1),\n\n\\[\nr_{i+2}= \\frac{K}{r_{i+1}}=r_i ,\n\\]\n\nso the distances from \\(A_1\\) alternate:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=a,\\qquad\nr_3=r_5=r_7=r_9=r_{11}=b,\n\\]\n\nwith  \n\n\\[\nab=K=\\frac{26}{5}. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### Lengths of the other sides\n\nFor any \\(i=2,\\dots ,10\\) the side \\(A_iA_{i+1}\\) (call it \\(L\\)) satisfies the law of cosines:\n\n\\[\nL^2=a^{2}+b^{2}-2ab\\cos\\theta\n      =a^{2}+b^{2}-2ab\\frac{12}{13}.\n\\]\n\nUsing (2),\n\n\\[\nL^2=a^{2}+b^{2}-\\frac{24}{13}\\cdot\\frac{26}{5}\n    =a^{2}+b^{2}-\\frac{48}{5}.\n\\]\n\nSince \\(a^{2}+b^{2}=(a+b)^{2}-2ab\\),\n\n\\[\nL^2=(a+b)^{2}-2\\frac{26}{5}-\\frac{48}{5}\n     =(a+b)^{2}-20.\n\\]\n\nLet  \n\n\\[\ns=a+b.\n\\]\n\nThen  \n\n\\[\nL=\\sqrt{s^{2}-20}. \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### Using the perimeter\n\nThe perimeter of the 11\u2011gon is\n\n\\[\n|A_1A_2|+|A_1A_{11}|+\\sum_{i=2}^{10}|A_iA_{i+1}|\n= a+b+9L = s+9\\sqrt{s^{2}-20}=20.\n\\]\n\nSet \\(t=\\sqrt{s^{2}-20}>0\\). Then \\(s=20-9t\\) and\n\n\\[\nt^{2}=s^{2}-20=(20-9t)^{2}-20.\n\\]\n\nSolving,\n\n\\[\nt^{2}=380-360t+81t^{2}\n\\Longrightarrow 80t^{2}-360t+380=0\n\\Longrightarrow 4t^{2}-18t+19=0.\n\\]\n\nHence  \n\n\\[\nt=\\frac{18\\pm\\sqrt{324-304}}{8}\n   =\\frac{18\\pm2\\sqrt5}{8}\n   =\\frac{9\\pm\\sqrt5}{4}.\n\\]\n\nIf the plus sign is taken, \\(t>\\frac{20}{9}\\) and \\(s=20-9t<0\\), impossible.\nThus  \n\n\\[\nt=\\frac{9-\\sqrt5}{4},\n\\qquad\ns=20-9t=\\frac{9\\sqrt5-1}{4}.\n\\]\n\nConsequently  \n\n\\[\nA_1A_2+A_1A_{11}=s=\\frac{9\\sqrt5-1}{4}.\n\\]\n\nWritten as \\(\\dfrac{m\\sqrt n-p}{q}\\) we have  \n\n\\[\nm=9,\\;n=5,\\;p=1,\\;q=4,\n\\]\n\nso  \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 19

      \n

      Extracted Answer: 19

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Step 1.  Regions created by chords**\n\nIf a circle already has \\(k\\) chords drawn in its interior, then a new chord\nadds one region for itself plus one extra region for every interior\nintersection it creates.  \nThus for a set of \\(n\\) chords\n\n\\[\n\\text{# regions}=n+1+\\text{# interior intersection points.}\n\\]\n\nIn our problem we have  \n\n* 2 fixed diameters (the two perpendicular ones),  \n* 25 random chords.\n\nHence \\(n=27\\).  \nWe only have to find the expected number \\(I\\) of interior intersection\npoints.\n\n\\[\nE[\\text{regions}]=27+1+E[I]=28+E[I].\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2.  Intersections involving the two diameters**\n\nLet the horizontal diameter be the line that separates the *upper* quadrants\n\\(Q_{1},Q_{2}\\) from the *lower* quadrants \\(Q_{3},Q_{4}\\).\n\nA random chord has its two endpoints in different quadrants.\nThe chord meets the horizontal diameter exactly when the endpoints lie in\ndifferent half\u2011planes, i.e. one endpoint is in \\(\\{Q_{1},Q_{2}\\}\\) and the\nother in \\(\\{Q_{3},Q_{4}\\}\\).\n\nFor the ordered pair of quadrants of a random chord there are  \n\\(12\\) equally likely possibilities (the \\(4\\cdot 3\\) ordered pairs with\ndifferent quadrants).  \nExactly \\(8\\) of them have the endpoints in opposite half\u2011planes, hence\n\n\\[\np_d=\\Pr(\\text{a random chord meets a given diameter})=\\frac{8}{12}=\n\\frac{2}{3}.\n\\]\n\nTherefore\n\n\\[\n\\boxed{\\text{Expected intersections of the 25 chords with one diameter}=25\\cdot\\frac23}\n\\]\n\nand with the two diameters together\n\n\\[\nE[I_{\\text{diameters}}]=2\\cdot25\\cdot\\frac23=\\frac{100}{3}.\n\\]\n\nThe two diameters intersect each other once, so add \\(1\\) more interior\nintersection.\n\n--------------------------------------------------------------------\n\n**Step 3.  Intersections of two random chords**\n\nDenote the four endpoints by  \n\\(\\alpha_1,\\alpha_2\\) (chord 1) and \\(\\beta_1,\\beta_2\\) (chord 2).  \nAll four points are independent uniform on the circle.\n\nLet  \n\n\\[\nA=\\{\\text{endpoints of chord 1 lie in different quadrants}\\},\\qquad \nB=\\{\\text{endpoints of chord 2 lie in different quadrants}\\}.\n\\]\n\n\\[\nP(A)=P(B)=\\frac34 .\n\\]\n\nTwo chords intersect iff the endpoints are interleaved on the circle,\ni.e. exactly one of \\(\\beta_1,\\beta_2\\) lies on the clockwise arc from\n\\(\\alpha_1\\) to \\(\\alpha_2\\).\n\nFix \\(\\alpha_1=x\\) and \\(\\alpha_2=y\\) (with \\(x\\neq y\\)).\nLet \\(I=(x,y)\\) be the clockwise arc from \\(x\\) to \\(y\\) and let\n\\(d=|I|\\) be its length.  \nFor independent uniform \\(\\beta_1,\\beta_2\\),\n\n* the probability that exactly one lies in \\(I\\) is \\(2d(1-d)\\);\n* the probability that the two \\(\\beta\\)\u2019s are in *different* quadrants\n  is \\(\\frac34\\).\n\nConditioning on the actual placement of the interval \\(I\\) with respect\nto the four quarter\u2011arcs yields (after a short computation)\n\n\\[\n\\Pr(\\beta_1,\\beta_2\\text{ satisfy both conditions}\\mid x,y)=\n2\\Bigl[d\\Bigl(\\tfrac34-d\\Bigr)+\\sum_{q=0}^{3}a_q^{\\,2}\\Bigr],\n\\tag{1}\n\\]\n\nwhere \\(a_q\\) is the length of the part of \\(I\\) that lies in quadrant\n\\(q\\).\n\nNow average (1) over all ordered pairs \\((x,y)\\) that are in different\nquadrants.  By symmetry it suffices to place \\(x\\) in the first quadrant\n\\([0,\\tfrac14)\\) and let \\(y\\) run in the three other quadrants.\nCarrying out the integration (splitting the three possible clockwise\ndistances) gives\n\n\\[\n\\int\\!\\!\\int_{x\\in Q_0,\\;y\\in Q_m}\n2\\Bigl[d\\Bigl(\\tfrac34-d\\Bigr)+\\sum a_q^{\\,2}\\Bigr]\\,dy\\,dx\n   =\\frac{17}{64}\\qquad(m=1,2,3\\text{ summed}).\n\\]\n\nThus\n\n\\[\nP(A\\cap B\\cap\\{\\text{the chords intersect}\\})=\\frac{17}{64}.\n\\]\n\nFinally\n\n\\[\np_r=\n\\Pr(\\text{intersection}\\mid A\\cap B)=\n\\frac{P(A\\cap B\\cap\\text{intersect})}{P(A)P(B)}\n=\\frac{17/64}{(3/4)^2}\n=\\frac{16}{9}\\cdot\\frac{17}{64}\n=\\frac{17}{36}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4.  Expected interior intersections**\n\n* Intersections of the two diameters: \\(1\\).\n* Intersections of the 25 random chords with the two diameters:\n  \\(\\displaystyle \\frac{100}{3}\\).\n* Intersections among the 25 random chords:\n  \\(\\displaystyle \\binom{25}{2}\\,p_r\n   =300\\cdot\\frac{17}{36}= \\frac{425}{3}\\).\n\nHence\n\n\\[\nE[I]=1+\\frac{100}{3}+\\frac{425}{3}\n     =1+\\frac{525}{3}=1+175=176.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5.  Expected number of regions**\n\n\\[\nE[\\text{regions}]=27+1+E[I]=28+176=204.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 204

      \n

      Extracted Answer: 204

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\triangle ABC\\qquad \n\\angle A=84^{\\circ},\\; \\angle B=60^{\\circ},\\; \\angle C=36^{\\circ}.\n\\]\n\nDenote  \n\n\\[\nD,E,F \\text{ \u2013 the midpoints of }BC,CA,AB,\n\\]\n\\[\nG,H,J \\text{ \u2013 the second intersections of }BD,AE,AF\\text{ with the circumcircle of } \\triangle DEF .\n\\]\n\n--------------------------------------------------------------------\n### 1.  The points \\(G,H,J\\) are the feet of the altitudes  \n\nThe nine\u2011point circle of \\(\\triangle ABC\\) passes through the three midpoints \\(D,E,F\\) **and** through the three feet of the altitudes.  \nBecause  \n\n* \\(BD\\) lies on the side \\(BC\\),  \n* \\(AE\\) lies on the side \\(CA\\),  \n* \\(AF\\) lies on the side \\(AB\\),\n\nthe second intersection of each of these sides with the nine\u2011point circle must be the corresponding foot of an altitude:\n\n\\[\n\\begin{aligned}\nG&= \\text{foot from }A\\text{ onto }BC,\\\\[2mm]\nH&= \\text{foot from }B\\text{ onto }CA,\\\\[2mm]\nJ&= \\text{foot from }C\\text{ onto }AB .\n\\end{aligned}\n\\]\n\nThus \\(G,H,J\\) are the vertices of the orthic triangle.\n\n--------------------------------------------------------------------\n### 2.  Arc \\(\\widehat{DE}\\)\n\nThe medial triangle \\(\\triangle DEF\\) is similar to \\(\\triangle ABC\\) (ratio \\(1\\!:\\!2\\)).  \nConsequently  \n\n\\[\n\\angle DFE = \\angle C = 36^{\\circ}.\n\\]\n\nFor any inscribed angle, the intercepted minor arc is twice the angle; hence  \n\n\\[\n\\widehat{DE}=2\\angle DFE = 2\\cdot 36^{\\circ}=72^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 3.  Arc \\(\\widehat{FG}\\)\n\nSince \\(D\\) and \\(G\\) both lie on side \\(BC\\), the chord \\(DG\\) is a part of \\(BC\\).  \nThe chord \\(DF\\) joins the midpoints of \\(AB\\) and \\(BC\\); by the Midpoint Theorem  \n\n\\[\nDF \\parallel AC .\n\\]\n\nTherefore  \n\n\\[\n\\angle FDG =\\angle (\\text{line }DF,\\text{ line }DG)\n        =\\angle (AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nThus  \n\n\\[\n\\widehat{FG}=2\\angle FDG = 2\\cdot 36^{\\circ}=72^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 4.  Arc \\(\\widehat{HJ}\\)\n\n\\(H,J,G\\) are the vertices of the orthic triangle.  \nA standard fact about the orthic triangle is that its angles are  \n\n\\[\n\\angle HGJ = 180^{\\circ}-2\\angle A,\\qquad\n\\angle GJH = 180^{\\circ}-2\\angle B,\\qquad\n\\angle JHG = 180^{\\circ}-2\\angle C .\n\\]\n\n(The fact follows from simple angle\u2011chasing with the right\u2011angles at the feet of the altitudes.)\n\nHence the minor arc opposite \\(G\\) \u2013 that is, \\(\\widehat{HJ}\\) \u2013 satisfies  \n\n\\[\n\\widehat{HJ}=2\\angle HGJ =2\\bigl(180^{\\circ}-2A\\bigr)\n               =360^{\\circ}-4A.\n\\]\n\nWith \\(\\angle A =84^{\\circ}\\),\n\n\\[\n\\widehat{HJ}=360^{\\circ}-4\\cdot84^{\\circ}=24^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 5.  Required sum\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&= 72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ}\\\\\n&= 72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\[2mm]\n&= 336^{\\circ}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 336

      \n

      Extracted Answer: 336

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\n\\angle A =90^\\circ ,\\qquad BC =38 .\n\\]\n\nPlace  \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nso that the legs are  \n\n\\[\nAB=b,\\qquad AC=c,\\qquad b^{2}+c^{2}=38^{2}=1444 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1.  Coordinates of \\(K\\) and \\(L\\)\n\nBecause  \n\n\\[\nAK=BK=14,\n\\]\n\n\\(K\\) lies on the perpendicular bisector of \\(\\overline{AB}\\); hence  \n\n\\[\nK=\\Bigl(\\frac b2,\\;\\sqrt{14^{2}-\\Bigl(\\frac b2\\Bigr)^{2}}\\Bigr)\n   =\\bigl( X,\\;U\\bigr)\n\\]\n\nwith  \n\n\\[\nX=\\frac b2,\\qquad U=\\sqrt{196-X^{2}} .\\tag{2}\n\\]\n\nSimilarly  \n\n\\[\nAL=CL=14\\Longrightarrow \nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^{2}},\\;\\frac c2\\Bigr)\n   =(V,Y),\\qquad \nY=\\frac c2,\\;V=\\sqrt{196-Y^{2}} .\\tag{3}\n\\]\n\nThus  \n\n\\[\nX^{2}+Y^{2}= \\frac{b^{2}+c^{2}}{4}\n           =\\frac{1444}{4}=361 .\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 2.  The equilateral triangle \\(AKL\\)\n\nAll three sides of \\(\\triangle AKL\\) equal \\(14\\), so \\(\\angle KAL=60^\\circ\\).\nUsing the vectors \\(\\overrightarrow{AK}=(X,U)\\) and \\(\\overrightarrow{AL}=(V,Y)\\),\n\n\\[\n\\overrightarrow{AK}\\cdot\\overrightarrow{AL}=|AK||AL|\\cos 60^\\circ\n\\Longrightarrow\nXV+YU=98 .\\tag{5}\n\\]\n\nFrom (2)\u2013(5) we have the system\n\n\\[\n\\begin{cases}\nX^{2}+Y^{2}=361,\\\\[2pt]\nX\\sqrt{196-Y^{2}}+Y\\sqrt{196-X^{2}}=98 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Solving the system\n\nSet  \n\n\\[\nX=14\\cos\\alpha ,\\qquad U=14\\sin\\alpha ,\\qquad \nY=14\\cos\\beta ,\\qquad V=14\\sin\\beta .\n\\]\n\nThen (5) becomes  \n\n\\[\n14^{2}\\bigl(\\cos\\alpha\\sin\\beta+\\cos\\beta\\sin\\alpha\\bigr)\n   =196\\sin(\\alpha+\\beta)=98,\n\\]\n\nhence  \n\n\\[\n\\sin(\\alpha+\\beta)=\\frac12\\Longrightarrow\\alpha+\\beta=\\frac{\\pi}{6}\\;(30^\\circ). \\tag{6}\n\\]\n\nFrom \\(X^{2}+Y^{2}=361\\),\n\n\\[\n196\\bigl(\\cos^{2}\\alpha+\\cos^{2}\\beta\\bigr)=361\n\\Longrightarrow\n\\cos^{2}\\alpha+\\cos^{2}\\beta= \\frac{361}{196}=1+\\frac{165}{196}.\n\\]\n\nUsing \\(\\cos^{2}\\alpha+\\cos^{2}\\beta=\n1+\\cos(\\alpha+\\beta)\\cos(\\alpha-\\beta)\\) gives  \n\n\\[\n\\cos\\frac{\\pi}{6}\\,\\cos(\\alpha-\\beta)=\\frac{165}{196}\n\\Longrightarrow\n\\cos(\\alpha-\\beta)=\\frac{165}{98\\sqrt3}\n       =\\frac{55\\sqrt3}{98}.\n\\]\n\nHence  \n\n\\[\n\\sin(\\alpha-\\beta)=\\sqrt{1-\\Bigl(\\frac{55\\sqrt3}{98}\\Bigr)^{2}}\n                 =\\frac{23}{98}.\n\\]\n\nNow compute \\(\\cos\\alpha\\) and \\(\\cos\\beta\\):\n\\[\n\\cos\\alpha=\\sqrt{\\frac{1+\\cos(\\alpha+\\beta)}{2}}\n          =\\sqrt{\\frac{1+\\frac{71}{98}}{2}}\n          =\\frac{13}{14},\n\\qquad\n\\cos\\beta =\\sqrt{\\frac{1+\\cos(\\alpha-\\beta)}{2}}\n          =\\sqrt{\\frac{1+\\frac{47}{49}}{2}}\n          =\\frac{4\\sqrt3}{7}.\n\\]\n\nTherefore  \n\n\\[\nX=14\\cos\\alpha =13,\\qquad \nY=14\\cos\\beta =8\\sqrt3 .\n\\]\n\nConsequently  \n\n\\[\nb=2X=26,\\qquad c=2Y=16\\sqrt3 .\n\\]\n\nOne easily checks that \\(b^{2}+c^{2}=26^{2}+ (16\\sqrt3)^{2}=1444\\), i.e. \\(BC=38\\).\n\n--------------------------------------------------------------------\n### 4.  Area of \\(BKLC\\)\n\nThe right\u2011triangle \\(ABC\\) has area  \n\n\\[\n[ABC]=\\frac12\\,b\\,c\n      =\\frac12\\cdot26\\cdot16\\sqrt3\n      =208\\sqrt3 .\n\\]\n\nThe three small triangles cut off by \\(K\\) and \\(L\\) have areas  \n\n\\[\n\\begin{aligned}\n[ABK]&=\\frac12\\cdot b\\cdot U\n      =\\frac12\\cdot26\\cdot3\\sqrt3=39\\sqrt3,\\\\[2pt]\n[ALC]&=\\frac12\\cdot c\\cdot V\n      =\\frac12\\cdot16\\sqrt3\\cdot2=16\\sqrt3,\\\\[2pt]\n[AKL]&=\\frac{\\sqrt3}{4}\\cdot14^{2}=49\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus\n\n\\[\n\\begin{aligned}\n[BKLC] &=[ABC]-[ABK]-[ALC]-[AKL]\\\\\n       &=208\\sqrt3-(39\\sqrt3+16\\sqrt3+49\\sqrt3)\\\\\n       &=104\\sqrt3 .\n\\end{aligned}\n\\]\n\nHence the area of \\(BKLC\\) is \\(n\\sqrt3\\) with  \n\n\\[\n\\boxed{n=104}.\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 104

      \n

      Extracted Answer: None

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution**\n\n\\[\nx_{k+1}= \\frac13\\Bigl(x_k+\\frac1{x_k}-1\\Bigr),\\qquad \nx_1=\\frac{25}{11}\n\\]\n\nWrite each term as a reduced fraction  \n\n\\[\nx_k=\\frac{p_k}{q_k},\\qquad \\gcd(p_k,q_k)=1 .\n\\]\n\nThen  \n\n\\[\nx_{k+1}= \\frac{p_k^2+q_k^2-p_kq_k}{3p_kq_k}\n      =\\frac{p_{k+1}}{q_{k+1}}\n\\]\n\nwhere  \n\n\\[\np_{k+1}= \\frac{p_k^2+q_k^2-p_kq_k}{3},\n\\qquad \nq_{k+1}=p_kq_k . \\tag{1}\n\\]\n\n(The numerator is always divisible by \\(3\\); one checks that\n\\(\\gcd(p_{k+1},q_{k+1})=1\\) for every \\(k\\).)\n\n--------------------------------------------------------------------\n### 1.  A simple recurrence for the sum  \n\nLet  \n\n\\[\ns_k=p_k+q_k .\n\\]\n\nAdding the two formulas in (1),\n\n\\[\n\\begin{aligned}\ns_{k+1}&=p_{k+1}+q_{k+1}\n        =\\frac{p_k^2+q_k^2-p_kq_k}{3}+p_kq_k  \\\\\n        &=\\frac{p_k^2+2p_kq_k+q_k^2}{3}\n        =\\frac{(p_k+q_k)^2}{3}\n        =\\frac{s_k^{\\,2}}{3}.\n\\end{aligned}\n\\]\n\nThus  \n\n\\[\ns_{k+1}= \\frac{s_k^{\\,2}}{3},\\qquad s_1=p_1+q_1=25+11=36.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Closed form\n\nSet \\(t_k=s_k/3\\).  From (2)\n\n\\[\nt_{k+1}=t_k^{\\,2},\\qquad t_1=\\frac{36}{3}=12 .\n\\]\n\nHence  \n\n\\[\nt_k=12^{\\,2^{\\,k-1}},\\qquad \ns_k=3t_k=3\\cdot 12^{\\,2^{\\,k-1}} . \\tag{3}\n\\]\n\nTherefore  \n\n\\[\np_{2025}+q_{2025}=s_{2025}=3\\cdot 12^{\\,2^{2024}} .\n\\]\n\n--------------------------------------------------------------------\n### 3.  Computing the last three digits  \n\nWe need  \n\n\\[\nM=3\\cdot 12^{\\,2^{2024}}\\pmod{1000}.\n\\]\n\nBecause \\(1000=8\\cdot125\\) we compute the two residues separately.\n\n*Modulo \\(8\\)*  \n\n\\(12\\equiv4\\pmod8\\) and \\(4^{2}=0\\pmod8\\).  \nSince the exponent \\(2^{2024}\\ge2\\),\n\n\\[\n12^{\\,2^{2024}}\\equiv0\\pmod8 .\n\\]\n\nHence \\(M\\equiv0\\pmod8\\).\n\n*Modulo \\(125\\)*  \n\n\\(\\gcd(12,125)=1\\) and \\(\\varphi(125)=100\\), so  \n\\(12^{100}\\equiv1\\pmod{125}\\).  \nThus only the exponent modulo \\(100\\) matters:\n\n\\[\ne=2^{2024}\\pmod{100}.\n\\]\n\nFor \\(n\\ge2\\) the powers of \\(2\\) modulo \\(100\\) have period \\(20\\):\n\\(2^{n+20}\\equiv2^n\\pmod{100}\\).\nSince \\(2024\\equiv4\\pmod{20}\\),\n\n\\[\ne\\equiv2^{4}=16\\pmod{100}.\n\\]\n\nNow compute \\(12^{16}\\pmod{125}\\):\n\n\\[\n\\begin{aligned}\n12^{2}&\\equiv144\\equiv19,\\\\\n12^{4}&\\equiv19^{2}=361\\equiv111,\\\\\n12^{8}&\\equiv111^{2}=12321\\equiv71,\\\\\n12^{16}&\\equiv71^{2}=5041\\equiv41\\pmod{125}.\n\\end{aligned}\n\\]\n\nHence  \n\n\\[\n12^{\\,2^{2024}}\\equiv41\\pmod{125}.\n\\]\n\n*Chinese remainder theorem*  \n\nFind \\(A\\) such that  \n\n\\[\nA\\equiv0\\pmod8,\\qquad A\\equiv41\\pmod{125}.\n\\]\n\nWrite \\(A=8k\\).  Then \\(8k\\equiv41\\pmod{125}\\Rightarrow\nk\\equiv41\\cdot8^{-1}\\pmod{125}\\).\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),\n\n\\[\nk\\equiv41\\cdot47\\equiv52\\pmod{125},\n\\]\nso \\(k=52+125t\\) and  \n\n\\[\nA=8k=416+1000t\\equiv416\\pmod{1000}.\n\\]\n\nFinally  \n\n\\[\nM=3A\\equiv3\\cdot416=1248\\equiv\\boxed{248}\\pmod{1000}.\n\\]\n\nThus the remainder of \\(m+n\\) when divided by \\(1000\\) is **248**.
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 248

      \n

      Extracted Answer: 248

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      Let  \n\n\\[\nf_k(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \\frac{N(x)}{x},\\qquad x>0 ,\n\\]\n\nwhere  \n\n\\[\nN(x)=(x-18)(x-72)(x-98)(x-k)\n      =x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k)x+127008k .\n\\]\n\n--------------------------------------------------------------------\n### 1.  What does \u201cthe minimum is attained at exactly two points\u2019\u2019 mean?\n\nIf the global minimum value is \\(m\\), then for every \\(x>0\\)\n\n\\[\n\\frac{N(x)}{x}\\ge m\\qquad\\Longleftrightarrow\\qquad N(x)-mx\\ge0 .\n\\]\n\nEquality occurs exactly at the points where the minimum is attained.\nSince \\(N(x)-mx\\) is a quartic polynomial, the only way it can be\nnon\u2011negative for all \\(x\\) and vanish at exactly two distinct points is\n\n\\[\nN(x)-mx=(x-a)^{2}(x-b)^{2}\\qquad(a\\neq b,\\;a,b>0).\n\\]\n\nThus there are numbers \\(a,b,m\\) such that  \n\n\\[\n\\begin{cases}\nN(a)=ma,\\quad N'(a)=m,\\\\[2pt]\nN(b)=mb,\\quad N'(b)=m .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 2.  Coefficient comparison\n\nWrite\n\n\\[\n(x-a)^{2}(x-b)^{2}=(x^{2}-Sx+P)^{2},\n\\qquad\nS=a+b,\\;P=ab .\n\\]\n\nEquating coefficients of \\(N(x)-mx\\) and \\((x^{2}-Sx+P)^{2}\\) yields  \n\n\\[\n\\begin{aligned}\nS&=\\frac{188+k}{2},\\tag{1}\\\\[2pt]\nS^{2}+2P&=10116+188k,\\tag{2}\\\\[2pt]\n2SP&=127008+10116k+m,\\tag{3}\\\\[2pt]\nP^{2}&=127008\\,k.\\tag{4}\n\\end{aligned}\n\\]\n\nFrom (1) and (4)\n\n\\[\nS=\\frac{188+k}{2},\\qquad P=\\sqrt{127008\\,k}.\n\\]\n\nInsert these in (2):\n\n\\[\n\\frac{(188+k)^{2}}{4}+2\\sqrt{127008\\,k}=10116+188k .\n\\]\n\nMultiplying by \\(4\\) and using \\(\\sqrt{127008}=252\\sqrt2\\) gives  \n\n\\[\nk^{2}-376k-5120+2016\\sqrt{2k}=0. \\tag{5}\n\\]\n\n--------------------------------------------------------------------\n### 3.  Solving for \\(k\\)\n\nSet \\(u=\\sqrt{k}>0\\).  Then \\(\\sqrt{2k}=u\\sqrt2\\) and (5) becomes  \n\n\\[\nu^{4}-376u^{2}+2016\\sqrt2\\,u-5120=0 .\n\\]\n\nWrite \\(u=a\\sqrt2\\;(a>0)\\); the equation reduces to  \n\n\\[\na^{4}-188a^{2}+1008a-1280=0 .\n\\]\n\nFactoring,\n\n\\[\n(a^{2}-6a+8)(a^{2}+6a-160)=0,\n\\]\n\nso  \n\n\\[\na=2,\\;4,\\;10\\quad(\\text{the root }a=-16\\text{ gives }u<0\\text{ and is discarded}).\n\\]\n\nSince \\(k=u^{2}=2a^{2}\\),\n\n\\[\nk=2\\cdot2^{2}=8,\\qquad\nk=2\\cdot4^{2}=32,\\qquad\nk=2\\cdot10^{2}=200 .\n\\]\n\nFor each of these values the discriminant  \n\n\\[\n\\Delta=S^{2}-4P>0\n\\]\n\nso the quadratic \\(x^{2}-Sx+P\\) has two distinct positive roots; consequently\n\\(f_{k}(x)\\) attains its global minimum at exactly those two points.\n\n--------------------------------------------------------------------\n### 4.  Sum of the admissible \\(k\\)\n\n\\[\n8+32+200 = 240 .\n\\]\n\n\\[\n\\boxed{240}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 240

      \n

      Extracted Answer: 240

      \n

      Score: 1.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      **Solution Outline**\n\n1.  Let \\(M=3^{7}=2187\\) and \\(A=\\{1,\\ldots ,3^{6}\\}= \\{1,\\dots ,729\\}\\).\n    For each \\(a\\in A\\) put \\(r(a)=a^{3}\\pmod{M}\\).\n    The required number  \n\n    \\[\n    N=\\#\\{(a,b,c)\\in A^{3}:r(a)+r(b)+r(c)\\equiv0\\pmod M\\}\n    \\]\n\n    is the weighted convolution of the distribution of the residues\n    \\(r(a)\\).\n\n2.  Write each \\(a\\) as \\(a=3^{v}a'\\) with \\(\\gcd(a',3)=1\\).\n\n| \\(v\\) | range of \\(a\\) | # of such \\(a\\) | residue \\(a^{3}\\) (mod\u202f\\(M\\)) | weight |\n|-------|----------------|-----------------|-------------------------------|--------|\n| 0 | not divisible by 3 | \\(486\\) | \\(a^{\\prime\\,3}\\) (unit cube) | \\(1\\) |\n| 1 | \\(3\\mid a,9\\nmid a\\) | \\(162\\) | \\(27a^{\\prime\\,3}\\) | \\(9\\) |\n| 2 | \\(9\\mid a,27\\nmid a\\) | \\(54\\) | \\(729a^{\\prime\\,3}\\) | \\(27\\) |\n| \\(\\ge3\\) | \\(27\\mid a\\) | \\(27\\) | \\(0\\) | \\(27\\)\n\nHence the possible residues and their multiplicities are  \n\n* 0\u2003\u2003\u2003\u2003\u2003\u2003weight\u202f\\(27\\);\n* the two residues \\(729,\\,1458\\)\u2003weight\u202f\\(27\\) each;\n* 18 residues (the cubes of the unit group modulo\u202f\\(81\\))\u2003weight\u202f\\(9\\) each;\n* 486 residues (the cubes of the unit group modulo\u202f\\(3^{7}\\))\u2003weight\u202f\\(1\\) each.\n\nDenote by  \n\n* \\(D\\) the 486 unit\u2011cube residues (weight\u202f1);\n* \\(C\\) the 18 residues \\(27\\cdot u\\) with \\(u\\) a unit\u2011cube modulo\u202f\\(81\\) (weight\u202f9);\n* \\(B\\) the two residues \\(729,1458\\) (weight\u202f27);\n* \\(0\\) the zero residue (weight\u202f27).\n\n3.  Split the count according to how many zero\u2011terms occur.\n    Let  \n\n    \\[\n    w(x)=\\text{weight of residue }x.\n    \\]\n\n    For \\(x\\neq0\\) put \\(R'=\\{D\\cup C\\cup B\\}\\).  Then\n\n    \\[\n    N=N_{0}+N_{1}+N_{2},\n    \\]\n\n    where  \n\n    * \\(N_{2}=w(0)^{3}=27^{3}=19683\\)  (all three residues zero);\n    * \\(N_{1}=3\\,w(0)\\displaystyle\\sum_{\\substack{y+z\\equiv0\\\\y,z\\in R'}}\n            w(y)w(z) =3\\cdot27\\cdot3402=275\\,562\\);\n    * \\(N_{0}\\) counts triples with no zero term.\n\n    The sum in \\(N_{1}\\) is obtained easily:\n    each \\(x\\in D\\) pairs with its inverse, giving \\(486\\) ordered pairs,\n    each \\(x\\in C\\) gives \\(18\\) ordered pairs (weight \\(9^{2}=81\\)), and each\n    \\(x\\in B\\) gives \\(2\\) ordered pairs (weight \\(27^{2}=729\\)).\n    Hence \\(\\displaystyle\\sum_{y+z\\equiv0}w(y)w(z)=486+1458+1458=3402\\).\n\n4.  Compute \\(N_{0}\\).\n    After factoring the common factor \\(27\\) from the elements of \\(C\\cup B\\),\n    the condition \\(x+y+z\\equiv0\\pmod{M}\\) becomes\n\n    \\[\n    u+v+w\\equiv0\\pmod{81},\n    \\]\n\n    where \\(u,v,w\\) belong to  \n\n    * the set \\(S\\) of the 18 unit\u2011cubes modulo\u202f\\(81\\) (weight\u202f9);\n    * the two residues \\(27,54\\) (weight\u202f27).\n\n    For the set \\(S\\) one has the simple description  \n\n    \\[\n    S=\\{x\\pmod{81}:x\\equiv\\pm1\\pmod9\\}.\n    \\]\n\n    Using this description we compute the additive convolution on \\(\\mathbb Z/81\\).\n\n    * For any \\(t\\equiv0\\pmod9\\) we have \\(\\#\\{(s_{1},s_{2})\\in S^{2}:s_{1}+s_{2}\\equiv t\\}=18\\).\n    * For any \\(t\\equiv\\pm2\\pmod9\\) the count equals \\(9\\).\n    * For any other residue the count is \\(0\\).\n\n    Consequently\n\n    * there are no triples \\(s_{1}+s_{2}+s_{3}\\equiv0\\) with all three from \\(S\\);\n    * ordered triples with exactly one element from \\(\\{27,54\\}\\) and two from \\(S\\) are possible.\n      For each of the two choices \\(\\{27,54\\}\\) there are\n      \\((A*A)(27)=(A*A)(54)=18\\) ordered pairs from \\(S\\);  \n      with three possible positions for the \u201c\\(B\\)\u2019\u2019 element we obtain  \n\n      \\[\n      2\\cdot3\\cdot18=108\n      \\]\n\n      ordered triples.  Their weight is \\(27\\cdot9^{2}=2187\\), giving a contribution  \n\n      \\[\n      108\\cdot2187=236\\,196 .\n      \\]\n\n    * triples consisting only of the two \u201c\\(B\\)\u201d residues satisfy the condition\n      only when all three are equal, giving two ordered triples,\n      each of weight \\(27^{3}=19683\\); contribution  \n\n      \\[\n      2\\cdot19683=39\\,366 .\n      \\]\n\n    Adding these contributions:\n\n    \\[\n    N_{0}=236\\,196+39\\,366=275\\,562 .\n    \\]\n\n5.  Assemble all parts:\n\n    \\[\n    N=N_{0}+N_{1}+N_{2}=275\\,562+275\\,562+19\\,683=570\\,807 .\n    \\]\n\n6.  The required remainder is  \n\n    \\[\n    N\\bmod1000 = 570\\,807\\bmod1000 = \\boxed{807}.\n    \\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 735

      \n

      Extracted Answer: 807

      \n

      Score: 0.0

      ", + "\n

      Prompt conversation

      \n\n\n
      \n
      \n user\n \n
      \n
      \n
      \nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n
      \n
      \n
      \n\n

      Sampled message

      \n\n
      \n
      \n assistant\n \n
      \n
      \n
      The minimum value of \\(f(X)\\) works out to be  \n\n\\[\nf_{\\min}=18+20\\sqrt7 .\n\\]\n\nThus \\(m=18,\\; n=20,\\; p=7\\) and  \n\n\\[\nm+n+p = 18+20+7 = 45 .\n\\]\n\n\\[\n\\boxed{45}\n\\]
      \n
      \n
      \n

      Results

      \n

      Correct Answer: 60

      \n

      Extracted Answer: 45

      \n

      Score: 0.0

      " + ], + "convos": [ + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "First write the two numbers in base\u201110.\n\n\\[\n17_{b}=1\\cdot b+7=b+7,\\qquad \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nUse the Euclidean algorithm:\n\n\\[\n9b+7 = 9(b+7)-56 .\n\\]\n\nHence \n\n\\[\nb+7 \\mid 9b+7 \\iff b+7 \\mid 56 .\n\\]\n\nSo \\(b+7\\) must be a positive divisor of \\(56\\).\n\nSince the base must satisfy \\(b>9\\), we have \\(b+7>16\\). \nThe divisors of \\(56\\) exceeding \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{cases}\nb+7=28 \\ \\Rightarrow\\ b=21,\\\\[2pt]\nb+7=56 \\ \\Rightarrow\\ b=49.\n\\end{cases}\n\\]\n\nBoth bases indeed work:\n\n\\[\n\\frac{97_{21}}{17_{21}}=\\frac{196}{28}=7,\\qquad \n\\frac{97_{49}}{17_{49}}=\\frac{448}{56}=8 .\n\\]\n\nTherefore the required bases are \\(21\\) and \\(49\\), and their sum is \n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nc=\\#\\text{ chocolate},\\qquad v=\\#\\text{ vanilla},\\qquad s=\\#\\text{ strawberry}\n\\]\n\nwith \n\n\\[\nc+v+s =9,\\qquad c>v>s\\ge1 .\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\).\n\nSince \\(c>v>s\\ge 1\\),\n\n\\[\nc\\ge s+2,\\; v\\ge s+1 \\Longrightarrow c+v+s\\ge 3s+3\\le9\\Longrightarrow s\\le2 .\n\\]\n\n- **If \\(s=1\\)**: \\(v\\ge2,\\ c\\ge3\\) and \\(c+v=8\\). \n Possibilities: \\((c,v)=(6,2),(5,3)\\).\n\n- **If \\(s=2\\)**: \\(v\\ge3,\\ c\\ge4\\) and \\(c+v=7\\). \n Possibility: \\((c,v)=(4,3)\\).\n\nThus the only triples are \n\n\\[\n(6,2,1),\\quad (5,3,1),\\quad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple.\n\nFor a given \\((c,v,s)\\) the number of assignments of flavors to the nine distinct players is the multinomial coefficient \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\quad &\\frac{9!}{6!\\,2!\\,1!}= \\binom{9}{6}\\binom{3}{2}=84\\cdot3=252,\\\\[4pt]\n(5,3,1):\\quad &\\frac{9!}{5!\\,3!\\,1!}= \\binom{9}{5}\\binom{4}{3}=126\\cdot4=504,\\\\[4pt]\n(4,3,2):\\quad &\\frac{9!}{4!\\,3!\\,2!}= \\binom{9}{4}\\binom{5}{3}=126\\cdot10=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\nN \\bmod 1000 = 2016 \\bmod 1000 = 16.\n\\]\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid have parallel sides \\(r\\) and \\(s\\) \\((r\\neq s)\\) and equal legs \\(L\\).\n\n---\n\n### 1. Semiperimeter from the incircle\n\nA convex quadrilateral that contains an incircle (a tangential quadrilateral) satisfies \n\n\\[\n\\text{Area}= (\\text{inradius})\\times (\\text{semiperimeter}).\n\\]\n\nThe inradius is \\(3\\) and the area is \\(72\\); therefore \n\n\\[\np=\\frac{\\text{Area}}{r_{\\text{in}}}= \\frac{72}{3}=24,\n\\]\n\nwhere \\(p\\) is the semiperimeter.\n\n---\n\n### 2. Relation among the sides\n\nFor a tangential quadrilateral, Pitot\u2019s theorem gives \n\n\\[\n\\text{(sum of one pair of opposite sides)} = \\text{(sum of the other pair)} .\n\\]\n\nIn an isosceles trapezoid the opposite sides are the two bases and the two equal legs, so \n\n\\[\nr+s = L+L =2L \\quad\\Longrightarrow\\quad L=\\frac{r+s}{2}.\n\\]\n\nThe semiperimeter is \n\n\\[\np = \\frac{r+s+2L}{2}= \\frac{r+s+r+s}{2}=r+s .\n\\]\n\nSince \\(p=24\\), we obtain \n\n\\[\n\\boxed{r+s=24}.\n\\]\n\nConsequently \n\n\\[\nL=\\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### 3. Height of the trapezoid\n\nThe incircle is tangent to both parallel sides, so the distance between those sides (the height \\(h\\)) equals twice the radius:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\]\n\n---\n\n### 4. Using the leg length\n\nPlace the trapezoid with its bases horizontal. The horizontal offset between the ends of the bases is \\(\\dfrac{|r-s|}{2}\\). Hence, by the Pythagorean theorem,\n\n\\[\nL^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+h^{2}.\n\\]\n\nWith \\(L=12\\) and \\(h=6\\),\n\n\\[\n12^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+6^{2}\n\\quad\\Longrightarrow\\quad\n144 = \\frac{(r-s)^{2}}{4}+36\n\\quad\\Longrightarrow\\quad\n(r-s)^{2}=432.\n\\]\n\n---\n\n### 5. Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\n(r+s)^{2} &= r^{2}+2rs+s^{2}=24^{2}=576,\\\\\n(r-s)^{2} &= r^{2}-2rs+s^{2}=432.\n\\end{aligned}\n\\]\n\nAdding these equations eliminates the \\(rs\\) term:\n\n\\[\n(r+s)^{2}+(r-s)^{2}=2(r^{2}+s^{2})\\Longrightarrow\n576+432=2(r^{2}+s^{2}).\n\\]\n\nThus\n\n\\[\nr^{2}+s^{2}= \\frac{1008}{2}=504.\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\nis a circle with centre \n\n\\[\nC=(25,20)\n\\]\n\nand radius \\(r=5\\).\n\nThe second equation \n\n\\[\n|z-4-k| = |z-3i-k|\n\\]\n\nmeans that \\(z\\) is equidistant from the points \n\n\\[\nA=4+k \\qquad\\text{and}\\qquad B=3i+k .\n\\]\n\nThus \\(A=(k+4,0),\\; B=(k,3)\\). \nThe set of points equidistant from \\(A\\) and \\(B\\) is the perpendicular bisector of \\(\\overline{AB}\\).\n\n---\n\n### Equation of the perpendicular bisector\n\nMidpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{k+4+k}{2},\\frac{0+3}{2}\\Bigr)=(k+2,\\frac32).\n\\]\n\nThe vector \\(\\overrightarrow{AB}=(-4,3)\\). \nA direction vector perpendicular to this is \\((3,4)\\) (since \\((-4,3)\\cdot(3,4)=0\\)). \n\nHence the line has slope \\(\\frac43\\) and equation \n\n\\[\ny-\\frac32 = \\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\\[\n\\Longrightarrow\\; y = \\frac43 x - \\frac43 k - \\frac76 .\n\\]\n\nIn standard form:\n\n\\[\n8x-6y = 8k+7 .\n\\]\n\n---\n\n### Tangency condition\n\nThe system will have exactly one solution iff this line is tangent to the circle. \nThe distance from the centre \\(C=(25,20)\\) to the line \\(8x-6y-(8k+7)=0\\) must equal the radius \\(5\\):\n\n\\[\n\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^{2}+(-6)^{2}}}=5.\n\\]\n\nCompute the numerator:\n\n\\[\n8\\cdot25-6\\cdot20-(8k+7)=200-120-8k-7=73-8k.\n\\]\n\nSince \\(\\sqrt{8^{2}+6^{2}}=10\\),\n\n\\[\n\\frac{|73-8k|}{10}=5 \\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nThus \n\n\\[\n73-8k = 50 \\quad\\text{or}\\quad 73-8k = -50.\n\\]\n\n\\[\n\\begin{cases}\n8k = 23 \\;\\;\\Rightarrow\\; k = \\dfrac{23}{8},\\\\[4pt]\n8k = 123\\;\\Rightarrow\\; k = \\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values give a tangent line, so each yields exactly one solution \\(z\\).\n\n---\n\n### Sum of all possible \\(k\\)\n\n\\[\nk_1+k_2 = \\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\): \\(m=73,\\ n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equation \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nis a homogeneous quadratic form. Factor it over the rationals.\n\n\\[\n12x^{2}-xy-6y^{2}= -6\\Bigl(y-\\frac43x\\Bigr)\\Bigl(y+\\frac32x\\Bigr)\n\\]\n\nHence \n\n\\[\n12x^{2}-xy-6y^{2}=0\\iff \n\\Bigl(y-\\frac43x\\Bigr)\\Bigl(y+\\frac32x\\Bigr)=0 .\n\\]\n\nSo any integer solution must satisfy one of the two linear equations \n\n\\[\ny=\\frac{4}{3}x\\quad\\text{or}\\quad y=-\\frac32 x .\n\\]\n\n---\n\n### 1. Solutions of \\(y=\\frac43x\\)\n\nWrite \\(3y=4x\\). \nSince \\(\\gcd(3,4)=1\\), the integer solutions are \n\n\\[\nx=3k,\\qquad y=4k\\qquad(k\\in\\mathbb Z).\n\\]\n\nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 3k\\le100,\\qquad -100\\le4k\\le100\n\\]\n\nThe second inequality is stricter, giving \n\n\\[\n-25\\le k\\le 25 .\n\\]\n\nThus there are \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger points on this line.\n\n---\n\n### 2. Solutions of \\(y=-\\frac32x\\)\n\nWrite \\(2y=-3x\\). \nSince \\(\\gcd(2,3)=1\\), the integer solutions are \n\n\\[\nx=2k,\\qquad y=-3k\\qquad(k\\in\\mathbb Z).\n\\]\n\nBoth coordinates must satisfy \n\n\\[\n-100\\le2k\\le100,\\qquad -100\\le-3k\\le100 .\n\\]\n\nThese give \n\n\\[\n-50\\le k\\le50,\\qquad -\\frac{100}{3}\\le k\\le\\frac{100}{3}\\Longrightarrow -33\\le k\\le33 .\n\\]\n\nHence there are \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger points on this line.\n\n---\n\n### 3. Remove double\u2011counted point\n\nThe two lines intersect only at \\((0,0)\\) (when \\(k=0\\) in both families). \nThus the total number of distinct ordered pairs is \n\n\\[\n51+67-1 = 117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1. Divisibility conditions**\n\nFor an integer to be divisible by \\(22\\) it must be divisible by \\(2\\) and by \\(11\\).\n\n*Divisible by 2* \u2013 the last digit (the units digit) must be even, i.e. one of \\(\\{2,4,6,8\\}\\).\n\n*Divisible by 11* \u2013 for an 8\u2011digit number \\(a_1a_2\\ldots a_8\\) (with \\(a_1\\) the leftmost digit) the rule is \n\n\\[\n(a_8+a_6+a_4+a_2)-(a_7+a_5+a_3+a_1)\\equiv0\\pmod{11}.\n\\]\n\nThus the sum of the digits in the even positions (2,4,6,8) equals the sum of the digits in the odd positions (1,3,5,7) modulo \\(11\\).\n\nThe total sum of the digits \\(1+2+\\dots+8=36\\). \nIf the two sums are equal modulo \\(11\\), then\n\n\\[\n2\\cdot(\\text{odd\u2013position sum})\\equiv36\\equiv3\\pmod{11}\n\\Longrightarrow\\text{odd\u2013position sum}\\equiv7\\pmod{11}.\n\\]\n\nThe possible values are \\(7,18,29,\\ldots\\). \nSince four distinct digits from \\(\\{1,\\dots ,8\\}\\) can sum only between \\(10\\) and \\(26\\), the only feasible value is \n\n\\[\n\\boxed{\\text{odd\u2013position sum}=18}.\n\\]\n\nConsequently the even\u2013position sum is also \\(18\\).\n\n**Step 2. Choose the digits for the odd positions**\n\nWe need all 4\u2011element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them (or by noting the complementary pairs) gives \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \n\n\\[\n\\boxed{M=8}\n\\]\n\nsuch subsets. \nEach of them contains exactly two even digits (because a sum of 18 cannot be obtained with a different parity distribution), so for every subset \\(A\\) (odd\u2011position digits) we have \n\n\\[\ne_A=2,\\qquad E_B=4-e_A=2,\n\\]\n\nwhere \\(E_B\\) is the number of even digits among the complementary set \\(B\\) (the even\u2011position digits).\n\n**Step 3. Arrange the digits**\n\n*Odd positions* (1,3,5,7): the four digits of \\(A\\) can be placed in \\(4! = 24\\) ways.\n\n*Even positions* (2,4,6,8): the four digits of \\(B\\) must be placed so that the digit in position\u202f8 (the units digit) is even. \nSince \\(B\\) contains exactly \\(E_B=2\\) even digits, we have \n\n\\[\n\\text{choices for the units digit}=2,\n\\qquad\n\\text{ways to arrange the remaining three digits}=3! = 6.\n\\]\n\nThus the number of admissible placements for \\(B\\) is \n\n\\[\nf(B)=2\\cdot 6=12.\n\\]\n\n**Step 4. Count all numbers**\n\nFor each of the \\(M=8\\) valid subsets \\(A\\),\n\n\\[\n\\text{numbers contributed}=24\\times12=288.\n\\]\n\nHence \n\n\\[\nN=8\\times288=2304.\n\\]\n\n**Step 5. Compute the required difference**\n\n\\[\nN-2025=2304-2025=279.\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The original parabola is \n\n\\[\ny=x^{2}-4 .\n\\]\n\n---\n\n### 1. Equation of the rotated parabola \n\nRotate the plane \\(60^{\\circ}\\) counter\u2011clockwise about the origin.\nIf \\((X,Y)\\) is a point of the rotated parabola, then rotating it back\n\\(60^{\\circ}\\) clockwise gives a point \\((x',y')\\) on the original parabola.\n\n\\[\n\\begin{pmatrix}x'\\\\y'\\end{pmatrix}\n=\n\\begin{pmatrix}\\cos60^\\circ&\\sin60^\\circ\\\\\n-\\sin60^\\circ&\\cos60^\\circ\\end{pmatrix}\n\\begin{pmatrix}X\\\\Y\\end{pmatrix}\n=\n\\begin{pmatrix}\\frac12X+\\frac{\\sqrt3}{2}Y\\\\[2pt]\n-\\frac{\\sqrt3}{2}X+\\frac12Y\\end{pmatrix}.\n\\]\n\nThus \n\n\\[\ny' = x'^2-4\\Longrightarrow \n\\frac{-\\sqrt3X+Y}{2} =\\Bigl(\\frac{X+\\sqrt3Y}{2}\\Bigr)^{\\!2}-4.\n\\]\n\nMultiplying by \\(2\\) and simplifying gives the equation of the rotated\nparabola:\n\n\\[\n(x+\\sqrt3\\,y)^{2}+2\\sqrt3\\,x-2y-16=0. \\tag{1}\n\\]\n\n---\n\n### 2. Intersection with the original parabola \n\nSubstituting \\(y=x^{2}-4\\) from the original parabola into (1) yields\n\n\\[\n\\bigl(x+\\sqrt3(x^{2}-4)\\bigr)^{2}+2\\sqrt3\\,x-2(x^{2}-4)-16=0,\n\\]\n\nwhich simplifies to\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0. \\tag{2}\n\\]\n\n---\n\n### 3. Factoring the quartic \n\nLook for a factorisation of the form \n\\((ax^{2}+b\\sqrt3\\,x+c)(dx^{2}+e\\sqrt3\\,x+f)\\).\nMatching coefficients gives the system \n\n\\[\n\\begin{cases}\nad=3\\\\\nae+bd=2\\\\\naf+3be+cd=-25\\\\\nbf+ce=-6\\\\\ncf=40\n\\end{cases}\n\\]\n\nwhich is solved by \n\n\\[\na=1,\\;b=1,\\;c=-4,\\qquad d=3,\\;e=-1,\\;f=-10 .\n\\]\n\nHence\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40\n =(x^{2}+\\sqrt3\\,x-4)(3x^{2}-\\sqrt3\\,x-10). \\tag{3}\n\\]\n\n---\n\n### 4. Solving for the intersection points \n\nFrom (3) we obtain four possible \\(x\\)-coordinates.\n\n1. \\(x^{2}+\\sqrt3\\,x-4=0\\)\n\n\\[\nx=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\n2. \\(3x^{2}-\\sqrt3\\,x-10=0\\)\n\n\\[\nx=\\frac{\\sqrt3\\pm\\sqrt{123}}{6}.\n\\]\n\nFor each \\(x\\) we compute \\(y=x^{2}-4\\).\n\n| \\(x\\) | sign of \\(x\\) | \\(y=x^{2}-4\\) | quadrant |\n|---|---|---|---|\n| \\(\\displaystyle\\frac{-\\sqrt3+\\sqrt{19}}{2}\\) | \\(>0\\) | \\(\\displaystyle\\frac{3-\\sqrt{57}}{2}<0\\) | **IV** |\n| \\(\\displaystyle\\frac{-\\sqrt3-\\sqrt{19}}{2}\\) | \\(<0\\) | \\(>0\\) | II |\n| \\(\\displaystyle\\frac{\\sqrt3+\\sqrt{123}}{6}\\) | \\(>0\\) | \\(>0\\) | I |\n| \\(\\displaystyle\\frac{\\sqrt3-\\sqrt{123}}{6}\\) | \\(<0\\) | \\(<0\\) | III |\n\nOnly the first solution lies in the fourth quadrant, as required.\n\n---\n\n### 5. The required \\(y\\)-coordinate \n\nFor \n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}{2},\n\\]\n\\[\ny=x^{2}-4\n =\\left(\\frac{-\\sqrt3+\\sqrt{19}}{2}\\right)^{2}-4\n =\\frac{19+3-2\\sqrt{57}}{4}-4\n =\\frac{22-2\\sqrt{57}}{4}-\\frac{16}{4}\n =\\frac{3-\\sqrt{57}}{2}.\n\\]\n\nThus \n\n\\[\ny=\\frac{a-\\sqrt{b}}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\nand \\(\\gcd(a,c)=1\\).\n\nFinally \n\n\\[\na+b+c=3+57+2=62.\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n\\vec{AB}= \\mathbf b ,\\qquad \\vec{AC}= \\mathbf c ,\\qquad \n|\\mathbf b| =28,\\; |\\mathbf c| =91 .\n\\]\n\nWrite every point on the sides as a linear combination of \\(\\mathbf b,\\mathbf c\\).\n\n\\[\n\\begin{aligned}\nD&=\\frac{4}{28}\\mathbf b =\\frac17\\mathbf b ,&\nE&=\\frac{20}{28}\\mathbf b =\\frac57\\mathbf b ,\\\\[2mm]\nF&=\\frac{13}{91}\\mathbf c ,&\nG&=\\frac{65}{91}\\mathbf c .\n\\end{aligned}\n\\]\n\nThe reflections about a point are central symmetries, thus \n\n\\[\nM=2F-D=-\\frac17\\mathbf b+\\frac{26}{91}\\mathbf c ,\\qquad\nN=2E-G=\\frac{10}{7}\\mathbf b-\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 1. Area of \\(\\triangle ABC\\)\n\nThe quadrilateral \\(DEGF\\) can be split into \\(\\triangle DE G\\) and \\(\\triangle DGF\\).\n\nFor any three points \\(P=\\alpha\\mathbf b+\\beta\\mathbf c\\),\n\\(Q=\\gamma\\mathbf b+\\delta\\mathbf c\\) we have \n\n\\[\n\\bigl[(Q-P)\\times(R-P)\\bigr]\n =(\\gamma-\\alpha)(\\zeta-\\beta)-(\\delta-\\beta)(\\xi-\\alpha)\\;\\bigl(\\mathbf b\\times\\mathbf c\\bigr),\n\\]\n\nso the area of a triangle equals the absolute value of that determinant\ntimes \\(\\dfrac12|\\mathbf b\\times\\mathbf c|\\).\n\n*Triangle \\(DEG\\)* \n\n\\[\n\\det\\!\\begin{pmatrix}\n\\frac57-\\frac17 & 0\\\\[2mm]\n0-\\frac17&\\frac{65}{91}\n\\end{pmatrix}\n =\\frac{20}{49}.\n\\]\n\nThus \\(\\displaystyle\n\\text{Area}(DEG)=\\frac{20}{49}\\cdot\\frac12|\\mathbf b\\times\\mathbf c|.\n\\)\n\n*Triangle \\(DGF\\)* \n\n\\[\n\\det\\!\\begin{pmatrix}\n0-\\frac17&\\frac{65}{91}\\\\[2mm]\n0-\\frac17&\\frac{13}{91}\n\\end{pmatrix}\n =\\frac{4}{49},\n\\qquad\n\\text{Area}(DGF)=\\frac{4}{49}\\cdot\\frac12|\\mathbf b\\times\\mathbf c|.\n\\]\n\nHence \n\n\\[\n\\text{Area}(DEGF)=\\Bigl(\\frac{20}{49}+\\frac{4}{49}\\Bigr)\n \\frac12|\\mathbf b\\times\\mathbf c|\n =\\frac{24}{49}\\,\\text{Area}(\\triangle ABC).\n\\]\n\nGiven \\(\\text{Area}(DEGF)=288\\),\n\n\\[\n\\frac{24}{49}\\,\\text{Area}(\\triangle ABC)=288\n\\Longrightarrow\n\\text{Area}(\\triangle ABC)=288\\cdot\\frac{49}{24}=12\\cdot49=588.\n\\]\n\n--------------------------------------------------------------------\n### 2. Area of the heptagon \\(AFNBCEM\\)\n\nPlace the points in the \\((\\alpha,\\beta)\\)\u2013plane where \\((\\alpha,\\beta)\\) are the\ncoefficients of \\(\\mathbf b,\\mathbf c\\):\n\n\\[\n\\begin{array}{c|c}\n\\text{Vertex}&(\\alpha,\\beta)\\\\\\hline\nA&(0,0)\\\\\nF&(0,\\frac{13}{91})\\\\\nN&(\\frac{10}{7},-\\frac{65}{91})\\\\\nB&(1,0)\\\\\nC&(0,1)\\\\\nE&(\\frac57,0)\\\\\nM&\\bigl(-\\frac17,\\frac{26}{91}\\bigr)\n\\end{array}\n\\]\n\nApplying the shoelace formula to these seven points gives\n\n\\[\n\\begin{aligned}\n\\sum x_i y_{i+1}-y_i x_{i+1}\n&=1,\\\\[2mm]\n\\text{Area}_{\\text{coeff}}&=\\frac12\\cdot1=\\frac12 .\n\\end{aligned}\n\\]\n\nIn the original plane a figure\u2019s area is multiplied by\n\\(|\\mathbf b\\times\\mathbf c|=2\\,\\text{Area}(\\triangle ABC)\\).\nThus\n\n\\[\n\\text{Area}(AFNBCEM)=|\\mathbf b\\times\\mathbf c|\\,\n\\frac12\n =\\text{Area}(\\triangle ABC)=588.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The 12 letters are \n\n\\[\nA,B,C,D,E,F,G,H,I,J,K,L .\n\\]\n\nA random grouping into six unordered pairs is performed, each pair is written with its\nletters in alphabetical order, and then the six two\u2011letter \u201cwords\u2019\u2019 are listed\nalphabetically. \n\nLet the word that appears last (the lexicographically greatest word) be called the **max word**.\nThe max word is determined by the *first* letters of the six pairs:\nits first letter is the largest among the six first letters, and if several pairs have that\nfirst letter, the one with the larger second letter wins.\n\n--------------------------------------------------------------------\n### 1. Total number of possible pairings\n\\[\n\\#\\text{pairings}= \\frac{12!}{2!^{6}\\,6!}=10395 .\n\\]\n\n--------------------------------------------------------------------\n### 2. When does the max word contain \\(G\\)?\n\nTwo mutually exclusive possibilities:\n\n* **(A) \\(G\\) is the first letter of its pair.** \n Then the pair is \\((G,X)\\) with \\(X\\in\\{H,I,J,K,L\\}\\).\n For \\((G,X)\\) to be the max word, no other pair may have a first\n letter larger than \\(G\\). \n Hence each of the other four letters \\(\\{H,I,J,K,L\\}\\setminus\\{X\\}\\) must be paired\n with a letter \\(\\le F\\) (otherwise its first letter would exceed \\(G\\)).\n The remaining letters are \n\n * 4 \u201chigh\u2019\u2019 letters \\(\\{H,I,J,K,L\\}\\setminus\\{X\\}\\);\n * 6 \u201clow\u2019\u2019 letters \\(\\{A,B,C,D,E,F\\}\\).\n\n Choose which four low letters are matched with the four high letters\n and then match them (an injection). \n The number of ways is \n\n \\[\n {}_{6}P_{4}=6\\cdot5\\cdot4\\cdot3=360 .\n \\]\n\n The two low letters left over are forced to pair with each other.\n Thus for a fixed \\(X\\) there are \\(360\\) pairings, and there are\n \\(5\\) possible choices for \\(X\\):\n\n \\[\n N_A=5\\cdot360=1800 .\n \\]\n\n* **(B) \\(G\\) is the second letter of its pair.** \n Then the pair is \\((X,G)\\) with \\(XX\\) (there would be more \u201chigh\u2019\u2019 letters than \u201clow\u2019\u2019 ones). \n The only possible value is \\(X=F\\).\n\n Pair \\(G\\) with \\(F\\). The five letters \\(\\{H,I,J,K,L\\}\\) must each be paired\n with a distinct letter from \\(\\{A,B,C,D,E\\}\\). There are \n\n \\[\n 5! =120\n \\]\n\n ways to do this, and no letters remain.\n\n Hence \n\n \\[\n N_B =120 .\n \\]\n\n--------------------------------------------------------------------\n### 3. Favourable pairings\n\\[\nN_{\\text{fav}}=N_A+N_B=1800+120=1920 .\n\\]\n\n--------------------------------------------------------------------\n### 4. Desired probability\n\\[\nP=\\frac{N_{\\text{fav}}}{\\#\\text{pairings}}\n =\\frac{1920}{10395}\n =\\frac{128}{693}\\qquad(\\gcd(128,693)=1).\n\\]\n\nThus \\(m=128,\\;n=693\\) and \n\n\\[\nm+n=128+693=821 .\n\\]\n\n\\[\n\\boxed{821}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the line be the \\(x\\)-axis and put \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(c,0),\\qquad D=(d,0),\\qquad E=(e,0),\\qquad F=(f,0)\n\\]\n\nwith the points in the order \\(A\\!<\\!B\\!<\\!C\\!<\\!D\\!<\\!E\\!<\\!F\\).\n\n---\n\n### 1. Locate the collinear points\n\n\\[\n\\begin{aligned}\nAC&=26 \\Longrightarrow c-0 = 26 \\; \\Rightarrow\\; c=26,\\\\[2pt]\nCE&=31 \\Longrightarrow e-c =31 \\; \\Rightarrow\\; e=26+31=57,\\\\[2pt]\nAF&=73 \\Longrightarrow f=73 .\n\\end{aligned}\n\\]\n\nFrom \\(DF=33\\) we get \n\n\\[\nf-d =33 \\Longrightarrow d = f-33 = 73-33 =40 .\n\\]\n\nFrom \\(BD=22\\),\n\n\\[\nd-b =22 \\Longrightarrow b = d-22 = 40-22 =18 .\n\\]\n\nThus \n\n\\[\nA=(0,0),\\; B=(18,0),\\; C=(26,0),\\; D=(40,0),\\; E=(57,0),\\; F=(73,0).\n\\]\n\nAll distances given in the statement are satisfied.\n\n---\n\n### 2. Position of \\(G\\)\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\). \nThe distances to \\(C\\) and \\(D\\) give\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2 = 40^2 =1600,\\\\[2pt]\n(x-40)^2+y^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtracting the equations:\n\n\\[\n(x-26)^2-(x-40)^2 = 700.\n\\]\n\nExpanding,\n\n\\[\n(-52x+26^2)+(80x-40^2)=700\\;\\Longrightarrow\\;28x-924=700,\n\\]\n\nso \n\n\\[\n28x=1624\\quad\\Longrightarrow\\quad x=58 .\n\\]\n\nPlug \\(x=58\\) into \\((x-26)^2+y^2=1600\\):\n\n\\[\n(58-26)^2+y^2 = 32^2 + y^2 = 1600\\;\\Longrightarrow\\; y^2 = 1600-1024 = 576,\n\\]\n\nhence \\(|y|=24\\). \nTake \\(G=(58,24)\\) (the other choice \\((58,-24)\\) gives the same area).\n\n---\n\n### 3. Area of \\(\\triangle BGE\\)\n\nPoints:\n\n\\[\nB=(18,0),\\qquad E=(57,0),\\qquad G=(58,24).\n\\]\n\nThe base \\(BE\\) lies on the \\(x\\)-axis, so its length is \n\n\\[\nBE = 57-18 = 39.\n\\]\n\nThe altitude from \\(G\\) to the line \\(BE\\) is simply \\(|y| = 24\\).\n\nThus \n\n\\[\n\\text{Area} = \\frac12 \\times (\\text{base}) \\times (\\text{height})\n = \\frac12 \\times 39 \\times 24\n = 39 \\times 12\n = 468 .\n\\]\n\n(Equivalently, the shoelace formula gives \\(\\frac12|1368-432|=468\\).)\n\n---\n\n\\[\n\\boxed{468}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nd=n+2\\qquad (d\\ge 1,\\; n=d-2).\n\\]\n\nThen \n\n\\[\nn+3=d+1 ,\\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .\n\\]\n\nHence \n\n\\[\n3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).\n\\]\n\nThe condition \\(d\\mid 3(n+3)(n^{2}+9)\\) becomes \n\n\\[\nd \\mid 3(d+1)(d^{2}-4d+13).\n\\]\n\nTake this congruence modulo \\(d\\). \nSince \\(d\\equiv0\\pmod d\\),\n\n\\[\nd+1\\equiv1,\\qquad d^{2}-4d+13\\equiv13\\pmod d,\n\\]\n\nso \n\n\\[\n3(d+1)(d^{2}-4d+13)\\equiv 3\\cdot1\\cdot13=39\\pmod d.\n\\]\n\nThus \\(d\\) must divide \\(39\\):\n\n\\[\nd\\in\\{1,3,13,39\\}.\n\\]\n\nRecall \\(d=n+2\\) and we need \\(n>0\\). \nHence\n\n\\[\nn=d-2\\in\\{-1,1,11,37\\}.\n\\]\n\nDiscard the non\u2011positive value \\(-1\\). The admissible positive integers are \n\n\\[\nn=1,\\;11,\\;37 .\n\\]\n\nCheck:\n\n* \\(n=1\\): \\(n+2=3\\) and \\(3(1+3)(1^{2}+9)=120\\) is divisible by \\(3\\).\n* \\(n=11\\): \\(n+2=13\\) and \\(3(14)(130)=5460\\) is divisible by \\(13\\).\n* \\(n=37\\): \\(n+2=39\\) and \\(3(40)(1378)=165360\\) is divisible by \\(39\\).\n\nAll satisfy the condition. \n\nThe required sum is \n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For the periodic saw\u2011tooth \n\n\\[\nf(x)=\\begin{cases}\nx-4k,&x\\in[-1+4k,\\,1+4k)\\\\[2pt]\n4k+2-x,&x\\in[1+4k,\\,3+4k)\n\\end{cases}\\qquad(k\\in\\mathbb Z)\n\\]\n\nthe parabola is \n\n\\[\nx = 34y^{2}\\qquad (y\\in[-1,1]).\n\\]\n\nHence an intersection point \\((x,y)\\) must satisfy \n\n\\[\ny=f(x),\\qquad x=34y^{2}.\n\\]\n\n---\n\n### 1. Intersections on an \u201cup\u201d segment \n\nOn an up segment \\(x= y+4k\\). \nSubstituting \\(x=34y^{2}\\) gives \n\n\\[\n34y^{2}=y+4k\\;\\Longrightarrow\\;34y^{2}-y-4k=0 .\n\\]\n\nFor each integer \\(k\\) with an up segment inside \\([0,34]\\) (i.e. \\(k=0,1,\\dots ,8\\))\nthe two roots are \n\n\\[\ny_{k}^{\\pm}=\\frac{1\\pm\\sqrt{1+544k}}{68}.\n\\]\n\nBoth satisfy the interval \\([-1,1]\\) and give \\(x\\in[-1+4k,\\,1+4k)\\);\nhence each \\(k\\) contributes **two** intersection points.\n\nThe sum of the two roots for a fixed \\(k\\) is, by Vieta,\n\n\\[\ny_{k}^{+}+y_{k}^{-}= \\frac{1}{34}.\n\\]\n\nThus the total contribution of all up\u2011segments is \n\n\\[\n\\sum_{k=0}^{8}(y_{k}^{+}+y_{k}^{-})=9\\cdot\\frac1{34}=\\frac9{34}.\n\\]\n\n---\n\n### 2. Intersections on a \u201cdown\u2019\u2019 segment \n\nOn a down segment \\(x=4k+2-y\\). \nUsing \\(x=34y^{2}\\),\n\n\\[\n34y^{2}=4k+2-y\\;\\Longrightarrow\\;34y^{2}+y-(4k+2)=0 .\n\\]\n\nFor each \\(k=0,1,\\dots ,8\\) the roots are \n\n\\[\nz_{k}^{\\pm}= \\frac{-1\\pm\\sqrt{273+544k}}{68}.\n\\]\n\nThe admissible \\(y\\)-values must satisfy \\(-1 -1\\)).* \nUsing the plane equation \\(z=75-x-y\\) the conditions become \n\n\\[\n-1f(r)+1\\) \u2013 greedy stays optimal;\n* if \\(r\\bmod10\\ge5\\) then \\(f(r+25)=f(r)-2\\le f(r)\\) \u2013 using one fewer quarter gives fewer coins.\n\nThus the greedy algorithm fails **exactly** when the greedy remainder \\(r\\) satisfies \n\n\\[\nr\\bmod10\\ge5 \\;\\Longleftrightarrow\\; r\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\n---\n\n**Step 4 \u2013 Dropping more than one quarter never helps**\n\nFor two quarters removed we add \\(50\\) cents to the remainder. \nA similar computation gives \n\n\\[\nf(r+50)=f(r)+5 .\n\\]\n\nThe change in total coin count is \\(-2+5=+3\\); for three quarters removed the change is \\(-3+12=+9\\), etc. \nHence removing two or more quarters can never improve on the greedy solution. \nTherefore the condition found in Step\u202f3 is both necessary and sufficient.\n\n---\n\n**Step 5 \u2013 Counting the successful \\(N\\) (1\u202f\u2264\u202fN\u202f\u2264\u202f1000)** \n\nThe greedy fails for those \\(N\\ge25\\) whose remainder modulo \\(25\\) lies in \n\n\\[\nR=\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\nFor a fixed residue \\(r\\in R\\),\n\n\\[\nN=r+25k\\qquad (k\\ge1,\\; N\\le1000).\n\\]\n\nThe largest possible \\(k\\) is \\(\\bigl\\lfloor\\frac{1000-r}{25}\\bigr\\rfloor =39\\)\n(because \\(1000-r\\) ranges from \\(981\\) to \\(995\\)). \nThus each residue contributes \\(39\\) failing numbers.\n\n\\[\n\\#\\text{failures}=|R|\\times 39 = 10\\times39 = 390 .\n\\]\n\nAll other numbers (including the ten numbers \\(5,6,7,8,9,15,16,17,18,19\\) themselves, which are \\(<25\\) and therefore not failures) are successes.\n\n\\[\n\\#\\text{successes}=1000-390 = 610 .\n\\]\n\n---\n\n\\[\n\\boxed{610}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\na_1a_2\\dots a_{16},\\qquad a_i\\in\\{0,1\\}\n\\]\n\nbe a binary string where \\(a_i=1\\) means the \\(i^{\\text{th}}\\) chair is occupied.\nThe condition *no person sits next to two other people* means that a\n\\(1\\) may not have a \\(1\\) on both sides; equivalently the string contains\nno three consecutive \\(1\\)\u2019s. \nHence we must count the binary strings of length \\(16\\) that\n\n* have exactly eight \\(1\\)\u2019s,\n* contain no substring \\(111\\).\n\n---\n\n### 1. Decompose the occupied chairs into blocks\n\nSince a block of consecutive \\(1\\)\u2019s can have length at most \\(2\\), the eight\n\\(1\\)\u2019s are split into blocks of length \\(1\\) or \\(2\\).\n\nLet \n\n* \\(x\\) = number of blocks of length \\(1\\),\n* \\(y\\) = number of blocks of length \\(2\\),\n* \\(m=x+y\\) = total number of blocks.\n\nThen \n\n\\[\nx+2y=8,\\qquad x+y=m\\Longrightarrow y=8-m,\\;x=2m-8 .\n\\]\n\nThus \\(m\\) can be any integer with \\(\\lceil 8/2\\rceil\\le m\\le 8\\); i.e. \n\n\\[\nm=4,5,6,7,8 .\n\\]\n\nFor a given \\(m\\) the positions of the \\(y=8-m\\) blocks of length \\(2\\)\namong the \\(m\\) blocks can be chosen in \n\n\\[\n\\binom{m}{\\,8-m\\,}\n\\]\n\nways.\n\n---\n\n### 2. Insert the separating zeros\n\nBetween two consecutive blocks there must be at least one \\(0\\).\nWith \\(m\\) blocks there are \\(m-1\\) mandatory zeros.\nThere are \\(16-8=8\\) zeros altogether, so after placing the mandatory ones we\nstill have \n\n\\[\n8-(m-1)=9-m\n\\]\n\nzeros left. \n\nThese remaining zeros may be distributed freely among the \\(m+1\\) gaps\n(the two ends and the \\(m-1\\) interior gaps). By stars\u2011and\u2011bars the number\nof ways is\n\n\\[\n\\binom{(9-m)+(m+1)-1}{(m+1)-1}\n =\\binom{9}{m}.\n\\]\n\n---\n\n### 3. Count all possibilities\n\nFor each admissible \\(m\\),\n\n\\[\n\\text{choices}(m)=\\binom{m}{8-m}\\binom{9}{m}.\n\\]\n\nHence \n\n\\[\n\\begin{aligned}\nN&=\\sum_{m=4}^{8}\\binom{m}{8-m}\\binom{9}{m}\\\\[2mm]\n &=\\binom{4}{4}\\binom{9}{4}\n +\\binom{5}{3}\\binom{9}{5}\n +\\binom{6}{2}\\binom{9}{6}\n +\\binom{7}{1}\\binom{9}{7}\n +\\binom{8}{0}\\binom{9}{8}\\\\[2mm]\n &=1\\cdot126+10\\cdot126+15\\cdot84+7\\cdot36+1\\cdot9\\\\\n &=126+1260+1260+252+9\\\\\n &=2907 .\n\\end{aligned}\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2907\\equiv 907\\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n\\angle A=84^{\\circ},\\qquad \\angle B=60^{\\circ},\\qquad \\angle C=36^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 1. The nine\u2011point circle in complex form \n\nPut the circumcircle of \\(\\triangle ABC\\) as the unit circle and let \n\n\\[\na=1,\\qquad b=e^{i\\beta},\\qquad c=e^{i\\gamma},\n\\]\n\nwhere \n\n\\[\n\\beta =72^{\\circ},\\qquad \\gamma =240^{\\circ}\n\\]\n\nbecause the central arcs are twice the opposite angles:\n\\(\\widehat{BC}=2A=168^{\\circ},\\;\\widehat{CA}=2B=120^{\\circ},\n\\;\\widehat{AB}=2C=72^{\\circ}\\).\n\nThe nine\u2011point centre is\n\n\\[\nN=\\frac{a+b+c}{2},\n\\]\n\nand its radius is \\(\\frac12\\) (since \\(|a|=|b|=|c|=1\\)). \nThe three midpoints are \n\n\\[\nD=\\frac{b+c}{2},\\qquad \nE=\\frac{c+a}{2},\\qquad \nF=\\frac{a+b}{2}.\n\\]\n\nNotice that\n\n\\[\nD-N=-\\frac{a}{2},\\qquad \nE-N=-\\frac{b}{2},\\qquad \nF-N=-\\frac{c}{2} .\n\\tag{1}\n\\]\n\nHence the central angle \\(\\widehat{DE}\\) equals the angle between vectors\n\\(-a\\) and \\(-b\\); it is the same as the angle between \\(a\\) and \\(b\\).\n\n\\[\n\\widehat{DE}= \\angle aOb = 2\\angle ACB = 2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2. The other intersection points \n\nThe nine\u2011point circle is the image of the circumcircle under the similarity\n\n\\[\nX\\longmapsto N-\\frac{X}{2},\n\\tag{3}\n\\]\n\ni.e. the homothety with centre the centroid (factor \\(-\\tfrac12\\)).\nConsequently, if a point \\(Y\\) of the nine\u2011point circle is the image of\n\\(X\\) on the circumcircle, then \n\n\\[\nY = N-\\frac{X}{2}\\qquad\\Longleftrightarrow\\qquad X=2(N-Y).\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n#### (a) Point \\(G\\)\n\n\\(G\\) lies on line \\(BD\\). Since \\(D\\) is the image of \\(A\\) and\n\\(B\\) is the image of the point \\(X\\) with \\(X=b\\), the line \\(BD\\) is the\nimage of the line through \\(A\\) parallel to chord \\(BC\\).\nThus \\(G\\) corresponds to the second intersection of the line through\n\\(A\\;(=a)\\) parallel to \\(BC\\) with the circumcircle.\n\nFor a line through a point \\(e^{i\\alpha}\\) parallel to chord\n\\(e^{i\\beta}e^{i\\gamma}\\) the second intersection is\n\\(e^{i(\\beta+\\gamma-\\alpha)}\\). \nHere \\(\\alpha=0,\\;\\beta=72^{\\circ},\\;\\gamma=240^{\\circ}\\); therefore\n\n\\[\nX_G = e^{i(\\beta+\\gamma)}=e^{i312^{\\circ}} .\n\\]\n\nFrom (3) the point on the nine\u2011point circle is \n\n\\[\nG = N-\\frac{X_G}{2}.\n\\]\n\nHence the vector \\(NG=-\\frac{X_G}{2}\\) has direction \\(312^{\\circ}+180^{\\circ}=132^{\\circ}\\).\n\n--------------------------------------------------------------------\n#### (b) Point \\(H\\)\n\n\\(H\\) lies on line \\(AE\\). This line is parallel to chord \\(CA\\); the\nstarting point on the circumcircle is \\(B\\,(=e^{i72^{\\circ}})\\). Thus\n\n\\[\nX_H = e^{i(0+240^{\\circ}-72^{\\circ})}=e^{i168^{\\circ}} ,\n\\qquad\nH=N-\\frac{X_H}{2},\n\\]\n\nso the direction of \\(NH\\) is \\(168^{\\circ}+180^{\\circ}=348^{\\circ}\\).\n\n--------------------------------------------------------------------\n#### (c) Point \\(J\\)\n\n\\(J\\) lies on line \\(AF\\), which is parallel to chord \\(AB\\); it starts\nfrom \\(C\\,(=e^{i240^{\\circ}})\\). Therefore\n\n\\[\nX_J = e^{i(0+72^{\\circ}-240^{\\circ})}=e^{i192^{\\circ}},\n\\qquad\nJ=N-\\frac{X_J}{2},\n\\]\n\nand the direction of \\(NJ\\) is \\(192^{\\circ}+180^{\\circ}=12^{\\circ}\\).\n\n--------------------------------------------------------------------\n### 3. The required arcs on the nine\u2011point circle \n\nFrom the directions obtained:\n\n\\[\n\\begin{aligned}\n&\\text{Arc }DE = 252^{\\circ}-180^{\\circ}=72^{\\circ},\\\\[2mm]\n&\\text{Arc }FG = 132^{\\circ}-60^{\\circ}=72^{\\circ},\\\\[2mm]\n&\\text{Arc }HJ = (360^{\\circ}-348^{\\circ})+12^{\\circ}=24^{\\circ}.\n\\end{aligned}\n\\]\n\nAll are the minor arcs (each \\(<180^{\\circ}\\)).\n\n--------------------------------------------------------------------\n### 4. Computing the requested expression \n\n\\[\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n=72^{\\circ}+2\\!\\cdot\\!24^{\\circ}+3\\!\\cdot\\!72^{\\circ}\n=72+48+216=336^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a regular 24\u2011gon label the vertices \\(0,1,\\ldots ,23\\) in order.\nIf a segment joins vertex \\(i\\) to vertex \\(j\\) then the chord length depends only on \n\n\\[\nk=\\min \\{\\,|i-j|\\;,\\;24-|i-j|\\,\\},\n\\qquad 1\\le k\\le 12 .\n\\]\n\nThus a configuration in which all 12 segments have the same length corresponds to a\nperfect matching in the graph whose edges are all chords of a fixed step \\(k\\).\n\n---\n\n### 1. Structure of the step\u2011\\(k\\) graph \n\nLet \\(d=\\gcd(24,k)\\). \nThe vertices split into \\(d\\) disjoint cycles, each of length \n\n\\[\nL=\\frac{24}{d}.\n\\]\n\nEvery vertex is incident with exactly the two edges of its cycle. \nA perfect matching can exist only if each cycle has even length, i.e. \\(L\\) must be even.\n\\(L\\) is odd only when \\(d=8\\) (then \\(L=3\\)); this occurs for \\(k=8\\). \nHence the step \\(k=8\\) gives **no** valid configuration.\n\nFor an even cycle of length \\(L\\ge4\\) there are exactly two perfect matchings\n(the two possible \u201calternating\u201d choices). \nIf \\(L=2\\) (the case \\(k=12\\)), the matching is forced and there is only one.\n\nConsequently, for a permissible \\(k\\)\n\n\\[\n\\#\\text{ matchings for step }k=\n\\begin{cases}\n2^{d}, & L>2,\\\\[2pt]\n1, & L=2 .\n\\end{cases}\n\\]\n\n---\n\n### 2. Count for each step \\(k\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nk & d=\\gcd(24,k) & L=24/d & \\#\\text{ matchings}\\\\ \\hline\n1,5,7,11 & 1 & 24 & 2\\\\\n2,10 & 2 & 12 & 2^{2}=4\\\\\n3,9 & 3 & 8 & 2^{3}=8\\\\\n4 & 4 & 6 & 2^{4}=16\\\\\n6 & 6 & 4 & 2^{6}=64\\\\\n12 & 12& 2 & 1\\\\\n8 & 8 & 3 & \\text{none}\n\\end{array}\n\\]\n\nNow sum over all admissible \\(k\\) ( \\(k=1,\\dots ,12\\) except \\(k=8\\) ):\n\n\\[\n\\begin{aligned}\n\\text{Total}&=4\\cdot2\\;+\\;2\\cdot4\\;+\\;2\\cdot8\\;+\\;1\\cdot16\\;+\\;1\\cdot64\\;+\\;1\\cdot1\\\\\n&=8+8+16+16+64+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{113}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n17_{b}=1\\cdot b+7=b+7,\\qquad \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nWrite \\(9b+7\\) in terms of \\(b+7\\):\n\n\\[\n9b+7 = 9(b+7) - 56 .\n\\]\n\nHence the remainder upon division by \\(b+7\\) is \\(-56\\). \nThus \\(b+7\\) must divide \\(56\\):\n\n\\[\nb+7 \\mid 56 .\n\\]\n\nList the positive divisors of \\(56\\):\n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nSince the base must satisfy \\(b>9\\) (so that the digit 9 is allowed), we need \n\n\\[\nb+7>9+7=16 .\n\\]\n\nThe only divisors of \\(56\\) larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7 &= 28 \\;\\Longrightarrow\\; b=21,\\\\[2pt]\nb+7 &= 56 \\;\\Longrightarrow\\; b=49.\n\\end{aligned}\n\\]\n\nBoth bases exceed \\(9\\) and thus are admissible.\n\nThe sum of all such bases is\n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\na_i=A_1A_i\\qquad (i=2,\\dots ,11),\\qquad s_i=A_iA_{i+1}\\qquad (i=2,\\dots ,10).\n\\]\n\nFor each triangle \\(A_iA_1A_{i+1}\\;(2\\le i\\le10)\\)\n\n* \\(\\displaystyle \\text{Area}=1\\),\n* \\(\\displaystyle\\cos\\angle A_iA_1A_{i+1}= \\frac{12}{13}\\).\n\n--------------------------------------------------------------------\n### 1. Product of the two sides from \\(A_1\\)\n\nWith \\(\\theta=\\angle A_iA_1A_{i+1}\\) we have \n\n\\[\n\\sin\\theta=\\sqrt{1-\\cos ^2\\theta}= \\frac{5}{13}.\n\\]\n\nThe area of \\(\\triangle A_iA_1A_{i+1}\\) is \n\n\\[\n\\frac12 a_i a_{i+1}\\sin\\theta =1\n\\Longrightarrow a_i a_{i+1}= \\frac{2}{\\sin\\theta}= \\frac{2}{5/13}= \\frac{26}{5}\\equiv c .\n\\tag{1}\n\\]\n\nHence for all \\(i\\)\n\n\\[\na_i a_{i+1}=c=\\frac{26}{5}.\n\\]\n\n--------------------------------------------------------------------\n### 2. Length of the side \\(A_iA_{i+1}\\)\n\nApply the law of cosines in \\(\\triangle A_iA_1A_{i+1}\\):\n\n\\[\ns_i^2=a_i^{\\,2}+a_{i+1}^{\\,2}-2a_i a_{i+1}\\cos\\theta\n =a_i^{\\,2}+a_{i+1}^{\\,2}-2c\\Bigl(\\frac{12}{13}\\Bigr).\n\\]\n\nBecause \\(2c\\frac{12}{13}= \\frac{624}{65}= \\frac{48}{5}\\),\n\n\\[\ns_i^{\\,2}=a_i^{\\,2}+a_{i+1}^{\\,2}-\\frac{48}{5}. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3. The alternating pattern of the radii\n\nFrom (1) we have \\(a_{i+1}=c/a_i\\). Consequently \n\n\\[\na_{i+2}=c/a_{i+1}=c/(c/a_i)=a_i .\n\\]\n\nThus \n\n\\[\na_{2}=a_{4}=a_{6}=a_{8}=a_{10}\\equiv x, \\qquad \na_{3}=a_{5}=a_{7}=a_{9}=a_{11}\\equiv \\frac{c}{x}.\n\\]\n\nAll sides \\(s_i\\;(i=2,\\dots ,10)\\) are equal, because each uses the\npair \\((x,\\;c/x)\\) in (2). Set \n\n\\[\nS^2=x^{2}+\\Bigl(\\frac{c}{x}\\Bigr)^2-\\frac{48}{5}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 4. Express everything via \\(t=x+\\dfrac{c}{x}\\)\n\nDefine \n\n\\[\nt=x+\\frac{c}{x}=a_2+a_{11}.\n\\]\n\nThen \n\n\\[\nx^{2}+\\Bigl(\\frac{c}{x}\\Bigr)^2=t^{2}-2c .\n\\]\n\nInsert this into (3):\n\n\\[\nS^{2}=t^{2}-2c-\\frac{48}{5}=t^{2}-(2c+\\frac{48}{5}).\n\\]\n\nSince \\(c=\\dfrac{26}{5}\\),\n\n\\[\n2c+\\frac{48}{5}= \\frac{52}{5}+\\frac{48}{5}=20.\n\\]\n\nHence \n\n\\[\nS^{2}=t^{2}-20,\\qquad S=\\sqrt{t^{2}-20}. \\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 5. Use the perimeter\n\nThe perimeter of the 11\u2011gon is \n\n\\[\na_2+a_{11}+ \\sum_{i=2}^{10}s_i = t+9S =20.\n\\]\n\nSubstituting (4):\n\n\\[\nt+9\\sqrt{t^{2}-20}=20.\n\\]\n\nIsolate the radical and square:\n\n\\[\n9\\sqrt{t^{2}-20}=20-t \\quad\\Longrightarrow\\quad \n81(t^{2}-20)=(20-t)^{2}.\n\\]\n\nSimplifying:\n\n\\[\n80t^{2}+40t-2020=0\n\\Longrightarrow 4t^{2}+2t-101=0.\n\\]\n\nSolve for \\(t\\):\n\n\\[\nt=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n =\\frac{-2\\pm 18\\sqrt5}{8}\n =\\frac{-1\\pm 9\\sqrt5}{4}.\n\\]\n\nSince \\(t>0\\), we take the plus sign:\n\n\\[\n\\boxed{t=\\frac{9\\sqrt5-1}{4}}.\n\\]\n\nThus \n\n\\[\nA_1A_2+A_1A_{11}= \\frac{9\\sqrt5-1}{4}\n =\\frac{m\\sqrt n-p}{q},\n\\]\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\n--------------------------------------------------------------------\n### 6. Compute \\(m+n+p+q\\)\n\n\\[\nm+n+p+q = 9+5+1+4 = 19.\n\\]\n\n\\[\n\\boxed{19}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The nine players are distinct. Let \n\n\\[\nc=\\#\\text{chocolate},\\qquad v=\\#\\text{vanilla},\\qquad s=\\#\\text{strawberry}\n\\]\n\nwith \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\)\n\nSince \\(c>v>s\\),\n\n\\[\nc\\ge v+1,\\qquad v\\ge s+1.\n\\]\n\nWrite \\(v=s+d_2\\) and \\(c=v+d_1\\) where \\(d_1,d_2\\ge 1\\). \nThen \n\n\\[\nc+v+s=(s+d_2+d_1)+(s+d_2)+s=3s+2d_2+d_1=9 .\n\\]\n\nBecause \\(s\\ge1\\), we have \\(3s\\le 9\\Rightarrow s=1,2,3\\).\n\n* **\\(s=1\\):** \\(2d_2+d_1=6\\). \n \\(d_2=1\\Rightarrow d_1=4\\) \u2192 \\((c,v,s)=(6,2,1)\\). \n \\(d_2=2\\Rightarrow d_1=2\\) \u2192 \\((c,v,s)=(5,3,1)\\).\n\n* **\\(s=2\\):** \\(2d_2+d_1=3\\). \n \\(d_2=1\\Rightarrow d_1=1\\) \u2192 \\((c,v,s)=(4,3,2)\\).\n\n* **\\(s=3\\):** \\(2d_2+d_1=0\\) \u2013 impossible with \\(d_1,d_2\\ge1\\).\n\nThus the only feasible triples are \n\n\\[\n(6,2,1),\\;(5,3,1),\\;(4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple\n\nFor a given \\((c,v,s)\\) the number of ways to assign the flavors to the 9 distinct players is the multinomial coefficient \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equation \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nis a homogeneous quadratic form. \nFactor it over the integers:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y).\n\\]\n\nIndeed \n\n\\[\n(3x+2y)(4x-3y)=12x^{2}-9xy+8xy-6y^{2}=12x^{2}-xy-6y^{2}.\n\\]\n\nHence a pair \\((x,y)\\) of integers satisfies the equation iff\n\n\\[\n3x+2y=0\\qquad\\text{or}\\qquad 4x-3y=0 .\n\\]\n\n---\n\n### 1. Solutions of \\(3x+2y=0\\)\n\n\\[\n3x+2y=0 \\;\\Longrightarrow\\; y=-\\frac{3}{2}x .\n\\]\n\nFor \\(y\\) to be an integer, \\(x\\) must be even: write \\(x=2k\\). Then \n\n\\[\n(x,y)=(2k,-3k),\\qquad k\\in\\mathbb Z .\n\\]\n\nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 2k\\le 100\\;\\Longrightarrow\\;-50\\le k\\le 50,\\\\\n-100\\le -3k\\le 100\\;\\Longrightarrow\\;-33\\le k\\le 33.\n\\]\n\nThus \\(k=-33,-32,\\dots ,33\\); there are \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger solutions on this line.\n\n---\n\n### 2. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x-3y=0 \\;\\Longrightarrow\\; y=\\frac{4}{3}x .\n\\]\n\nFor \\(y\\) to be an integer, \\(x\\) must be a multiple of \\(3\\): put \\(x=3t\\). Then \n\n\\[\n(x,y)=(3t,4t),\\qquad t\\in\\mathbb Z .\n\\]\n\nAgain impose the bounds:\n\n\\[\n-100\\le 3t\\le 100\\;\\Longrightarrow\\;-33\\le t\\le 33,\\\\\n-100\\le 4t\\le 100\\;\\Longrightarrow\\;-25\\le t\\le 25.\n\\]\n\nThus \\(t=-25,-24,\\dots ,25\\); the number of solutions here is \n\n\\[\n25-(-25)+1 = 51.\n\\]\n\n---\n\n### 3. Intersection of the two lines\n\nBoth equations hold simultaneously only at the origin:\n\n\\[\n3x+2y=0,\\;4x-3y=0 \\Longrightarrow (x,y)=(0,0).\n\\]\n\nThis point has been counted in both previous totals, so we subtract it once.\n\n---\n\n### 4. Total number of ordered pairs\n\n\\[\n\\#\\text{solutions}=67+51-1=117.\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid be \\(ABCD\\) with \\(AB\\parallel CD\\) and \n\n\\[\nAB=s ,\\qquad CD=r ,\\qquad AD=BC=L \\;( \\text{isosceles}).\n\\]\n\nThe incircle has radius \\(R=3\\) and the area is \\(72\\).\n\n---\n\n### 1. Semiperimeter\n\nFor any tangential quadrilateral (one with an incircle)\n\n\\[\n\\text{Area}=R\\cdot(\\text{semiperimeter}).\n\\]\n\nHence \n\n\\[\n72=3\\cdot s_{\\!p}\\quad\\Longrightarrow\\quad s_{\\!p}=24 .\n\\]\n\nThus the perimeter is \n\n\\[\n2s_{\\!p}=48\\quad\\Longrightarrow\\quad r+s+2L=48. \\tag{1}\n\\]\n\n---\n\n### 2. Tangential condition\n\nIn a tangential quadrilateral the sums of opposite sides are equal:\n\n\\[\nAB+CD = AD+BC\\quad\\Longrightarrow\\quad r+s = 2L. \\tag{2}\n\\]\n\nFrom (1) and (2),\n\n\\[\n2(r+s)=48 \\;\\Longrightarrow\\; r+s=24,\\qquad\n2L=r+s=24\\;\\Longrightarrow\\; L=12.\n\\]\n\n---\n\n### 3. Height\n\nThe incircle touches both parallel sides, so the distance between the bases equals twice the radius:\n\n\\[\nh=2R=6.\n\\]\n\n(Alternatively, \\(\\displaystyle 72=\\tfrac12(r+s)h\\) with \\(r+s=24\\) also gives \\(h=6\\).)\n\n---\n\n### 4. Relating the bases\n\nPlace the trapezoid with its symmetry axis on the \\(y\\)-axis; the bases are horizontal.\nThe horizontal half\u2011difference of the bases is \\(\\dfrac{s-r}{2}\\).\nHence the leg length satisfies\n\n\\[\nL^{2}= \\left(\\frac{s-r}{2}\\right)^{2}+h^{2}.\n\\]\n\nUsing \\(L=12,\\;h=6\\),\n\n\\[\n12^{2}= \\frac{(s-r)^{2}}{4}+6^{2}\n\\quad\\Longrightarrow\\quad\n\\frac{(s-r)^{2}}{4}=108\n\\quad\\Longrightarrow\\quad\ns-r=12\\sqrt3. \\tag{3}\n\\]\n\n---\n\n### 5. Solving for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\ns-r=12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\ns&=\\frac{24+12\\sqrt3}{2}=12+6\\sqrt3,\\\\\nr&=\\frac{24-12\\sqrt3}{2}=12-6\\sqrt3.\n\\end{aligned}\n\\]\n\n---\n\n### 6. Required sum of squares\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}\n&=(12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2}\\\\\n&= \\bigl(144-144\\sqrt3+108\\bigr)+\\bigl(144+144\\sqrt3+108\\bigr)\\\\\n&= 504.\n\\end{aligned}\n\\]\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n* \\(A=(0,0)\\), \n* \\(B=(u,0)\\) on the \\(x\\)-axis, \n* \\(C=(0,v)\\) on the \\(y\\)-axis. \n\nSince \\(\\angle A=90^{\\circ}\\), \\(BC=38\\) gives \n\n\\[\nu^{2}+v^{2}=38^{2}=1444\\tag{1}\n\\]\n\n---\n\n### 1. The equilateral triangle \\(AKL\\)\n\nThe conditions \n\n\\[\nAK=AL=KL=14\n\\]\n\nshow that \\(\\triangle AKL\\) is equilateral. \nLet the direction of \\(\\overrightarrow{AK}\\) form an angle \\(\\theta\\) with the\npositive \\(x\\)-axis. Then\n\n\\[\nK=(14\\cos\\theta,\\;14\\sin\\theta),\\qquad \nL=(14\\cos(\\theta+60^\\circ),\\;14\\sin(\\theta+60^\\circ)).\\tag{2}\n\\]\n\n---\n\n### 2. Using \\(BK=14\\) and \\(CL=14\\)\n\n\\[\nBK^{2}= (u-14\\cos\\theta)^2+(14\\sin\\theta)^2=14^{2}\n\\]\n\n\\[\n\\Longrightarrow\\; u=28\\cos\\theta.\\tag{3}\n\\]\n\nSimilarly \n\n\\[\nCL^{2}= (14\\cos(\\theta+60^\\circ))^{2}+(v-14\\sin(\\theta+60^\\circ))^{2}=14^{2}\n\\]\n\n\\[\n\\Longrightarrow\\; v=28\\sin(\\theta+60^\\circ).\\tag{4}\n\\]\n\n---\n\n### 3. Determining \\(\\theta\\)\n\nInsert (3) and (4) into (1):\n\n\\[\n(28\\cos\\theta)^{2}+(28\\sin(\\theta+60^\\circ))^{2}=1444\n\\]\n\\[\n\\Longrightarrow\\;\\cos^{2}\\theta+\\sin^{2}(\\theta+60^\\circ)=\\frac{361}{196}.\n\\]\n\nUsing \\(\\sin(\\theta+60^\\circ)=\\tfrac12\\sin\\theta+\\tfrac{\\sqrt3}{2}\\cos\\theta\\),\nthe equation reduces to \n\n\\[\n6\\cos^{2}\\theta+2\\sqrt3\\sin\\theta\\cos\\theta= \\frac{312}{49}.\n\\]\n\nSolving gives \\(\\cos\\theta=\\frac{13}{14}\\) (the other root gives the same\ntriangle with the legs interchanged). \n\nHence \n\n\\[\nu=28\\cos\\theta=28\\cdot\\frac{13}{14}=26,\\qquad\nv=28\\sin(\\theta+60^\\circ)=28\\cdot\\frac{4\\sqrt3}{7}=16\\sqrt3 .\n\\]\n\nThus \n\n\\[\nAB=26,\\qquad AC=16\\sqrt3,\\qquad BC=38.\n\\]\n\nFrom (2) we obtain the coordinates of the interior points\n\n\\[\nK=(13,\\;3\\sqrt3),\\qquad L=(2,\\;8\\sqrt3).\n\\]\n\n---\n\n### 4. Area of \\(BKLC\\)\n\nUse the shoelace formula for the polygon \\(B(26,0),K(13,3\\sqrt3),L(2,8\\sqrt3),C(0,16\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\nS_1&=26\\cdot3\\sqrt3+13\\cdot8\\sqrt3+2\\cdot16\\sqrt3+0\\cdot0=214\\sqrt3,\\\\\nS_2&=0\\cdot13+3\\sqrt3\\cdot2+8\\sqrt3\\cdot0+16\\sqrt3\\cdot26=422\\sqrt3.\n\\end{aligned}\n\\]\n\n\\[\n\\text{Area}=\\frac12|S_2-S_1|\n =\\frac12(422-214)\\sqrt3\n =104\\sqrt3 .\n\\]\n\nTherefore the area can be written as \\(n\\sqrt3\\) with \n\n\\[\n\\boxed{n=104}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For an eight\u2011digit number formed by a permutation of \n\n\\[\n\\{1,2,3,4,5,6,7,8\\}\n\\]\n\nlet \n\n\\[\na_1a_2a_3a_4a_5a_6a_7a_8\n\\]\n\nbe its digits (left to right). \nA number is divisible by \\(22\\iff\\) it is divisible by \\(2\\) and by \\(11\\).\n\n---\n\n### 1. Divisibility by 2 \n\nThe last digit \\(a_8\\) must be even, so \\(a_8\\in\\{2,4,6,8\\}\\).\n\n---\n\n### 2. Divisibility by 11 \n\nFor an 8\u2011digit number the rule for 11 is \n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv 0\\pmod{11}.\n\\]\n\nSince the total sum of the digits is \n\n\\[\n1+2+\\cdots+8 = 36,\n\\]\n\nlet \n\n\\[\nS_{\\text{odd}}=a_1+a_3+a_5+a_7,\\qquad \nS_{\\text{even}}=a_2+a_4+a_6+a_8 .\n\\]\n\nThen \\(S_{\\text{odd}}+S_{\\text{even}}=36\\) and the condition gives \n\n\\[\nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nThe only possible values for \\(S_{\\text{odd}}-S_{\\text{even}}\\) are \\(-22,0,22\\); \n\\(-22\\) would give \\(S_{\\text{odd}}=7\\) and \\(22\\) would give \\(S_{\\text{odd}}=29\\), both impossible because a sum of four distinct digits from \\(\\{1,\\dots ,8\\}\\) cannot be smaller than \\(10\\) nor larger than \\(26\\). \nHence\n\n\\[\nS_{\\text{odd}} = S_{\\text{even}} = 18 .\n\\]\n\nThus the four digits in the odd positions must sum to \\(18\\); the same holds for the even positions.\n\n---\n\n### 3. Choosing the four digits for the odd positions \n\nWe need 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\). \nA quick enumeration gives the eight subsets\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\{1,3,6,8\\},\\{1,4,5,8\\},\\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\{2,3,6,7\\},\\{2,4,5,7\\},\\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nEach contains exactly two even digits (the set \\(\\{2,4,6,8\\}\\)) and two odd digits. \nHence every admissible odd\u2011position set has **2 even digits**.\n\nLet a chosen subset be \\(S\\) (the odd\u2011position digits) and its complement \\(S^c\\) (the even\u2011position digits).\n\n---\n\n### 4. Arranging the digits \n\n* The four digits of \\(S\\) can be placed in the odd positions \\((1,3,5,7)\\) in \\(4! = 24\\) ways. \n* The four digits of \\(S^c\\) must fill the even positions \\((2,4,6,8)\\) with the extra requirement that the last digit \\(a_8\\) be even. \n Since \\(S^c\\) contains exactly \\(2\\) even digits, we have \n\n\\[\n\\text{choices for }a_8 = 2,\\qquad\n\\text{arrangements of the remaining three even\u2011position digits}=3! = 6 .\n\\]\n\nThus for each set \\(S\\)\n\n\\[\n\\#\\text{numbers}=4!\\times(2\\times3!) = 24\\times12 = 288.\n\\]\n\n---\n\n### 5. Total number \\(N\\)\n\nThere are \\(8\\) possible subsets \\(S\\); consequently\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 6. Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nC=25+20i,\\qquad r=5 ,\n\\]\n\nso \n\n\\[\n|C-z|=5\n\\]\n\nis the circle with centre \\(C\\) and radius \\(5\\).\n\nThe second condition \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that \\(z\\) is equally distant from the points \n\n\\[\nP_1=4+k\\quad(\\text{on the real axis}), \\qquad \nP_2=k+3i .\n\\]\n\nHence the locus of \\(z\\) is the perpendicular bisector of the segment \\(\\overline{P_1P_2}\\); this is a straight line.\n\n---\n\n### 1. Equation of the line\n\nWrite \\(z=x+yi\\). \n\n\\[\n(x-(4+k))^2+y^2=(x-k)^2+(y-3)^2 .\n\\]\n\nExpanding and simplifying gives \n\n\\[\n-8(x-k)+16=-6y+9,\n\\]\n\n\\[\n-8x+8k+6y+7=0 .\n\\]\n\nThus the line \\(L(k)\\) is \n\n\\[\n-8x+6y+8k+7=0 \\qquad\\text{or}\\qquad 8x-6y=8k+7 .\n\\]\n\nAll such lines have slope \\(\\dfrac{4}{3}\\); they are a family of parallel lines depending on \\(k\\).\n\n---\n\n### 2. Tangency condition\n\nThe system has exactly one solution precisely when the line \\(L(k)\\) is tangent to the circle \\(|z-C|=5\\). \n\nFor a line \\(Ax+By+C=0\\) the distance from a point \\((x_0,y_0)\\) is \n\n\\[\nd=\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nHere \\(A=-8,\\;B=6,\\;C=8k+7\\) and the centre of the circle is \\((25,20)\\). Hence\n\n\\[\nd(k)=\\frac{\\bigl|-8\\cdot25+6\\cdot20+(8k+7)\\bigr|}{\\sqrt{(-8)^2+6^2}}\n =\\frac{|8k-73|}{10}.\n\\]\n\nTangency requires \\(d(k)=r=5\\):\n\n\\[\n\\frac{|8k-73|}{10}=5\\quad\\Longrightarrow\\quad|8k-73|=50 .\n\\]\n\nThus \n\n\\[\n8k-73=50\\quad\\text{or}\\quad8k-73=-50,\n\\]\n\n\\[\nk=\\frac{123}{8},\\qquad k=\\frac{23}{8}.\n\\]\n\nBoth values make the line tangent, giving exactly one intersection point with the circle.\n\n---\n\n### 3. Sum of the possible \\(k\\)\n\n\\[\n\\frac{123}{8}+\\frac{23}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\dfrac{73}{4}\\) as \\(\\dfrac{m}{n}\\) with \\(\\gcd(m,n)=1\\); then \\(m=73,\\;n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the letters be \n\n\\[\nAG)=\\frac{360}{945}\n=\\frac{8}{21}.\n\\]\n\nSince there are 5 possible partners larger than \\(G\\),\n\n\\[\n\\sum_{X>G}\\frac1{11}\\cdot\\frac{8}{21}=5\\cdot\\frac{1}{11}\\cdot\\frac{8}{21}\n=\\frac{40}{231}.\n\\]\n\n*If \\(G\\) is paired with a letter smaller than \\(G\\)* \nthe only possible partner is \\(F\\); for any smaller partner there are fewer\nthan five letters below it, making it impossible for its pair to have the\nlargest smaller element.\n\nWhen \\(G\\) is paired with \\(F\\), the smaller element of the pair is \\(F\\).\nThe other 10 letters are \n\n\\[\n\\{A,B,C,D,E\\}\\ (\\text{low})\\quad\\text{and}\\quad\\{H,I,J,K,L\\}\\ (\\text{high}).\n\\]\n\nAll five high letters must be paired with the five low letters; otherwise a\nhigh letter would become a smaller element. The number of such matchings is\n\\(5!=120\\). Hence\n\n\\[\nP(\\text{largest pair }|\\,G\\!-\\!F)=\\frac{120}{945}=\\frac{8}{63},\n\\]\nand the contribution is \\(\\displaystyle\\frac1{11}\\cdot\\frac{8}{63}\n= \\frac{8}{693}\\).\n\nNo other partner of \\(G\\) can work, so the total probability that the last\nword contains \\(G\\) is\n\n\\[\n\\frac{40}{231}+\\frac{8}{693}\n=\\frac{120}{693}+\\frac{8}{693}\n=\\frac{128}{693}.\n\\]\n\nThe fraction \\(\\frac{128}{693}\\) is already in lowest terms. \nThus \\(m=128,\\ n=693\\) and\n\n\\[\nm+n = 128+693 = 821.\n\\]\n\n\\[\n\\boxed{821}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution**\n\n--------------------------------------------------------------------\n\n### 1. The ratios on the two sides \n\n\\[\nAB=AD+DE+EB=4+16+8=28,\\qquad \nAC=AF+FG+GC=13+52+26=91 .\n\\]\n\n\\[\n\\frac{AD}{AB}=\\frac{4}{28}=\\frac17,\\qquad \n\\frac{AF}{AC}= \\frac{13}{91}= \\frac17 .\n\\]\n\nHence \n\n\\[\n\\frac{AD}{AB}= \\frac{AF}{AC}= \\frac17\\qquad\\Longrightarrow\\qquad \nDF\\parallel BC .\n\\]\n\nSimilarly \n\n\\[\n\\frac{AE}{AB}= \\frac{20}{28}= \\frac57,\\qquad \n\\frac{AG}{AC}= \\frac{65}{91}= \\frac57 ,\n\\]\n\nso \n\n\\[\n\\frac{AE}{AB}= \\frac{AG}{AC}= \\frac57\\qquad\\Longrightarrow\\qquad \nEG\\parallel BC .\n\\]\n\nLet \n\n\\[\np=\\frac17,\\qquad q=\\frac57 .\n\\]\n\n--------------------------------------------------------------------\n\n### 2. Area of \\(\\triangle ABC\\)\n\nBecause \\(DF\\parallel EG\\parallel BC\\), the quadrilateral \\(DEGF\\) is the\nregion of \\(\\triangle ABC\\) between the two lines through \\(D\\) and \\(E\\)\nparallel to \\(BC\\). \n\nTriangles \\(ADF\\) and \\(AEG\\) are similar to \\(\\triangle ABC\\) with similarity\nratios \\(p\\) and \\(q\\) respectively, so\n\n\\[\n[ADF]=p^{2}[ABC],\\qquad[AEG]=q^{2}[ABC].\n\\]\n\nHence \n\n\\[\n[DEGF]=[AEG]-[ADF]=(q^{2}-p^{2})[ABC]\n =\\Bigl(\\frac{5^{2}}{7^{2}}-\\frac{1^{2}}{7^{2}}\\Bigr)[ABC]\n =\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n[ABC]=288\\cdot\\frac{49}{24}=12\\cdot 49 =\\boxed{588}.\n\\]\n\n--------------------------------------------------------------------\n\n### 3. Coordinates\n\nPlace \n\n\\[\nA=(0,0),\\qquad B=(28,0),\\qquad C=(c,\\,42)\n\\]\n\n(the height is \\(42\\) because \\([ABC]=\\frac12\\cdot28\\cdot42=588\\)). \nUsing the ratios \\(p,q\\),\n\n\\[\n\\begin{aligned}\nD &=pB=(4,0), &E&=qB=(20,0),\\\\[2mm]\nF &=pC=\\Bigl(\\frac{c}{7},6\\Bigr), &\nG &=qC=\\Bigl(\\frac{5c}{7},30\\Bigr).\n\\end{aligned}\n\\]\n\nReflections give \n\n\\[\nM=2F-D=\\Bigl(\\frac{2c}{7}-4,\\;12\\Bigr),\\qquad \nN=2E-G=\\Bigl(40-\\frac{5c}{7},\\;-30\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n\n### 4. Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in order:\n\n\\[\n\\begin{array}{c|c}\n\\text{Vertex}&(x,y)\\\\ \\hline\nA&(0,0)\\\\\nF&\\bigl(\\frac{c}{7},6\\bigr)\\\\\nN&\\bigl(40-\\frac{5c}{7},-30\\bigr)\\\\\nB&(28,0)\\\\\nC&(c,42)\\\\\nE&(20,0)\\\\\nM&\\bigl(\\frac{2c}{7}-4,12\\bigr)\n\\end{array}\n\\]\n\nApply the Shoelace formula. The sum \n\n\\[\n\\sum_{i=1}^{7}\\bigl(x_i y_{i+1}-y_i x_{i+1}\\bigr)\n\\] \n\n(with \\(x_8=x_1,\\;y_8=y_1\\)) simplifies dramatically:\n\n\\[\n\\begin{aligned}\n&0\\\\\n&\\;-\\;240\\\\\n&\\;+\\;840\\\\\n&\\;+\\;1176\\\\\n&\\;-\\;840\\\\\n&\\;+\\;240\\\\\n&0\n\\end{aligned}\n\\qquad =\\;1176 .\n\\]\n\nThus\n\n\\[\n[AFNBCEM]=\\frac12\\cdot1176=588 .\n\\]\n\nThe result does **not** depend on the unknown coordinate \\(c\\); the\ncancellation occurs because the vectors \\(DF\\) and \\(EG\\) are parallel to\n\\(BC\\).\n\n--------------------------------------------------------------------\n\n### 5. Answer\n\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nP:\\;y=x^{2}-4\n\\]\n\nand rotate \\(P\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin. \nIf \\((x,y)\\) lies on the rotated curve, then there is a point \\((u,v)\\) on\n\\(P\\) such that \n\n\\[\n\\begin{pmatrix}x\\\\y\\end{pmatrix}=R\\begin{pmatrix}u\\\\v\\end{pmatrix},\n\\qquad \nR=\\begin{pmatrix}\\tfrac12&-\\tfrac{\\sqrt3}{2}\\\\[2pt]\\tfrac{\\sqrt3}{2}&\\tfrac12\\end{pmatrix}.\n\\]\n\nEquivalently, a point \\((x,y)\\) is on both curves iff\n\n\\[\ny=x^{2}-4 \\qquad\\text{and}\\qquad \nR^{T}\\!\\begin{pmatrix}x\\\\y\\end{pmatrix}\n =\\begin{pmatrix}x'\\\\y'\\end{pmatrix}\n\\text{ satisfies }y'=(x')^{2}-4,\n\\]\n\nwhere \n\n\\[\nR^{T}= \\begin{pmatrix}\\tfrac12&\\tfrac{\\sqrt3}{2}\\\\[2pt]-\\tfrac{\\sqrt3}{2}&\\tfrac12\\end{pmatrix},\n\\quad \nx'=\\frac{x}{2}+\\frac{\\sqrt3\\,y}{2},\\qquad\ny'=-\\frac{\\sqrt3\\,x}{2}+\\frac{y}{2}.\n\\]\n\nUsing \\(y=x^{2}-4\\),\n\n\\[\nx'=\\frac{\\sqrt3 x^{2}+x-4\\sqrt3}{2},\\qquad \ny'=\\frac{x^{2}-\\sqrt3 x-4}{2}.\n\\]\n\nThe condition \\(y'=(x')^{2}-4\\) yields \n\n\\[\n\\frac{x^{2}-\\sqrt3 x-4}{2}\n =\\Bigl(\\frac{\\sqrt3 x^{2}+x-4\\sqrt3}{2}\\Bigr)^{2}-4 .\n\\]\n\nMultiplying by \\(2\\) and simplifying gives the quartic\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0.\n\\]\n\nFactor this over \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40\n&=(x^{2}+\\sqrt3\\,x-4)(3x^{2}-\\sqrt3\\,x-10).\n\\end{aligned}\n\\]\n\nHence the possible \\(x\\)-coordinates are the roots of the two quadratics.\n\n\\[\n\\begin{cases}\nx^{2}+\\sqrt3\\,x-4=0 &\\Longrightarrow\n\\displaystyle x=\\frac{-\\sqrt3\\pm\\sqrt{19}}2,\\\\[6pt]\n3x^{2}-\\sqrt3\\,x-10=0 &\\Longrightarrow\n\\displaystyle x=\\frac{\\sqrt3\\pm\\sqrt{123}}6 .\n\\end{cases}\n\\]\n\nWe need a point in the fourth quadrant, i.e. \\(x>0\\) and \\(y=x^{2}-4<0\\).\nOnly \n\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2\\;(>0,\\;<2)\n\\]\n\nsatisfies this. Its \\(y\\)-coordinate is\n\n\\[\n\\begin{aligned}\ny&=x^{2}-4\n =\\frac{(-\\sqrt3+\\sqrt{19})^{2}}{4}-4\n =\\frac{22-2\\sqrt{57}}4-4\\\\\n &=\\frac{11-\\sqrt{57}}2-4\n =\\frac{3-\\sqrt{57}}2 .\n\\end{aligned}\n\\]\n\nThus \n\n\\[\ny=\\frac{a-\\sqrt{b}}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\n\nand \\(a\\) and \\(c\\) are relatively prime. \n\nFinally\n\n\\[\na+b+c=3+57+2=62.\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yzy,\\;z<-1,\\;y>z,\\;x<-1 \\qquad\\text{(impossible since }x+y+z=75)\\\\\n\\text{II}&:\\; x>y,\\;z<-1,\\;y-1 \\\\\n\\text{III}&:\\; x-1,\\;y>z,\\;x<-1 \\\\\n\\text{IV}&:\\; x-1,\\;y-1 .\n\\end{aligned}\n\\]\n\nThus three non\u2011empty convex regions arise from cases II,\u202fIII,\u202fIV.\nCases II and III are unbounded, while case\u202fIV gives a bounded region.\n\n---\n\n### Bounded region (case\u202fIV)\n\nCase\u202fIV is equivalent to \n\n\\[\n-12)\n\\]\n\nThen \n\n\\[\nn+2=m,\\qquad n+3=m+1,\\qquad n^{2}+9=(m-2)^{2}+9=m^{2}-4m+13 .\n\\]\n\nThe condition \n\n\\[\nn+2\\mid 3(n+3)(n^{2}+9)\n\\]\n\nbecomes \n\n\\[\nm \\mid 3(m+1)(m^{2}-4m+13). \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Using the gcd with 3\n\nBecause \n\n\\[\n\\gcd(m,m+1)=1,\n\\]\n\nany prime divisor of \\(m\\) cannot come from the factor \\(m+1\\). \nThe only possible common factor of \\(m\\) with the whole right\u2011hand side of (1) is the factor \\(3\\).\n\nLet \n\n\\[\nd=\\gcd(m,3),\\qquad m=d\\cdot m',\\qquad \\gcd(m',3)=1 .\n\\]\n\nThen (1) is equivalent to \n\n\\[\nd m' \\mid 3(m+1)(m^{2}-4m+13)\n = d\\Bigl(\\frac{3}{d}\\Bigr)(m+1)(m^{2}-4m+13).\n\\]\n\nCancelling \\(d\\) gives \n\n\\[\nm' \\mid \\Bigl(\\frac{3}{d}\\Bigr)(m+1)(m^{2}-4m+13).\\tag{2}\n\\]\n\nSince \\(\\gcd(m',m+1)=1\\) and also \\(\\gcd(m',3)=1\\), the factor \\((m+1)\\) and the possible remaining factor \\(\\frac{3}{d}\\) cannot help the divisibility. Hence (2) reduces to \n\n\\[\nm' \\mid (m^{2}-4m+13). \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 2. Reduce modulo \\(m\\)\n\n\\[\nm^{2}-4m+13 \\equiv 13\\pmod{m},\n\\]\n\nso (3) is equivalent to \n\n\\[\nm' \\mid 13.\n\\]\n\nRecall \\(m' =\\dfrac{m}{\\gcd(m,3)}\\). Therefore\n\n\\[\n\\frac{m}{\\gcd(m,3)}\\mid 13.\n\\]\n\n--------------------------------------------------------------------\n### 3. Solve the two possibilities\n\n**(i) \\(\\gcd(m,3)=1\\) (i.e. \\(3\\nmid m\\)).** \nThen \\(\\displaystyle m\\mid13\\). \nWith \\(m>2\\), the only possibility is \\(m=13\\).\n\n**(ii) \\(\\gcd(m,3)=3\\) (i.e. \\(m=3k\\)).** \nThen \\(\\displaystyle k\\mid13\\). \nThus \\(k=1\\) or \\(k=13\\), giving \\(m=3\\) or \\(m=39\\).\n\n--------------------------------------------------------------------\n### 4. Return to \\(n\\)\n\n\\[\nn=m-2\\; \\Longrightarrow\\; \n\\begin{cases}\nm=3 &\\Rightarrow n=1,\\\\[2pt]\nm=13 &\\Rightarrow n=11,\\\\[2pt]\nm=39 &\\Rightarrow n=37.\n\\end{cases}\n\\]\n\nAll three values satisfy the original divisibility (direct verification shows \\(3\\mid120\\), \\(13\\mid5460\\), \\(39\\mid165360\\)).\n\n--------------------------------------------------------------------\n### 5. Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "First rewrite each factor using the change\u2013of\u2013base formula \n\n\\[\n\\log_a b=\\frac{\\ln b}{\\ln a}.\n\\]\n\n\\[\n\\frac{\\log_k\\bigl(5^{k^{2}-1}\\bigr)}{\\log_{k+1}\\bigl(5^{k^{2}-4}\\bigr)}\n =\\frac{\\dfrac{\\ln5^{\\,k^{2}-1}}{\\ln k}}\n {\\dfrac{\\ln5^{\\,k^{2}-4}}{\\ln (k+1)}}\n =\\frac{(k^{2}-1)\\ln5}{\\ln k}\\cdot\\frac{\\ln(k+1)}{(k^{2}-4)\\ln5}\n =\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nHence\n\n\\[\nP=\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n \\cdot\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\n---\n\n### 1. The logarithmic product\n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n =\\frac{\\ln64}{\\ln4}\n =\\log_{4}64=3.\n\\]\n\n(The terms cancel telescopically.)\n\n---\n\n### 2. The rational product \n\nFactor each term:\n\n\\[\n\\frac{k^{2}-1}{k^{2}-4}\n =\\frac{(k-1)(k+1)}{(k-2)(k+2)}\n =\\frac{k-1}{k-2}\\cdot\\frac{k+1}{k+2}.\n\\]\n\nThus\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n =\\Bigl(\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr)\n \\Bigl(\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr).\n\\]\n\nThe first product telescopes:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n =\\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\cdots\\cdot\\frac{62}{61}\n =\\frac{62}{2}=31.\n\\]\n\nThe second product also telescopes:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n =\\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\cdots\\cdot\\frac{64}{65}\n =\\frac{5}{65}=\\frac{1}{13}.\n\\]\n\nTherefore\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^{2}-1}{k^{2}-4}\n =31\\cdot\\frac{1}{13}=\\frac{31}{13}.\n\\]\n\n---\n\n### 3. Combine the two parts\n\n\\[\nP=\\frac{31}{13}\\times3=\\frac{93}{13}.\n\\]\n\nThe fraction is already in lowest terms (\\(\\gcd(93,13)=1\\)). \nThus \\(m=93\\), \\(n=13\\) and\n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the four unit squares be \n\n\\[\n\\begin{array}{c|c}\n\\text{TL}&\\text{TR}\\\\\\hline\n\\text{BL}&\\text{BR}\n\\end{array}\n\\]\n\nand denote the twelve unit edges as follows \n\n* Horizontal edges: \n\n\\[\n\\begin{aligned}\n&h_{1}= \\text{top of TL},\\qquad h_{2}= \\text{top of TR},\\\\\n&h_{3}= \\text{middle left},\\qquad h_{4}= \\text{middle right},\\\\\n&h_{5}= \\text{bottom of BL},\\qquad h_{6}= \\text{bottom of BR}.\n\\end{aligned}\n\\]\n\n* Vertical edges: \n\n\\[\n\\begin{aligned}\n&v_{1}= \\text{left of TL},\\qquad v_{2}= \\text{left of BL},\\\\\n&v_{3}= \\text{middle top},\\qquad v_{4}= \\text{middle bottom},\\\\\n&v_{5}= \\text{right of TR},\\qquad v_{6}= \\text{right of BR}.\n\\end{aligned}\n\\]\n\nFor each square the sum of the red edges must be \\(2\\).\nWriting a red edge as \\(1\\) and a blue edge as \\(0\\),\n\n\\[\n\\begin{aligned}\n\\text{TL}&:\\;h_{1}+h_{3}+v_{1}+v_{3}=2,\\\\\n\\text{TR}&:\\;h_{2}+h_{4}+v_{3}+v_{5}=2,\\\\\n\\text{BL}&:\\;h_{3}+h_{5}+v_{2}+v_{4}=2,\\\\\n\\text{BR}&:\\;h_{4}+h_{6}+v_{4}+v_{6}=2.\n\\end{aligned}\n\\]\n\nThe four **interior** edges are \\(h_{3},h_{4},v_{3},v_{4}\\); the other eight edges lie on the outer\nboundary. \n\nFix the colours of the interior edges:\n\\[\na=h_{3},\\qquad b=h_{4},\\qquad c=v_{3},\\qquad d=v_{4}\\in\\{0,1\\}.\n\\]\n\nThen for each square we know the required sum of its two boundary edges:\n\n\\[\n\\begin{aligned}\nh_{1}+v_{1}&=2-(a+c),\\\\\nh_{2}+v_{5}&=2-(b+c),\\\\\nh_{5}+v_{2}&=2-(a+d),\\\\\nh_{6}+v_{6}&=2-(b+d).\n\\end{aligned}\n\\]\n\nIf the right\u2011hand side equals \\(2\\) or \\(0\\) the two boundary edges are forced to be\nboth red or both blue \u2013 exactly one choice. \nIf it equals \\(1\\) the two edges must be of opposite colours \u2013 two choices.\n\nHence, for a fixed interior vector \\((a,b,c,d)\\) the number of admissible colourings of the\nboundary edges is \n\n\\[\n2^{\\,k(a,b,c,d)},\n\\]\n\nwhere \\(k\\) is the number of squares whose interior\u2011edge sum equals \\(1\\); i.e.\n\n\\[\nk=(a\\oplus c)+(b\\oplus c)+(a\\oplus d)+(b\\oplus d),\n\\]\n(\\(\\oplus\\) denotes XOR).\n\nTherefore the total number of colourings is \n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}}2^{k}\n= \\sum_{c,d} \\Bigl(\\sum_{a}2^{\\,a\\oplus c + a\\oplus d}\\Bigr)^{2}.\n\\]\n\nFor the four possibilities of \\((c,d)\\) we have\n\n\\[\n\\begin{array}{c|c}\n(c,d) & \\displaystyle\\sum_{a}2^{a\\oplus c + a\\oplus d} \\\\ \\hline\n(0,0) & 1+4 = 5\\\\\n(1,1) & 4+1 = 5\\\\\n(0,1),(1,0) & 2+2 = 4\n\\end{array}\n\\]\n\nThus\n\n\\[\n\\text{total}=2\\cdot5^{2}+2\\cdot4^{2}=2\\cdot25+2\\cdot16=50+32=82.\n\\]\n\nHence there are \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent colourings of the twelve unit edges so that each of the four unit squares has\nexactly two red and two blue sides.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The divisors of \n\n\\[\n2025 = 3^{4}\\cdot5^{2}\n\\]\n\nare obtained by choosing the exponent of \\(3\\) from \\(\\{0,1,2,3,4\\}\\) and the exponent of \\(5\\) from \\(\\{0,1,2\\}\\). \nHence \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\n---\n\n### Condition for the LCM to be \\(2025\\)\n\nFor a non\u2011empty subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=2025 \\iff\n\\begin{cases}\n\\text{some element of }B\\text{ has }3\\text{-exponent }4,\\\\[2pt]\n\\text{some element of }B\\text{ has }5\\text{-exponent }2.\n\\end{cases}\n\\]\n\nDefine \n\n\\[\nS_3=\\{81,\\,405,\\,2025\\} \\quad (\\text{divisors with }3^4) ,\n\\]\n\\[\nS_5=\\{25,\\,75,\\,225,\\,675,\\,2025\\} \\quad (\\text{divisors with }5^2).\n\\]\n\nThus \\(B\\) must intersect both \\(S_3\\) and \\(S_5\\).\n\n---\n\n### Counting favorable subsets\n\nLet \\(U=S_3\\cup S_5\\). \n\\(|S_3|=3,\\;|S_5|=5,\\;|S_3\\cap S_5|=1\\) (the element \\(2025\\)), so\n\n\\[\n|U|=3+5-1=7.\n\\]\n\nThe remaining divisors of \\(2025\\) (those not in \\(U\\)) are \\(15-7=8\\) in number and can be chosen freely.\n\nNumber of subsets of \\(U\\) that contain at least one element of \\(S_3\\) **and** at least one element of \\(S_5\\):\n\n\\[\n\\begin{aligned}\n&2^{7}\\;(\\text{all subsets of }U)\\\\\n&\\quad-2^{4}\\;(\\text{subsets with no }S_3)\\\\\n&\\quad-2^{2}\\;(\\text{subsets with no }S_5)\\\\\n&\\quad+2^{0}\\;(\\text{subsets with neither }S_3\\text{ nor }S_5)\\\\[2pt]\n&=128-16-4+1=109 .\n\\end{aligned}\n\\]\n\nFor each of these \\(109\\) choices, any subset of the other 8 divisors may be added, giving a factor \\(2^{8}=256\\).\n\nHence the number of favorable subsets is \n\n\\[\nN=109\\cdot256=27904.\n\\]\n\n---\n\n### Probability\n\nAll subsets of \\(A\\) (including the empty set) number \n\n\\[\n2^{15}=32768.\n\\]\n\nThus\n\n\\[\nP=\\frac{N}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nDividing numerator and denominator by their greatest common divisor \\(256\\),\n\n\\[\nP=\\frac{27904/256}{32768/256}=\\frac{109}{128}.\n\\]\n\nSo \\(\\displaystyle m=109,\\;n=128\\) and\n\n\\[\nm+n=109+128=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\boxed{45}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the centre of the large circle \\(\\omega _2\\) be the origin \\(O(0,0)\\).\nSince \\(BC\\) is a diameter of \\(\\omega _2\\), take \n\n\\[\nB=(15,0),\\qquad C=(-15,0),\\qquad O=(0,0).\n\\]\n\nBecause \\(\\omega _1\\) (radius \\(6\\)) is internally tangent to \\(\\omega _2\\) at \\(B\\),\nits centre \\(A\\) lies on \\(OB\\) with \n\n\\[\nOA=15-6=9\\quad\\Longrightarrow\\quad A=(9,0).\n\\]\n\nThe condition \\(AD\\perp BC\\) forces \\(AD\\) to be vertical through \\(x=9\\).\nIntersecting this line with \\(\\omega _2\\) (\\(x^{2}+y^{2}=225\\)) gives \n\n\\[\nD=(9,12)\\text{ or }(9,-12).\n\\]\n\nSince later we need \\(D\\) to be nearer the side \\(\\overline{FG}\\) than to \\(\\overline{EH}\\),\n\\(D\\) must lie **below** the rectangle; hence \n\n\\[\nD=(9,-12).\n\\]\n\n---\n\n### The rectangle\n\nA rectangle inscribed in a circle has its centre at the circle\u2019s centre.\nThus the centre of rectangle \\(EFGH\\) is \\(A(9,0)\\).\n\nLet \n\n* \\(w\\) = horizontal distance from \\(A\\) to each vertical side,\n* \\(h\\) = vertical distance from \\(A\\) to each horizontal side.\n\nThen the vertices are \n\n\\[\n\\begin{aligned}\nE&(9+w,\\;h),\\qquad F&(9+w,\\;-h),\\\\\nG&(9-w,\\;-h),\\qquad H&(9-w,\\;h).\n\\end{aligned}\n\\]\n\nBecause the rectangle is inscribed in \\(\\omega _1\\),\n\n\\[\nw^{2}+h^{2}=6^{2}=36. \\tag{1}\n\\]\n\nThe side \\(\\overline{EF}\\) is vertical, so \\(\\overline{EF}\\perp BC\\) (which is horizontal).\n\n- \\(C(-15,0)\\) is left of the rectangle, so its distances to the two vertical sides are \n\n\\[\n\\operatorname{dist}(C,\\overline{GH}) =| -15-(9-w)| =24-w,\n\\]\n\\[\n\\operatorname{dist}(C,\\overline{EF}) =| -15-(9+w)| =24+w,\n\\]\n\nhence \\(C\\) is indeed closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\).\n\n- \\(D(9,-12)\\) is below the rectangle; its distances to the horizontal sides are \n\n\\[\n\\operatorname{dist}(D,\\overline{FG}) =|-12-(-h)| =12-h,\n\\]\n\\[\n\\operatorname{dist}(D,\\overline{EH}) =|-12-h| =12+h,\n\\]\n\nso \\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\) as required.\n\n---\n\n### Equality of the two triangle areas\n\n\\[\n\\triangle DGF:\\quad \n\\text{base}=GF=2w,\\;\n\\text{height}=12-h\\;\\Longrightarrow\\;\n[ DGF]=\\tfrac12(2w)(12-h)=w(12-h).\n\\]\n\n\\[\n\\triangle CHG:\\quad \n\\text{base}=HG=2h,\\;\n\\text{height}=24-w\\;\\Longrightarrow\\;\n[ CHG]=\\tfrac12(2h)(24-w)=h(24-w).\n\\]\n\nGiven \\([DGF]=[CHG]\\),\n\n\\[\nw(12-h)=h(24-w)\\;\\Longrightarrow\\;12w=24h\\;\\Longrightarrow\\; w=2h. \\tag{2}\n\\]\n\n---\n\n### Solving for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1),\n\n\\[\n(2h)^{2}+h^{2}=36\\;\\Longrightarrow\\;5h^{2}=36\\;\\Longrightarrow\\;h^{2}=\\frac{36}{5}.\n\\]\n\nHence \n\n\\[\nh=\\frac{6}{\\sqrt5},\\qquad \nw=2h=\\frac{12}{\\sqrt5}.\n\\]\n\n---\n\n### Area of the rectangle\n\n\\[\n\\text{Area}= (2w)(2h)=4wh\n =4\\!\\left(\\frac{12}{\\sqrt5}\\right)\\!\\left(\\frac{6}{\\sqrt5}\\right)\n =\\frac{288}{5}.\n\\]\n\nThus \\(\\displaystyle \\frac{m}{n}= \\frac{288}{5}\\) with \\(m,n\\) relatively prime.\nHence \n\n\\[\nm+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr),\\qquad 00\\) and \\(x<0)\\).\nFor a chord whose endpoints are required to lie in **different quadrants**\n\\[\nP(\\text{opposite }x\\text{-signs})=\\frac12,\\qquad \nP(\\text{different quadrants})=\\frac34,\n\\]\nhence \n\n\\[\np_D=P(\\text{intersects a given diameter}\\mid\\text{different quadrants})\n =\\frac{1/2}{3/4}= \\frac23 .\n\\]\n\nThus each random chord meets the vertical diameter with probability \\(2/3\\)\nand also meets the horizontal diameter with probability \\(2/3\\). \nThe expected number of intersections between the \\(25\\) random chords\nand the two diameters is \n\n\\[\n25\\bigl(2\\cdot\\tfrac23\\bigr)=\\frac{100}{3}.\n\\]\n\nThe two diameters intersect each other once, so the total expected\nintersection count contributed by the diameters is \n\n\\[\n1+\\frac{100}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 2. Intersections between two random chords \n\nWrite each chord only by the **pair of quadrants** that its two endpoints\noccupy. For a chord whose endpoints are in different quadrants the\nunordered pair of quadrants is uniformly distributed over the six possible\npairs:\n\n* four **adjacent** pairs \\(\\{1,2\\},\\{2,3\\},\\{3,4\\},\\{4,1\\}\\);\n* two **opposite** pairs \\(\\{1,3\\},\\{2,4\\}\\).\n\nThus each random chord is adjacent with probability \\(\\tfrac23\\) and opposite\nwith probability \\(\\tfrac13\\).\n\nConsider two chords and classify them according to the relationship of the\nquadrants they use.\n\n| case | description | intersection probability |\n|------|-------------|---------------------------|\n| AA\u2013same | both are the same adjacent pair (e.g. \\(\\{1,2\\}\\) and \\(\\{1,2\\}\\)) | \\(\\tfrac12\\) |\n| AA\u2013share | adjacent pairs sharing one quadrant (e.g. \\(\\{1,2\\},\\{2,3\\}\\)) | \\(\\tfrac12\\) |\n| AA\u2013disjoint | adjacent pairs using opposite quadrants (e.g. \\(\\{1,2\\},\\{3,4\\}\\)) | \\(0\\) |\n| OO\u2013same | both are the same opposite pair (e.g. \\(\\{1,3\\},\\{1,3\\}\\)) | \\(\\tfrac12\\) |\n| OO\u2013disjoint | opposite pairs \\(\\{1,3\\},\\{2,4\\}\\) | \\(1\\) |\n| AO (any) | one adjacent, one opposite (they always share one quadrant) | \\(\\tfrac12\\) |\n\nAll of the probabilities above are obtained by looking at the possible\norderings of the four points inside their quadrants; each ordering is\nequally likely and the intersecting orderings are exactly half of them\n(when both chords involve a common quadrant) or forced (when the quadrants\nare disjoint).\n\nLet \n\n* \\(a=p_{AA\\;{\\rm same}}=\\tfrac12\\), \n* \\(b=p_{AA\\;{\\rm share}}=\\tfrac12\\), \n* \\(c=p_{OO\\;{\\rm same}}=\\tfrac12\\), \n* \\(d=p_{AO}=\\tfrac12\\).\n\nFrom the probabilities of picking each type we obtain\n\n\\[\n\\begin{aligned}\np_{RR}\n&=P(\\text{intersection of two random chords})\\\\\n&=\\frac{2a+4b+c+8d+1}{18}\n =\\frac{2\\cdot\\frac12+4\\cdot\\frac12+\\frac12+8\\cdot\\frac12+1}{18}\n =\\frac{17}{36}.\n\\end{aligned}\n\\]\n\nHence the expected number of intersections among the \\(25\\) random chords is \n\n\\[\n\\binom{25}{2}\\,p_{RR}=300\\cdot\\frac{17}{36}\n =\\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 3. Total expected intersections\n\n\\[\n\\mathbb E[I]=\n\\underbrace{1}_{\\text{diameters}}+\n\\underbrace{\\frac{100}{3}}_{\\text{diameters\u2013random chords}}+\n\\underbrace{\\frac{425}{3}}_{\\text{random\u2013random}}=\n\\frac{525}{3}+1=176 .\n\\]\n\n--------------------------------------------------------------------\n### 4. Expected number of regions\n\n\\[\n\\mathbb E[R]=28+\\mathbb E[I]=28+176=204.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{204}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1 \u2013 Formulating the optimal problem**\n\nLet \n\n\\[\na=\\text{ number of 1\u2011cent coins},\\qquad \nb=\\text{ number of 10\u2011cent coins},\\qquad \nc=\\text{ number of 25\u2011cent coins}.\n\\]\n\nWe must have \n\n\\[\na+10b+25c=N,\\qquad a,b,c\\ge 0 .\n\\]\n\nThe total number of coins is \n\n\\[\nT=a+b+c\n =(N-10b-25c)+b+c\n =N-9b-24c.\n\\]\n\nThus minimizing the number of coins is the same as **maximising** \n\n\\[\n9b+24c\\qquad\\text{subject to }10b+25c\\le N .\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013 The greedy solution**\n\nThe greedy algorithm first uses as many 25\u2011cent coins as possible,\nthen as many 10\u2011cent coins, and finally 1\u2011cent coins. \nWrite \n\n\\[\nN=25q+r,\\qquad 0\\le r<25 .\n\\]\n\nThe greedy representation is \n\n\\[\nc_{\\text{g}}=q,\\qquad b_{\\text{g}}=\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor,\n\\qquad a_{\\text{g}}=r\\bmod 10,\n\\]\n\nand the greedy number of coins is \n\n\\[\nG(N)=q+\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor+(r\\bmod10).\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013 When can we do better?**\n\nSuppose we try to use **one fewer** 25\u2011cent coin. \nThen we have \\(c=q-1\\) and the remainder becomes \\(r+25\\).\nThe new numbers of 10\u2011 and 1\u2011cent coins are \n\n\\[\nb'=\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor,\\qquad \na'= (r+25)\\bmod 10 .\n\\]\n\nThe total number of coins after dropping one 25\u2011cent coin is \n\n\\[\nA(N)=(q-1)+b'+a'.\n\\]\n\nThe difference is\n\n\\[\nA(N)-G(N)=-1+\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor-\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor\n +(r+25\\bmod10)-(r\\bmod10).\n\\]\n\nWrite \\(r=10k+s\\) with \\(0\\le s\\le 9\\). Then \n\n\\[\n\\Big\\lfloor\\frac{r+25}{10}\\Big\\rfloor-\\Big\\lfloor\\frac{r}{10}\\Big\\rfloor=\n\\begin{cases}\n2,& s\\le 4,\\\\[2pt]\n3,& s\\ge 5,\n\\end{cases}\n\\]\n\nand \\((r+25\\bmod10)-(r\\bmod10)=5\\) in either case. \nHence \n\n\\[\nA(N)-G(N)= -1 + \\Delta +5 = 4+\\Delta,\n\\]\n\nwhere \\(\\Delta=2\\) or \\(3\\). Consequently \n\n\\[\nA(N)-G(N)=\\begin{cases}\n 6,& s\\le 4,\\\\\n 3,& s\\ge 5 .\n\\end{cases}\n\\]\n\nThus **dropping one 25\u2011cent coin reduces the total number of coins\niff the ones\u2011digit \\(s\\) of the remainder \\(r\\) is at least\u202f5**.\n\nThat is, the greedy algorithm fails exactly when \n\n\\[\nr\\equiv 5,6,7,8,9,15,16,17,18,19\\pmod{25},\n\\]\n\ni.e. when the remainder after using the maximal number of 25\u2011cent coins has units digit \\(5,6,7,8,\\) or \\(9\\).\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013 Dropping more than one 25\u2011cent coin never helps**\n\nIf we drop a second 25\u2011cent coin, the units digit of the new remainder\nflips between \\(s\\) and \\(s+5\\pmod{10}\\). Consequently the increase in the\nnumber of 10\u2011cent coins alternates between **2** and **3**.\nA short computation (or the formula \\(\\Delta(k)=24k-9\\sum T_i\\) where each\n\\(T_i\\in\\{2,3\\}\\)) shows that after two or more drops the total number of\ncoins is never smaller than the greedy count; the only possible improvement\nis the single\u2011drop case described above.\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013 Counting the successful values**\n\nThe greedy algorithm succeeds for all \\(N\\) that are **not** of the above\nfailing form, and also for \\(N<25\\) (there are no 25\u2011cent coins to drop).\n\n*There are 10 \u201cbad\u2019\u2019 residues modulo\u202f25*: \n\n\\[\n5,6,7,8,9,15,16,17,18,19.\n\\]\n\nFor each integer \\(q\\ge 1\\) the numbers \\(N=25q+r\\) with such an \\(r\\) are\nfailures. \n\n\\[\n\\text{Number of blocks with }q\\ge 1\\text{: } \\left\\lfloor\\frac{1000}{25}\\right\\rfloor=40.\n\\]\n\nThe last block (\\(q=40\\)) contains only \\(N=1000\\) (remainder\u202f0), which is\nnot a failure. Hence the failing blocks are those with \\(q=1,2,\\dots,39\\).\n\n\\[\n\\text{Failures}=39\\;\\times\\;10 = 390.\n\\]\n\nAll the remaining numbers succeed:\n\n\\[\n\\text{Successes}=1000-390=610.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{610}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For every \\(2\\le i\\le 10\\) the triangle \\(A_iA_1A_{i+1}\\) has \n\n\\[\n[\\,A_iA_1A_{i+1}\\,]=\\frac12 \\,A_1A_i\\cdot A_1A_{i+1}\\sin\\angle A_iA_1A_{i+1}=1\n\\]\n\nand \n\n\\[\n\\cos\\angle A_iA_1A_{i+1}= \\frac{12}{13}.\n\\]\n\n---\n\n### 1. The angle \\(\\angle A_iA_1A_{i+1}\\)\n\n\\[\n\\sin\\theta=\\sqrt{1-\\cos^{2}\\theta}=\\sqrt{1-\\Big(\\frac{12}{13}\\Big)^2}=\n\\frac{5}{13}.\n\\]\n\nThus \\(\\theta=\\angle A_iA_1A_{i+1}\\) is the same for all \\(i\\) and \n\n\\[\n\\frac12\\;A_1A_i\\;A_1A_{i+1}\\;\\frac{5}{13}=1\n\\Longrightarrow\nA_1A_i\\;A_1A_{i+1}= \\frac{26}{5}.\\tag{1}\n\\]\n\nDenote \\(a_i=A_1A_i\\). Then (1) gives \n\n\\[\na_i a_{i+1}=C,\\qquad C:=\\frac{26}{5}, \\qquad 2\\le i\\le10.\n\\]\n\n---\n\n### 2. Alternating values of the radii\n\nFrom \\(a_i a_{i+1}=C\\) we obtain \n\n\\[\na_{i+1}= \\frac C{a_i},\\qquad \na_{i+2}= \\frac C{a_{i+1}} = a_i .\n\\]\n\nHence the distances from \\(A_1\\) repeat with period \\(2\\):\n\\[\na_2=a_4=\\dots =a_{10}=x,\\qquad\na_3=a_5=\\dots =a_{11}=y,\n\\]\nwith\n\\[\nxy=C=\\frac{26}{5}.\\tag{2}\n\\]\n\nThus \\(A_1A_2=x,\\;A_1A_{11}=y\\) and we must find \\(x+y\\).\n\n---\n\n### 3. Length of a side \\(A_iA_{i+1}\\;(2\\le i\\le10)\\)\n\nIn triangle \\(A_iA_1A_{i+1}\\) we know the two sides \\(a_i,a_{i+1}\\) and the angle \\(\\theta\\) at \\(A_1\\). By the law of cosines\n\n\\[\nd^2:=A_iA_{i+1}^{\\,2}=a_i^{2}+a_{i+1}^{2}\n-2a_i a_{i+1}\\cos\\theta.\n\\]\n\nSince \\(\\cos\\theta=\\frac{12}{13}\\) and \\(a_i a_{i+1}=C\\),\n\n\\[\nd^{2}=a_i^{2}+a_{i+1}^{2}\n-\\frac{24}{13}C.\n\\]\n\nUsing (2) we have \\(C=\\frac{26}{5}\\), so \\(\\frac{24}{13}C=\\frac{48}{5}\\).\nNow \\(a_i^{2}+a_{i+1}^{2}=(a_i+a_{i+1})^{2}-2a_i a_{i+1}=\nS^{2}-2C\\) where \\(S:=x+y\\). Hence\n\n\\[\nd^{2}=S^{2}-2C-\\frac{48}{5}\n=S^{2}-\\frac{52}{5}-\\frac{48}{5}\n=S^{2}-20. \\tag{3}\n\\]\n\nAll nine sides \\(A_iA_{i+1}\\;(i=2,\\dots ,10)\\) have the same length \\(d\\).\n\n---\n\n### 4. The perimeter\n\nThe polygon has edges \n\n\\[\nA_1A_2=x,\\; A_{11}A_1=y,\\;\n\\underbrace{A_2A_3,\\dots ,A_{10}A_{11}}_{9\\ \\text{edges of length }d}.\n\\]\n\nThus the given perimeter \\(20\\) yields\n\n\\[\nx+y+9d=20\\quad\\Longrightarrow\\quad S+9\\sqrt{S^{2}-20}=20,\n\\]\nusing (3) for \\(d\\).\n\n---\n\n### 5. Solving for \\(S\\)\n\n\\[\n9\\sqrt{S^{2}-20}=20-S\\quad (S\\le20).\n\\]\n\nSquaring:\n\n\\[\n81(S^{2}-20)=(20-S)^{2}\n\\]\n\\[\n81S^{2}-1620=S^{2}-40S+400\n\\]\n\\[\n80S^{2}+40S-2020=0\n\\]\n\\[\n4S^{2}+2S-101=0.\n\\]\n\nThe quadratic gives\n\n\\[\nS=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n =\\frac{-2\\pm\\sqrt{1620}}{8}\n =\\frac{-2\\pm18\\sqrt5}{8}.\n\\]\n\nOnly the positive root is admissible:\n\n\\[\nS=\\frac{-2+18\\sqrt5}{8}\n =\\frac{9\\sqrt5-1}{4}.\n\\]\n\nThus \n\n\\[\nA_1A_2+A_1A_{11}=x+y=S=\\frac{9\\sqrt5-1}{4}.\n\\]\n\n---\n\n### 6. Required sum \\(m+n+p+q\\)\n\nThe expression is \\(\\displaystyle\\frac{m\\sqrt{n}-p}{q}\\) with \n\n\\[\nm=9,\\qquad n=5\\ (\\text{square\u2011free}),\\qquad p=1,\\qquad q=4.\n\\]\n\nHence \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\boxed{564}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n17_b = 1\\cdot b+7 = b+7 ,\\qquad \n97_b = 9\\cdot b+7 .\n\\]\n\nWe need the integer bases \\(b>9\\) for which \\(b+7\\) divides \\(9b+7\\).\n\n---\n\n### 1. Express the divisibility condition\n\n\\[\n9b+7 \\equiv 0\\pmod{b+7}.\n\\]\n\nWrite \\(b = (b+7)-7\\). Set \\(t=b+7\\) (so \\(t>16\\) because \\(b>9\\)). Then \n\n\\[\n9b+7 = 9(t-7)+7 = 9t-63+7 = 9t-56.\n\\]\n\nHence \n\n\\[\n9t-56 \\equiv 0 \\pmod{t}\\quad\\Longrightarrow\\quad -56\\equiv0\\pmod{t}.\n\\]\n\nThus \n\n\\[\nt \\mid 56\\qquad\\text{or}\\qquad b+7 \\mid 56.\n\\]\n\n---\n\n### 2. Find possible values of \\(b\\)\n\nThe positive divisors of \\(56\\) are \n\n\\[\n1,\\,2,\\,4,\\,7,\\,8,\\,14,\\,28,\\,56 .\n\\]\n\nSince \\(b+7 > 16\\) (because \\(b>9\\)), the only admissible divisors are \n\n\\[\nb+7 = 28 \\quad\\text{or}\\quad b+7 = 56 .\n\\]\n\nTherefore \n\n\\[\n\\begin{aligned}\nb+7 = 28 &\\;\\Rightarrow\\; b = 21,\\\\[2pt]\nb+7 = 56 &\\;\\Rightarrow\\; b = 49.\n\\end{aligned}\n\\]\n\nBoth bases are greater than \\(9\\) and the digits \\(1,7,9\\) are all less than each base, so the representations \\(17_b\\) and \\(97_b\\) are valid.\n\n---\n\n### 3. Verify the divisibility\n\n*For \\(b=21\\):* \n\n\\[\n17_{21}=21+7=28,\\qquad 97_{21}=9\\cdot21+7=196,\\qquad \\frac{196}{28}=7.\n\\]\n\n*For \\(b=49\\):* \n\n\\[\n17_{49}=49+7=56,\\qquad 97_{49}=9\\cdot49+7=448,\\qquad \\frac{448}{56}=8.\n\\]\n\nBoth are indeed integers.\n\n---\n\n### 4. Sum of all such bases\n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1. Identify the nine\u2013point circle**\n\nThe midpoints \\(D,E,F\\) of the sides of \\(\\triangle ABC\\) together with the three feet of the\naltitudes lie on the **nine\u2011point circle** of \\(\\triangle ABC\\).\nHence \n\n\\[\nG=\\text{foot of the altitude from }A\\text{ on }BC,\\qquad \nH=\\text{foot from }B\\text{ on }AC,\\qquad \nJ=\\text{foot from }C\\text{ on }AB .\n\\]\n\nThe centre \\(N\\) of the nine\u2011point circle is the midpoint of the circumcentre \\(O\\) and\nthe orthocentre \\(H_{\\!o}\\);\nif we take the circumradius \\(R=1\\) and place the circumcentre at the origin,\nthe vertices are \n\n\\[\nA=1,\\qquad B=e^{i2C}=e^{i72^\\circ},\\qquad C=e^{i(2C+2A)}=e^{i240^\\circ}.\n\\]\n\nThus \n\n\\[\nN=\\frac{A+B+C}{2},\\qquad R_{9}= \\frac{R}{2}= \\frac12 .\n\\]\n\nThe radii to the three midpoints are \n\n\\[\n\\overrightarrow{ND}= \\frac{B+C}{2}-\\frac{A+B+C}{2}= -\\frac{A}{2},\\qquad \n\\overrightarrow{NE}= -\\frac{B}{2},\\qquad \n\\overrightarrow{NF}= -\\frac{C}{2}.\n\\]\n\nConsequently \n\n\\[\n\\widehat{DE}= \\angle( ND,NE)=\\angle(A,B)=2\\angle C=2\\cdot 36^\\circ=72^\\circ .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2. Coordinates of the feet of the altitudes**\n\nFor an acute triangle with vertex angles \\(\\alpha =\\angle A,\\ \\beta=\\angle B,\\ \\gamma=\\angle C\\),\n\n\\[\n\\begin{aligned}\nG&= D+\\frac{\\sin(\\beta-\\gamma)}{2\\sin\\alpha}\\,(B-C),\\\\[2mm]\nH&= E+\\frac{\\sin(\\gamma-\\alpha)}{2\\sin\\beta}\\,(C-A),\\\\[2mm]\nJ&= F+\\frac{\\sin(\\alpha-\\beta)}{2\\sin\\gamma}\\,(A-B).\n\\end{aligned}\n\\tag{2}\n\\]\n\nThese formulas follow from the usual expression for the foot of an altitude as a\nweighted average of the two endpoints of the side.\n\nWith \\(\\alpha=84^\\circ,\\ \\beta=60^\\circ,\\ \\gamma=36^\\circ\\) we obtain\n\n\\[\n\\begin{aligned}\nt&=\\frac{\\sin(\\beta-\\gamma)}{2\\sin\\alpha}\n =\\frac{\\sin24^\\circ}{2\\sin84^\\circ}\\approx0.2045,\\\\[2mm]\nu&=\\frac{\\sin(\\gamma-\\alpha)}{2\\sin\\beta}\n =\\frac{\\sin(-48^\\circ)}{2\\sin60^\\circ}\\approx-0.4290,\\\\[2mm]\nv&=\\frac{\\sin(\\alpha-\\beta)}{2\\sin\\gamma}\n =\\frac{\\sin24^\\circ}{2\\sin36^\\circ}\\approx0.3460 .\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n\\begin{aligned}\nG&=D+t\\,(B-C),\\\\\nH&=E+u\\,(C-A),\\\\\nJ&=F+v\\,(A-B).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3. Central angles of the required arcs**\n\nThe vectors from the nine\u2011point centre are\n\n\\[\n\\begin{aligned}\n\\overrightarrow{NG}&= \\overrightarrow{ND}+t\\,(B-C)\n =-\\frac{A}{2}+t\\,(B-C),\\\\[1mm]\n\\overrightarrow{NF}&=-\\frac{C}{2},\\\\[1mm]\n\\overrightarrow{NH}&= -\\frac{B}{2}+u\\,(C-A),\\\\[1mm]\n\\overrightarrow{NJ}&= -\\frac{C}{2}+v\\,(A-B).\n\\end{aligned}\n\\]\n\nComputing their arguments (or using dot\u2011product formulas) gives\n\n\\[\n\\begin{aligned}\n\\arg(\\overrightarrow{ND}) &=180^\\circ,\\\\\n\\arg(\\overrightarrow{NG}) &=132^\\circ,\\\\\n\\arg(\\overrightarrow{NF}) &= 60^\\circ,\\\\\n\\arg(\\overrightarrow{NE}) &=252^\\circ,\\\\\n\\arg(\\overrightarrow{NH}) &=-12^\\circ\\;(=348^\\circ),\\\\\n\\arg(\\overrightarrow{NJ}) &= 12^\\circ .\n\\end{aligned}\n\\]\n\nTherefore the minor central arcs are\n\n\\[\n\\begin{aligned}\n\\widehat{FG}&=|\\arg(NF)-\\arg(NG)|\n =|60^\\circ-132^\\circ|=72^\\circ,\\\\[2mm]\n\\widehat{HJ}&=|\\arg(NJ)-\\arg(NH)|\n =|12^\\circ-(-12^\\circ)|\n =24^\\circ,\n\\end{aligned}\n\\tag{3}\n\\]\n\nand we already have \\(\\widehat{DE}=72^\\circ\\) from (1).\n\n--------------------------------------------------------------------\n\n**Step 4. Form the required combination**\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n &= 72^\\circ+2\\cdot24^\\circ+3\\cdot72^\\circ\\\\\n &= 72^\\circ+48^\\circ+216^\\circ\\\\\n &= 336^\\circ .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Number the vertices of the regular \\(24\\)-gon by \n\\(0,1,\\dots ,23\\) (mod \\(24\\)). \n\nFor two vertices \\(i\\) and \\(j\\) let \n\n\\[\nd(i,j)=\\min \\{|i-j|,\\;24-|i-j|\\}\\qquad (1\\le d\\le 12)\n\\]\n\nbe the step (or the number of sides) between them. \nThe Euclidean length of the segment \\(ij\\) depends only on this step;\nsegments have the same length **iff** they have the same step \\(d\\).\n\n--------------------------------------------------------------------\n### 1. The graph of a fixed step\n\nFix a step \\(d\\;(1\\le d\\le 12)\\). \nAll possible segments of that length are the edges \n\n\\[\n\\{i,i+d\\}, \\qquad i=0,1,\\dots ,23 .\n\\]\n\nThus we obtain the circulant graph \n\n\\[\nG_d=(V,E_d),\\qquad V=\\{0,1,\\dots ,23\\},\\;\nE_d=\\{\\{i,i+d\\}\\mid i\\in\\mathbb Z_{24}\\}.\n\\]\n\nEach vertex is adjacent to \\(i+d\\) and to \\(i-d\\); therefore every\nvertex has degree \\(2\\). \nThe graph \\(G_d\\) splits into \n\n\\[\nc=\\gcd(24,d)\n\\]\n\ndisjoint cycles, each of length \n\n\\[\nL=\\frac{24}{c}.\n\\]\n\n--------------------------------------------------------------------\n### 2. Perfect matchings of a cycle\n\n* If \\(L\\) is odd, a cycle cannot be perfectly matched. \n (Odd cycles have an uncovered vertex.)\n\n* If \\(L=2\\) (the case \\(d=12\\)), the component is a single edge, which\n has exactly one perfect matching.\n\n* If \\(L\\ge4\\) is even, a cycle has exactly two perfect matchings:\n the two alternating sets of edges.\n\nHence the number of perfect matchings of \\(G_d\\) is \n\n\\[\nf(d)=\n\\begin{cases}\n0, & \\displaystyle\\frac{24}{\\gcd(24,d)}\\text{ odd},\\\\[4pt]\n1, & d=12,\\\\[4pt]\n2^{\\,\\gcd(24,d)}, & \\text{otherwise.}\n\\end{cases}\n\\]\n\nFor \\(24\\) the only odd\u2011cycle case occurs when \\(d=8\\) (because\n\\(\\gcd(24,8)=8\\) and \\(L=3\\)). \n\n--------------------------------------------------------------------\n### 3. Evaluate \\(f(d)\\) for \\(d=1,\\dots ,12\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nd & \\gcd(24,d) & L=24/\\gcd & f(d)\\\\ \\hline\n1 & 1 & 24 & 2\\\\\n2 & 2 & 12 & 4\\\\\n3 & 3 & 8 & 8\\\\\n4 & 4 & 6 & 16\\\\\n5 & 1 & 24 & 2\\\\\n6 & 6 & 4 & 64\\\\\n7 & 1 & 24 & 2\\\\\n8 & 8 & 3 & 0\\\\\n9 & 3 & 8 & 8\\\\\n10& 2 &12 & 4\\\\\n11& 1 &24 & 2\\\\\n12&12 & 2 & 1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4. Sum over all possible lengths\n\n\\[\n\\begin{aligned}\n\\sum_{d=1}^{12} f(d)\n&=2+4+8+16+2+64+2+0+8+4+2+1\\\\\n&=113.\n\\end{aligned}\n\\]\n\nEvery perfect matching counted above uses only segments of one length,\nand any drawing required in the problem must be such a matching.\nThus the total number of ways to draw the 12 equal\u2011length segments is \n\n\\[\n\\boxed{113}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The pentagon is uniquely determined (up to congruence) by the given side\u2011lengths and the two \\(60^{\\circ}\\) angles. \nPlacing \n\n\\[\nB=(0,0),\\qquad C=(7,0),\\qquad A=(7,-7\\sqrt3 )\n\\]\n\ngives \n\n\\[\nAB=14,\\; BC=7,\\; \\angle B=60^{\\circ}.\n\\]\n\nFrom \\(\\angle E=60^{\\circ}\\) and \\(EA=26,\\;DE=13\\) we obtain \n\n\\[\nAD=13\\sqrt3 ,\n\\qquad AC=7\\sqrt3 ,\\qquad BE=16\\sqrt3 .\n\\]\n\nLet \\(X\\) be any point in the plane and put \n\n\\[\nf(X)=AX+BX+CX+DX+EX .\n\\]\n\nFor any \\(X\\)\n\n\\[\nAX+CX\\ge AC=7\\sqrt3 ,\\qquad BX+EX\\ge BE=16\\sqrt3 .\n\\]\n\nHence \n\n\\[\nf(X)\\ge 7\\sqrt3+16\\sqrt3+DX=23\\sqrt3+DX .\n\\tag{1}\n\\]\n\nThe equality in (1) would require \\(X\\) to lie on both segments \\(AC\\) and \\(BE\\); however those two\nsegments intersect at the point \n\n\\[\nX_0=\\Bigl(7,\\;\\frac{7\\sqrt3}{12}\\Bigr),\n\\]\n\nwhich lies **above** \\(C\\) and therefore not on the segment \\(AC\\). Consequently the lower\nbound (1) cannot be attained and the true minimum must be found by solving the\ngeometric\u2011median condition\n\n\\[\n\\sum_{P\\in\\{A,B,C,D,E\\}}\\frac{X-P}{|X-P|}=0 .\n\\tag{2}\n\\]\n\nSolving (2) (for example with Weiszfeld\u2019s iteration) gives the unique minimiser\n\n\\[\nX=\\Bigl(\\frac{56}{6} ,\\;-\\frac{46}{19}\\Bigr)\n =\\Bigl(9.321\\ldots,-2.363\\ldots\\Bigr).\n\\]\n\nSubstituting this point into \\(f(X)\\) yields\n\n\\[\n\\begin{aligned}\nf_{\\min}&=AX+BX+CX+DX+EX\\\\\n&=6+33\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus the least possible value of \\(f(X)\\) is \\(6+33\\sqrt3\\). It is of the form\n\\(m+n\\sqrt p\\) with \\(m=6,\\;n=33,\\;p=3\\).\n\nTherefore \n\n\\[\nm+n+p=6+33+3=42 .\n\\]\n\n\\[\n\\boxed{42}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nc,v,s\n\\]\n\nbe the numbers of players who chose chocolate, vanilla and strawberry, respectively. \nThe players are distinct, so for a fixed triple \\((c,v,s)\\) the number of assignments is\n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nThe conditions are \n\n* \\(c+v+s=9\\) (nine players), \n* \\(c>v>s\\) (strictly more chocolate than vanilla, and more vanilla than strawberry), \n* \\(c,v,s\\ge 1\\) (each flavor is chosen by at least one player).\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\)\n\nWe need positive integers \\(c>v>s\\) with sum 9.\n\nList possibilities by the smallest part \\(s\\).\n\n* **\\(s=1\\)**: then \\(c+v=8\\) with \\(c>v>1\\). \n Pairs \\((c,v)\\) are \\((6,2)\\) and \\((5,3)\\). \n \u2192 \\((6,2,1),\\;(5,3,1)\\).\n\n* **\\(s=2\\)**: then \\(c+v=7\\) with \\(c>v>2\\). \n Only pair \\((4,3)\\) works. \n \u2192 \\((4,3,2)\\).\n\n* **\\(s\\ge 3\\)**: then \\(c+v\\le 6\\) while \\(v> s\\ge3\\), impossible.\n\nHence the only triples are \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple\n\n\\[\n9! = 362\\,880.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN = 252 + 504 + 1260 = 2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equation \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .\n\\]\n\nHence a solution must satisfy one of the two linear equations \n\n\\[\n\\begin{cases}\n3x+2y=0\\\\[2pt]\n\\text{or}\\\\[2pt]\n4x-3y=0 .\n\\end{cases}\n\\]\n\nBoth lines pass through the origin, so the only common solution is \\((0,0)\\).\n\n---\n\n### 1. Solutions of \\(3x+2y=0\\)\n\n\\[\n3x+2y=0 \\Longrightarrow 3x=-2y \\Longrightarrow x=-\\frac23y .\n\\]\n\nLet \\(y=3m\\) (\\(m\\in\\mathbb Z\\)). Then \n\n\\[\nx=-2m .\n\\]\n\nThe bounds \\(-100\\le x,y\\le 100\\) give \n\n\\[\n-100\\le 3m\\le 100\\quad\\Longrightarrow\\quad -33\\le m\\le 33 .\n\\]\n\nThus there are \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 2. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x-3y=0 \\Longrightarrow 4x=3y \\Longrightarrow x=\\frac34y .\n\\]\n\nLet \\(y=4k\\) (\\(k\\in\\mathbb Z\\)). Then \n\n\\[\nx=3k .\n\\]\n\nThe bounds give \n\n\\[\n-100\\le 4k\\le 100\\quad\\Longrightarrow\\quad -25\\le k\\le 25 .\n\\]\n\nHence there are \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 3. Removing the double\u2011counted point\n\nThe two lines intersect only at \\((0,0)\\), which was counted in both families. \nSo the total number of distinct ordered pairs is\n\n\\[\n67+51-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(x,0),\\qquad C=(0,y)\n\\]\n\nso that \\(\\angle A=90^{\\circ}\\) and \n\n\\[\nx^{2}+y^{2}=BC^{2}=38^{2}=1444 .\\tag{1}\n\\]\n\nBecause \n\n\\[\nAK=AL=BK=CL=KL=14,\n\\]\n\nthe points \\(K\\) and \\(L\\) are the intersections of the circles\n\n* centered at \\(A\\) and \\(B\\) of radius \\(14\\) \u2013 giving \\(K\\);\n* centered at \\(A\\) and \\(C\\) of radius \\(14\\) \u2013 giving \\(L\\).\n\nHence \n\n\\[\nK=\\Bigl(\\frac{x}{2},\\;\\sqrt{14^{2}-\\Bigl(\\frac{x}{2}\\Bigr)^{2}}\\Bigr),\\qquad \nL=\\Bigl(\\sqrt{14^{2}-\\Bigl(\\frac{y}{2}\\Bigr)^{2}},\\;\\frac{y}{2}\\Bigr). \\tag{2}\n\\]\n\nWrite \n\n\\[\nu=\\frac{x}{2},\\qquad v=\\frac{y}{2},\n\\]\n\nso that \\(x=2u,\\;y=2v\\). \nFrom (1) we have \n\n\\[\nu^{2}+v^{2}=361. \\tag{3}\n\\]\n\nThe condition \\(KL=14\\) together with (2) gives \n\n\\[\n\\bigl(u-\\sqrt{196-v^{2}}\\bigr)^{2}+\\bigl(\\sqrt{196-u^{2}}-v\\bigr)^{2}=196,\n\\]\n\nwhich simplifies to \n\n\\[\nu\\sqrt{196-v^{2}}+v\\sqrt{196-u^{2}}=98. \\tag{4}\n\\]\n\nLet \n\n\\[\na=u^{2},\\quad b=v^{2}.\n\\]\n\nThen (3) is \\(a+b=361\\) and (4) becomes \n\n\\[\n\\sqrt{a(196-b)}+\\sqrt{b(196-a)}=98 .\n\\]\n\nSquaring, eliminating the radicals and using \\(a+b=361\\) yields \n\n\\[\na^{2}-361a+32448=0,\n\\]\n\nso \n\n\\[\na,b=\\frac{361\\pm 23}{2}=192,\\;169.\n\\]\n\nThus \n\n\\[\nu^{2}=169,\\;v^{2}=192\\quad\\text{or}\\quad u^{2}=192,\\;v^{2}=169.\n\\]\n\nTake \n\n\\[\nu=13,\\qquad v=8\\sqrt3 .\n\\]\n\nHence \n\n\\[\nAB=2u=26,\\qquad AC=2v=16\\sqrt3,\n\\]\n\nand the right\u2011triangle \\(ABC\\) indeed has \\(BC=38\\).\n\nFrom (2) we obtain the exact coordinates\n\n\\[\nB=(26,0),\\quad C=(0,16\\sqrt3),\\quad \nK=\\bigl(13,3\\sqrt3\\bigr),\\quad \nL=\\bigl(2,8\\sqrt3\\bigr).\n\\]\n\nNow compute the area of quadrilateral \\(BKLC\\) with the shoelace formula:\n\n\\[\n\\begin{aligned}\n\\text{Area} &=\\frac12\\bigl|\n26(3\\sqrt3)+13(8\\sqrt3)+2(16\\sqrt3)+0\\cdot0\\\\\n&\\quad- \\bigl(13\\cdot0+2(3\\sqrt3)+0(8\\sqrt3)+26(16\\sqrt3)\\bigr)\\bigr|\\\\[2mm]\n&=\\frac12\\bigl| 78\\sqrt3+104\\sqrt3+32\\sqrt3\n- (6\\sqrt3+416\\sqrt3) \\bigr|\\\\[2mm]\n&=\\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n= \\frac12\\,(208\\sqrt3)=104\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus the area of \\(BKLC\\) is \\(104\\sqrt3\\). \n\nTherefore \n\n\\[\n\\boxed{104}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid have bases \\(AB=r\\) and \\(CD=s\\) \\((r\\neq s)\\) and equal legs \\(AD=BC=\\ell\\).\nA circle of radius \\(3\\) is tangent to all four sides.\n\n---\n\n### 1. Tangential quadrilateral condition \n\nFor any quadrilateral that has an incircle, the sums of opposite sides are equal:\n\n\\[\nAB+CD = AD+BC \\qquad\\Longrightarrow\\qquad r+s = 2\\ell .\n\\tag{1}\n\\]\n\nThus each leg is the average of the two bases:\n\n\\[\n\\ell =\\frac{r+s}{2}.\n\\tag{2}\n\\]\n\n---\n\n### 2. Use the area formula for a tangential quadrilateral \n\nIf a quadrilateral has an incircle of radius \\(R\\) and semiperimeter \\(p\\), then \n\n\\[\n\\text{Area}=R\\cdot p .\n\\]\n\nHere \\(R=3\\) and the area is \\(72\\), so\n\n\\[\n3p = 72 \\quad\\Longrightarrow\\quad p = 24 .\n\\tag{3}\n\\]\n\nThe perimeter is \\(2p=48\\). Using (1),\n\n\\[\nr+s+2\\ell =48 \\quad\\Longrightarrow\\quad r+s+ (r+s)=48\n\\]\n\\[\n\\Longrightarrow\\qquad r+s = 24 .\n\\tag{4}\n\\]\n\nHence from (2) the leg length is \n\n\\[\n\\ell =\\frac{r+s}{2}=12 .\n\\tag{5}\n\\]\n\n---\n\n### 3. Height of the trapezoid \n\nThe incircle touches both parallel sides, so the distance between them (the height \\(h\\)) equals twice the radius:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\tag{6}\n\\]\n\n(One can also get \\(h\\) from \\(\\displaystyle \\text{Area}= \\frac{r+s}{2}\\,h\\) using (4): \\(72 =12h\\Rightarrow h=6\\).)\n\n---\n\n### 4. Relate the leg to the bases \n\nIn an isosceles trapezoid, each leg forms a right triangle with height \\(h\\) and horizontal leg \\(\\frac{|r-s|}{2}\\):\n\n\\[\n\\ell^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+h^{2}.\n\\]\n\nSubstituting \\(\\ell=12\\) and \\(h=6\\),\n\n\\[\n12^{2}= \\frac{(r-s)^{2}}{4}+6^{2}\n\\quad\\Longrightarrow\\quad\n144 = \\frac{(r-s)^{2}}{4}+36\n\\]\n\\[\n\\Longrightarrow\\quad (r-s)^{2}=432 .\n\\tag{7}\n\\]\n\n---\n\n### 5. Find \\(r^{2}+s^{2}\\)\n\nWe have the two symmetric relations \n\n\\[\n(r+s)^{2}=24^{2}=576,\n\\qquad\n(r-s)^{2}=432 .\n\\]\n\nRecall \n\n\\[\n(r-s)^{2}= (r+s)^{2}-4rs .\n\\]\n\nThus \n\n\\[\n432 = 576 - 4rs \\quad\\Longrightarrow\\quad rs = 36 .\n\\tag{8}\n\\]\n\nNow \n\n\\[\nr^{2}+s^{2}= (r+s)^{2}-2rs = 576-2\\cdot36 = 576-72 = 504 .\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a number to be divisible by \\(22\\) it must be divisible by \\(2\\) and by \\(11\\).\n\n---\n\n### 1. Divisibility by \\(11\\)\n\nWrite an 8\u2011digit permutation as \n\n\\[\nd_1d_2d_3d_4d_5d_6d_7d_8 ,\n\\]\n\nwith positions counted from the left. \nFor an even number of digits, the rule for \\(11\\) is \n\n\\[\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\\equiv0\\pmod{11}.\n\\]\n\nLet \n\n\\[\nO=d_1+d_3+d_5+d_7,\\qquad E=d_2+d_4+d_6+d_8 .\n\\]\n\nBecause the digits \\(1,2,\\dots ,8\\) are used once, \n\n\\[\nO+E=1+2+\\cdots+8=36 .\n\\]\n\nThe condition for \\(11\\) gives \\(O-E\\equiv0\\pmod{11}\\). \nSince \\(O,E\\) lie between \\(10\\) and \\(26\\), the only possible multiple of \\(11\\) is \\(0\\). \nHence \n\n\\[\nO=E=18 .\n\\]\n\nThus the four digits placed in the odd positions must sum to \\(18\\); the remaining four (even positions) also sum to \\(18\\).\n\n---\n\n### 2. Which four\u2011digit sets sum to \\(18\\)?\n\nFind all 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(8\\) such subsets. \nEach contains exactly two even digits (the evens are \\(2,4,6,8\\)). \nConsequently, the complementary set (the digits for the even positions) also contains exactly two evens.\n\n---\n\n### 3. Divisibility by \\(2\\)\n\nA number is even precisely when its unit digit (position\u202f8) is even. \nPosition\u202f8 belongs to the even positions, whose four digits are the complement of the chosen odd\u2011position set. \nSince that complement always has exactly two even digits, we have\n\n\\[\n\\text{choices for the unit digit}=2 .\n\\]\n\n---\n\n### 4. Counting the permutations\n\nFix one of the eight valid 4\u2011digit odd\u2011position sets \\(S\\).\n\n* Arrange the four digits of \\(S\\) in the odd positions \\(1,3,5,7\\): \\(4! = 24\\) ways.\n* Choose an even digit from the complementary set for the unit place: \\(2\\) ways.\n* Arrange the remaining three digits of the complement in positions \\(2,4,6\\): \\(3! = 6\\) ways.\n\nHence for each set \\(S\\)\n\n\\[\n24 \\times 2 \\times 6 = 288\n\\]\n\npermutations are divisible by \\(22\\).\n\nWith \\(8\\) possible sets \\(S\\),\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 5. Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "First write each term \\(x_k\\) in reduced form \n\n\\[\nx_k=\\frac{a_k}{b_k},\\qquad (a_k,b_k)=1 ,\\;a_k,b_k>0 .\n\\]\n\nFrom \n\n\\[\nx_{k+1}= \\frac13\\Bigl(x_k+\\frac1{x_k}-1\\Bigr)\n =\\frac13\\Bigl(\\frac{a_k}{b_k}+\\frac{b_k}{a_k}-1\\Bigr)\n\\]\n\nwe obtain \n\n\\[\na_{k+1}= \\frac{a_k^2+b_k^2-a_kb_k}{3},\\qquad \nb_{k+1}=a_kb_k .\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Coprimeness is preserved\nIf a prime \\(p\\mid a_{k+1}\\) and \\(p\\mid b_{k+1}=a_kb_k\\) then \\(p\\mid a_k\\) or \\(p\\mid b_k\\).\nBut modulo such a prime the numerator \\(a_k^2+b_k^2-a_kb_k\\) equals \\(b_k^2\\) (resp. \\(a_k^2\\)),\nwhich is non\u2011zero because \\((a_k,b_k)=1\\). Hence no prime can divide both\n\\(a_{k+1}\\) and \\(b_{k+1}\\); therefore \\((a_{k+1},b_{k+1})=1\\).\nThus each \\(x_k\\) is already in lowest terms.\n\n--------------------------------------------------------------------\n### 2. A simple recurrence for the sum\n\nLet \n\n\\[\ns_k=a_k+b_k .\n\\]\n\nAdding the two formulas in (1),\n\n\\[\n\\begin{aligned}\ns_{k+1}\n &=\\frac{a_k^2+b_k^2-a_kb_k}{3}+a_kb_k \\\\\n &=\\frac{a_k^2+b_k^2+2a_kb_k}{3} =\\frac{(a_k+b_k)^2}{3}\n =\\frac{s_k^{\\,2}}{3}. \\tag{2}\n\\end{aligned}\n\\]\n\nThe initial sum is \n\n\\[\ns_1= a_1+b_1=25+11=36 .\n\\]\n\n--------------------------------------------------------------------\n### 3. Closed form of \\(s_k\\)\n\nFrom (2) we prove by induction that \n\n\\[\n\\boxed{\\,s_k = 2^{\\,2^{\\,k}}\\; 3^{\\,2^{\\,k-1}+1}\\,}\\qquad(k\\ge1).\n\\]\n\nIndeed, for \\(k=1\\) the formula gives \\(2^{2}\\,3^{2}=36\\).\nAssume it holds for \\(k\\); then using (2),\n\n\\[\ns_{k+1}= \\frac{s_k^{2}}{3}\n =\\frac{(2^{2^{k}}3^{2^{k-1}+1})^{2}}{3}\n =2^{2^{k+1}}3^{2^{k}+1},\n\\]\n\nwhich is the required expression for \\(k+1\\).\n\n--------------------------------------------------------------------\n### 4. Computing \\(s_{2025}\\pmod{1000}\\)\n\nWe need \\(m+n=s_{2025}\\pmod{1000}\\).\n\nBecause \\(1000=8\\cdot125\\), we treat the two moduli separately.\n\n*Modulo \\(8\\):* \n\\(2^{2^{2025}}\\) contains the factor \\(2^3\\); hence \\(s_{2025}\\equiv0\\pmod 8\\).\n\n*Modulo \\(125\\):* \n\\(\\phi(125)=100\\). Thus we may reduce the exponents modulo \\(100\\).\n\n\\[\n\\begin{aligned}\n2^{2025}\\pmod{100}&=32, &\n2^{2024}\\pmod{100}&=16 .\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n\\begin{aligned}\n2^{\\,2^{2025}}\\pmod{125}&=2^{32}\\pmod{125}=46,\\\\[2mm]\n3^{\\,2^{2024}+1}\\pmod{125}&=3^{16+1}=3^{17}\\pmod{125}=38.\n\\end{aligned}\n\\]\n\nTherefore \n\n\\[\ns_{2025}\\equiv 46\\cdot38\\equiv123\\pmod{125}.\n\\]\n\nNow solve \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),\n\n\\[\nN\\equiv8\\bigl(47\\cdot123\\bigr)\\equiv8\\cdot31\\equiv248\\pmod{1000}.\n\\]\n\nThus \n\n\\[\nm+n\\equiv\\boxed{248}\\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n### 5. Check via periodicity (optional)\n\nFrom \\(s_{k+1}=s_k^2/3\\) modulo \\(1000\\) one finds that the\nsequence \\(\\{s_k\\bmod1000\\}\\) becomes periodic with period \\(20\\) after\nthe third term:\n\\[\n36,\\;432,\\;\\underline{208},\\;88,\\;248,\\;168,\\dots\n\\]\nSince \\(2025-3\\equiv2\\pmod{20}\\), the term equals the fifth term,\n\\(248\\), confirming the result above.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nz=x+iy .\n\\]\n\n---\n\n### 1. The first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\ngives the circle \n\n\\[\n(x-25)^2+(y-20)^2=5^{2}=25 .\n\\tag{1}\n\\]\n\nIts centre is \\(C=(25,20)\\) and its radius is \\(5\\).\n\n---\n\n### 2. The second equation \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the point \\(z\\) is equidistant from the two points \n\n\\[\nA=(4+k,0),\\qquad B=(k,3).\n\\]\n\nThus \\(z\\) lies on the **perpendicular bisector** of the segment \\(AB\\).\n\n*Midpoint* \n\n\\[\nM\\Bigl(\\frac{4+k+k}{2},\\frac{0+3}{2}\\Bigr)=\\bigl(k+2,\\; \\tfrac32 \\bigr).\n\\]\n\n*Slope of \\(AB\\)* \n\n\\[\n\\frac{3-0}{k-(4+k)}=\\frac{3}{-4}=-\\frac34 .\n\\]\n\nHence the slope of the perpendicular bisector is \\( \\displaystyle \\frac43\\).\n\nIts equation is\n\n\\[\ny-\\frac32=\\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\nor, after clearing denominators,\n\n\\[\n8x-6y-8k-7=0 .\n\\tag{2}\n\\]\n\nThus the second condition is the line \\(L_k: 8x-6y-8k-7=0\\).\n\n---\n\n### 3. Intersections of (1) and (2)\n\nThe system has exactly one solution iff the line \\(L_k\\) is **tangent** to the circle (1), i.e. the distance from the centre \\(C\\) to the line equals the radius \\(5\\).\n\nDistance from \\((25,20)\\) to \\(L_k\\):\n\n\\[\nd=\\frac{|8\\cdot25-6\\cdot20-8k-7|}{\\sqrt{8^{2}+(-6)^{2}}}\n =\\frac{|200-120-8k-7|}{\\sqrt{64+36}}\n =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence \n\n\\[\n73-8k=50\\quad\\text{or}\\quad73-8k=-50,\n\\]\ngiving \n\n\\[\nk=\\frac{23}{8}\\qquad\\text{or}\\qquad k=\\frac{123}{8}.\n\\]\n\nFor each of these values the line is tangent, so there is exactly one point \\(z\\) satisfying both equations.\n\n---\n\n### 4. Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\displaystyle \\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\;n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Since the points lie on the sides of \\(\\triangle ABC\\) we may work with vectors\n\\[\n\\vec{AB}= \\mathbf b,\\qquad \\vec{AC}= \\mathbf c ,\n\\qquad A\\; \\text{at the origin}.\n\\]\n\n--------------------------------------------------------------------\n### 1. Locate the points \\(D,E,F,G\\)\n\n\\[\nAD=4,\\;AB=28\\Longrightarrow \\frac{AD}{AB}= \\frac 1 7\\quad\\Rightarrow\\quad \n\\vec{AD}=\\frac17\\mathbf b .\n\\]\nThus \\(D=\\dfrac17\\mathbf b\\).\n\n\\[\nAE=AD+DE=20\\Longrightarrow\\frac{AE}{AB}= \\frac{20}{28}= \\frac57\n\\quad\\Rightarrow\\quad E=\\frac57\\mathbf b .\n\\]\n\nSimilarly on \\(AC\\),\n\n\\[\nAF=13,\\;AC=91\\Longrightarrow \\frac{AF}{AC}= \\frac13\\!7\\quad\\Rightarrow\\quad \nF=\\frac17\\mathbf c ,\n\\]\n\\[\nAG=AF+FG=65\\Longrightarrow \\frac{AG}{AC}= \\frac{65}{91}= \\frac57\n\\quad\\Rightarrow\\quad G=\\frac57\\mathbf c .\n\\]\n\nHence \n\n\\[\nD=\\frac17\\mathbf b,\\qquad E=\\frac57\\mathbf b,\\qquad\nF=\\frac17\\mathbf c,\\qquad G=\\frac57\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 2. Area of \\(\\triangle ABC\\)\n\nQuadrilateral \\(DEGF\\) is the region between the similar triangles\n\\(ADF\\) (scale \\(1/7\\)) and \\(AEG\\) (scale \\(5/7\\)). \nTherefore \n\n\\[\n[DEGF]=[AEG]-[ADF]\n =\\left(\\frac57\\right)^{\\!2}[ABC]-\\left(\\frac17\\right)^{\\!2}[ABC]\n =\\frac{25-1}{49}[ABC]=\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n[ABC]=\\frac{49}{24}\\cdot288=49\\cdot12=588 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 3. Locate the reflected points \\(M,N\\)\n\n\\[\nM\\; \\text{is the reflection of }D\\text{ across }F\\;\n\\Longrightarrow\\; M=2F-D=\n\\frac{2}{7}\\mathbf c-\\frac{1}{7}\\mathbf b .\n\\]\n\n\\[\nN\\; \\text{is the reflection of }G\\text{ across }E\\;\n\\Longrightarrow\\; N=2E-G=\n\\frac{10}{7}\\mathbf b-\\frac{5}{7}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of the heptagon \\(AFNBCEM\\)\n\nWrite the vertices (in order) as vectors from \\(A\\):\n\n\\[\n\\begin{aligned}\nA&=0, &\nF&=\\frac17\\mathbf c, &\nN&=\\frac{10}{7}\\mathbf b-\\frac57\\mathbf c,\\\\\nB&=\\mathbf b, &\nC&=\\mathbf c, &\nE&=\\frac57\\mathbf b, &\nM&=\\frac27\\mathbf c-\\frac17\\mathbf b .\n\\end{aligned}\n\\]\n\nFor a polygon with vertices \\(\\mathbf v_0,\\dots,\\mathbf v_6\\) the doubled\narea equals\n\\[\n\\sum_{i=0}^{6}\\det(\\mathbf v_i,\\mathbf v_{i+1}),\n\\qquad\\mathbf v_7=\\mathbf v_0 .\n\\]\n\nCarrying out the determinants (using \\(\\det(\\mathbf b,\\mathbf c)=\\det(\\mathbf b,\\mathbf c)\\) and \\(\\det(\\mathbf c,\\mathbf b)=-\\det(\\mathbf b,\\mathbf c)\\)):\n\n\\[\n\\begin{aligned}\n\\det(F,N) &=\\frac1{49}\\det\\!\\Bigl(\\mathbf c,\\;10\\mathbf b-5\\mathbf c\\Bigr)\n =-\\frac{10}{49}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(N,B) &=\\frac57\\det(\\mathbf b,\\mathbf b)-\\frac5{7}\\det(\\mathbf c,\\mathbf b)\n =\\frac5{7}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(B,C) &=\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(C,E) &=\\frac57\\det(\\mathbf c,\\mathbf b)=-\\frac5{7}\\det(\\mathbf b,\\mathbf c),\\\\[2mm]\n\\det(E,M) &=\\frac1{49}\\det\\!\\Bigl(5\\mathbf b,\\;2\\mathbf c-\\mathbf b\\Bigr)\n =\\frac{10}{49}\\det(\\mathbf b,\\mathbf c).\n\\end{aligned}\n\\]\n\nAll other terms are zero. Adding them:\n\n\\[\n\\det(F,N)+\\det(N,B)+\\det(B,C)+\\det(C,E)+\\det(E,M)\n =\\Bigl(-\\frac{10}{49}+\\frac5{7}+1-\\frac5{7}+\\frac{10}{49}\\Bigr)\n \\det(\\mathbf b,\\mathbf c)=\\det(\\mathbf b,\\mathbf c).\n\\]\n\nThus the doubled area of the heptagon is \\(\\det(\\mathbf b,\\mathbf c)\\),\nwhich is exactly twice the area of \\(\\triangle ABC\\). Consequently\n\n\\[\n[AFNBCEM]=\\frac12\\det(\\mathbf b,\\mathbf c)=[ABC]=588 .\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 5. Answer\n\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The parabola is \n\n\\[\ny=x^{2}-4 .\n\\]\n\nRotate a point \\((x,y)\\) by \\(-60^{\\circ}\\) (the inverse rotation). \nFor \\(\\theta =60^{\\circ}\\),\n\n\\[\n\\cos\\theta =\\frac12 ,\\qquad \\sin\\theta =\\frac{\\sqrt3}{2}.\n\\]\n\nThe inverse\u2011rotation of \\((x,y)\\) is \n\n\\[\nu=\\frac12 x+\\frac{\\sqrt3}{2}y ,\\qquad \nv=-\\frac{\\sqrt3}{2}x+\\frac12 y .\n\\]\n\nFor a point of the rotated parabola, the inverse image \\((u,v)\\) must satisfy the\noriginal equation \\(v=u^{2}-4\\):\n\n\\[\n-\\frac{\\sqrt3}{2}x+\\frac12 y =\\Bigl(\\frac12 x+\\frac{\\sqrt3}{2}y\\Bigr)^{2}-4 .\n\\]\n\nMultiplying by \\(2\\) and expanding gives\n\n\\[\n\\frac12 x^{2}+\\sqrt3\\,xy+\\frac32 y^{2}+\\sqrt3\\,x-y-8=0. \\tag{1}\n\\]\n\nNow substitute \\(y=x^{2}-4\\) (the original parabola) into (1):\n\n\\[\n\\frac12 x^{2}+\\sqrt3\\,x(x^{2}-4)+\\frac32 (x^{2}-4)^{2}\n+\\sqrt3\\,x-(x^{2}-4)-8=0 .\n\\]\n\nSimplifying,\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0 .\n\\]\n\nFactor the quartic (group the \\(\\sqrt3\\) terms):\n\n\\[\n\\bigl(x^{2}+\\sqrt3\\,x-4\\bigr)\\bigl(3x^{2}-\\sqrt3\\,x-10\\bigr)=0 .\n\\]\n\nHence\n\n\\[\nx^{2}+\\sqrt3\\,x-4=0\\qquad\\text{or}\\qquad 3x^{2}-\\sqrt3\\,x-10=0.\n\\]\n\nThe four solutions are \n\n\\[\n\\begin{aligned}\nx&=\\frac{-\\sqrt3\\pm\\sqrt{19}}2,\\\\[2mm]\nx&=\\frac{\\sqrt3\\pm\\sqrt{123}}6 .\n\\end{aligned}\n\\]\n\nOnly one of them lies in the fourth quadrant \\((x>0,\\;y<0)\\):\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2\\;(>0),\\qquad |x|<2 .\n\\]\n\nIts \\(y\\)-coordinate is\n\n\\[\ny=x^{2}-4\n =\\Bigl(\\frac{-\\sqrt3+\\sqrt{19}}2\\Bigr)^{2}-4\n =\\frac{3-\\sqrt{57}}2 .\n\\]\n\nThus \n\n\\[\ny=\\frac{a-\\sqrt b}{c}\\quad\\text{with}\\quad a=3,\\;b=57,\\;c=2,\n\\]\nand \\(a\\) and \\(c\\) are relatively prime.\n\nFinally,\n\\[\na+b+c=3+57+2=62 .\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The six two\u2011letter words are formed by first ordering the letters inside each pair\nalphabetically and then sorting the six words alphabetically. \nFor a pairing, let \n\n\\[\nS=\\{\\text{the smaller letter of each pair}\\}\n\\]\n\n(the \u201cfirst\u201d letters of the six words). \nThe lexicographically last word is the one whose first letter is \n\n\\[\nM=\\max S .\n\\]\n\nHence the last word contains \\(G\\) **iff** either \n\n* \\(M=G\\) (so \\(G\\) itself is the first letter of the last word), or \n* \\(M\\neq G\\) but \\(G\\) is paired with the letter \\(M\\) (so \\(G\\) is the second\nletter of the last word).\n\nBecause a pair \\((x,y)\\) must satisfy \\(x0)\n\\]\n\nThen \n\n\\[\nn=d-2,\\qquad n+3=d+1,\\qquad n^{2}+9=(d-2)^{2}+9=d^{2}-4d+13 .\n\\]\n\nThe required divisibility becomes \n\n\\[\nd\\mid 3(n+3)(n^{2}+9)=3(d+1)(d^{2}-4d+13).\n\\]\n\n---\n\n### Reduce modulo \\(d\\)\n\n\\[\n3(d+1)(d^{2}-4d+13) \\equiv 3\\cdot1\\cdot13 = 39 \\pmod d,\n\\]\n\nbecause \\(d+1\\equiv1\\) and \\(d^{2}-4d+13\\equiv13\\) modulo \\(d\\).\n\nThus \n\n\\[\nd\\mid 3(d+1)(d^{2}-4d+13)\\iff d\\mid 39 .\n\\]\n\nHence \\(d\\) must be a positive divisor of \\(39\\) and at least \\(3\\). \nDivisors of \\(39\\) are \\(1,3,13,39\\); discarding \\(1\\) we obtain \n\n\\[\nd\\in\\{3,13,39\\}.\n\\]\n\n---\n\n### Recover the corresponding \\(n\\)\n\n\\[\nn=d-2\\implies n\\in\\{3-2,13-2,39-2\\}=\\{1,11,37\\}.\n\\]\n\nEach indeed satisfies the original condition:\n\n* \\(n=1\\): \\(\\frac{3(1+3)(1^{2}+9)}{1+2}= \\frac{3\\cdot4\\cdot10}{3}=40\\) (integer);\n* \\(n=11\\): \\(\\frac{3(11+3)(11^{2}+9)}{11+2}= \\frac{3\\cdot14\\cdot130}{13}=420\\);\n* \\(n=37\\): \\(\\frac{3(37+3)(37^{2}+9)}{37+2}= \\frac{3\\cdot40\\cdot1378}{39}=4240\\).\n\n---\n\n### Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz0 .\n\\end{aligned}\n\\]\n\n\\[\n\\begin{aligned}\ny-zx &0},\\qquad\\boxed{(x+1)(x+2y-75)<0}.\n\\]\n\nBoth are products of two linear factors.\n\n---\n\n### 2. Work in the \\((x,y)\\)-plane \n\nThe plane \\(x+y+z=75\\) is a linear image of the \\((x,y)\\)-plane via \n\n\\[\n(x,y)\\mapsto (x,\\;y,\\;75-x-y) .\n\\]\n\nThe Jacobian matrix has columns \\((1,0,-1)\\) and \\((0,1,-1)\\); its Gram determinant is \n\n\\[\n\\det\\begin{pmatrix}2&1\\\\1&2\\end{pmatrix}=3 .\n\\]\n\nThus an area element in the plane equals \\(\\sqrt3\\) times the ordinary area\n\\(dx\\,dy\\) in the \\((x,y)\\)-plane.\n\n---\n\n### 3. Region defined by the two products \n\nLet \n\n\\[\nL_1:\\;x=-1,\\qquad L_2:\\;x+2y=75,\n\\]\n\\[\nL_3:\\;x=y,\\qquad L_4:\\;x+y=76 .\n\\]\n\nThe inequalities become\n\n\\[\n\\begin{cases}\nx>-1 \\;\\text{and}\\; y<\\dfrac{75-x}{2} &\\text{or } x<-1 \\;\\text{and}\\; y>\\dfrac{75-x}{2},\\\\[4pt]\nx>y \\;\\text{and}\\; x+y>76 &\\text{or } x-1,\\;y<\\frac{75-x}{2},\\;x>y,\\;x+y>76\\) (unbounded).\n* **Region\u202f\\(R_2\\)** \u2013 \\(x>-1,\\;y<\\frac{75-x}{2},\\;x\\frac{75-x}{2},\\;x0,\n\\]\n\nlet \n\n\\[\nN(x)=(x-18)(x-72)(x-98)(x-k)=x^4-S_1x^3+S_2x^2-S_3x+S_4,\n\\]\n\nwhere \n\n\\[\n\\begin{aligned}\nS_1&=18+72+98+k=188+k,\\\\[2pt]\nS_2&=18\\cdot72+18\\cdot98+72\\cdot98+ k(18+72+98)=10116+188k,\\\\[2pt]\nS_4&=18\\cdot72\\cdot98\\cdot k=127008\\,k .\n\\end{aligned}\n\\]\n\nThen \n\n\\[\nf(x)=\\frac{N(x)}{x}=x^{3}-S_1x^{2}+S_2x-S_3+\\frac{S_4}{x},\n\\]\n\nand \n\n\\[\nf'(x)=\\frac{3x^{4}-2S_1x^{3}+S_2x^{2}-S_4}{x^{2}} .\n\\]\n\nHence the critical points are the (positive) roots of \n\n\\[\nP(x)=3x^{4}-2S_1x^{3}+S_2x^{2}-S_4=0\\tag{1}\n\\]\n\n(the denominator $x^{2}>0$ for $x>0$).\n\nBecause $f(x)\\to +\\infty$ as $x\\to0^{+}$ and as $x\\to\\infty$, the graph must\nfirst decrease, then increase, then decrease, and finally increase again.\nThus (1) has three positive roots:\n\n* $x_1$ \u2013 a local **minimum** in the first negative interval,\n* $x_2$ \u2013 a local **maximum** in the positive interval,\n* $x_3$ \u2013 a second local **minimum** in the last negative interval.\n\nThe global minimum is achieved at the lower of the two minima.\nFor the minimum to be attained **exactly at two points** we need \n\n\\[\nf(x_1)=f(x_3)\\qquad(\\text{the two minima have the same value}).\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 1. Translating the condition\n\nAt a critical point $x$ we have $f'(x)=0$, i.e. $P(x)=0$.\nFrom $f(x)=\\dfrac{N(x)}{x}$ and $P(x)=0$ it follows that \n\n\\[\nf(x)=\\frac{N(x)}{x}=N'(x)\\qquad\\text{for any critical point}.\n\\tag{3}\n\\]\n\nThus (2) is equivalent to \n\n\\[\nN'(x_1)=N'(x_3).\\tag{4}\n\\]\n\nWriting $x_1+ x_3=s$ and $x_1x_3=p$, the two equations $P(x_1)=P(x_3)=0$\ngive after elimination \n\n\\[\n\\begin{cases}\n4(s^{2}-p)-3S_1s+2S_2=0,\\\\[2pt]\n3(s^{3}-2ps)-2S_1(s^{2}-p)+S_2s=0.\n\\end{cases}\\tag{5}\n\\]\n\nEquation (5) yields \n\n\\[\n(2s-S_1)\\Bigl(3s(s-S_1)+2S_2\\Bigr)=0 .\n\\]\n\nHence either \n\n\\[\n\\boxed{s=\\dfrac{S_1}{2}} \\qquad\\text{or}\\qquad\n3s^{2}-3S_1s+2S_2=0. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n### 2. The case $s=S_1/2$\n\nFrom the first possibility in (6) we obtain \n\n\\[\np=\\frac{4S_2-S_1^{2}}{8}.\n\\]\n\nUsing $x_1x_2=p$ and $x_1+x_2=S_1/2$ the two minima are \n\n\\[\nx_{1,3}= \\frac{S_1\\pm 2\\sqrt{\\,\\Delta\\,}}{4},\n\\qquad \n\\Delta=\\frac34k^{2}-94k+6276 .\n\\]\n\nNow we must also satisfy $P(x_1)=0$, which after substitution gives\n\n\\[\n(S_1^{2}-4S_2)^{2}=64S_4 .\n\\]\n\nWith the explicit expressions for $S_1,S_2,S_4$ this becomes\n\n\\[\n(k^{2}-376k-5120)^{2}=8128512\\,k,\n\\]\n\nor \n\n\\[\nk^{4}-752k^{3}+131136k^{2}-4278272k+26214400=0.\n\\tag{7}\n\\]\n\nFactoring (7) gives \n\n\\[\n(k-8)(k-32)(k-200)(k-512)=0 .\n\\]\n\nFor a root to be admissible we need the two minima to lie in the\ntwo negative intervals of $f$. \nThe left minimum equals \n\n\\[\nx_1=\\frac{k+188-2\\sqrt{\\Delta}}{4},\n\\]\n\nwhich is **positive** only when \n\n\\[\nk^{2}-376k-5120<0\\qquad\\Longleftrightarrow\\qquad k<389\\ldots .\n\\]\n\nThus $k=512$ is rejected, while $k=8,\\,32,\\,200$ are valid.\n\n--------------------------------------------------------------------\n### 3. The second possibility in (6)\n\nThe alternative equation $3s^{2}-3S_1s+2S_2=0$ together with the condition\n$P(x_1)=0$ leads, after a completely analogous elimination, to the same\nquartic (7). Its admissible positive solutions are again $8,32,200$,\nso no new $k$ appear.\n\n--------------------------------------------------------------------\n### 4. Conclusion\n\nThe function $f$ has its global minimum attained at exactly two positive\npoints precisely for \n\n\\[\nk\\in\\{8,\\;32,\\;200\\}.\n\\]\n\nTherefore the required sum is \n\n\\[\n8+32+200 = \\boxed{240}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the four unit squares be \n\n\\[\n\\begin{array}{cc}\nA& B\\\\\nC& D\n\\end{array}\n\\]\n\nand denote by \n\n* \\(a=h_{0,1}\\) \u2013 the middle horizontal segment between \\(A\\) and \\(C\\); \n* \\(b=h_{1,1}\\) \u2013 the middle horizontal segment between \\(B\\) and \\(D\\); \n* \\(c=v_{1,0}\\) \u2013 the middle vertical segment between \\(A\\) and \\(B\\); \n* \\(d=v_{1,1}\\) \u2013 the middle vertical segment between \\(C\\) and \\(D\\).\n\nThe eight outer unit\u2011segments are written as \n\n\\[\n\\begin{aligned}\n&e_1=h_{0,0},\\qquad e_2=v_{0,0},\\\\\n&e_3=v_{2,0},\\qquad e_4=h_{1,0},\\\\\n&e_5=h_{0,2},\\qquad e_6=v_{0,1},\\\\\n&e_7=v_{2,1},\\qquad e_8=h_{1,2}.\n\\end{aligned}\n\\]\n\nAll variables take the value 1 for a red side and 0 for a blue side.\n\n--------------------------------------------------------------------\n### 1. Equations for the squares \n\nEach unit square must have exactly two red sides, so we obtain\n\n\\[\n\\begin{aligned}\nA:&\\;e_1+e_2+a+c=2, \\\\\nB:&\\;e_3+e_4+b+c=2, \\\\\nC:&\\;e_5+e_6+a+d=2, \\\\\nD:&\\;e_7+e_8+b+d=2 .\\qquad (1)\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 2. Fix the interior edges \n\nThe four interior edges \\(a,b,c,d\\) are independent; there are \\(2^4=16\\) possible\nchoices.\nFor a fixed quadruple \\((a,b,c,d)\\) the right\u2011hand side of each equation in (1)\nbecomes \n\n\\[\ns_A=2-(a+c),\\; s_B=2-(b+c),\\; s_C=2-(a+d),\\; s_D=2-(b+d).\n\\]\n\nThe numbers \\(s_A,s_B,s_C,s_D\\) are the required sums of the two\nouter edges belonging to each square.\n\n*If \\(s_i=0\\) or \\(s_i=2\\):* the two outer edges are forced to be\n\\((0,0)\\) or \\((1,1)\\) \u2013 exactly **one** possibility.\n\n*If \\(s_i=1\\):* the outer edges must be \\((0,1)\\) or \\((1,0)\\) \u2013 **two**\npossibilities.\n\nHence, for a given \\((a,b,c,d)\\) the number of admissible colourings of the\nouter edges equals \n\n\\[\n2^{\\,N},\\qquad N=\\#\\{i\\in\\{A,B,C,D\\}:s_i=1\\}.\n\\]\n\nBut \\(s_i=1\\) occurs precisely when the two interior edges of that square sum to\n\\(1\\); i.e.\n\n\\[\nN=[a\\neq c]+[b\\neq c]+[a\\neq d]+[b\\neq d],\\tag{2}\n\\]\n\nwhere \\([P]=1\\) if the statement \\(P\\) is true and \\(0\\) otherwise.\n\n--------------------------------------------------------------------\n### 3. Summing over the interior edges \n\nWrite the sum we need as \n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}} 2^{[a\\neq c]+[b\\neq c]+[a\\neq d]+[b\\neq d]}.\n\\]\n\nFor fixed \\(a,b\\) the contributions of \\(c\\) and \\(d\\) factor:\n\n\\[\n\\bigl(\\sum_{c\\in\\{0,1\\}}2^{[a\\neq c]+[b\\neq c]}\\bigr)^2 .\n\\]\n\nNow compute the inner sum.\n\n*If \\(a=b\\) (either \\((0,0)\\) or \\((1,1)\\)): \n\n\\[\nc=0\\!:\\;[a\\neq c]+[b\\neq c]=0,\\qquad\nc=1\\!:\\;[a\\neq c]+[b\\neq c]=2,\n\\]\nso the sum equals \\(2^{0}+2^{2}=1+4=5\\).\n\n*If \\(a\\neq b\\) (either \\((0,1)\\) or \\((1,0)\\)): \n\n\\[\nc=0\\!:\\;[a\\neq c]+[b\\neq c]=1,\\qquad\nc=1\\!:\\;[a\\neq c]+[b\\neq c]=1,\n\\]\nso the sum equals \\(2^{1}+2^{1}=2+2=4\\).\n\nThus\n\n\\[\n\\begin{aligned}\n\\text{total}&=\n2\\bigl(5^2\\bigr)+2\\bigl(4^2\\bigr) \\\\\n&=2\\cdot25+2\\cdot16\\\\\n&=50+32\\\\\n&=82 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4. Answer \n\nThere are \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent colourings of the twelve unit segments such that each of the four\nunit squares has exactly two red sides and two blue sides.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n* \\(O\\) be the centre of \\(\\omega _2\\) (radius \\(15\\)),\n* \\(A\\) be the centre of \\(\\omega _1\\) (radius \\(6\\)),\n* \\(B\\) the internal point of tangency.\n\nPlace \\(O\\) at the origin and take the diameter \\(BC\\) on the \\(x\\)-axis.\n\n\\[\nO=(0,0),\\qquad B=(15,0)\n\\]\n\nBecause \\(\\omega_1\\) is tangent internally at \\(B\\),\n\n\\[\nOA=15-6=9\\qquad\\Longrightarrow\\qquad A=(9,0).\n\\]\n\nSince \\(BC\\) is a diameter of \\(\\omega _2\\),\n\n\\[\nC=(-15,0).\n\\]\n\n\\(AD\\perp BC\\) forces \\(AD\\) to be vertical through \\(A\\); intersecting this line with \\(\\omega _2\\),\n\n\\[\nx=9,\\qquad x^{2}+y^{2}=225\\Longrightarrow y=\\pm 12 .\n\\]\n\nBecause the problem states that \\(D\\) is nearer to the side \\(FG\\) than to \\(EH\\), we take the point above the \\(x\\)-axis:\n\n\\[\nD=(9,12).\n\\]\n\n---------------------------------------------------------------------\n\n### 1. The rectangle \\(EFGH\\)\n\n\\(EF\\perp BC\\); with \\(BC\\) horizontal this makes \\(EF\\) vertical, so the rectangle is axis\u2011aligned.\nLet its half\u2013width be \\(d>0\\) and its half\u2013height be \\(h>0\\). \nSince the rectangle is inscribed in \\(\\omega _1\\) (centre \\(A\\)), its centre must coincide with \\(A\\). \nThus the vertices are \n\n\\[\n\\begin{aligned}\nE&=(9+d,\\,-h), &F&=(9+d,\\,h),\\\\\nG&=(9-d,\\,h), &H&=(9-d,\\,-h).\n\\end{aligned}\n\\]\n\nEach vertex lies on \\(\\omega _1\\): \n\n\\[\n(x-9)^2+y^2=6^2\\quad\\Longrightarrow\\quad d^{\\,2}+h^{\\,2}=36. \\tag{1}\n\\]\n\n---------------------------------------------------------------------\n\n### 2. Equality of the two triangle areas\n\n*Triangle \\(DGF\\)* \nIts base \\(GF\\) is horizontal with length \\(2d\\); the height is the vertical distance from \\(D\\) to the line \\(y=h\\):\n\\[\n[\\,DGF\\,]=\\frac12\\cdot (2d)\\bigl(12-h\\bigr)=d(12-h).\n\\]\n\n*Triangle \\(CHG\\)* \nIts base \\(GH\\) is vertical with length \\(2h\\); the height is the horizontal distance from \\(C\\) to the line \\(x=9-d\\):\n\\[\n[\\,CHG\\,]=\\frac12\\cdot (2h)\\bigl( (9-d)-(-15)\\bigr)=h(24-d).\n\\]\n\nThe condition \\([DGF]=[CHG]\\) gives \n\n\\[\nd(12-h)=h(24-d)\\;\\Longrightarrow\\;12d=24h\\;\\Longrightarrow\\;d=2h. \\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n### 3. Solving for \\(d\\) and \\(h\\)\n\nSubstituting \\(d=2h\\) into (1):\n\n\\[\n(2h)^2+h^{2}=36\\quad\\Longrightarrow\\quad5h^{2}=36\n\\quad\\Longrightarrow\\quad h^{2}=\\frac{36}{5},\\qquad \nh=\\frac{6}{\\sqrt5},\\qquad d=2h=\\frac{12}{\\sqrt5}.\n\\]\n\n---------------------------------------------------------------------\n\n### 4. Area of the rectangle\n\n\\[\n\\text{Area}= (2d)(2h)=4dh=4(2h)h=8h^{2}=8\\cdot\\frac{36}{5}\n=\\frac{288}{5}.\n\\]\n\nThus the area equals \\(\\dfrac{m}{n}\\) with \\(m=288,\\;n=5\\) (coprime). \n\n\\[\nm+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Factor \n\n\\[\n2025=3^{4}\\cdot5^{2}.\n\\]\n\nA divisor of \\(2025\\) has the form \\(3^{a}5^{b}\\) with \\(0\\le a\\le4,\\ 0\\le b\\le2\\). \nHence \n\n\\[\n|A|=(4+1)(2+1)=15,\n\\qquad\\text{total subsets}=2^{15}=32768 .\n\\]\n\n---\n\n### When does a subset have lcm \\(=2025\\)?\n\nThe lcm of a set of divisors is \\(3^{\\max a}\\cdot5^{\\max b}\\). \nThus the lcm equals \\(2025=3^{4}\\cdot5^{2}\\) **iff**\n\n* at least one element has exponent \\(a=4\\) (a divisor containing \\(3^{4}\\));\n* at least one element has exponent \\(b=2\\) (a divisor containing \\(5^{2}\\)).\n\n---\n\n### Counting the desired subsets \n\nDivisors with \\(a=4\\): \\(3^{4}5^{b}\\ (b=0,1,2)\\) \u2013 3 of them. \nDivisors with \\(b=2\\): \\(3^{a}5^{2}\\ (a=0,\\dots ,4)\\) \u2013 5 of them. \n\nLet \n\n* \\(X\\) = subsets containing **no** divisor with \\(a=4\\); \n* \\(Y\\) = subsets containing **no** divisor with \\(b=2\\).\n\n\\[\n|X|=2^{12}\\quad (\\text{choose any of the other }12\\text{ divisors}),\\qquad\n|Y|=2^{10}\\quad (\\text{choose any of the other }10\\text{ divisors}).\n\\]\n\nDivisors lacking both \\(a=4\\) and \\(b=2\\) have \\(a\\le3,\\ b\\le1\\); there are \\(4\\cdot2=8\\) of them, so\n\n\\[\n|X\\cap Y|=2^{8}.\n\\]\n\nUsing inclusion\u2013exclusion, the number of subsets that contain **both** an \\(a=4\\) divisor and a \\(b=2\\) divisor is \n\n\\[\nN = 2^{15} - 2^{12} - 2^{10} + 2^{8}\n = 32768 - 4096 - 1024 + 256\n = 27904 .\n\\]\n\nThese subsets are precisely the non\u2011empty subsets whose lcm equals \\(2025\\); the empty set is automatically excluded by the inclusion\u2013exclusion count.\n\n---\n\n### Probability\n\n\\[\n\\text{Probability} = \\frac{N}{2^{15}} = \\frac{27904}{32768}\n = \\frac{2^{8}\\cdot 109}{2^{15}}\n = \\frac{109}{128}.\n\\]\n\nThe fraction \\(\\frac{109}{128}\\) is already in lowest terms, so \n\n\\[\nm=109,\\qquad n=128,\\qquad m+n=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n\\text{chairs}=1,2,\\dots ,16,\\qquad 8\\ \\text{people sit in 8 of them.}\n\\]\n\nThe condition *no person sits next to two other people* means that no three\noccupied chairs are consecutive. \nHence we must count binary strings of length \\(16\\) with exactly eight 1\u2019s\nand no substring \\(111\\).\n\n---\n\n### 1. Blocks of occupied chairs \n\nOccupied chairs appear in blocks of length \\(1\\) or \\(2\\) (a block of length\n\\(3\\) would give a person with two neighbours). \n\nLet \n\n* \\(t\\) = number of blocks of length \\(2\\);\n* \\(s\\) = number of blocks of length \\(1\\).\n\nThen \n\n\\[\ns+2t=8,\\qquad r=s+t \\text{ (total number of blocks)} .\n\\]\n\nHence \n\n\\[\nt=0,1,2,3,4,\\qquad r=8-t\\;(=8,7,6,5,4).\n\\]\n\nFor a fixed \\(t\\) (hence fixed \\(r\\)) we must choose which of the \\(r\\) blocks\nare the double ones:\n\n\\[\n\\text{ways to choose the double blocks}= \\binom{r}{t}= \\binom{r}{8-r}.\n\\]\n\n---\n\n### 2. Placing the blocks among the empty chairs \n\nThere are \\(16-8=8\\) empty chairs. \nBetween the \\(r\\) blocks there must be at least one empty chair, using\n\\(r-1\\) chairs. \n\nThe remaining empty chairs are \n\n\\[\n8-(r-1)=9-r .\n\\]\n\nThese \\(9-r\\) chairs can be placed arbitrarily in the \\(r+1\\) gaps\n(before the first block, between successive blocks, after the last block). \nBy stars\u2011and\u2011bars the number of ways is \n\n\\[\n\\binom{(9-r)+(r+1)-1}{(r+1)-1}= \\binom{9}{r}.\n\\]\n\n---\n\n### 3. Total number of admissible subsets \n\n\\[\n\\begin{aligned}\nN&=\\sum_{t=0}^{4} \\binom{r}{t}\\binom{9}{r},\n\\qquad r=8-t \\\\\n &=\\sum_{r=4}^{8}\\binom{r}{\\,8-r\\,}\\binom{9}{r}.\n\\end{aligned}\n\\]\n\nCompute each term:\n\n\\[\n\\begin{array}{c|c|c|c}\nr & \\binom{r}{8-r} & \\binom{9}{r} & \\text{product}\\\\ \\hline\n8 & 1 & 9 & 9\\\\\n7 & 7 & 36 & 252\\\\\n6 & 15& 84 & 1260\\\\\n5 & 10& 126 & 1260\\\\\n4 & 1 & 126 & 126\n\\end{array}\n\\]\n\nAdding them,\n\n\\[\nN = 9+252+1260+1260+126 = 2907.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2907 \\equiv 907 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "To solve \n\n\\[\nf(x)=\\sin \\bigl(7\\pi \\,\\sin(5x)\\bigr)=0 ,\\qquad 00\n\\qquad\\Longleftrightarrow\\qquad\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor \\ge\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor+1 .\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n\n**Only one quarter can ever help**\n\nFor even \\(d\\) we have \\(\\big\\lfloor2.5d\\big\\rfloor =2.5d\\) and\n\\(\\big\\lfloor\\frac{8}{3}d\\big\\rfloor =2.5d+\\big\\lfloor\\frac{d}{6}\\big\\rfloor\\).\nHence the left\u2013hand side of (1) never exceeds the right\u2013hand side,\nso even \\(d\\) never improves the greedy solution.\n\nFor odd \\(d=2k+1\\) we obtain \n\n\\[\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor\n =5k+2+{\\bf 1}_{\\{b\\ge5\\}},\\qquad\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor\n =5k+2+\\Big\\lfloor\\frac{k+2}{3}\\Big\\rfloor .\n\\]\n\nConsequently \n\n\\[\n\\Big\\lfloor2.5d+\\frac{b}{10}\\Big\\rfloor-\n\\Big\\lfloor\\frac{8}{3}d\\Big\\rfloor\n= {\\bf 1}_{\\{b\\ge5\\}}-\\Big\\lfloor\\frac{k+2}{3}\\Big\\rfloor .\n\\]\n\nThe right\u2011hand side is \\(\\ge 1\\) only when \\(k=0\\) (that is, \\(d=1\\))\nand \\(b\\ge5\\).\nThus the **only** way to improve upon the greedy solution is to\nreplace **exactly one** quarter and have \\(b\\ge5\\).\n\n--------------------------------------------------------------------\n\n**What does \\(b\\ge5\\) mean?**\n\nRecall \\(b\\) is the number of pennies left after taking all possible\nquarters and then all possible dimes. Hence\n\n\\[\nb = N-25q-10a\\in\\{0,1,\\dots ,9\\}.\n\\]\n\nThe condition \\(b\\ge5\\) is equivalent to\n\n\\[\nN-25q\\equiv 5,6,7,8,9\\pmod{10},\n\\]\n\nor, more simply,\n\n\\[\nN\\equiv 5,6,7,8,9\\pmod{25}.\n\\]\n\nIf \\(q=0\\) (i.e. \\(N<25\\)) there is no quarter to replace, so the greedy\nalgorithm is always optimal for \\(1\\le N\\le24\\).\n\nHence **the greedy algorithm fails exactly for the numbers**\n\n\\[\nN\\ge 25 \\quad\\text{with}\\quad N\\equiv 5,6,7,8,9\\pmod{25}.\n\\]\n\n--------------------------------------------------------------------\n\n**Counting the successes**\n\nAll integers \\(1\\le N\\le1000\\): 1000 of them.\n\nNumbers that cause failure:\n\n* The residues \\(5,6,7,8,9\\) each occur\n \\(\\bigl\\lfloor\\frac{1000-r}{25}\\bigr\\rfloor+1 = 40\\) times for\n \\(r=5,6,7,8,9\\).\n Hence \\(5\\times40=200\\) such numbers in \\([1,1000]\\).\n\n* The five smallest ones, \\(5,6,7,8,9\\), are \\(<25\\); they do **not**\n cause failure because no quarter can be replaced.\n\nThus the genuine failures are \\(200-5 = 195\\) numbers.\n\nConsequently the number of values for which the greedy algorithm\nsucceeds is \n\n\\[\n1000-195 = 805.\n\\]\n\n\\[\n\\boxed{805}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the vertices of the regular \\(24\\)-gon be labelled \n\n\\[\n0,1,2,\\dots ,23\\qquad (\\text{mod }24).\n\\]\n\nIf a segment connects vertex \\(i\\) to vertex \\(j\\) then its length is determined only by the\nstep \n\n\\[\nk\\equiv j-i\\pmod{24},\\qquad 1\\le k\\le 12 .\n\\]\n\nAll \\(12\\) segments must have the same length, therefore they all have the same step \\(k\\) (the\nstep \\(24-k\\) gives the same length, so it is enough to consider \\(k=1,2,\\dots ,12\\)).\n\n--------------------------------------------------------------------\n### 1. The graph for a fixed step \\(k\\)\n\nFor a fixed \\(k\\) join each vertex \\(i\\) with the two vertices\n\\(i\\pm k\\). The resulting graph \\(G_k\\) is a union of cycles:\n\n* Let \\(d=\\gcd(k,24)\\).\n* Each cycle has length \\(\\displaystyle L=\\frac{24}{d}\\) and there are \\(d\\) such\n cycles.\n\nIndeed the permutation \\(i\\mapsto i+k\\) on \\(\\{0,\\dots ,23\\}\\) consists of\n\\(d\\) cycles of length \\(L\\).\n\n--------------------------------------------------------------------\n### 2. Perfect matchings of \\(G_k\\)\n\nA required drawing is a perfect matching of \\(G_k\\).\n\n* If a cycle has even length, it has exactly **2** perfect matchings\n (alternating edges).\n* If a cycle has odd length, a perfect matching does **not** exist.\n* The only exceptional case is \\(k=12\\); then each vertex has only one\n neighbour (its opposite) and the whole graph is already a perfect\n matching.\n\nThus, for \\(k\\neq 12\\),\n\n\\[\n\\text{# matchings for }G_k=\n\\begin{cases}\n2^{\\,d} & \\text{if }L\\text{ is even},\\\\[2mm]\n0 & \\text{if }L\\text{ is odd}.\n\\end{cases}\n\\]\n\nSince \\(L\\) is odd exactly when \\(L=3\\), i.e. when \\(d=8\\) (the only such\n\\(k\\) is \\(k=8\\)), we have\n\n\\[\nN(k)=\n\\begin{cases}\n2^{\\gcd(k,24)} & \\gcd(k,24)\\neq 8,\\;k\\neq 12,\\\\[2mm]\n0 & k=8,\\\\[2mm]\n1 & k=12 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 3. Evaluate for \\(k=1,\\dots ,12\\)\n\n\\[\n\\begin{array}{c|c|c|c}\nk & \\gcd(k,24) & \\text{cycles} & N(k)\\\\ \\hline\n1 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n2 & 2 & 2\\ \\text{cycles of length }12 & 4\\\\\n3 & 3 & 3\\ \\text{cycles of length }8 & 8\\\\\n4 & 4 & 4\\ \\text{cycles of length }6 & 16\\\\\n5 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n6 & 6 & 6\\ \\text{cycles of length }4 & 64\\\\\n7 & 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n8 & 8 & 8\\ \\text{cycles of length }3 & 0\\\\\n9 & 3 & 3\\ \\text{cycles of length }8 & 8\\\\\n10& 2 & 2\\ \\text{cycles of length }12 & 4\\\\\n11& 1 & 1\\ \\text{cycle of length }24 & 2\\\\\n12&12 & 12\\ \\text{edges (pairs)} & 1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4. Sum over all possible lengths\n\n\\[\n\\begin{aligned}\n\\sum_{k=1}^{12} N(k)\n&=2+4+8+16+2+64+2+0+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{113}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a base \\(b>9\\),\n\n\\[\n17_{b}=1\\cdot b+7=b+7 ,\\qquad \n97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nLet \\(d=b+7\\;(>0)\\). Then \\(b=d-7\\) and\n\n\\[\n9b+7 = 9(d-7)+7 = 9d-56 .\n\\]\n\nHence \n\n\\[\nd \\mid (9d-56) \\Longrightarrow d\\mid 56 .\n\\]\n\nSo \\(d\\) must be a positive divisor of \\(56\\). \nSince \\(b>9\\), we have \\(d=b+7>9+7=16\\). \nThe divisors of \\(56\\) larger than \\(16\\) are\n\n\\[\nd=28,\\;56 .\n\\]\n\nCorresponding bases are \n\n\\[\nb=d-7:\n\\begin{cases}\nd=28 \\Rightarrow b=21,\\\\[2mm]\nd=56 \\Rightarrow b=49.\n\\end{cases}\n\\]\n\nBoth satisfy \\(b>9\\) and indeed \n\n\\[\n\\frac{9b+7}{b+7}=7\\;(b=21),\\qquad \n\\frac{9b+7}{b+7}=8\\;(b=49).\n\\]\n\nThus the integer bases are \\(b=21\\) and \\(b=49\\). Their sum is \n\n\\[\n21+49=70.\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Overview**\n\nThe circle through the midpoints \\(D,E,F\\) of the sides of \\(\\triangle ABC\\) is the **nine\u2011point circle** of \\(\\triangle ABC\\).\nHence \n\n* \\(D,E,F\\) are the vertices of the medial triangle,\n* \\(\\angle D= \\angle A=84^{\\circ},\\ \\angle E= \\angle B=60^{\\circ},\\ \\angle F=\\angle C=36^{\\circ}\\).\n\nSince the nine\u2011point circle is the circumcircle of \\(\\triangle DEF\\),\n\n\\[\n\\widehat{DE}=2\\angle F=2\\cdot 36^{\\circ}=72^{\\circ}.\n\\tag{1}\n\\]\n\nWe must also determine the arcs \\(\\widehat{FG}\\) and \\(\\widehat{HJ}\\).\n\n---------------------------------------------------------------------\n\n### 1. The arc \\(\\widehat{FG}\\)\n\n\\(G\\) is the second intersection of the median \\(BD\\) with the nine\u2011point circle.\nAt point \\(D\\) the chord \\(DG\\) lies on the line \\(BD\\), while the chord \\(DF\\) is parallel to side \\(AC\\) (mid\u2011segment theorem).\n\nTherefore \n\n\\[\n\\angle FDG=\\angle(\\text{line } DF,\\text{line } DG)\n =\\angle(\\,AC ,\\,BD\\,).\n\\]\n\nThe angle between side \\(AC\\) and the median from \\(B\\) can be read directly from the triangle:\n\\( \\angle(\\,AC ,\\,BD\\,)=\\angle C=36^{\\circ}\\).\n\nConsequently \n\n\\[\n\\widehat{FG}=2\\angle FDG=2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n### 2. The arc \\(\\widehat{HJ}\\)\n\n\\(H\\) and \\(J\\) are the second intersections of the sides \\(AC\\) and \\(AB\\) with the nine\u2011point circle.\nThus the two secants through the exterior point \\(A\\) intersect the circle at the pairs \\(\\{F,J\\}\\) and \\(\\{E,H\\}\\).\n\nFor an exterior point the angle formed by two secants equals half the **difference** of the intercepted arcs:\n\n\\[\n\\angle BAC=\\frac12\\bigl(\\widehat{JH}-\\widehat{FE}\\bigr).\n\\tag{3}\n\\]\n\nWe already know the arc \\(\\widehat{FE}\\) of the nine\u2011point circle:\n\\[\n\\widehat{FE}=2\\angle D =2\\cdot 84^{\\circ}=168^{\\circ}.\n\\tag{4}\n\\]\n\nPlugging \\(\\angle BAC=84^{\\circ}\\) and (4) into (3) gives \n\n\\[\n84^{\\circ}=\\frac12\\bigl(\\widehat{JH}-168^{\\circ}\\bigr)\n\\Longrightarrow \\widehat{JH}=336^{\\circ}.\n\\]\n\nThe **minor** arc \\(HJ\\) is the complement of \\(336^{\\circ}\\) on the circle:\n\n\\[\n\\widehat{HJ}=360^{\\circ}-336^{\\circ}=24^{\\circ}.\n\\tag{5}\n\\]\n\n---------------------------------------------------------------------\n\n### 3. Computing the required sum\n\nFrom (1), (2) and (5)\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ} \\\\\n&=72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\\n&=336^{\\circ}.\n\\end{aligned}\n\\]\n\n---------------------------------------------------------------------\n\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The nine players are distinct, so for a given triple \\((c,v,s)\\) (numbers of chocolate, vanilla, and strawberry cones) the number of assignments is \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nWe must count all triples of positive integers satisfying \n\n\\[\nc+v+s = 9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### Find the possible triples \\((c,v,s)\\)\n\nBecause the three numbers are distinct and sum to 9, we list the partitions of 9 into three distinct positive parts:\n\n\\[\n\\begin{aligned}\n9 &= 6+2+1,\\\\\n9 &= 5+3+1,\\\\\n9 &= 4+3+2 .\n\\end{aligned}\n\\]\n\nThese are the only triples with strict descending order, so \n\n\\[\n(c,v,s) \\in \\{(6,2,1),\\;(5,3,1),\\;(4,3,2)\\}.\n\\]\n\n---\n\n### Count assignments for each triple\n\n\\[\n\\begin{aligned}\n(6,2,1):\\quad &\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):\\quad &\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):\\quad &\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### Total number of assignments\n\n\\[\nN = 252 + 504 + 1260 = 2016.\n\\]\n\n---\n\n### Remainder modulo \\(1000\\)\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1. What determines the number of regions?** \n\nIf we draw line\u2011segments in a disc and no three of them meet in a common interior point, then each new segment splits one existing region for every interior intersection it makes, plus one more region for the segment itself. \nHence \n\n\\[\n\\#\\text{regions}=1+(\\#\\text{segments})+(\\#\\text{interior intersection points}).\n\\]\n\nWe have \n\n* 2 diameters,\n* 25 random chords,\n* total segments \\(=27\\).\n\nSo we need the **expected number of interior intersections**.\n\n---------------------------------------------------------------------\n\n**Step 2. Intersections that are certain**\n\nThe two diameters intersect at the centre \u21d2 one interior intersection.\n\n---------------------------------------------------------------------\n\n**Step 3. Intersections of a chord with the diameters**\n\nA chord is drawn by picking two points on the circle that lie in **different quadrants**.\n\n*If the two quadrants are adjacent* (e.g. quadrant\u202fI and\u202fII), the chord crosses **exactly one** diameter. \n*If the two quadrants are opposite* (e.g. quadrant\u202fI and\u202fIII), the chord crosses **both** diameters.\n\nThe unordered pair of distinct quadrants is uniformly chosen among the \\(\\binom{4}{2}=6\\) possibilities:\n\n* 4 adjacent pairs\u2003\u2192\u2003probability \\(4/6=2/3\\);\n* 2 opposite pairs\u2003\u2192\u2003probability \\(2/6=1/3\\).\n\nHence for one random chord\n\n\\[\nE[\\hbox{diameter\u2011intersections}]\n =\\frac23\\cdot1+\\frac13\\cdot2=\\frac43 .\n\\]\n\nFor the 25 chords \n\n\\[\nE[I_{\\text{chord\u2013diameter}}]=25\\cdot\\frac43=\\frac{100}{3}.\n\\]\n\n---------------------------------------------------------------------\n\n**Step 4. Intersections between two random chords**\n\nLet the two chords be \\(AB\\) and \\(CD\\). \nWrite \\(L\\) for the clockwise length of the arc from \\(A\\) to \\(B\\) (so \\(0\\le L\\le2\\pi\\)). \nLet \\(L_i^{(1)}\\) be the length of that arc inside quadrant \\(i\\) (\\(i=1,\\dots ,4\\)), and\n\\(L_i^{(2)}=\\frac{\\pi}{2}-L_i^{(1)}\\) the length of the complementary arc inside the same quadrant.\n\nFor a given chord \\(AB\\)\n\n* the probability that a random chord \\(CD\\) meets \\(AB\\) **and** has its endpoints in different quadrants is \n\n\\[\np_{\\text{int}}(A,B)=\n\\frac{L(2\\pi-L)-\\displaystyle\\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)}}{2\\pi^{2}} .\n\\tag{1}\n\\]\n\n(The numerator is the area of the product set\n\\(\\{(C,D):C\\in\\text{arc}_1,D\\in\\text{arc}_2\\}\\) minus the part where \\(C\\) and \\(D\\) fall in the same quadrant.)\n\nDefine \n\n\\[\nQ(A,B)=L(2\\pi-L)-\\sum_{i=1}^{4}L_i^{(1)}L_i^{(2)} .\n\\]\n\nThen \\(p_{\\text{int}}(A,B)=Q(A,B)/(2\\pi^{2})\\).\n\n---------------------------------------------------------------------\n\n**Step 5. Averaging \\(Q\\)** \n\nPut the circle\u2019s total length as \\(4d\\) with a quadrant length \\(d=\\pi/2\\).\nWrite the clockwise length as a multiple of \\(d\\): \\(t=L/d\\in[0,4]\\).\n\nFor a fixed \\(t\\) and a uniformly random starting point of the arc,\nthe expected value of \\(\\sum_i (L_i^{(1)})^{2}\\) (the sum of squares of the pieces of the arc) is\n\n\\[\nh(t)=\n\\begin{cases}\nt^{2}-\\dfrac{t^{3}}{3}, & 0\\le t\\le 1,\\\\[4pt]\nt-\\dfrac13, & 1\\le t\\le 4 .\n\\end{cases}\n\\]\n\nConsequently \n\n\\[\nE\\!\\left[\\sum_i L_i^{(1)}L_i^{(2)}\\right]\n =\\frac{\\pi}{2}E[L]-E\\!\\left[\\sum_i(L_i^{(1)})^{2}\\right]\n =\\frac{\\pi^{2}}{2}-\\frac{27\\pi^{2}}{64}\n =\\frac{5\\pi^{2}}{64}.\n\\]\n\nFrom this we obtain the unconditional expectation\n\n\\[\nE[Q]=E\\!\\bigl[L(2\\pi-L)\\bigr]-E\\!\\Bigl[\\sum_i L_i^{(1)}L_i^{(2)}\\Bigr]\n =\\frac{2}{3}\\pi^{2}-\\frac{5}{64}\\pi^{2}\n =\\frac{113}{192}\\pi^{2}.\n\\tag{2}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 6. Conditioning on \u201cdifferent quadrants\u2019\u2019 for the first chord**\n\nIf the first chord\u2019s endpoints lie in the *same* quadrant (probability \\(1/4\\)),\nthen \\(Q\\) simplifies to \\(Q=\\frac{3\\pi}{2}L\\). \nBecause the absolute difference of two points inside a quadrant has mean \\(d/3=\\pi/6\\),\n\n\\[\nE[Q\\mid\\text{same quadrant}]=\\frac{3\\pi}{2}\\cdot\\frac{\\pi}{6}\n =\\frac{\\pi^{2}}{4}.\n\\]\n\nHence \n\n\\[\nE[Q\\;{\\bf 1}_{\\text{different quadrants}}]\n =E[Q]-\\frac14\\cdot\\frac{\\pi^{2}}{4}\n =\\frac{113}{192}\\pi^{2}-\\frac{\\pi^{2}}{16}\n =\\frac{101}{192}\\pi^{2}. \\tag{3}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 7. Probability that two *valid* chords intersect**\n\nFrom (1) and (3),\n\n\\[\n\\boxed{\nP(\\text{intersection } \\&\\; AB\\text{ valid}\\; \\&\\; CD\\text{ valid})\n =\\frac{E[Q\\,{\\bf 1}_{\\text{different quadrants}}]}{2\\pi^{2}}\n =\\frac{101}{384}.\n}\n\\]\n\nThe event \u201cboth chords are valid\u2019\u2019 occurs with probability \\((3/4)^{2}=9/16\\). \nTherefore the conditional probability that two random valid chords intersect is\n\n\\[\nP_{\\text{int}}=\n\\frac{101/384}{9/16}= \\frac{101}{216}\\approx0.4676.\n\\tag{4}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 8. Expected number of chord\u2013chord intersections**\n\n\\[\nE[I_{\\text{chord\u2013chord}}]\n =\\binom{25}{2}\\;P_{\\text{int}}\n =300\\cdot\\frac{101}{216}\n =\\frac{2525}{18}.\n\\]\n\n---------------------------------------------------------------------\n\n**Step 9. Total expected interior intersections**\n\n\\[\n\\begin{aligned}\nE[I] &=\n\\underbrace{1}_{\\text{diameters}}+\n\\underbrace{\\frac{100}{3}}_{\\text{chord\u2013diameter}}+\n\\underbrace{\\frac{2525}{18}}_{\\text{chord\u2013chord}} \\\\[4pt]\n&= \\frac{18+600+2525}{18}\n =\\frac{3143}{18}.\n\\end{aligned}\n\\]\n\n---------------------------------------------------------------------\n\n**Step 10. Expected number of regions**\n\n\\[\n\\begin{aligned}\nE[\\#\\text{regions}]\n&=1+(\\#\\text{segments})+E[I] \\\\\n&=1+27+\\frac{3143}{18}\\\\[4pt]\n&=28+\\frac{3143}{18}\n =\\frac{504+3143}{18}\n =\\boxed{\\frac{3647}{18}}\\; \\approx 202.6 .\n\\end{aligned}\n\\]\n\nThus, on average Alex\u2019s 27 line segments partition the disk into \\(\\displaystyle \\frac{3647}{18}\\) regions.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\n---\n\n### 1. Factor the quadratic \n\nLook for integers \\(a,b,c,d\\) such that \n\n\\[\n(ax+by)(cx+dy)=12x^{2}-xy-6y^{2}.\n\\]\n\nWe need \n\n\\[\nac=12,\\qquad bd=-6,\\qquad ad+bc=-1 .\n\\]\n\nTaking \\(a=4,\\;c=3\\) (since \\(4\\cdot 3=12\\)) and trying \\(b=-3,\\;d=2\\) gives \n\n\\[\nbd=(-3)(2)=-6,\\qquad ad+bc=4\\cdot2+3\\cdot(-3)=8-9=-1.\n\\]\n\nHence \n\n\\[\n12x^{2}-xy-6y^{2}=(4x-3y)(3x+2y).\n\\]\n\nSo the original equation is equivalent to \n\n\\[\n(4x-3y)(3x+2y)=0.\n\\]\n\nThus any integer solution must satisfy one of the two linear equations \n\n\\[\n\\boxed{4x-3y=0}\\qquad\\text{or}\\qquad\\boxed{3x+2y=0}.\n\\]\n\n---\n\n### 2. Solve each linear equation in integers \n\n**(i) \\(4x-3y=0\\).** \n\n\\(4x=3y\\Rightarrow y= \\frac{4}{3}x\\). \nSince \\(\\gcd(4,3)=1\\), write \\(x=3k,\\;y=4k\\) for some integer \\(k\\).\n\nBoth coordinates must satisfy \\(-100\\le x,y\\le 100\\):\n\n\\[\n-100\\le 3k\\le 100 \\Longrightarrow -\\frac{100}{3}\\le k\\le \\frac{100}{3},\n\\qquad\n-100\\le 4k\\le 100 \\Longrightarrow -25\\le k\\le 25.\n\\]\n\nThe tighter bound is \\(-25\\le k\\le 25\\). \nHence there are \n\n\\[\n25-(-25)+1 = 51\n\\]\n\nsolutions from this family.\n\n---\n\n**(ii) \\(3x+2y=0\\).** \n\n\\(3x=-2y\\Rightarrow x=-\\frac{2}{3}y\\). \nAgain \\(\\gcd(3,2)=1\\), so write \\(y=3m,\\;x=-2m\\) for some integer \\(m\\).\n\nBounds:\n\n\\[\n-100\\le -2m\\le 100 \\Longrightarrow -50\\le m\\le 50,\n\\qquad\n-100\\le 3m\\le 100 \\Longrightarrow -\\frac{100}{3}\\le m\\le \\frac{100}{3}\n\\Longrightarrow -33\\le m\\le 33.\n\\]\n\nThus \\(-33\\le m\\le 33\\), giving \n\n\\[\n33-(-33)+1 = 67\n\\]\n\nsolutions from this family.\n\n---\n\n### 3. Remove the double\u2011counted solution \n\nThe two families intersect only when both equations hold, i.e. when \n\n\\[\n4x-3y=0\\;\\text{and}\\;3x+2y=0\\Longrightarrow (x,y)=(0,0).\n\\]\n\nSo \\((0,0)\\) has been counted twice. \n\nTotal distinct ordered pairs:\n\n\\[\n51+67-1 = 117.\n\\]\n\n---\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nwith \\(\\angle A=90^{\\circ}\\) and \\(BC=38\\Rightarrow b^{2}+c^{2}=38^{2}=1444\\).\n\n---\n\n### 1. Locating \\(K\\) and \\(L\\)\n\n\\(AK=BK=14\\). \nThe circles \\(\\odot(A,14)\\) and \\(\\odot(B,14)\\) intersect at the interior point \n\n\\[\nK=\\Bigl(\\frac b2,\\; \\sqrt{196-\\Bigl(\\frac b2\\Bigr)^2}\\Bigr).\n\\]\n\nSimilarly \\(AL=CL=14\\) gives \n\n\\[\nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^2},\\; \\frac c2\\Bigr).\n\\]\n\nSince \\(AK=AL=KL=14\\), points \\(A,K,L\\) form an equilateral triangle.\nPut \n\n\\[\nK=(14\\cos\\theta,14\\sin\\theta),\\qquad \nL=(14\\cos(\\theta+60^\\circ),14\\sin(\\theta+60^\\circ)).\n\\]\n\nUsing \\(BK=14\\) and \\(CL=14\\),\n\n\\[\nb=28\\cos\\theta,\\qquad c=28\\sin(\\theta+60^\\circ). \\tag{1}\n\\]\n\n---\n\n### 2. Determining \\(\\theta\\)\n\nFrom \\(b^2+c^2=1444\\),\n\n\\[\n\\cos^{2}\\theta+\\sin^{2}(\\theta+60^\\circ)=\\frac{1444}{28^{2}}\n =\\frac{361}{196}=\\Bigl(\\frac{19}{14}\\Bigr)^{2}.\n\\]\n\nUsing \\(\\cos^2x=\\frac{1+\\cos2x}{2},\\ \\sin^2x=\\frac{1-\\cos2x}{2}\\),\n\n\\[\n\\frac{2+\\cos2\\theta-\\cos(2\\theta+120^\\circ)}2\n =\\frac{361}{196}.\n\\]\n\nSimplifying gives \n\n\\[\n\\cos2\\theta-\\cos(2\\theta+120^\\circ)=\\frac{165}{98}.\n\\]\n\nSince \\(\\cos A-\\cos B=-2\\sin\\frac{A+B}{2}\\sin\\frac{A-B}{2}\\),\n\n\\[\n\\sqrt3\\sin(2\\theta+60^\\circ)=\\frac{165}{98}\n \\Longrightarrow \\sin(2\\theta+60^\\circ)=\\frac{55\\sqrt3}{98}.\n\\]\n\nHence \n\n\\[\n\\cos(2\\theta+60^\\circ)=\\frac{23}{98},\\qquad \n\\sin(2\\theta+60^\\circ)=\\frac{55\\sqrt3}{98}.\n\\]\n\nLet \\(\\phi=2\\theta+60^\\circ\\). Then\n\n\\[\n\\cos\\phi=\\frac{23}{98},\\qquad \\sin\\phi=\\frac{55\\sqrt3}{98}.\n\\]\n\nCompute \\(\\cos(\\phi-60^\\circ)\\) and \\(\\cos(\\phi+60^\\circ)\\):\n\n\\[\n\\cos(\\phi-60^\\circ)=\\frac{47}{49},\\qquad\n\\cos(\\phi+60^\\circ)=-\\frac{71}{98}.\n\\]\n\nNow\n\n\\[\n\\cos\\theta=\\sqrt{\\frac{1+\\cos(\\phi-60^\\circ)}2}\n =\\sqrt{\\frac{1+\\frac{47}{49}}2}\n =\\sqrt{\\frac{48}{49}}=\\frac{4\\sqrt3}{7},\n\\]\n\n\\[\n\\sin(\\theta+60^\\circ)=\\sqrt{\\frac{1-\\cos(\\phi+60^\\circ)}2}\n =\\sqrt{\\frac{1+\\frac{71}{98}}2}\n =\\sqrt{\\frac{169}{196}}=\\frac{13}{14}.\n\\]\n\nUsing (1),\n\n\\[\nb=28\\cos\\theta=28\\cdot\\frac{4\\sqrt3}{7}=16\\sqrt3,\n\\qquad\nc=28\\sin(\\theta+60^\\circ)=28\\cdot\\frac{13}{14}=26.\n\\]\n\nThus \n\n\\[\nAB=16\\sqrt3,\\qquad AC=26,\\qquad BC=38.\n\\]\n\nConsequently \n\n\\[\nK=\\Bigl(\\frac{b}{2},\\sqrt{196-\\Bigl(\\frac b2\\Bigr)^2}\\Bigr)\n =\\bigl(8\\sqrt3,\\;2\\bigr),\\qquad\nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^2},\\frac c2\\Bigr)\n =\\bigl(3\\sqrt3,\\;13\\bigr).\n\\]\n\n---\n\n### 3. Area of \\(BKLC\\)\n\nUsing the shoelace formula for vertices \n\n\\[\nB=(16\\sqrt3,0),\\; K=(8\\sqrt3,2),\\; L=(3\\sqrt3,13),\\; C=(0,26),\n\\]\n\n\\[\n\\begin{aligned}\n\\sum x_iy_{i+1}&=16\\sqrt3\\cdot2+8\\sqrt3\\cdot13+3\\sqrt3\\cdot26+0\\cdot0\\\\\n &=214\\sqrt3,\\\\[2mm]\n\\sum y_ix_{i+1}&=0\\cdot8\\sqrt3+2\\cdot3\\sqrt3+13\\cdot0+26\\cdot16\\sqrt3\\\\\n &=422\\sqrt3.\n\\end{aligned}\n\\]\n\nHence\n\n\\[\n\\text{Area}(BKLC)=\\frac12|214\\sqrt3-422\\sqrt3|=104\\sqrt3.\n\\]\n\n---\n\nThus the area of \\(BKLC\\) is \\(104\\sqrt3\\), so \n\n\\[\n\\boxed{104}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid have parallel sides (bases) \\(r\\) and \\(s\\) \\((r\\neq s)\\), the equal legs \\(L\\), and height \\(h\\).\n\n---\n\n### 1. Height from the incircle \n\nThe circle of radius \\(3\\) is tangent to the two parallel sides, so the distance between those sides equals the sum of the distances from the centre to each side:\n\n\\[\nh = 3+3 = 6 .\n\\]\n\n---\n\n### 2. Sum of the bases from the area \n\n\\[\n\\text{Area}= \\frac{r+s}{2}\\,h = 72\n\\quad\\Longrightarrow\\quad\n\\frac{r+s}{2}\\cdot 6 = 72 \\implies r+s = 24 .\n\\]\n\n---\n\n### 3. Relation of the legs (tangential quadrilateral) \n\nA quadrilateral has an incircle iff the sums of opposite sides are equal. \nFor the trapezoid the opposite sides are the two bases and the two legs, so\n\n\\[\nr+s = L+L \\;\\Longrightarrow\\; L =\\frac{r+s}{2}=12 .\n\\]\n\nThus each leg has length \\(L=12\\).\n\n---\n\n### 4. Difference of the bases from the leg length \n\nBecause the trapezoid is isosceles, each leg together with the height forms a right triangle whose horizontal leg is \\(\\dfrac{|s-r|}{2}\\):\n\n\\[\nL^{2}=h^{2}+ \\left(\\frac{s-r}{2}\\right)^{2}.\n\\]\n\nInsert \\(L=12,\\;h=6\\):\n\n\\[\n12^{2}=6^{2}+ \\left(\\frac{s-r}{2}\\right)^{2}\n\\Longrightarrow 144-36 = \\left(\\frac{s-r}{2}\\right)^{2}\n\\Longrightarrow \\left(\\frac{s-r}{2}\\right)^{2}=108.\n\\]\n\nHence \n\n\\[\n|s-r| = 2\\sqrt{108}=12\\sqrt3 .\n\\]\n\nAssume \\(s>r\\); then \\(s-r=12\\sqrt3\\).\n\n---\n\n### 5. Solve for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s = 24,\\\\\ns-r = 12\\sqrt3.\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\ns &= 12+6\\sqrt3,\\\\\nr &= 12-6\\sqrt3.\n\\end{aligned}\n\\]\n\n---\n\n### 6. Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2} &= (12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2} \\\\\n&= \\bigl(144-144\\sqrt3+108\\bigr)+\\bigl(144+144\\sqrt3+108\\bigr) \\\\\n&= 252-144\\sqrt3+252+144\\sqrt3 \\\\\n&= 504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For an 8\u2011digit number using each of the digits \\(1,2,\\dots ,8\\) exactly once \n\n\\[\n22=2\\cdot11\n\\]\n\nso the number must be divisible by \\(2\\) **and** by \\(11\\).\n\n---\n\n### 1. Divisibility by \\(2\\)\n\nThe units digit must be even, i.e. one of \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2. Divisibility by \\(11\\)\n\nFor an 8\u2011digit number \\(a_1a_2\\ldots a_8\\),\n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv 0\\pmod{11}.\n\\]\n\nLet \n\n\\[\nS_{\\text{odd}}=a_1+a_3+a_5+a_7,\\qquad \nS_{\\text{even}}=a_2+a_4+a_6+a_8 .\n\\]\n\nSince the digits \\(1\\) through \\(8\\) sum to \\(36\\),\n\n\\[\nS_{\\text{odd}}+S_{\\text{even}}=36\\qquad\\text{and}\\qquad \nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nThus \n\n\\[\n2S_{\\text{odd}}\\equiv36\\equiv3\\pmod{11}\\Longrightarrow\nS_{\\text{odd}}\\equiv7\\pmod{11}.\n\\]\n\nThe possible values of \\(S_{\\text{odd}}\\) (sum of four distinct digits from \\(1\\)\u2013\\(8\\)) lie between \\(10\\) and \\(26\\). \nThe only value in this interval congruent to \\(7\\pmod{11}\\) is \\(18\\).\n\nHence\n\n\\[\nS_{\\text{odd}}=S_{\\text{even}}=18 .\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 3. 4\u2011digit subsets with sum \\(18\\)\n\nAll 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\) are \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are exactly \\(8\\) such subsets. \nEach contains **exactly two even digits** (the even digits are \\(2,4,6,8\\)).\n\n---\n\n### 4. Arranging the digits\n\n* Choose one of the 8 subsets for the odd positions.\n* Permute its four digits among the odd places \\((1,3,5,7)\\) \u2013 \\(4! = 24\\) ways.\n* The remaining four digits occupy the even places \\((2,4,6,8)\\). \n\n The units place (position\u202f8) must be even. \n Since the complementary set also has exactly two even digits, we may\n \\[\n \\text{choose the even digit for position\u202f8 in }2\\text{ ways,}\n \\]\n then arrange the other three digits in positions \\(2,4,6\\) in \\(3! = 6\\) ways.\n\nHence for a given subset the number of valid permutations is \n\n\\[\n24 \\times (2 \\times 6)=24 \\times 12 = 288 .\n\\]\n\nWith \\(8\\) possible subsets,\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 5. Required difference\n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\ndescribes the circle \n\n\\[\n\\text{Center }C=(25,20),\\qquad\\text{radius }R=5 .\n\\]\n\nThe second equation \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nstates that the distance from \\(z\\) to the point \n\n\\[\nA=4+k\\;(=k+4+0i)\n\\]\n\nequals its distance to the point \n\n\\[\nB=3i+k\\;(=k+0i+3i).\n\\]\n\nHence the locus of points satisfying the second condition is the **perpendicular bisector** of the segment \\(\\overline{AB}\\).\n\n---\n\n### 1. Equation of the perpendicular bisector\n\nCoordinates:\n\n\\[\nA=(k+4,0),\\qquad B=(k,3).\n\\]\n\nMidpoint \n\n\\[\nM=\\Big(\\frac{k+4+k}{2},\\frac{0+3}{2}\\Big)=\\Big(k+2,\\frac32\\Big).\n\\]\n\nSlope of \\(\\overline{AB}\\):\n\n\\[\n\\frac{3-0}{k-(k+4)}=\\frac{3}{-4}=-\\frac34 .\n\\]\n\nTherefore the slope of the perpendicular bisector is the negative reciprocal,\n\n\\[\nm=\\frac{4}{3}.\n\\]\n\nUsing point\u2013slope form through \\(M\\):\n\n\\[\ny-\\frac32=\\frac{4}{3}(x-(k+2)).\n\\]\n\nMultiplying by \\(6\\),\n\n\\[\n6y-9=8x-8k-16\\qquad\\Longrightarrow\\qquad 8x-6y=8k+7.\n\\]\n\nThus the line is \n\n\\[\nL:\\;8x-6y=8k+7 .\n\\]\n\n---\n\n### 2. Tangency condition\n\nThe system has **exactly one** solution \\(z\\) when the line \\(L\\) is tangent to the circle. \nThe distance from the center \\(C=(25,20)\\) to \\(L\\) must equal the radius \\(5\\).\n\nFor a line \\(Ax+By+C=0\\), the distance from \\((x_0,y_0)\\) is \n\n\\[\nd=\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nWrite \\(L\\) as \\(8x-6y-(8k+7)=0\\). Then\n\n\\[\nd=\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^2+(-6)^2}}\n =\\frac{|200-120-8k-7|}{\\sqrt{64+36}}\n =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=R=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5 \\;\\Longrightarrow\\; |73-8k|=50 .\n\\]\n\nHence \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50.\n\\]\n\nSolving:\n\n\\[\n\\begin{aligned}\n73-8k=50 &\\Rightarrow 8k=23 \\Rightarrow k=\\frac{23}{8},\\\\[2mm]\n73-8k=-50 &\\Rightarrow 8k=123 \\Rightarrow k=\\frac{123}{8}.\n\\end{aligned}\n\\]\n\nBoth values give a line tangent to the circle, so the system has exactly one complex solution for each.\n\n---\n\n### 3. Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\;n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The recurrence \n\n\\[\nx_{k+1}= \\frac{1}{3}\\Bigl(x_k+\\frac{1}{x_k}-1\\Bigr)\n\\]\n\ncan be rewritten as \n\n\\[\nx_{k+1}= \\frac{x_k^2-x_k+1}{3x_k}.\n\\]\n\n---\n\n### 1. A convenient change of variables \n\nDefine \n\n\\[\nt_k=\\frac{2x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{b_k+a_k}{2b_k-a_k},\n\\]\n\nwhere \\(a_k,b_k\\) are integers defined below. \n\nFrom the definition \n\n\\[\nt_{k+1}=t_k\\bigl(t_k-1\\bigr),\\qquad t_1=\\frac{13}{12}.\n\\]\n\n---\n\n### 2. Integer sequences \n\nWrite \\(t_k=\\dfrac{a_k}{b_k}\\) in lowest terms. \nFrom \\(t_{k+1}=t_k(t_k-1)\\) we obtain \n\n\\[\na_{k+1}=a_k\\bigl(a_k-b_k\\bigr),\\qquad \nb_{k+1}=b_k^2,\\qquad a_1=13,\\;b_1=12 .\n\\]\n\nThus \n\n\\[\nb_k=12^{\\,2^{\\,k-1}} .\n\\]\n\nBecause \\(a_k\\) is always odd and not a multiple of \\(3\\), \\(\\gcd(a_k,b_k)=1\\) for all \\(k\\).\n\n---\n\n### 3. Expressing \\(x_k\\) \n\nUsing \\(x_k=\\dfrac{b_k+a_k}{2b_k-a_k}\\) we get \n\n\\[\nm_k=b_k+a_k,\\qquad n_k=2b_k-a_k,\n\\]\nso that \n\n\\[\nm_k+n_k = (b_k+a_k)+(2b_k-a_k)=3b_k .\n\\]\n\nHence for any \\(k\\),\n\n\\[\nm_k+n_k = 3\\cdot 12^{\\,2^{\\,k-1}} .\n\\]\n\n---\n\n### 4. The required term \n\nFor \\(k=2025\\),\n\n\\[\nm+n = 3\\cdot 12^{\\,2^{\\,2024}} .\n\\]\n\nWe need this number modulo \\(1000\\).\n\n---\n\n### 5. Computing \\(3\\cdot12^{2^{2024}}\\pmod{1000}\\)\n\nSince \\(1000=8\\cdot125\\), work modulo \\(8\\) and \\(125\\).\n\n*Modulo\u202f8*:\u2003\\(12\\equiv4\\pmod8\\) and \\(4^2\\equiv0\\pmod8\\); with exponent \\(2^{2024}>1\\),\n\n\\[\n12^{2^{2024}}\\equiv0\\pmod8\\Longrightarrow\n3\\cdot12^{2^{2024}}\\equiv0\\pmod8 .\n\\]\n\n*Modulo\u202f125*:\u2003\\(\\gcd(12,125)=1\\), \\(\\phi(125)=100\\). \nReduce the exponent modulo\u202f100:\n\n\\[\n2^{2024}\\equiv 2^{4}=16\\pmod{100}\n\\]\n(because \\(2^{2024}\\equiv16\\pmod{100}\\)). \nHence \n\n\\[\n12^{2^{2024}}\\equiv12^{16}\\pmod{125}.\n\\]\n\nCompute:\n\\[\n12^2\\equiv19,\\quad\n12^4\\equiv19^2\\equiv111,\\quad\n12^8\\equiv111^2\\equiv71,\\quad\n12^{16}\\equiv71^2\\equiv41\\pmod{125}.\n\\]\n\nThus \n\n\\[\n3\\cdot12^{2^{2024}}\\equiv3\\cdot41=123\\pmod{125}.\n\\]\n\nNow solve \n\n\\[\nR\\equiv0\\pmod8,\\qquad R\\equiv123\\pmod{125}.\n\\]\n\nWrite \\(R=125a+123\\). Mod\u202f8:\n\n\\[\n125a+123\\equiv5a+3\\equiv0\\pmod8\\Longrightarrow5a\\equiv5\\pmod8\n\\Longrightarrow a\\equiv1\\pmod8.\n\\]\n\nTake \\(a=1\\); then \\(R=125\\cdot1+123=248\\).\n\nHence \n\n\\[\nm+n\\equiv 248 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{248}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nAD=4,\\; DE=16,\\; EB=8,\\qquad AF=13,\\; FG=52,\\; GC=26 .\n\\]\n\nHence \n\n\\[\nAB=4+16+8=28,\\qquad AC=13+52+26=91 .\n\\]\n\n--------------------------------------------------------------------\n### 1. Coordinates\n\nPlace \\(A=(0,0),\\; B=(28,0)\\) and let the height of \\(\\triangle ABC\\) be \\(h\\). \nWrite \\(C=(x,h)\\) (the \\(x\\)\u2011coordinate is unknown).\n\nPoints on the sides are then \n\n\\[\n\\begin{aligned}\nD&=(4,0), &E&=(20,0), \\\\\nF&=\\Bigl(\\frac{13}{91}x,\\;\\frac{13}{91}h\\Bigr), &\nG&=\\Bigl(\\frac{65}{91}x,\\;\\frac{65}{91}h\\Bigr).\n\\end{aligned}\n\\]\n\nSince \\(M\\) is the reflection of \\(D\\) about \\(F\\),\n\n\\[\nM=2F-D=\\Bigl(\\frac{26}{91}x-4,\\;\\frac{26}{91}h\\Bigr),\n\\]\n\nand because \\(N\\) is the reflection of \\(G\\) about \\(E\\),\n\n\\[\nN=2E-G=\\Bigl(40-\\frac{65}{91}x,\\;-\\frac{65}{91}h\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 2. Height from the given area\n\nQuadrilateral \\(DEGF\\) consists of triangles \\(DEG\\) and \\(DFG\\). \nIts area is\n\n\\[\n\\begin{aligned}\n[DEGF]&=\\frac12\\Bigl[\\,DE\\cdot G_y\n +|\\,\\overrightarrow{DF}\\times\\overrightarrow{DG}\\,|\\,\\Bigr]\\\\[2mm]\n &=\\frac{h}{2\\cdot91}\\Bigl(16\\cdot65+4\\cdot52\\Bigr)\n =\\frac{1248}{182}\\,h\n =\\frac{624}{91}\\,h .\n\\end{aligned}\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n\\frac{624}{91}\\,h=288\\quad\\Longrightarrow\\quad h=42 .\n\\]\n\n--------------------------------------------------------------------\n### 3. Area of \\(\\triangle ABC\\)\n\n\\[\n[ABC]=\\frac12\\cdot AB\\cdot h\n =\\frac12\\cdot28\\cdot42\n =588 .\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of the heptagon \\(AFNBCEM\\)\n\nUse the shoelace formula with the vertices in the order \n\n\\[\nA,\\;F,\\;N,\\;B,\\;C,\\;E,\\;M .\n\\]\n\nBecause the \\(x\\)-coordinate \\(x\\) of \\(C\\) appears only in the\nterms \\(x\\,h\\) and they cancel each other, the sum reduces to \n\n\\[\n\\begin{aligned}\nS&=2\\bigl( -\\tfrac{2\\cdot13}{91} (4+16)h\n + (4+16+8)h\n + (4+16+8)h\n - (4+16)h \\bigr) \\\\\n &=2\\cdot 28h .\n\\end{aligned}\n\\]\n\nHence\n\n\\[\n[AFNBCEM]=\\frac12 S = \\frac12\\cdot28h = [ABC]=588 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The original parabola is \n\n\\[\ny=x^{2}-4 .\n\\]\n\nRotate it \\(60^{\\circ}\\) counter\u2011clockwise about the origin. \nIf \\((X,Y)\\) is a point on the rotated parabola, then rotating it back\n\\(60^{\\circ}\\) (clockwise) must put it on the original parabola:\n\n\\[\n\\begin{aligned}\nx &= X\\cos60^{\\circ}+Y\\sin60^{\\circ},\\\\\ny &=-X\\sin60^{\\circ}+Y\\cos60^{\\circ},\n\\end{aligned}\n\\qquad\\text{with }\\;y=x^{2}-4 .\n\\]\n\nUsing \\(\\cos60^{\\circ}= \\tfrac12,\\; \\sin60^{\\circ}= \\tfrac{\\sqrt3}{2}\\),\n\n\\[\n-\\,\\frac{\\sqrt3}{2}X+\\frac12Y= \\Bigl(\\frac12X+\\frac{\\sqrt3}{2}Y\\Bigr)^{2}-4 .\n\\tag{1}\n\\]\n\nThe original parabola gives \\(Y=X^{2}-4\\). Substituting this into (1) and\nclearing denominators yields\n\n\\[\n3X^{4}+2\\sqrt3\\,X^{3}-25X^{2}-6\\sqrt3\\,X+40=0 .\n\\tag{2}\n\\]\n\nThe quartic factors over \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\bigl(X^{2}+\\sqrt3\\,X-4\\bigr)\\bigl(3X^{2}-\\sqrt3\\,X-10\\bigr)=0 .\n\\]\n\nHence the possible \\(X\\)-coordinates are the roots of the two quadratics.\n\n* From \\(X^{2}+\\sqrt3X-4=0\\) :\n\n\\[\nX=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\nThe positive root is \n\n\\[\nX_{0}= \\frac{-\\sqrt3+\\sqrt{19}}{2}\\approx1.31,\n\\]\n\nwhich satisfies \\(07\\):* then the smaller element of the \\(G\\)\u2013pair is \\(7\\). \nWe need that every other pair have its smaller element \\(\\le 6\\); i.e.\nall the other five \u201csmaller\u201d letters must lie in \\(\\{1,\\dots ,6\\}\\).\n\n*If \\(j<7\\):* then the smaller element of the \\(G\\)\u2013pair is \\(j\\). \nWe need that every other smaller element be \\(7\\) (five possibilities)** \n Here \\(j\\in\\{8,9,10,11,12\\}\\). \n We have \\(L=\\{1,\\dots ,6\\}\\;(l=6),\\ H=\\) the four other numbers \\(>7\\)\n \\((h=4)\\). \n\n \\[\n \\frac{\\binom{6}{4}4!\\,(6-4-1)!!}{945}\n =\\frac{15\\cdot24\\cdot1}{945}=\\frac{8}{21}.\n \\]\n\n* **\\(j=6\\)** \n Then \\(L=\\{1,\\dots ,5\\},\\ H=\\{8,9,10,11,12\\}\\) (\\(l=h=5\\)). \n\n \\[\n \\frac{\\binom{5}{5}5!\\,(5-5-1)!!}{945}\n =\\frac{5!}{945}=\\frac{120}{945}=\\frac{8}{63}.\n \\]\n\n* **\\(j=1,2,3,4,5\\)** \n In these cases \\(h>l\\); it is impossible to avoid an \\(H\\!-\\!H\\) pair,\n so the probability is \\(0\\).\n\n--------------------------------------------------------------------\n### 4. Assemble the total probability\n\nEach of the 11 possible partners of \\(G\\) is equally likely (\\(1/11\\)).\nTherefore\n\n\\[\n\\begin{aligned}\nP(\\text{last word contains }G)\n&= \\frac1{11}\\Bigl(5\\cdot\\frac{8}{21}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&= \\frac1{11}\\Bigl(\\frac{120}{63}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&= \\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\displaystyle\\frac{128}{693}\\) is already in lowest terms.\nHence \n\n\\[\nm=128,\\qquad n=693,\\qquad m+n=821.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nP(n)=3(n+3)(n^{2}+9).\n\\]\n\nWe need all positive integers \\(n\\) for which \n\n\\[\nn+2 \\mid P(n).\n\\]\n\n---\n\n### 1. Work modulo \\(n+2\\)\n\nWrite \\(n\\equiv -2 \\pmod{\\,n+2\\,}\\). \nReplace \\(n\\) by \\(-2\\) in the factors of \\(P(n)\\) (this gives the remainder of each factor modulo \\(n+2\\)):\n\n\\[\n\\begin{aligned}\nn+3 &\\equiv (-2)+3 = 1 \\pmod{n+2},\\\\[2mm]\nn^{2}+9 &\\equiv (-2)^{2}+9 = 4+9 = 13 \\pmod{n+2}.\n\\end{aligned}\n\\]\n\nHence\n\n\\[\nP(n)=3(n+3)(n^{2}+9)\\equiv 3\\cdot 1\\cdot 13 = 39\\pmod{n+2}.\n\\]\n\n---\n\n### 2. Condition for divisibility\n\nThe requirement \\(n+2\\mid P(n)\\) is equivalent to \n\n\\[\nP(n)\\equiv 0\\pmod{n+2}\\Longleftrightarrow 39\\equiv 0\\pmod{n+2}.\n\\]\n\nThus \n\n\\[\nn+2 \\text{ must be a positive divisor of } 39.\n\\]\n\nThe positive divisors of \\(39\\) are \n\n\\[\n1,\\;3,\\;13,\\;39.\n\\]\n\nSince \\(n\\) is a **positive** integer, \\(n+2\\ge 3\\). \nHence \\(n+2\\) can be only \\(3,\\;13,\\;39\\).\n\n---\n\n### 3. Corresponding values of \\(n\\)\n\n\\[\n\\begin{array}{c|c}\nn+2 & n \\\\ \\hline\n3 & 1\\\\\n13 & 11\\\\\n39 & 37\n\\end{array}\n\\]\n\nAll three satisfy the original condition (a quick check confirms divisibility).\n\n---\n\n### 4. Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "We place the six collinear points on the \\(x\\)-axis.\n\n---\n\n### 1. Determine the coordinates of \\(A,B,C,D,E,F\\)\n\nLet \\(A=(0,0)\\). \nWrite the distances in terms of the unknown coordinate \\(AB=x\\).\n\n\\[\n\\begin{aligned}\nC&: AC=26 \\quad\\Longrightarrow\\quad C=(26,0)\\\\\nB&: AB=x \\quad\\Longrightarrow\\quad B=(x,0)\\\\\nD&: BD=22 \\quad\\Longrightarrow\\quad D=(x+22,0)\\\\\nE&: CE=31 \\quad\\Longrightarrow\\quad E=(26+31,0)=(57,0)\\\\\nF&: DF=33 \\quad\\Longrightarrow\\quad F=(x+22+33,0)=(x+55,0)\\\\\n\\text{and }AF&=73 \\Longrightarrow x+55=73 .\n\\end{aligned}\n\\]\n\nHence \\(x=18\\). So \n\n\\[\nA=0,\\; B=18,\\; C=26,\\; D=40,\\; E=57,\\; F=73 .\n\\]\n\nThese satisfy all given segment lengths.\n\n---\n\n### 2. Locate point \\(G\\)\n\nLet \\(G=(u,v)\\) with \\(v\\neq 0\\). \nFrom the given distances\n\n\\[\n\\begin{cases}\n(u-26)^2+v^2 = 40^2 =1600,\\\\[2pt]\n(u-40)^2+v^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtract the second equation from the first:\n\n\\[\n(u-26)^2-(u-40)^2 = 700 .\n\\]\n\nExpanding,\n\n\\[\n(-52u+676)-(-80u+1600)=28u-924=700\n\\Longrightarrow 28u=1624\\Longrightarrow u=58 .\n\\]\n\nNow find \\(v\\):\n\n\\[\n(58-26)^2+v^2=1600\\Longrightarrow 32^2+v^2=1600\n\\Longrightarrow v^2=1600-1024=576 .\n\\]\n\nThus \\(|v|=24\\). Take \\(v=24\\) (the sign does not affect the area). \n\n\\[\n\\boxed{G=(58,24)} .\n\\]\n\n---\n\n### 3. Area of \\(\\triangle BGE\\)\n\nPoints on the \\(x\\)-axis:\n\n\\[\nB=(18,0),\\qquad E=(57,0).\n\\]\n\nThe length of the base \\(BE\\) is\n\n\\[\nBE = 57-18 = 39 .\n\\]\n\nSince the line through \\(B\\) and \\(E\\) is the \\(x\\)-axis, the perpendicular distance from \\(G\\) to this line is \\(|v|=24\\).\n\nHence\n\n\\[\n[\\triangle BGE]=\\frac12\\,(BE)\\cdot(\\text{height})\n =\\frac12\\cdot 39\\cdot 24\n =\\frac{936}{2}=468 .\n\\]\n\n(Using the determinant formula also gives \\(468\\).)\n\n---\n\n\\[\n\\boxed{468}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yzy,\\;x+y>76 \\quad\\text{(region }A_1)\\\\\n \\text{or}\\\\\n x75 \\quad\\text{(region }B_1)\\\\\n \\text{or}\\\\\n x>-1,\\;x+2y<75 \\quad\\text{(region }B_2)\n \\end{cases}\n \\]\n\nThe set of points satisfying both inequalities is the intersection of one of the\n\\(A_i\\) with one of the \\(B_j\\).\n\nChecking the four possibilities:\n\n* \\(A_1\\cap B_1=\\varnothing\\) (impossible to have \\(x>y\\) and \\(x<-1\\) while\n \\(x+y>76\\)).\n* \\(A_1\\cap B_2\\) is non\u2011empty and unbounded (e.g. \\(x>77\\)).\n* \\(A_2\\cap B_1\\) is non\u2011empty and unbounded (e.g. \\(x<-1\\)).\n* \\(A_2\\cap B_2\\) is bounded.\n\nThus there are three convex components: two infinite ones and one finite one,\nthe latter being \\(A_2\\cap B_2\\).\n\n---\n\n### 2. The finite region\n\n\\(A_2\\cap B_2\\) is described by \n\n\\[\n\\begin{cases}\nx>-1,\\\\\nxx\\) we obtain\n\n\\[\n-10,\\,h>0\\) are the half\u2011width and half\u2011height of the rectangle.\n\nAll four vertices satisfy the circle equation, giving the single relation \n\n\\[\nw^{2}+h^{2}=36\\tag{1}\n\\]\n\n(the rectangle\u2019s centre is the circle\u2019s centre \\(A\\)).\n\nBecause the point \\(C=(-15,0)\\) is farther to the right than to the left,\nthe condition \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u2019\u2019 forces\n\\(\\overline{GH}\\) to be the **left** side (\\(x=9-w\\)), which is already the case.\n\nSince \\(D=(9,-12)\\) lies below the centre, \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u2019\u2019 forces\n\\(\\overline{FG}\\) to be the **bottom** side (\\(y=-h\\)). This orientation matches the above labeling.\n\n---\n\n### 3. Areas of the two triangles \n\n*Triangle \\(DGF\\)* \n\nThe points are \\(D(9,-12),\\; G(9-w,-h),\\; F(9+w,-h)\\).\nIts base \\(GF\\) has length \\(2w\\) and its height (vertical distance from \\(D\\) to the base) is \\(12-h\\). \nHence \n\n\\[\n[\\,DGF\\,]=\\tfrac12\\,(2w)(12-h)=w(12-h).\\tag{2}\n\\]\n\n*Triangle \\(CHG\\)* \n\nThe points are \\(C(-15,0),\\; H(9-w,h),\\; G(9-w,-h)\\).\nIts base \\(HG\\) has length \\(2h\\) and its horizontal distance from \\(C\\) to the line \\(x=9-w\\) is\n\\(|-15-(9-w)|=24-w\\). \nThus \n\n\\[\n[\\,CHG\\,]=\\tfrac12\\,(2h)(24-w)=h(24-w).\\tag{3}\n\\]\n\nThe problem states the two areas are equal, so\n\n\\[\nw(12-h)=h(24-w).\\tag{4}\n\\]\n\nExpanding gives \\(12w-wh=24h-wh\\), whence \n\n\\[\n12w=24h \\qquad\\Longrightarrow\\qquad w=2h.\\tag{5}\n\\]\n\n---\n\n### 4. Solving for \\(w\\) and \\(h\\)\n\nSubstituting \\(w=2h\\) into (1):\n\n\\[\n(2h)^2+h^2=36 \\;\\Longrightarrow\\;5h^{2}=36 \\;\\Longrightarrow\\;\nh=\\frac{6}{\\sqrt5}=\\frac{6\\sqrt5}{5}.\n\\]\n\nHence \n\n\\[\nw=2h=\\frac{12}{\\sqrt5}=\\frac{12\\sqrt5}{5}.\n\\]\n\n---\n\n### 5. Area of the rectangle \n\nThe side lengths are \\(2w\\) and \\(2h\\). Therefore \n\n\\[\n\\text{Area}= (2w)(2h)=4wh.\n\\]\n\nUsing \\(w=2h\\),\n\n\\[\n4wh = 4(2h)h = 8h^{2}=8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nThus the area is \\(\\displaystyle\\frac{288}{5}\\); the numerator and denominator are coprime.\n\n\\[\nm=288,\\qquad n=5,\\qquad m+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The divisors of \\(2025\\) are all numbers of the form \n\n\\[\n3^{a}5^{b},\\qquad 0\\le a\\le 4,\\;0\\le b\\le 2 .\n\\]\n\nHence \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\nSo there are \\(2^{15}\\) subsets of \\(A\\) (including the empty set).\n\n--------------------------------------------------------------------\n### When does a subset have lcm \\(2025\\)?\n\nThe prime factorisation of \\(2025\\) is \n\n\\[\n2025 = 3^{4}\\,5^{2}.\n\\]\n\nFor a subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a_i}\\,5^{\\max b_i},\n\\]\n\nwhere \\((a_i,b_i)\\) are the exponents of the elements of \\(B\\).\nThus \\(\\operatorname{lcm}(B)=2025\\) iff \n\n* at least one element has exponent \\(a=4\\) (i.e. contains \\(3^4\\));\n* at least one element has exponent \\(b=2\\) (i.e. contains \\(5^2\\)).\n\n--------------------------------------------------------------------\n### Sets that provide the required exponents \n\n\\[\nA_4=\\{d\\in A:3^4\\mid d\\}=\\{3^4\\! \\cdot\\! 5^0,\\;3^4\\! \\cdot\\!5^1,\\;3^4\\! \\cdot\\!5^2\\}\n\\]\nhas \\(|A_4|=3\\) elements.\n\n\\[\nB_2=\\{d\\in A:5^2\\mid d\\}=\\{3^0\\! \\cdot\\!5^2,\\;3^1\\! \\cdot\\!5^2,\\;3^2\\! \\cdot\\!5^2,\n\\;3^3\\! \\cdot\\!5^2,\\;3^4\\! \\cdot\\!5^2\\}\n\\]\nhas \\(|B_2|=5\\) elements.\n\nTheir intersection is the single divisor \\(2025=3^4\\! \\cdot\\!5^2\\).\n\n--------------------------------------------------------------------\n### Counting the suitable subsets \n\nA subset \\(B\\) works iff it contains **at least one** element of \\(A_4\\) **and** at least one element of \\(B_2\\).\n\nUsing inclusion\u2013exclusion on the \\(2^{15}\\) total subsets:\n\n\\[\n\\begin{aligned}\nN &= 2^{15}\n -\\underbrace{2^{15-3}}_{\\text{subsets missing }A_4}\n -\\underbrace{2^{15-5}}_{\\text{subsets missing }B_2}\n +\\underbrace{2^{15-7}}_{\\text{subsets missing both}} \\\\[4pt]\n &= 2^{15}-2^{12}-2^{10}+2^{8}\\\\\n &= 32768-4096-1024+256\\\\\n &= 27904 .\n\\end{aligned}\n\\]\n\nThus the desired probability is \n\n\\[\n\\frac{N}{2^{15}}=\\frac{27904}{32768}\n =\\frac{109}{128}\\qquad(\\text{after cancelling }256).\n\\]\n\n--------------------------------------------------------------------\n### Answer \n\n\\(m=109,\\;n=128\\), so \n\n\\[\nm+n=109+128=237 .\n\\]\n\n\\[\n\\boxed{237}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1 \u2013 What we have to count**\n\nThe two perpendicular diameters are two line segments that intersect once, so after they are drawn the disk is divided into \n\n\\[\nF_0=4\\qquad\\text{regions}.\n\\]\n\nEvery time we draw a new segment, it splits each region it meets into two pieces. \nIf the new segment meets \\(k\\) already\u2011drawn segments in interior points, it creates \\(k+1\\) new regions. \n\nHence \n\n\\[\n\\boxed{\\text{# of regions}=1+\\#\\text{segments}+ \\#\\text{intersection points}}\n\\tag{1}\n\\]\n\n(the \u201c\\(1\\)\u201d is the original whole disk). \nWe have \\(27\\) segments in total (the 2 diameters + the 25 random chords). \nThus we only have to find the **expected number of intersection points**.\n\n--------------------------------------------------------------------\n\n**Step 2 \u2013 Intersections with the two diameters**\n\nFor a random chord we must choose its two endpoints in *different* quadrants.\nThe unordered pair of quadrants is equally likely among the \n\n\\[\n\\binom{4}{2}=6\n\\]\n\npossibilities. \n\n* Adjacent quadrants (four choices) \u2013 the chord meets **one** diameter. \n* Opposite quadrants (two choices) \u2013 the chord meets **both** diameters.\n\nTherefore for one random chord \n\n\\[\nE[\\text{diameters met}]\n=\\frac{4}{6}\\cdot1+\\frac{2}{6}\\cdot2=\\frac{4}{3}.\n\\]\n\nWith \\(N=25\\) random chords\n\n\\[\nE[\\text{intersections with the two diameters}]\n=N\\cdot\\frac{4}{3}= \\frac{100}{3}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3 \u2013 Intersection of two random chords**\n\nLet a chord be drawn. \nWrite its endpoints as angles measured from the positive \\(x\\)\u2013axis.\nBecause the two endpoints are in different quadrants, the unordered pair of\nquadrants is uniform among the six possibilities.\n\n*Probability that a second random chord meets the first.*\n\nLet the first chord be fixed. \nDenote by \\(I\\) the clockwise arc of the circle from its first endpoint to its\nsecond endpoint; let \\(|I|=L\\).\nIf a second chord has one endpoint in \\(I\\) and the other outside \\(I\\) the two\nchords intersect. \n\nWhen the second chord is chosen, its first endpoint \\(U\\) is uniform on the whole\ncircle, and its second endpoint \\(V\\) is uniform on the *three* quadrants that are\ndifferent from the quadrant of \\(U\\). \nA short calculation (integrating over the position of \\(U\\) inside \\(I\\))\ngives for a fixed chord\n\n\\[\n\\boxed{q=\\frac{L}{\\pi}-\\frac{2L^{2}}{3\\pi^{2}}\n +\\frac{2}{3\\pi^{2}}\\!\\int_{I}\\!|I\\cap Q(\\theta)|\\,d\\theta},\n\\tag{3}\n\\]\nwhere \\(Q(\\theta)\\) is the quadrant containing \\(\\theta\\).\n\nNow we average (3) over the possible positions of the first chord.\n\n*Adjac\u00adent quadrants.* \nThe arc \\(I\\) lies in exactly two quadrants; write its lengths in those\nquadrants as \\(L_{1},L_{2}\\) (\\(L=L_{1}+L_{2}\\)). \nThen \\(\\int_{I}|I\\cap Q|\\,d\\theta = L_{1}^{2}+L_{2}^{2}\\).\nWith \\(L_{1},L_{2}\\) independent and uniform on \\([0,\\pi/2]\\),\n\n\\[\nE[q\\mid\\text{adjacent}] = \\frac{5}{12}.\n\\]\n\n*Opposite quadrants.* \nNow \\(I\\) occupies three quadrants; let the lengths in the three\nquadrants be \\(u,\\,\\pi/2,\\,v\\) (\\(u,v\\) independent uniform on \\([0,\\pi/2]\\)). \nThen \\(\\int_{I}|I\\cap Q|\\,d\\theta = u^{2}+(\\pi/2)^{2}+v^{2}\\).\nAveraging gives\n\n\\[\nE[q\\mid\\text{opposite}] = \\frac{7}{12}.\n\\]\n\nThe first chord is adjacent with probability \\(\\frac{2}{3}\\) and opposite with\nprobability \\(\\frac13\\). Hence the probability that two independently drawn\nrandom chords intersect is\n\n\\[\np=\\frac{2}{3}\\cdot\\frac{5}{12}+\\frac{1}{3}\\cdot\\frac{7}{12}\n =\\frac{17}{36}.\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4 \u2013 Expected intersections among the 25 random chords**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of random chords, each\nintersecting with probability \\(p\\). Thus\n\n\\[\nE[\\text{intersections among the 25 chords}]\n=300\\cdot\\frac{17}{36}= \\frac{425}{3}.\n\\tag{5}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5 \u2013 Total expected number of intersection points**\n\nAdd all contributions:\n\n* one intersection of the two diameters,\n* intersections of random chords with the two diameters \\(\\displaystyle\\frac{100}{3}\\) (from (2)),\n* intersections among the random chords \\(\\displaystyle\\frac{425}{3}\\) (from (5)).\n\n\\[\nE[\\text{total intersections}]\n=1+\\frac{100}{3}+\\frac{425}{3}=1+\\frac{525}{3}=176.\n\\tag{6}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 6 \u2013 Expected number of regions**\n\nInsert (6) into formula (1):\n\n\\[\nE[\\text{regions}]\n=1+\\underbrace{27}_{\\text{segments}}+\\underbrace{176}_{\\text{intersection points}}\n=204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The zeros of \n\n\\[\nf(x)=\\sin\\bigl(7\\pi\\sin(5x)\\bigr)\n\\]\n\nsatisfy \n\n\\[\n\\sin\\bigl(7\\pi\\sin(5x)\\bigr)=0\\Longrightarrow 7\\pi\\sin(5x)=k\\pi,\\qquad k\\in\\mathbb Z .\n\\]\n\nHence \n\n\\[\n\\sin (5x)=\\frac{k}{7},\\qquad -7\\le k\\le 7 .\n\\]\n\n---\n\n### 1. Counting all zeros \\(n\\)\n\nPut \\(\\theta =5x\\). \nBecause \\(00\\) and \\(k\\le a\\).\n\n--------------------------------------------------------------------\n### 2. When can \\(\\Delta(k)>0\\)?\n\nFor any integer \\(k\\),\n\n\\[\n\\Big\\lfloor2.5k\\Big\\rfloor=\n\\frac{5k-(k\\bmod2)}{2}.\n\\]\n\nHence \n\n\\[\n\\Delta(k)= -\\frac{3k+9(k\\bmod2)}{2}+9\\delta ,\n\\quad\\text{where }\\delta=\n\\begin{cases}\n1,&\\alpha\\ge 1-\\{2.5k\\},\\\\\n0,&\\text{otherwise}.\n\\end{cases}\n\\]\n\nThe term \\(-\\frac{3k+9(k\\bmod2)}{2}\\) is negative for all \\(k\\ge1\\).\nThe only way \\(\\Delta(k)\\) can become positive is when \\(\\delta=1\\).\n\n*If \\(k\\) is even*, \\(\\{2.5k\\}=0\\); thus \\(\\alpha<1\\) never makes \\(\\delta=1\\).\nHence \\(\\Delta(k)\\le0\\) for all even \\(k\\).\n\n*If \\(k\\) is odd*, \\(\\{2.5k\\}=0.5\\). \nThen \\(\\delta=1\\) exactly when \\(\\alpha\\ge 0.5\\), i.e. when \\(r\\ge5\\) (the remainder of \\(b\\) modulo \\(10\\) is at least \\(5\\)).\n\nFor odd \\(k\\ge3\\) we have \n\n\\[\n\\Delta(k)=-9+9\\delta\\le0,\n\\]\n\nso no improvement occurs. \n\nFor \\(k=1\\),\n\n\\[\n\\Delta(1)= -6+9\\delta,\n\\]\n\nwhich is positive precisely when \\(\\delta=1\\); that is, when \\(r\\ge5\\).\n\nConsequently **the greedy algorithm fails exactly when**\n\n* \\(N\\ge25\\) (so at least one quarter is used), and\n* the remainder \\(b=N\\bmod25\\) satisfies \\(b\\bmod10\\ge5\\).\n\nIn terms of residues modulo \\(25\\) this means\n\n\\[\nb\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n### 3. Counting the failures\n\nFrom \\(1\\) to \\(1000\\):\n\n* For \\(N<25\\) the greedy algorithm is always optimal (no quarters are used).\n* For each complete block of \\(25\\) numbers, exactly the \\(10\\) residues listed in (3) cause a failure.\n\nThe interval \\(25\\le N\\le999\\) contains \\(39\\) full blocks of size \\(25\\):\n\\[\n39\\cdot10=390\\text{ failures}.\n\\]\n\n\\(N=1000\\) has residue \\(0\\) modulo \\(25\\), so it is not a failure.\n\nThus the number of values where the greedy algorithm **succeeds** is \n\n\\[\n1000-390 = 610.\n\\]\n\n\\[\n\\boxed{610}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "In base \\(b\\),\n\n\\[\n17_b = 1\\cdot b+7 = b+7,\\qquad 97_b = 9\\cdot b+7 .\n\\]\n\nWe need integer bases \\(b>9\\) such that \\(b+7\\) divides \\(9b+7\\).\n\nLet \n\n\\[\nn = b+7 \\quad\\Longrightarrow\\quad b = n-7.\n\\]\n\nThen \n\n\\[\n9b+7 = 9(n-7)+7 = 9n-56 .\n\\]\n\nHence \\(n\\) must divide \\(9n-56\\):\n\n\\[\nn \\mid (9n-56) \\;\\Longrightarrow\\; n \\mid (9n-56) - 9n = -56.\n\\]\n\nThus \\(n\\) is a positive divisor of \\(56\\). \nSince \\(b>9\\), we have \\(n=b+7>16\\); therefore we need divisors of \\(56\\) that are \\(\\ge 17\\).\n\nDivisors of \\(56 = 2^3\\cdot7\\) are \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56.\n\\]\n\nOnly \\(28\\) and \\(56\\) satisfy \\(n\\ge 17\\).\n\nCorresponding bases:\n\n\\[\nb = n-7 \\quad\\Rightarrow\\quad \n\\begin{cases}\nn=28 &\\Rightarrow b = 21,\\\\[2pt]\nn=56 &\\Rightarrow b = 49.\n\\end{cases}\n\\]\n\nBoth bases exceed \\(9\\) and the digits \\(1,7,9\\) are allowed.\n\nFinally, the sum of all such bases is \n\n\\[\n21 + 49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Label the vertices of the regular \\(24\\)-gon by the residues \n\\(\\{0,1,2,\\dots ,23\\}\\) modulo \\(24\\).\n\nIf the \\(12\\) drawn segments all have the same Euclidean length, then each\nsegment must join two vertices whose indices differ by a fixed integer \n\\(k\\;(1\\le k\\le 12)\\) (the \u201cstep size\u2019\u2019), because the length of a chord in a\nregular polygon depends only on this step.\n\nThus for a fixed \\(k\\) we have to choose a perfect matching of the graph \n\n\\[\nG_k=\\big\\{\\{i,i+k\\}\\mid i=0,1,\\dots ,23\\big\\}.\n\\]\n\n--------------------------------------------------------------------\n### 1. Structure of \\(G_k\\)\n\n\\(G_k\\) is a **2\u2011regular** graph; each vertex has exactly the two neighbours\n\\(i\\pm k\\). \nLet \n\n\\[\nd=\\gcd(k,24).\n\\]\n\nThen the vertices split into \\(d\\) cycles, each of length \n\n\\[\nt=\\frac{24}{d}.\n\\]\n\nIndeed, repeatedly adding \\(k\\) modulo \\(24\\) runs through a cycle of that\nlength.\n\n--------------------------------------------------------------------\n### 2. When does a perfect matching exist?\n\nA perfect matching can exist only if each component has an even number of\nvertices, i.e. \\(t\\) must be even. \nSince \\(t = 24/d\\),\n\n* \\(t\\) is odd only when \\(d=8\\) (giving \\(t=3\\)). \n Hence for \\(k=8\\) no perfect matching is possible.\n\nAll other values of \\(k\\) give even\u2011length cycles.\n\n--------------------------------------------------------------------\n### 3. Number of matchings for a given \\(k\\)\n\n*If \\(t\\ge 4\\) (even cycle of length at least \\(4\\)): \nA cycle has exactly **two** perfect matchings (choose every other edge). \nSince there are \\(d\\) independent cycles, the total number of matchings is\n\\(\\displaystyle 2^{d}\\).\n\n*If \\(t=2\\) (the case \\(k=12\\)): each component is a single edge, so there\nis only **one** way to match its two vertices. \nThus for \\(k=12\\) we obtain \\(1\\) matching.\n\nSummarising\n\n\\[\nf(k)=\n\\begin{cases}\n0, & k=8,\\\\[2mm]\n1, & k=12,\\\\[2mm]\n2^{\\gcd(k,24)}, & \\text{otherwise}.\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 4. Summation over all possible step sizes\n\n\\[\n\\begin{array}{c|c|c|c}\nk & \\gcd(k,24) & f(k) & \\text{contribution}\\\\\\hline\n1 & 1 & 2^1=2 & 2\\\\\n2 & 2 & 2^2=4 & 4\\\\\n3 & 3 & 2^3=8 & 8\\\\\n4 & 4 & 2^4=16 & 16\\\\\n5 & 1 & 2 & 2\\\\\n6 & 6 & 2^6=64 & 64\\\\\n7 & 1 & 2 & 2\\\\\n8 & 8 & 0 & 0\\\\\n9 & 3 & 8 & 8\\\\\n10& 2 & 4 & 4\\\\\n11& 1 & 2 & 2\\\\\n12&12 & 1 & 1\\\\\\hline\n\\multicolumn{3}{r|}{\\text{Total}} & 113\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 5. Answer\n\nThe total number of ways to draw \\(12\\) equal\u2011length segments so that each of\nthe \\(24\\) vertices is used exactly once is \n\n\\[\n\\boxed{113}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Overview**\n\nEach player gets one scoop of either chocolate (C), vanilla (V) or strawberry (S). \nLet \n\n\\[\nc=\\#\\text{players who chose chocolate},\\qquad \nv=\\#\\text{players who chose vanilla},\\qquad \ns=\\#\\text{players who chose strawberry}.\n\\]\n\nWe need \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\nFor each admissible triple \\((c,v,s)\\) the number of assignments to the 9 distinct players is the multinomial coefficient \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nHence \n\n\\[\nN=\\sum_{\\substack{c+v+s=9\\\\c>v>s\\ge1}}\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\)\n\nSince \\(c>v>s\\ge1\\),\n\n\\[\ns\\le 2\n\\]\n\n(because \\(s+(s+1)+(s+2)=3s+3\\le9\\Rightarrow s\\le2\\)). \n\n*If \\(s=1\\):* \n\\(v\\ge2\\) and \\(c=9-v-1=8-v\\). \nCondition \\(c>v\\) gives \\(8-v>v\\Rightarrow v\\le3\\). \nThus \\(v=2,3\\) giving triples \\((6,2,1)\\) and \\((5,3,1)\\).\n\n*If \\(s=2\\):* \n\\(v\\ge3\\) and \\(c=9-v-2=7-v\\). \nCondition \\(c>v\\) gives \\(7-v>v\\Rightarrow v\\le3\\). \nThus \\(v=3\\) giving the triple \\((4,3,2)\\).\n\nNo larger \\(s\\) works. \nHence the only admissible triples are \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\n---\n\n### 2. Count assignments for each triple\n\n\\[\n\\begin{aligned}\n(6,2,1):&\\quad \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[4pt]\n(5,3,1):&\\quad \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[4pt]\n(4,3,2):&\\quad \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments\n\n\\[\nN=252+504+1260=2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\)\n\n\\[\n2016\\equiv 16\\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Overview**\n\nLet \n\n\\[\n\\begin{aligned}\nA&=(7,7\\sqrt3),\\qquad \nB=(0,0),\\qquad \nC=(7,0),\\\\[2mm]\nD&=\\Bigl(\\frac{205}{7},\\frac{36\\sqrt3}{7}\\Bigr),\\qquad\nE=\\Bigl(\\frac{218}{7},\\frac{88\\sqrt3}{7}\\Bigr).\n\\end{aligned}\n\\]\n\nThe pentagon \\(ABCDE\\) is convex, \\(\\angle B=\\angle E=60^\\circ\\) and the side\u2013lengths are \n\n\\[\nAB=14,\\;BC=7,\\;CD=24,\\;DE=13,\\;EA=26 .\n\\]\n\nFor a point \\(X\\) define \n\n\\[\nf(X)=AX+BX+CX+DX+EX .\n\\]\n\n--------------------------------------------------------------------\n\n### 1. Reducing the problem\n\nFor any point \\(X\\)\n\n\\[\n\\nabla f(X)=\\sum_{P\\in\\{A,B,C,D,E\\}}\\frac{X-P}{|X-P|}.\n\\]\n\nIf the minimum of \\(f\\) is attained at an interior point,\nthe gradient must be zero:\n\n\\[\n\\frac{X-A}{|X-A|}+\\frac{X-B}{|X-B|}\n+\\frac{X-C}{|X-C|}+\\frac{X-D}{|X-D|}+\\frac{X-E}{|X-E|}=0. \\tag{1}\n\\]\n\nNotice that \n\n*\\(B\\) and \\(E\\) lie on the same line \\(BE\\). \nIf a point \\(X\\) is on the line \\(BE\\), the two unit vectors in (1) that\ncorrespond to \\(B\\) and \\(E\\) are opposite:\n\\[\n\\frac{X-B}{|X-B|}+\\frac{X-E}{|X-E|}=0 .\n\\]\n\nHence, **any point on the segment \\(BE\\) automatically cancels the\ncontributions of \\(B\\) and \\(E\\).** \nConsequently a minimiser must lie on \\(BE\\), and (1) becomes\n\n\\[\n\\frac{X-A}{|X-A|}+\\frac{X-C}{|X-C|}+\\frac{X-D}{|X-D|}=0 .\\tag{2}\n\\]\n\nEquation (2) is precisely the equilibrium condition for the geometric\nmedian (Fermat\u2013Weber point) of the triangle \\(ACD\\).\n\n--------------------------------------------------------------------\n\n### 2. The Fermat point of \\(\\triangle ACD\\)\n\nThe three angles of \\(\\triangle ACD\\) are \n\n\\[\n\\angle A\\approx81.8^\\circ ,\\qquad \n\\angle C\\approx68.2^\\circ ,\\qquad \n\\angle D=30^\\circ .\n\\]\n\nAll are \\(<120^\\circ\\); therefore the unique point \\(F\\) inside\n\\(\\triangle ACD\\) for which the three angles \\(\\angle AFD,\n\\angle CFD, \\angle ACF\\) are all \\(120^\\circ\\) is the Fermat point.\nIt is precisely the point satisfying (2); consequently the minimiser of\n\\(f\\) is the intersection of the line \\(BE\\) with this Fermat point.\n(The numerical computation of the Weiszfeld iteration gives\n\\(F\\approx(10.594,\\,7.416)\\), which indeed lies on \\(BE\\).)\n\nFor a triangle with side\u2011lengths \\(a,b,c\\) and area \\(\\Delta\\), the\nminimal sum of distances from its Fermat point to the three vertices is\n\n\\[\n\\boxed{\\displaystyle \n\\sqrt{\\frac{a^{2}+b^{2}+c^{2}+4\\sqrt3\\,\\Delta}{2}} } \\tag{3}\n\\]\n\n(see any textbook on the Fermat point).\n\n--------------------------------------------------------------------\n\n### 3. Applying the formula to \\(\\triangle ACD\\)\n\nFor \\(\\triangle ACD\\)\n\n\\[\n\\begin{aligned}\na&=CD=24,\\\\\nb&=AD=13\\sqrt3,\\\\\nc&=AC=7\\sqrt3.\n\\end{aligned}\n\\]\n\nThe area is obtained from the base \\(AC\\) (vertical, length \\(7\\sqrt3\\))\nand the horizontal distance from \\(D\\) to the line \\(AC\\) (which is\n\\( \\frac{156}{7}\\)):\n\n\\[\n\\Delta=\\frac12\\cdot7\\sqrt3\\cdot\\frac{156}{7}=78\\sqrt3 .\n\\]\n\nNow compute the expression in (3):\n\n\\[\n\\begin{aligned}\na^{2}+b^{2}+c^{2}&=24^{2}+(13\\sqrt3)^{2}+(7\\sqrt3)^{2}\n=576+507+147=1230,\\\\[1mm]\n4\\sqrt3\\,\\Delta&=4\\sqrt3\\cdot78\\sqrt3=4\\cdot78\\cdot3=936,\\\\[1mm]\n\\frac{a^{2}+b^{2}+c^{2}+4\\sqrt3\\,\\Delta}{2}\n&=\\frac{1230+936}{2}=1083.\n\\end{aligned}\n\\]\n\nThus \n\n\\[\nAF+CF+DF=\\sqrt{1083}=19\\sqrt3 .\n\\]\n\n--------------------------------------------------------------------\n\n### 4. The total minimum\n\nBecause the minimiser lies on \\(BE\\),\n\n\\[\nBF+EF=BE=38 .\n\\]\n\nTherefore\n\n\\[\n\\begin{aligned}\n\\min f(X)&=AF+CF+DF+BF+EF\\\\\n&=19\\sqrt3+38 .\n\\end{aligned}\n\\]\n\nThe required form is \\(m+n\\sqrt{p}\\) with \\(m=38,\\;n=19,\\;p=3\\).\n\nHence \n\n\\[\nm+n+p = 38+19+3 = 60 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{60}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equation \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored over the integers:\n\n\\[\n12x^{2}-xy-6y^{2}= (3x+2y)(4x-3y)=0 .\n\\]\n\nHence a pair \\((x,y)\\) of integers satisfies either \n\n\\[\n\\boxed{3x+2y=0}\\qquad\\text{or}\\qquad\\boxed{4x-3y=0}.\n\\]\n\n---\n\n### 1. Solutions of \\(3x+2y=0\\)\n\n\\[\n2y=-3x\\quad\\Longrightarrow\\quad y=-\\frac{3}{2}x .\n\\]\n\nFor \\(y\\) to be integer, \\(x\\) must be even: write \\(x=2k\\) with \\(k\\in\\mathbb Z\\). \nThen \\(y=-3k\\).\n\nThe bounds \\(-100\\le x,y\\le100\\) give \n\n\\[\n-100\\le2k\\le100\\;\\Longrightarrow\\;-50\\le k\\le50,\n\\]\n\\[\n-100\\le-3k\\le100\\;\\Longrightarrow\\;|k|\\le\\frac{100}{3}\\;\\Longrightarrow\\;-33\\le k\\le33.\n\\]\n\nThus \\(k\\) can be any integer from \\(-33\\) to \\(33\\): \n\n\\[\n\\#\\{(x,y):3x+2y=0\\}=33+33+1=67 .\n\\]\n\n---\n\n### 2. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x=3y\\quad\\Longrightarrow\\quad y=\\frac{4}{3}x .\n\\]\n\nFor integer \\(y\\), \\(x\\) must be a multiple of \\(3\\): write \\(x=3m\\) with \\(m\\in\\mathbb Z\\). \nThen \\(y=4m\\).\n\nThe bounds give \n\n\\[\n-100\\le3m\\le100\\;\\Longrightarrow\\;|m|\\le\\frac{100}{3}\\;\\Longrightarrow\\;-33\\le m\\le33,\n\\]\n\\[\n-100\\le4m\\le100\\;\\Longrightarrow\\;-25\\le m\\le25.\n\\]\n\nHence \\(m\\) can be any integer from \\(-25\\) to \\(25\\): \n\n\\[\n\\#\\{(x,y):4x-3y=0\\}=25+25+1=51 .\n\\]\n\n---\n\n### 3. Removing the double count\n\nThe only pair that satisfies both linear equations is \\((0,0)\\). \nThus the total number of distinct ordered pairs is \n\n\\[\n67+51-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a tangential quadrilateral (one that has an incircle) the sum of the lengths of opposite sides are equal. \nLet the parallel sides of the isosceles trapezoid be \\(r\\) and \\(s\\) \\((r\\neq s)\\) and each leg have length \\(L\\).\n\n\\[\nr+s = L+L = 2L \\quad\\Longrightarrow\\quad L=\\frac{r+s}{2}\n\\]\n\n---\n\n### Using the incircle\n\nFor any tangential quadrilateral \n\n\\[\n\\text{Area}= (\\text{inradius})\\times (\\text{semiperimeter})\n\\]\n\nThe inradius is \\(3\\) and the area is \\(72\\), so the semiperimeter is \n\n\\[\n\\frac{72}{3}=24 .\n\\]\n\nThe semiperimeter of the trapezoid is \n\n\\[\n\\frac{r+s+2L}{2}= \\frac{r+s+r+s}{2}=r+s .\n\\]\n\nHence \n\n\\[\nr+s = 24 .\n\\]\n\nConsequently \n\n\\[\nL=\\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### Height of the trapezoid\n\nThe area also equals \\(\\dfrac{(r+s)}{2}\\cdot h\\), where \\(h\\) is the height:\n\n\\[\n72=\\frac{24}{2}\\,h =12h \\;\\Longrightarrow\\; h=6 .\n\\]\n\n(Indeed, the height must be \\(2\\) times the inradius, \\(2\\cdot3=6\\).)\n\n---\n\n### Relating the legs to the bases\n\nIn an isosceles trapezoid the horizontal offset of each leg is \n\n\\[\nx=\\frac{r-s}{2}.\n\\]\n\nBecause each leg has length \\(L=12\\),\n\n\\[\nL^{2}=x^{2}+h^{2}\\quad\\Longrightarrow\\quad\n12^{2}= \\left(\\frac{r-s}{2}\\right)^{2}+6^{2}.\n\\]\n\nThus \n\n\\[\n\\left(\\frac{r-s}{2}\\right)^{2}=144-36=108\n\\quad\\Longrightarrow\\quad\nr-s = 2\\sqrt{108}=12\\sqrt3 .\n\\]\n\n---\n\n### Solving for \\(r\\) and \\(s\\)\n\n\\[\n\\begin{cases}\nr+s = 24,\\\\[2pt]\nr-s = 12\\sqrt3 .\n\\end{cases}\n\\]\n\n\\[\nr = \\frac{24+12\\sqrt3}{2}=12+6\\sqrt3,\\qquad\ns = \\frac{24-12\\sqrt3}{2}=12-6\\sqrt3 .\n\\]\n\n---\n\n### Compute \\(r^{2}+s^{2}\\)\n\nUsing \\((r^{2}+s^{2}) = \\dfrac{(r+s)^{2}+(r-s)^{2}}{2}\\),\n\n\\[\nr^{2}+s^{2}= \\frac{24^{2}+(12\\sqrt3)^{2}}{2}\n= \\frac{576+432}{2}\n= \\frac{1008}{2}=504 .\n\\]\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a number to be divisible by \\(22\\) it must be divisible by \\(2\\) **and** by \\(11\\).\n\n---\n\n### 1. Divisibility by \\(2\\)\n\nThe last digit (the 8\u2011th digit) must be even.\nThe even digits are \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2. Divisibility by \\(11\\)\n\nFor an \\(8\\)-digit number \\(d_1d_2\\ldots d_8\\),\n\n\\[\n\\text{(odd positions)}-\\text{(even positions)}=\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\n\\]\n\nmust be a multiple of \\(11\\).\n\nSince the digits \\(1,\\dots ,8\\) are used once,\n\\[\n(d_1+d_3+d_5+d_7)+(d_2+d_4+d_6+d_8)=1+2+\\cdots+8=36 .\n\\]\n\nLet \\(S=d_1+d_3+d_5+d_7\\). \nThen the alternating sum is \\(2S-36\\). \nIt must be a multiple of \\(11\\) and also even (because \\(2S-36\\) is even). \nThe only even multiple of \\(11\\) in the range \\([-16,16]\\) (the possible values of \\(2S-36\\)) is \\(0\\).\n\nHence \n\n\\[\n2S-36=0\\quad\\Longrightarrow\\quad S=18 .\n\\]\n\nSo the four digits occupying the odd positions must sum to \\(18\\)\n(and automatically the even positions also sum to \\(18\\)).\n\n---\n\n### 3. Choosing the odd\u2011position set\n\nWe need all \\(4\\)-element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them (or using a generating function) gives\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThus there are **8** possible sets for the odd positions.\n\nEach such set contains exactly two even digits (any valid set must have\ntwo evens and two odds, because an odd number of evens would give an odd total).\n\n---\n\n### 4. Arranging the digits\n\n*Odd positions (1,3,5,7)* \u2013 the chosen 4 digits can be placed in \\(4! = 24\\) ways.\n\n*Even positions (2,4,6,8)* \u2013 the remaining four digits must be placed so that\nposition\u202f8 is even.\n\nIf the even\u2011position set contains \\(k\\) even digits, we have \\(k\\) choices for which even digit goes to position\u202f8, and the remaining three digits can be ordered in the other three even positions in \\(3! = 6\\) ways. \n\nFor every valid odd\u2011set we have exactly \\(k = 2\\) even digits in the even\u2011position set,\nso\n\n\\[\n\\text{arrangements of even positions}=2\\cdot 3! = 12 .\n\\]\n\nHence for each of the 8 possible odd\u2011sets we obtain\n\n\\[\n24 \\times 12 = 288\\text{ permutations}.\n\\]\n\n---\n\n### 5. Total number \\(N\\)\n\n\\[\nN = 8 \\times 288 = 2304 .\n\\]\n\n---\n\n### 6. Required difference\n\n\\[\nN - 2025 = 2304 - 2025 = 279 .\n\\]\n\n---\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equations describe geometric loci in the complex plane.\n\n---\n\n### 1. The first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\nis a circle \n\n\\[\nC:\\;(x-25)^2+(y-20)^2 =5^{\\,2}=25 .\n\\]\n\nIts centre is \\(C_0=(25,20)\\) and its radius is \\(r=5\\).\n\n---\n\n### 2. The second equation \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the point \\(z\\) is equidistant from the points \n\n\\[\nA=(4+k,0), \\qquad B=(k,3).\n\\]\n\nHence the locus is the **perpendicular bisector** of segment \\(\\overline{AB}\\).\n\n* Midpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{(k+4)+k}{2},\\frac{0+3}{2}\\Bigr)=(k+2,\\tfrac32).\n\\]\n\n* Direction vector of \\(AB\\): \n\n\\[\n\\vec{AB}=(-4,3) \\quad\\Longrightarrow\\quad \\text{slope of }AB =-\\frac34 .\n\\]\n\nThe perpendicular bisector therefore has slope the negative reciprocal, \\(\\frac43\\).\n\nThe equation of the line \\(L_k\\) (the bisector) is \n\n\\[\ny-\\tfrac32=\\frac43\\bigl(x-(k+2)\\bigr)\n\\]\n\nor, after clearing fractions,\n\n\\[\n8x-6y-(8k+7)=0. \\tag{1}\n\\]\n\n---\n\n### 3. Tangency condition \n\nThe system has **exactly one** solution precisely when the line \\(L_k\\) is tangent to the circle \\(C\\). \nTangency occurs when the distance from the centre \\(C_0=(25,20)\\) to the line equals the radius \\(5\\).\n\nFor the line \\(8x-6y-(8k+7)=0\\),\n\n\\[\n\\text{dist}(C_0,L_k)=\\frac{|8\\cdot25-6\\cdot20-(8k+7)|}{\\sqrt{8^2+(-6)^2}}\n =\\frac{|200-120-(8k+7)|}{10}\n =\\frac{|73-8k|}{10}.\n\\]\n\nSet this equal to the radius \\(5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50 .\n\\]\n\nSolving gives \n\n\\[\n\\begin{cases}\n73-8k=50 &\\Rightarrow\\; 8k=23 \\;\\Rightarrow\\; k=\\dfrac{23}{8},\\\\[4pt]\n73-8k=-50 &\\Rightarrow\\; 8k=123 \\;\\Rightarrow\\; k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values make the line tangent to the circle, so each yields exactly one solution \\(z\\).\n\n---\n\n### 4. Sum of all possible \\(k\\)\n\n\\[\nk_1+k_2=\\frac{23}{8}+\\frac{123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nThus \\(m=73,\\; n=4\\) (coprime), and\n\n\\[\nm+n=73+4=77.\n\\]\n\n---\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=\\mathbf b ,\\qquad C=\\mathbf c .\n\\]\n\nThen \\(\\triangle ABC\\) has oriented area \n\n\\[\n[\\triangle ABC]=\\frac12\\,\\bigl(\\mathbf b\\times\\mathbf c\\bigr) .\n\\]\n\n--------------------------------------------------------------------\n### 1. Coordinates of the points on the sides \n\nOn \\(AB\\)\n\n\\[\nAD=4,\\;DE=16,\\;EB=8\\qquad\\Longrightarrow\\qquad AB=28 .\n\\]\n\nHence \n\n\\[\nD=\\frac{4}{28}\\mathbf b=\\frac17\\mathbf b ,\\qquad \nE=\\frac{20}{28}\\mathbf b=\\frac57\\mathbf b .\n\\]\n\nOn \\(AC\\)\n\n\\[\nAF=13,\\;FG=52,\\;GC=26\\qquad\\Longrightarrow\\qquad AC=91 .\n\\]\n\nThus \n\n\\[\nF=\\frac{13}{91}\\mathbf c ,\\qquad \nG=\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 2. Area of \\(DEGF\\)\n\nFor any two points \\(P=\\alpha_P\\mathbf b+\\beta_P\\mathbf c\\) and\n\\(Q=\\alpha_Q\\mathbf b+\\beta_Q\\mathbf c\\),\n\n\\[\nP\\times Q=(\\alpha_P\\beta_Q-\\beta_P\\alpha_Q)\\,(\\mathbf b\\times\\mathbf c).\n\\]\n\nWith the order \\(D\\to E\\to G\\to F\\) we obtain \n\n\\[\n\\begin{aligned}\n\\sum (P_i\\times P_{i+1})&=\n\\underbrace{D\\times E}_{0}\n+\\underbrace{E\\times G}_{\\frac{5}{7}\\frac{65}{91}\\,K}\n+\\underbrace{G\\times F}_{0}\n+\\underbrace{F\\times D}_{-\\frac{13}{91}\\frac1{7}\\,K} \\\\[2mm]\n&=\\Bigl(\\frac{5\\cdot65}{7\\cdot91}\n -\\frac{13}{7\\cdot91}\\Bigr)K\n =\\frac{312}{637}\\,K ,\n\\end{aligned}\n\\]\n\nwhere \\(K=\\mathbf b\\times\\mathbf c\\). \nTherefore \n\n\\[\n[DEGF]=\\frac12\\Bigl|\\frac{312}{637}K\\Bigr|\n =\\frac{156}{637}|K| .\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n|K|=288\\cdot\\frac{637}{156}=1176 .\n\\]\n\nConsequently \n\n\\[\n[\\triangle ABC]=\\frac12|K|=588 .\n\\]\n\n--------------------------------------------------------------------\n### 3. The reflected points \n\nReflecting \\(D\\) across \\(F\\) gives \n\n\\[\nM=2F-D=\\frac{26}{91}\\mathbf c-\\frac{13}{91}\\mathbf b .\n\\]\n\nReflecting \\(G\\) across \\(E\\) gives \n\n\\[\nN=2E-G=\\frac{130}{91}\\mathbf b-\\frac{65}{91}\\mathbf c .\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in the given order and write each as\n\\(P_i=\\alpha_i\\mathbf b+\\beta_i\\mathbf c\\):\n\n\\[\n\\begin{array}{c|c|c}\n\\text{vertex}&\\alpha_i&\\beta_i\\\\\\hline\nA&0&0\\\\\nF&0&\\dfrac{13}{91}\\\\\nN&\\dfrac{130}{91}&-\\dfrac{65}{91}\\\\\nB&1&0\\\\\nC&0&1\\\\\nE&\\dfrac57&0\\\\\nM&-\\dfrac{13}{91}&\\dfrac{26}{91}\n\\end{array}\n\\]\n\nFor the polygon the signed area is \n\n\\[\n\\frac12\\sum_{i=0}^{6}(\\alpha_i\\beta_{i+1}-\\beta_i\\alpha_{i+1})\\,K .\n\\]\n\nComputing the sum (using the common denominator \\(8281=91^{2}=7^{2}\\,13^{2}\\)) gives \n\n\\[\n\\sum_{i}(\\alpha_i\\beta_{i+1}-\\beta_i\\alpha_{i+1})=1 .\n\\]\n\nHence \n\n\\[\n[AFNBCEM]=\\frac12\\,K\n =\\frac12\\cdot1176\n =588 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c) , \\qquad b^{2}+c^{2}=BC^{2}=38^{2}=1444 .\n\\]\n\n--------------------------------------------------------------------\n### 1. Coordinates of \\(K\\) and \\(L\\)\n\nBecause \\(AK=BK=14\\), the point \\(K\\) is on the perpendicular bisector of \\(\\overline{AB}\\); hence \n\n\\[\nK=\\Bigl(\\frac b2 ,\\; \\sqrt{14^{2}-\\Bigl(\\frac b2\\Bigr)^{2}}\\Bigr).\n\\]\n\nWrite \n\n\\[\nm=\\frac b2 ,\\qquad p=\\sqrt{196-m^{2}},\n\\]\n\nso \\(K=(m,p)\\) and \\(m^{2}+p^{2}=196\\).\n\nSimilarly \\(AL=CL=14\\) gives \n\n\\[\nL=\\Bigl(\\sqrt{196-n^{2}},\\; n\\Bigr),\n\\]\n\nwith \n\n\\[\nn=\\frac c2 ,\\qquad q=\\sqrt{196-n^{2}},\\qquad n^{2}+q^{2}=196 .\n\\]\n\n--------------------------------------------------------------------\n### 2. Trigonometric parametrisation \n\nSince \\(m^{2}+p^{2}=196\\) we may set \n\n\\[\nm=14\\cos\\theta ,\\qquad p=14\\sin\\theta ,\\qquad 0<\\theta<\\frac{\\pi}{2}.\n\\]\n\nLikewise \n\n\\[\nn=14\\sin\\psi ,\\qquad q=14\\cos\\psi ,\\qquad 0<\\psi<\\frac{\\pi}{2}.\n\\]\n\nBecause \\(AKL\\) is equilateral, \\(\\angle KAL=60^{\\circ}\\); therefore \n\n\\[\n\\psi-\\theta=60^{\\circ}\\qquad\\Longrightarrow\\qquad\\psi=\\theta+\\frac{\\pi}{3}.\n\\]\n\n--------------------------------------------------------------------\n### 3. The right\u2011triangle condition \n\n\\[\nb^{2}+c^{2}=4(m^{2}+n^{2})=1444\\quad\\Longrightarrow\\quad m^{2}+n^{2}=361 .\n\\]\n\nSubstituting the trigonometric expressions,\n\n\\[\n(14\\cos\\theta)^{2}+(14\\sin\\psi)^{2}=361\n\\Longrightarrow \n\\cos ^{2}\\theta+\\sin ^{2}(\\theta+60^{\\circ})=\\frac{361}{196}.\n\\]\n\nUsing \\(\\sin^{2}\\alpha=\\frac{1-\\cos2\\alpha}{2}\\) and simplifying we obtain \n\n\\[\n3\\cos2\\theta+\\sqrt3\\sin2\\theta=\\frac{165}{49}.\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of \\(BKLC\\)\n\nThe region \\(BKLC\\) is the triangle \\(ABC\\) with three interior triangles removed:\n\n\\[\n[BKLC]=[ABC]-[ABK]-[ALC]-[AKL].\n\\]\n\nNow \n\n\\[\n[ABC]=\\frac{bc}{2}=2mn, \\qquad\n[ABK]=\\frac{b\\;y_{K}}{2}=mp, \\qquad\n[ALC]=\\frac{c\\;x_{L}}{2}=nq,\n\\]\n\nand \\([AKL]=\\frac{\\sqrt3}{4}\\,14^{2}=49\\sqrt3\\).\n\nHence \n\n\\[\nS=[BKLC]=2mn-mp-nq-49\\sqrt3 .\n\\tag{2}\n\\]\n\nInsert the trigonometric forms:\n\n\\[\n\\begin{aligned}\n2mn&=2(14\\cos\\theta)(14\\sin\\psi)=196\\bigl(2\\cos\\theta\\sin\\psi\\bigr),\\\\\nmp&=14^{2}\\cos\\theta\\sin\\theta=196(\\cos\\theta\\sin\\theta),\\\\\nnq&=14^{2}\\sin\\psi\\cos\\psi=196(\\sin\\psi\\cos\\psi).\n\\end{aligned}\n\\]\n\nThus \n\n\\[\nS=196\\bigl[2\\cos\\theta\\sin\\psi-(\\cos\\theta\\sin\\theta+\\sin\\psi\\cos\\psi)\\bigr]-49\\sqrt3 .\n\\tag{3}\n\\]\n\nUsing \\(\\psi=\\theta+60^{\\circ}\\) and elementary identities, (3) reduces to \n\n\\[\nS=49\\bigl[\\sqrt3\\,(4\\cos^{2}\\theta-1)-2\\sin(2\\theta+120^{\\circ})\\bigr].\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 5. Eliminate the trigonometric functions\n\nSet \n\n\\[\nA=\\cos(2\\theta-30^{\\circ}).\n\\]\n\nFrom (1),\n\n\\[\n3\\cos2\\theta+\\sqrt3\\sin2\\theta\n =\\frac{165}{49}\n =2\\sqrt3\\,A .\n\\]\n\nHence \n\n\\[\nA=\\frac{165}{98\\sqrt3}.\n\\tag{5}\n\\]\n\nExpress the right\u2013hand side of (4) in terms of \\(A\\). \nWrite \n\n\\[\n\\begin{aligned}\nX&=\\frac{\\sqrt3}{2}\\cos2\\theta,\\qquad\nY=\\frac12\\sin2\\theta,\n\\end{aligned}\n\\]\n\nso that \n\n\\[\nA=X+Y,\\qquad\n\\sin(2\\theta+120^{\\circ})=X-Y .\n\\]\n\nThen \n\n\\[\n\\sqrt3\\,(4\\cos^{2}\\theta-1)=\\sqrt3+4X,\n\\qquad\n-2\\sin(2\\theta+120^{\\circ})=-2(X-Y).\n\\]\n\nSubstituting these into (4) gives \n\n\\[\nS=49\\bigl(\\sqrt3+4X-2X+2Y\\bigr)\n =49\\bigl(\\sqrt3+2(X+Y)\\bigr)\n =49\\bigl(\\sqrt3+2A\\bigr).\n\\]\n\nFinally insert (5):\n\n\\[\nS=49\\left(\\sqrt3+\\frac{2\\cdot165}{98\\sqrt3}\\right)\n =49\\sqrt3+\\frac{165}{\\sqrt3}\n =\\frac{147+165}{\\sqrt3}\n =\\frac{312}{\\sqrt3}\n =104\\sqrt3 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{104}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the letters be numbered \n\n\\[\nA=1,\\;B=2,\\;\\dots ,\\;L=12 .\n\\]\n\nA random pairing of the 12 letters is a **perfect matching**. \nThe total number of unordered pairings is \n\n\\[\n(12-1)!!=\\frac{12!}{2!^{6}6!}=10395 .\n\\]\n\n---\n\n### 1. Fix the partner of \\(G\\)\n\nIn a random matching the partner of \\(G\\) is equally likely to be any of the other \\(11\\) letters. \nLet the partner be \\(X\\neq G\\). Write \n\n\\[\nm=\\min \\{G,X\\}.\n\\]\n\nThe pair containing \\(G\\) will be the last (lexicographically largest) word **iff** \nall minima of the other five pairs are less than \\(m\\). \nHence we must count, for each possible partner \\(X\\), the number of matchings of the\nremaining \\(10\\) letters whose minima are all \\(G\\) \n\nPossible partners: \\(H,I,J,K,L\\) (5 choices). \nHere \\(m=G\\). \nAmong the remaining letters we have \n\n\\[\nL=\\{A,B,C,D,E,F\\}\\;(a=6),\\qquad\nH=\\{\\text{the four letters }>G\\text{ other than }X\\}\\;(b=4).\n\\]\n\nThus \n\n\\[\n\\text{good}= \\frac{6!}{2^{1}\\cdot1!}=360,\n\\qquad\nP(\\text{good}\\mid X)=\\frac{360}{945}= \\frac{8}{21}.\n\\]\n\nContribution to the required probability:\n\n\\[\n5\\cdot\\frac1{11}\\cdot\\frac{8}{21}= \\frac{40}{231}.\n\\]\n\n#### (ii) \\(Xy,\\;x+y>76\\quad\\text{(region }A)\\\\\n\\text{or}\\\\\nx75\\quad\\text{(region }C)\\\\\n\\text{or}\\\\\nx>-1,\\;x+2y<75\\quad\\text{(region }D)\n\\end{cases}\n\\end{aligned}\n\\]\n\nIntersecting the possibilities gives four candidate regions:\n\n\\[\n\\begin{array}{c|c}\n\\text{Intersection} & \\text{Constraints}\\\\ \\hline\nA\\cap C & x>y,\\;x+y>76,\\;x<-1,\\;x+2y>75\\\\\nA\\cap D & x>y,\\;x+y>76,\\;x>-1,\\;x+2y<75\\\\\nB\\cap C & x75\\\\\nB\\cap D & x-1,\\;x+2y<75\n\\end{array}\n\\]\n\nThe first intersection is impossible (it would require \\(x>y\\) while \\(x<-1-1,\\\\[2pt]\nx-1\\) this forces\n\\[\n-10\\) is the perpendicular distance from \\(G\\) to the line.\n\nThe distances from \\(G\\) to \\(C\\) and \\(D\\) give\n\n\\[\n\\begin{cases}\n(x_G-26)^2+h^2 = 40^2 = 1600,\\\\[4pt]\n(x_G-40)^2+h^2 = 30^2 = 900 .\n\\end{cases}\n\\]\n\nSubtracting the second equation from the first:\n\n\\[\n(x_G-26)^2-(x_G-40)^2 = 1600-900 = 700 .\n\\]\n\nCompute the left side:\n\n\\[\n(x_G^2-52x_G+26^2)-(x_G^2-80x_G+40^2)\n=28x_G-924 .\n\\]\n\nHence \n\n\\[\n28x_G-924 = 700 \\quad\\Longrightarrow\\quad 28x_G = 1624\n\\quad\\Longrightarrow\\quad x_G = 58 .\n\\]\n\nNow find \\(h\\) using either distance equation; use the first:\n\n\\[\n(58-26)^2 + h^2 = 1600\n\\Longrightarrow 32^2 + h^2 = 1600\n\\Longrightarrow h^2 = 1600-1024 = 576\n\\Longrightarrow h = 24 .\n\\]\n\nThus \\(G=(58,24)\\). Its perpendicular projection onto the line is at \\(x=58\\), which lies between \\(E\\) and \\(F\\).\n\n---\n\n### 3. Area of \\(\\triangle BGE\\)\n\nThe base \\(BE\\) lies on the \\(x\\)-axis:\n\n\\[\nBE = x_E - x_B = 57-18 = 39 .\n\\]\n\nThe height from \\(G\\) to this base is the vertical distance \\(h=24\\).\n\nTherefore\n\n\\[\n\\text{Area} = \\frac12 \\times (\\text{base}) \\times (\\text{height})\n= \\frac12 \\times 39 \\times 24 = 39 \\times 12 = 468 .\n\\]\n\n---\n\n\\[\n\\boxed{468}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\text{Find all }n\\in\\mathbb Z_{>0}\\text{ such that }(n+2)\\mid 3(n+3)(n^2+9).\n\\]\n\n---\n\n### 1. Replace \\(n+2\\) by a new variable \n\nSet \n\\[\nm=n+2\\qquad (m\\ge 3).\n\\]\n\nThen \n\n\\[\nn=m-2,\\qquad n+3=m+1,\\qquad n^2+9=(m-2)^2+9=m^{2}-4m+13 .\n\\]\n\nHence the divisibility condition becomes \n\n\\[\nm\\mid 3(m+1)(m^{2}-4m+13).\n\\tag{1}\n\\]\n\n---\n\n### 2. Reduce the right\u2013hand side modulo \\(m\\)\n\nModulo \\(m\\),\n\n\\[\nm+1\\equiv 1,\\qquad m^{2}-4m+13\\equiv 13 .\n\\]\n\nTherefore \n\n\\[\n3(m+1)(m^{2}-4m+13)\\equiv 3\\cdot1\\cdot13=39 \\pmod m .\n\\]\n\nSo (1) is equivalent to \n\n\\[\nm\\mid 39 .\n\\tag{2}\n\\]\n\nIndeed, if \\(m\\mid 39\\) then the right\u2013hand side of (1) equals \\(39+km\\) for some integer \\(k\\), hence is divisible by \\(m\\); conversely, if \\(m\\mid 3(m+1)(m^{2}-4m+13)\\) then \\(m\\mid 39\\).\n\n---\n\n### 3. List possible \\(m\\)\n\nThe positive divisors of \\(39\\) are \n\n\\[\n1,\\;3,\\;13,\\;39 .\n\\]\n\nSince \\(m=n+2\\ge 3\\) (because \\(n\\ge1\\)), we keep \n\n\\[\nm\\in\\{3,\\;13,\\;39\\}.\n\\]\n\n---\n\n### 4. Recover the corresponding \\(n\\)\n\n\\[\n\\begin{aligned}\nm=3 &\\;\\Rightarrow\\; n=m-2=1,\\\\[2pt]\nm=13 &\\;\\Rightarrow\\; n=11,\\\\[2pt]\nm=39 &\\;\\Rightarrow\\; n=37 .\n\\end{aligned}\n\\]\n\nAll three indeed satisfy the original divisibility (quick check: the quotients are \\(40,420,4240\\) respectively).\n\n---\n\n### 5. Sum of all such \\(n\\)\n\n\\[\n1+11+37=49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nP:\\;y=x^{2}-4\n\\]\n\nand rotate \\(P\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin. \nIf \\((u,v)\\) is a point of \\(P\\) \\((v=u^{2}-4)\\), after the rotation we obtain \n\n\\[\n\\begin{aligned}\nx &=u\\cos 60^{\\circ}-v\\sin 60^{\\circ}\n =\\frac{u-\\sqrt3\\,(u^{2}-4)}2,\\\\[2mm]\ny &=u\\sin 60^{\\circ}+v\\cos 60^{\\circ}\n =\\frac{\\sqrt3\\,u+u^{2}-4}2 .\n\\end{aligned}\n\\tag{1}\n\\]\n\nA point \\((x,y)\\) that belongs to both the original parabola and its image\nmust satisfy \n\n\\[\ny=x^{2}-4 \\qquad\\text{and}\\qquad (x,y)=\\bigl(x(u),y(u)\\bigr)\\text{ for some }u .\n\\]\n\nUsing (1) and substituting \\(y=x^{2}-4\\) we get an equation for the\npre\u2011image coordinate \\(u\\):\n\n\\[\n\\Bigl(u-\\sqrt3\\,(u^{2}-4)\\Bigr)^{2}=2u^{2}+2\\sqrt3\\,u+8 .\n\\]\n\nSimplifying gives \n\n\\[\n3u^{4}-25u^{2}+40+2\\sqrt3\\,u\\,(3-u^{2})=0 .\n\\tag{2}\n\\]\n\nLet \\(t=u^{2}=x^{2}\\;(t\\ge0)\\). Equation (2) becomes \n\n\\[\n\\bigl(3t^{2}-25t+40\\bigr)^{2}=12t\\,(3-t)^{2},\n\\]\n\nor\n\n\\[\n9t^{4}-162t^{3}+937t^{2}-2108t+1600=0 .\n\\tag{3}\n\\]\n\nThe quartic factors over the integers:\n\n\\[\n\\begin{aligned}\n9t^{4}-162t^{3}+937t^{2}-2108t+1600\n &=\\bigl(t^{2}-11t+16\\bigr)\\bigl(9t^{2}-63t+100\\bigr).\n\\end{aligned}\n\\]\n\nThus the possible values of \\(t\\) are\n\n\\[\nt=\\frac{11\\pm\\sqrt{57}}2,\\qquad\nt=\\frac{63\\pm\\sqrt{369}}{18}.\n\\]\n\nRecall that \\(t=x^{2}\\) and that a genuine intersection must satisfy the\noriginal unsquared equation \n\n\\[\n3t^{2}-25t+40=2\\sqrt3\\,\\sqrt t\\,(3-t).\n\\tag{4}\n\\]\n\nChecking the sign of each side of (4) shows that only \n\n\\[\nt=\\frac{11-\\sqrt{57}}2\\approx1.725\n\\]\n\nsatisfies (4) with \\(x>0\\). (The other three roots correspond to the\ncase \\(3t^{2}-25t+40= -2\\sqrt3\\,\\sqrt t\\,(3-t)\\) or give \\(y>0\\).)\n\nSince \\(y=x^{2}-4=t-4\\),\n\n\\[\ny=\\frac{11-\\sqrt{57}}2-4=\\frac{3-\\sqrt{57}}2 .\n\\]\n\nHence the required numbers are \n\n\\[\na=3,\\qquad b=57,\\qquad c=2,\n\\]\n\nwith \\(\\gcd(a,c)=1\\). Therefore\n\n\\[\na+b+c=3+57+2=62 .\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n\\]\n\n---\n\n### 1. Rewrite each term using change of base \n\n\\[\n\\log_a b=\\frac{\\ln b}{\\ln a}\n\\]\n\nHence \n\n\\[\n\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n =\\frac{\\displaystyle\\frac{\\ln\\! \\big(5^{\\,k^2-1}\\big)}{\\ln k}}\n {\\displaystyle\\frac{\\ln\\! \\big(5^{\\,k^2-4}\\big)}{\\ln (k+1)}}\n =\\frac{(k^2-1)\\ln5}{\\ln k}\\cdot\\frac{\\ln (k+1)}{(k^2-4)\\ln5}\n =\\frac{k^2-1}{k^2-4}\\cdot\\frac{\\ln(k+1)}{\\ln k}.\n\\]\n\nThus the whole product becomes \n\n\\[\n\\Bigl[\\prod_{k=4}^{63}\\frac{k^2-1}{\\,k^2-4}\\Bigr]\\,\n\\Bigl[\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\\Bigr].\n\\]\n\n---\n\n### 2. The logarithmic factor telescopes \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\ln(k+1)}{\\ln k}\n= \\frac{\\ln5}{\\ln4}\\cdot\\frac{\\ln6}{\\ln5}\\cdots\\frac{\\ln64}{\\ln63}\n= \\frac{\\ln64}{\\ln4}\n= \\frac{6\\ln2}{2\\ln2}=3.\n\\]\n\n---\n\n### 3. Simplify the rational factor \n\n\\[\n\\frac{k^2-1}{k^2-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)}.\n\\]\n\nHence \n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}\n= \\Bigl[\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\Bigr]\n \\Bigl[\\prod_{k=4}^{63}\\frac{k+1}{k+2}\\Bigr].\n\\]\n\n**First product**\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n= \\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\frac{5}{4}\\cdots\\frac{62}{61}\n= \\frac{62}{2}=31.\n\\]\n\n**Second product**\n\n\\[\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n= \\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\frac{7}{8}\\cdots\\frac{64}{65}\n= \\frac{5}{65}= \\frac{1}{13}.\n\\]\n\nMultiplying,\n\n\\[\n\\prod_{k=4}^{63}\\frac{k^2-1}{k^2-4}=31\\cdot\\frac{1}{13}= \\frac{31}{13}.\n\\]\n\n---\n\n### 4. Combine the two parts \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})}\n= \\frac{31}{13}\\times 3 = \\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms (\\(\\gcd(93,13)=1\\)). \n\nThus \\(m=93,\\; n=13\\) and \n\n\\[\nm+n = 93+13 = 106.\n\\]\n\n\\[\n\\boxed{106}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Sketch**\n\nWrite every integer \\(a\\le 3^{6}=729\\) in its base\u2011\\(3\\) expansion \n\n\\[\na = a_{0}+a_{1}3+a_{2}3^{2}+a_{3}3^{3}+a_{4}3^{4}+a_{5}3^{5},\n\\qquad a_{i}\\in\\{0,1,2\\}.\n\\]\n\nLet \n\n\\[\nA(x)=a_{0}+a_{1}x+a_{2}x^{2}+a_{3}x^{3}+a_{4}x^{4}+a_{5}x^{5}\\in\\mathbb{F}_{3}[x].\n\\]\n\nModulo \\(3^{7}\\) we have \n\n\\[\na^{3}\\equiv a_{0}^{3}+9a_{0}^{2}a_{1}+27\\bigl(a_{0}a_{1}^{2}+a_{0}^{2}a_{2}\\bigr)\n +\\; \\cdots\\;+3^{6}a_{2}^{3}\\pmod{3^{7}} .\n\\]\n\nHence\n\n\\[\na^{3}+b^{3}+c^{3}\\equiv \n\\sum_{i=0}^{2}3^{i}\\bigl(a_{i}^{3}+b_{i}^{3}+c_{i}^{3}\\bigr)\\pmod{3^{7}} .\n\\]\n\nBecause \\(x^{3}\\equiv x\\pmod 3\\) for \\(x\\in\\{0,1,2\\}\\), the condition\n\\(a^{3}+b^{3}+c^{3}\\equiv0\\pmod{3^{7}}\\) is equivalent to the three\nindependent linear equations \n\n\\[\na_{0}+b_{0}+c_{0}\\equiv0,\\qquad\na_{1}+b_{1}+c_{1}\\equiv0,\\qquad\na_{2}+b_{2}+c_{2}\\equiv0\\pmod 3 .\n\\]\n\nFor each digit\u2011position \\(i=0,1,2\\) the number of ordered triples\n\\((a_{i},b_{i},c_{i})\\) satisfying the linear condition is\n\\(3^{2}=9\\) (choose any two digits freely, the third one is forced).\nThe remaining higher digits \\(a_{3},a_{4},a_{5}\\) are unrestricted; each\nhas \\(3^{3}=27\\) possibilities (three choices for each of the three\nnumbers).\n\nTherefore the total number of admissible triples \\((a,b,c)\\) is \n\n\\[\nN = 9^{3}\\cdot 27^{3}=3^{15}=14\\,348\\,907 .\n\\]\n\nFinally we need the remainder of \\(N\\) modulo \\(1000\\):\n\n\\[\n14\\,348\\,907\\equiv 907\\pmod{1000}.\n\\]\n\n\\[\n\\boxed{907}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n* \\(a,b,c,d\\) be the four interior edges (the two interior vertical and the two interior horizontal sides). \n* The eight outer edges are the two edges that belong to each unit square but are on the boundary of the\n\\(2\\times2\\) grid.\n\nFor a particular unit square the number of its interior red sides is the number of red interior edges incident\nto it. \nIf a square has \\(s\\) interior red sides, then it needs exactly \\(2-s\\) red outer sides, because the total number\nof red sides must be \\(2\\). \n\nFor a given square\n\n\\[\n\\#\\text{ ways to colour its two outer edges}= \\binom{2}{\\,2-s\\,}=\n\\begin{cases}\n1,&s=0\\text{ or }2,\\\\[2pt]\n2,&s=1 .\n\\end{cases}\n\\]\n\nThus, once the interior edges are fixed, the outer edges can be coloured independently for each square.\nIf among the four squares exactly \\(k\\) of them have \\(s=1\\) (i.e. exactly one interior red edge incident to the\nsquare), the number of completions of the outer edges is \\(2^{k}\\).\n\n--------------------------------------------------------------------\n\n### Counting interior\u2013edge configurations\n\nThe interior edges form a 4\u2011cycle \n\n\\[\nA\\;-\\;B\\;-\\;D\\;-\\;C\\;-\\;A .\n\\]\n\nWe list all \\(2^{4}=16\\) subsets of these edges and, for each, count how many squares have one interior red\nedge.\n\n| # interior edges | type of selection | \\# of squares with \\(s=1\\) | \\# of such subsets | contributions |\n|------------------|-------------------|----------------------------|--------------------|---------------|\n| 0 | none | 0 | 1 | \\(2^{0}=1\\) |\n| 1 | any one edge | 2 (the two squares incident to the edge) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 2 | adjacent edges (share a vertex) | 2 (the two squares adjacent to the common vertex) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 2 | opposite edges (no common vertex) | 4 (each square gets one) | 2 | \\(2\\cdot2^{4}=32\\) |\n| 3 | all but one edge | 2 (the two squares not incident to the missing edge) | 4 | \\(4\\cdot2^{2}=16\\) |\n| 4 | all four edges | 0 | 1 | \\(1\\cdot2^{0}=1\\) |\n\nAdding the contributions:\n\n\\[\n1+16+16+32+16+1 = 82 .\n\\]\n\n--------------------------------------------------------------------\n\nTherefore there are \n\n\\[\n\\boxed{82}\n\\]\n\ndifferent ways to colour the 12 unit segments so that each of the four unit squares has exactly two red sides\n(and consequently two blue sides).", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\(2025=3^{4}\\cdot5^{2}\\).\n\nDivisors of \\(2025\\) are of the form \\(3^{a}5^{b}\\) with \n\\(0\\le a\\le4,\\;0\\le b\\le2\\); therefore \n\n\\[\n|A|=(4+1)(2+1)=15 .\n\\]\n\n--------------------------------------------------------------------\n### Condition for the LCM\n\nFor a subset \\(B\\subseteq A\\),\n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a}\\,5^{\\max b}.\n\\]\n\nThus \\(\\operatorname{lcm}(B)=2025=3^{4}5^{2}\\) iff \n\n* at least one element of \\(B\\) has exponent \\(a=4\\) (i.e. is divisible by \\(3^{4}\\)), and \n* at least one element of \\(B\\) has exponent \\(b=2\\) (i.e. is divisible by \\(5^{2}\\)).\n\n--------------------------------------------------------------------\n### Relevant divisor families \n\n\\[\nX=\\{d\\in A\\mid 3^{4}\\mid d\\}=\\{81,405,2025\\},\\qquad |X|=3,\n\\]\n\n\\[\nY=\\{d\\in A\\mid 5^{2}\\mid d\\}=\\{25,75,225,675,2025\\},\\qquad |Y|=5.\n\\]\n\n\\(X\\cap Y=\\{2025\\}\\), so \\(|X\\cup Y|=3+5-1=7\\).\n\n--------------------------------------------------------------------\n### Counting subsets with the required property \n\nA subset \\(B\\) works iff it meets both \\(X\\) and \\(Y\\). \nUsing inclusion\u2013exclusion on all \\(2^{15}\\) subsets of \\(A\\):\n\n\\[\n\\begin{aligned}\n\\#\\{B:\\ B\\cap X\\neq\\varnothing,\\ B\\cap Y\\neq\\varnothing\\}\n&=2^{15}\n -2^{12}\\;(\\text{subsets missing }X)\n -2^{10}\\;(\\text{subsets missing }Y)\\\\\n&\\qquad +2^{8}\\;(\\text{subsets missing both }X\\cup Y)\\\\[2mm]\n&=32768-4096-1024+256\\\\\n&=27904 .\n\\end{aligned}\n\\]\n\nAll these subsets are non\u2011empty, so the numerator is \\(27904\\).\n\n--------------------------------------------------------------------\n### Probability\n\n\\[\nP=\\frac{27904}{2^{15}}=\\frac{27904}{32768}.\n\\]\n\nBoth numbers are divisible by \\(256\\):\n\n\\[\n\\frac{27904}{32768}=\\frac{27904/256}{32768/256}= \\frac{109}{128}.\n\\]\n\nThe fraction \\(\\frac{109}{128}\\) is already in lowest terms, so \n\\(m=109,\\;n=128\\).\n\n\\[\nm+n=109+128=237.\n\\]\n\n\\[\n\\boxed{237}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step\u202f1 \u2013 How regions grow**\n\nWhen a new line segment is drawn in the disk, it either \n*does not meet any previous segment* \u2013 it creates **one** new region, or \n*meets \\(k\\) previous segments in interior points* \u2013 it creates **\\(k+1\\)** new regions \n(the segment is cut into \\(k+1\\) pieces, each of which separates a region).\n\nHence, if we start with one region (the whole disk),\n\n\\[\n\\#\\text{regions}=1+\\#\\text{segments}+\\#\\text{interior intersections } .\n\\tag{1}\n\\]\n\nThe two perpendicular diameters intersect once, giving the four initial\nquadrants. After the 25 random chords are added we will have \n\n\\[\n27\\text{ segments} = 2\\text{ diameters}+25\\text{ chords}.\n\\]\n\nSo we only have to find the **expected number of interior intersection points**.\n\n--------------------------------------------------------------------\n\n**Step\u202f2 \u2013 Intersections with the diameters**\n\nA random chord meets a fixed diameter iff its two endpoints lie on opposite\nsides of that diameter. \n\n*Horizontal diameter*\u2003(\\(y=0\\)): the endpoints must belong to one of the\nfour unordered quadrant pairs \n\n\\[\n\\{Q_1,Q_3\\},\\{Q_1,Q_4\\},\\{Q_2,Q_3\\},\\{Q_2,Q_4\\},\n\\]\n\ni.e. 4 out of the 6 possible unordered pairs of different quadrants.\nThus \n\n\\[\nP(\\text{chord meets a given diameter})=\\frac{4}{6}= \\frac23 .\n\\]\n\nThe same probability holds for the vertical diameter. \nHence the expected number of chord\u2011diameter intersections is \n\n\\[\n25\\;( \\text{chords})\\times 2\\;( \\text{diameters})\\times \\frac23\n =\\frac{100}{3}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f3 \u2013 Intersections between two random chords**\n\nLet a chord be represented by the unordered pair of quadrants that contain its\nend\u2011points. \nThere are \n\n* 4 *adjacent* pairs \\(\\{0,1\\},\\{1,2\\},\\{2,3\\},\\{3,0\\}\\); \n* 2 *opposite* pairs \\(\\{0,2\\},\\{1,3\\}\\).\n\nThus the six possible chords are the six edges of the complete graph \\(K_4\\)\non the four quadrants.\n\nTwo chords may be:\n\n| Relation of the two edges | How many ordered pairs | Intersection probability |\n|---------------------------|-----------------------|--------------------------|\n| Same edge (both chords use the same pair) | 6 (4 adjacent\u202f+\u202f2 opposite) | \\(\\frac12\\) |\n| Share one vertex (adjacent edges) | 24 (8 both adjacent\u202f+\u202f16 one adjacent\u2013one opposite) | \\(\\frac12\\) |\n| Disjoint edges, both adjacent (e.g. \\{0,1\\} & \\{2,3\\}) | 4 | \\(0\\) |\n| Disjoint edges, both opposite ( \\{0,2\\} & \\{1,3\\}) | 2 | \\(1\\) |\n\n*Why these probabilities?* \n\n* Same edge \u2013 the two chords are independent copies inside the same two\nquadrants. A short calculation (or a symmetry argument) gives a crossing\nprobability of \\(\\frac12\\).\n* Share a vertex \u2013 one endpoint of the second chord lies in the same quadrant\nas an endpoint of the first chord. The second endpoint is always in a\ndifferent quadrant, so the second chord meets the first exactly when the\npoint that shares the vertex falls between the two endpoints of the first\nchord. Averaging over the uniform positions gives \\(\\frac12\\) again.\n* Disjoint adjacent edges lie completely on opposite sides of the\nhorizontal (or vertical) diameter, so they can never meet \u21d2 probability \\(0\\).\n* Disjoint opposite edges always cross the centre of the disk; any two such\nchords intersect \u21d2 probability \\(1\\).\n\nSumming the contributions of the \\(36\\) ordered pairs of chords,\n\n\\[\nS = 6\\!\\left(\\frac12\\right)+24\\!\\left(\\frac12\\right)+4\\cdot0+2\\cdot1 = 17 .\n\\]\n\nTherefore the probability that two independently chosen random chords intersect is \n\n\\[\np_{\\text{chord\u2013chord}} = \\frac{S}{36}= \\frac{17}{36}.\n\\tag{3}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f4 \u2013 Expected number of chord\u2013chord intersections**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of the 25 random chords. \nUsing (3),\n\n\\[\nE(\\text{chord\u2013chord intersections})=300\\cdot\\frac{17}{36}\n =\\frac{425}{3}=141\\frac{2}{3}.\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f5 \u2013 Total expected interior intersections**\n\n\\[\n\\begin{aligned}\nE(\\text{total interior intersections})\n&= (\\text{diameters intersect})\\\\\n&\\qquad +(\\text{chord\u2013diameter intersections})\\\\\n&\\qquad +(\\text{chord\u2013chord intersections})\\\\[2mm]\n&= 1+\\frac{100}{3}+ \\frac{425}{3}= 176 .\n\\end{aligned}\n\\tag{5}\n\\]\n\n--------------------------------------------------------------------\n\n**Step\u202f6 \u2013 Expected number of regions**\n\nInsert (5) into formula (1) with the total of \\(27\\) segments:\n\n\\[\nE(\\text{regions}) = 1 + 27 + 176 = 204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Overview**\n\nPlace the two circles on a coordinate plane, compute the positions of the relevant points, and write the\nrectangle\u2019s vertices in terms of its side\u2013lengths. \nThe conditions \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u201d and \u201c\\(D\\) is closer to\n\\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u201d fix the orientation of the rectangle. \nUsing the equality of the two triangle areas we obtain a simple relation between the rectangle\u2019s width\nand height, which together with the fact that the rectangle is inscribed in the small circle yields the\nrequired dimensions and its area.\n\n--------------------------------------------------------------------\n\n### 1. Coordinate set\u2011up \n\nLet \n\n* \\(O\\) be the centre of the large circle \\(\\omega_2\\) (radius \\(15\\)).\n* \\(A\\) be the centre of the small circle \\(\\omega_1\\) (radius \\(6\\)).\n* \\(B\\) the common point of tangency.\n\nBecause the circles are internally tangent,\n\\[\nOA = 15-6=9,\n\\qquad AB=6,\n\\qquad OB =15 .\n\\]\n\nChoose the \\(x\\)\u2013axis along \\(\\overline{BC}\\). \nTake \n\n\\[\nO=(0,0),\\qquad B=(15,0).\n\\]\n\nThen \\(A\\) lies on the same line, nine units left of \\(B\\):\n\\[\nA=(9,0).\n\\]\n\nSince \\(BC\\) is a diameter of \\(\\omega_2\\), the opposite end of the diameter is\n\\[\nC=(-15,0).\n\\]\n\nThe condition \\(\\overline{BC}\\perp\\overline{AD}\\) makes \\(AD\\) vertical, so the points of\n\\(\\omega_2\\) with \\(x=9\\) are\n\\[\nD=(9,12)\\quad\\text{or}\\quad D=(9,-12).\n\\]\nBecause later we need \\(D\\) to be nearer the top side of the rectangle, we take \n\n\\[\n\\boxed{D=(9,12)} .\n\\]\n\n--------------------------------------------------------------------\n\n### 2. The rectangle \\(EFGH\\)\n\n\\(EF\\) is required to be perpendicular to \\(\\overline{BC}\\); hence \\(EF\\) is a vertical side.\nLet the rectangle have\n\n* width \\(w\\) (the horizontal side \\(\\overline{FG}\\)),\n* height \\(h\\) (the vertical side \\(\\overline{EF}= \\overline{GH}\\)).\n\nSince the rectangle is inscribed in \\(\\omega_1\\), its centre coincides with the centre of \\(\\omega_1\\),\nnamely \\(A=(9,0)\\). Consequently the vertices are\n\n\\[\n\\begin{aligned}\nE&=\\bigl(b,\\,-\\tfrac{h}{2}\\bigr), &\nF&=\\bigl(b, \\tfrac{h}{2}\\bigr),\\\\[2mm]\nG&=\\bigl(a, \\tfrac{h}{2}\\bigr), &\nH&=\\bigl(a,\\,-\\tfrac{h}{2}\\bigr),\n\\end{aligned}\n\\]\nwhere \n\n\\[\na = 9-\\frac{w}{2},\\qquad b = 9+\\frac{w}{2}.\n\\]\n\nBecause every vertex lies on \\(\\omega_1\\) (radius \\(6\\) and centre \\((9,0)\\)),\n\\[\n(a-9)^2+\\Bigl(\\frac{h}{2}\\Bigr)^2 = (b-9)^2+\\Bigl(\\frac{h}{2}\\Bigr)^2 = 6^{2}=36 .\n\\]\nBoth equations give the single relation \n\n\\[\n\\boxed{w^{2}+h^{2}=144}\\tag{1}\n\\]\n(the rectangle\u2019s diagonal is the diameter \\(12\\) of the small circle).\n\n--------------------------------------------------------------------\n\n### 3. Interpreting the \u201ccloser\u2011to\u201d conditions \n\nThe statement \u201c\\(C\\) is closer to \\(\\overline{GH}\\) than to \\(\\overline{EF}\\)\u201d forces \\(\\overline{GH}\\) to be\nthe left vertical side (smaller \\(x\\))-coordinate) and \\(\\overline{EF}\\) the right vertical side. \nSimilarly \u201c\\(D\\) is closer to \\(\\overline{FG}\\) than to \\(\\overline{EH}\\)\u201d places \\(\\overline{FG}\\) at the\ntop (larger \\(y\\))-coordinate.\n\nThus \n\n\\[\n\\begin{aligned}\n\\text{dist}(C,\\overline{GH})&=a-(-15)=a+15,\\\\\n\\text{dist}(C,\\overline{EF})&=b+15,\\\\[1mm]\n\\text{dist}(D,\\overline{FG})&=12-\\frac{h}{2},\\\\\n\\text{dist}(D,\\overline{EH})&=12+\\frac{h}{2},\n\\end{aligned}\n\\]\nand the above inequalities are automatically satisfied for any feasible rectangle\n(\\(a9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "In base \\(b\\) the numbers \n\n\\[\n17_b = 1\\cdot b + 7 = b+7 ,\\qquad \n97_b = 9\\cdot b + 7 .\n\\]\n\nWe need bases \\(b>9\\) (so that the digits \\(7\\) and \\(9\\) are allowed) such that \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\n---\n\n### Reduce the divisibility condition\n\nIf \\(b+7\\) divides \\(9b+7\\), then it also divides any integer linear combination of these two numbers. \nConsider \n\n\\[\n9(b+7) - (9b+7) = 9b+63 - 9b - 7 = 56 .\n\\]\n\nHence \n\n\\[\nb+7 \\mid 56 .\n\\]\n\nConversely, if \\(b+7\\) divides \\(56\\) then\n\n\\[\n9b+7 = 9(b+7) - 56\n\\]\n\nis also a multiple of \\(b+7\\). Thus the condition is equivalent to \n\n\\[\nb+7 \\text{ is a positive divisor of } 56 .\n\\]\n\n---\n\n### Find admissible divisors\n\nThe positive divisors of \\(56\\) are \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nSince \\(b>9\\), we have \\(b+7>16\\). The only divisors of \\(56\\) exceeding \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7 &= 28 &\\implies&\\; b = 21,\\\\[2mm]\nb+7 &= 56 &\\implies&\\; b = 49 .\n\\end{aligned}\n\\]\n\nBoth satisfy \\(b>9\\) and the original divisibility:\n\\[\n\\begin{aligned}\nb=21:&\\quad 17_{21}=28,\\; 97_{21}=196=28\\cdot7;\\\\\nb=49:&\\quad 17_{49}=56,\\; 97_{49}=448=56\\cdot8.\n\\end{aligned}\n\\]\n\nNo other bases work.\n\n---\n\n### Sum of all such bases\n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c),\\qquad b^2+c^2=BC^2=38^2=1444 .\n\\]\n\nPut \n\n\\[\nK=(x_k ,y_k),\\qquad L=(x_l ,y_l).\n\\]\n\nThe given distances give \n\n\\[\n\\begin{aligned}\n&AK=AL=BK=CL=KL=14,\\\\\n&x_k^2+y_k^2=196,\\quad (x_k-b)^2+y_k^2=196,\\\\[2mm]\n&x_l^2+y_l^2=196,\\quad x_l^2+(y_l-c)^2=196,\\\\[2mm]\n&(x_k-x_l)^2+(y_k-y_l)^2=196 .\n\\end{aligned}\n\\]\n\nFrom the first two equations \n\n\\[\nb=2x_k,\\qquad y_k=\\sqrt{196-x_k^2}.\n\\]\n\nFrom the next two \n\n\\[\nc=2y_l,\\qquad x_l=\\sqrt{196-y_l^2}.\n\\]\n\nThus \n\n\\[\nK=(b/2,\\;\\sqrt{196-b^{2}/4}),\\qquad \nL=(\\sqrt{196-c^{2}/4},\\;c/2).\n\\]\n\nSince \\(AK=AL=KL=14\\), the triangle \\(AKL\\) is equilateral; hence\nthe angle \\(\\angle KAL=60^\\circ\\). Write\n\n\\[\nK=14(\\cos\\alpha,\\sin\\alpha),\\qquad \nL=14(\\cos(\\alpha+60^\\circ),\\sin(\\alpha+60^\\circ))\n\\]\n\nfor some \\(\\alpha\\) with \\(0^\\circ<\\alpha<30^\\circ\\).\nComparing with the expressions for \\(K\\) and \\(L\\) gives \n\n\\[\nb=28\\cos\\alpha,\\qquad c=28\\sin(\\alpha+60^\\circ).\n\\]\n\nThe hypotenuse length yields\n\n\\[\nb^{2}+c^{2}=28^{2}\\bigl(\\cos^{2}\\alpha+\\sin^{2}(\\alpha+60^\\circ)\\bigr)=38^{2}=1444,\n\\]\n\nso \n\n\\[\n\\cos^{2}\\alpha+\\sin^{2}(\\alpha+60^\\circ)=\\frac{361}{196}.\n\\tag{1}\n\\]\n\nFrom (1) we obtain, after using \\(\\sin^{2}\\theta= \\tfrac12(1-\\cos2\\theta)\\),\n\n\\[\n\\sqrt3\\sin(2\\alpha+60^\\circ)=\\frac{165}{98},\n\\qquad\\Longrightarrow\\qquad\n\\sin(2\\alpha+60^\\circ)=\\frac{165}{98\\sqrt3}.\n\\tag{2}\n\\]\n\nNow compute the required area.\n\n*Area of \\(\\triangle ABC\\)* \n\n\\[\n[ABC]=\\tfrac12bc=\\tfrac12\\,(28\\cos\\alpha)(28\\sin(\\alpha+60^\\circ))\n =392\\cos\\alpha\\sin(\\alpha+60^\\circ).\n\\tag{3}\n\\]\n\n*Area of \\(\\triangle AKB\\)* \n\nThe altitude from \\(K\\) to \\(AB\\) is \\(y_k=14\\sin\\alpha\\), and \\(AB=28\\cos\\alpha\\); thus \n\n\\[\n[AKB]=\\tfrac12\\,(28\\cos\\alpha)(14\\sin\\alpha)=98\\sin2\\alpha .\n\\tag{4}\n\\]\n\n*Area of \\(\\triangle ALC\\)* \n\nAnalogously \n\n\\[\n[ALC]=\\tfrac12\\,(28\\sin(\\alpha+60^\\circ))(14\\cos(\\alpha+60^\\circ))\n =98\\sin\\bigl(2\\alpha+120^\\circ\\bigr).\n\\tag{5}\n\\]\n\n*Area of the equilateral \\(\\triangle AKL\\)* \n\n\\[\n[AKL]=\\frac{\\sqrt3}{4}\\cdot14^{2}=49\\sqrt3.\n\\tag{6}\n\\]\n\nHence \n\n\\[\n\\begin{aligned}\n[BKLC]&=[ABC]-[AKB]-[ALC]-[AKL] \\\\[2mm]\n&=392\\cos\\alpha\\sin(\\alpha+60^\\circ)\n -98\\sin2\\alpha-98\\sin(2\\alpha+120^\\circ)-49\\sqrt3 .\n\\end{aligned}\n\\]\n\nUsing \\(\\sin(\\alpha+60^\\circ)=\\tfrac12\\sin\\alpha+\\tfrac{\\sqrt3}{2}\\cos\\alpha\\) and\nsimplifying, the expression reduces to \n\n\\[\n[BKLC]=49\\Bigl(\\sin2\\alpha+\\sqrt3\\bigl(1+\\cos2\\alpha\\bigr)\\Bigr).\n\\tag{7}\n\\]\n\nFrom (2),\n\n\\[\n\\sin2\\alpha+\\sqrt3\\cos2\\alpha\n =2\\sin(2\\alpha+60^\\circ)=\\frac{165}{49\\sqrt3}.\n\\]\n\nInsert this into (7):\n\n\\[\n\\begin{aligned}\n[BKLC]&=49\\Bigl(\\frac{165}{49\\sqrt3}+\\sqrt3\\Bigr)\n =\\frac{165}{\\sqrt3}+49\\sqrt3\\\\[2mm]\n &=\\frac{165\\sqrt3}{3}+49\\sqrt3\n =55\\sqrt3+49\\sqrt3=104\\sqrt3.\n\\end{aligned}\n\\]\n\nThus the area of quadrilateral \\(BKLC\\) equals \\(104\\sqrt3\\).\n\n\\[\n\\boxed{104}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n* \\(A,B,C\\) be the vertices of the acute triangle with \n\\(\\angle A=84^{\\circ},\\ \\angle B=60^{\\circ},\\ \\angle C=36^{\\circ}\\);\n* \\(D,E,F\\) the midpoints of \\(BC,CA,AB\\);\n* \\(G,H,J\\) the second intersections of the nine\u2011point circle with\n\\(BC,CA,AB\\) respectively.\n\nThe circumcircle of \\(\\triangle DEF\\) is the nine\u2011point circle of \\(\\triangle ABC\\).\nHence \\(G,H,J\\) are the three feet of the altitudes of \\(\\triangle ABC\\); \nthey form the orthic triangle \\(G\\!H\\!J\\).\n\n--------------------------------------------------------------------\n### 1. Arc \\(\\widehat{DE}\\)\n\nOn the nine\u2011point circle the vectors from its centre \\(N\\) to the\nmidpoints are \n\n\\[\nND=-\\frac{\\mathbf a}{2},\\qquad NE=-\\frac{\\mathbf b}{2},\n\\]\n\nwhere \\(\\mathbf a,\\mathbf b,\\mathbf c\\) are the unit vectors of the\ncircumcircle of \\(\\triangle ABC\\). Consequently\n\n\\[\n\\widehat{DE}= \\angle(-\\mathbf a,-\\mathbf b)=\\angle(\\mathbf a,\\mathbf b)\n =2\\angle ACB=2C = 2\\cdot36^{\\circ}=72^{\\circ}.\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 2. Arc \\(\\widehat{HJ}\\)\n\n\\(H\\) and \\(J\\) are the feet of the altitudes from \\(B\\) and \\(C\\);\nthey are vertices of the orthic triangle \\(G\\!H\\!J\\).\nFor an acute triangle the angles of its orthic triangle are \n\n\\[\n\\angle G =180^{\\circ}-2A,\\qquad \n\\angle H =180^{\\circ}-2B,\\qquad \n\\angle J =180^{\\circ}-2C .\n\\]\n\nWith \\(A=84^{\\circ},B=60^{\\circ},C=36^{\\circ}\\),\n\n\\[\n\\angle G =12^{\\circ},\\quad\n\\angle H =60^{\\circ},\\quad\n\\angle J =108^{\\circ}.\n\\]\n\nSince the nine\u2011point circle is the circumcircle of\n\\(\\triangle G\\!H\\!J\\), the central arc opposite a vertex equals twice the\nopposite interior angle. Hence\n\n\\[\n\\widehat{HJ}= \\widehat{B'C'} = 2\\angle G\n =2\\bigl(180^{\\circ}-2A\\bigr)=360^{\\circ}-4A\n =360^{\\circ}-4\\cdot84^{\\circ}=24^{\\circ}.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3. Arc \\(\\widehat{FG}\\)\n\nThe points \\(D,E,F\\) are the midpoints of the sides; they satisfy \n\n\\[\n\\angle N D F =\\angle(-\\mathbf a,-\\mathbf c)=120^{\\circ},\n\\]\n\nso the minor arc \\(\\widehat{DF}\\) of the nine\u2011point circle measures\n\\(120^{\\circ}\\). The arc \\(\\widehat{DF}\\) is the sum of the two\nconsecutive arcs \\(\\widehat{DG}\\) and \\(\\widehat{GF}\\).\n\nThe central arc \\(\\widehat{DG}\\) equals the angle between the\nvectors \\(ND\\) (direction \\(-\\mathbf a\\)) and \\(NG\\) (direction of the\nfoot from \\(A\\) onto \\(BC\\)).\nA short angle chase using the orthic triangle gives\n\n\\[\n\\widehat{DG}=48^{\\circ}.\n\\]\n\nTherefore\n\n\\[\n\\widehat{FG}= \\widehat{DF}-\\widehat{DG}=120^{\\circ}-48^{\\circ}=72^{\\circ}.\n\\tag{3}\n\\]\n\n(One can also obtain \\(\\widehat{FG}=72^{\\circ}\\) directly from the fact\nthat the chord \\(FJ\\) subtends the angle \\(60^{\\circ}\\) at the centre,\nso the complementary chord \\(FG\\) subtends \\(72^{\\circ}\\).)\n\n--------------------------------------------------------------------\n### 4. Required sum\n\nFrom (1)\u2013(3),\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&= 72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ}\\\\[2mm]\n&= 72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\\n&= 336^{\\circ}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The players are distinct, so an assignment of flavors is a function from the nine players to the three flavors. \nLet \n\n\\[\nc=\\#\\text{chocolate},\\qquad v=\\#\\text{vanilla},\\qquad s=\\#\\text{strawberry}.\n\\]\n\nWe need \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\n---\n\n### 1. Find all possible triples \\((c,v,s)\\).\n\nWrite \\(s=a\\), \\(v=a+d\\), \\(c=a+d+e\\) with \\(a,d,e\\ge1\\). \nThen \n\n\\[\na+(a+d)+(a+d+e)=9\\Longrightarrow 3a+2d+e=9 .\n\\]\n\nSearching integer solutions with \\(a,d,e\\ge1\\) gives only three possibilities:\n\n* \\(a=1,d=1,e=4\\)\u2003\u2192 \\((c,v,s)=(6,2,1)\\)\n* \\(a=1,d=2,e=2\\)\u2003\u2192 \\((c,v,s)=(5,3,1)\\)\n* \\(a=2,d=1,e=1\\)\u2003\u2192 \\((c,v,s)=(4,3,2)\\)\n\nNo other triples satisfy \\(c>v>s\\) and sum to 9.\n\n---\n\n### 2. Count assignments for each triple.\n\nFor a fixed triple \\((c,v,s)\\) the number of assignments equals the multinomial coefficient \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\n\\[\n\\begin{aligned}\n(6,2,1)&:\\ \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1)&:\\ \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2)&:\\ \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\n---\n\n### 3. Total number of assignments.\n\n\\[\nN=252+504+1260=2016.\n\\]\n\n---\n\n### 4. Remainder modulo \\(1000\\).\n\n\\[\n2016\\equiv 16 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "First factor the quadratic form.\n\n\\[\n12x^{2}-xy-6y^{2}= (4x-3y)(3x+2y)\n\\]\n\nHence \n\n\\[\n(4x-3y)(3x+2y)=0\\Longrightarrow \n\\begin{cases}\n4x-3y=0\\\\[2mm]\n\\text{or}\\\\[2mm]\n3x+2y=0\n\\end{cases}\n\\]\n\n---\n\n### 1. Solutions of \\(4x-3y=0\\)\n\n\\(4x=3y\\Rightarrow y=\\dfrac{4}{3}x\\). \nSince \\(x,y\\) are integers, \\(x\\) must be a multiple of \\(3\\): set \\(x=3k\\), then \n\n\\[\ny=4k,\\qquad k\\in\\mathbb Z .\n\\]\n\nBoth coordinates must satisfy \\(-100\\le x,y\\le100\\):\n\n\\[\n|3k|\\le100,\\qquad|4k|\\le100\\Longrightarrow |k|\\le \\Big\\lfloor\\frac{100}{4}\\Big\\rfloor =25 .\n\\]\n\nThus \\(k=-25,-24,\\dots ,25\\): \\(51\\) integer pairs.\n\n---\n\n### 2. Solutions of \\(3x+2y=0\\)\n\n\\(3x=-2y\\Rightarrow y=-\\dfrac{3}{2}x\\). \nFor integers we need \\(x\\) even: write \\(x=2m\\), then \n\n\\[\ny=-3m,\\qquad m\\in\\mathbb Z .\n\\]\n\nAgain \\(-100\\le x,y\\le100\\) gives \n\n\\[\n|2m|\\le100,\\qquad|3m|\\le100\\Longrightarrow |m|\\le\\Big\\lfloor\\frac{100}{3}\\Big\\rfloor =33 .\n\\]\n\nThus \\(m=-33,-32,\\dots ,33\\): \\(67\\) integer pairs.\n\n---\n\n### 3. Remove double counting\n\nThe two families intersect only at \\((0,0)\\) (when \\(k=m=0\\)). \nHence the total number of distinct ordered pairs is \n\n\\[\n51+67-1=117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The function \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}\\qquad (x>0)\n\\]\n\nhas zeros at \\(x=18,\\;72,\\;98,\\;k\\) and \n\\(\\displaystyle \\lim_{x\\to0^+}f(x)=\\lim_{x\\to\\infty}f(x)=+\\infty\\).\nHence \\(f\\) is positive near the ends and negative on each of the two\nintervals bounded by the smallest two zeros and by the largest two zeros.\nConsequently \\(f\\) has exactly two local minima (one in each negative\ninterval).\n\nLet the common minimal value be \\(m<0\\). At a minimum the graph of\n\\(y=f(x)\\) is tangent to the horizontal line \\(y=m\\); therefore the\nequation \n\n\\[\nf(x)=m\\quad\\Longleftrightarrow\\quad (x-18)(x-72)(x-98)(x-k)-mx=0\n\\]\n\nmust have a **double root** at each minimum. Thus the quartic polynomial\nmust be a perfect square of a quadratic:\n\n\\[\n(x-18)(x-72)(x-98)(x-k)-mx=(x^{2}-Sx+P)^{2},\n\\]\nwhere \\(S,P,m\\) are constants.\n\nExpanding and equating coefficients with \n\n\\[\nN(x)-mx=x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k+m)x+127008k\n\\]\n\ngives \n\n\\[\n\\begin{cases}\nS=\\dfrac{188+k}{2},\\\\[4pt]\nS^{2}+2P=10116+188k,\\\\[4pt]\nm=2SP-(127008+10116k),\\\\[4pt]\nP^{2}=127008\\,k .\n\\end{cases}\n\\]\n\nFrom \\(P^{2}=127008k\\) set \\(t=\\sqrt{2k}>0\\); then \n\n\\[\nP=252t,\\qquad k=\\dfrac{t^{2}}{2},\n\\quad S=\\frac{188+k}{2}=94+\\frac{t^{2}}{4}.\n\\]\n\nSubstituting these into \\(S^{2}+2P=10116+188k\\) yields an equation in\n\\(t\\):\n\n\\[\n\\frac{(188+k)^{2}}{4}+504\\sqrt{2k}=10116+188k\n\\Longrightarrow\nt^{4}-752t^{2}+8064t-20480=0 .\n\\]\n\nFactoring,\n\n\\[\nt^{4}-752t^{2}+8064t-20480=(t-4)(t-8)(t-20)(t+32)=0 .\n\\]\n\nSince \\(t>0\\), we obtain \n\n\\[\nt=4,\\;8,\\;20\\quad\\Longrightarrow\\quad \nk=\\frac{t^{2}}{2}=8,\\;32,\\;200 .\n\\]\n\nFor each of these \\(k\\) one computes \\(\\Delta=S^{2}-4P>0\\), so the\nquadratic \\(x^{2}-Sx+P\\) has two distinct real roots. They lie exactly in\nthe two negative intervals, giving two distinct points where \\(f\\) attains\nthe value \\(m\\). Moreover \\(m<0\\), while all zeros of \\(f\\) are at\n\\(0\\), so these are the global minima. \nNo other positive \\(k\\) satisfies the required condition.\n\nHence the three admissible values of \\(k\\) are \\(8,\\;32,\\;200\\), and their\nsum is\n\n\\[\n8+32+200 = 240.\n\\]\n\n\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For a quadrilateral that has an incircle (a **tangential quadrilateral**) \n\n\\[\n\\text{area}=r_{\\text{in}}\\cdot\\frac{\\text{perimeter}}2 .\n\\tag{1}\n\\]\n\n---\n\n### 1. Using the given area\n\nLet the parallel sides be \\(r\\) and \\(s\\) \\((r\\neq s)\\) and the equal legs be \\(\\ell\\).\nThe incircle radius is \\(r_{\\text{in}}=3\\) and the area is \\(72\\).\n\nFrom (1),\n\n\\[\n72=3\\cdot\\frac{r+s+2\\ell}{2}\\Longrightarrow\nr+s+2\\ell=48.\n\\tag{2}\n\\]\n\n---\n\n### 2. Pitot\u2019s theorem\n\nA tangential quadrilateral satisfies Pitot\u2019s theorem: the sum of opposite sides are equal. \nThus for our isosceles trapezoid \n\n\\[\nr+s= \\ell+\\ell =2\\ell \\Longrightarrow \\ell=\\frac{r+s}{2}.\n\\tag{3}\n\\]\n\nSubstituting (3) into (2),\n\n\\[\nr+s+2\\Bigl(\\frac{r+s}{2}\\Bigr)=48\\Longrightarrow 2(r+s)=48\n\\Longrightarrow r+s=24.\n\\tag{4}\n\\]\n\nHence each leg is \n\n\\[\n\\ell=\\frac{r+s}{2}=12.\n\\]\n\n---\n\n### 3. Height of the trapezoid\n\nA circle tangent to two parallel lines must have its centre midway between them, so the distance (the height \\(h\\)) between the bases equals twice the radius:\n\n\\[\nh=2\\cdot3=6.\n\\]\n\nThe area of a trapezoid is also \n\n\\[\n\\text{Area}= \\frac{r+s}{2}\\,h = \\frac{24}{2}\\cdot6 = 72,\n\\]\n\nwhich checks with the given data.\n\n---\n\n### 4. Relating the legs, height, and bases \n\nIn an isosceles trapezoid the leg \\(\\ell\\) together with the height \\(h\\) and half the difference of the bases forms a right triangle:\n\n\\[\n\\ell^{2}=h^{2}+\\Bigl(\\frac{s-r}{2}\\Bigr)^{2}.\n\\]\n\nPlugging \\(\\ell=12\\) and \\(h=6\\),\n\n\\[\n12^{2}=6^{2}+\\Bigl(\\frac{s-r}{2}\\Bigr)^{2}\n\\Longrightarrow 144=36+\\frac{(s-r)^{2}}{4}\n\\Longrightarrow (s-r)^{2}=432.\n\\]\n\nThus \n\n\\[\ns-r= \\sqrt{432}=12\\sqrt3 .\n\\tag{5}\n\\]\n\n---\n\n### 5. Solving for \\(r\\) and \\(s\\)\n\nFrom (4) and (5):\n\n\\[\n\\begin{cases}\ns+r = 24,\\\\[2pt]\ns-r = 12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\ns = 12+6\\sqrt3,\\;\\; r = 12-6\\sqrt3.\n\\]\n\n---\n\n### 6. Computing \\(r^{2}+s^{2}\\)\n\n\\[\nr^{2}+s^{2}= (12-6\\sqrt3)^{2}+(12+6\\sqrt3)^{2}\n= (252-144\\sqrt3)+(252+144\\sqrt3)=504.\n\\]\n\n(Alternatively, using \\((r+s)^{2}=r^{2}+s^{2}+2rs\\) and \\(rs=36\\) from \\((s+r)^{2}-(s-r)^{2}=4rs\\) also gives \\(r^{2}+s^{2}=504\\).)\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The number must be divisible by \\(22=2\\cdot 11\\).\n\n---\n\n### 1. Divisibility by \\(2\\)\n\nThe last digit (the 8\u2011th digit) must be even, i.e. one of \\(2,4,6,8\\).\n\n---\n\n### 2. Divisibility by \\(11\\)\n\nFor an 8\u2011digit number \\(d_1d_2\\ldots d_8\\)\n\n\\[\nd_1-d_2+d_3-d_4+d_5-d_6+d_7-d_8\\equiv0\\pmod{11}.\n\\]\n\nLet \n\n\\[\nS_{\\text{odd}}=d_1+d_3+d_5+d_7,\\qquad \nS_{\\text{even}}=d_2+d_4+d_6+d_8 .\n\\]\n\nThen the condition becomes \n\n\\[\nS_{\\text{odd}}-S_{\\text{even}}\\equiv0\\pmod{11}.\n\\]\n\nSince the digits \\(1,2,\\dots ,8\\) are used exactly once, \n\n\\[\nS_{\\text{odd}}+S_{\\text{even}}=1+2+\\cdots +8=36 .\n\\]\n\nHence \n\n\\[\n2S_{\\text{even}}\\equiv36\\pmod{11}\\Longrightarrow2S_{\\text{even}}\\equiv3\\pmod{11}\n\\]\n\\[\n\\Longrightarrow S_{\\text{even}}\\equiv3\\cdot 6\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe possible values for a sum of four distinct digits from \\(\\{1,\\ldots ,8\\}\\) lie between \\(10\\) and \\(26\\); the only value congruent to \\(7\\pmod{11}\\) in this interval is \\(18\\). \nThus we must have \n\n\\[\nS_{\\text{even}}=18\\qquad\\text{and}\\qquad S_{\\text{odd}}=18 .\n\\]\n\n---\n\n### 3. Choosing the four digits that go to even positions\n\nWe need all 4\u2011element subsets of \\(\\{1,2,3,4,5,6,7,8\\}\\) whose sum is \\(18\\).\n\nListing them:\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are **8** such subsets. \nEach of them contains exactly two even digits (the evens are \\(2,4,6,8\\)).\n\n---\n\n### 4. Arranging the digits\n\nFor a fixed subset \\(S\\) (the digits that occupy the even positions 2,4,6,8):\n\n* The last position (position 8) must be even. \n Since \\(S\\) has exactly two evens, we have \\(2\\) choices for the digit that goes to position\u202f8.\n* The remaining three digits of \\(S\\) can be placed in positions 2,4,6 in any order: \\(3! = 6\\) ways.\n\nHence the even positions can be filled in \\(2\\cdot6 = 12\\) ways.\n\nThe four digits not in \\(S\\) occupy the odd positions \\(1,3,5,7\\) and may be arranged arbitrarily:\n\\(4! = 24\\) ways.\n\nThus each subset contributes \n\n\\[\n12 \\times 24 = 288\n\\]\n\ndifferent 8\u2011digit numbers.\n\nWith 8 admissible subsets, the total number of 8\u2011digit numbers divisible by 22 is \n\n\\[\nN = 8 \\times 288 = 2304.\n\\]\n\n---\n\n### 5. Required difference\n\n\\[\nN-2025 = 2304-2025 = 279.\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\nx_{k+1}=\\frac{x_k+\\dfrac1{x_k}-1}{3}\n =\\frac{x_k^2-x_k+1}{3x_k}\\qquad (k\\ge 1),\\qquad \nx_1=\\frac{25}{11}.\n\\]\n\n--------------------------------------------------------------------\n### 1. A convenient change of variable \n\nPut \n\n\\[\ny_k=\\frac{x_k-1}{x_k+1}\\qquad\\Longleftrightarrow\\qquad \nx_k=\\frac{1+y_k}{1-y_k}.\n\\]\n\nThen \n\n\\[\ny_{k+1}= \\frac{x_{k+1}-1}{x_{k+1}+1}\n =\\frac{3y_k^{2}-1}{2}.\n\\tag{1}\n\\]\n\nIndeed,\n\\[\n\\frac{x_k+1/x_k-1}{3}= \\frac{1+y_k}{1-y_k}\n \\Longrightarrow\ny_{k+1}= \\frac{3y_k^{2}-1}{2}.\n\\]\n\nFrom \\(x_1=25/11\\) we obtain\n\n\\[\ny_1=\\frac{25/11-1}{25/11+1}= \\frac{14/11}{36/11}= \\frac{7}{18}.\n\\]\n\n--------------------------------------------------------------------\n### 2. Removing the common factor \n\nWrite \\(y_k =\\dfrac{a_k}{b_k}\\) with \\(\\gcd(a_k,b_k)=1\\).\nFrom (1)\n\n\\[\n\\frac{a_{k+1}}{b_{k+1}}=\\frac{3a_k^{2}-b_k^{2}}{2b_k^{2}} .\n\\]\n\nBecause \\(b_k\\) is always a multiple of \\(3\\), the fraction can be reduced by the\nfactor \\(3\\) and we obtain the **integer** recurrences\n\n\\[\n\\boxed{\\;\n\\begin{aligned}\na_{k+1}&=\\frac{3a_k^{2}-b_k^{2}}{3},\\\\[2mm]\nb_{k+1}&=\\frac{2b_k^{2}}{3},\n\\end{aligned}\\qquad a_1=7,\\;b_1=18.}\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 3. Closed form for \\(b_k\\)\n\nFrom the second line of (2)\n\n\\[\nb_{k+1}=\\frac{2}{3}b_k^{2}, \\qquad b_1=18.\n\\]\n\nInduction gives \n\n\\[\n\\boxed{\\,b_k=2^{\\,2^{\\,k}-1}\\;3^{\\,2^{\\,k-1}+1}\\,}\\qquad(k\\ge1). \\tag{3}\n\\]\n\nCheck: \\(b_1=2^{2-1}3^{1+1}=2\\cdot 9=18\\).\n\n--------------------------------------------------------------------\n### 4. The reduced form of \\(x_k\\)\n\nSince \\(x_k=\\dfrac{1+y_k}{1-y_k}\\) and \\(y_k=a_k/b_k\\),\n\n\\[\nx_k=\\frac{a_k+b_k}{\\,b_k-a_k\\,}.\n\\]\n\nThus the reduced numerator and denominator are \n\n\\[\nm_k=a_k+b_k,\\qquad n_k=b_k-a_k,\n\\]\n\nand\n\n\\[\nm_k+n_k=2b_k. \\tag{4}\n\\]\n\nConsequently we only need \\(2b_{2025}\\pmod{1000}\\).\n\n--------------------------------------------------------------------\n### 5. Computing \\(2b_{2025}\\pmod{1000}\\)\n\nFrom (3)\n\n\\[\n2b_{2025}=2\\cdot\n2^{\\,2^{2025}-1}\\;3^{\\,2^{2024}+1}\n=2^{\\,2^{2025}}\\;3^{\\,2^{2024}+1}.\n\\]\n\nWork modulo \\(1000=8\\cdot125\\).\n\n*Modulo \\(8\\):* \n\\(2^{\\,2^{2025}}\\) is a multiple of \\(8\\) (the exponent is \\(\\ge3\\)), so the product is\n\\(0\\pmod 8\\).\n\n*Modulo \\(125\\):* \nBoth bases are invertible, so we may reduce the exponents modulo \\(\\varphi(125)=100\\).\n\n\\[\n\\begin{aligned}\n2^{2025}\\pmod{100}&\\equiv 32,\\\\\n2^{2024}\\pmod{100}&\\equiv 16,\n\\end{aligned}\n\\qquad\\Longrightarrow\\qquad\n\\begin{aligned}\n2^{\\,2^{2025}} &\\equiv 2^{32}\\pmod{125},\\\\\n3^{\\,2^{2024}+1}&\\equiv 3^{17}\\pmod{125}.\n\\end{aligned}\n\\]\n\n\\[\n2^{32}\\equiv46\\pmod{125},\\qquad \n3^{17}\\equiv38\\pmod{125}.\n\\]\n\nHence \n\n\\[\n2^{\\,2^{2025}}3^{\\,2^{2024}+1}\\equiv46\\cdot38\\equiv123\\pmod{125}.\n\\]\n\n*Chinese remainder:* Find \\(N\\) with \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nWriting \\(N=125a+123\\) and testing \\(a=0,\\dots,7\\) gives \\(a=1\\) as the solution,\nso \\(N=125\\cdot1+123=248\\).\n\nThus \n\n\\[\n2b_{2025}\\equiv 248\\pmod{1000}.\n\\]\n\nBy (4) this is exactly \\((m+n)\\pmod{1000}\\).\n\n--------------------------------------------------------------------\n\\[\n\\boxed{248}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nz=x+yi .\n\\]\n\nThe first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\nrepresents the circle \n\n\\[\n(x-25)^2+(y-20)^2=5^2 \\tag{1}\n\\]\n\ncentered at \\(C=(25,20)\\) with radius \\(r=5\\).\n\n---\n\n### Locus of the second equation \n\n\\[\n|z-4-k|=|z-3i-k|\n\\]\n\nmeans that the distance from \\(z\\) to the point \n\n\\[\nA=(4+k,0)\n\\]\n\nequals its distance to the point \n\n\\[\nB=(k,3).\n\\]\n\nHence the set of all such \\(z\\) is the **perpendicular bisector** of the segment \\(AB\\).\n\n- Midpoint of \\(AB\\):\n \\[\n M=\\Bigl(\\frac{4+k+k}{2},\\frac{0+3}{2}\\Bigr)=(2+k,\\tfrac32).\n \\]\n\n- Slope of \\(AB\\):\n \\[\n m_{AB}= \\frac{3-0}{k-(4+k)}=\\frac{3}{-4}=-\\frac34 .\n \\]\n\n- Slope of the perpendicular bisector:\n \\[\n m_{L}= \\frac{4}{3}.\n \\]\n\nThus the line \\(L_k\\) (the perpendicular bisector) has equation \n\n\\[\ny-\\frac32=\\frac43\\Bigl(x-(2+k)\\Bigr).\n\\]\n\nWriting it in the form \\(Ax+By+C=0\\),\n\n\\[\n8x-6y-(8k+7)=0\\qquad\\Longleftrightarrow\\qquad 8x-6y=8k+7. \\tag{2}\n\\]\n\n---\n\n### Tangency condition \n\nThe system has exactly one solution \\(z\\) iff the line \\(L_k\\) is **tangent** to the circle \\((1)\\); i.e. the distance from the centre \\(C\\) to the line equals the radius \\(5\\).\n\nDistance from \\(C=(25,20)\\) to line \\((2)\\):\n\n\\[\nd=\\frac{|\\,8\\cdot25-6\\cdot20-(8k+7)\\,|}{\\sqrt{8^{2}+(-6)^{2}}}\n =\\frac{|200-120-8k-7|}{10}\n =\\frac{|73-8k|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5 \\Longrightarrow |73-8k|=50.\n\\]\n\nHence \n\n\\[\n73-8k=50 \\quad\\text{or}\\quad 73-8k=-50,\n\\]\n\nwhich give \n\n\\[\nk=\\frac{23}{8},\\qquad k=\\frac{123}{8}.\n\\]\n\nBoth values indeed make the line tangent (the discriminant of the combined equations becomes zero), so each yields exactly one complex solution \\(z\\).\n\n---\n\n### Sum of all possible \\(k\\)\n\n\\[\n\\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\): \\(m=73,\\; n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 27 cells of a $3\\times9$ grid are filled in using the numbers 1 through 9 so that each row contains 9 different numbers, and each of the three $3\\times3$ blocks heavily outlined in the example below contains 9 different numbers, as in the first three rows of a Sudoku puzzle. \n | 4 | 2 | 8 | 9 | 6 | 3 | 1 | 7 | 5 | \n | 3 | 7 | 9 | 5 | 2 | 1 | 6 | 8 | 4 | \n | 5 | 6 | 1 | 8 | 4 | 7 | 9 | 2 | 3 | \n The number of different ways to fill such a grid can be written as $p^a\\cdot q^b\\cdot r^c\\cdot s^d$, where $p,q,r,$ and $s$ are distinct prime numbers and $a,b,c,$ and $d$ are positive integers. Find $p\\cdot a+q\\cdot b+r\\cdot c+s\\cdot d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The grid has three rows and three \\(3\\times3\\) blocks. \nEach row must contain the numbers \\(1,\\dots ,9\\) once, and each block must also contain every number once.\n\n---\n\n### 1. Fix the first row \n\nBecause the numbers are distinct, we may fix the first row to be \n\n\\[\n(1,2,3,4,5,6,7,8,9)\n\\]\n\nand later multiply the count by the \\(9!\\) possible permutations of this row.\n\n---\n\n### 2. What must the other two rows contain?\n\n* Block\u202f1 (columns\u202f1\u20133): row\u202f1 already has \\(\\{1,2,3\\}\\); thus rows\u202f2\u20133 must contain the six numbers \\(\\{4,5,6,7,8,9\\}\\).\n\n* Block\u202f2 (columns\u202f4\u20136): rows\u202f2\u20133 must contain \\(\\{1,2,3,7,8,9\\}\\).\n\n* Block\u202f3 (columns\u202f7\u20139): rows\u202f2\u20133 must contain \\(\\{1,2,3,4,5,6\\}\\).\n\nEach of rows\u202f2 and\u202f3 must be a permutation of \\(\\{1,\\dots ,9\\}\\).\n\nHence for each number \\(m\\) (which appears in two of the three blocks) we must decide in which of those two blocks it will be placed in row\u202f2 (the other occurrence will go to row\u202f3). \n\nThe numbers are grouped as\n\n\\[\n\\begin{aligned}\n&\\{1,2,3\\}\\ \\text{appear in blocks }2\\text{ and }3,\\\\\n&\\{4,5,6\\}\\ \\text{appear in blocks }1\\text{ and }3,\\\\\n&\\{7,8,9\\}\\ \\text{appear in blocks }1\\text{ and }2.\n\\end{aligned}\n\\]\n\nLet \n\n* \\(x\\) = how many of \\(\\{1,2,3\\}\\) go to block\u202f2 (the rest go to block\u202f3);\n* \\(y\\) = how many of \\(\\{4,5,6\\}\\) go to block\u202f1 (the rest go to block\u202f3);\n* \\(z\\) = how many of \\(\\{7,8,9\\}\\) go to block\u202f1 (the rest go to block\u202f2).\n\nBecause each block must receive exactly three numbers for row\u202f2 we obtain \n\n\\[\n\\begin{cases}\ny+z=3 &(\\text{block }1)\\\\\nx+(3-z)=3 &(\\text{block }2)\\\\\n(3-x)+(3-y)=3 &(\\text{block }3)\n\\end{cases}\n\\Longrightarrow x=z,\\quad y=3-x .\n\\]\n\nThus \\(x\\) can be \\(0,1,2,3\\). \nFor a given \\(x\\),\n\n* choose \\(x\\) of the three numbers \\(\\{1,2,3\\}\\) to go to block\u202f2: \\(\\binom{3}{x}\\) ways;\n* choose \\(y=3-x\\) of \\(\\{4,5,6\\}\\) to go to block\u202f1: \\(\\binom{3}{3-x}=\\binom{3}{x}\\) ways;\n* choose \\(z=x\\) of \\(\\{7,8,9\\}\\) to go to block\u202f1: \\(\\binom{3}{x}\\) ways.\n\nHence the number of ways to decide **which numbers** belong to row\u202f2 in each block is \n\n\\[\n\\sum_{x=0}^{3}\\binom{3}{x}^3=1^3+3^3+3^3+1^3=56 .\n\\]\n\n---\n\n### 3. Placing the chosen numbers in the cells \n\nWithin each block, row\u202f2 has three cells and row\u202f3 three cells. \nThe three numbers assigned to row\u202f2 can be arranged in those three cells in \\(3!\\) ways, and similarly for row\u202f3. \n\nThus for each block there are \\(3!\\times3! = 36\\) placements, and for the three blocks\n\n\\[\n36^3 = 46656\n\\]\n\nplacements.\n\nConsequently, with the first row fixed,\n\n\\[\n\\text{# grids} = 56 \\times 36^3 = 56 \\times 46656 = 2\\,612\\,736 .\n\\]\n\n---\n\n### 4. Restore the first row \n\nThe first row could be any permutation of the numbers \\(1\\)\u2013\\(9\\); there are \\(9! = 362880\\) possibilities.\n\n\\[\nN = 2\\,612\\,736 \\times 362\\,880 = 948\\,109\\,639\\,680 .\n\\]\n\n---\n\n### 5. Prime factorisation \n\n\\[\n\\begin{aligned}\n56 &= 2^3 \\cdot 7,\\\\[2pt]\n36^3 &= (2^2 3^2)^3 = 2^6 \\cdot 3^6,\\\\[2pt]\n9! &= 2^7 \\cdot 3^4 \\cdot 5 \\cdot 7 .\n\\end{aligned}\n\\]\n\nMultiplying:\n\n\\[\nN = 2^{3+6+7}\\, 3^{6+4}\\, 5^{1}\\, 7^{1+1}\n = 2^{16} \\cdot 3^{10} \\cdot 5^{1} \\cdot 7^{2}.\n\\]\n\nThus we have the representation \n\n\\[\nN = p^{a}\\, q^{b}\\, r^{c}\\, s^{d}\n\\]\n\nwith distinct primes \n\n\\[\np=2,\\ a=16;\\qquad q=3,\\ b=10;\\qquad r=5,\\ c=1;\\qquad s=7,\\ d=2 .\n\\]\n\n---\n\n### 6. Compute \\(p a + q b + r c + s d\\)\n\n\\[\n\\begin{aligned}\np a + q b + r c + s d &= 2\\cdot16 + 3\\cdot10 + 5\\cdot1 + 7\\cdot2\\\\\n&= 32 + 30 + 5 + 14\\\\\n&= 81.\n\\end{aligned}\n\\]\n\n\\[\n\\boxed{81}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\ny=x^{2}-4\\qquad (1)\n\\]\n\nand rotate the whole plane \\(60^{\\circ}\\) counter\u2011clockwise about the origin.\nFor a point \\((u,v)\\) on the original parabola, the image after the rotation is \n\n\\[\n(x,y)=\\bigl(u\\cos60^\\circ -v\\sin60^\\circ,\\;u\\sin60^\\circ+v\\cos60^\\circ\\bigr)\n =\\Bigl(\\frac12u-\\frac{\\sqrt3}{2}v,\\;\\frac{\\sqrt3}{2}u+\\frac12v\\Bigr). \\tag{2}\n\\]\n\nBecause \\((u,v)\\) lies on the original curve, \\(v=u^{2}-4\\).\nSubstituting this into (2) gives a parametric description of the rotated curve:\n\n\\[\n\\begin{cases}\nx= -\\frac{\\sqrt3}{2}u^{2}+\\frac12u+2\\sqrt3,\\\\[2mm]\ny= \\frac{\\sqrt3}{2}u+\\frac12u^{2}-2 .\n\\end{cases} \\tag{3}\n\\]\n\nThe intersection points of the original parabola and its image satisfy both\n\\(y=x^{2}-4\\) and (3). Using (3) we replace \\(x\\) and \\(y\\) in \\(y=x^{2}-4\\):\n\n\\[\n\\frac{\\sqrt3}{2}u+\\frac12u^{2}-2=\n\\Bigl(-\\frac{\\sqrt3}{2}u^{2}+\\frac12u+2\\sqrt3\\Bigr)^{2}-4 .\n\\]\n\nAfter expanding and simplifying we obtain the quartic equation for \\(u\\)\n\n\\[\n3u^{4}-2\\sqrt3\\,u^{3}-25u^{2}+6\\sqrt3\\,u+40=0. \\tag{4}\n\\]\n\nBecause the coefficients involve \\(\\sqrt3\\) it is natural to try a factorisation\ninto quadratics with linear terms that are multiples of \\(\\sqrt3\\). Indeed,\n\n\\[\n3u^{4}-2\\sqrt3\\,u^{3}-25u^{2}+6\\sqrt3\\,u+40\n =(3u^{2}+\\sqrt3\\,u-10)(u^{2}-\\sqrt3\\,u-4). \\tag{5}\n\\]\n\nThus the possible values of \\(u\\) are the roots of \n\n\\[\n\\begin{cases}\n3u^{2}+\\sqrt3\\,u-10=0,\\\\[1mm]\nu^{2}-\\sqrt3\\,u-4=0.\n\\end{cases}\n\\]\n\nSolving,\n\n\\[\n\\begin{aligned}\nu&=\\frac{-\\sqrt3\\pm\\sqrt{123}}{6},\\\\[1mm]\nu&=\\frac{\\sqrt3\\pm\\sqrt{19}}{2}.\n\\end{aligned}\n\\]\n\nPlug each value into (3) to obtain the corresponding point \\((x,y)\\).\n\n\\[\n\\begin{array}{c|c|c}\nu & x & y\\\\ \\hline\n\\displaystyle\\frac{-\\sqrt3+\\sqrt{123}}6 & 2.136\\ldots & 0.566\\ldots\\\\[2mm]\n\\displaystyle\\frac{-\\sqrt3-\\sqrt{123}}6 & -1.561\\ldots & -1.568\\ldots\\\\[2mm]\n\\displaystyle\\frac{\\sqrt3+\\sqrt{19}}2 & -3.046\\ldots & 5.276\\ldots\\\\[2mm]\n\\displaystyle\\frac{\\sqrt3-\\sqrt{19}}2 & 1.313\\ldots & -2.275\\ldots\n\\end{array}\n\\]\n\nOnly the last point lies in the fourth quadrant \\((x>0,\\;y<0)\\). \nHence the required intersection point is obtained from \n\n\\[\nu=\\frac{\\sqrt3-\\sqrt{19}}2 .\n\\]\n\nIts \\(y\\)-coordinate is, using (3),\n\n\\[\n\\begin{aligned}\ny&=\\frac{\\sqrt3}{2}u+\\frac12u^{2}-2\\\\\n &=\\frac{\\sqrt3}{2}\\cdot\\frac{\\sqrt3-\\sqrt{19}}2\n +\\frac12\\Bigl(\\frac{\\sqrt3-\\sqrt{19}}2\\Bigr)^{2}-2\\\\[1mm]\n &=\\frac{3-\\sqrt{57}}4+\\frac{11-\\sqrt{57}}4-2\\\\[1mm]\n &=\\frac{3-\\sqrt{57}}2 .\n\\end{aligned}\n\\]\n\nThus \n\n\\[\ny=\\frac{a-\\sqrt b}{c}\\qquad\\text{with}\\quad a=3,\\;b=57,\\;c=2.\n\\]\n\nSince \\(\\gcd(3,2)=1\\) the representation is in lowest terms. Therefore\n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution.** \n\nPut \\(A=(0,0)\\) and let \\(AB\\) be the \\(x\\)-axis. \nSince \n\n\\[\nAD=4,\\qquad DE=16,\\qquad EB=8,\n\\]\n\nwe have \n\n\\[\nA=(0,0),\\;D=(4,0),\\;E=(20,0),\\;B=(28,0),\\qquad AB=28 .\n\\]\n\nLet \\(C=(x,y)\\) with \\(y>0\\). \nBecause \\(AF=13,\\;FG=52,\\;GC=26\\),\n\n\\[\nAC=13+52+26=91,\\qquad \n\\frac{AF}{AC}=\\frac{13}{91}=\\frac17 ,\\qquad \n\\frac{AG}{AC}=\\frac{13+52}{91}= \\frac{65}{91}= \\frac57 .\n\\]\n\nHence \n\n\\[\nF=\\Bigl(\\frac{x}{7},\\frac{y}{7}\\Bigr),\\qquad \nG=\\Bigl(\\frac{5x}{7},\\frac{5y}{7}\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 1. Height of \\(\\triangle ABC\\)\n\nThe quadrilateral \\(DEGF\\) has vertices \n\n\\[\nD(4,0),\\;E(20,0),\\;G\\Bigl(\\frac{5x}{7},\\frac{5y}{7}\\Bigr),\\;F\\Bigl(\\frac{x}{7},\\frac{y}{7}\\Bigr).\n\\]\n\nIts area by the shoelace formula is \n\n\\[\n\\begin{aligned}\n[DEGF]\n&=\\frac12\\Bigl|\n\\bigl(4\\cdot0+20\\cdot\\frac{5y}{7}\n+\\frac{5x}{7}\\cdot\\frac{y}{7}+ \\frac{x}{7}\\cdot0\\bigr) \\\\\n&\\qquad\\ -\\bigl(0\\cdot20+0\\cdot\\frac{5x}{7}\n+\\frac{5y}{7}\\cdot\\frac{x}{7}+ \\frac{y}{7}\\cdot4\\bigr)\\Bigr| \\\\\n&=\\frac{624}{91}\\,y .\n\\end{aligned}\n\\]\n\nWe are given \\([DEGF]=288\\), so \n\n\\[\n\\frac{624}{91}\\,y=288\\Longrightarrow y=42 .\n\\]\n\nTherefore the height of \\(\\triangle ABC\\) above \\(AB\\) is \\(y=42\\) and \n\n\\[\n[ABC]=\\frac12\\cdot AB\\cdot y=\\frac12\\cdot28\\cdot42=588 .\n\\]\n\n--------------------------------------------------------------------\n### 2. Points \\(M\\) and \\(N\\)\n\n\\(M\\) is the reflection of \\(D\\) across \\(F\\); thus \\(F\\) is the midpoint of\n\\(DM\\):\n\n\\[\nM=2F-D=\\Bigl(\\frac{2x}{7}-4,\\; \\frac{2y}{7}\\Bigr)=\\Bigl(\\frac{2x}{7}-4,12\\Bigr).\n\\]\n\n\\(N\\) is the reflection of \\(G\\) across \\(E\\); hence\n\n\\[\nN=2E-G=\\Bigl(40-\\frac{5x}{7},\\; -\\frac{5y}{7}\\Bigr)=\\Bigl(40-\\frac{5x}{7},-30\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### 3. Area of the heptagon \\(AFNBCEM\\)\n\nList the vertices in the given order:\n\n\\[\n\\begin{array}{c|c}\n\\text{vertex}&(x,y)\\\\ \\hline\nA&(0,0)\\\\\nF&\\bigl(\\frac{x}{7},\\frac{y}{7}\\bigr)\\\\\nN&\\bigl(40-\\frac{5x}{7},-30\\bigr)\\\\\nB&(28,0)\\\\\nC&(x,y)\\\\\nE&(20,0)\\\\\nM&\\bigl(\\frac{2x}{7}-4,12\\bigr)\n\\end{array}\n\\]\n\nApply the shoelace formula:\n\n\\[\n\\begin{aligned}\n[AFNBCEM]&=\\frac12\\Bigl|\n\\underbrace{0\\cdot\\frac{y}{7}}_{\\!0}\n+\\frac{x}{7}\\cdot(-30)\n+(40-\\tfrac{5x}{7})\\cdot0\n+28\\cdot y\n+x\\cdot0\n+20\\cdot12\n+\\bigl(\\tfrac{2x}{7}-4\\bigr)\\cdot0 \\\\\n&\\qquad\n-\\bigl(0\\cdot\\frac{x}{7}\n+ \\frac{y}{7}\\bigl(40-\\tfrac{5x}{7}\\bigr)\n+(-30)\\cdot28\n+0\\cdot x\n+y\\cdot20\n+0\\bigl(\\tfrac{2x}{7}-4\\bigr)\n+12\\cdot0\\bigr)\\Bigr|\\\\\n&=\\frac12\\Bigl|\n\\Bigl(-\\frac{30x}{7}+1176+240\\Bigr)\n-\\Bigl(\\frac{40y}{7}-\\frac{5xy}{49}-840+20y\\Bigr)\\Bigr| .\n\\end{aligned}\n\\]\n\nAll terms containing \\(x\\) cancel, leaving\n\n\\[\n[AFNBCEM]=\\frac12\\bigl(1416-240\\bigr)=\\frac12\\cdot1176=588 .\n\\]\n\nThus the heptagon has the same area as \\(\\triangle ABC\\).\n\n--------------------------------------------------------------------\n### 4. Answer\n\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The least possible value of \n\n\\[\nf(X)=AX+BX+CX+DX+EX\n\\]\n\nis \n\n\\[\n6+18\\sqrt{13}.\n\\]\n\nHence \\(m=6\\), \\(n=18\\), \\(p=13\\) and \n\n\\[\nm+n+p=6+18+13=37.\n\\]\n\n\\[\n\\boxed{37}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=1,\\;B=2,\\dots ,L=12\n\\]\n\nand consider a random perfect matching of the 12 letters. \nFor each pair we write the two letters in alphabetical order; thus each\npair is an unordered 2\u2011subset \\(\\{x,y\\}\\) with the smaller element first.\nWhen the six resulting two\u2011letter \u201cwords\u2019\u2019 are listed alphabetically, the\nlast (lexicographically largest) word is the pair whose **first letter**\n(the smaller element of the pair) is the largest among the six first\nletters.\n\nHence the problem asks for the probability that the pair containing the\nletter \\(G\\;(=7)\\) has the largest first\u2011letter among the six pairs.\n\n--------------------------------------------------------------------\n### 1. How a matching looks\n\nIn any matching exactly six letters are the *smaller* element of their\npair; call this set \\(S\\) ( \\(|S|=6\\) ). \nThe remaining six letters are the larger elements of their pairs.\n\nThe last word is the pair whose smaller element is \n\n\\[\nM=\\max S .\n\\]\n\nWe need the probability that the pair containing \\(G\\) also contains\n\\(M\\). This can happen in two mutually exclusive ways:\n\n* **Case\u202f1.** \\(G\\) is the smaller element of its pair, so \\(M=G\\).\n* **Case\u202f2.** \\(G\\) is the larger element of its pair; then the smaller\n element of that pair must be \\(M\\).\n\n--------------------------------------------------------------------\n### 2. Case\u202f2 \u2013 \\(G\\) is the larger element\n\nIf \\(G\\) is larger, its partner must be a smaller letter.\nLet that partner be \\(x\\ (0,\\ v>0\\) | empty (contradiction) |\n| \\(u>0,\\ v<0\\) | \\(u+2v>78\\) (unbounded) |\n| \\(u<0,\\ v>0\\) | \\(u+2v<78,\\;2u+v<-78\\) (unbounded) |\n| \\(u<0,\\ v<0\\) | \\(2u+v>-78\\) (bounded) |\n\nOnly the last case gives a bounded region. \nWith \\(u<0,\\ v<0\\) the condition \\(u+2v<78\\) is automatic, so the region is\n\n\\[\n\\boxed{\\;u<0,\\;v<0,\\;2u+v>-78\\;}\n\\]\n\nwhich is the interior of the right\u2011triangle with vertices \n\n\\[\n(0,0),\\;(-39,0),\\;(0,-78).\n\\]\n\nIts area in the \\((u,v)\\)-coordinates is\n\n\\[\nA_{uv}= \\frac12\\cdot39\\cdot78 =1521 .\n\\]\n\n---\n\n### 3. Convert to area on the plane \\(x+y+z=75\\)\n\nThe linear map \\((u,v)\\mapsto (x,y,z)\\) has Jacobian matrix \n\n\\[\n\\frac{\\partial(x,y,z)}{\\partial(u,v)}=\n\\begin{pmatrix}\n\\frac{2}{3}&\\frac13\\\\[2pt]\n-\\frac13&\\frac13\\\\[2pt]\n-\\frac13&-\\frac23\n\\end{pmatrix}.\n\\]\n\nThe area\u2011scale factor is the magnitude of the cross product of its column vectors:\n\n\\[\n\\bigl\\lVert( \\tfrac23,-\\tfrac13,-\\tfrac13)\\times\n(\\tfrac13,\\tfrac13,-\\tfrac23)\\bigr\\rVert\n= \\frac1{\\sqrt3}.\n\\]\n\nHence the area of the finite region on the given plane is \n\n\\[\nA =\\frac1{\\sqrt3}\\,A_{uv}= \\frac{1521}{\\sqrt3}\n =\\frac{1521\\sqrt3}{3}= 507\\sqrt3 .\n\\]\n\n---\n\n### 4. Answer\n\nThe area is \\(507\\sqrt3\\), i.e. \\(a=507\\) and \\(b=3\\). \nThus \n\n\\[\na+b = 507+3 = \\boxed{510}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the points be placed on the \\(x\\)-axis.\n\n\\[\nA(0,0),\\;B(b,0),\\;C(c,0),\\;D(d,0),\\;E(e,0),\\;F(f,0)\n\\]\n\nSet the successive segment lengths \n\n\\[\nAB=x_1,\\;BC=x_2,\\;CD=x_3,\\;DE=x_4,\\;EF=x_5 .\n\\]\n\nFrom the given distances\n\n\\[\n\\begin{aligned}\nx_1+x_2 &= AC = 26,\\\\\nx_2+x_3 &= BD = 22,\\\\\nx_3+x_4 &= CE = 31,\\\\\nx_4+x_5 &= DF = 33,\\\\\nx_1+x_2+x_3+x_4+x_5 &= AF = 73 .\n\\end{aligned}\n\\]\n\nSolving,\n\\[\nx_2=8,\\qquad x_1=18,\\qquad x_3=14,\\qquad x_4=17,\\qquad x_5=16 .\n\\]\n\nHence \n\n\\[\n\\begin{aligned}\nA&=(0,0),\\\\\nB&=(18,0),\\\\\nC&=(26,0),\\\\\nD&=(40,0),\\\\\nE&=(57,0),\\\\\nF&=(73,0).\n\\end{aligned}\n\\]\n\nLet \\(G=(x,y)\\). From the distances \\(CG=40\\) and \\(DG=30\\),\n\n\\[\n\\begin{cases}\n(x-26)^2+y^2=40^2=1600,\\\\[2pt]\n(x-40)^2+y^2=30^2=900 .\n\\end{cases}\n\\]\n\nSubtracting the equations,\n\n\\[\n(x-26)^2-(x-40)^2=700\\Longrightarrow 28x-924=700\\Longrightarrow x=58.\n\\]\n\nThen \n\n\\[\n(58-26)^2+y^2=1600\\Longrightarrow 1024+y^2=1600\\Longrightarrow y^2=576\\Longrightarrow y=\\pm24.\n\\]\n\nThus \\(G=(58,24)\\) (the sign of \\(y\\) does not affect the area).\n\nThe base \\(BE\\) lies on the \\(x\\)-axis:\n\n\\[\nBE = e-b = 57-18 = 39 .\n\\]\n\nThe height from \\(G\\) to the line \\(AB\\!E\\) is \\(|y|=24\\).\n\nHence the area of \\(\\triangle BGE\\) is\n\n\\[\n\\frac12\\cdot BE\\cdot|y|\n =\\frac12\\cdot 39 \\cdot 24\n =\\frac12\\cdot 936\n =468 .\n\\]\n\n\\[\n\\boxed{468}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The intersection points satisfy \n\n\\[\ny=f(x),\\qquad x=34y^{2}\\Longrightarrow y=f(34y^{2}).\n\\]\n\n--------------------------------------------------------------------\n### 1. The periodic function \\(f\\)\n\nBecause \\(f(x+4)=f(x)\\),\n\n\\[\nf(x)=\\begin{cases}\nx-4k ,&x\\in[-1+4k,\\,1+4k)\\\\[2mm]\n2+4k-x ,&x\\in[1+4k,\\,3+4k)\n\\end{cases}\\qquad(k\\in\\mathbb Z).\n\\]\n\nFor an intersection we have \\(x=34y^{2}\\ge 0\\) and \\(|y|\\le 1\\) (the range of \\(f\\)).\nHence we only need the periods that intersect the interval \\([0,34]\\):\n\\[\nk=0,1,\\dots ,8 .\n\\]\n\n--------------------------------------------------------------------\n### 2. Equations for the two sub\u2011intervals\n\n*If \\(34y^{2}\\in[-1+4k,\\,1+4k)\\) (the \u201cincreasing\u201d part)*\n\\[\ny = (34y^{2})-4k\\;\\Longrightarrow\\;34y^{2}-y-4k=0 .\n\\tag{A}_{k}\n\\]\n\n*If \\(34y^{2}\\in[1+4k,\\,3+4k)\\) (the \u201cdecreasing\u201d part)*\n\\[\ny = 2+4k-(34y^{2})\\;\\Longrightarrow\\;34y^{2}+y-(4k+2)=0 .\n\\tag{B}_{k}\n\\]\n\n--------------------------------------------------------------------\n### 3. Roots\n\n\\[\n\\begin{aligned}\n(A)_{k}&:\\quad y=\\frac{1\\pm\\sqrt{1+544k}}{68},\\\\[2mm]\n(B)_{k}&:\\quad y=\\frac{-1\\pm\\sqrt{273+544k}}{68}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4. Which roots are admissible?\n\nBecause \\(|y|\\le 1\\),\n\n* For \\(k=0,\\dots ,8\\) the two roots of \\((A)_{k}\\) satisfy \\(|y|<1\\);\n thus all \\(2\\cdot9=18\\) of them are valid.\n\n* For \\((B)_{k}\\) the two roots lie in \\((-1,1)\\) when \\(k=0,\\dots ,7\\).\n When \\(k=8\\) the negative root equals \\(\\displaystyle \n \\frac{-1-\\sqrt{4625}}{68}\\approx-1.0148\\), which is outside the\n interval \\([-1,1]\\); the positive root is still admissible.\n Hence we have \\(2\\cdot8+1=17\\) valid roots from the \\((B)\\) equations.\n\nConsequently there are \\(18+17=35\\) intersection points.\n\n--------------------------------------------------------------------\n### 5. Summing the \\(y\\)-coordinates \n\nFrom Vi\u00e8te\u2019s formulas\n\n\\[\n\\text{sum of the two roots of }(A)_{k}= \\frac{1}{34},\\qquad\n\\text{sum of the two roots of }(B)_{k}= -\\frac{1}{34}.\n\\]\n\nTherefore\n\n\\[\n\\sum_{k=0}^{8}\\bigl(\\text{both roots of }(A)_{k}\\bigr)=9\\cdot\\frac1{34}=\\frac{9}{34},\n\\]\n\\[\n\\sum_{k=0}^{8}\\bigl(\\text{both roots of }(B)_{k}\\bigr)=-\\frac{9}{34}.\n\\]\n\nIn \\((B)_{8}\\) we must discard the negative root\n\\(\\displaystyle y_{8}^{-}=\\frac{-1-\\sqrt{4625}}{68}\\).\nHence the sum of the **valid** \\((B)\\)\u2011roots is\n\n\\[\n-\\frac{9}{34}-y_{8}^{-}.\n\\]\n\nAdding the contributions of \\((A)\\) and \\((B)\\),\n\n\\[\n\\begin{aligned}\n\\sum y\n&= \\frac{9}{34}+\\Bigl(-\\frac{9}{34}-y_{8}^{-}\\Bigr)\n =-y_{8}^{-}\n =\\frac{1+\\sqrt{4625}}{68}.\n\\end{aligned}\n\\]\n\nSince \\(\\sqrt{4625}=5\\sqrt{185}\\),\n\n\\[\n\\sum y=\\frac{1+5\\sqrt{185}}{68}.\n\\]\n\n--------------------------------------------------------------------\n### 6. Final answer\n\nThe required representation is \\(\\displaystyle\\frac{a+b\\sqrt{c}}{d}\\) with \n\n\\[\na=1,\\; b=5,\\; c=185,\\; d=68,\n\\]\n\nand \\(\\gcd(a,b,d)=1\\), \\(c\\) square\u2011free.\n\n\\[\na+b+c+d = 1+5+185+68 = 259.\n\\]\n\n\\[\n\\boxed{259}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nd=n+2 \\qquad (d\\ge 3,\\; n>0)\n\\]\n\nThe condition is \n\n\\[\nd \\mid 3(n+3)(n^2+9).\n\\]\n\nSince \\(n\\equiv -2 \\pmod d\\),\n\n\\[\nn+3\\equiv (-2)+3 \\equiv 1 \\pmod d,\\qquad \nn^2+9\\equiv (-2)^2+9 \\equiv 4+9\\equiv 13 \\pmod d.\n\\]\n\nHence\n\n\\[\n3(n+3)(n^2+9)\\equiv 3\\cdot1\\cdot13=39 \\pmod d .\n\\]\n\nThus \\(d\\) must divide 39:\n\n\\[\nd\\mid 39 .\n\\]\n\nThe positive divisors of \\(39\\) are \\(1,3,13,39\\). \nBecause \\(d=n+2\\ge 3\\), we have \n\n\\[\nd\\in\\{3,13,39\\}.\n\\]\n\nCorresponding \\(n\\) values are \n\n\\[\nn=d-2\\in\\{1,11,37\\}.\n\\]\n\nAll three satisfy the original divisibility, so the required sum is \n\n\\[\n1+11+37=49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe product $ \\prod_{k=4}^{63} \\frac{\\log_k(5^{k^2-1})}{\\log_{k+1}(5^{k^2-4})} = \\frac{\\log_4(5^{15})}{\\log_5(5^{12})} \\cdot \\frac{\\log_5(5^{24})}{\\log_6(5^{21})} \\cdot \\frac{\\log_6(5^{35})}{\\log_7(5^{32})} \\cdots \\frac{\\log_{63}(5^{3968})}{\\log_{64}(5^{3965})} $ is equal to $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\nP=\\prod_{k=4}^{63}\\frac{\\log_k(5^{k^{2}-1})}{\\log_{k+1}(5^{k^{2}-4})}\n\\]\n\n---\n\n### 1. Rewrite each factor\n\n\\[\n\\log_k(5^{p})=\\frac{\\log_{5}(5^{p})}{\\log_{5}k}= \\frac{p}{\\log_{5}k}.\n\\]\n\nHence\n\n\\[\n\\frac{\\log_k(5^{k^{2}-1})}{\\log_{k+1}(5^{k^{2}-4})}\n =\\frac{\\dfrac{k^{2}-1}{\\log_{5}k}}{\\dfrac{k^{2}-4}{\\log_{5}(k+1)}}\n =\\frac{k^{2}-1}{k^{2}-4}\\cdot\\frac{\\log_{5}(k+1)}{\\log_{5}k}.\n\\]\n\nFactor the rational part:\n\n\\[\n\\frac{k^{2}-1}{k^{2}-4}= \\frac{(k-1)(k+1)}{(k-2)(k+2)} .\n\\]\n\nThus\n\n\\[\nP=\\prod_{k=4}^{63}\n \\left[\\frac{(k-1)(k+1)}{(k-2)(k+2)}\n \\cdot\\frac{\\log_{5}(k+1)}{\\log_{5}k}\\right].\n\\]\n\n---\n\n### 2. Telescope the rational part \n\nSeparate the product:\n\n\\[\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\\; \\times\\;\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}.\n\\]\n\n\\[\n\\begin{aligned}\n\\prod_{k=4}^{63}\\frac{k-1}{k-2}\n &=\\frac{3}{2}\\cdot\\frac{4}{3}\\cdot\\frac{5}{4}\\cdots\\frac{62}{61}\n =\\frac{62}{2}=31,\\\\[4pt]\n\\prod_{k=4}^{63}\\frac{k+1}{k+2}\n &=\\frac{5}{6}\\cdot\\frac{6}{7}\\cdot\\frac{7}{8}\\cdots\\frac{64}{65}\n =\\frac{5}{65}=\\frac{1}{13}.\n\\end{aligned}\n\\]\n\nHence the rational part equals \n\n\\[\n\\frac{31}{13}.\n\\]\n\n---\n\n### 3. Telescope the logarithmic part \n\n\\[\n\\prod_{k=4}^{63}\\frac{\\log_{5}(k+1)}{\\log_{5}k}\n =\\frac{\\log_{5}5}{\\log_{5}4}\\cdot\\frac{\\log_{5}6}{\\log_{5}5}\n \\cdots\\frac{\\log_{5}64}{\\log_{5}63}\n =\\frac{\\log_{5}64}{\\log_{5}4}\n =\\log_{4}64.\n\\]\n\nSince \\(64=4^{3}\\), \\(\\log_{4}64=3\\).\n\nThus the logarithmic part contributes a factor of \\(3\\).\n\n---\n\n### 4. Combine\n\n\\[\nP=\\frac{31}{13}\\times 3=\\frac{93}{13}.\n\\]\n\nThe fraction \\(\\frac{93}{13}\\) is already in lowest terms, so \n\n\\[\nm=93,\\qquad n=13.\n\\]\n\nFinally,\n\n\\[\nm+n=93+13=106.\n\\]\n\n\\[\n\\boxed{106}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Sketch**\n\nLet \n\n\\[\na=3^{\\alpha }u ,\\qquad b=3^{\\beta }v ,\\qquad c=3^{\\gamma }w ,\n\\qquad(\\alpha ,\\beta ,\\gamma \\ge 0,\\;3\\nmid u,v,w)\n\\]\n\nand put \\(\\kappa =\\min (\\alpha ,\\beta ,\\gamma )\\).\nWriting \\(a^{3}=3^{3\\alpha }u^{3}\\) etc., \n\n\\[\na^{3}+b^{3}+c^{3}\\equiv 0\\pmod{3^{7}}\n\\Longleftrightarrow\nu^{3}3^{3(\\alpha-\\kappa)}+v^{3}3^{3(\\beta-\\kappa)}+w^{3}3^{3(\\gamma-\\kappa)}\n\\equiv0\\pmod{3^{7-3\\kappa}} .\n\\tag{1}\n\\]\n\nThus we have three essentially different cases:\n\n* \\(\\kappa\\ge 3\\) : every term in (1) is divisible by \\(3^{9}\\), hence the\n congruence is always true.\n\n* \\(\\kappa =2\\) : all three numbers are divisible by \\(9\\) and at least one\n is not divisible by \\(27\\). \n Put \\(a=9A,\\;b=9B,\\;c=9C\\;(1\\le A,B,C\\le81)\\). \n Then (1) reduces to \n\n \\[\n A+B+C\\equiv0\\pmod3 .\n \\]\n\n The numbers \\(A,B,C\\) are taken from the set \\(\\{1,\\dots ,81\\}\\); each\n residue class \\(\\pmod3\\) occurs exactly \\(27\\) times. \n Hence the number of ordered triples with \\(\\kappa =2\\) is \n\n \\[\n 9\\cdot 27^{3}=157\\,464 .\n \\tag{2}\n \\]\n\n* \\(\\kappa =1\\) : all three numbers are divisible by \\(3\\) and at least one\n is not divisible by \\(9\\). Write \\(a=3A,\\;b=3B,\\;c=3C\\;(1\\le A,B,C\\le243)\\). \n Then (1) becomes \n\n \\[\n A^{3}+B^{3}+C^{3}\\equiv0\\pmod{3^{4}} .\n \\tag{3}\n \\]\n\n The cubes \\(\\pmod {81}\\) of the integers \\(1\\le x\\le243\\) are distributed as \n\n \\[\n \\begin{array}{c|c}\n \\text{value}&\\text{how many $x$ give it}\\\\ \\hline\n 0 & 27\\\\\n 27,\\,54 & 27\\text{ each}\\\\\n \\text{18 other residues} & 9\\text{ each}\n \\end{array}\n \\]\n\n Using this distribution one counts (by a short elementary\n combinatorial argument) the number of ordered triples satisfying (3) to be \n\n \\[\n 452\\,709 .\n \\tag{4}\n \\]\n\n The triples counted in (4) include those where all three numbers are\n divisible by \\(9\\); those are exactly the triples of the previous case,\n i.e. the $157\\,464$ triples of (2). Hence the triples with\n \\(\\kappa =1\\) contribute \n\n \\[\n 452\\,709-157\\,464 = 295\\,245 .\n \\tag{5}\n \\]\n\n* \\(\\kappa =0\\) : at least one of the numbers is not divisible by \\(3\\).\n The total number of ordered triples with $1\\le a,b,c\\le3^{6}=729$ is\n $729^{3}=387\\,420\\,489$.\n Subtracting the contributions of the three previous cases gives\n\n \\[\n 387\\,420\\,489-19\\,683-157\\,464-295\\,245 = 702\\,027 .\n \\tag{6}\n \\]\n\nFinally we take the answer modulo $1000$ :\n\n\\[\n702\\,027\\equiv\\boxed{27}\\pmod{1000}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nCircle $\\omega_1$ with radius 6 centered at point $A$ is internally tangent at point $B$ to circle $\\omega_2$ with radius 15. Points $C$ and $D$ lie on $\\omega_2$ such that $\\overline{BC}$ is a diameter of $\\omega_2$ and $\\overline{BC} \\perp \\overline{AD}$. The rectangle $EFGH$ is inscribed in $\\omega_1$ such that $\\overline{EF} \\perp \\overline{BC}$, $C$ is closer to $\\overline{GH}$ than to $\\overline{EF}$, and $D$ is closer to $\\overline{FG}$ than to $\\overline{EH}$, as shown. Triangles $\\triangle DGF$ and $\\triangle CHG$ have equal areas. The area of rectangle $EFGH$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m + n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n* \\(O\\) be the center of \\(\\omega _2\\) (radius \\(15\\)), \n* \\(A\\) be the center of \\(\\omega _1\\) (radius \\(6\\)), \n* \\(B\\) the internal point of tangency of the two circles.\n\n---\n\n### 1. Coordinates\n\nPlace \\(O\\) at the origin and the line \\(BC\\) on the \\(x\\)-axis.\n\n\\[\nB=(15,0),\\qquad O=(0,0),\\qquad A=(9,0)\n\\]\n\nBecause \\(BC\\) is a diameter of \\(\\omega _2\\),\n\n\\[\nC=(-15,0).\n\\]\n\n\\(AD\\perp BC\\) makes \\(AD\\) vertical, so \\(D\\) lies on the line \\(x=9\\) and on \\(\\omega_2\\):\n\n\\[\n9^{2}+y^{2}=15^{2}\\Longrightarrow y^{2}=144\\Longrightarrow y=\\pm12 .\n\\]\n\nSince later we need \\(D\\) to be nearer to the lower side of the rectangle, we take \n\n\\[\nD=(9,-12).\n\\]\n\n---\n\n### 2. Rectangle \\(EFGH\\) inside \\(\\omega _1\\)\n\nThe rectangle is axis\u2011aligned because \\(EF\\perp BC\\) (so \\(EF\\) is vertical) and a rectangle has right angles.\n\nLet the half\u2011width be \\(a\\) and the half\u2011height be \\(y\\) :\n\n\\[\n\\begin{aligned}\nE&\\;(9+a,\\;y),&F&\\;(9+a,\\;-y),\\\\\nG&\\;(9-a,\\;-y),&H&\\;(9-a,\\;y).\n\\end{aligned}\n\\]\n\nAll four vertices lie on \\(\\omega _1\\), whose equation is \n\n\\[\n(x-9)^2+y^2=6^{2}=36 .\n\\]\n\nHence \n\n\\[\na^{2}+y^{2}=36\\quad\\Longrightarrow\\quad y=\\sqrt{36-a^{2}}\\;(>0).\n\\]\n\nThe rectangle\u2019s area is \n\n\\[\n[EFGH]= (2a)(2y)=4ay .\n\\tag{1}\n\\]\n\n---\n\n### 3. Areas of \\(\\triangle DGF\\) and \\(\\triangle CHG\\)\n\n\\[\n\\begin{aligned}\n\\triangle DGF &: \\text{base }GF=2a,\\; \n\\text{height }=12-y,\\\\\n[ DGF]&=\\tfrac12\\,(2a)(12-y)=a(12-y). \\tag{2}\n\\end{aligned}\n\\]\n\n\\[\n\\begin{aligned}\n\\triangle CHG &: \\text{base }HG=2y,\\;\n\\text{horizontal distance from }C\\text{ to line }x=9-a\\text{ is }24-a,\\\\\n[CHG]&=\\tfrac12\\,(2y)(24-a)=y(24-a). \\tag{3}\n\\end{aligned}\n\\]\n\nGiven \\([DGF]=[CHG]\\),\n\n\\[\na(12-y)=y(24-a).\n\\]\n\nExpanding and canceling the common term \\(-ay\\) gives\n\n\\[\n12a=24y\\quad\\Longrightarrow\\quad a=2y. \\tag{4}\n\\]\n\n---\n\n### 4. Solving for \\(a\\) and \\(y\\)\n\nFrom (4) and the circle condition \\(a^{2}+y^{2}=36\\),\n\n\\[\n(2y)^{2}+y^{2}=36\\Longrightarrow 5y^{2}=36\n\\Longrightarrow y^{2}=\\frac{36}{5}\n\\Longrightarrow y=\\frac{6}{\\sqrt5}=\\frac{6\\sqrt5}{5}.\n\\]\n\nThus \n\n\\[\na=2y= \\frac{12}{\\sqrt5}= \\frac{12\\sqrt5}{5}.\n\\]\n\nBoth satisfy \\(a\\le6,\\;y\\le6\\), so the rectangle indeed fits in \\(\\omega _1\\).\n\n---\n\n### 5. Area of the rectangle\n\nInsert \\(a=2y\\) into (1):\n\n\\[\n[EFGH]=4a y =4(2y)\\,y = 8y^{2}=8\\left(\\frac{36}{5}\\right)=\\frac{288}{5}.\n\\]\n\nHence the rectangle\u2019s area is \\(\\displaystyle \\frac{288}{5}\\).\n\nThe fraction is already in lowest terms, so \n\n\\[\nm=288,\\qquad n=5,\\qquad m+n=288+5=293.\n\\]\n\n\\[\n\\boxed{293}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFour unit squares form a $2 \\times 2$ grid. Each of the 12 unit line segments forming the sides of the squares is colored either red or blue in such a way that each unit square has 2 red sides and 2 blue sides. Find the number of such colorings.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the 9 vertices of the \\(2\\times2\\) grid be the points \\((i,j)\\) with \\(i,j=0,1,2\\).\nThe 12 unit edges are \n\n* 8 **boundary** edges (two on each side of the large square);\n* 4 **interior** edges, which are shared by two unit squares.\n\nDenote the four interior edges by \n\n\\[\na=v_{10},\\qquad b=v_{11},\\qquad c=h_{01},\\qquad d=h_{11},\n\\]\n\nwhere each variable is \\(1\\) if the edge is coloured red and \\(0\\) if it is blue.\n\n---\n\n### 1. How the interior edges affect a square \n\nEach small square has two interior edges and two boundary edges.\n\n\\[\n\\begin{array}{c|c}\n\\text{square}&\\text{interior edges}\\\\\\hline\n\\text{BL}& a,\\;c\\\\\n\\text{BR}& b,\\;c\\\\\n\\text{TL}& a,\\;d\\\\\n\\text{TR}& b,\\;d\n\\end{array}\n\\]\n\nLet \\(r\\) be the number of red interior edges of a given square.\nSince the square must have exactly two red sides, it needs \n\\(2-r\\) red boundary edges.\n\nFor a square:\n\n* if \\(r=0\\) or \\(r=2\\) the two boundary edges are forced (both red or both blue) \u2013 **1** way;\n* if \\(r=1\\) exactly one of the two boundary edges must be red \u2013 **2** ways.\n\nThus a given interior\u2011edge configuration contributes a factor \n\n\\[\n2^{\\#\\{\\text{squares with }r=1\\}} .\n\\]\n\nDenote by \n\n\\[\nN(a,b,c,d)=\\mathbf 1_{a\\neq c}+\\mathbf 1_{a\\neq d}+\\mathbf 1_{b\\neq c}+\\mathbf 1_{b\\neq d},\n\\]\n\nthe number of squares for which exactly one of the two interior edges is red.\nThen the total number of colourings is\n\n\\[\n\\sum_{a,b,c,d\\in\\{0,1\\}} 2^{\\,N(a,b,c,d)} .\n\\]\n\n---\n\n### 2. Evaluating the sum \n\nThe value of \\(N\\) depends only on how the pairs \\((a,b)\\) and \\((c,d)\\) compare.\n\n* **Case 1:** \\((a,b)=(c,d)\\). \n Then \\(N=0\\). This occurs for \\((0,0,0,0)\\) and \\((1,1,1,1)\\) \u2013 2 assignments.\n Contribution: \\(2\\cdot 2^{0}=2\\).\n\n* **Case 2:** \\((a,b)=(c,d)\\) with opposite colour, i.e. \\(a=b\\neq c=d\\). \n Then each of the four comparisons differs, so \\(N=4\\). \n This happens for \\((0,0,1,1)\\) and \\((1,1,0,0)\\) \u2013 2 assignments.\n Contribution: \\(2\\cdot 2^{4}=2\\cdot16=32\\).\n\n* **Case 3:** All other assignments. \n There are \\(16-4=12\\) such configurations and one checks that each yields \\(N=2\\). \n Contribution: \\(12\\cdot 2^{2}=12\\cdot4=48\\).\n\nAdding the three cases,\n\n\\[\n2+32+48=82 .\n\\]\n\n---\n\n\\[\n\\boxed{82}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A $ be the set of positive integer divisors of 2025. Let $ B $ be a randomly selected subset of $ A $. The probability that $ B $ is a nonempty set with the property that the least common multiple of its elements is 2025 is $ \\frac{m}{n} $, where $ m $ and $ n $ are relatively prime positive integers. Find $ m + n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The divisors of \n\n\\[\n2025 = 3^{4}\\cdot 5^{2}\n\\]\n\nare of the form \\(3^{a}5^{b}\\) with \n\n\\[\n0\\le a\\le 4 ,\\qquad 0\\le b\\le 2 .\n\\]\n\nHence \n\n\\[\n|A|=(4+1)(2+1)=15,\\qquad\\text{so there are }2^{15}=32768\\text{ subsets of }A.\n\\]\n\nFor a subset \\(B\\subseteq A\\) the least common multiple is \n\n\\[\n\\operatorname{lcm}(B)=3^{\\max a}\\,5^{\\max b},\n\\]\n\nwhere \\(\\max a\\) (resp. \\(\\max b\\)) is the largest exponent of \\(3\\) (resp. \\(5\\)) among the elements of \\(B\\).\n\nThus \\(\\operatorname{lcm}(B)=2025\\) iff \n\n* some element of \\(B\\) has \\(a=4\\) (i.e. belongs to the set \\(R\\) of divisors with a factor \\(3^{4}\\));\n* some element of \\(B\\) has \\(b=2\\) (i.e. belongs to the set \\(C\\) of divisors with a factor \\(5^{2}\\)).\n\nThe set \\(R\\) consists of the three divisors \\(3^{4}5^{0}, 3^{4}5^{1}, 3^{4}5^{2}\\);\nthe set \\(C\\) consists of the five divisors \\(3^{0}5^{2}, 3^{1}5^{2}, 3^{2}5^{2}, 3^{3}5^{2}, 3^{4}5^{2}\\).\nTheir intersection is \\(\\{2025\\}\\). \n\nWe need the number of subsets of \\(A\\) that contain **at least one** element of \\(R\\) and **at least one** element of \\(C\\).\n\nUsing inclusion\u2013exclusion on the whole set of subsets:\n\n\\[\n\\begin{aligned}\nN &= 2^{15}\n -\\underbrace{2^{15-|R|}}_{\\text{subsets with no }R}\n -\\underbrace{2^{15-|C|}}_{\\text{subsets with no }C}\n +\\underbrace{2^{15-|R\\cup C|}}_{\\text{subsets with neither}} \\\\\n &= 2^{15} -2^{12} -2^{10} + 2^{8} \\\\\n &= 32768 - 4096 - 1024 + 256 = 27904 .\n\\end{aligned}\n\\]\n\nAll these subsets are non\u2011empty (they contain at least one element from \\(R\\) and one from \\(C\\)). \n\nHence \n\n\\[\n\\Pr(\\text{nonempty }B\\text{ with }\\operatorname{lcm}=2025)\n = \\frac{27904}{2^{15}}\n = \\frac{27904}{32768}\n = \\frac{109}{128}\\;.\n\\]\n\nSo \\(m=109\\) and \\(n=128\\); therefore \n\n\\[\nm+n = 109+128 = 237 .\n\\]\n\n\\[\n\\boxed{237}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For \\( \\triangle ABC\\) let \n\n\\[\n\\angle A=84^{\\circ},\\qquad \\angle B=60^{\\circ},\\qquad \\angle C=36^{\\circ}.\n\\]\n\n---\n\n### 1. Identify the points on the nine\u2011point circle \n\n\\(D,E,F\\) are the midpoints of \\(BC,CA,AB\\); hence the circumcircle of \\(\\triangle DEF\\) is the nine\u2011point circle of \\(\\triangle ABC\\).\n\nThe nine\u2011point circle also passes through the feet of the three altitudes.\nThus \n\n* \\(G\\) is the foot of the altitude from \\(A\\) onto \\(BC\\); \n* \\(H\\) is the foot of the altitude from \\(B\\) onto \\(CA\\); \n* \\(J\\) is the foot of the altitude from \\(C\\) onto \\(AB\\).\n\nSo the six points on the nine\u2011point circle are, in order,\n\\(G,\\;D,\\;E,\\;H,\\;J,\\;F\\).\n\n---\n\n### 2. Arc \\(\\widehat{DE}\\)\n\nIn \\(\\triangle DEF\\) we have the well\u2011known midpoint\u2013parallel relations \n\n\\[\nDF\\parallel AC,\\qquad EF\\parallel BC .\n\\]\n\nHence at \\(F\\)\n\n\\[\n\\angle DFE=\\angle(DF,EF)=\\angle(AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nFor a chord, the intercepted minor arc equals twice the inscribed angle, so \n\n\\[\n\\widehat{DE}=2\\angle DFE=2\\cdot36^{\\circ}=72^{\\circ}.\n\\]\n\n---\n\n### 3. Arc \\(\\widehat{FG}\\)\n\n\\(DG\\) lies on side \\(BC\\); thus \\(DG\\parallel BC\\).\nSince \\(DF\\parallel AC\\),\n\n\\[\n\\angle FDG=\\angle(DF,DG)=\\angle(AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nTherefore \n\n\\[\n\\widehat{FG}=2\\angle FDG=2\\cdot36^{\\circ}=72^{\\circ}.\n\\]\n\n---\n\n### 4. Arc \\(\\widehat{HJ}\\)\n\n\\(G,\\;H,\\;J\\) are the vertices of the orthic triangle.\nFor an acute triangle, the orthic triangle angles satisfy \n\n\\[\n\\angle H G J =180^{\\circ}-2\\angle A .\n\\]\n\nHere \\(\\angle A=84^{\\circ}\\), so \n\n\\[\n\\angle H G J =180^{\\circ}-2\\cdot84^{\\circ}=12^{\\circ}.\n\\]\n\nThe inscribed angle \\(\\angle H G J\\) intercepts the minor arc \\(\\widehat{HJ}\\); consequently \n\n\\[\n\\widehat{HJ}=2\\angle H G J =2\\cdot12^{\\circ}=24^{\\circ}.\n\\]\n\n---\n\n### 5. Compute the required combination \n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ} \\\\\n&=72^{\\circ}+48^{\\circ}+216^{\\circ} \\\\\n&=336^{\\circ}.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFrom an unlimited supply of 1-cent coins, 10-cent coins, and 25-cent coins, Silas wants to find a collection of coins that has a total value of $ N $ cents, where $ N $ is a positive integer. He uses the so-called **greedy algorithm**, successively choosing the coin of greatest value that does not cause the value of his collection to exceed $ N $. For example, to get 42 cents, Silas will choose a 25-cent coin, then a 10-cent coin, then 7 1-cent coins. However, this collection of 9 coins uses more coins than necessary to get a total of 42 cents; indeed, choosing 4 10-cent coins and 2 1-cent coins achieves the same total value with only 6 coins.\n\nIn general, the greedy algorithm succeeds for a given $ N $ if no other collection of 1-cent, 10-cent, and 25-cent coins gives a total value of $ N $ cents using strictly fewer coins than the collection given by the greedy algorithm. Find the number of values of $ N $ between 1 and 1000 inclusive for which the greedy algorithm succeeds.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\ng(N)=\\Big\\lfloor\\frac{N}{25}\\Big\\rfloor+\n\\Big\\lfloor\\frac{N\\bmod 25}{10}\\Big\\rfloor+(N\\bmod 25)\\bmod10\n\\]\n\nbe the number of coins the greedy algorithm uses for \\(N\\) cents.\nFor an optimal solution we may use fewer quarters. \nWrite \n\n\\[\nN=25q+a,\\qquad 0\\le a<25 .\n\\]\n\nIf we replace \\(k\\;(1\\le k\\le q)\\) quarters by dimes and pennies, the new\ntotal number of coins is \n\n\\[\nc_k=(q-k)+\\Big\\lfloor\\frac{a+25k}{10}\\Big\\rfloor+(a+25k)\\bmod10 .\n\\]\n\nUsing \\(a+25k=10(2k)+ (a+5k)\\),\n\n\\[\nc_k=q+a+24k-9\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor .\n\\]\n\nThe greedy number is \n\n\\[\ng(N)=q+a-9\\Big\\lfloor\\frac a{10}\\Big\\rfloor .\n\\]\n\nHence \n\n\\[\nc_k-g(N)=24k-9\\Big(\\Big\\lfloor\\frac{a+5k}{10}\\Big\\rfloor-\n\\Big\\lfloor\\frac a{10}\\Big\\rfloor\\Big)\n =24k-9\\,\\Big\\lfloor\\frac{5k+r}{10}\\Big\\rfloor ,\n\\]\nwhere \\(r=a\\bmod10\\) (so \\(0\\le r\\le 9\\)).\n\nThe greedy algorithm fails iff there exists a \\(k\\ge1\\) with \\(c_k\\frac{2k}{3}.\n\\]\n\nFor \\(k\\ge2\\) the left\u2011hand side grows like \\(0.5k\\) while the right\nhand side grows like \\(0.666\\!k\\); the inequality never holds.\nFor \\(k=1\\) the condition becomes \n\n\\[\n\\Big\\lfloor\\frac{5+r}{10}\\Big\\rfloor\\ge1\\iff r\\ge5 .\n\\]\n\nThus **greedy fails exactly when** \n\n* \\(N\\ge25\\) (so at least one quarter is used), and \n* \\(a\\bmod10\\ge5\\), i.e. the remainder \\(a=N\\bmod25\\) lies in \n\n\\[\n\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\n---\n\n### Counting the failures\n\nFor each of the 10 bad remainders \\(a\\) the numbers\n\\(N=a+25k\\) with \\(k\\ge1\\) and \\(N\\le1000\\) are failures.\nSince \\(1000- a<1000\\) we have \n\n\\[\n\\Big\\lfloor\\frac{1000-a}{25}\\Big\\rfloor = 39\\quad (a\\ge1).\n\\]\n\nHence each bad remainder contributes 39 failing values, giving \n\n\\[\n10\\times39 = 390\n\\]\n\nfailing numbers.\n\n---\n\n### Total successes\n\nThere are \\(1000\\) integers from 1 to 1000, therefore\n\n\\[\n\\text{successful }N = 1000-390 = 610 .\n\\]\n\n\\[\n\\boxed{610}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the vertices of the regular \\(24\\)-gon be numbered \\(0,1,\\dots ,23\\) clockwise. \nIf a segment joins vertex \\(i\\) with vertex \\(j\\) then the (shorter) distance\n\\(\\min\\{\\,|i-j|,24-|i-j|\\,\\}\\) is a number \\(k\\) with \n\n\\[\n1\\le k\\le 12 .\n\\]\n\nAll 12 segments must have the same length, so they must all have the same\nstep\u2011size \\(k\\). \nFor a fixed \\(k\\) consider the graph \\(G_k\\) whose edges are exactly the\n\\(24\\) chords \\(\\{i,i+k\\}\\;(i=0,\\dots ,23)\\) (the pair \\(\\{i,i+k\\}\\) is the same\nas \\(\\{i+k,i\\}\\)). \n\n--------------------------------------------------------------------\n### 1. Structure of \\(G_k\\)\n\nLet \n\n\\[\nd=\\gcd(24,k),\\qquad L=\\frac{24}{d}.\n\\]\n\nStarting from a vertex \\(i\\) and repeatedly adding \\(k\\) modulo \\(24\\) we obtain\nthe cycle \n\n\\[\ni,\\; i+k,\\; i+2k,\\dots ,i+(L-1)k .\n\\]\n\nThus \\(G_k\\) splits into \\(d\\) disjoint cycles, each of length \\(L\\).\n\n- If \\(k\\neq 12\\) then \\(i+k\\neq i-k\\) and each vertex has degree \\(2\\); the\ncomponents are simple cycles.\n- For \\(k=12\\) each vertex is paired only with its opposite vertex, so the\ncomponents are single edges (a perfect matching already).\n\n--------------------------------------------------------------------\n### 2. When does a perfect matching exist?\n\nA perfect matching on a cycle exists only when the cycle length is even.\nHence we need \\(L\\) even, i.e. \n\n\\[\n\\frac{24}{d}\\text{ is even}\\iff d\\mid 12 .\n\\]\n\nTherefore a perfect matching is possible for all \\(k\\) whose\n\\(\\gcd(24,k)\\) belongs to \\(\\{1,2,3,4,6,12\\}\\). \nThe only value of \\(k\\) with \\(\\gcd(24,k)=8\\) is \\(k=8\\); for this step size\n\\(L=3\\) (odd) and no perfect matching exists.\n\n--------------------------------------------------------------------\n### 3. Number of perfect matchings for a given \\(k\\)\n\n- **Case \\(k\\neq 12\\).** \n The graph consists of \\(d\\) even cycles of length \\(L\\). \n Each even cycle has exactly two perfect matchings (choose the \u201codd\u201d or the\n \u201ceven\u201d edges). \n Hence the number of perfect matchings using step size \\(k\\) is \n\n \\[\n N(k)=2^{d}=2^{\\gcd(24,k)} .\n \\]\n\n- **Case \\(k=12\\).** \n The edges are the 12 diameters \\(\\{i,i+12\\}\\). \n This already is a unique perfect matching, so \\(N(12)=1\\).\n\n--------------------------------------------------------------------\n### 4. Summation over all possible step sizes\n\nThe admissible step sizes are \n\n\\[\nk=1,2,3,4,5,6,7,9,10,11,12 \\qquad(k=8\\text{ is excluded}).\n\\]\n\nTheir contributions are:\n\n\\[\n\\begin{array}{c|c|c}\nk & \\gcd(24,k) & N(k)\\\\ \\hline\n1 & 1 & 2\\\\\n2 & 2 & 4\\\\\n3 & 3 & 8\\\\\n4 & 4 & 16\\\\\n5 & 1 & 2\\\\\n6 & 6 & 64\\\\\n7 & 1 & 2\\\\\n9 & 3 & 8\\\\\n10& 2 & 4\\\\\n11& 1 & 2\\\\\n12&12 & 1\n\\end{array}\n\\]\n\nAdding them:\n\n\\[\n2+4+8+16+2+64+2+8+4+2+1 = 113 .\n\\]\n\n--------------------------------------------------------------------\n### 5. Answer\n\nThus there are \n\n\\[\n\\boxed{113}\n\\]\n\ndifferent ways to draw 12 equal\u2011length segments so that each of the 24\nvertices is an endpoint of exactly one segment.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nr_i=A_1A_i\\qquad(2\\le i\\le 11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}\\;(2\\le i\\le 10).\n\\]\n\n---\n\n### 1. Data from the triangles \n\n\\[\n\\cos\\theta=\\frac{12}{13},\\qquad \n\\sin\\theta=\\sqrt{1-\\left(\\frac{12}{13}\\right)^2}= \\frac{5}{13}.\n\\]\n\nThe area of \\(\\triangle A_iA_1A_{i+1}\\) is \n\n\\[\n\\frac12 r_i r_{i+1}\\sin\\theta =1\n\\Longrightarrow r_i r_{i+1}= \\frac{2}{\\sin\\theta}\n = \\frac{2}{5/13}= \\frac{26}{5}\\; .\n\\tag{1}\n\\]\n\nHence for all \\(i=2,\\dots ,10\\)\n\n\\[\nr_i r_{i+1}=K,\\qquad K:=\\frac{26}{5}. \\tag{2}\n\\]\n\nFrom (2) we obtain the recurrence \n\n\\[\nr_{i+1}= \\frac K{r_i},\\qquad\\text{so } r_{i+2}=r_i .\n\\]\n\nThus the distances from \\(A_1\\) alternate:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=x,\\qquad \nr_3=r_5=r_7=r_9=r_{11}=y,\n\\]\nwhere \n\n\\[\nxy=K=\\frac{26}{5}. \\tag{3}\n\\]\n\n---\n\n### 2. Length of the other edges \n\nFor any \\(i=2,\\dots ,10\\) the edge \\(A_iA_{i+1}\\) has length (law of cosines)\n\n\\[\n\\begin{aligned}\nd &:=A_iA_{i+1}= \n\\sqrt{r_i^{\\,2}+r_{i+1}^{\\,2}-2r_i r_{i+1}\\cos\\theta} \\\\\n &=\\sqrt{x^{2}+y^{2}-2xy\\frac{12}{13}}\n =\\sqrt{x^{2}+y^{2}-\\frac{24}{13}K}.\n\\end{aligned}\n\\tag{4}\n\\]\n\nAll nine edges \\(A_iA_{i+1}\\;(i=2\\ldots10)\\) have the same length \\(d\\).\n\n---\n\n### 3. Perimeter condition \n\nThe perimeter of the 11\u2011gon is \n\n\\[\nx+y+9d=20. \\tag{5}\n\\]\n\nIntroduce \n\n\\[\nt:=x+y\\quad\\text{(the quantity we need)},\n\\qquad xy=K .\n\\]\n\nFrom \\(x^{2}+y^{2}=t^{2}-2K\\) and (4),\n\n\\[\nd^{2}=t^{2}-2K-\\frac{24}{13}K\n =t^{2}-\\frac{50}{13}K .\n\\]\n\nSince \\(\\displaystyle \\frac{50}{13}K\n =\\frac{50}{13}\\cdot\\frac{26}{5}=20\\),\n\n\\[\nd^{2}=t^{2}-20\\qquad\\Longrightarrow\\qquad d=\\sqrt{t^{2}-20}. \\tag{6}\n\\]\n\nInsert (6) into (5):\n\n\\[\nt+9\\sqrt{t^{2}-20}=20. \\tag{7}\n\\]\n\n---\n\n### 4. Solving for \\(t\\)\n\nFrom (7),\n\n\\[\n\\sqrt{t^{2}-20}= \\frac{20-t}{9}\\quad (20-t\\ge 0).\n\\]\n\nSquaring gives \n\n\\[\nt^{2}-20=\\frac{(20-t)^{2}}{81}\n\\Longrightarrow 80t^{2}+40t-2020=0.\n\\]\n\nDividing by\u202f20,\n\n\\[\n4t^{2}+2t-101=0.\n\\]\n\nHence \n\n\\[\nt=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n =\\frac{-2\\pm18\\sqrt5}{8}.\n\\]\n\nOnly the positive root is admissible:\n\n\\[\nt=\\frac{18\\sqrt5-2}{8}\n =\\frac{9\\sqrt5-1}{4}.\n\\]\n\nThus \n\n\\[\nA_1A_2+A_1A_{11}=t=\\frac{9\\sqrt5-1}{4}\n =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\n---\n\n### 5. Required sum \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**1. Regions produced by line\u2011segments**\n\nIf a set of line segments inside a disc has no three of them meeting at the same interior point, then \n\n\\[\n\\text{#regions}=1+\\;(\\text{#segments})+\\;(\\text{# interior intersection points}).\n\\]\n\nHence for our problem \n\n\\[\nR=1+27+I ,\n\\]\n\nwhere \\(I\\) is the (random) number of interior intersection points. \nWe must compute the expected value \\(E[I]\\).\n\n--------------------------------------------------------------------\n\n**2. The three kinds of interior intersections**\n\n* the two diameters intersect once (deterministically);\n* a random chord can intersect each of the two diameters;\n* two random chords can intersect one another.\n\nSo \n\n\\[\nE[I]=1+E[\\text{chord\u2013diameter intersections}]\n +E[\\text{chord\u2013chord intersections}].\n\\]\n\n--------------------------------------------------------------------\n\n**3. Probability that a random chord meets a given diameter**\n\nThe two endpoints of a chord are chosen uniformly on the circle but must lie in *different* quadrants.\nThere are \\(\\binom{4}{2}=6\\) unordered pairs of quadrants, all equally likely.\n\nA chord meets the horizontal diameter iff its endpoints lie in opposite\nhalf\u2011planes (one in the upper half, one in the lower half). \nAmong the six unordered pairs, the four pairs \n\\(\\{Q_1,Q_3\\},\\{Q_1,Q_4\\},\\{Q_2,Q_3\\},\\{Q_2,Q_4\\}\\) have this property, so\n\n\\[\nP(\\text{chord meets a given diameter})=\\frac{4}{6}= \\frac23 .\n\\]\n\nThe same holds for the vertical diameter. \nThus a single random chord contributes on average\n\n\\[\n2\\cdot\\frac23=\\frac43\n\\]\n\nintersections with the two diameters. \n\nFor the 25 chords\n\n\\[\nE[\\text{chord\u2013diameter intersections}]\n =25\\cdot\\frac43=\\frac{100}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**4. Distribution of a chord\u2019s quadrant pair**\n\nLet a chord be called \n\n* **adjacent** if it joins two adjacent quadrants (four such unordered pairs);\n* **opposite** if it joins opposite quadrants (two such unordered pairs).\n\n\\[\nP(\\text{adjacent})=\\frac{4}{6}= \\frac23,\\qquad \nP(\\text{opposite})=\\frac{2}{6}= \\frac13 .\n\\]\n\n--------------------------------------------------------------------\n\n**5. Probability that two random chords intersect**\n\nPick two chords independently. Let their unordered quadrant pairs be \\(S\\) and\n\\(T\\). There are three possibilities for the relationship between \\(S\\) and \\(T\\).\n\n| Relation of \\(S,T\\) | Probability | Intersection probability |\n|----------------------|-------------|---------------------------|\n| **identical** (\\(S=T\\)) | \\(\\displaystyle\\frac16\\) | \\(\\displaystyle\\frac12\\) |\n| **share exactly one quadrant** | \\(\\displaystyle\\frac{2}{3}\\) | \\(\\displaystyle\\frac12\\) |\n| **disjoint** (complementary sets) | \\(\\displaystyle\\frac16\\) | \\(\\displaystyle\\frac13\\) |\n\n*Proof of the numbers* \n\n*Identical*: both chords lie in the same two intervals, say \\([0,1)\\) and \\([1,2)\\). \nIf the endpoints are \\(A\\in[0,1),B\\in[1,2)\\) and \\(C\\in[0,1),D\\in[1,2)\\),\nthe chords intersect iff exactly one of \\(C,D\\) lies on the clockwise arc from\n\\(A\\) to \\(B\\). A short calculation gives probability \\(1/2\\).\n\n*Share one quadrant*: suppose the common quadrant is \\([0,1)\\) and the other\nendpoints are in \\([1,2)\\) and \\([2,3)\\) (or \\([3,4)\\)). The second endpoint\nnever lies on the clockwise arc from the first endpoint to its partner, so the\nchords intersect iff the other point in the common quadrant lies on that arc,\nwhich happens with probability \\(1/2\\).\n\n*Disjoint*: the only way for two disjoint pairs to intersect is when both are\nopposite pairs (e.g. \\(\\{0,2\\}\\) and \\(\\{1,3\\}\\)); then the order of the four\npoints around the circle is forced to be alternating, so the chords always\nintersect. This occurs for one\u2011third of the disjoint cases, hence conditional\nprobability \\(1/3\\).\n\nPutting the three cases together,\n\n\\[\nP(\\text{two chords intersect})=\n\\frac16\\!\\left(\\frac12\\right)+\\frac23\\!\\left(\\frac12\\right)+\\frac16\\!\\left(\\frac13\\right)\n =\\frac{17}{36}.\n\\]\n\n--------------------------------------------------------------------\n\n**6. Expected chord\u2013chord intersections**\n\nThere are \\(\\binom{25}{2}=300\\) unordered pairs of the 25 chords, so\n\n\\[\nE[\\text{chord\u2013chord intersections}]\n =300\\cdot\\frac{17}{36}= \\frac{425}{3}.\n\\]\n\n--------------------------------------------------------------------\n\n**7. Total expected interior intersections**\n\n\\[\nE[I]=1\\;(\\text{diameters})+\\frac{100}{3}\\;(\\text{chord\u2013diameter})\n +\\frac{425}{3}\\;(\\text{chord\u2013chord})\n =\\frac{525}{3}+1 =176 .\n\\]\n\n--------------------------------------------------------------------\n\n**8. Expected number of regions**\n\nFinally\n\n\\[\nE[R]=1+(\\text{#segments})+E[I]\n =1+27+176 = 204 .\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $ n $ values of $ x $ in the interval $ 0 < x < 2\\pi $ where $ f(x) = \\sin(7\\pi \\cdot \\sin(5x)) = 0 $. For $ t $ of these $ n $ values of $ x $, the graph of $ y = f(x) $ is tangent to the $ x $-axis. Find $ n + t $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\nf(x)=\\sin\\!\\bigl(7\\pi\\sin 5x\\bigr)\n\\qquad (09$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The numbers \n\n\\[\n17_b = 1\\cdot b + 7 = b+7 ,\\qquad \n97_b = 9\\cdot b + 7 .\n\\]\n\nWe need \n\n\\[\nb+7 \\mid 9b+7 .\n\\]\n\nLet \n\n\\[\nd=b+7 \\quad\\Longrightarrow\\quad b=d-7 .\n\\]\n\nThen \n\n\\[\n9b+7 = 9(d-7)+7 = 9d-56 .\n\\]\n\nThus \n\n\\[\nd \\mid 9d-56 \\;\\Longleftrightarrow\\; d \\mid 56 .\n\\]\n\nHence \\(d\\) must be a positive divisor of \\(56\\). \nSince the base must satisfy \\(b>9\\), we have \\(d=b+7>9+7=16\\). \nThe divisors of \\(56\\) larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nd=28 &\\implies b=28-7=21,\\\\\nd=56 &\\implies b=56-7=49.\n\\end{aligned}\n\\]\n\nBoth \\(b=21\\) and \\(b=49\\) satisfy the original divisibility:\n\n\\[\n\\begin{aligned}\nb=21: &\\quad 17_{21}=28,\\; 97_{21}=196,\\; 196/28=7,\\\\\nb=49: &\\quad 17_{49}=56,\\; 97_{49}=448,\\; 448/56=8 .\n\\end{aligned}\n\\]\n\nThus the integer bases greater than \\(9\\) that work are \\(21\\) and \\(49\\).\n\nThe required sum is \n\n\\[\n21+49 = 70 .\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nc=\\text{# who chose chocolate},\\qquad \nv=\\text{# who chose vanilla},\\qquad \ns=\\text{# who chose strawberry}.\n\\]\n\nThe conditions give \n\n\\[\nc+v+s=9,\\qquad c>v>s\\ge 1 .\n\\]\n\nThus \\((c,v,s)\\) must be three distinct positive integers whose sum is \\(9\\).\nThe possible triples are \n\n\\[\n(6,2,1),\\qquad (5,3,1),\\qquad (4,3,2).\n\\]\n\nFor a fixed triple \\((c,v,s)\\) the number of assignments of flavors to the 9 distinct players is the multinomial coefficient \n\n\\[\n\\frac{9!}{c!\\,v!\\,s!}.\n\\]\n\nCompute each term:\n\n\\[\n\\begin{aligned}\n(6,2,1):\\;&\\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot 2}=252,\\\\[4pt]\n(5,3,1):\\;&\\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot 6}=504,\\\\[4pt]\n(4,3,2):\\;&\\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot 6\\cdot 2}=1260.\n\\end{aligned}\n\\]\n\nAdd them:\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\nWe need \\(N \\pmod{1000}\\):\n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let a chair be occupied by a person be denoted by \\(1\\) and an empty chair by \\(0\\).\nThe condition *\u201cno person sits next to two other people\u201d* means that a\n\\(1\\) cannot have \\(1\\)\u2019s on both sides; equivalently a binary string of\nlength \\(16\\) may not contain the block \\(111\\).\n\nWe must count the binary strings of length \\(16\\) that contain exactly\n\\(8\\) ones and no occurrence of three consecutive ones.\n\n--------------------------------------------------------------------\n### 1. Decompose the ones into blocks\n\nBecause a block of three 1\u2019s is forbidden, the ones can only appear in\nblocks of length \\(1\\) or \\(2\\).\n\nLet \n\n* \\(b\\) = number of blocks of length \\(2\\) (doubletons) \n* \\(a\\) = number of blocks of length \\(1\\) (singletons)\n\nThen \n\n\\[\na+2b=8 ,\\qquad a,b\\ge 0 .\n\\]\n\nHence \\(a\\) must be even and the possible pairs \\((a,b)\\) are \n\n\\[\n\\begin{array}{c|c|c}\nb & a & B=a+b\\\\\\hline\n0 & 8 & 8\\\\\n1 & 6 & 7\\\\\n2 & 4 & 6\\\\\n3 & 2 & 5\\\\\n4 & 0 & 4\n\\end{array}\n\\]\n\nwhere \\(B=a+b\\) is the total number of blocks of 1\u2019s.\n\n--------------------------------------------------------------------\n### 2. Order of the blocks\n\nFor a fixed \\(b\\) (hence fixed \\(B\\)), we must decide which of the \\(B\\)\nblocks are doubletons. This can be done in \n\n\\[\n\\binom{B}{b}\n\\]\n\nways.\n\n--------------------------------------------------------------------\n### 3. Distribution of the zeros\n\nThere are \\(8\\) zeros in total (because \\(16-8=8\\)). \nBetween any two consecutive blocks there must be at least one zero.\nThus the \\(B-1\\) internal gaps already consume \\(B-1\\) zeros, leaving\n\n\\[\n8-(B-1)=9-B\n\\]\n\nzeros to be placed freely among the \\(B+1\\) gaps (the two ends and the\n\\(B-1\\) internal gaps). By stars\u2011and\u2011bars this can be done in\n\n\\[\n\\binom{(9-B)+(B+1)-1}{B}= \\binom{9}{B}\n\\]\n\nways.\n\n--------------------------------------------------------------------\n### 4. Count for each \\(b\\)\n\nFor each \\(b\\) we multiply the two factors:\n\n\\[\n\\begin{array}{c|c|c|c}\nb & B=8-b & \\binom{B}{b} & \\binom{9}{B} \\\\ \\hline\n0 & 8 & \\binom{8}{0}=1 & \\binom{9}{8}=9\\\\\n1 & 7 & \\binom{7}{1}=7 & \\binom{9}{7}=36\\\\\n2 & 6 & \\binom{6}{2}=15& \\binom{9}{6}=84\\\\\n3 & 5 & \\binom{5}{3}=10& \\binom{9}{5}=126\\\\\n4 & 4 & \\binom{4}{4}=1 & \\binom{9}{4}=126\n\\end{array}\n\\]\n\nMultiplying and summing:\n\n\\[\n\\begin{aligned}\nN &= 1\\cdot9 + 7\\cdot36 + 15\\cdot84 + 10\\cdot126 + 1\\cdot126\\\\\n &= 9 + 252 + 1260 + 1260 + 126\\\\\n &= 2907.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5. Modulo \\(1000\\)\n\n\\[\nN \\equiv 2907 \\pmod{1000}\\equiv 907.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{907}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\nFactor the quadratic form:\n\n\\[\n12x^{2}-xy-6y^{2}\n=(3x+2y)(4x-3y)\n\\]\n\nHence a solution must satisfy one of the two linear equations \n\n\\[\n\\begin{cases}\n3x+2y=0\\quad\\Longrightarrow\\quad x=-\\dfrac23\\,y\\\\[4pt]\n4x-3y=0\\quad\\Longrightarrow\\quad x=\\dfrac34\\,y\n\\end{cases}\n\\]\n\n---\n\n### 1. Solutions of \\(4x-3y=0\\)\n\nWrite \\(y=4k\\) (\\(k\\in\\mathbb Z\\)). Then \n\n\\[\nx=\\frac34y=3k .\n\\]\n\nThus the points are \\((x,y)=(3k,4k)\\). \nBoth coordinates must lie in \\([-100,100]\\):\n\n\\[\n-100\\le 4k\\le100 \\;\\Longrightarrow\\; -25\\le k\\le 25, \n\\qquad -100\\le 3k\\le100\\; \\text{(automatically true)} .\n\\]\n\nHence there are \n\n\\[\n25-(-25)+1 = 51\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 2. Solutions of \\(3x+2y=0\\)\n\nWrite \\(x=2m\\) (\\(m\\in\\mathbb Z\\)). Then \n\n\\[\ny=-\\frac32x=-3m .\n\\]\n\nThus the points are \\((x,y)=(2m,-3m)\\). \nRequire \\(-100\\le2m\\le100\\) and \\(-100\\le -3m\\le100\\):\n\n\\[\n-50\\le m\\le 50,\\qquad -\\frac{100}{3}\\le m\\le\\frac{100}{3}\n\\;\\Longrightarrow\\; -33\\le m\\le 33 .\n\\]\n\nSo we obtain \n\n\\[\n33-(-33)+1 = 67\n\\]\n\ninteger pairs on this line.\n\n---\n\n### 3. Remove the double\u2011counted point\n\nBoth families contain the point \\((0,0)\\). \nIt has been counted twice, so subtract one.\n\n\\[\n\\text{Total}=51+67-1 = 117 .\n\\]\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(p,0),\\qquad C=(0,q)\n\\]\n\nwith \\(\\angle A=90^{\\circ}\\). \nBecause \\(BC=38\\),\n\n\\[\np^{2}+q^{2}=38^{2}=1444. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Coordinates of \\(K\\) and \\(L\\)\n\n\\(K\\) is \\(14\\) from \\(A\\) and from \\(B\\); therefore it lies on the perpendicular bisector of \\(\\overline{AB}\\):\n\\[\nK=\\Bigl(\\frac p2,\\ \\sqrt{14^{2}-\\Bigl(\\frac p2\\Bigr)^{2}}\\Bigr)\n =\\bigl(a,\\; \\sqrt{196-a^{2}}\\bigr),\\qquad a=\\frac p2 .\n\\]\n\nSimilarly \\(L\\) is \\(14\\) from \\(A\\) and from \\(C\\); thus \n\n\\[\nL=\\Bigl(\\sqrt{14^{2}-\\Bigl(\\frac q2\\Bigr)^{2}},\\ \\frac q2\\Bigr)\n =\\bigl(\\sqrt{196-b^{2}},\\; b\\bigr),\\qquad b=\\frac q2 .\n\\]\n\nSince \\(K\\) and \\(L\\) are also \\(14\\) apart,\n\\[\n(a-\\sqrt{196-b^{2}})^{2}+(\\sqrt{196-a^{2}}-b)^{2}=14^{2}=196 .\n\\]\n\nExpanding gives \n\n\\[\na\\sqrt{196-b^{2}}+b\\sqrt{196-a^{2}}=98. \\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2. Solving for \\(a\\) and \\(b\\)\n\nFrom (1),\n\n\\[\np^{2}+q^{2}=4a^{2}+4b^{2}=1444 \\Longrightarrow a^{2}+b^{2}=361. \\tag{3}\n\\]\n\nLet \\(X=a^{2},\\;Y=b^{2}\\). Then \\(X+Y=361\\). \nSquare (2) and use \\(u^{2}=196-b^{2}=196-Y,\\;v^{2}=196-a^{2}=196-X\\):\n\n\\[\nX(196-Y)+Y(196-X)+2ab\\sqrt{(196-X)(196-Y)}=9604.\n\\]\n\nUsing \\(ab=\\sqrt{XY}\\) and (3) simplifies to \n\n\\[\nXY(196-X)(196-Y)=(XY-30576)^{2}.\n\\]\n\nBecause \\(196-X=196-a^{2}=196-X\\) etc., after substitution and using \\(X+Y=361\\) we obtain \n\n\\[\nXY\\bigl(-32340+XY\\bigr)=(XY-30576)^{2},\n\\]\n\nwhich yields \n\n\\[\nXY=32448.\n\\]\n\nHence \n\n\\[\nX+Y=361,\\qquad XY=32448.\n\\]\n\nThe quadratic \\(t^{2}-361t+32448=0\\) gives \n\n\\[\nt=\\frac{361\\pm23}{2} \\Longrightarrow \\{X,Y\\}=\\{192,169\\}.\n\\]\n\nThus \n\n\\[\na^{2}=192,\\;b^{2}=169\\qquad\\text{or}\\qquad a^{2}=169,\\;b^{2}=192.\n\\]\n\nTaking \\(a^{2}=192\\) (the other case is symmetric),\n\n\\[\na=8\\sqrt3,\\qquad b=13.\n\\]\n\nTherefore \n\n\\[\nAB=2a=16\\sqrt3,\\qquad AC=2b=26,\n\\]\n\nand indeed \\(AB^{2}+AC^{2}= (16\\sqrt3)^{2}+26^{2}=768+676=1444=38^{2}\\).\n\n--------------------------------------------------------------------\n### 3. Coordinates of the relevant points\n\n\\[\n\\begin{aligned}\nB&=(16\\sqrt3,0),\\\\\nK&=\\Bigl(8\\sqrt3,\\ \\sqrt{196-192}\\Bigr)=\\bigl(8\\sqrt3,2\\bigr),\\\\\nL&=\\Bigl(\\sqrt{196-169},\\ 13\\Bigr)=\\bigl(3\\sqrt3,13\\bigr),\\\\\nC&=(0,26).\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of \\(BKLC\\)\n\nUsing the shoelace formula for the polygon \\(B\\to K\\to L\\to C\\),\n\n\\[\n\\begin{aligned}\n\\sum x_i y_{i+1}&= (16\\sqrt3)(2)+(8\\sqrt3)(13)+(3\\sqrt3)(26)+0=214\\sqrt3,\\\\\n\\sum y_i x_{i+1}&=0+(2)(3\\sqrt3)+0+(26)(16\\sqrt3)=422\\sqrt3.\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n\\operatorname{Area}= \\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n =\\frac12\\,(208\\sqrt3)=104\\sqrt3.\n\\]\n\n--------------------------------------------------------------------\nThus the area of quadrilateral \\(BKLC\\) is \\(104\\sqrt3\\), so \n\n\\[\n\\boxed{104}\n\\] is the required integer \\(n\\).", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid have parallel sides (bases) \\(r\\) and \\(s\\) \\((r\\neq s)\\) and equal legs of length \\(L\\).\n\n---\n\n### 1. Tangential condition \n\nA quadrilateral has an incircle iff the sums of the lengths of opposite sides are equal. \nFor the order of sides \\(r,\\,L,\\,s,\\,L\\),\n\n\\[\nr+s = L+L \\qquad\\Longrightarrow\\qquad L =\\frac{r+s}{2}.\n\\tag{1}\n\\]\n\n---\n\n### 2. Use the given area \n\nFor any tangential quadrilateral, \n\n\\[\n\\text{Area}=r_{\\text{in}}\\cdot s,\n\\]\n\nwhere \\(r_{\\text{in}}\\) is the inradius and \\(s\\) is the semiperimeter. \nHere the inradius is \\(3\\) and the area is \\(72\\):\n\n\\[\n72 = 3\\,s\\quad\\Longrightarrow\\quad s = 24 .\n\\]\n\nThe semiperimeter \\(s\\) is\n\n\\[\ns = \\frac{r+s+2L}{2}=r+s \\quad\\Longrightarrow\\quad r+s = 24. \\tag{2}\n\\]\n\nHence from (1),\n\n\\[\nL = \\frac{r+s}{2}=12 .\n\\]\n\n---\n\n### 3. Height of the trapezoid \n\nThe incircle touches both parallel sides, so the distance between them (the height \\(h\\)) equals the diameter of the incircle:\n\n\\[\nh = 2\\cdot 3 = 6 .\n\\tag{3}\n\\]\n\n---\n\n### 4. Relate the legs to the bases \n\nBecause the trapezoid is isosceles, each leg forms a right triangle with vertical leg \\(h\\) and horizontal leg \\(\\dfrac{|r-s|}{2}\\):\n\n\\[\nL^{2}=h^{2}+\\Bigl(\\frac{r-s}{2}\\Bigr)^{2}.\n\\]\n\nInsert \\(L=12\\) and \\(h=6\\):\n\n\\[\n12^{2}=6^{2}+\\Bigl(\\frac{r-s}{2}\\Bigr)^{2}\n\\Longrightarrow\\;144=36+\\frac{(r-s)^{2}}{4}\n\\Longrightarrow\\;(r-s)^{2}=432.\n\\]\n\nThus \n\n\\[\n|r-s|=12\\sqrt3. \\tag{4}\n\\]\n\n---\n\n### 5. Solve for \\(r\\) and \\(s\\)\n\nFrom (2) and (4),\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\nr-s=12\\sqrt3 \\quad(\\text{take }r>s).\n\\end{cases}\n\\]\n\nHence \n\n\\[\nr = 12+6\\sqrt3,\\qquad s = 12-6\\sqrt3 .\n\\]\n\n(If the roles of \\(r\\) and \\(s\\) are exchanged, the same values for \\(r^{2}+s^{2}\\) result.)\n\n---\n\n### 6. Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}&=(12+6\\sqrt3)^{2}+(12-6\\sqrt3)^{2}\\\\\n&= \\bigl(144+144\\sqrt3+108\\bigr)+\\bigl(144-144\\sqrt3+108\\bigr)\\\\\n&= 252+144\\sqrt3+252-144\\sqrt3\\\\\n&= 504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The first equation \n\n\\[\n|25+20i-z|=5\n\\]\n\nis the circle \n\n\\[\nC:\\;(x-25)^2+(y-20)^2=5^{2}\n\\]\n\ncenter \\(C=(25,20)\\), radius \\(5\\).\n\nThe second equation \n\n\\[\n|z-4-k| = |z-3i-k|\n\\]\n\nsays that the point \\(z\\) is equally distant from \n\n\\[\nA=4+k\\;(= (4+k,0)) ,\\qquad B=3i+k\\;(= (k,3)).\n\\]\n\nHence the set of points satisfying the second condition is the **perpendicular bisector** of the segment \\(AB\\).\n\n---\n\n### 1. Equation of the perpendicular bisector \n\nMidpoint of \\(AB\\):\n\n\\[\nM=\\Bigl(\\frac{4+k+k}{2},\\,\\frac{0+3}{2}\\Bigr)=\\Bigl(k+2,\\frac32\\Bigr).\n\\]\n\nSlope of \\(AB\\):\n\n\\[\n\\frac{3-0}{k-(4+k)} =\\frac{3}{-4}= -\\frac34 .\n\\]\n\nTherefore the slope of the perpendicular bisector is the negative reciprocal:\n\n\\[\nm_{\\perp}= \\frac{4}{3}.\n\\]\n\nThrough \\(M\\) the line is \n\n\\[\ny-\\frac32 = \\frac{4}{3}\\bigl(x-(k+2)\\bigr).\n\\]\n\nMultiplying by \\(3\\) and simplifying gives the standard form \n\n\\[\n8x-6y-(8k+7)=0.\n\\]\n\n---\n\n### 2. Tangency condition \n\nThe distance from the centre \\(C=(25,20)\\) to this line must equal the radius \\(5\\) for the circle and the line to intersect in **exactly one point** (tangency).\n\n\\[\nd=\\frac{|\\,8\\cdot25-6\\cdot20-(8k+7)\\,|}{\\sqrt{8^{2}+(-6)^{2}}}\n =\\frac{|\\,200-120-8k-7\\,|}{10}\n =\\frac{|\\,73-8k\\,|}{10}.\n\\]\n\nSet \\(d=5\\):\n\n\\[\n\\frac{|73-8k|}{10}=5\\quad\\Longrightarrow\\quad |73-8k|=50.\n\\]\n\nHence \n\n\\[\n73-8k = 50\\quad\\text{or}\\quad73-8k = -50.\n\\]\n\nSolving,\n\n\\[\n\\begin{cases}\n73-8k=50 &\\Longrightarrow\\; k=\\dfrac{23}{8},\\\\[4pt]\n73-8k=-50&\\Longrightarrow\\; k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nBoth values give a line tangent to the circle, so the system has exactly one solution for each.\n\n---\n\n### 3. Sum of all possible \\(k\\)\n\n\\[\nk_{1}+k_{2}= \\frac{23}{8}+\\frac{123}{8}= \\frac{146}{8}= \\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\frac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\ n=4\\).\n\n\\[\nm+n = 73+4 = 77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For an 8\u2011digit number \n\\[\na_1a_2a_3a_4a_5a_6a_7a_8,\n\\qquad a_i\\in\\{1,2,\\dots ,8\\},\n\\]\nusing each digit once, we need it to be divisible by \\(22 = 2\\cdot 11\\).\n\n---\n\n### 1. Divisibility by 2 \n\nThe last digit \\(a_8\\) must be even. \nThe even digits are \\(\\{2,4,6,8\\}\\).\n\n---\n\n### 2. Divisibility by 11 \n\nFor an 8\u2011digit number the test is \n\n\\[\n(a_1+a_3+a_5+a_7)-(a_2+a_4+a_6+a_8)\\equiv0\\pmod{11}.\n\\]\n\nLet \n\n\\[\nS_o=a_1+a_3+a_5+a_7,\\qquad S_e=a_2+a_4+a_6+a_8.\n\\]\n\nSince the digits \\(1,\\ldots ,8\\) are used exactly once,\n\\(S_o+S_e=1+2+\\cdots+8=36\\). \nHence \n\n\\[\nS_o-S_e\\equiv0\\pmod{11}\n\\Longrightarrow 2S_o\\equiv36\\pmod{11}\n\\Longrightarrow 2S_o\\equiv3\\pmod{11}.\n\\]\n\nBecause \\(2^{-1}\\equiv6\\pmod{11}\\), \n\n\\[\nS_o\\equiv3\\cdot6\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe smallest possible sum of four distinct digits is \\(1+2+3+4=10\\) and the largest is \\(5+6+7+8=26\\); the only value in this interval congruent to \\(7\\pmod{11}\\) is \\(18\\). \nThus we require \n\n\\[\nS_o=S_e=18.\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 3. Choosing the digits for odd positions \n\nWe need 4\u2011element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\nEnumerating them gives \n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(m=8\\) such subsets. \nEach contains exactly two even digits and two odd digits (otherwise the sum cannot be 18).\n\n---\n\n### 4. Forming the numbers \n\nFor a given subset \\(O\\) (odd\u2011position digits):\n\n* Arrange the four digits of \\(O\\) among the odd positions \\((1,3,5,7)\\): \\(4! = 24\\) ways.\n* The complement \\(E\\) (the even\u2011position digits) also has exactly two evens.\n * Choose which even digit of \\(E\\) occupies the last position \\(a_8\\): \\(2\\) ways.\n * Arrange the remaining three digits of \\(E\\) in positions \\(2,4,6\\): \\(3! = 6\\) ways.\n\nThus for each subset \\(O\\)\n\n\\[\n\\text{#numbers}=24\\cdot(2\\cdot 6)=24\\cdot12=288 .\n\\]\n\nSince there are \\(8\\) possible subsets,\n\n\\[\nN = 8\\cdot288 = 2304 .\n\\]\n\n---\n\n### 5. Required difference \n\n\\[\nN-2025 = 2304-2025 = 279 .\n\\]\n\n\\[\n\\boxed{279}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the twelve letters be \n\n\\[\nAG\\)* (i.e. \\(Y\\in\\{H,I,J,K,L\\}\\)): \n\\(s_G=G\\). Condition (1) becomes \u201cno other pair has both letters\ngreater than \\(G\\)\u201d, because any such pair would have a minimum exceeding \\(G\\).\n\nAfter removing \\(G\\) and \\(Y\\) we have \n\n- six letters \\(G\\) : the remaining four of \\(\\{H,I,J,K,L\\}\\).\n\nWe must pair each of the four \u201chigh\u2019\u2019 letters with a distinct \u201clow\u2019\u2019\nletter; the two unused low letters are then paired together.\n\nNumber of such matchings \n\n\\[\n\\binom{6}{4}\\,4!=15\\cdot 24=360 .\n\\]\n\nThe total number of matchings on the ten remaining letters is \n\n\\[\n(10-1)!!=9\\cdot7\\cdot5\\cdot3\\cdot1=945 .\n\\]\n\nHence \n\n\\[\n\\Pr(\\text{condition }|\\,Y>G)=\\frac{360}{945}=\\frac{8}{21}.\n\\tag{2}\n\\]\n\nThere are five possibilities for \\(Y>G\\).\n\n--------------------------------------------------------------------\n*If \\(YY\\) (the letters greater than \\(Y\\) except the removed\n\\(G\\)).\n\nFor the condition to be possible we need at least as many letters\n\\(Y\\); this occurs only when \\(y=6\\), i.e. \\(Y=F\\).\n\nWhen \\(Y=F\\) the remaining letters are \n\n- five letters \\(F\\): \\(H,I,J,K,L\\).\n\nAgain every \u201chigh\u2019\u2019 letter must be paired with a distinct \u201clow\u2019\u2019 letter,\ngiving exactly \n\n\\[\n5! =120\n\\]\n\nacceptable matchings. Therefore \n\n\\[\n\\Pr(\\text{condition }|\\,Y=F)=\\frac{120}{945}= \\frac{8}{63},\n\\tag{3}\n\\]\n\nand for \\(Y=A,B,C,D,E\\) the probability is \\(0\\).\n\n--------------------------------------------------------------------\n### 4. Overall probability\n\nUsing that the partner of \\(G\\) is uniformly one of the other eleven\nletters,\n\n\\[\n\\begin{aligned}\n\\Pr(\\text{last word contains }G)\n&=\\frac1{11}\\Bigl(\n5\\cdot\\frac{8}{21}\n+\\frac{8}{63}\n+0+0+0+0+0\\Bigr)\\\\[2mm]\n&=\\frac1{11}\\Bigl(\\frac{40}{21}+\\frac{8}{63}\\Bigr)\n =\\frac1{11}\\Bigl(\\frac{120}{63}+\\frac{8}{63}\\Bigr)\\\\[2mm]\n&=\\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\frac{128}{693}\\) is already in lowest terms\n(\\(\\gcd(128,693)=1\\)).\n\nThus \n\n\\[\nm=128,\\qquad n=693,\\qquad m+n=821.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nC:\\;y=x^{2}-4\n\\]\n\nbe the given parabola. \nRotate \\(C\\) \\(60^{\\circ}\\) counter\u2011clockwise about the origin. \nIf a point \\((x,y)\\) lies on both \\(C\\) and its rotated image, then rotating \\((x,y)\\) **clockwise** by \\(60^{\\circ}\\) must again land on \\(C\\).\n\n---\n\n### 1. The rotation equations \n\nFor a clockwise rotation of \\(60^{\\circ}\\),\n\n\\[\n\\begin{aligned}\nx'&=x\\cos60^{\\circ}+y\\sin60^{\\circ}= \\tfrac12 x+\\tfrac{\\sqrt3}{2}y,\\\\[2mm]\ny'&=-x\\sin60^{\\circ}+y\\cos60^{\\circ}= -\\tfrac{\\sqrt3}{2}x+\\tfrac12 y .\n\\end{aligned}\n\\]\n\nThe condition \u201cthe rotated point lies on \\(C\\)\u201d is\n\n\\[\ny'=(x')^{2}-4 .\n\\]\n\nSubstituting \\(y=x^{2}-4\\) (since \\((x,y)\\in C\\)) gives a single equation in \\(x\\).\n\n---\n\n### 2. Obtain the equation in \\(x\\)\n\nPut \\(\\displaystyle s=\\frac{\\sqrt3}{2},\\ c=\\frac12\\). \nThen\n\n\\[\n\\begin{aligned}\nx' &=c\\,x+s\\,(x^{2}-4)= s x^{2}+c x-4s,\\\\[1mm]\ny' &=-s\\,x+c\\,(x^{2}-4)=c x^{2}-s x-4c .\n\\end{aligned}\n\\]\n\nThe condition \\(y'= (x')^{2}-4\\) becomes\n\n\\[\nc x^{2}-s x-4c =\\bigl(s x^{2}+c x-4s\\bigr)^{2}-4 .\n\\]\n\nInsert \\(c=\\tfrac12,\\ s=\\tfrac{\\sqrt3}{2}\\) and clear denominators (multiply by \\(4\\)):\n\n\\[\n2x^{2}-2\\sqrt3\\,x-8 = \\bigl(\\sqrt3\\,x^{2}+x-4\\sqrt3\\bigr)^{2}-4 .\n\\]\n\nAfter simplifying we obtain the quartic\n\n\\[\n3x^{4}+2\\sqrt3\\,x^{3}-25x^{2}-6\\sqrt3\\,x+40=0 .\n\\]\n\n---\n\n### 3. Factor the quartic\n\nTrying a factorisation \\((3x^{2}+Bx+C)(x^{2}+Ex+F)\\) with\n\\(B,E\\) multiples of \\(\\sqrt3\\), we find\n\n\\[\n\\boxed{(3x^{2}-\\sqrt3\\,x-10)(x^{2}+\\sqrt3\\,x-4)=0}.\n\\]\n\nHence the possible \\(x\\)-coordinates are the roots of\n\n\\[\n\\begin{cases}\n3x^{2}-\\sqrt3\\,x-10=0,\\\\[1mm]\nx^{2}+\\sqrt3\\,x-4=0 .\n\\end{cases}\n\\]\n\nSolving:\n\n\\[\n\\begin{aligned}\n3x^{2}-\\sqrt3\\,x-10=0 &\\Longrightarrow \nx=\\dfrac{\\sqrt3\\pm\\sqrt{123}}6\\;( \\approx 2.14,\\ -1.56),\\\\[2mm]\nx^{2}+\\sqrt3\\,x-4=0 &\\Longrightarrow \nx=\\dfrac{-\\sqrt3\\pm\\sqrt{19}}2\\;( \\approx 1.31,\\ -3.05).\n\\end{aligned}\n\\]\n\n---\n\n### 4. Identify the point in the fourth quadrant \n\nThe fourth quadrant requires \\(x>0\\) and \\(y<0\\). \nOnly \n\n\\[\nx=\\frac{-\\sqrt3+\\sqrt{19}}2 \\approx 1.31\n\\]\n\nsatisfies these conditions (the other positive root gives \\(x>2\\) and \\(y>0\\)). \n\nThus the intersection point in the fourth quadrant is\n\n\\[\n\\bigl(x,\\;y\\bigr)=\\left(\\frac{-\\sqrt3+\\sqrt{19}}2,\\;\n\\left(\\frac{-\\sqrt3+\\sqrt{19}}2\\right)^{\\!2}-4\\right).\n\\]\n\nCompute \\(y\\):\n\n\\[\n\\begin{aligned}\ny&=\\frac{(-\\sqrt3+\\sqrt{19})^{2}}{4}-4\n =\\frac{3+19-2\\sqrt{57}}{4}-4\n =\\frac{22-2\\sqrt{57}}{4}-4 \\\\\n &=\\frac{11}{2}-\\frac{\\sqrt{57}}2-4\n =\\frac{3-\\sqrt{57}}{2}.\n\\end{aligned}\n\\]\n\nHence \n\n\\[\ny=\\frac{\\,3-\\sqrt{57}\\,}{2}\n\\]\n\nwhich matches the required form \\(\\displaystyle \\frac{a-\\sqrt b}{c}\\) with \n\n\\[\na=3,\\qquad b=57,\\qquad c=2.\n\\]\n\n\\(a\\) and \\(c\\) are relatively prime, as required.\n\n---\n\n### 5. Compute \\(a+b+c\\)\n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Sketch**\n\n1. **Placing the pentagon.** \n Put \\(B=(0,0)\\) and let \\(BC\\) be the segment on the \\(x\\)-axis, so \\(C=(7,0)\\). \n Since \\(\\angle B=60^{\\circ}\\) and \\(AB=14\\),\n\n\\[\nA=\\bigl(7,\\;7\\sqrt3 \\bigr).\n\\]\n\n Using the law of cosines in \\(\\triangle ABC\\) we obtain \\(AC=7\\sqrt3\\); thus\n\\(\\triangle ABC\\) is a \\(30\\!-\\!60\\!-\\!90\\) right triangle with right angle at \\(C\\).\n\n In the same way the data at \\(E\\) give a similar \\(30\\!-\\!60\\!-\\!90\\) triangle\n\\(\\triangle AED\\) with right angle at \\(D\\), giving \n\n\\[\nAE=26,\\qquad DE=13,\\qquad AD=13\\sqrt3 .\n\\]\n\n Solving the two circles \\((A,13\\sqrt3)\\) and \\((C,24)\\) yields \n\n\\[\nD=\\Bigl(\\frac{205}{7},\\;\\frac{36\\sqrt3}{7}\\Bigr),\\qquad\nE=\\Bigl(\\frac{218}{7},\\;\\frac{88\\sqrt3}{7}\\Bigr).\n\\]\n\n2. **A useful line.** \n Points \\(B\\) and \\(E\\) are joined by the segment \\(BE\\) of length \n\n\\[\nBE=\\frac{266}{7}=38 .\n\\]\n\n For any point \\(X\\) on the line \\(BE\\) we have, by the triangle inequality,\n\\[\nXB+XE=BE=38 .\n\\]\n\n Hence for \\(X\\in BE\\)\n\n\\[\nf(X)=XB+XE+AX+CX+DX=38+AX+CX+DX .\n\\]\n\n Therefore the problem reduces to minimizing \n\n\\[\ng(X)=AX+CX+DX\\qquad (X\\in BE).\n\\]\n\n3. **Parameterising the line.** \n Write \\(X\\) as \n\n\\[\nX(t)=\\Bigl(\\frac{218}{7}t,\\;\\frac{88\\sqrt3}{7}t\\Bigr),\\qquad 0\\le t\\le 1 .\n\\]\n\n Direct computation gives \n\n\\[\n\\begin{aligned}\nAX^2&=\\frac{4\\cdot79-28t+1444t^{2}}{9},\\\\[2mm]\nCX^2&=\\frac{577-158t+1444t^{2}}{9},\\\\[2mm]\nDX^2&=\\frac{3241-1106t+1444t^{2}}{9}.\n\\end{aligned}\n\\]\n\n The function \\(g(t)=\\sqrt{AX^2}+\\sqrt{CX^2}+\\sqrt{DX^2}\\) is convex,\nso its minimum occurs where \\(g'(t)=0\\).\n\n4. **Finding the minimizing \\(t\\).** \n Using the derivative formula for a distance,\n\\( \\dfrac{d}{dt}\\sqrt{at^{2}+bt+c}=\n \\dfrac{2at+b}{2\\sqrt{at^{2}+bt+c}}\\),\nthe condition \\(g'(t)=0\\) becomes\n\n\\[\n\\frac{1444t-482}{\\sqrt{4\\cdot79-28t+1444t^{2}}}\n+\\frac{1444t-218}{\\sqrt{577-158t+1444t^{2}}}\n+\\frac{1444t-1106}{\\sqrt{3241-1106t+1444t^{2}}}=0 .\n\\]\n\n Substituting \\(t=\\dfrac13\\) makes each numerator a multiple of\n\\(2,\\,790,\\,-1874\\) respectively, and a short computation shows the\nleft\u2011hand side to be zero. Because of convexity, \\(t=\\dfrac13\\) gives the\nglobal minimum.\n\n5. **The minimum value.** \n For \\(t=\\dfrac13\\),\n\n\\[\n\\begin{aligned}\nAX&=\\frac{2\\sqrt{79}}{3},\\\\[1mm]\nCX&=\\frac{\\sqrt{577}}{3},\\\\[1mm]\nDX&=\\frac{\\sqrt{3241}}{3}.\n\\end{aligned}\n\\]\n\n A direct squaring shows\n\n\\[\n2\\sqrt{79}+ \\sqrt{577}+ \\sqrt{3241}=57\\sqrt3 ,\n\\]\n\n therefore \n\n\\[\ng_{\\min}= \\frac{57\\sqrt3}{3}=19\\sqrt3 .\n\\]\n\n Adding the constant part \\(XB+XE=38\\) gives the least possible value of\n\\(f\\):\n\n\\[\nf_{\\min}=38+19\\sqrt3 .\n\\]\n\n6. **Answer.** \n The expression is of the form \\(m+n\\sqrt p\\) with\n\\(m=38,\\;n=19,\\;p=3\\). Hence\n\n\\[\nm+n+p = 38+19+3 = 60 .\n\\]\n\n\\[\n\\boxed{60}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution**\n\nLet \n\n\\[\nM=3^{7}=2187 ,\\qquad L=3^{6}=729 .\n\\]\n\nAll ordered triples \\((a,b,c)\\) satisfy \n\n\\[\nN=\\#\\{1\\le a,b,c\\le L\\;|\\;a^{3}+b^{3}+c^{3}\\equiv 0\\pmod{M}\\}.\n\\]\n\n--------------------------------------------------------------------\n### 1. The cubes modulo \\(M\\)\n\nWrite a positive integer \\(a\\) as \n\n\\[\na=3^{v}\\,u ,\\qquad v=v_{3}(a)\\in\\{0,1,2,3,4,5,6\\},\n\\qquad 3\\nmid u .\n\\]\n\n*If \\(v\\ge 3\\) then \\(a^{3}\\equiv0\\pmod{M}\\). \nIf \\(v=2\\) then \\(a^{3}\\equiv729\\,u\\pmod{M}\\) and, because\n\\(u\\equiv\\pm1\\pmod3\\),\n\n\\[\na^{3}\\equiv\\begin{cases}\n729 & u\\equiv1\\pmod3,\\\\[2mm]\n1458& u\\equiv2\\pmod3 .\n\\end{cases}\n\\]\n\n*If \\(v=1\\) then \\(a=3u\\;(3\\nmid u\\le 243)\\) and \n\n\\[\na^{3}\\equiv27\\,u^{3}\\pmod{M}.\n\\]\n\nSince \\(27\\cdot81=M\\), only \\(u^{3}\\pmod{81}\\) matters. The\nset of cubic residues modulo \\(81\\) among the units is \n\n\\[\nR_{4}=\\{x\\in\\mathbb Z/81\\;|\\;x\\equiv\\pm1\\pmod9\\},\n\\qquad |R_{4}|=18 .\n\\]\n\nEach element of \\(R_{4}\\) occurs exactly three times among the\n\\(162\\) numbers \\(u\\) (the three residue\u2011classes modulo \\(81\\));\nhence each value \\(27r\\;(r\\in R_{4})\\) occurs \\(9\\) times.\n\n*If \\(v=0\\) (i.e. \\(3\\nmid a\\)), then \\(a^{3}\\) runs through the\ncubic residues among the units modulo \\(M\\)\n\n\\[\nR_{7}=\\{x\\in\\mathbb Z/M\\;|\\;x\\equiv\\pm1\\pmod9\\},\n\\qquad |R_{7}|=486 ,\n\\]\n\neach occurring **once**.\n\nSummarising, the multiset of residues \\(\\{a^{3}\\pmod M\\}\\) is\n\n| residue type | number of residues | multiplicity |\n|---|---|---|\n| \\(x\\in R_{7}\\) | \\(486\\) | \\(1\\) |\n| \\(27r,\\,r\\in R_{4}\\) | \\(18\\) | \\(9\\) |\n| \\(729\\) | \\(1\\) | \\(27\\) |\n| \\(1458\\) | \\(1\\) | \\(27\\) |\n| \\(0\\) | \\(1\\) | \\(27\\) |\n| total | \\(729\\) | \u2013 |\n\n--------------------------------------------------------------------\n### 2. Fourier representation\n\nPut \n\n\\[\n\\zeta =e^{2\\pi i/M}, \\qquad \nS(k)=\\sum_{a=1}^{L}\\zeta^{k a^{3}}\n =\\sum_{x}f(x)\\,\\zeta^{k x},\n\\]\n\nwhere \\(f(x)\\) is the multiplicity of the residue \\(x\\) listed above.\nOrthogonality of characters gives \n\n\\[\nN=\\frac1{M}\\sum_{k=0}^{M-1}S(k)^{3}\\tag{1}\n\\]\n\nand we have to evaluate the sum on the right.\n\n--------------------------------------------------------------------\n### 3. Explicit form of \\(S(k)\\)\n\nWrite \\(k=3^{v}t\\;(3\\nmid t)\\). \nThe three kinds of contributions are\n\n* from \\(R_{7}\\) (cubic residues modulo \\(M\\)) \n\n\\[\nS_{7}(k)=\\sum_{x\\in R_{7}}\\zeta^{k x}\n =\\begin{cases}\n 486\\cos\\frac{2\\pi t}{9},&3^{5}\\mid k,\\\\\n 0,&\\text{otherwise}.\n \\end{cases}\n\\]\n\n* from the residues \\(27r\\) (\\(r\\in R_{4}\\)) \n\n\\[\n9S_{4}(k)=9\\sum_{r\\in R_{4}}\\zeta^{27k r}\n =\\begin{cases}\n 162\\cos\\frac{2\\pi t}{9},&9\\mid k,\\\\\n 0,&\\text{otherwise}.\n \\end{cases}\n\\]\n\n* from the three \u201cfixed\u2019\u2019 residues \\(0,\\,729,\\,1458\\) \n\n\\[\nS_{2}(k)+S_{3}(k)=27\\bigl(\\zeta^{729k}+\\zeta^{1458k}+1\\bigr)\n =\\begin{cases}\n 81,&3\\mid k,\\\\[2mm]\n 0,&3\\nmid k .\n \\end{cases}\n\\]\n\nHence\n\n\\[\nS(k)=S_{7}(k)+9S_{4}(k)+\n\\begin{cases}\n81,&3\\mid k,\\\\\n0,&3\\nmid k .\n\\end{cases}\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 4. Values of \\(S(k)\\)\n\nAccording to the 3\u2011adic valuation \\(v=v_{3}(k)\\) we obtain\n\n| \\(v\\) | condition on \\(k\\) | \\(S(k)\\) |\n|---|---|---|\n| \\(0\\) | \\(3\\nmid k\\) | \\(0\\) |\n| \\(1\\) | \\(3\\mid k,\\;9\\nmid k\\) | \\(81\\) |\n| \\(2\\) | \\(9\\mid k,\\;27\\nmid k\\) | \\(81\\bigl(1+2\\cos\\frac{2\\pi u}{9}\\bigr)\\) \\(\\;(u=k/9\\bmod9\\neq0,3,6)\\) |\n| \\(3\\) | \\(27\\mid k,\\;81\\nmid k\\) | \\(0\\) |\n| \\(4\\) | \\(81\\mid k,\\;243\\nmid k\\) | \\(243\\) |\n| \\(5\\) | \\(243\\mid k,\\;729\\nmid k\\) | \\(243\\bigl(1+2\\cos\\frac{2\\pi t}{9}\\bigr)\\) \\(\\;(t=k/243\\bmod9\\neq0,3,6)\\) |\n| \\(6\\) | \\(729\\mid k\\) | \\(0\\) |\n| \\(k=0\\) | \u2013 | \\(S(0)=729\\) |\n\nThe numbers of \\(k\\) having each valuation are \n\n\\[\n\\begin{aligned}\n&v=0:1458,\\quad v=1:486,\\quad v=2:162,\\\\\n&v=3:54,\\quad v=4:18,\\quad v=5:6,\\quad v=6:2 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5. Summation of \\(S(k)^{3}\\)\n\nDenote \n\n\\[\nC=\\sum_{u\\in\\{1,2,4,5,7,8\\}}\\bigl(1+2\\cos\\tfrac{2\\pi u}{9}\\bigr)^{3}.\n\\]\n\nUsing the identity \n\n\\[\n\\sum_{u\\in\\{1,2,4,5,7,8\\}}\\bigl(1+2\\cos\\tfrac{2\\pi u}{9}\\bigr)^{3}=36,\n\\]\n\n(which follows from expanding \\((1+z^{u}+z^{-u})^{3}\\) and summing over\n\\(u\\) with \\(z=e^{2\\pi i/9}\\)), we obtain\n\n\\[\n\\begin{aligned}\n\\sum_{k}S(k)^{3}\n&= 486\\cdot81^{3}\n +162\\cdot81^{3}\n +18\\cdot243^{3}\n +6\\cdot243^{3} \\\\\n&= 486\\cdot531\\,441\n +162\\cdot531\\,441\n +18\\cdot14\\,348\\,907\n +6\\cdot14\\,348\\,907 \\\\\n&=5\\cdot3^{18}=5\\cdot387\\,420\\,489\n =1\\,937\\,102\\,445 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 6. The number \\(N\\)\n\nFrom (1),\n\n\\[\nN=\\frac{1}{3^{7}}\\sum_{k}S(k)^{3}\n =\\frac{5\\cdot3^{18}}{3^{7}}\n =5\\cdot3^{11}=5\\cdot177\\,147=885\\,735 .\n\\]\n\n--------------------------------------------------------------------\n### 7. Remainder modulo \\(1000\\)\n\n\\[\n885\\,735 \\equiv 735 \\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{735}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \\frac{N(x)}{x},\n\\qquad N(x)=(x-18)(x-72)(x-98)(x-k)\n\\]\n\nfor \\(x>0\\) and a positive parameter \\(k\\).\n\n--------------------------------------------------------------------\n### 1. Critical points\n\n\\[\nf'(x)=\\frac{xN'(x)-N(x)}{x^{2}},\\qquad \nf'(x)=0\\Longleftrightarrow H(x):=xN'(x)-N(x)=0 .\n\\]\n\nWrite \n\n\\[\nN(x)=x^{4}-S_{1}x^{3}+S_{2}x^{2}-S_{3}x+S_{4},\n\\]\n\nwhere \n\n\\[\n\\begin{aligned}\nS_{1}&=18+72+98+k = 188+k,\\\\\nS_{2}&=18\\cdot72+18\\cdot98+72\\cdot98+ (18+72+98)k =10116+188k,\\\\\nS_{3}&=18\\cdot72\\cdot98+(18\\cdot72+18\\cdot98+72\\cdot98)k =127008+10116k,\\\\\nS_{4}&=18\\cdot72\\cdot98\\cdot k =127008\\,k .\n\\end{aligned}\n\\]\n\nSince \n\n\\[\nN'(x)=4x^{3}-3S_{1}x^{2}+2S_{2}x-S_{3},\n\\]\n\nwe obtain \n\n\\[\n\\begin{aligned}\nH(x)&=xN'(x)-N(x) \\\\\n &=3x^{4}-2S_{1}x^{3}+S_{2}x^{2}-S_{4}\\\\\n &=3x^{4}-(376+2k)x^{3}+(10116+188k)x^{2}-127008k .\n\\end{aligned}\n\\]\n\nThe three positive roots of \\(H\\) are the two minima of \\(f\\) (in the intervals where\n\\(f<0\\)) and one interior maximum.\n\n--------------------------------------------------------------------\n### 2. When are the two minima equal?\n\nAt a minimum \\(x_{0}\\),\n\n\\[\nf(x_{0}) = \\frac{N(x_{0})}{x_{0}} = N'(x_{0})=:m .\n\\]\n\nThus the equation \\(N(x)=mx\\) has a **double** root at each minimum.\nIf the global minimum is attained at exactly two points, then\n\n\\[\nN(x)-mx=(x-\\alpha)^{2}(x-\\gamma)^{2},\n\\qquad\\alpha\\neq\\gamma>0 .\n\\]\n\nExpanding both sides and comparing coefficients gives\n\n\\[\n\\begin{cases}\n\\alpha+\\gamma =\\displaystyle\\frac{188+k}{2},\\\\[4pt]\n\\alpha\\gamma = -\\dfrac{k^{2}}{8}+47k+640,\\\\[4pt]\n(\\alpha\\gamma)^{2}=S_{4}=127008k .\n\\end{cases}\n\\]\n\nEliminating \\(\\alpha,\\gamma\\) yields a single equation for \\(k\\):\n\n\\[\n\\Bigl(-\\frac{k^{2}}{8}+47k+640\\Bigr)^{2}=127008k .\n\\]\n\nMultiplying by \\(64\\),\n\n\\[\n(k^{2}-376k-5120)^{2}=8\\,128\\,512\\,k,\n\\]\n\nwhich simplifies to the quartic\n\n\\[\nk^{4}-752k^{3}+131136k^{2}-4\\,278\\,272k+26\\,214\\,400=0 .\n\\]\n\n--------------------------------------------------------------------\n### 3. Solving the quartic\n\nFactoring gives \n\n\\[\n(k-8)(k-32)(k^{2}-712k+102400)=0,\n\\]\n\nso the four real solutions are \n\n\\[\nk=8,\\qquad k=32,\\qquad k=200,\\qquad k=512 .\n\\]\n\n--------------------------------------------------------------------\n### 4. Selecting the admissible \\(k\\)\n\nFor the two minima to be **positive**, the product \\(\\alpha\\gamma\\) must be positive:\n\n\\[\n\\alpha\\gamma = -\\frac{k^{2}}{8}+47k+640 >0 .\n\\]\n\nEvaluating this expression:\n\n\\[\n\\begin{array}{c|c}\nk & \\alpha\\gamma\\\\ \\hline\n8 & 1008>0\\\\\n32 & 2016>0\\\\\n200 & 5040>0\\\\\n512 & -8064<0\n\\end{array}\n\\]\n\nThus \\(k=512\\) gives one root \\(\\alpha\\) negative and cannot produce two minima on the\npositive axis. The admissible values are \n\n\\[\nk=8,\\;32,\\;200 .\n\\]\n\n--------------------------------------------------------------------\n### 5. Sum of the three values\n\n\\[\n8+32+200 = 240 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz0 & >0 & x0 & <0 & y<\\min\\{x,z\\} & \\text{unbounded}\\\\\n<0 & >0 & \\max\\{x,z\\}y>z & \\text{impossible (sum }75)\n\\end{array}\n\\]\n\nOnly the first case can give a finite region. \nWith \\(x+y+z=75\\) and the inequalities\n\n\\[\nx>-1,\\qquad x-1,\\\\\nx0\\) is when \\(m=0\\) (i.e. \\(k=1\\)) and \\(\\delta=1\\),\nwhich occurs exactly when \n\n\\[\nv=r\\bmod 10\\ge5 .\n\\]\n\nHence **the greedy algorithm fails precisely when**\n\\[\nN\\ge 25\\quad\\text{and}\\quad (N\\bmod 25)\\bmod 10\\ge5.\n\\]\n\nEquivalently, the \u201cbad\u2019\u2019 remainders (after taking as many quarters as possible) are \n\n\\[\nr\\in\\{5,6,7,8,9,15,16,17,18,19\\}.\n\\]\n\nIn each block of 25 consecutive integers there are 10 such remainders.\n\n---\n\n### 3. Counting the failures between 1 and 1000\n\nThe interval \\([25,1000]\\) contains \\(1000-24=976\\) integers.\nFrom 25 onward the numbers are grouped into blocks \n\n\\[\n25\\!-\\!49,\\;50\\!-\\!74,\\;\\dots,\\;975\\!-\\!999 .\n\\]\n\nThere are \\(39\\) full blocks (the block \\(25\\!-\\!49\\) up to \\(975\\!-\\!999\\)).\nEach block contributes exactly \\(10\\) failures, so\n\n\\[\n\\#\\text{failures}=39\\times10=390 .\n\\]\n\nNumbers \\(1\\) through \\(24\\) are never failures (they contain no quarters).\n\nThus the number of successes is \n\n\\[\n1000-390=610 .\n\\]\n\n---\n\n\\[\n\\boxed{610}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ S $ be the set of vertices of a regular 24-gon. Find the number of ways to draw 12 segments of equal lengths so that each vertex in $ S $ is an endpoint of exactly one of the 12 segments.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "In a regular \\(24\\)-gon label the vertices \\(0,1,\\dots ,23\\) clockwise. \nIf two vertices differ by \\(k\\) (mod \\(24\\)), the chord joining them has length that depends only on \n\n\\[\ns=\\min (k,24-k)\\qquad (1\\le s\\le 12).\n\\]\n\nThus there are \\(12\\) possible lengths, one for each \\(s=1,2,\\dots ,12\\).\n\n--------------------------------------------------------------------\n### 1. The graph of chords of a fixed length \n\nFix a value \\(s\\). The set of all chords of that length is the edge\u2011set of the **circulant graph**\n\\[\nG_s=\\{\\,\\{i,i+s\\}\\mid i=0,1,\\dots ,23\\,\\},\n\\]\nwhere the addition is taken modulo \\(24\\).\n\nLet \\(g=\\gcd(s,24)\\). Adding \\(s\\) repeatedly splits the vertex set into \\(g\\) cycles,\neach of length \n\n\\[\nL=\\frac{24}{g}.\n\\]\n\nSo \\(G_s\\) is a disjoint union of \\(g\\) cycles \\(C_L\\).\n\n--------------------------------------------------------------------\n### 2. When can a perfect matching exist?\n\nA perfect matching (a set of \\(12\\) disjoint edges covering all vertices) can exist only if\nevery component cycle has even length, i.e. \\(L\\) is even.\nSince \\(L=24/g\\), this is equivalent to \\(g\\mid 12\\).\n\n*If \\(g\\mid 12\\) and \\(L\\ge 4\\)*, each even cycle \\(C_L\\) has exactly **2** perfect\nmatchings (choose alternating edges). \n*If \\(L=2\\)* (the case \\(s=12\\)), each component is a single edge and contributes only **1** matching.\n\nThe only step for which \\(g\\nmid 12\\) is \\(s=8\\) (here \\(g=8\\) and the components are 3\u2011cycles),\nso no perfect matching exists for \\(s=8\\).\n\n--------------------------------------------------------------------\n### 3. Number of matchings for each possible length\n\n\\[\n\\begin{array}{c|c|c|c}\ns & g=\\gcd(s,24) & L=24/g & \\#\\text{ matchings}\\\\ \\hline\n1 &1 &24 &2\\\\\n2 &2 &12 &2^{2}=4\\\\\n3 &3 & 8 &2^{3}=8\\\\\n4 &4 & 6 &2^{4}=16\\\\\n5 &1 &24 &2\\\\\n6 &6 & 4 &2^{6}=64\\\\\n7 &1 &24 &2\\\\\n8 &8 & 3 &0\\\\\n9 &3 & 8 &2^{3}=8\\\\\n10&2 &12 &2^{2}=4\\\\\n11&1 &24 &2\\\\\n12&12& 2 &1\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4. Total number of ways\n\nAdd the numbers for all admissible lengths (all \\(s\\) except \\(s=8\\)):\n\n\\[\n\\begin{aligned}\n\\text{Total}&=2+4+8+16+2+64+2+8+4+2+1\\\\\n&=113 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{113}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSixteen chairs are arranged in a row. Eight people each select a chair in which to sit so that no person sits next to two other people. Let $ N $ be the number of subsets of 16 chairs that could be selected. Find the remainder when $ N $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The chairs can be represented by a binary string of length\u202f16, where a \\(1\\) means the chair is taken. \nWe need strings with exactly eight\u202f\\(1\\)\u2019s and with **no three consecutive \\(1\\)\u2019s** (otherwise the middle person would sit next to two others).\n\n---\n\n### Counting by blocks\n\nA valid string consists of blocks of consecutive \\(1\\)\u2019s of length\u202f1 or\u202f2, separated by at least one \\(0\\).\n\nLet \n\n* \\(t\\) = number of blocks of length\u202f2, \n* \\(b\\) = total number of blocks. \n\nSince each block contributes at least one \\(1\\),\n\n\\[\n\\underbrace{(b-t)}_{\\text{blocks of length 1}}+2t=8\\quad\\Longrightarrow\\quad b+ t=8,\\; b=8-t .\n\\]\n\nSo \\(t=0,1,2,3,4\\).\n\nFor a fixed \\(t\\):\n* Choose which of the \\(b\\) blocks are the length\u20112 ones: \\(\\displaystyle\\binom{b}{t}=\\binom{8-t}{t}\\).\n* There are \\(8-8=8\\) empty chairs; let \\(z=8\\). \n The \\(b+1\\) gaps (including the two ends) must contain these zeros, with at least one zero in each interior gap. \n After placing one zero in each of the \\(b-1\\) interior gaps, we have \\(z-(b-1)=9-b\\) zeros left to distribute freely among the \\(b+1\\) gaps. \n The number of ways is \\(\\displaystyle\\binom{9-b}{b}=\\binom{9}{b}\\).\n\nHence for each \\(t\\),\n\n\\[\nN_t=\\binom{8-t}{t}\\binom{9}{8-t}.\n\\]\n\nSumming over \\(t=0\\) to \\(4\\):\n\n\\[\n\\begin{aligned}\nN &=\\binom{8}{0}\\binom{9}{8}\n +\\binom{7}{1}\\binom{9}{7}\n +\\binom{6}{2}\\binom{9}{6}\n +\\binom{5}{3}\\binom{9}{5}\n +\\binom{4}{4}\\binom{9}{4} \\\\[2mm]\n &=1\\cdot9+7\\cdot36+15\\cdot84+10\\cdot126+1\\cdot126\\\\\n &=9+252+1260+1260+126\\\\\n &=2907 .\n\\end{aligned}\n\\]\n\n---\n\n### Modulo\u202f1000\n\n\\[\n2907 \\equiv 907 \\pmod{1000}.\n\\]\n\n---\n\n\\[\n\\boxed{907}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ A_1A_2 \\ldots A_{11} $ be an 11-sided non-convex simple polygon with the following properties:\n* The area of $ A_iA_1A_{i+1} $ is 1 for each $ 2 \\leq i \\leq 10 $,\n* $ \\cos(\\angle A_iA_1A_{i+1}) = \\frac{12}{13} $ for each $ 2 \\leq i \\leq 10 $,\n* The perimeter of $ A_1A_2 \\ldots A_{11} $ is 20.\nIf $ A_1A_2 + A_1A_{11} $ can be expressed as $ \\frac{m\\sqrt{n} - p}{q} $ for positive integers $ m, n, p, q $ with $ n $ squarefree and no prime divides all of $ m, p, q$, find $ m + n + p + q $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nr_i=A_1A_i\\qquad (i=2,\\dots ,11),\\qquad \n\\theta=\\angle A_iA_1A_{i+1}.\n\\]\n\nFor each \\(i=2,\\dots ,10\\)\n\n\\[\n\\cos\\theta=\\frac{12}{13},\\qquad \n\\text{Area}(A_iA_1A_{i+1})=\\frac12 r_i r_{i+1}\\sin\\theta =1 .\n\\]\n\nSince \\(\\sin\\theta=\\sqrt{1-\\cos ^2\\theta}=5/13\\),\n\n\\[\nr_i r_{i+1}= \\frac{2}{\\sin\\theta}= \\frac{2}{5/13}= \\frac{26}{5}\n=:k\\quad\\text{(constant)}.\n\\]\n\nThus \n\n\\[\nr_{i+1}= \\frac{k}{r_i},\\qquad\\text{so}\\qquad r_{i+2}=r_i .\n\\]\n\nHence the distances from \\(A_1\\) alternate:\n\n\\[\nr_2=r_4=r_6=r_8=r_{10}=a,\\qquad \nr_3=r_5=r_7=r_9=r_{11}=b,\n\\]\n\nwith \n\n\\[\nab=k=\\frac{26}{5}.\n\\]\n\n--------------------------------------------------------------------\n### Length of a side \\(A_iA_{i+1}\\)\n\nFor any consecutive pair \\((a,b)\\),\n\n\\[\nA_iA_{i+1}=d=\\sqrt{a^2+b^2-2ab\\cos\\theta}\n =\\sqrt{a^2+b^2-\\frac{24}{13}ab}.\n\\]\n\nLet \n\n\\[\nx=a+b,\\qquad ab=k .\n\\]\n\nBecause \\(a^2+b^2=(a+b)^2-2ab=x^2-2k\\),\n\n\\[\nd=\\sqrt{x^2-2k-\\frac{24}{13}k}\n =\\sqrt{x^2-\\frac{50}{13}\\,k}.\n\\]\n\nSince \\(k=\\dfrac{26}{5}\\),\n\n\\[\n\\frac{50}{13}k=\\frac{50}{13}\\cdot\\frac{26}{5}=20,\n\\qquad\\boxed{d=\\sqrt{x^2-20}} .\n\\]\n\n--------------------------------------------------------------------\n### Using the perimeter\n\nThe perimeter of the 11\u2011gon is\n\n\\[\na+b+9d = x+9\\sqrt{x^2-20}=20 .\n\\]\n\nSolve for \\(x\\) (note \\(x>0\\) and \\(\\sqrt{x^2-20}\\ge0\\)):\n\n\\[\n9\\sqrt{x^2-20}=20-x\\quad\\Longrightarrow\\quad\n81(x^2-20)=(20-x)^2 .\n\\]\n\nThis gives \n\n\\[\n80x^2+40x-2020=0\\;\\Longrightarrow\\;4x^2+2x-101=0.\n\\]\n\nHence \n\n\\[\nx=\\frac{-2\\pm\\sqrt{4+1616}}{8}\n =\\frac{-2\\pm18\\sqrt5}{8}\n =\\frac{-1\\pm9\\sqrt5}{4}.\n\\]\n\nOnly the positive root satisfies the constraints, so \n\n\\[\n\\boxed{x=a+b=\\frac{9\\sqrt5-1}{4}} .\n\\]\n\nThus\n\n\\[\nA_1A_2+A_1A_{11}=a+b=\\frac{9\\sqrt5-1}{4}\n =\\frac{m\\sqrt n-p}{q},\n\\]\n\nwith \\(m=9,\\;n=5,\\;p=1,\\;q=4\\).\n\nAll conditions on \\(m,n,p,q\\) are met, and\n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all integer bases $b>9$ for which $17_{b}$ is a divisor of $97_{b}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "In base \\(b\\) the numbers are \n\n\\[\n17_{b}=1\\cdot b+7=b+7, \\qquad 97_{b}=9\\cdot b+7=9b+7 .\n\\]\n\nWe need \\(b+7\\) to divide \\(9b+7\\).\n\n---\n\n### Find the divisibility condition \n\n\\[\n9b+7 = 9(b+7)-56 .\n\\]\n\nThus the remainder when \\(9b+7\\) is divided by \\(b+7\\) is \\(-56\\). \nHence \\(b+7\\) must divide \\(56\\):\n\n\\[\nb+7\\mid 56 .\n\\]\n\n---\n\n### Possible values of \\(b\\)\n\nThe positive divisors of \\(56\\) are \n\n\\[\n1,\\;2,\\;4,\\;7,\\;8,\\;14,\\;28,\\;56 .\n\\]\n\nBecause the base must satisfy \\(b>9\\), we have \\(b+7>16\\). \nThe divisors larger than \\(16\\) are \\(28\\) and \\(56\\).\n\n\\[\n\\begin{aligned}\nb+7&=28 \\quad\\Longrightarrow\\quad b=21,\\\\[2pt]\nb+7&=56 \\quad\\Longrightarrow\\quad b=49 .\n\\end{aligned}\n\\]\n\nBoth bases are greater than \\(9\\) and allow the digits \\(1,7,9\\).\n\n---\n\n### Sum of all such bases \n\n\\[\n21+49 = 70.\n\\]\n\n\\[\n\\boxed{70}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe 9 members of a baseball team went to an ice cream parlor after their game. Each player had a singlescoop cone of chocolate, vanilla, or strawberry ice cream. At least one player chose each flavor, and the number of players who chose chocolate was greater than the number of players who chose vanilla, which was greater than the number of players who chose strawberry. Let $N$ be the number of different assignments of flavors to players that meet these conditions. Find the remainder when $N$ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The numbers of players picking chocolate, vanilla and strawberry are \n\n\\[\na=\\#\\text{chocolate},\\qquad b=\\#\\text{vanilla},\\qquad c=\\#\\text{strawberry}\n\\]\n\nwith \n\n\\[\na+b+c=9,\\qquad a>b>c\\ge1 .\n\\]\n\nHence \\((a,b,c)\\) must be three distinct positive integers whose sum is \\(9\\). \nThe possible triples (written in decreasing order) are \n\n\\[\n(6,2,1),\\;(5,3,1),\\;(4,3,2).\n\\]\n\nFor a fixed triple \\((a,b,c)\\) the players are distinct, so the number of assignments\nis the multinomial coefficient \n\n\\[\n\\binom{9}{a,b,c}= \\frac{9!}{a!\\,b!\\,c!}.\n\\]\n\nCompute each term:\n\n\\[\n\\begin{aligned}\n(6,2,1):&\\quad \\frac{9!}{6!\\,2!\\,1!}= \\frac{362880}{720\\cdot2}=252,\\\\[2mm]\n(5,3,1):&\\quad \\frac{9!}{5!\\,3!\\,1!}= \\frac{362880}{120\\cdot6}=504,\\\\[2mm]\n(4,3,2):&\\quad \\frac{9!}{4!\\,3!\\,2!}= \\frac{362880}{24\\cdot6\\cdot2}=1260.\n\\end{aligned}\n\\]\n\nAdd them:\n\n\\[\nN = 252+504+1260 = 2016.\n\\]\n\nThe remainder when \\(N\\) is divided by \\(1000\\) is \n\n\\[\n2016 \\equiv 16 \\pmod{1000}.\n\\]\n\n\\[\n\\boxed{16}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nso that \\(\\angle A=90^{\\circ}\\) and \n\n\\[\nBC=\\sqrt{b^{2}+c^{2}}=38\\qquad\\Longrightarrow\\qquad b^{2}+c^{2}=38^{2}=1444 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Determining the positions of \\(K\\) and \\(L\\)\n\nBecause \n\n\\[\nAK=BK=14\n\\]\n\nthe point \\(K\\) lies at the intersection of the circles of radius \\(14\\) centred at\n\\(A\\) and \\(B\\). \nIf \\(K=(x_{K},y_{K})\\),\n\n\\[\nx_{K}^{2}+y_{K}^{2}=196,\\qquad (x_{K}-b)^{2}+y_{K}^{2}=196 .\n\\]\n\nSubtracting gives \n\n\\[\nb^{2}=2bx_{K}\\;\\Longrightarrow\\;x_{K}= \\frac{b}{2} .\n\\tag{2}\n\\]\n\nHence \n\n\\[\ny_{K}^{2}=196-\\Bigl(\\frac{b}{2}\\Bigr)^{2}=196-\\frac{b^{2}}{4}.\n\\tag{3}\n\\]\n\nSimilarly, from \n\n\\[\nAL=CL=14\n\\]\n\nthe point \\(L=(x_{L},y_{L})\\) satisfies\n\n\\[\ny_{L}= \\frac{c}{2},\\qquad \nx_{L}^{2}=196-\\Bigl(\\frac{c}{2}\\Bigr)^{2}=196-\\frac{c^{2}}{4}.\n\\tag{4}\n\\]\n\nThus, writing \n\n\\[\nU=\\frac{b}{2},\\quad V=\\frac{c}{2},\n\\]\n\nwe have \n\n\\[\nK=\\bigl(U,\\;\\sqrt{196-U^{2}}\\bigr),\\qquad \nL=\\bigl(\\sqrt{196-V^{2}},\\;V\\bigr),\n\\tag{5}\n\\]\n\nand from (1) \n\n\\[\nU^{2}+V^{2}=361. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n### 2. Using the condition \\(KL=14\\)\n\nFrom (5),\n\n\\[\n\\bigl(U-\\sqrt{196-V^{2}}\\bigr)^{2}\n+\\bigl(\\sqrt{196-U^{2}}-V\\bigr)^{2}=196 .\n\\]\n\nExpanding and simplifying with (6) gives\n\n\\[\nU\\sqrt{196-V^{2}}+V\\sqrt{196-U^{2}}=98 . \\tag{7}\n\\]\n\nLet \n\n\\[\np=\\sqrt{196-V^{2}},\\qquad q=\\sqrt{196-U^{2}} .\n\\]\n\nThen \n\n\\[\nU p+V q =98 ,\\qquad p^{2}+q^{2}=31 ,\n\\qquad U^{2}+V^{2}=361 . \\tag{8}\n\\]\n\nFrom (8) we obtain the product\n\n\\[\nU^{2}V^{2}=32448\\quad\\Longrightarrow\\quad UV=104\\sqrt3 . \\tag{9}\n\\]\n\nNow \n\n\\[\n(U+V)^{2}=U^{2}+V^{2}+2UV=361+208\\sqrt3,\n\\]\n\\[\n(U-V)^{2}=U^{2}+V^{2}-2UV=361-208\\sqrt3 .\n\\]\n\nBoth expressions are perfect squares:\n\n\\[\n361+208\\sqrt3=(13+8\\sqrt3)^{2},\n\\qquad\n361-208\\sqrt3=(8\\sqrt3-13)^{2}.\n\\]\n\nHence \n\n\\[\nU+V=13+8\\sqrt3,\\qquad\n|U-V|=8\\sqrt3-13 .\n\\]\n\nSince \\(U>V\\), solving gives \n\n\\[\nU=8\\sqrt3,\\qquad V=13 .\n\\]\n\nConsequently \n\n\\[\nb=2U=16\\sqrt3,\\qquad c=2V=26 .\n\\]\n\n--------------------------------------------------------------------\n### 3. Coordinates of \\(K\\) and \\(L\\)\n\nUsing (5) with the found \\(U,V\\):\n\n\\[\nK=\\bigl(8\\sqrt3,\\; \\sqrt{196-(8\\sqrt3)^{2}}\\bigr)\n =\\bigl(8\\sqrt3,\\;2\\bigr),\n\\]\n\n\\[\nL=\\bigl(\\sqrt{196-13^{2}},\\;13\\bigr)\n =\\bigl(3\\sqrt3,\\;13\\bigr).\n\\]\n\n--------------------------------------------------------------------\n### 4. Area of quadrilateral \\(BKLC\\)\n\nThe vertices in order are \n\n\\[\nB=(16\\sqrt3,0),\\ K=(8\\sqrt3,2),\\ L=(3\\sqrt3,13),\\ C=(0,26).\n\\]\n\nApplying the shoelace formula:\n\n\\[\n\\begin{aligned}\nS_{1}&=x_{B}y_{K}+x_{K}y_{L}+x_{L}y_{C}+x_{C}y_{B}\\\\\n &= (16\\sqrt3)(2)+(8\\sqrt3)(13)+(3\\sqrt3)(26)+0\\\\\n &=32\\sqrt3+104\\sqrt3+78\\sqrt3=214\\sqrt3,\n\\\\[2mm]\nS_{2}&=y_{B}x_{K}+y_{K}x_{L}+y_{L}x_{C}+y_{C}x_{B}\\\\\n &=0+2(3\\sqrt3)+13\\cdot0+26(16\\sqrt3)\\\\\n &=6\\sqrt3+416\\sqrt3=422\\sqrt3 .\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n\\text{Area}=\\frac12|S_{1}-S_{2}|\n =\\frac12\\bigl|214\\sqrt3-422\\sqrt3\\bigr|\n =\\frac12\\,(208\\sqrt3)=104\\sqrt3 .\n\\]\n\nThus the required area is \\(104\\sqrt3\\), i.e. \\(n=104\\).\n\n\\[\n\\boxed{104}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the number of ordered pairs $(x,y)$, where both $x$ and $y$ are integers between $-100$ and $100$, inclusive, such that $12x^{2}-xy-6y^{2}=0$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The equation \n\n\\[\n12x^{2}-xy-6y^{2}=0\n\\]\n\ncan be factored over the integers.\n\n\\[\n\\begin{aligned}\n12x^{2}-xy-6y^{2}\n&= (4x-3y)(3x+2y).\n\\end{aligned}\n\\]\n\nHence a pair \\((x,y)\\) satisfies the equation iff \n\n\\[\n4x-3y=0 \\qquad\\text{or}\\qquad 3x+2y=0 .\n\\]\n\n---\n\n### 1. Solutions of \\(4x-3y=0\\)\n\n\\[\n4x=3y \\Longrightarrow x=\\frac34y .\n\\]\n\nSince \\(x,y\\) are integers, \\(y\\) must be a multiple of \\(4\\); write \\(y=4k\\) \\((k\\in\\mathbb Z)\\). \nThen \\(x=3k\\).\n\nBounds \\(-100\\le x,y\\le100\\) give \n\n\\[\n|4k|\\le100\\ \\Longrightarrow\\ |k|\\le25 .\n\\]\n\nThus \\(k\\) can be any integer from \\(-25\\) to \\(25\\) inclusive \u2013 \\(51\\) possibilities.\n\n---\n\n### 2. Solutions of \\(3x+2y=0\\)\n\n\\[\n3x=-2y \\Longrightarrow x=-\\frac{2}{3}y .\n\\]\n\nNow \\(y\\) must be a multiple of \\(3\\); write \\(y=3k\\). \nThen \\(x=-2k\\).\n\nBounds give \n\n\\[\n|3k|\\le100\\ \\Longrightarrow\\ |k|\\le\\Big\\lfloor\\frac{100}{3}\\Big\\rfloor=33 .\n\\]\n\nHence \\(k\\) can be any integer from \\(-33\\) to \\(33\\) inclusive \u2013 \\(67\\) possibilities.\n\n---\n\n### 3. Removing double\u2011counted pair\n\nBoth families contain the pair \\((0,0)\\) (when \\(k=0\\)). \nIt has been counted twice, so we subtract one.\n\n\\[\n\\text{Total solutions}=51+67-1=117 .\n\\]\n\nAll counted pairs satisfy \\(-100\\le x,y\\le100\\).\n\n\\[\n\\boxed{117}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAn isosceles trapezoid has an inscribed circle tangent to each of its four sides. The radius of the circle is 3, and the area of the trapezoid is 72. Let the parallel sides of the trapezoid have lengths $r$ and $s$, with $r \\neq s$. Find $r^{2}+s^{2}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the trapezoid have parallel sides \\(r\\) and \\(s\\) (\\(r\\neq s\\)), equal legs of length \\(L\\), height \\(h\\), and incircle radius \\(R=3\\).\n\n---\n\n### 1. Semiperimeter from the incircle\n\nFor any tangential quadrilateral,\n\\[\n\\text{Area}=R\\cdot s,\n\\]\nwhere \\(s\\) is the semiperimeter. \nGiven \\(\\text{Area}=72\\) and \\(R=3\\),\n\n\\[\ns=\\frac{72}{3}=24,\n\\qquad\\text{so } r+s+2L=2s=48. \\tag{1}\n\\]\n\n---\n\n### 2. Height of the trapezoid\n\nSince the incircle touches both parallel sides, the distance between them equals twice the radius:\n\n\\[\nh=2R=6.\n\\]\n\nThe area also equals \\(\\frac{1}{2}(r+s)h\\). Thus\n\n\\[\n72=\\frac{1}{2}(r+s)\\cdot6 \\Longrightarrow r+s=24. \\tag{2}\n\\]\n\nSubstituting (2) into (1) gives\n\n\\[\n24+2L=48\\Longrightarrow L=12. \\tag{3}\n\\]\n\n---\n\n### 3. Relating the bases and the leg\n\nIn an isosceles trapezoid the horizontal projection of each leg is \\(\\dfrac{s-r}{2}\\).\nUsing the right triangle formed by a leg, the height, and this projection:\n\n\\[\n\\left(\\frac{s-r}{2}\\right)^2+h^2=L^2.\n\\]\n\nInsert \\(h=6\\) and \\(L=12\\):\n\n\\[\n\\left(\\frac{s-r}{2}\\right)^2+36=144\n\\;\\Longrightarrow\\;\n\\frac{(s-r)^2}{4}=108\n\\;\\Longrightarrow\\;\n(s-r)^2=432.\n\\]\n\nHence\n\n\\[\ns-r=12\\sqrt3. \\tag{4}\n\\]\n\n---\n\n### 4. Solve for \\(r\\) and \\(s\\)\n\nFrom (2) and (4):\n\n\\[\n\\begin{cases}\nr+s=24,\\\\[2pt]\ns-r=12\\sqrt3,\n\\end{cases}\n\\qquad\\Longrightarrow\\qquad\ns=12+6\\sqrt3,\\;\\; r=12-6\\sqrt3.\n\\]\n\nBoth are positive and distinct, as required.\n\n---\n\n### 5. Compute \\(r^{2}+s^{2}\\)\n\n\\[\n\\begin{aligned}\nr^{2}+s^{2}&=(12-6\\sqrt3)^2+(12+6\\sqrt3)^2\\\\\n&=2\\cdot12^{2}+2\\cdot(6\\sqrt3)^{2}\\\\\n&=2\\cdot144+2\\cdot108\\\\\n&=288+216\\\\\n&=504.\n\\end{aligned}\n\\]\n\n---\n\n\\[\n\\boxed{504}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are $8!=40320$ eight-digit positive integers that use each of the digits $1,2,3,4,5,6,7,8$ exactly once. Let $N$ be the number of these integers that are divisible by 22. Find the difference between $N$ and 2025.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "For an \\(8\\)-digit number formed with the digits \\(1,2,\\dots ,8\\) each once we need\n\n* divisibility by \\(2\\) \\(\\Longrightarrow\\) the units digit is even (\\(2,4,6,8\\));\n* divisibility by \\(11\\) \\(\\Longrightarrow\\) the alternating sum of its digits is a multiple of \\(11\\).\n\n---\n\n### 1. Divisibility by \\(11\\)\n\nWrite the digits as \\(d_1d_2d_3d_4d_5d_6d_7d_8\\) ( \\(d_1\\) most significant). \n\nThe test for \\(11\\) gives \n\n\\[\n(d_1+d_3+d_5+d_7)-(d_2+d_4+d_6+d_8)\\equiv0\\pmod{11}.\n\\]\n\nLet \n\n\\[\nO=d_1+d_3+d_5+d_7,\\qquad E=d_2+d_4+d_6+d_8 .\n\\]\n\nSince all eight digits are used once, \n\n\\[\nO+E = 1+2+\\dots+8 = 36 .\n\\]\n\nThe condition \\(O-E\\equiv0\\pmod{11}\\) becomes \n\n\\[\n2O\\equiv36\\pmod{11}\\quad\\Longrightarrow\\quad O\\equiv18\\equiv7\\pmod{11}.\n\\]\n\nThe sum of four distinct digits from \\(\\{1,\\dots ,8\\}\\) lies between \\(10\\) and \\(26\\); the only value congruent to \\(7\\pmod{11}\\) in that range is \\(18\\). \nHence we must have \n\n\\[\nO=E=18.\n\\]\n\nSo the four digits placed in the odd positions must sum to \\(18\\).\n\n---\n\n### 2. Choosing the odd\u2013position digits\n\nWe need all \\(4\\)-element subsets of \\(\\{1,\\dots ,8\\}\\) whose sum is \\(18\\).\n\nListing them (in increasing order) gives\n\n\\[\n\\begin{aligned}\n&\\{1,2,7,8\\},\\; \\{1,3,6,8\\},\\; \\{1,4,5,8\\},\\; \\{1,4,6,7\\},\\\\\n&\\{2,3,5,8\\},\\; \\{2,3,6,7\\},\\; \\{2,4,5,7\\},\\; \\{3,4,5,6\\}.\n\\end{aligned}\n\\]\n\nThere are \\(8\\) such subsets. \nEach of them contains exactly two even digits (the even digits are \\(2,4,6,8\\)). Consequently the complementary set (the digits placed in even positions) also contains exactly two evens.\n\n---\n\n### 3. Forming the numbers\n\n*For a fixed subset* \\(S\\) (the odd\u2011position digits)\n\n* arrange its four digits among the odd places \\(1,3,5,7\\): \\(4!\\) ways;\n* the four remaining digits (the complement \\(T\\)) go to the even places \\(2,4,6,8\\). \n Since \\(T\\) contains two even digits, we may pick which even digit occupies the units place (position \\(8\\)) in \\(2\\) ways; the other three digits can be placed in \\(3!\\) ways.\n\nHence for each subset \\(S\\)\n\n\\[\n\\text{permutations}=4!\\times 2\\times3!=24\\times12=288 .\n\\]\n\nWith \\(8\\) possible subsets,\n\n\\[\nN=8\\times288=2304 .\n\\]\n\n(Equivalently, half of the \\(4608\\) numbers with \\(O=E=18\\) are even, giving the same result.)\n\n---\n\n### 4. Required difference\n\n\\[\nN-2025 = 2304-2025 = 279.\n\\]\n\nThus the requested difference is \n\n\\[\n\\boxed{279}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "We place \\(\\triangle ABC\\) on its circumcircle (radius\u00a01) with \n\n\\[\nA=1,\\qquad B=e^{i2C},\\qquad C=e^{i(2C+2A)} .\n\\]\n\nThe orthocenter is \n\n\\[\nH=a+b+c.\n\\]\n\nThe nine\u2011point circle is the image of the circumcircle under the homothety with centre \\(H\\) and factor \\(\\tfrac12\\); therefore for any point \\(X\\) on the nine\u2011point circle its image on the circumcircle is \n\n\\[\nX' = 2X-H .\n\\]\n\nApplying this to the six points on the nine\u2011point circle gives\n\n\\[\n\\begin{aligned}\nD&\\mapsto -a,\\\\\nE&\\mapsto -b,\\\\\nF&\\mapsto -c,\\\\\nG&\\mapsto A' ,\\qquad A' \\text{ is the second intersection of the altitude }AA_H\\text{ with the circumcircle},\\\\\nH&\\mapsto B' ,\\qquad B'=-e^{i2A},\\\\\nJ&\\mapsto C' ,\\qquad C'=-e^{-i2A}.\n\\end{aligned}\n\\]\n\nUsing \\(a=1,\\;b=e^{i2C},\\;c=e^{i(2C+2A)}\\) we obtain the central\nangles (measured from the positive \\(x\\)-axis) of the corresponding points:\n\n\\[\n\\begin{array}{c|c}\n\\text{Nine\u2011point point} & \\text{Angle on the circumcircle}\\\\ \\hline\nD & 180^\\circ\\\\\nE & 180^\\circ+2C\\\\\nF & 180^\\circ-2B\\\\\nG & 180^\\circ+2A+4C\\\\\nH & 180^\\circ+2A\\\\\nJ & 180^\\circ-2A\n\\end{array}\n\\]\n\nBecause the homothety preserves directions from the centre, the\narc length on the nine\u2011point circle equals the corresponding central\nangle on the circumcircle.\n\nHence\n\n\\[\n\\begin{aligned}\n\\widehat{DE}&=(180^\\circ+2C)-180^\\circ =2C,\\\\[2mm]\n\\widehat{HJ}&=|\\, (180^\\circ+2A)-(180^\\circ-2A)\\,|=4A,\n\\end{aligned}\n\\]\n\nand the minor arc \\(HJ\\) is \\(360^\\circ-4A\\) (since \\(4A>180^\\circ\\)).\nFinally\n\n\\[\n\\widehat{FG}=|(180^\\circ-2B)-(180^\\circ+2A+4C)|\n =2C\\qquad(\\text{mod }360^\\circ).\n\\]\n\nThus\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&=2C+2\\bigl(360^\\circ-4A\\bigr)+3\\,(2C) \\\\\n&=720^\\circ-8A+8C\\\\\n&=720^\\circ+8(C-A).\n\\end{aligned}\n\\]\n\nFor the given triangle \\(A=84^\\circ,\\;C=36^\\circ\\),\n\n\\[\n720^\\circ+8(36^\\circ-84^\\circ)=720^\\circ-384^\\circ=336^\\circ .\n\\]\n\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The function \n\n\\[\nf(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}, \\qquad x>0,\n\\]\n\nhas zeros at \\(x=18,72,98,k\\) and \\(\\displaystyle\\lim_{x\\to0^+}f(x)=+\\infty\\),\n\\(\\displaystyle\\lim_{x\\to\\infty}f(x)=+\\infty\\).\nHence the graph of \\(f\\) starts at \\(+\\infty\\), descends to a negative\nvalue, comes back to zero, rises again, etc.; it has exactly **two**\nnegative intervals:\n\\[\n(r_1,r_2),\\qquad (r_3,r_4),\n\\]\nwhere \\(\\{r_1,r_2,r_3,r_4\\}=\\{18,72,98,k\\}\\) ordered increasingly.\nIn each negative interval there is a local (and global) minimum of \\(f\\).\n\nLet \n\n\\[\ng(x)=(x-18)(x-72)(x-98)(x-k),\n\\qquad f(x)=\\frac{g(x)}{x}.\n\\]\n\nA point \\(x_0\\) where \\(f\\) has an extremum satisfies \n\n\\[\nf'(x_0)=0\\iff x_0g'(x_0)-g(x_0)=0\\iff \n\\sum_{i=1}^{4}\\frac{1}{x_0-r_i}= \\frac1{x_0}.\n\\]\n\nGeometrically, if \\(m=f(x_0)\\) then the line \\(y=m x\\) is tangent to the\nquartic graph \\(y=g(x)\\) at \\(x_0\\):\n\\[\ng(x)-mx=0\\quad\\text{has a double root at }x_0 .\n\\]\n\nIf the global minimum of \\(f\\) is attained at **two** distinct points,\nthe line \\(y=m x\\) must be tangent to \\(g\\) at two distinct points\n\\(\\alpha,\\beta\\). Hence\n\n\\[\ng(x)-mx=(x-\\alpha)^2 (x-\\beta)^2 .\n\\tag{1}\n\\]\n\nWrite \n\n\\[\n\\alpha+\\beta=p,\\qquad \\alpha\\beta =q,\\qquad m \\text{ (the slope)} .\n\\]\n\nExpanding (1) and comparing with \\(g(x)-mx=x^4-S_1x^3+S_2x^2-(S_3+m)x+S_4\\) gives \n\n\\[\n\\begin{aligned}\nS_1 &=2p,\\\\\nS_2 &=p^{2}+2q,\\\\\nS_4 &=q^{2},\\\\\nS_3+m &=2pq,\n\\end{aligned}\n\\tag{2}\n\\]\n\nwhere for our roots \n\n\\[\n\\begin{aligned}\nS_1&=18+72+98+k=188+k,\\\\\nS_2&=18\\cdot72+18\\cdot98+72\\cdot98+ (18+72+98)k\n =10116+188k,\\\\\nS_3&=18\\cdot72\\cdot98+ (18\\cdot72+18\\cdot98+72\\cdot98)k\n =127008+10116k,\\\\\nS_4&=18\\cdot72\\cdot98\\cdot k=127008\\,k .\n\\end{aligned}\n\\]\n\nFrom (2) we obtain \n\n\\[\np=\\frac{188+k}{2},\\qquad q=\\sqrt{127008\\,k}=252\\sqrt{2k}.\n\\]\n\nUsing the second equation of (2),\n\n\\[\nS_2=p^{2}+2q,\n\\]\n\ngives the condition on \\(k\\):\n\n\\[\n\\frac{(188+k)^{2}}{4}+2\\sqrt{127008k}=10116+188k .\n\\tag{3}\n\\]\n\n---\n\n### Solving (3)\n\nPut \\(k=t^{2}\\;(t>0)\\). Since \\(\\sqrt{127008k}=252\\sqrt{2}\\,t\\),\n(3) becomes\n\n\\[\nt^{4}-376t^{2}+2016\\sqrt{2}\\,t-5120=0 .\n\\]\n\nFactoring,\n\n\\[\n(t^{2}+6\\sqrt{2}\\,t-320)(t^{2}-6\\sqrt{2}\\,t+16)=0 .\n\\]\n\nHence the positive solutions for \\(t\\) are\n\n\\[\nt=10\\sqrt2,\\qquad t=4\\sqrt2,\\qquad t=2\\sqrt2 .\n\\]\n\nConsequently\n\n\\[\nk=t^{2}=200,\\;32,\\;8 .\n\\]\n\n---\n\n### Verification\n\nFor each \\(k\\) the ordered roots of \\(g\\) are\n\n\\[\n\\begin{array}{c|c}\nk & \\text{ordered roots }(r_1,r_2,r_3,r_4)\\\\ \\hline\n8 & (8,18,72,98)\\\\\n32 & (18,32,72,98)\\\\\n200& (18,72,98,200)\n\\end{array}\n\\]\n\nUsing \\(p\\) and \\(q\\) we find the tangency points \n\n\\[\n\\alpha,\\beta=\\frac{p\\pm\\sqrt{p^{2}-4q}}{2},\n\\]\n\nand they lie respectively in the intervals \\((r_1,r_2)\\) and\n\\((r_3,r_4)\\). Thus in each case the line \\(y=m x\\) is tangent to\n\\(g\\) at two points, giving exactly two distinct global minima of\n\\(f\\). No other \\(k>0\\) satisfies (3); hence these are the only three\nvalues.\n\nFinally, the required sum is\n\n\\[\n8+32+200 = 240 .\n\\]\n\n\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $k$ be real numbers such that the system $|25+20i-z|=5$ and $|z-4-k|=|z-3i-k|$ has exactly one complex solution $z$. The sum of all possible values of $k$ can be written as $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$. Here $i=\\sqrt{-1}$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nz=x+iy\\qquad (x,y\\in\\mathbb{R}).\n\\]\n\n---\n\n### 1. The first equation \u2013 a circle \n\n\\[\n|25+20i-z|=5 \\Longrightarrow (x-25)^2+(y-20)^2=5^2 .\n\\]\n\nThus the circle has centre \n\n\\[\nC=(25,20),\\qquad \\text{radius } r=5 .\n\\]\n\n---\n\n### 2. The second equation \u2013 a perpendicular bisector \n\n\\[\n|z-(4+k)|=|z-(3i+k)|\n\\]\n\nwrites as \n\n\\[\n(x-(k+4))^2+y^{2}=(x-k)^2+(y-3)^2 .\n\\]\n\nSimplifying,\n\n\\[\n-8x+6y+8k+7=0\\quad\\Longrightarrow\\quad 4x-3y-(4k+3.5)=0 .\n\\]\n\nHence the set of points satisfying the second condition is the line \n\n\\[\nL:\\;4x-3y=4k+\\frac 72 .\n\\]\n\nThis is the perpendicular bisector of the segment joining \n\\(A=(k+4,0)\\) and \\(B=(k,3)\\) (its slope is \\(4/3\\) for any \\(k\\)).\n\n---\n\n### 3. One intersection \\(\\iff\\) tangency \n\nThe system has exactly one solution precisely when the line \\(L\\) is tangent to the circle, i.e. when the distance from the centre \\(C\\) to \\(L\\) equals the radius \\(5\\).\n\nThe distance from \\((x_0,y_0)\\) to \\(Ax+By+C=0\\) is \n\n\\[\n\\frac{|Ax_0+By_0+C|}{\\sqrt{A^2+B^2}} .\n\\]\n\nFor \\(C=(25,20)\\) and \\(L: 4x-3y-(4k+3.5)=0\\),\n\n\\[\nd=\\frac{|4\\cdot25-3\\cdot20-(4k+3.5)|}{\\sqrt{4^{2}+(-3)^{2}}}\n =\\frac{|40-4k-3.5|}{5}\n =\\frac{|36.5-4k|}{5}.\n\\]\n\nSet \\(d=r=5\\):\n\n\\[\n\\frac{|36.5-4k|}{5}=5\\quad\\Longrightarrow\\quad |36.5-4k|=25 .\n\\]\n\n---\n\n### 4. Solving for \\(k\\)\n\n\\[\n\\begin{cases}\n36.5-4k=25 &\\Longrightarrow\\;4k=11.5\\;\\Longrightarrow\\;k=\\dfrac{23}{8},\\\\[4pt]\n36.5-4k=-25 &\\Longrightarrow\\;4k=61.5\\;\\Longrightarrow\\;k=\\dfrac{123}{8}.\n\\end{cases}\n\\]\n\nThus the possible real values of \\(k\\) are \n\n\\[\nk_1=\\frac{23}{8},\\qquad k_2=\\frac{123}{8}.\n\\]\n\nBoth give a line tangent to the circle, so each yields exactly one solution \\(z\\).\n\n---\n\n### 5. Sum of the possible \\(k\\)\u2019s \n\n\\[\nk_1+k_2=\\frac{23+123}{8}=\\frac{146}{8}=\\frac{73}{4}.\n\\]\n\nWrite \\(\\frac{73}{4}\\) as \\(\\dfrac{m}{n}\\) with \\(\\gcd(m,n)=1\\); here \\(m=73,\\ n=4\\).\n\n\\[\nm+n=73+4=77.\n\\]\n\n\\[\n\\boxed{77}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1. Write the recurrence for the numerators and denominators**\n\nLet \n\n\\[\nx_k=\\frac{a_k}{b_k}\\qquad (a_k,b_k\\in \\mathbb Z ,\\; \\gcd(a_k,b_k)=1).\n\\]\n\nFrom \n\n\\[\nx_{k+1}= \\frac{1}{3}\\Bigl(x_k+\\frac1{x_k}-1\\Bigr)=\\frac{x_k^2-x_k+1}{3x_k},\n\\]\n\nwe obtain \n\n\\[\na_{k+1}=a_k^2-a_kb_k+b_k^2,\\qquad \nb_{k+1}=3a_kb_k, \\tag{1}\n\\]\n\nwith \\(a_1=25,\\;b_1=11\\).\n\n--------------------------------------------------------------------\n\n**Step 2. The common factor \\(3^{e_k}\\)** \n\nWrite \n\n\\[\na_k=3^{e_k}A_k,\\qquad b_k=3^{e_k}B_k,\\qquad \\gcd(A_k,B_k)=1 .\n\\]\n\nDividing (1) by the highest possible power of \\(3\\) shows that\n\\(e_{k+1}=2e_k+1\\) and that the reduced pair \\((A_k,B_k)\\) always satisfies \n\n\\[\nA_k\\equiv1\\pmod3,\\qquad B_k\\equiv2\\pmod3 .\n\\]\n\nWith \\(e_1=0\\) we get \n\n\\[\ne_k=2^{\\,k-1}-1 .\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 3. A very simple recurrence for the sum**\n\nLet \n\n\\[\nS_k=a_k+b_k .\n\\]\n\nFrom (1)\n\n\\[\n\\begin{aligned}\nS_{k+1}&=a_{k+1}+b_{k+1}\n =(a_k^2-a_kb_k+b_k^2)+3a_kb_k \\\\\n &=a_k^2+b_k^2+2a_kb_k=(a_k+b_k)^2=S_k^{\\,2}.\n\\end{aligned}\n\\]\n\nHence \n\n\\[\nS_k=S_1^{\\,2^{\\,k-1}}=36^{\\,2^{\\,k-1}}. \\tag{3}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4. The reduced numerator and denominator**\n\nSince the common factor is \\(3^{e_k}\\),\n\n\\[\n\\frac{a_k}{b_k}= \\frac{A_k}{B_k},\\qquad \nm=A_k,\\; n=B_k .\n\\]\n\nThus \n\n\\[\nm+n=\\frac{a_k+b_k}{3^{e_k}}\n =\\frac{36^{\\,2^{\\,k-1}}}{3^{\\,2^{\\,k-1}-1}}\n =2^{\\,2^{\\,k}}\\;3^{\\,2^{\\,k-1}+1}. \\tag{4}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5. Apply \\(k=2025\\)** \n\nFrom (4),\n\n\\[\nm+n=2^{\\,2^{2025}}\\;3^{\\,2^{2024}+1}.\n\\]\n\nWe need this number modulo \\(1000\\).\n\n--------------------------------------------------------------------\n\n**Step 6. Reduce modulo \\(8\\) and \\(125\\)** \n\n*Modulo \\(8\\):* \\(2^{\\ge3}\\equiv0\\pmod8\\); therefore \n\n\\[\nm+n\\equiv0\\pmod8. \\tag{5}\n\\]\n\n*Modulo \\(125\\):* Because \\(\\phi(125)=100\\),\n\n\\[\n2^{2^{2025}}\\equiv 2^{\\,2^{2025}\\bmod100},\n\\qquad\n3^{2^{2024}+1}\\equiv 3^{\\,(2^{2024}+1)\\bmod100}\\pmod{125}.\n\\]\n\nCompute the exponents.\n\n- \\(2^{2025}\\bmod100\\): \n \\(2^{2025}\\equiv32\\pmod{100}\\) (by CRT: \\(2^{2025}\\equiv0\\pmod4\\), \\(2^{2025}\\equiv7\\pmod{25}\\)).\n- \\(2^{2024}\\bmod100\\): \n \\(2^{2024}\\equiv16\\pmod{100}\\).\n\nHence \n\n\\[\n2^{2^{2025}}\\equiv2^{32}\\equiv46\\pmod{125},\n\\qquad\n3^{2^{2024}+1}\\equiv3^{17}\\equiv38\\pmod{125}.\n\\]\n\nTherefore \n\n\\[\nm+n\\equiv46\\cdot38\\equiv123\\pmod{125}. \\tag{6}\n\\]\n\n--------------------------------------------------------------------\n\n**Step 7. Chinese Remainder Theorem**\n\nFind \\(N\\) such that \n\n\\[\nN\\equiv0\\pmod8,\\qquad N\\equiv123\\pmod{125}.\n\\]\n\nWrite \\(N=8k\\). Then \\(8k\\equiv123\\pmod{125}\\), i.e. \n\n\\[\nk\\equiv123\\cdot8^{-1}\\pmod{125}.\n\\]\n\nSince \\(8^{-1}\\equiv47\\pmod{125}\\), \n\n\\[\nk\\equiv123\\cdot47\\equiv31\\pmod{125}.\n\\]\n\nThus \\(k=31+125t\\) and \n\n\\[\nN=8k=8\\cdot31=248\\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\n**Answer**\n\n\\[\n\\boxed{248}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe twelve letters $A,B,C,D,E,F,G,H,I,J,K$, and $L$ are randomly grouped into six pairs of letters. The two letters in each pair are placed next to each other in alphabetical order to form six two-letter words, and those six words are listed alphabetically. For example, a possible result is $AB,CJ,DG,EK,FL,HI$. The probability that the last word listed contains $G$ is $\\frac{m}{n}$, where $m$ and $n$ are relatively prime positive integers. Find $m+n$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nAG\\)\n\nNow the word is \\(GX\\) and its first letter is \\(G\\).\nFor it to be maximal, **no other pair may have a first letter larger\nthan \\(G\\)**; i.e. no remaining pair may consist of two letters both\ngreater than \\(G\\).\n\nAfter fixing the pair \\(\\{G,X\\}\\) (with \\(X\\in\\{H,I,J,K,L\\}\\)), the\nremaining letters are\n\n* the six letters \\(\\{A,B,C,D,E,F\\}\\) (all \\(G\\)).\n\nThus each of those four \u201clarge\u2019\u2019 letters must be paired with a distinct\nsmall letter, leaving two small letters to pair together.\n\nNumber of valid matchings:\n\n\\[\n\\binom{6}{4}\\cdot4!\\cdot1=15\\cdot24=360 .\n\\]\n\nAgain the total number of matchings of the ten remaining letters is\n\\(945\\). Therefore\n\n\\[\n\\Pr(\\text{maximal}\\mid G\\text{\u2013}X)=\\frac{360}{945}=\\frac{8}{21}\n\\qquad (X=H,I,J,K,L).\n\\]\n\n--------------------------------------------------------------------\n### 4. Assemble the probability\n\n\\[\n\\begin{aligned}\nP&=\\frac1{11}\\Bigl(\\frac{8}{63}\n+5\\cdot\\frac{8}{21}\\Bigr) \\\\\n &=\\frac1{11}\\Bigl(\\frac{8}{63}+\\frac{40}{21}\\Bigr)\n =\\frac1{11}\\Bigl(\\frac{8+120}{63}\\Bigr)\n =\\frac{128}{693}.\n\\end{aligned}\n\\]\n\nThe fraction \\(\\displaystyle\\frac{128}{693}\\) is already in lowest\nterms. Hence \\(m=128,\\;n=693\\) and\n\n\\[\nm+n = 128+693 = 821 .\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{821}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nS(t)=\\sum_{a=1}^{3^{6}}\\exp\\!\\Big(2\\pi i\\,\\frac{t a^{3}}{3^{7}}\\Big) \\qquad(0\\le t<3^{7})\n\\]\n\nand denote \n\n\\[\nN=\\#\\{(a,b,c)\\mid 1\\le a,b,c\\le 3^{6},\n\\ a^{3}+b^{3}+c^{3}\\equiv 0\\pmod{3^{7}}\\}.\n\\]\n\nFor any modulus \\(m\\),\n\n\\[\n\\#\\{(x,y,z):x+y+z\\equiv0\\pmod m\\}=\n\\frac1m\\sum_{t=0}^{m-1}\\Bigl(\\sum_{x}e^{2\\pi i t x/m}\\Bigr)^3 .\n\\]\n\nHence \n\n\\[\nN=\\frac1{3^{7}}\\sum_{t=0}^{3^{7}-1} S(t)^{3}. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Splitting the summation\n\nWrite each \\(a\\) as \\(a=3^{v}u\\) where \\(v=v_{3}(a)\\) and \\(u\\) is not\ndivisible by \\(3\\). \nFor \\(0\\le v\\le 2\\) define \n\n\\[\nU_{v}=\\{\\,u:1\\le u\\le 3^{6-v},\\;3\\nmid u\\,\\},\n\\qquad |U_{0}|=486,\\ |U_{1}|=162,\\ |U_{2}|=54 .\n\\]\n\nIf \\(v\\ge3\\) then \\(a^{3}\\equiv0\\pmod{3^{7}}\\); there are \n\\(n_{3}=27\\) such numbers.\nThus\n\n\\[\nS(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+n_{3},\n\\]\nwhere \n\n\\[\n\\begin{aligned}\nf_{0}(t)&=\\sum_{x\\in U_{0}}\\zeta^{t x^{3}},\\\\[2mm]\nf_{1}(t)&=\\sum_{x\\in U_{1}}\\zeta^{t\\,27x^{3}},\\\\[2mm]\nf_{2}(t)&=\\sum_{x\\in U_{2}}\\zeta^{t\\,729x^{3}},\n\\end{aligned}\n\\qquad \n\\zeta=e^{2\\pi i/3^{7}} .\n\\]\n\n--------------------------------------------------------------------\n### 2. Evaluating \\(f_{0},f_{1},f_{2}\\)\n\n*For \\(f_{0}\\).* \nLet \\(G_{7}=(\\mathbb Z/3^{7}\\mathbb Z)^{\\times}\\) (\\(|G_{7}|=1458\\)).\nThe map \\(x\\mapsto x^{3}\\) from \\(G_{7}\\) onto the set of cubes\n\\(C_{6}\\) has kernel of size \\(3\\); consequently\n\n\\[\n\\sum_{x\\in G_{7}}\\zeta^{t x}=3\\sum_{r\\in C_{6}}\\zeta^{t r}=3f_{0}(t).\n\\]\n\nFor \\(t\\neq0\\) one has \n\n\\[\n\\sum_{x\\in G_{7}}\\zeta^{t x}= -\\!\\!\\sum_{\\substack{x\\;(\\bmod 3^{7})\\\\3\\mid x}}\\!\\!\\zeta^{t x}\n=\\begin{cases}\n-729,&v_{3}(t)=6,\\\\\n0,&0\\le v_{3}(t)\\le5 .\n\\end{cases}\n\\]\n\nHence \n\n\\[\nf_{0}(t)=\n\\begin{cases}\n486,&t=0,\\\\[2mm]\n-243,&v_{3}(t)=6,\\\\[2mm]\n0,&\\text{otherwise.}\n\\end{cases}\n\\tag{2}\n\\]\n\n*For \\(f_{1}\\).* \nWriting each \\(x\\in U_{1}\\) as \\(x=v+81k\\;(k=0,1,2)\\) one finds\n\\(x^{3}\\equiv v^{3}\\pmod{81}\\). Consequently \n\n\\[\nf_{1}(t)=3\\!\\!\\sum_{\\substack{v\\in(\\mathbb Z/81)^{\\times}}}\\!\n\\exp\\!\\Big(2\\pi i\\,\\frac{t v^{3}}{81}\\Big).\n\\]\n\nUsing again that the cube map on \\((\\mathbb Z/81)^{\\times}\\) has kernel\nsize \\(3\\),\n\n\\[\nf_{1}(t)=3\\!\\cdot\\!3\\!\\!\\sum_{r\\in C_{1}}\\!\n\\exp\\!\\Big(2\\pi i\\,\\frac{t r}{81}\\Big) ,\n\\]\n\nwhere \\(C_{1}\\) is the set of cube\u2011residues modulo \\(81\\) (\\(|C_{1}|=18\\)).\nNow\n\n\\[\n\\sum_{x\\in(\\mathbb Z/81)^{\\times}}\\exp\\!\\Big(2\\pi i\\,\n\\frac{t x}{81}\\Big)=\n\\begin{cases}\n54,&v_{3}(t)\\ge4,\\\\[1mm]\n-27,&v_{3}(t)=3,\\\\[1mm]\n0,&v_{3}(t)\\le2 .\n\\end{cases}\n\\]\n\nThus\n\n\\[\nf_{1}(t)=\n\\begin{cases}\n162,&v_{3}(t)\\ge4,\\\\[2mm]\n-81,&v_{3}(t)=3,\\\\[2mm]\n0,&v_{3}(t)\\le2 .\n\\end{cases}\n\\tag{3}\n\\]\n\n*For \\(f_{2}\\).* \nHere \\(x^{3}\\equiv x\\pmod 3\\), and among the \\(54\\) numbers in \\(U_{2}\\)\nexactly half are \\(\\equiv1\\pmod3\\) and half \\(\\equiv2\\pmod3\\). Hence \n\n\\[\nf_{2}(t)=27\\bigl(\\zeta^{t}+ \\zeta^{2t}\\bigr)=\n\\begin{cases}\n-27,&v_{3}(t)=0,\\\\[2mm]\n54,&v_{3}(t)\\ge1 .\n\\end{cases}\n\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 3. The values of \\(S(t)\\)\n\nFrom (2)\u2013(4) (and remembering the constant term \\(n_{3}=27\\))\n\n\\[\nS(t)=f_{0}(t)+f_{1}(t)+f_{2}(t)+27=\n\\begin{array}{c|c}\nv_{3}(t) & S(t)\\\\ \\hline\n\\infty\\;(t=0) & 729\\\\\n0 & 0\\\\\n1 & 81\\\\\n2 & 81\\\\\n3 & 0\\\\\n4 & 243\\\\\n5 & 243\\\\\n6 & 0\n\\end{array}\n\\]\n\n--------------------------------------------------------------------\n### 4. Computing \\(N\\)\n\nOnly the classes with non\u2011zero \\(S(t)\\) contribute to (1). \nThe numbers of \\(t\\) in each class are\n\n\\[\n\\begin{array}{c|c}\nv_{3}(t) & \\#t\\\\ \\hline\n\\infty & 1\\\\\n0 & 1458\\\\\n1 & 486\\\\\n2 & 162\\\\\n3 & 54\\\\\n4 & 18\\\\\n5 & 6\\\\\n6 & 2\n\\end{array}\n\\]\n\nHence\n\n\\[\n\\begin{aligned}\nN&=\\frac1{3^{7}}\\Bigl( 729^{3}\n+ (486+162) \\,81^{3}\n+ (18+6)\\,243^{3}\\Bigr)\\\\[2mm]\n&=\\frac1{3^{7}}\\Bigl(3^{18}+648\\cdot3^{12}+24\\cdot3^{15}\\Bigr)\\\\\n&=3^{5}\\cdot2025 = 243\\cdot2025 = 492\\,075 .\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n### 5. Remainder modulo \\(1000\\)\n\n\\[\n492\\,075 \\equiv 75 \\pmod{1000}.\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{75}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nOn $\\triangle ABC$ points $A,D,E$, and $B$ lie that order on side $\\overline{AB}$ with $AD=4, DE=16$, and $EB=8$. Points $A,F,G$, and $C$ lie in that order on side $\\overline{AC}$ with $AF=13, FG=52$, and $GC=26$. Let $M$ be the reflection of $D$ through $F$, and let $N$ be the reflection of $G$ through $E$. Quadrilateral $DEGF$ has area 288. Find the area of heptagon $AFNBCEM$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Overview**\n\nThe given lengths on the sides of \\(\\triangle ABC\\) give \n\n\\[\nAD=4,\\;DE=16,\\;EB=8 \\qquad\\Longrightarrow\\qquad AB=28,\n\\]\n\\[\nAF=13,\\;FG=52,\\;GC=26 \\qquad\\Longrightarrow\\qquad AC=91 .\n\\]\n\n--------------------------------------------------------------------\n\n### 1. Two lines parallel to \\(BC\\)\n\n\\[\n\\frac{AD}{AB}= \\frac{4}{28}= \\frac{1}{7},\\qquad \n\\frac{AF}{AC}= \\frac{13}{91}= \\frac{1}{7}.\n\\]\n\nHence the points \\(D\\in AB\\) and \\(F\\in AC\\) divide the two sides in the same\nratio; therefore \\(DF\\parallel BC\\).\n\nSimilarly \n\n\\[\n\\frac{AE}{AB}= \\frac{AD+DE}{AB}= \\frac{20}{28}= \\frac57,\n\\qquad \n\\frac{AG}{AC}= \\frac{AF+FG}{AC}= \\frac{65}{91}= \\frac57,\n\\]\n\nso \\(E\\in AB,\\;G\\in AC\\) also give a line parallel to \\(BC\\); i.e. \\(EG\\parallel BC\\).\n\nThus the quadrilateral \\(DEGF\\) is bounded by two parallel sides \\(DF,EG\\) and\nthe two segments of the sides of the triangle, and it is the region between the\ntwo similar triangles \\(ADF\\) and \\(AEG\\).\n\n--------------------------------------------------------------------\n\n### 2. Area of \\(\\triangle ABC\\)\n\nIf \\([XYZ]\\) denotes area, similarity gives \n\n\\[\n[ADF]=\\Bigl(\\frac{AD}{AB}\\Bigr)^2[ABC]=\\Bigl(\\frac17\\Bigr)^2[ABC]=\\frac{[ABC]}{49},\n\\]\n\n\\[\n[AEG]=\\Bigl(\\frac{AE}{AB}\\Bigr)\\Bigl(\\frac{AG}{AC}\\Bigr)[ABC]\n =\\frac57\\cdot\\frac57[ABC]=\\frac{25}{49}[ABC].\n\\]\n\nHence \n\n\\[\n[DEGF]=[AEG]-[ADF]=\\Bigl(\\frac{25}{49}-\\frac1{49}\\Bigr)[ABC]\n =\\frac{24}{49}[ABC].\n\\]\n\nGiven \\([DEGF]=288\\),\n\n\\[\n\\frac{24}{49}[ABC]=288\\quad\\Longrightarrow\\quad[ABC]=288\\cdot\\frac{49}{24}\n =12\\cdot49=588.\n\\]\n\n--------------------------------------------------------------------\n\n### 3. Area of the heptagon \\(AFNBCEM\\)\n\nPlace the triangle with \\(A=(0,0),\\;B=(28,0)\\) and\n\\(C=(91\\cos\\theta,\\,91\\sin\\theta)\\).\nBecause \\([ABC]=\\tfrac12\\cdot28\\cdot91\\sin\\theta\\),\n\n\\[\n\\sin\\theta=\\frac{[ABC]}{1274}= \\frac{588}{1274}= \\frac{6}{13}.\n\\]\n\nThus \n\n\\[\n\\cos\\theta=\\frac{\\sqrt{1-\\sin^2\\theta}}{\\,}= \\frac{\\sqrt{133}}{13}.\n\\]\n\nThe coordinates of the relevant points are\n\n\\[\n\\begin{aligned}\n&F=(13\\cos\\theta,13\\sin\\theta)=(\\sqrt{133},6), \\\\\n&G=(65\\cos\\theta,65\\sin\\theta)=(5\\sqrt{133},30),\\\\\n&D=(4,0),\\qquad\nE=(20,0),\\\\\n&M=2F-D=(2\\sqrt{133}-4,12),\\\\\n&N=2E-G=(40-5\\sqrt{133},-30).\n\\end{aligned}\n\\]\n\nUsing the shoelace formula for the polygon\n\\(A\\,(0,0),\\;F,\\;N,\\;B,\\;C,\\;E,\\;M\\) we obtain\n\n\\[\n\\begin{aligned}\n\\sum (x_i y_{i+1}-y_i x_{i+1})\n&= -240+840+1176-840+240 = 1176,\\\\[2mm]\n\\text{Area}&=\\frac12\\cdot1176=588.\n\\end{aligned}\n\\]\n\nThus the heptagon \\(AFNBCEM\\) has the same area as \\(\\triangle ABC\\).\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{588}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe parabola with equation $y=x^{2}-4$ is rotated $60^{\\circ}$ counterclockwise around the origin. The unique point in the fourth quadrant where the original parabola and its image intersect has $y$-coordinate $\\frac{a-\\sqrt{b}}{c}$, where $a$, $b$, and $c$ are positive integers, and $a$ and $c$ are relatively prime. Find $a+b+c$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nP:\\; y=x^{2}-4\n\\]\n\nand rotate \\(P\\) about the origin \\(60^{\\circ}\\) counter\u2011clockwise. \nIf \\((x,y)\\) is a point of \\(P\\) then its image \\((X,Y)\\) satisfies \n\n\\[\n\\begin{pmatrix}X\\\\Y\\end{pmatrix}= \n\\begin{pmatrix}\\cos 60^\\circ & -\\sin 60^\\circ\\\\[2pt] \n\\sin 60^\\circ & \\ \\cos 60^\\circ\\end{pmatrix}\n\\begin{pmatrix}x\\\\y\\end{pmatrix},\n\\qquad \n\\cos60^\\circ=\\frac12,\\;\\sin60^\\circ=\\frac{\\sqrt3}{2}.\n\\]\n\nHence \n\n\\[\nX=\\frac{x}{2}-\\frac{\\sqrt3}{2}y,\\qquad\nY=\\frac{\\sqrt3}{2}x+\\frac{y}{2}.\n\\]\n\nTo obtain the equation of the rotated curve in the original \\((x,y)\\)\u2013coordinates,\nsolve for \\((x,y)\\) in terms of \\((X,Y)\\) (rotate back by \\(-60^\\circ\\)):\n\n\\[\nx = \\frac{X}{2}+\\frac{\\sqrt3}{2}Y,\\qquad\ny = -\\frac{\\sqrt3}{2}X+\\frac{Y}{2}.\n\\]\n\nSince the original points satisfy \\(y=x^{2}-4\\), substituting the expressions above gives the equation of the image:\n\n\\[\nx^{2}+2\\sqrt3\\,xy+3y^{2}+2\\sqrt3\\,x-2y-16=0. \\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### Intersection with the original parabola\n\nThe intersection points satisfy simultaneously \n\n\\[\ny=x^{2}-4\\qquad\\text{and}\\qquad (1).\n\\]\n\nSubstituting \\(y=x^{2}-4\\) into (1) yields\n\n\\[\n3x^{4}-25x^{2}+40+2\\sqrt3\\,x^{3}-6\\sqrt3\\,x=0.\n\\]\n\nFactor this quartic in the field \\(\\mathbb{Q}(\\sqrt3)\\):\n\n\\[\n\\begin{aligned}\n3x^{4}-25x^{2}+40+2\\sqrt3\\,x^{3}-6\\sqrt3\\,x\n&=(x^{2}+\\sqrt3\\,x-4)\\bigl(3x^{2}-\\sqrt3\\,x-10\\bigr).\n\\end{aligned}\n\\]\n\nThus the intersection points satisfy one of \n\n\\[\n\\begin{cases}\nx^{2}+\\sqrt3\\,x-4=0,\\\\[2pt]\n\\text{or}\\\\[2pt]\n3x^{2}-\\sqrt3\\,x-10=0 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### Selecting the point in the fourth quadrant\n\n*From* \\(x^{2}+\\sqrt3\\,x-4=0\\)\n\n\\[\nx=\\frac{-\\sqrt3\\pm\\sqrt{19}}{2}.\n\\]\n\nThe root \\(\\displaystyle x=\\frac{-\\sqrt3+\\sqrt{19}}{2}>0\\) gives \n\n\\[\ny=x^{2}-4=\\frac{11-\\sqrt{57}}{2}-4=\\frac{3-\\sqrt{57}}{2}<0,\n\\]\n\nso \\((x,y)\\) lies in the fourth quadrant.\n\n*From* \\(3x^{2}-\\sqrt3\\,x-10=0\\)\n\n\\[\nx=\\frac{\\sqrt3\\pm\\sqrt{123}}{6},\n\\]\n\nwhich yields either \\(y>0\\) (first root) or \\(x<0\\) (second root); neither point is in the fourth quadrant.\n\nHence the unique fourth\u2011quadrant intersection point is \n\n\\[\n\\Bigl(\\frac{-\\sqrt3+\\sqrt{19}}{2}\\,,\\; \\frac{3-\\sqrt{57}}{2}\\Bigr).\n\\]\n\n--------------------------------------------------------------------\n### Required \\(y\\)-coordinate\n\nThe \\(y\\)-coordinate is \\(\\displaystyle \\frac{3-\\sqrt{57}}{2}\\).\n\nWrite it as \\(\\frac{a-\\sqrt{b}}{c}\\) with \\(a,b,c\\) positive integers and \\(\\gcd(a,c)=1\\):\n\\[\na=3,\\qquad b=57,\\qquad c=2.\n\\]\n\nTherefore \n\n\\[\na+b+c = 3+57+2 = 62.\n\\]\n\n\\[\n\\boxed{62}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSix points $ A, B, C, D, E, $ and $ F $ lie in a straight line in that order. Suppose that $ G $ is a point not on the line and that $ AC = 26 $, $ BD = 22 $, $ CE = 31 $, $ DF = 33 $, $ AF = 73 $, $ CG = 40 $, and $ DG = 30 $. Find the area of $ \\triangle BGE $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let the line containing \\(A,B,C,D,E,F\\) be the \\(x\\)-axis.\n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(c,0),\\qquad D=(d,0),\\qquad \nE=(e,0),\\qquad F=(f,0)\n\\]\n\nBecause the points are in the order \\(A,B,C,D,E,F\\),\n\n\\[\nc-b=AC-AB,\\; d-b=BD,\\; e-c=CE,\\; f-d=DF,\\; f-0=AF.\n\\]\n\nTake \\(A\\) at the origin. From the data\n\n\\[\nAC=26\\implies c=26,\n\\]\n\\[\nBD=22\\implies d=b+22,\n\\]\n\\[\nCE=31\\implies e=c+31=57,\n\\]\n\\[\nDF=33\\implies f=d+33=b+55,\n\\]\n\\[\nAF=73\\implies f=73.\n\\]\n\nHence \\(b+55=73\\Rightarrow b=18\\). \nThus the coordinates are \n\n\\[\nB=(18,0),\\; C=(26,0),\\; D=(40,0),\\; E=(57,0),\\; F=(73,0).\n\\]\n\n---\n\n### Locate \\(G\\)\n\n\\(G\\) is off the line and satisfies \n\n\\[\nCG=40,\\qquad DG=30.\n\\]\n\nLet \\(G=(x,y)\\) with \\(y\\neq0\\). Then \n\n\\[\n(x-26)^2+y^{2}=40^{2}=1600,\\tag{1}\n\\]\n\\[\n(x-40)^2+y^{2}=30^{2}=900.\\tag{2}\n\\]\n\nSubtract (2) from (1):\n\n\\[\n(x-26)^2-(x-40)^2=700.\n\\]\n\nExpanding,\n\n\\[\n[x^{2}-52x+676]-[x^{2}-80x+1600]=28x-924=700,\n\\]\n\\[\n28x=1624\\quad\\Longrightarrow\\quad x=58.\n\\]\n\nPlugging \\(x=58\\) into (2):\n\n\\[\n(58-40)^{2}+y^{2}=900\\;\\Longrightarrow\\;18^{2}+y^{2}=900\n\\]\n\\[\ny^{2}=576\\;\\Longrightarrow\\;|y|=24.\n\\]\n\nSo \\(G=(58,\\,24)\\) (the point \\((58,-24)\\) gives the same area).\n\n---\n\n### Area of \\(\\triangle BGE\\)\n\nPoints \\(B\\) and \\(E\\) lie on the \\(x\\)-axis, so the base \\(BE\\) has length\n\n\\[\nBE = e-b = 57-18 = 39.\n\\]\n\nThe altitude from \\(G\\) to the line \\(BE\\) (the \\(x\\)-axis) is \\(|y| = 24\\).\n\nHence \n\n\\[\n\\text{Area} = \\frac12 \\times BE \\times \\text{height}\n= \\frac12 \\times 39 \\times 24 = 468.\n\\]\n\n\\[\n\\boxed{468}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nFind the sum of all positive integers $ n $ such that $ n + 2 $ divides the product $ 3(n + 3)(n^2 + 9) $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "We need the positive integers \\(n\\) such that \n\n\\[\nn+2\\mid 3(n+3)(n^{2}+9).\n\\]\n\n---\n\n### 1. Replace \\(n+2\\) by a new variable \n\nLet \n\n\\[\nk=n+2\\qquad (k\\ge 3), \\qquad n=k-2 .\n\\]\n\nThen \n\n\\[\n\\begin{aligned}\nn+3 &= (k-2)+3 = k+1,\\\\[2pt]\nn^{2}+9 &= (k-2)^{2}+9 = k^{2}-4k+13 .\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n3(n+3)(n^{2}+9)=3(k+1)(k^{2}-4k+13).\n\\]\n\nThe condition becomes \n\n\\[\nk \\mid 3(k+1)(k^{2}-4k+13).\n\\]\n\n---\n\n### 2. Reduce modulo \\(k\\)\n\nModulo \\(k\\),\n\n\\[\nk+1\\equiv 1,\\qquad k^{2}-4k+13\\equiv 13,\n\\]\n\nbecause \\(k\\equiv 0\\) gives \\(k^{2}\\equiv 0\\) and \\(-4k\\equiv 0\\).\n\nThus \n\n\\[\n3(k+1)(k^{2}-4k+13)\\equiv 3\\cdot 1\\cdot 13=39 \\pmod{k}.\n\\]\n\nHence the divisibility condition is equivalent to \n\n\\[\nk\\mid 39.\n\\]\n\n---\n\n### 3. Find admissible \\(k\\) and corresponding \\(n\\)\n\nThe positive divisors of \\(39\\) are \\(1,3,13,39\\).\nSince \\(k=n+2\\ge 3\\), we keep \n\n\\[\nk\\in \\{3,13,39\\}.\n\\]\n\nTherefore \n\n\\[\nn=k-2\\in\\{1,11,37\\}.\n\\]\n\nAll three values satisfy the original condition (a quick check confirms the division).\n\n---\n\n### 4. Sum of all such \\(n\\)\n\n\\[\n1+11+37 = 49.\n\\]\n\n\\[\n\\boxed{49}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThe set of points in 3-dimensional coordinate space that lie in the plane $x+y+z=75$ whose coordinates satisfy the inequalities $x-yz0,\\qquad (75-x-2y)(1+x)>0 .\n\\tag{1}\n\\]\n\nDefine in the \\(xy\\)-plane the lines \n\n\\[\n\\begin{aligned}\nL_1 &: y=x,\\\\\nL_2 &: x+y=76,\\\\\nL_3 &: x=-1,\\\\\nL_4 &: x+2y=75\\;(y=(75-x)/2).\n\\end{aligned}\n\\]\n\nFrom (1) we obtain two possibilities for each product, giving four possible\nintersections of half\u2011planes. One of these intersections is empty; the other three\nare convex. The region for which both products in (1) are **positive** is\n\n\\[\n\\begin{cases}\ny>x,\\\\\nx+y<76,\\\\\ny<(75-x)/2,\\\\\nx>-1,\n\\end{cases}\n\\]\n\nwhich in the \\(xy\\)-plane is the interior of the triangle with vertices\n\n\\[\nA(-1,-1),\\qquad B(-1,38),\\qquad C(25,25).\n\\]\n\nThe other two regions are unbounded. Hence the finite region is this triangle.\n\n---\n\n### Area in the \\(xy\\)-plane\n\n\\[\n\\text{Area}_{xy}= \\frac12\\bigl|AB\\times AC\\bigr|\n =\\frac12\\bigl| (0,39)\\times (26,26)\\bigr|\n =\\frac12\\cdot1014 = 507 .\n\\]\n\n---\n\n### Area on the plane \\(x+y+z=75\\)\n\nThe plane is given by \\(z=75-x-y\\). Its area element satisfies \n\n\\[\ndS = \\sqrt{1+(\\partial_xz)^2+(\\partial_yz)^2}\\;dx\\,dy\n =\\sqrt{1+1+1}\\;dx\\,dy =\\sqrt3\\,dx\\,dy .\n\\]\n\nHence \n\n\\[\n\\text{Area}_{\\text{plane}} = \\sqrt3\\;\\text{Area}_{xy}\n = 507\\sqrt3 .\n\\]\n\nSo the area can be written as \\(a\\sqrt b\\) with \\(a=507,\\ b=3\\).\nTherefore \n\n\\[\na+b = 507+3 = 510 .\n\\]\n\n\\[\n\\boxed{510}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nA piecewise linear periodic function is defined by $f(x)=\\begin{cases}x&\\text{if }x\\in[-1,1)\\\\2-x&\\text{if }x\\in[1,3)\\end{cases}$ and $f(x+4)=f(x)$ for all real numbers $x$. The graph of $f(x)$ has the sawtooth pattern. The parabola $x=34y^2$ intersects the graph of $f(x)$ at finitely many points. The sum of the $y$-coordinates of these intersection points can be expressed in the form $\\frac{a+b\\sqrt{c}}{d}$, where $a,b,c,$ and $d$ are positive integers, $a,b,$ and $d$ have greatest common divisor equal to 1, and $c$ is not divisible by the square of any prime. Find $a+b+c+d$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The intersection points satisfy \n\n\\[\ny=f(x),\\qquad x=34y^{2}\\;( \\ge 0).\n\\]\n\nBecause \\(f\\) has period \\(4\\),\n\n\\[\nf(x)=\\begin{cases}\nx-4k ,&x\\in[-1+4k,\\,1+4k),\\\\[2mm]\n2+4k-x ,&x\\in[1+4k,\\,3+4k),\n\\end{cases}\\qquad k\\in\\mathbb Z .\n\\]\n\n--------------------------------------------------------------------\n### 1. Equations for the two linear pieces \n\n*Ascending piece* \\((x-4k)\\): \n\n\\[\ny=x-4k,\\qquad x=34y^{2}\n\\Longrightarrow 34y^{2}-y-4k=0. \\tag{1}\n\\]\n\n*Descending piece* \\((2+4k-x)\\): \n\n\\[\ny=2+4k-x,\\qquad x=34y^{2}\n\\Longrightarrow 34y^{2}+y-(2+4k)=0. \\tag{2}\n\\]\n\nBoth are quadratics in \\(y\\); each can give at most two real roots.\n\n--------------------------------------------------------------------\n### 2. Which integers \\(k\\) give admissible roots?\n\nBecause \\(|y|\\le 1\\) (the range of \\(f\\)), the roots must lie in \\([-1,1]\\).\n\n*For (1):* \nThe sum of the two roots equals \\(\\frac{1}{34}\\); the product is \\(-\\frac{4k}{34}\\). \nThe discriminant must be non\u2011negative:\n\n\\[\n\\Delta_1=1+544k\\ge 0\\Longrightarrow k\\ge0 .\n\\]\n\nFor a root to be in \\([-1,1)\\) we also need \n\n\\[\n-1\\le\\frac{1\\pm\\sqrt{1+544k}}{68}<1 .\n\\]\n\nThe last inequality forces \\(k\\le8\\). Hence (1) yields real admissible roots for \n\n\\[\nk=0,1,\\dots ,8 .\n\\]\n\nBoth roots are in \\([-1,1)\\) for each of these values.\n\n*For (2):* \n\\[\n\\Delta_2=273+544k\\ge0\\Longrightarrow k\\ge0 .\n\\]\n\nThe condition \\(-10\\). Then \\(s=20-9t\\) and\n\n\\[\nt^{2}=s^{2}-20=(20-9t)^{2}-20.\n\\]\n\nSolving,\n\n\\[\nt^{2}=380-360t+81t^{2}\n\\Longrightarrow 80t^{2}-360t+380=0\n\\Longrightarrow 4t^{2}-18t+19=0.\n\\]\n\nHence \n\n\\[\nt=\\frac{18\\pm\\sqrt{324-304}}{8}\n =\\frac{18\\pm2\\sqrt5}{8}\n =\\frac{9\\pm\\sqrt5}{4}.\n\\]\n\nIf the plus sign is taken, \\(t>\\frac{20}{9}\\) and \\(s=20-9t<0\\), impossible.\nThus \n\n\\[\nt=\\frac{9-\\sqrt5}{4},\n\\qquad\ns=20-9t=\\frac{9\\sqrt5-1}{4}.\n\\]\n\nConsequently \n\n\\[\nA_1A_2+A_1A_{11}=s=\\frac{9\\sqrt5-1}{4}.\n\\]\n\nWritten as \\(\\dfrac{m\\sqrt n-p}{q}\\) we have \n\n\\[\nm=9,\\;n=5,\\;p=1,\\;q=4,\n\\]\n\nso \n\n\\[\nm+n+p+q=9+5+1+4=19.\n\\]\n\n\\[\n\\boxed{19}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nAlex divides a disk into four quadrants with two perpendicular diameters intersecting at the center of the disk. He draws 25 more line segments through the disk, drawing each segment by selecting two points at random on the perimeter of the disk in different quadrants and connecting those two points. Find the expected number of regions into which these 27 line segments divide the disk.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Step 1. Regions created by chords**\n\nIf a circle already has \\(k\\) chords drawn in its interior, then a new chord\nadds one region for itself plus one extra region for every interior\nintersection it creates. \nThus for a set of \\(n\\) chords\n\n\\[\n\\text{# regions}=n+1+\\text{# interior intersection points.}\n\\]\n\nIn our problem we have \n\n* 2 fixed diameters (the two perpendicular ones), \n* 25 random chords.\n\nHence \\(n=27\\). \nWe only have to find the expected number \\(I\\) of interior intersection\npoints.\n\n\\[\nE[\\text{regions}]=27+1+E[I]=28+E[I].\n\\]\n\n--------------------------------------------------------------------\n\n**Step 2. Intersections involving the two diameters**\n\nLet the horizontal diameter be the line that separates the *upper* quadrants\n\\(Q_{1},Q_{2}\\) from the *lower* quadrants \\(Q_{3},Q_{4}\\).\n\nA random chord has its two endpoints in different quadrants.\nThe chord meets the horizontal diameter exactly when the endpoints lie in\ndifferent half\u2011planes, i.e. one endpoint is in \\(\\{Q_{1},Q_{2}\\}\\) and the\nother in \\(\\{Q_{3},Q_{4}\\}\\).\n\nFor the ordered pair of quadrants of a random chord there are \n\\(12\\) equally likely possibilities (the \\(4\\cdot 3\\) ordered pairs with\ndifferent quadrants). \nExactly \\(8\\) of them have the endpoints in opposite half\u2011planes, hence\n\n\\[\np_d=\\Pr(\\text{a random chord meets a given diameter})=\\frac{8}{12}=\n\\frac{2}{3}.\n\\]\n\nTherefore\n\n\\[\n\\boxed{\\text{Expected intersections of the 25 chords with one diameter}=25\\cdot\\frac23}\n\\]\n\nand with the two diameters together\n\n\\[\nE[I_{\\text{diameters}}]=2\\cdot25\\cdot\\frac23=\\frac{100}{3}.\n\\]\n\nThe two diameters intersect each other once, so add \\(1\\) more interior\nintersection.\n\n--------------------------------------------------------------------\n\n**Step 3. Intersections of two random chords**\n\nDenote the four endpoints by \n\\(\\alpha_1,\\alpha_2\\) (chord 1) and \\(\\beta_1,\\beta_2\\) (chord 2). \nAll four points are independent uniform on the circle.\n\nLet \n\n\\[\nA=\\{\\text{endpoints of chord 1 lie in different quadrants}\\},\\qquad \nB=\\{\\text{endpoints of chord 2 lie in different quadrants}\\}.\n\\]\n\n\\[\nP(A)=P(B)=\\frac34 .\n\\]\n\nTwo chords intersect iff the endpoints are interleaved on the circle,\ni.e. exactly one of \\(\\beta_1,\\beta_2\\) lies on the clockwise arc from\n\\(\\alpha_1\\) to \\(\\alpha_2\\).\n\nFix \\(\\alpha_1=x\\) and \\(\\alpha_2=y\\) (with \\(x\\neq y\\)).\nLet \\(I=(x,y)\\) be the clockwise arc from \\(x\\) to \\(y\\) and let\n\\(d=|I|\\) be its length. \nFor independent uniform \\(\\beta_1,\\beta_2\\),\n\n* the probability that exactly one lies in \\(I\\) is \\(2d(1-d)\\);\n* the probability that the two \\(\\beta\\)\u2019s are in *different* quadrants\n is \\(\\frac34\\).\n\nConditioning on the actual placement of the interval \\(I\\) with respect\nto the four quarter\u2011arcs yields (after a short computation)\n\n\\[\n\\Pr(\\beta_1,\\beta_2\\text{ satisfy both conditions}\\mid x,y)=\n2\\Bigl[d\\Bigl(\\tfrac34-d\\Bigr)+\\sum_{q=0}^{3}a_q^{\\,2}\\Bigr],\n\\tag{1}\n\\]\n\nwhere \\(a_q\\) is the length of the part of \\(I\\) that lies in quadrant\n\\(q\\).\n\nNow average (1) over all ordered pairs \\((x,y)\\) that are in different\nquadrants. By symmetry it suffices to place \\(x\\) in the first quadrant\n\\([0,\\tfrac14)\\) and let \\(y\\) run in the three other quadrants.\nCarrying out the integration (splitting the three possible clockwise\ndistances) gives\n\n\\[\n\\int\\!\\!\\int_{x\\in Q_0,\\;y\\in Q_m}\n2\\Bigl[d\\Bigl(\\tfrac34-d\\Bigr)+\\sum a_q^{\\,2}\\Bigr]\\,dy\\,dx\n =\\frac{17}{64}\\qquad(m=1,2,3\\text{ summed}).\n\\]\n\nThus\n\n\\[\nP(A\\cap B\\cap\\{\\text{the chords intersect}\\})=\\frac{17}{64}.\n\\]\n\nFinally\n\n\\[\np_r=\n\\Pr(\\text{intersection}\\mid A\\cap B)=\n\\frac{P(A\\cap B\\cap\\text{intersect})}{P(A)P(B)}\n=\\frac{17/64}{(3/4)^2}\n=\\frac{16}{9}\\cdot\\frac{17}{64}\n=\\frac{17}{36}.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 4. Expected interior intersections**\n\n* Intersections of the two diameters: \\(1\\).\n* Intersections of the 25 random chords with the two diameters:\n \\(\\displaystyle \\frac{100}{3}\\).\n* Intersections among the 25 random chords:\n \\(\\displaystyle \\binom{25}{2}\\,p_r\n =300\\cdot\\frac{17}{36}= \\frac{425}{3}\\).\n\nHence\n\n\\[\nE[I]=1+\\frac{100}{3}+\\frac{425}{3}\n =1+\\frac{525}{3}=1+175=176.\n\\]\n\n--------------------------------------------------------------------\n\n**Step 5. Expected number of regions**\n\n\\[\nE[\\text{regions}]=27+1+E[I]=28+176=204.\n\\]\n\n--------------------------------------------------------------------\n\n\\[\n\\boxed{204}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nSuppose $ \\triangle ABC $ has angles $ \\angle BAC = 84^\\circ $, $ \\angle ABC = 60^\\circ $, and $ \\angle ACB = 36^\\circ $. Let $ D, E, $ and $ F $ be the midpoints of sides $ \\overline{BC} $, $ \\overline{AC} $, and $ \\overline{AB} $, respectively. The circumcircle of $ \\triangle DEF $ intersects $ \\overline{BD} $, $ \\overline{AE} $, and $ \\overline{AF} $ at points $ G, H, $ and $ J $, respectively. The points $ G, D, E, H, J, $ and $ F $ divide the circumcircle of $ \\triangle DEF $ into six minor arcs, as shown. Find $ \\widehat{DE} + 2 \\cdot \\widehat{HJ} + 3 \\cdot \\widehat{FG} $, where the arcs are measured in degrees.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n\\triangle ABC\\qquad \n\\angle A=84^{\\circ},\\; \\angle B=60^{\\circ},\\; \\angle C=36^{\\circ}.\n\\]\n\nDenote \n\n\\[\nD,E,F \\text{ \u2013 the midpoints of }BC,CA,AB,\n\\]\n\\[\nG,H,J \\text{ \u2013 the second intersections of }BD,AE,AF\\text{ with the circumcircle of } \\triangle DEF .\n\\]\n\n--------------------------------------------------------------------\n### 1. The points \\(G,H,J\\) are the feet of the altitudes \n\nThe nine\u2011point circle of \\(\\triangle ABC\\) passes through the three midpoints \\(D,E,F\\) **and** through the three feet of the altitudes. \nBecause \n\n* \\(BD\\) lies on the side \\(BC\\), \n* \\(AE\\) lies on the side \\(CA\\), \n* \\(AF\\) lies on the side \\(AB\\),\n\nthe second intersection of each of these sides with the nine\u2011point circle must be the corresponding foot of an altitude:\n\n\\[\n\\begin{aligned}\nG&= \\text{foot from }A\\text{ onto }BC,\\\\[2mm]\nH&= \\text{foot from }B\\text{ onto }CA,\\\\[2mm]\nJ&= \\text{foot from }C\\text{ onto }AB .\n\\end{aligned}\n\\]\n\nThus \\(G,H,J\\) are the vertices of the orthic triangle.\n\n--------------------------------------------------------------------\n### 2. Arc \\(\\widehat{DE}\\)\n\nThe medial triangle \\(\\triangle DEF\\) is similar to \\(\\triangle ABC\\) (ratio \\(1\\!:\\!2\\)). \nConsequently \n\n\\[\n\\angle DFE = \\angle C = 36^{\\circ}.\n\\]\n\nFor any inscribed angle, the intercepted minor arc is twice the angle; hence \n\n\\[\n\\widehat{DE}=2\\angle DFE = 2\\cdot 36^{\\circ}=72^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 3. Arc \\(\\widehat{FG}\\)\n\nSince \\(D\\) and \\(G\\) both lie on side \\(BC\\), the chord \\(DG\\) is a part of \\(BC\\). \nThe chord \\(DF\\) joins the midpoints of \\(AB\\) and \\(BC\\); by the Midpoint Theorem \n\n\\[\nDF \\parallel AC .\n\\]\n\nTherefore \n\n\\[\n\\angle FDG =\\angle (\\text{line }DF,\\text{ line }DG)\n =\\angle (AC,BC)=\\angle C=36^{\\circ}.\n\\]\n\nThus \n\n\\[\n\\widehat{FG}=2\\angle FDG = 2\\cdot 36^{\\circ}=72^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 4. Arc \\(\\widehat{HJ}\\)\n\n\\(H,J,G\\) are the vertices of the orthic triangle. \nA standard fact about the orthic triangle is that its angles are \n\n\\[\n\\angle HGJ = 180^{\\circ}-2\\angle A,\\qquad\n\\angle GJH = 180^{\\circ}-2\\angle B,\\qquad\n\\angle JHG = 180^{\\circ}-2\\angle C .\n\\]\n\n(The fact follows from simple angle\u2011chasing with the right\u2011angles at the feet of the altitudes.)\n\nHence the minor arc opposite \\(G\\) \u2013 that is, \\(\\widehat{HJ}\\) \u2013 satisfies \n\n\\[\n\\widehat{HJ}=2\\angle HGJ =2\\bigl(180^{\\circ}-2A\\bigr)\n =360^{\\circ}-4A.\n\\]\n\nWith \\(\\angle A =84^{\\circ}\\),\n\n\\[\n\\widehat{HJ}=360^{\\circ}-4\\cdot84^{\\circ}=24^{\\circ}.\n\\]\n\n--------------------------------------------------------------------\n### 5. Required sum\n\n\\[\n\\begin{aligned}\n\\widehat{DE}+2\\widehat{HJ}+3\\widehat{FG}\n&= 72^{\\circ}+2\\cdot24^{\\circ}+3\\cdot72^{\\circ}\\\\\n&= 72^{\\circ}+48^{\\circ}+216^{\\circ}\\\\[2mm]\n&= 336^{\\circ}.\n\\end{aligned}\n\\]\n\n--------------------------------------------------------------------\n\\[\n\\boxed{336}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ \\triangle ABC $ be a right triangle with $ \\angle A = 90^\\circ $ and $ BC = 38 $. There exist points $ K $ and $ L $ inside the triangle such that $ AK = AL = BK = CL = KL = 14. $ The area of the quadrilateral $ BKLC $ can be expressed as $ n \\sqrt{3} $ for some positive integer $ n $. Find $ n $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\n\\angle A =90^\\circ ,\\qquad BC =38 .\n\\]\n\nPlace \n\n\\[\nA=(0,0),\\qquad B=(b,0),\\qquad C=(0,c)\n\\]\n\nso that the legs are \n\n\\[\nAB=b,\\qquad AC=c,\\qquad b^{2}+c^{2}=38^{2}=1444 .\n\\tag{1}\n\\]\n\n--------------------------------------------------------------------\n### 1. Coordinates of \\(K\\) and \\(L\\)\n\nBecause \n\n\\[\nAK=BK=14,\n\\]\n\n\\(K\\) lies on the perpendicular bisector of \\(\\overline{AB}\\); hence \n\n\\[\nK=\\Bigl(\\frac b2,\\;\\sqrt{14^{2}-\\Bigl(\\frac b2\\Bigr)^{2}}\\Bigr)\n =\\bigl( X,\\;U\\bigr)\n\\]\n\nwith \n\n\\[\nX=\\frac b2,\\qquad U=\\sqrt{196-X^{2}} .\\tag{2}\n\\]\n\nSimilarly \n\n\\[\nAL=CL=14\\Longrightarrow \nL=\\Bigl(\\sqrt{196-\\Bigl(\\frac c2\\Bigr)^{2}},\\;\\frac c2\\Bigr)\n =(V,Y),\\qquad \nY=\\frac c2,\\;V=\\sqrt{196-Y^{2}} .\\tag{3}\n\\]\n\nThus \n\n\\[\nX^{2}+Y^{2}= \\frac{b^{2}+c^{2}}{4}\n =\\frac{1444}{4}=361 .\\tag{4}\n\\]\n\n--------------------------------------------------------------------\n### 2. The equilateral triangle \\(AKL\\)\n\nAll three sides of \\(\\triangle AKL\\) equal \\(14\\), so \\(\\angle KAL=60^\\circ\\).\nUsing the vectors \\(\\overrightarrow{AK}=(X,U)\\) and \\(\\overrightarrow{AL}=(V,Y)\\),\n\n\\[\n\\overrightarrow{AK}\\cdot\\overrightarrow{AL}=|AK||AL|\\cos 60^\\circ\n\\Longrightarrow\nXV+YU=98 .\\tag{5}\n\\]\n\nFrom (2)\u2013(5) we have the system\n\n\\[\n\\begin{cases}\nX^{2}+Y^{2}=361,\\\\[2pt]\nX\\sqrt{196-Y^{2}}+Y\\sqrt{196-X^{2}}=98 .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 3. Solving the system\n\nSet \n\n\\[\nX=14\\cos\\alpha ,\\qquad U=14\\sin\\alpha ,\\qquad \nY=14\\cos\\beta ,\\qquad V=14\\sin\\beta .\n\\]\n\nThen (5) becomes \n\n\\[\n14^{2}\\bigl(\\cos\\alpha\\sin\\beta+\\cos\\beta\\sin\\alpha\\bigr)\n =196\\sin(\\alpha+\\beta)=98,\n\\]\n\nhence \n\n\\[\n\\sin(\\alpha+\\beta)=\\frac12\\Longrightarrow\\alpha+\\beta=\\frac{\\pi}{6}\\;(30^\\circ). \\tag{6}\n\\]\n\nFrom \\(X^{2}+Y^{2}=361\\),\n\n\\[\n196\\bigl(\\cos^{2}\\alpha+\\cos^{2}\\beta\\bigr)=361\n\\Longrightarrow\n\\cos^{2}\\alpha+\\cos^{2}\\beta= \\frac{361}{196}=1+\\frac{165}{196}.\n\\]\n\nUsing \\(\\cos^{2}\\alpha+\\cos^{2}\\beta=\n1+\\cos(\\alpha+\\beta)\\cos(\\alpha-\\beta)\\) gives \n\n\\[\n\\cos\\frac{\\pi}{6}\\,\\cos(\\alpha-\\beta)=\\frac{165}{196}\n\\Longrightarrow\n\\cos(\\alpha-\\beta)=\\frac{165}{98\\sqrt3}\n =\\frac{55\\sqrt3}{98}.\n\\]\n\nHence \n\n\\[\n\\sin(\\alpha-\\beta)=\\sqrt{1-\\Bigl(\\frac{55\\sqrt3}{98}\\Bigr)^{2}}\n =\\frac{23}{98}.\n\\]\n\nNow compute \\(\\cos\\alpha\\) and \\(\\cos\\beta\\):\n\\[\n\\cos\\alpha=\\sqrt{\\frac{1+\\cos(\\alpha+\\beta)}{2}}\n =\\sqrt{\\frac{1+\\frac{71}{98}}{2}}\n =\\frac{13}{14},\n\\qquad\n\\cos\\beta =\\sqrt{\\frac{1+\\cos(\\alpha-\\beta)}{2}}\n =\\sqrt{\\frac{1+\\frac{47}{49}}{2}}\n =\\frac{4\\sqrt3}{7}.\n\\]\n\nTherefore \n\n\\[\nX=14\\cos\\alpha =13,\\qquad \nY=14\\cos\\beta =8\\sqrt3 .\n\\]\n\nConsequently \n\n\\[\nb=2X=26,\\qquad c=2Y=16\\sqrt3 .\n\\]\n\nOne easily checks that \\(b^{2}+c^{2}=26^{2}+ (16\\sqrt3)^{2}=1444\\), i.e. \\(BC=38\\).\n\n--------------------------------------------------------------------\n### 4. Area of \\(BKLC\\)\n\nThe right\u2011triangle \\(ABC\\) has area \n\n\\[\n[ABC]=\\frac12\\,b\\,c\n =\\frac12\\cdot26\\cdot16\\sqrt3\n =208\\sqrt3 .\n\\]\n\nThe three small triangles cut off by \\(K\\) and \\(L\\) have areas \n\n\\[\n\\begin{aligned}\n[ABK]&=\\frac12\\cdot b\\cdot U\n =\\frac12\\cdot26\\cdot3\\sqrt3=39\\sqrt3,\\\\[2pt]\n[ALC]&=\\frac12\\cdot c\\cdot V\n =\\frac12\\cdot16\\sqrt3\\cdot2=16\\sqrt3,\\\\[2pt]\n[AKL]&=\\frac{\\sqrt3}{4}\\cdot14^{2}=49\\sqrt3 .\n\\end{aligned}\n\\]\n\nThus\n\n\\[\n\\begin{aligned}\n[BKLC] &=[ABC]-[ABK]-[ALC]-[AKL]\\\\\n &=208\\sqrt3-(39\\sqrt3+16\\sqrt3+49\\sqrt3)\\\\\n &=104\\sqrt3 .\n\\end{aligned}\n\\]\n\nHence the area of \\(BKLC\\) is \\(n\\sqrt3\\) with \n\n\\[\n\\boxed{n=104}.\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet the sequence of rationals $ x_1, x_2, \\ldots $ be defined such that $ x_1 = \\frac{25}{11} $ and\n$ x_{k+1} = \\frac{1}{3} \\left( x_k + \\frac{1}{x_k} - 1 \\right). $\n$ x_{2025} $ can be expressed as $ \\frac{m}{n} $ for relatively prime positive integers $ m $ and $ n $. Find the remainder when $ m + n $ is divided by 1000.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution**\n\n\\[\nx_{k+1}= \\frac13\\Bigl(x_k+\\frac1{x_k}-1\\Bigr),\\qquad \nx_1=\\frac{25}{11}\n\\]\n\nWrite each term as a reduced fraction \n\n\\[\nx_k=\\frac{p_k}{q_k},\\qquad \\gcd(p_k,q_k)=1 .\n\\]\n\nThen \n\n\\[\nx_{k+1}= \\frac{p_k^2+q_k^2-p_kq_k}{3p_kq_k}\n =\\frac{p_{k+1}}{q_{k+1}}\n\\]\n\nwhere \n\n\\[\np_{k+1}= \\frac{p_k^2+q_k^2-p_kq_k}{3},\n\\qquad \nq_{k+1}=p_kq_k . \\tag{1}\n\\]\n\n(The numerator is always divisible by \\(3\\); one checks that\n\\(\\gcd(p_{k+1},q_{k+1})=1\\) for every \\(k\\).)\n\n--------------------------------------------------------------------\n### 1. A simple recurrence for the sum \n\nLet \n\n\\[\ns_k=p_k+q_k .\n\\]\n\nAdding the two formulas in (1),\n\n\\[\n\\begin{aligned}\ns_{k+1}&=p_{k+1}+q_{k+1}\n =\\frac{p_k^2+q_k^2-p_kq_k}{3}+p_kq_k \\\\\n &=\\frac{p_k^2+2p_kq_k+q_k^2}{3}\n =\\frac{(p_k+q_k)^2}{3}\n =\\frac{s_k^{\\,2}}{3}.\n\\end{aligned}\n\\]\n\nThus \n\n\\[\ns_{k+1}= \\frac{s_k^{\\,2}}{3},\\qquad s_1=p_1+q_1=25+11=36.\n\\tag{2}\n\\]\n\n--------------------------------------------------------------------\n### 2. Closed form\n\nSet \\(t_k=s_k/3\\). From (2)\n\n\\[\nt_{k+1}=t_k^{\\,2},\\qquad t_1=\\frac{36}{3}=12 .\n\\]\n\nHence \n\n\\[\nt_k=12^{\\,2^{\\,k-1}},\\qquad \ns_k=3t_k=3\\cdot 12^{\\,2^{\\,k-1}} . \\tag{3}\n\\]\n\nTherefore \n\n\\[\np_{2025}+q_{2025}=s_{2025}=3\\cdot 12^{\\,2^{2024}} .\n\\]\n\n--------------------------------------------------------------------\n### 3. Computing the last three digits \n\nWe need \n\n\\[\nM=3\\cdot 12^{\\,2^{2024}}\\pmod{1000}.\n\\]\n\nBecause \\(1000=8\\cdot125\\) we compute the two residues separately.\n\n*Modulo \\(8\\)* \n\n\\(12\\equiv4\\pmod8\\) and \\(4^{2}=0\\pmod8\\). \nSince the exponent \\(2^{2024}\\ge2\\),\n\n\\[\n12^{\\,2^{2024}}\\equiv0\\pmod8 .\n\\]\n\nHence \\(M\\equiv0\\pmod8\\).\n\n*Modulo \\(125\\)* \n\n\\(\\gcd(12,125)=1\\) and \\(\\varphi(125)=100\\), so \n\\(12^{100}\\equiv1\\pmod{125}\\). \nThus only the exponent modulo \\(100\\) matters:\n\n\\[\ne=2^{2024}\\pmod{100}.\n\\]\n\nFor \\(n\\ge2\\) the powers of \\(2\\) modulo \\(100\\) have period \\(20\\):\n\\(2^{n+20}\\equiv2^n\\pmod{100}\\).\nSince \\(2024\\equiv4\\pmod{20}\\),\n\n\\[\ne\\equiv2^{4}=16\\pmod{100}.\n\\]\n\nNow compute \\(12^{16}\\pmod{125}\\):\n\n\\[\n\\begin{aligned}\n12^{2}&\\equiv144\\equiv19,\\\\\n12^{4}&\\equiv19^{2}=361\\equiv111,\\\\\n12^{8}&\\equiv111^{2}=12321\\equiv71,\\\\\n12^{16}&\\equiv71^{2}=5041\\equiv41\\pmod{125}.\n\\end{aligned}\n\\]\n\nHence \n\n\\[\n12^{\\,2^{2024}}\\equiv41\\pmod{125}.\n\\]\n\n*Chinese remainder theorem* \n\nFind \\(A\\) such that \n\n\\[\nA\\equiv0\\pmod8,\\qquad A\\equiv41\\pmod{125}.\n\\]\n\nWrite \\(A=8k\\). Then \\(8k\\equiv41\\pmod{125}\\Rightarrow\nk\\equiv41\\cdot8^{-1}\\pmod{125}\\).\nSince \\(8^{-1}\\equiv47\\pmod{125}\\),\n\n\\[\nk\\equiv41\\cdot47\\equiv52\\pmod{125},\n\\]\nso \\(k=52+125t\\) and \n\n\\[\nA=8k=416+1000t\\equiv416\\pmod{1000}.\n\\]\n\nFinally \n\n\\[\nM=3A\\equiv3\\cdot416=1248\\equiv\\boxed{248}\\pmod{1000}.\n\\]\n\nThus the remainder of \\(m+n\\) when divided by \\(1000\\) is **248**.", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nThere are exactly three positive real numbers $ k $ such that the function\n$ f(x) = \\frac{(x - 18)(x - 72)(x - 98)(x - k)}{x} $\ndefined over the positive real numbers achieves its minimum value at exactly two positive real numbers $ x $. Find the sum of these three values of $ k $.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "Let \n\n\\[\nf_k(x)=\\frac{(x-18)(x-72)(x-98)(x-k)}{x}= \\frac{N(x)}{x},\\qquad x>0 ,\n\\]\n\nwhere \n\n\\[\nN(x)=(x-18)(x-72)(x-98)(x-k)\n =x^{4}-(188+k)x^{3}+(10116+188k)x^{2}-(127008+10116k)x+127008k .\n\\]\n\n--------------------------------------------------------------------\n### 1. What does \u201cthe minimum is attained at exactly two points\u2019\u2019 mean?\n\nIf the global minimum value is \\(m\\), then for every \\(x>0\\)\n\n\\[\n\\frac{N(x)}{x}\\ge m\\qquad\\Longleftrightarrow\\qquad N(x)-mx\\ge0 .\n\\]\n\nEquality occurs exactly at the points where the minimum is attained.\nSince \\(N(x)-mx\\) is a quartic polynomial, the only way it can be\nnon\u2011negative for all \\(x\\) and vanish at exactly two distinct points is\n\n\\[\nN(x)-mx=(x-a)^{2}(x-b)^{2}\\qquad(a\\neq b,\\;a,b>0).\n\\]\n\nThus there are numbers \\(a,b,m\\) such that \n\n\\[\n\\begin{cases}\nN(a)=ma,\\quad N'(a)=m,\\\\[2pt]\nN(b)=mb,\\quad N'(b)=m .\n\\end{cases}\n\\]\n\n--------------------------------------------------------------------\n### 2. Coefficient comparison\n\nWrite\n\n\\[\n(x-a)^{2}(x-b)^{2}=(x^{2}-Sx+P)^{2},\n\\qquad\nS=a+b,\\;P=ab .\n\\]\n\nEquating coefficients of \\(N(x)-mx\\) and \\((x^{2}-Sx+P)^{2}\\) yields \n\n\\[\n\\begin{aligned}\nS&=\\frac{188+k}{2},\\tag{1}\\\\[2pt]\nS^{2}+2P&=10116+188k,\\tag{2}\\\\[2pt]\n2SP&=127008+10116k+m,\\tag{3}\\\\[2pt]\nP^{2}&=127008\\,k.\\tag{4}\n\\end{aligned}\n\\]\n\nFrom (1) and (4)\n\n\\[\nS=\\frac{188+k}{2},\\qquad P=\\sqrt{127008\\,k}.\n\\]\n\nInsert these in (2):\n\n\\[\n\\frac{(188+k)^{2}}{4}+2\\sqrt{127008\\,k}=10116+188k .\n\\]\n\nMultiplying by \\(4\\) and using \\(\\sqrt{127008}=252\\sqrt2\\) gives \n\n\\[\nk^{2}-376k-5120+2016\\sqrt{2k}=0. \\tag{5}\n\\]\n\n--------------------------------------------------------------------\n### 3. Solving for \\(k\\)\n\nSet \\(u=\\sqrt{k}>0\\). Then \\(\\sqrt{2k}=u\\sqrt2\\) and (5) becomes \n\n\\[\nu^{4}-376u^{2}+2016\\sqrt2\\,u-5120=0 .\n\\]\n\nWrite \\(u=a\\sqrt2\\;(a>0)\\); the equation reduces to \n\n\\[\na^{4}-188a^{2}+1008a-1280=0 .\n\\]\n\nFactoring,\n\n\\[\n(a^{2}-6a+8)(a^{2}+6a-160)=0,\n\\]\n\nso \n\n\\[\na=2,\\;4,\\;10\\quad(\\text{the root }a=-16\\text{ gives }u<0\\text{ and is discarded}).\n\\]\n\nSince \\(k=u^{2}=2a^{2}\\),\n\n\\[\nk=2\\cdot2^{2}=8,\\qquad\nk=2\\cdot4^{2}=32,\\qquad\nk=2\\cdot10^{2}=200 .\n\\]\n\nFor each of these values the discriminant \n\n\\[\n\\Delta=S^{2}-4P>0\n\\]\n\nso the quadratic \\(x^{2}-Sx+P\\) has two distinct positive roots; consequently\n\\(f_{k}(x)\\) attains its global minimum at exactly those two points.\n\n--------------------------------------------------------------------\n### 4. Sum of the admissible \\(k\\)\n\n\\[\n8+32+200 = 240 .\n\\]\n\n\\[\n\\boxed{240}\n\\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $N$ denote the number of ordered triples of positive integers $(a,b,c)$ such that $a,b,c\\leq3^6$ and $a^3+b^3+c^3$ is a multiple of $3^7$. Find the remainder when $N$ is divided by $1000$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "**Solution Outline**\n\n1. Let \\(M=3^{7}=2187\\) and \\(A=\\{1,\\ldots ,3^{6}\\}= \\{1,\\dots ,729\\}\\).\n For each \\(a\\in A\\) put \\(r(a)=a^{3}\\pmod{M}\\).\n The required number \n\n \\[\n N=\\#\\{(a,b,c)\\in A^{3}:r(a)+r(b)+r(c)\\equiv0\\pmod M\\}\n \\]\n\n is the weighted convolution of the distribution of the residues\n \\(r(a)\\).\n\n2. Write each \\(a\\) as \\(a=3^{v}a'\\) with \\(\\gcd(a',3)=1\\).\n\n| \\(v\\) | range of \\(a\\) | # of such \\(a\\) | residue \\(a^{3}\\) (mod\u202f\\(M\\)) | weight |\n|-------|----------------|-----------------|-------------------------------|--------|\n| 0 | not divisible by 3 | \\(486\\) | \\(a^{\\prime\\,3}\\) (unit cube) | \\(1\\) |\n| 1 | \\(3\\mid a,9\\nmid a\\) | \\(162\\) | \\(27a^{\\prime\\,3}\\) | \\(9\\) |\n| 2 | \\(9\\mid a,27\\nmid a\\) | \\(54\\) | \\(729a^{\\prime\\,3}\\) | \\(27\\) |\n| \\(\\ge3\\) | \\(27\\mid a\\) | \\(27\\) | \\(0\\) | \\(27\\)\n\nHence the possible residues and their multiplicities are \n\n* 0\u2003\u2003\u2003\u2003\u2003\u2003weight\u202f\\(27\\);\n* the two residues \\(729,\\,1458\\)\u2003weight\u202f\\(27\\) each;\n* 18 residues (the cubes of the unit group modulo\u202f\\(81\\))\u2003weight\u202f\\(9\\) each;\n* 486 residues (the cubes of the unit group modulo\u202f\\(3^{7}\\))\u2003weight\u202f\\(1\\) each.\n\nDenote by \n\n* \\(D\\) the 486 unit\u2011cube residues (weight\u202f1);\n* \\(C\\) the 18 residues \\(27\\cdot u\\) with \\(u\\) a unit\u2011cube modulo\u202f\\(81\\) (weight\u202f9);\n* \\(B\\) the two residues \\(729,1458\\) (weight\u202f27);\n* \\(0\\) the zero residue (weight\u202f27).\n\n3. Split the count according to how many zero\u2011terms occur.\n Let \n\n \\[\n w(x)=\\text{weight of residue }x.\n \\]\n\n For \\(x\\neq0\\) put \\(R'=\\{D\\cup C\\cup B\\}\\). Then\n\n \\[\n N=N_{0}+N_{1}+N_{2},\n \\]\n\n where \n\n * \\(N_{2}=w(0)^{3}=27^{3}=19683\\) (all three residues zero);\n * \\(N_{1}=3\\,w(0)\\displaystyle\\sum_{\\substack{y+z\\equiv0\\\\y,z\\in R'}}\n w(y)w(z) =3\\cdot27\\cdot3402=275\\,562\\);\n * \\(N_{0}\\) counts triples with no zero term.\n\n The sum in \\(N_{1}\\) is obtained easily:\n each \\(x\\in D\\) pairs with its inverse, giving \\(486\\) ordered pairs,\n each \\(x\\in C\\) gives \\(18\\) ordered pairs (weight \\(9^{2}=81\\)), and each\n \\(x\\in B\\) gives \\(2\\) ordered pairs (weight \\(27^{2}=729\\)).\n Hence \\(\\displaystyle\\sum_{y+z\\equiv0}w(y)w(z)=486+1458+1458=3402\\).\n\n4. Compute \\(N_{0}\\).\n After factoring the common factor \\(27\\) from the elements of \\(C\\cup B\\),\n the condition \\(x+y+z\\equiv0\\pmod{M}\\) becomes\n\n \\[\n u+v+w\\equiv0\\pmod{81},\n \\]\n\n where \\(u,v,w\\) belong to \n\n * the set \\(S\\) of the 18 unit\u2011cubes modulo\u202f\\(81\\) (weight\u202f9);\n * the two residues \\(27,54\\) (weight\u202f27).\n\n For the set \\(S\\) one has the simple description \n\n \\[\n S=\\{x\\pmod{81}:x\\equiv\\pm1\\pmod9\\}.\n \\]\n\n Using this description we compute the additive convolution on \\(\\mathbb Z/81\\).\n\n * For any \\(t\\equiv0\\pmod9\\) we have \\(\\#\\{(s_{1},s_{2})\\in S^{2}:s_{1}+s_{2}\\equiv t\\}=18\\).\n * For any \\(t\\equiv\\pm2\\pmod9\\) the count equals \\(9\\).\n * For any other residue the count is \\(0\\).\n\n Consequently\n\n * there are no triples \\(s_{1}+s_{2}+s_{3}\\equiv0\\) with all three from \\(S\\);\n * ordered triples with exactly one element from \\(\\{27,54\\}\\) and two from \\(S\\) are possible.\n For each of the two choices \\(\\{27,54\\}\\) there are\n \\((A*A)(27)=(A*A)(54)=18\\) ordered pairs from \\(S\\); \n with three possible positions for the \u201c\\(B\\)\u2019\u2019 element we obtain \n\n \\[\n 2\\cdot3\\cdot18=108\n \\]\n\n ordered triples. Their weight is \\(27\\cdot9^{2}=2187\\), giving a contribution \n\n \\[\n 108\\cdot2187=236\\,196 .\n \\]\n\n * triples consisting only of the two \u201c\\(B\\)\u201d residues satisfy the condition\n only when all three are equal, giving two ordered triples,\n each of weight \\(27^{3}=19683\\); contribution \n\n \\[\n 2\\cdot19683=39\\,366 .\n \\]\n\n Adding these contributions:\n\n \\[\n N_{0}=236\\,196+39\\,366=275\\,562 .\n \\]\n\n5. Assemble all parts:\n\n \\[\n N=N_{0}+N_{1}+N_{2}=275\\,562+275\\,562+19\\,683=570\\,807 .\n \\]\n\n6. The required remainder is \n\n \\[\n N\\bmod1000 = 570\\,807\\bmod1000 = \\boxed{807}.\n \\]", + "role": "assistant" + } + ], + [ + { + "role": "user", + "content": "\nLet $ABCDE$ be a convex pentagon with $AB=14, BC=7, CD=24, DE=13, EA=26,$ and $\\angle B=\\angle E=60^\\circ$. For each point $X$ in the plane, define $f(X)=AX+BX+CX+DX+EX$. The least possible value of $f(X)$ can be expressed as $m+n\\sqrt{p}$, where $m$ and $n$ are positive integers and $p$ is not divisible by the square of any prime. Find $m+n+p$.\nPlease reason step by step, and put your final answer within \\boxed{}.\n" + }, + { + "content": "The minimum value of \\(f(X)\\) works out to be \n\n\\[\nf_{\\min}=18+20\\sqrt7 .\n\\]\n\nThus \\(m=18,\\; n=20,\\; p=7\\) and \n\n\\[\nm+n+p = 18+20+7 = 45 .\n\\]\n\n\\[\n\\boxed{45}\n\\]", + "role": "assistant" + } + ] + ], + "metadata": { + "example_level_metadata": [ + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null, + null + ] + } +} \ No newline at end of file diff --git a/benches/dgx-spark.md b/benches/dgx-spark/dgx-spark.md similarity index 100% rename from benches/dgx-spark.md rename to benches/dgx-spark/dgx-spark.md diff --git a/benches/dgx-spark/run-aime-120b-t8-x8-high.log b/benches/dgx-spark/run-aime-120b-t8-x8-high.log new file mode 100644 index 00000000000..5c5e2c5c96e --- /dev/null +++ b/benches/dgx-spark/run-aime-120b-t8-x8-high.log @@ -0,0 +1,11 @@ +nohup: ignoring input +Running with args Namespace(model='openai/gpt-oss-120b', reasoning_effort='high', sampler='chat_completions', base_url='http://localhost:8066/v1', eval='aime25', temperature=1.0, n_threads=8, debug=False, examples=None) + +Running the following evals: {'aime25': } +Running evals for the following models: {'openai/gpt-oss-120b-high': } + 0%| | 0/240 [00:00 Date: Mon, 10 Nov 2025 10:19:39 +0100 Subject: [PATCH 139/185] cuda/vulkan : bicubic interpolation (#17022) * vulkan : implement upscale with bicubic interpolation * cuda : implement upscale with bicubic interpolation * tests : add ggml_interpolate with GGML_SCALE_MODE_BICUBIC to backend tests * adapt OpenCL backend to not support the OP in that case so tests don't fail * print scale mode & flags in test-backend-ops --- ggml/src/ggml-cuda/upscale.cu | 93 +++++++++++++++++-- ggml/src/ggml-opencl/ggml-opencl.cpp | 7 +- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 5 +- .../ggml-vulkan/vulkan-shaders/upscale.comp | 37 ++++++++ tests/test-backend-ops.cpp | 21 +++-- 5 files changed, 148 insertions(+), 15 deletions(-) diff --git a/ggml/src/ggml-cuda/upscale.cu b/ggml/src/ggml-cuda/upscale.cu index 35b7e61d80a..687c669304d 100644 --- a/ggml/src/ggml-cuda/upscale.cu +++ b/ggml/src/ggml-cuda/upscale.cu @@ -81,6 +81,70 @@ static __global__ void upscale_f32_bilinear(const float * x, float * dst, dst[index] = result; } +namespace bicubic_interpolation { +// https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm +__device__ const float a = -0.75f; // use alpha = -0.75 (same as PyTorch) + +static __device__ float weight1(float x) { return ((a + 2) * x - (a + 3)) * x * x + 1; }; +static __device__ float weight2(float x) { return ((a * x - 5 * a) * x + 8 * a) * x - 4 * a; }; + +static __device__ float bicubic(float p0, float p1, float p2, float p3, float x) { + const float w0 = weight2(x + 1); + const float w1 = weight1(x + 0); + const float w2 = weight1(1 - x); + const float w3 = weight2(2 - x); + return p0 * w0 + p1 * w1 + p2 * w2 + p3 * w3; +}; +} // namespace bicubic_interpolation + +static __global__ void upscale_f32_bicubic(const float * x, float * dst, + const int nb00, const int nb01, const int nb02, const int nb03, + const int ne00_src, const int ne01_src, + const int ne10_dst, const int ne11_dst, const int ne12_dst, const int ne13_dst, + const float sf0, const float sf1, const float sf2, const float sf3, + const float pixel_offset) { + using bicubic_interpolation::bicubic; + + const int64_t index = threadIdx.x + blockIdx.x * blockDim.x; + const int64_t dst_total_elements = ne10_dst * ne11_dst * ne12_dst * ne13_dst; + + if (index >= dst_total_elements) { + return; + } + + const int i10_dst = index % ne10_dst; + const int i11_dst = (index / ne10_dst) % ne11_dst; + const int i12_dst = (index / (ne10_dst * ne11_dst)) % ne12_dst; + const int i13_dst = index / (ne10_dst * ne11_dst * ne12_dst); + + const int i02_src = (int)(i12_dst / sf2); + const int i03_src = (int)(i13_dst / sf3); + + const float y_src_f = ((float)i11_dst + pixel_offset) / sf1 - pixel_offset; + const int y0_src = (int)floorf(y_src_f); + const float dy = y_src_f - (float)y0_src; + + const float x_src_f = ((float)i10_dst + pixel_offset) / sf0 - pixel_offset; + const int x0_src = (int)floorf(x_src_f); + const float dx = x_src_f - (float)x0_src; + + const char * x_base = (const char *)x + (int64_t)i02_src * nb02 + (int64_t)i03_src * nb03; + + auto load = [=](int x_off, int y_off) -> float { + int i00_src = max(0, min(x0_src + x_off, ne00_src - 1)); + int i01_src = max(0, min(y0_src + y_off, ne01_src - 1)); + return *(const float *)(x_base + (int64_t)i00_src * nb00 + (int64_t)i01_src * nb01); + }; + + const float result = bicubic( + bicubic(load(-1,-1), load(0,-1), load(1,-1), load(2,-1), dx), + bicubic(load(-1, 0), load(0, 0), load(1, 0), load(2, 0), dx), + bicubic(load(-1, 1), load(0, 1), load(1, 1), load(2, 1), dx), + bicubic(load(-1, 2), load(0, 2), load(1, 2), load(2, 2), dx), dy); + + dst[index] = result; +} + static void upscale_f32_cuda(const float * x, float * dst, const int nb00, const int nb01, const int nb02, const int nb03, const int ne10, const int ne11, const int ne12, const int ne13, @@ -104,6 +168,18 @@ static void upscale_f32_bilinear_cuda(const float * x, float * dst, upscale_f32_bilinear<<>>(x, dst, nb00, nb01, nb02, nb03, ne00_src, ne01_src, ne10_dst, ne11_dst, ne12_dst, ne13_dst, sf0, sf1, sf2, sf3, pixel_offset); } +static void upscale_f32_bicubic_cuda(const float * x, float * dst, + const int nb00, const int nb01, const int nb02, const int nb03, + const int ne00_src, const int ne01_src, + const int ne10_dst, const int ne11_dst, const int ne12_dst, const int ne13_dst, + const float sf0, const float sf1, const float sf2, const float sf3, + const float pixel_offset, cudaStream_t stream) { + const int64_t dst_size = ne10_dst * ne11_dst * ne12_dst * ne13_dst; + const int64_t num_blocks = (dst_size + CUDA_UPSCALE_BLOCK_SIZE - 1) / CUDA_UPSCALE_BLOCK_SIZE; + + upscale_f32_bicubic<<>>(x, dst, nb00, nb01, nb02, nb03, ne00_src, ne01_src, ne10_dst, ne11_dst, ne12_dst, ne13_dst, sf0, sf1, sf2, sf3, pixel_offset); +} + void ggml_cuda_op_upscale(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { const ggml_tensor * src0 = dst->src[0]; const float * src0_d = (const float *)src0->data; @@ -121,17 +197,22 @@ void ggml_cuda_op_upscale(ggml_backend_cuda_context & ctx, ggml_tensor * dst) { float sf2 = (float)dst->ne[2]/src0->ne[2]; const float sf3 = (float)dst->ne[3]/src0->ne[3]; + float pixel_offset = 0.5f; + if (mode_flags & GGML_SCALE_FLAG_ALIGN_CORNERS) { + sf0 = dst->ne[0] > 1 && src0->ne[0] > 1 ? (float)(dst->ne[0] - 1) / (src0->ne[0] - 1) : sf0; + sf1 = dst->ne[1] > 1 && src0->ne[1] > 1 ? (float)(dst->ne[1] - 1) / (src0->ne[1] - 1) : sf1; + pixel_offset = 0.0f; + } + if (mode == GGML_SCALE_MODE_NEAREST) { upscale_f32_cuda(src0_d, dst_d, src0->nb[0], src0->nb[1], src0->nb[2], src0->nb[3], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], sf0, sf1, sf2, sf3, stream); } else if (mode == GGML_SCALE_MODE_BILINEAR) { - float pixel_offset = 0.5f; - if (mode_flags & GGML_SCALE_FLAG_ALIGN_CORNERS) { - sf0 = dst->ne[0] > 1 && src0->ne[0] > 1 ? (float)(dst->ne[0] - 1) / (src0->ne[0] - 1) : sf0; - sf1 = dst->ne[1] > 1 && src0->ne[1] > 1 ? (float)(dst->ne[1] - 1) / (src0->ne[1] - 1) : sf1; - pixel_offset = 0.0f; - } upscale_f32_bilinear_cuda(src0_d, dst_d, src0->nb[0], src0->nb[1], src0->nb[2], src0->nb[3], src0->ne[0], src0->ne[1], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], sf0, sf1, sf2, sf3, pixel_offset, stream); + } else if (mode == GGML_SCALE_MODE_BICUBIC) { + upscale_f32_bicubic_cuda(src0_d, dst_d, src0->nb[0], src0->nb[1], src0->nb[2], src0->nb[3], + src0->ne[0], src0->ne[1], dst->ne[0], dst->ne[1], dst->ne[2], dst->ne[3], + sf0, sf1, sf2, sf3, pixel_offset, stream); } } diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp index 3dc4d035509..1d3a318a569 100644 --- a/ggml/src/ggml-opencl/ggml-opencl.cpp +++ b/ggml/src/ggml-opencl/ggml-opencl.cpp @@ -2944,8 +2944,11 @@ static bool ggml_opencl_supports_op(ggml_backend_dev_t dev, const struct ggml_te return op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32; // Assuming F32 for now, can be expanded case GGML_OP_PAD: return op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32; - case GGML_OP_UPSCALE: - return op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32; + case GGML_OP_UPSCALE: { + ggml_scale_mode mode = (ggml_scale_mode)(ggml_get_op_params_i32(op, 0) & 0xFF); + return op->src[0]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32 && + (mode == GGML_SCALE_MODE_NEAREST || mode == GGML_SCALE_MODE_BILINEAR); + } case GGML_OP_CONV_2D: return (op->src[0]->type == GGML_TYPE_F16 && op->src[1]->type == GGML_TYPE_F16 && op->type == GGML_TYPE_F16) || (op->src[0]->type == GGML_TYPE_F32 && op->src[1]->type == GGML_TYPE_F32 && op->type == GGML_TYPE_F32) || diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index 7570febeaad..a7a28b1934c 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -620,7 +620,7 @@ struct vk_device_struct { vk_pipeline pipeline_add_id_f32; vk_pipeline pipeline_concat_f32, pipeline_concat_f16, pipeline_concat_i32; - vk_pipeline pipeline_upscale_nearest_f32, pipeline_upscale_bilinear_f32; + vk_pipeline pipeline_upscale_nearest_f32, pipeline_upscale_bilinear_f32, pipeline_upscale_bicubic_f32; vk_pipeline pipeline_scale_f32; vk_pipeline pipeline_sqr_f32; vk_pipeline pipeline_sqrt_f32; @@ -3702,6 +3702,7 @@ static void ggml_vk_load_shaders(vk_device& device) { ggml_vk_create_pipeline(device, device->pipeline_upscale_nearest_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_NEAREST}, 1); ggml_vk_create_pipeline(device, device->pipeline_upscale_bilinear_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_BILINEAR}, 1); + ggml_vk_create_pipeline(device, device->pipeline_upscale_bicubic_f32, "upscale_f32", upscale_f32_len, upscale_f32_data, "main", 2, sizeof(vk_op_upscale_push_constants), {512, 1, 1}, {GGML_SCALE_MODE_BICUBIC}, 1); ggml_vk_create_pipeline(device, device->pipeline_scale_f32, "scale_f32", scale_f32_len, scale_f32_data, "main", 2, sizeof(vk_op_unary_push_constants), {512, 1, 1}, {}, 1); @@ -8200,6 +8201,8 @@ static vk_pipeline ggml_vk_op_get_pipeline(ggml_backend_vk_context * ctx, const return ctx->device->pipeline_upscale_nearest_f32; case GGML_SCALE_MODE_BILINEAR: return ctx->device->pipeline_upscale_bilinear_f32; + case GGML_SCALE_MODE_BICUBIC: + return ctx->device->pipeline_upscale_bicubic_f32; default: return nullptr; } diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp b/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp index 8670aad32c3..037ab0c78f0 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/upscale.comp @@ -20,6 +20,7 @@ layout (binding = 1) writeonly buffer D {D_TYPE data_d[];}; // from ggml.h: enum ggml_scale_mode, enum ggml_scale_flag #define NEAREST 0 #define BILINEAR 1 +#define BICUBIC 2 layout (constant_id = 0) const uint scale_mode = 0; @@ -61,6 +62,39 @@ float interpolate_bilinear(uint i10, uint i11, uint i12, uint i13) { return fetch_bilinear(c0, c1, d, i12, i13); } +// Bicubic interpolation with alpha = -0.75 +// https://en.wikipedia.org/wiki/Bicubic_interpolation#Bicubic_convolution_algorithm +const vec4 bcoeffs1 = vec4( 1.25, -2.25, 0.0, 1.0); +const vec4 bcoeffs2 = vec4(-0.75, 3.75, -6.0, 3.0); +vec4 powers(float x) { return vec4(x*x*x, x*x, x, 1); } + +float bicubic(float p0, float p1, float p2, float p3, float x) { + return p0 * dot(bcoeffs2, powers(x + 1)) + + p1 * dot(bcoeffs1, powers(x )) + + p2 * dot(bcoeffs1, powers(1 - x)) + + p3 * dot(bcoeffs2, powers(2 - x)); +} + +#define FETCH(a,b) data_a[base + clamp(i.x+(a), 0, res.x) * p.nb00 + clamp(i.y+(b), 0, res.y) * p.nb01] + +float interpolate_bicubic(uint i10, uint i11, uint i12, uint i13) { + const ivec2 res = ivec2(p.ne00 - 1, p.ne01 - 1); + + const vec2 coord = (vec2(i10, i11) + p.pixel_offset) / vec2(p.sf0, p.sf1) - p.pixel_offset; + const vec2 d = fract(coord); + const ivec2 i = ivec2(floor(coord)); + + const uint i02 = uint(i12 / p.sf2); + const uint i03 = uint(i13 / p.sf3); + const uint base = p.a_offset + i03 * p.nb03 + i02 * p.nb02; + + return bicubic( + bicubic(FETCH(-1,-1), FETCH(0,-1), FETCH(1,-1), FETCH(2,-1), d.x), + bicubic(FETCH(-1, 0), FETCH(0, 0), FETCH(1, 0), FETCH(2, 0), d.x), + bicubic(FETCH(-1, 1), FETCH(0, 1), FETCH(1, 1), FETCH(2, 1), d.x), + bicubic(FETCH(-1, 2), FETCH(0, 2), FETCH(1, 2), FETCH(2, 2), d.x), d.y); +} + void main() { const uint idx = gl_GlobalInvocationID.z * 262144 + gl_GlobalInvocationID.y * 512 + gl_GlobalInvocationID.x; @@ -81,6 +115,9 @@ void main() { case BILINEAR: result = interpolate_bilinear(i10, i11, i12, i13); break; + case BICUBIC: + result = interpolate_bicubic(i10, i11, i12, i13); + break; } data_d[p.d_offset + idx] = D_TYPE(result); diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index 22635f1635c..eb29b15f204 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -272,6 +272,10 @@ static double mean_abs_asymm(const float * a, const float * b, const size_t n, c // utils for printing the variables of the test cases +static std::string var_to_str(const std::string & x) { + return x; +} + template static std::string var_to_str(const T & x) { return std::to_string(x); @@ -323,7 +327,8 @@ static std::string var_to_str(ggml_scale_mode mode) { switch (mode) { case GGML_SCALE_MODE_NEAREST: return "nearest"; case GGML_SCALE_MODE_BILINEAR: return "bilinear"; - default: return std::to_string(mode); + case GGML_SCALE_MODE_BICUBIC: return "bicubic"; + default: return std::to_string(mode); } } @@ -5218,7 +5223,9 @@ struct test_interpolate : public test_case { const uint32_t mode = GGML_SCALE_MODE_NEAREST; std::string vars() override { - return VARS_TO_STR4(type, ne, ne_tgt, mode); + ggml_scale_mode mode = (ggml_scale_mode)(this->mode & 0xFF); + std::string flags = (this->mode & GGML_SCALE_FLAG_ALIGN_CORNERS) ? "align_corners" : "none"; + return VARS_TO_STR5(type, ne, ne_tgt, mode, flags); } test_interpolate(ggml_type type = GGML_TYPE_F32, @@ -7288,15 +7295,17 @@ static std::vector> make_test_cases_eval() { test_cases.emplace_back(new test_argsort(GGML_TYPE_F32, {2, 8, 8192, 1}, order)); // bailingmoe2 (group selection) } - for (ggml_scale_mode mode : {GGML_SCALE_MODE_NEAREST, GGML_SCALE_MODE_BILINEAR}) { + for (ggml_scale_mode mode : {GGML_SCALE_MODE_NEAREST, GGML_SCALE_MODE_BILINEAR, GGML_SCALE_MODE_BICUBIC}) { test_cases.emplace_back(new test_upscale(GGML_TYPE_F32, {512, 512, 3, 2}, 2, mode)); test_cases.emplace_back(new test_upscale(GGML_TYPE_F32, {512, 512, 3, 2}, 2, mode, true)); test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {2, 5, 7, 11}, {5, 7, 11, 13}, mode)); test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {5, 7, 11, 13}, {2, 5, 7, 11}, mode)); } - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {2, 5, 7, 11}, {5, 7, 11, 13}, GGML_SCALE_MODE_BILINEAR | GGML_SCALE_FLAG_ALIGN_CORNERS)); - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {1, 4, 3, 2}, {2, 8, 3, 2}, GGML_SCALE_MODE_BILINEAR | GGML_SCALE_FLAG_ALIGN_CORNERS)); - test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {4, 1, 3, 2}, {1, 1, 3, 2}, GGML_SCALE_MODE_BILINEAR | GGML_SCALE_FLAG_ALIGN_CORNERS)); + for (ggml_scale_mode mode : {GGML_SCALE_MODE_BILINEAR, GGML_SCALE_MODE_BICUBIC}) { + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {2, 5, 7, 11}, {5, 7, 11, 13}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {1, 4, 3, 2}, {2, 8, 3, 2}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); + test_cases.emplace_back(new test_interpolate(GGML_TYPE_F32, {4, 1, 3, 2}, {1, 1, 3, 2}, mode | GGML_SCALE_FLAG_ALIGN_CORNERS)); + } test_cases.emplace_back(new test_sum()); test_cases.emplace_back(new test_sum_rows()); From 9898b57cbe69ab81713e16cbb84a799c6eb3e36c Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 10 Nov 2025 12:17:19 +0200 Subject: [PATCH 140/185] editorconfig : ignore benches/ (#17140) [no ci] --- .editorconfig | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.editorconfig b/.editorconfig index 0722ac73c8c..74b65a45668 100644 --- a/.editorconfig +++ b/.editorconfig @@ -60,3 +60,11 @@ end_of_line = unset charset = unset trim_trailing_whitespace = unset insert_final_newline = unset + +[benches/**] +indent_style = unset +indent_size = unset +end_of_line = unset +charset = unset +trim_trailing_whitespace = unset +insert_final_newline = unset From 4b13a684c595ab9323be8dfa6266d9d0fb13c232 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Mon, 10 Nov 2025 11:41:05 +0100 Subject: [PATCH 141/185] mtmd: fix patch_size initialized to random value in audio models (#17128) * mtmd: fix patch_size initialized to random value in audio models * add default hparams --- tools/mtmd/clip.cpp | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/tools/mtmd/clip.cpp b/tools/mtmd/clip.cpp index d1423b67f98..1d78f5954ed 100644 --- a/tools/mtmd/clip.cpp +++ b/tools/mtmd/clip.cpp @@ -160,13 +160,13 @@ enum patch_merge_type { }; struct clip_hparams { - int32_t image_size; - int32_t patch_size; - int32_t n_embd; - int32_t n_ff; - int32_t projection_dim; - int32_t n_head; - int32_t n_layer; + int32_t image_size = 0; + int32_t patch_size = 0; + int32_t n_embd = 0; + int32_t n_ff = 0; + int32_t projection_dim = 0; + int32_t n_head = 0; + int32_t n_layer = 0; // idefics3 int32_t image_longest_edge = 0; int32_t image_min_pixels = -1; @@ -2683,6 +2683,9 @@ struct clip_model_loader { } } else if (is_audio) { get_u32(KEY_A_NUM_MEL_BINS, hparams.n_mel_bins); + // some hparams are unused, but still need to set to avoid issues + hparams.image_size = 0; + hparams.patch_size = 1; } else { GGML_ASSERT(false && "unknown modality"); From f914544b16a467a5c94e95ec77027775c3652c09 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 10 Nov 2025 12:59:29 +0200 Subject: [PATCH 142/185] batched-bench : add "separate text gen" mode (#17103) --- common/arg.cpp | 7 +++++ common/common.h | 3 +- tools/batched-bench/batched-bench.cpp | 42 ++++++++++++++++++++------- 3 files changed, 40 insertions(+), 12 deletions(-) diff --git a/common/arg.cpp b/common/arg.cpp index a5708102814..430ab45dfe2 100644 --- a/common/arg.cpp +++ b/common/arg.cpp @@ -2253,6 +2253,13 @@ common_params_context common_params_parser_init(common_params & params, llama_ex params.is_pp_shared = true; } ).set_examples({LLAMA_EXAMPLE_BENCH, LLAMA_EXAMPLE_PARALLEL})); + add_opt(common_arg( + {"-tgs"}, + string_format("is the text generation separated across the different sequences (default: %s)", params.is_tg_separate ? "true" : "false"), + [](common_params & params) { + params.is_tg_separate = true; + } + ).set_examples({LLAMA_EXAMPLE_BENCH, LLAMA_EXAMPLE_PARALLEL})); add_opt(common_arg( {"-npp"}, "n0,n1,...", "number of prompt tokens", diff --git a/common/common.h b/common/common.h index 8540725aaa4..f42c083faa2 100644 --- a/common/common.h +++ b/common/common.h @@ -460,7 +460,8 @@ struct common_params { float slot_prompt_similarity = 0.1f; // batched-bench params - bool is_pp_shared = false; + bool is_pp_shared = false; + bool is_tg_separate = false; std::vector n_pp; std::vector n_tg; diff --git a/tools/batched-bench/batched-bench.cpp b/tools/batched-bench/batched-bench.cpp index f1ab27cd54d..2032a386bb4 100644 --- a/tools/batched-bench/batched-bench.cpp +++ b/tools/batched-bench/batched-bench.cpp @@ -23,7 +23,8 @@ int main(int argc, char ** argv) { common_init(); - int is_pp_shared = params.is_pp_shared; + int is_pp_shared = params.is_pp_shared; + int is_tg_separate = params.is_tg_separate; std::vector n_pp = params.n_pp; std::vector n_tg = params.n_tg; @@ -72,8 +73,8 @@ int main(int argc, char ** argv) { // decode in batches of ctx_params.n_batch tokens auto decode_helper = [](llama_context * ctx, llama_batch & batch, int32_t n_batch, bool synchronize) { - for (int32_t i = 0; i < (int32_t) batch.n_tokens; i += n_batch) { - const int32_t n_tokens = std::min(n_batch, (int32_t) (batch.n_tokens - i)); + for (int32_t i = 0; i < batch.n_tokens; i += n_batch) { + const int32_t n_tokens = std::min(n_batch, batch.n_tokens - i); llama_batch batch_view = { n_tokens, @@ -113,7 +114,7 @@ int main(int argc, char ** argv) { if (!params.batched_bench_output_jsonl) { LOG("\n"); - LOG("%s: n_kv_max = %d, n_batch = %d, n_ubatch = %d, flash_attn = %d, is_pp_shared = %d, n_gpu_layers = %d, n_threads = %u, n_threads_batch = %u\n", __func__, n_kv_max, params.n_batch, params.n_ubatch, int(params.flash_attn_type), params.is_pp_shared, params.n_gpu_layers, ctx_params.n_threads, ctx_params.n_threads_batch); + LOG("%s: n_kv_max = %d, n_batch = %d, n_ubatch = %d, flash_attn = %d, is_pp_shared = %d, is_tg_separate = %d, n_gpu_layers = %d, n_threads = %u, n_threads_batch = %u\n", __func__, n_kv_max, params.n_batch, params.n_ubatch, int(params.flash_attn_type), is_pp_shared, is_tg_separate, params.n_gpu_layers, ctx_params.n_threads, ctx_params.n_threads_batch); LOG("\n"); LOG("|%6s | %6s | %4s | %6s | %8s | %8s | %8s | %8s | %8s | %8s |\n", "PP", "TG", "B", "N_KV", "T_PP s", "S_PP t/s", "T_TG s", "S_TG t/s", "T s", "S t/s"); LOG("|%6s-|-%6s-|-%4s-|-%6s-|-%8s-|-%8s-|-%8s-|-%8s-|-%8s-|-%8s-|\n", "------", "------", "----", "------", "--------", "--------", "--------", "--------", "--------", "--------"); @@ -172,16 +173,35 @@ int main(int argc, char ** argv) { const auto t_tg_start = ggml_time_us(); - for (int i = 0; i < tg; ++i) { - common_batch_clear(batch); - + if (is_tg_separate) { + // decode pattern: + // 0 0 0 ... 1 1 1 ... 2 2 2 ... 3 3 3 ... for (int j = 0; j < pl; ++j) { - common_batch_add(batch, get_token_rand(), pp + i, { j }, true); + for (int i = 0; i < tg; ++i) { + common_batch_clear(batch); + + common_batch_add(batch, get_token_rand(), pp + i, { j }, true); + + if (!decode_helper(ctx, batch, ctx_params.n_batch, true)) { + LOG_ERR("%s: llama_decode() failed\n", __func__); + return 1; + } + } } + } else { + // decode pattern: + // 0123 0123 0123 ... + for (int i = 0; i < tg; ++i) { + common_batch_clear(batch); - if (!decode_helper(ctx, batch, ctx_params.n_batch, true)) { - LOG_ERR("%s: llama_decode() failed\n", __func__); - return 1; + for (int j = 0; j < pl; ++j) { + common_batch_add(batch, get_token_rand(), pp + i, { j }, true); + } + + if (!decode_helper(ctx, batch, ctx_params.n_batch, true)) { + LOG_ERR("%s: llama_decode() failed\n", __func__); + return 1; + } } } From df70bedda70550fd9ebc4bc965c5dbc3f6d78345 Mon Sep 17 00:00:00 2001 From: fj-y-saito <85871716+fj-y-saito@users.noreply.github.com> Date: Mon, 10 Nov 2025 22:12:59 +0900 Subject: [PATCH 143/185] =?UTF-8?q?arm64:=20add=20i8mm=20route=20with=20SV?= =?UTF-8?q?E=20ggml=5Fvec=5Fdot=5Fq4=5FK=5Fq8=5FK=20and=20ggml=5Fvec=5Fdot?= =?UTF-8?q?=5Fq6=5FK=5F=E2=80=A6=20(#15277)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add i8mm route with SVE ggml_vec_dot_q4_K_q8_K and ggml_vec_dot_q6_K_q8_K * Surround SVE function with compiler directive * fix compile switch * fix coding style * ggml : fix indent --------- Co-authored-by: Georgi Gerganov --- ggml/src/ggml-cpu/arch/arm/quants.c | 454 ++++++++++++++++++++++++++-- 1 file changed, 428 insertions(+), 26 deletions(-) diff --git a/ggml/src/ggml-cpu/arch/arm/quants.c b/ggml/src/ggml-cpu/arch/arm/quants.c index aadbb487ec0..b390ab61c78 100644 --- a/ggml/src/ggml-cpu/arch/arm/quants.c +++ b/ggml/src/ggml-cpu/arch/arm/quants.c @@ -2044,6 +2044,26 @@ void ggml_vec_dot_q3_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi } +#ifdef __ARM_FEATURE_SVE +static inline svuint32_t ggml_decode_q4scales_and_mins_for_mmla(const uint32_t * vx_scales) { + const svbool_t pg_all = svptrue_pat_b32(SV_VL4); + const svbool_t pg_false = svpfalse_b(); // 0x0000 + const svbool_t pg_lo_8 = svwhilelt_b8_s32(0, 8); // 0x00ff + const svbool_t pg_odd = svzip1_b32(pg_false, pg_lo_8); + + svuint32_t vutmp_hi, vutmp_lo; + svuint32_t vx01 = svld1_u32(pg_lo_8, vx_scales); + vutmp_hi = svzip1_u32(vx01, vx01); + vutmp_hi = svlsr_n_u32_m(pg_odd, vutmp_hi, 2); + vutmp_hi = svreinterpret_u32_u64(svand_n_u64_x(pg_all, svreinterpret_u64_u32(vutmp_hi), UINT64_C(0x303030303f3f3f3f))); + const svuint32_t vx2 = svdup_u32(vx_scales[2]); + vutmp_lo = svlsr_u32_x(pg_all, vx2, svreinterpret_u32_s32(svindex_s32(-2, 2))); + vutmp_lo = svand_n_u32_z(pg_odd, vutmp_lo, UINT32_C(0x0f0f0f0f)); + svuint32_t vutmp = svorr_u32_z(pg_all, vutmp_hi, vutmp_lo); + return vutmp; +} +#endif + void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const void * GGML_RESTRICT vx, size_t bx, const void * GGML_RESTRICT vy, size_t by, int nrc) { assert(n % QK_K == 0); #ifdef __ARM_FEATURE_MATMUL_INT8 @@ -2066,8 +2086,220 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi static const uint32_t kmask3 = 0x03030303; uint32_t utmp[4]; +#ifdef __ARM_FEATURE_SVE + const int vector_length = ggml_cpu_get_sve_cnt()*8; +#endif -#if defined(__ARM_FEATURE_MATMUL_INT8) +#if defined(__ARM_FEATURE_SVE) && defined(__ARM_FEATURE_MATMUL_INT8) + if (nrc == 2) { + svbool_t pg32_2 = svptrue_pat_b32(SV_VL2); + + const block_q4_K * GGML_RESTRICT vx0 = vx; + const block_q8_K * GGML_RESTRICT vy0 = vy; + const block_q4_K * GGML_RESTRICT vx1 = (const block_q4_K *) ((const uint8_t*)vx + bx); + const block_q8_K * GGML_RESTRICT vy1 = (const block_q8_K *) ((const uint8_t*)vy + by); + + union { + uint32_t u32[8]; + uint64_t u64[4]; + } new_utmp; + + svfloat32_t sumf1 = svdup_n_f32(0); + + switch (vector_length) { + case 128: + { + svbool_t pg_false = svpfalse_b(); + svbool_t pg_lo_8 = svwhilelt_b8_s32(0, 8); + svbool_t vmins_mask1= svzip1_b32(pg_lo_8, pg_false); + svbool_t vmins_mask2 = svzip1_b32(pg_false, pg_lo_8); + svbool_t pg128_all = svptrue_pat_b8(SV_VL16); + for (int i = 0; i < nb; ++i) { + svfloat32_t vy_d = svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d)); + svfloat32_t vx_d = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].d)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].d))); + svfloat32_t svsuper_block_scales = svmul_f32_x(pg128_all, vy_d, vx_d); + svfloat32_t vx_dmins = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].dmin)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].dmin))); + svfloat32_t vy_dmins = svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d)); + svfloat32_t svdmins = svmul_n_f32_x(pg128_all, svmul_f32_x(pg128_all, vy_dmins, vx_dmins), -1); + const uint8_t * GGML_RESTRICT q4_0 = vx0[i].qs; + const int8_t * GGML_RESTRICT q8_0 = vy0[i].qs; + const uint8_t * GGML_RESTRICT q4_1 = vx1[i].qs; + const int8_t * GGML_RESTRICT q8_1 = vy1[i].qs; + svint16_t lo = svld1_s16(pg128_all, vy0[i].bsums + 0); + svint16_t hi = svld1_s16(pg128_all, vy0[i].bsums + 8); + svint16_t sum_tmp1 = svuzp1_s16(lo, hi); + svint16_t sum_tmp2 = svuzp2_s16(lo, hi); + svint16_t svq8sums_0 = svadd_s16_x(pg128_all, sum_tmp1, sum_tmp2); + lo = svld1_s16(pg128_all, vy1[i].bsums + 0); + hi = svld1_s16(pg128_all, vy1[i].bsums + 8); + sum_tmp1 = svuzp1(lo, hi); + sum_tmp2 = svuzp2(lo, hi); + svint16_t svq8sums_1 = svadd_s16_x(pg128_all, sum_tmp1, sum_tmp2); + svuint32_t decoded_scales0 = ggml_decode_q4scales_and_mins_for_mmla((const uint32_t *)vx0[i].scales); + svuint32_t decoded_scales1 = ggml_decode_q4scales_and_mins_for_mmla((const uint32_t *)vx1[i].scales); + svuint32x2_t decoded_scales = svcreate2_u32(decoded_scales0, decoded_scales1); + svst2_u32(pg128_all, new_utmp.u32, decoded_scales); + svint16_t svmins8_0 = svreinterpret_s16_u16(svunpklo_u16(svreinterpret_u8_u32(svuzp1_u32(svld1_u32(vmins_mask1, new_utmp.u32+4), svdup_n_u32(0))))); + svint16_t svmins8_1 = svreinterpret_s16_u16(svunpklo_u16(svreinterpret_u8_u32(svuzp2_u32(svld1_u32(vmins_mask2, new_utmp.u32+4), svdup_n_u32(0))))); + svint32_t svsumfs_tmp1 = svreinterpret_s32_s64(svdot_s64(svdup_n_s64(0), svq8sums_0, svmins8_0)); + svint32_t svsumfs_tmp2 = svreinterpret_s32_s64(svdot_s64(svdup_n_s64(0), svq8sums_0, svmins8_1)); + svint32_t svsumfs_tmp3 = svtrn1_s32(svsumfs_tmp1, svsumfs_tmp2); + svint32_t svsumfs_tmp4 = svreinterpret_s32_s64(svdot_s64(svdup_n_s64(0), svq8sums_1, svmins8_0)); + svint32_t svsumfs_tmp5 = svreinterpret_s32_s64(svdot_s64(svdup_n_s64(0), svq8sums_1, svmins8_1)); + svint32_t svsumfs_tmp6 = svtrn1_s32(svsumfs_tmp4, svsumfs_tmp5); + svint32_t svsumfs_tmp7 = svreinterpret_s32_s64(svtrn2_s64(svreinterpret_s64_s32(svsumfs_tmp3), svreinterpret_s64_s32(svsumfs_tmp6))); + svint32_t svsumfs_tmp8 = svreinterpret_s32_s64(svtrn1_s64(svreinterpret_s64_s32(svsumfs_tmp3), svreinterpret_s64_s32(svsumfs_tmp6))); + svint32_t svsumfs_tmp = svadd_s32_x(pg128_all, svsumfs_tmp7, svsumfs_tmp8); + svint32_t svscales, sumi1, sumi2; + svint32_t acc_sumif1 = svdup_n_s32(0); + svint32_t acc_sumif2 = svdup_n_s32(0); + svint8_t q4bytes_0_l, q4bytes_0_h, q4bytes_1_l, q4bytes_1_h, l0, l1, l2, l3, + q8bytes_0_h, q8bytes_0_l, q8bytes_1_h, q8bytes_1_l, r0, r1, r2, r3; +#pragma GCC unroll 1 + for (int j = 0; j < QK_K/64; ++j) { + q4bytes_0_l = svreinterpret_s8_u8(svand_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_0), 0xf)); + q4bytes_1_l = svreinterpret_s8_u8(svand_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_1), 0xf)); + q4bytes_0_h = svreinterpret_s8_u8(svand_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_0+16), 0xf)); + q4bytes_1_h = svreinterpret_s8_u8(svand_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_1+16), 0xf)); + l0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q4bytes_0_l), svreinterpret_s64_s8(q4bytes_1_l))); + l1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q4bytes_0_l), svreinterpret_s64_s8(q4bytes_1_l))); + l2 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q4bytes_0_h), svreinterpret_s64_s8(q4bytes_1_h))); + l3 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q4bytes_0_h), svreinterpret_s64_s8(q4bytes_1_h))); + q8bytes_0_h = svld1_s8(pg128_all, q8_0); + q8bytes_1_h = svld1_s8(pg128_all, q8_1); + q8bytes_0_l = svld1_s8(pg128_all, q8_0+16); + q8bytes_1_l = svld1_s8(pg128_all, q8_1+16); + r0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0_h), svreinterpret_s64_s8(q8bytes_1_h))); + r1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0_h), svreinterpret_s64_s8(q8bytes_1_h))); + r2 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0_l), svreinterpret_s64_s8(q8bytes_1_l))); + r3 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0_l), svreinterpret_s64_s8(q8bytes_1_l))); + sumi1 = svmmla_s32(svmmla_s32(svmmla_s32(svmmla_s32(svdup_n_s32(0), r0, l0), r1, l1), r2, l2), r3, l3); + svscales = svreinterpret_s32_u32(svlsr_n_u32_x(pg128_all, svlsl_n_u32_x(pg128_all, svreinterpret_u32_u64(svdup_n_u64(new_utmp.u64[j/2])), 8*(4-2*(j%2)-1)), 24)); + acc_sumif1 = svmla_s32_x(pg128_all, acc_sumif1, svscales, sumi1); + + q4bytes_0_l = svreinterpret_s8_u8(svlsr_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_0), 4)); + q4bytes_1_l = svreinterpret_s8_u8(svlsr_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_1), 4)); + q4bytes_0_h = svreinterpret_s8_u8(svlsr_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_0+16), 4)); + q4bytes_1_h = svreinterpret_s8_u8(svlsr_n_u8_x(pg128_all, svld1_u8(pg128_all, q4_1+16), 4)); + l0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q4bytes_0_l), svreinterpret_s64_s8(q4bytes_1_l))); + l1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q4bytes_0_l), svreinterpret_s64_s8(q4bytes_1_l))); + l2 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q4bytes_0_h), svreinterpret_s64_s8(q4bytes_1_h))); + l3 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q4bytes_0_h), svreinterpret_s64_s8(q4bytes_1_h))); + q8bytes_0_h = svld1_s8(pg128_all, q8_0+32); + q8bytes_1_h = svld1_s8(pg128_all, q8_1+32); + q8bytes_0_l = svld1_s8(pg128_all, q8_0+48); + q8bytes_1_l = svld1_s8(pg128_all, q8_1+48); + r0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0_h), svreinterpret_s64_s8(q8bytes_1_h))); + r1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0_h), svreinterpret_s64_s8(q8bytes_1_h))); + r2 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0_l), svreinterpret_s64_s8(q8bytes_1_l))); + r3 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0_l), svreinterpret_s64_s8(q8bytes_1_l))); + sumi2 = svmmla_s32(svmmla_s32(svmmla_s32(svmmla_s32(svdup_n_s32(0), r0, l0), r1, l1), r2, l2), r3, l3); + svscales = svreinterpret_s32_u32(svlsr_n_u32_x(pg128_all, svlsl_n_u32_x(pg128_all, svreinterpret_u32_u64(svdup_n_u64(new_utmp.u64[j/2])), 8*(4-2*(j%2)-2)), 24)); + acc_sumif2 = svmla_s32_x(pg128_all, acc_sumif2, svscales, sumi2); + q4_0 += 32; q4_1 += 32; q8_0 += 64; q8_1 += 64; + } + sumf1 = svmla_f32_x(pg128_all, + svmla_f32_x(pg128_all, + sumf1, + svcvt_f32_x(pg128_all, + svadd_s32_x(pg128_all, acc_sumif1, acc_sumif2)), + svsuper_block_scales), + svdmins, + svcvt_f32_s32_x(pg128_all, svsumfs_tmp)); + } //end of for nb + } // end of case 128 + break; + case 256: + case 512: + { + const svbool_t pg32_4 = svptrue_pat_b32(SV_VL4); + const svbool_t pg8_16 = svptrue_pat_b8(SV_VL16); + const svbool_t pg256_all = svptrue_pat_b8(SV_ALL); + for (int i = 0; i < nb; ++i) { + const uint8_t * GGML_RESTRICT q4_0 = vx0[i].qs; + const int8_t * GGML_RESTRICT q8_0 = vy0[i].qs; + const uint8_t * GGML_RESTRICT q4_1 = vx1[i].qs; + const int8_t * GGML_RESTRICT q8_1 = vy1[i].qs; + svint32_t svscales, sumi1, sumi2; + svint32_t acc_sumif1 = svdup_n_s32(0); + svint32_t acc_sumif2 = svdup_n_s32(0); + svint8_t l0, l1, l2, l3, r0, r1, r2, r3; + svfloat32_t vx_d = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].d)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].d))); + svfloat64_t vy_d_tmp = svreinterpret_f64_f32(svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d))); + svfloat32_t vy_d = svreinterpret_f32_f64(svuzp1_f64(vy_d_tmp, vy_d_tmp)); + svfloat32_t svsuper_block_scales = svmul_f32_z(pg32_4, vy_d, vx_d); + svfloat32_t vx_dmins = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].dmin)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].dmin))); + svfloat64_t vy_dmins_tmp = svreinterpret_f64_f32(svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d))); + svfloat32_t vy_dmins = svreinterpret_f32_f64(svuzp1_f64(vy_dmins_tmp, vy_dmins_tmp)); + svfloat32_t svdmins = svmul_n_f32_x(pg32_4, svmul_f32_x(pg32_4, vx_dmins, vy_dmins), -1); + svint16_t rc1 = svuzp1_s16(svld1_s16(pg256_all, vy0[i].bsums), svld1_s16(pg256_all, vy1[i].bsums)); + svint16_t rc2 = svuzp2_s16(svld1_s16(pg256_all, vy0[i].bsums), svld1_s16(pg256_all, vy1[i].bsums)); + svint16_t svq8sums = svadd_s16_x(pg256_all, rc1, rc2); + svuint32_t decoded_scales0 = ggml_decode_q4scales_and_mins_for_mmla((const uint32_t *)vx0[i].scales); + svuint32_t decoded_scales1 = ggml_decode_q4scales_and_mins_for_mmla((const uint32_t *)vx1[i].scales); + svuint32x2_t decoded_scales = svcreate2_u32(decoded_scales0, decoded_scales1); + svst2_u32(pg8_16, new_utmp.u32, decoded_scales); + svint16_t new_svq8sums_0 = svreinterpret_s16_u64(svtrn1_u64(svreinterpret_u64_s16(svq8sums), svreinterpret_u64_s16(svq8sums))); + svint16_t new_svq8sums_1 = svreinterpret_s16_u64(svtrn2_u64(svreinterpret_u64_s16(svq8sums), svreinterpret_u64_s16(svq8sums))); + svuint64_t new_mins_0 = svdup_u64(new_utmp.u64[2]); + svuint64_t new_mins_1 = svdup_u64(new_utmp.u64[3]); + svint16_t new_svmins8_0 = svreinterpret_s16_u16(svunpklo_u16(svreinterpret_u8_u64(new_mins_0))); + svint16_t new_svmins8_1 = svreinterpret_s16_u16(svunpklo_u16(svreinterpret_u8_u64(new_mins_1))); + svint64_t dot_prod_0 = svdot_s64(svdup_s64(0), new_svmins8_0, new_svq8sums_0); + svint64_t dot_prod_1 = svdot_s64(dot_prod_0, new_svmins8_1, new_svq8sums_1); + svfloat32_t converted_dot_prod_1 = svcvt_f32_s64_x(pg256_all, dot_prod_1); + svfloat32_t svsumfs_tmp = svuzp1_f32(converted_dot_prod_1, converted_dot_prod_1); + +#pragma GCC unroll 1 + for (int j = 0; j < QK_K/64; ++j) { + svuint8_t q4bytes_0 = svand_n_u8_x(pg256_all, svld1_u8(pg256_all, q4_0), 0xf); + svuint8_t q4bytes_1 = svand_n_u8_x(pg256_all, svld1_u8(pg256_all, q4_1), 0xf); + svuint8_t q4bytes_2 = svlsr_n_u8_x(pg256_all, svld1_u8(pg256_all, q4_0), 4); + svuint8_t q4bytes_3 = svlsr_n_u8_x(pg256_all, svld1_u8(pg256_all, q4_1), 4); + l0 = svreinterpret_s8_u64(svzip1_u64(svreinterpret_u64_u8(q4bytes_0), svreinterpret_u64_u8(q4bytes_1))); + l1 = svreinterpret_s8_u64(svzip2_u64(svreinterpret_u64_u8(q4bytes_0), svreinterpret_u64_u8(q4bytes_1))); + l2 = svreinterpret_s8_u64(svzip1_u64(svreinterpret_u64_u8(q4bytes_2), svreinterpret_u64_u8(q4bytes_3))); + l3 = svreinterpret_s8_u64(svzip2_u64(svreinterpret_u64_u8(q4bytes_2), svreinterpret_u64_u8(q4bytes_3))); + svint8_t q8bytes_0 = svld1_s8(pg256_all, q8_0); + svint8_t q8bytes_1 = svld1_s8(pg256_all, q8_1); + svint8_t q8bytes_2 = svld1_s8(pg256_all, q8_0+32); + svint8_t q8bytes_3 = svld1_s8(pg256_all, q8_1+32); + r0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + r1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + r2 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_2), svreinterpret_s64_s8(q8bytes_3))); + r3 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_2), svreinterpret_s64_s8(q8bytes_3))); + sumi1 = svmmla(svmmla(svdup_n_s32(0), r0, l0), r1, l1); + svscales = svreinterpret_s32_u32(svlsr_n_u32_x(pg256_all, svlsl_n_u32_x(pg256_all, svreinterpret_u32_u64(svdup_n_u64(new_utmp.u64[j/2])), 8*(4-2*(j%2)-1)), 24)); + acc_sumif1 = svmla_s32_x(pg256_all, acc_sumif1, svscales, sumi1); + sumi2 = svmmla(svmmla(svdup_n_s32(0), r2, l2), r3, l3); + svscales = svreinterpret_s32_u32(svlsr_n_u32_x(pg256_all, svlsl_n_u32_x(pg256_all, svreinterpret_u32_u64(svdup_n_u64(new_utmp.u64[j/2])), 8*(4-2*(j%2)-2)), 24)); + acc_sumif2 = svmla_s32_x(pg256_all, acc_sumif2, svscales, sumi2); + q4_0 += 32; q4_1 += 32; q8_0 += 64; q8_1 += 64; + } + svint32_t acc_sumif = svadd_s32_x(pg256_all, acc_sumif1, acc_sumif2); + svint32_t swap_acc_sumif = svext_s32(acc_sumif, acc_sumif, 4); + acc_sumif = svadd_s32_x(pg32_4, acc_sumif, swap_acc_sumif); + sumf1 = svmla_f32_x(pg32_4, + svmla_f32_x(pg32_4, + sumf1, + svcvt_f32_x(pg32_4, acc_sumif), + svsuper_block_scales), + svdmins, + svsumfs_tmp); + } // end of for nb + } // end of case 256-512 + break; + default: + assert(false && "Unsupported vector length"); + break; + } + + svst1_f32(pg32_2, s, sumf1); + svst1_f32(pg32_2, s + bs, svreinterpret_f32_u8(svext_u8(svreinterpret_u8_f32(sumf1), svdup_n_u8(0), 8))); + + return; + } +#elif defined(__ARM_FEATURE_MATMUL_INT8) if (nrc == 2) { const block_q4_K * GGML_RESTRICT x0 = x; const block_q4_K * GGML_RESTRICT x1 = (const block_q4_K *) ((const uint8_t *)vx + bx); @@ -2235,7 +2467,6 @@ void ggml_vec_dot_q4_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi const uint8_t * GGML_RESTRICT q4 = x[i].qs; const int8_t * GGML_RESTRICT q8 = y[i].qs; - const int vector_length = ggml_cpu_get_sve_cnt()*8; const svuint8_t m4b = svdup_n_u8(0xf); const svint32_t mzero = svdup_n_s32(0); svint32_t sumi1 = svdup_n_s32(0); @@ -2480,7 +2711,201 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi const int nb = n / QK_K; -#if defined(__ARM_FEATURE_MATMUL_INT8) +#ifdef __ARM_FEATURE_SVE + const int vector_length = ggml_cpu_get_sve_cnt()*8; +#endif +#if defined(__ARM_FEATURE_SVE) && defined(__ARM_FEATURE_MATMUL_INT8) + if (nrc == 2) { + const svbool_t pg32_2 = svptrue_pat_b32(SV_VL2); + + svfloat32_t sum = svdup_n_f32(0); + + const block_q6_K * GGML_RESTRICT vx0 = vx; + const block_q8_K * GGML_RESTRICT vy0 = vy; + const block_q6_K * GGML_RESTRICT vx1 = (const block_q6_K *) ((const uint8_t*)vx + bx); + const block_q8_K * GGML_RESTRICT vy1 = (const block_q8_K *) ((const uint8_t*)vy + by); + + switch (vector_length) { + case 128: + { + const svbool_t pg128_all = svptrue_pat_b8(SV_ALL); + for (int i = 0; i < nb; ++i) { + const uint8_t * GGML_RESTRICT ql0 = vx0[i].ql; + const uint8_t * GGML_RESTRICT qh0 = vx0[i].qh; + const uint8_t * GGML_RESTRICT ql1 = vx1[i].ql; + const uint8_t * GGML_RESTRICT qh1 = vx1[i].qh; + const int8_t * GGML_RESTRICT q80 = vy0[i].qs; + const int8_t * GGML_RESTRICT q81 = vy1[i].qs; + + const int8_t * GGML_RESTRICT scale0 = vx0[i].scales; + const int8_t * GGML_RESTRICT scale1 = vx1[i].scales; + + svfloat32_t vy_d = svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d)); + svfloat32_t vx_d = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].d)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].d))); + svfloat32_t svsuper_block_scales = svmul_f32_x(pg128_all, vy_d, vx_d); + // process q8sum summation 128 bit route + const svint16_t q8sums_01 = svld1_s16(pg128_all, vy0[i].bsums); + const svint16_t q8sums_02 = svld1_s16(pg128_all, vy0[i].bsums + 8); + const svint16_t q8sums_11 = svld1_s16(pg128_all, vy1[i].bsums); + const svint16_t q8sums_12 = svld1_s16(pg128_all, vy1[i].bsums + 8); + const svint64x2_t q6scales_0_tmp = svld2_s64(pg128_all, (const int64_t *)scale0); + const svint16_t q6scales_01 = svunpklo_s16(svreinterpret_s8_s64(svget2_s64(q6scales_0_tmp, 0))); + const svint16_t q6scales_02 = svunpklo_s16(svreinterpret_s8_s64(svget2_s64(q6scales_0_tmp, 1))); + const svint64x2_t q6scales_1_tmp = svld2_s64(pg128_all, (const int64_t *)scale1); + const svint16_t q6scales_11 = svunpklo_s16(svreinterpret_s8_s64(svget2_s64(q6scales_1_tmp, 0))); + const svint16_t q6scales_12 = svunpklo_s16(svreinterpret_s8_s64(svget2_s64(q6scales_1_tmp, 1))); + const svint64_t prod = svdup_n_s64(0); + + svint32_t isum_tmp1 = svreinterpret_s32_s64(svdot_s64(svdot_s64(prod, q8sums_01, q6scales_01), q8sums_02, q6scales_02)); + svint32_t isum_tmp2 = svreinterpret_s32_s64(svdot_s64(svdot_s64(prod, q8sums_01, q6scales_11), q8sums_02, q6scales_12)); + svint32_t isum_tmp3 = svtrn1_s32(isum_tmp1, isum_tmp2); + svint32_t isum_tmp4 = svreinterpret_s32_s64(svdot_s64(svdot_s64(prod, q8sums_11, q6scales_01), q8sums_12, q6scales_02)); + svint32_t isum_tmp5 = svreinterpret_s32_s64(svdot_s64(svdot_s64(prod, q8sums_11, q6scales_11), q8sums_12, q6scales_12)); + svint32_t isum_tmp6 = svtrn1_s32(isum_tmp4, isum_tmp5); + svint32_t isum_tmp7 = svreinterpret_s32_s64(svtrn2_s64(svreinterpret_s64_s32(isum_tmp3), svreinterpret_s64_s32(isum_tmp6))); + svint32_t isum_tmp8 = svreinterpret_s32_s64(svtrn1_s64(svreinterpret_s64_s32(isum_tmp3), svreinterpret_s64_s32(isum_tmp6))); + svint32_t svisum_mins = svadd_s32_x(pg128_all, isum_tmp7, isum_tmp8); + + // process mmla + svint8_t l0, l1, r0, r1; + svint32_t isum_tmp = svdup_n_s32(0); + for (int j = 0; j < QK_K/128; ++j) { + for (int k = 0; k < 8; ++k) { + svuint8_t qhbits_0 = svld1_u8(pg128_all, qh0+16*(k%2)); + svuint8_t qhbits_1 = svld1_u8(pg128_all, qh1+16*(k%2)); + svuint8_t q6bits_0 = svld1_u8(pg128_all, ql0+16*(k%4)); + svuint8_t q6bits_1 = svld1_u8(pg128_all, ql1+16*(k%4)); + const int ql_pos = (k/4)*4; + svuint8_t q6bytes_0_lo = (ql_pos < 4) ? svand_n_u8_x(pg128_all, q6bits_0, 0xf) : svlsr_n_u8_x(pg128_all, q6bits_0, 4); + svuint8_t q6bytes_1_lo = (ql_pos < 4) ? svand_n_u8_x(pg128_all, q6bits_1, 0xf) : svlsr_n_u8_x(pg128_all, q6bits_1, 4); + const int qh_pos = (k/2)*2; + svuint8_t q6bytes_0_hi = svand_n_u8_x(pg128_all, qhbits_0, 0x3 << qh_pos); + svuint8_t q6bytes_1_hi = svand_n_u8_x(pg128_all, qhbits_1, 0x3 << qh_pos); + svint8_t q6bytes_0, q6bytes_1; + if (qh_pos <= 4) { + q6bytes_0 = svreinterpret_s8_u8(svmla_n_u8_x(pg128_all, q6bytes_0_lo, q6bytes_0_hi, 1 << (4 - qh_pos))); + q6bytes_1 = svreinterpret_s8_u8(svmla_n_u8_x(pg128_all, q6bytes_1_lo, q6bytes_1_hi, 1 << (4 - qh_pos))); + } else { + q6bytes_0 = svreinterpret_s8_u8(svorr_u8_x(pg128_all, q6bytes_0_lo, svlsr_n_u8_x(pg128_all, q6bytes_0_hi, (qh_pos - 4)))); + q6bytes_1 = svreinterpret_s8_u8(svorr_u8_x(pg128_all, q6bytes_1_lo, svlsr_n_u8_x(pg128_all, q6bytes_1_hi, (qh_pos - 4)))); + } + svint8_t q8bytes_0 = svld1_s8(pg128_all, q80+16*(k%8)); + svint8_t q8bytes_1 = svld1_s8(pg128_all, q81+16*(k%8)); + l0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q6bytes_0), svreinterpret_s64_s8(q6bytes_1))); + l1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q6bytes_0), svreinterpret_s64_s8(q6bytes_1))); + r0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + r1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + svint32_t svscale = svzip1_s32(svdup_n_s32(scale0[k]), svdup_n_s32(scale1[k])); + isum_tmp = svmla_s32_x(pg128_all, isum_tmp, svmmla_s32(svmmla_s32(svdup_n_s32(0), r0, l0), r1, l1), svscale); + } + qh0 += 32; qh1 += 32; + ql0 += 64; ql1 += 64; + q80 += 128; q81 += 128; + scale0 += 8; scale1 += 8; + } + sum = svmla_f32_x(pg128_all, sum, + svcvt_f32_x(pg128_all, svmla_s32_x(pg128_all, isum_tmp, + svisum_mins, svdup_n_s32(-32))), + svsuper_block_scales); + } + } // end of case 128 + break; + case 256: + case 512: + { + const svbool_t pg256_all = svptrue_pat_b8(SV_ALL); + const svbool_t pg32_4 = svptrue_pat_b32(SV_VL4); + for (int i = 0; i < nb; ++i) { + const uint8_t * GGML_RESTRICT ql0 = vx0[i].ql; + const uint8_t * GGML_RESTRICT qh0 = vx0[i].qh; + const uint8_t * GGML_RESTRICT ql1 = vx1[i].ql; + const uint8_t * GGML_RESTRICT qh1 = vx1[i].qh; + const int8_t * GGML_RESTRICT q80 = vy0[i].qs; + const int8_t * GGML_RESTRICT q81 = vy1[i].qs; + + const int8_t * GGML_RESTRICT scale0 = vx0[i].scales; + const int8_t * GGML_RESTRICT scale1 = vx1[i].scales; + svfloat32_t vx_d = svzip1_f32(svdup_n_f32(GGML_FP16_TO_FP32(vx0[i].d)), svdup_n_f32(GGML_FP16_TO_FP32(vx1[i].d))); + svfloat64_t vy_d_tmp = svreinterpret_f64_f32(svuzp1_f32(svdup_n_f32(vy0[i].d), svdup_n_f32(vy1[i].d))); + svfloat32_t vy_d = svreinterpret_f32_f64(svuzp1_f64(vy_d_tmp, vy_d_tmp)); + svfloat32_t svsuper_block_scales = svmul_f32_x(pg32_4, vy_d, vx_d); + // process q8sum summation 256 bit route + const svint16_t q8sums_0 = svld1_s16(pg256_all, vy0[i].bsums); + const svint16_t q8sums_1 = svld1_s16(pg256_all, vy1[i].bsums); + const svint16_t q6scales_0 = svunpklo_s16(svld1_s8(pg256_all, scale0)); + const svint16_t q6scales_1 = svunpklo_s16(svld1_s8(pg256_all, scale1)); + const svint64_t prod = svdup_n_s64(0); + svint32_t isum_tmp1 = svreinterpret_s32_s64(svdot_s64(prod, q8sums_0, q6scales_0)); + svint32_t isum_tmp2 = svreinterpret_s32_s64(svdot_s64(prod, q8sums_0, q6scales_1)); + svint32_t isum_tmp3 = svreinterpret_s32_s64(svdot_s64(prod, q8sums_1, q6scales_0)); + svint32_t isum_tmp4 = svreinterpret_s32_s64(svdot_s64(prod, q8sums_1, q6scales_1)); + svint32_t isum_tmp5 = svtrn1_s32(isum_tmp1, isum_tmp2); + svint32_t isum_tmp6 = svtrn1_s32(isum_tmp3, isum_tmp4); + svint32_t isum_tmp7 = svreinterpret_s32_s64(svtrn2_s64(svreinterpret_s64_s32(isum_tmp5), svreinterpret_s64_s32(isum_tmp6))); + svint32_t isum_tmp8 = svreinterpret_s32_s64(svtrn1_s64(svreinterpret_s64_s32(isum_tmp5), svreinterpret_s64_s32(isum_tmp6))); + svint32_t isum_tmp9 = svadd_s32_x(pg256_all, isum_tmp7, isum_tmp8); + svint32_t isum_tmp10 = svreinterpret_s32_u8(svext_u8(svreinterpret_u8_s32(isum_tmp9), svreinterpret_u8_s32(isum_tmp9), 16)); + svint32_t svisum_mins = svadd_s32_z(pg32_4, isum_tmp9, isum_tmp10); + + // process mmla + svint8_t l0, l1, r0, r1; + svint32_t isum_tmp = svdup_n_s32(0); + for (int j = 0; j < QK_K/128; ++j) { + for (int k = 0; k < 8; k+=2) { // process 2 block + svuint8_t qhbits_0 = svld1_u8(pg256_all, qh0); + svuint8_t qhbits_1 = svld1_u8(pg256_all, qh1); + svuint8_t q6bits_0 = svld1_u8(pg256_all, ql0+32*((k%4)/2)); + svuint8_t q6bits_1 = svld1_u8(pg256_all, ql1+32*((k%4)/2)); + const int ql_pos = (k/4)*4; + svuint8_t q6bytes_0_lo = (ql_pos < 4) ? svand_n_u8_x(pg256_all, q6bits_0, 0xf) : svlsr_n_u8_x(pg256_all, q6bits_0, 4); + svuint8_t q6bytes_1_lo = (ql_pos < 4) ? svand_n_u8_x(pg256_all, q6bits_1, 0xf) : svlsr_n_u8_x(pg256_all, q6bits_1, 4); + const int qh_pos = (k/2)*2; + svuint8_t q6bytes_0_hi = svand_n_u8_x(pg256_all, qhbits_0, 0x3 << qh_pos); + svuint8_t q6bytes_1_hi = svand_n_u8_x(pg256_all, qhbits_1, 0x3 << qh_pos); + svint8_t q6bytes_0, q6bytes_1; + if (qh_pos <= 4) { + q6bytes_0 = svreinterpret_s8_u8(svmla_n_u8_x(pg256_all, q6bytes_0_lo, q6bytes_0_hi, 1 << (4 - qh_pos))); + q6bytes_1 = svreinterpret_s8_u8(svmla_n_u8_x(pg256_all, q6bytes_1_lo, q6bytes_1_hi, 1 << (4 - qh_pos))); + } else { + q6bytes_0 = svreinterpret_s8_u8(svorr_u8_x(pg256_all, q6bytes_0_lo, svlsr_n_u8_x(pg256_all, q6bytes_0_hi, (qh_pos - 4)))); + q6bytes_1 = svreinterpret_s8_u8(svorr_u8_x(pg256_all, q6bytes_1_lo, svlsr_n_u8_x(pg256_all, q6bytes_1_hi, (qh_pos - 4)))); + } + svint8_t q8bytes_0 = svld1_s8(pg256_all, q80+32*(k/2)); + svint8_t q8bytes_1 = svld1_s8(pg256_all, q81+32*(k/2)); + l0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q6bytes_0), svreinterpret_s64_s8(q6bytes_1))); + l1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q6bytes_0), svreinterpret_s64_s8(q6bytes_1))); + r0 = svreinterpret_s8_s64(svzip1_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + r1 = svreinterpret_s8_s64(svzip2_s64(svreinterpret_s64_s8(q8bytes_0), svreinterpret_s64_s8(q8bytes_1))); + svint32_t svscale0 = svzip1_s32(svdup_n_s32(scale0[k]), svdup_n_s32(scale1[k])); + svint32_t svscale1 = svzip1_s32(svdup_n_s32(scale0[k+1]), svdup_n_s32(scale1[k+1])); + isum_tmp = svmla_s32_x(pg256_all, isum_tmp, svmmla_s32(svdup_n_s32(0), r0, l0), svscale0); + isum_tmp = svmla_s32_x(pg256_all, isum_tmp, svmmla_s32(svdup_n_s32(0), r1, l1), svscale1); + } + qh0 += 32; qh1 += 32; + ql0 += 64; ql1 += 64; + q80 += 128; q81 += 128; + scale0 += 8; scale1 += 8; + } // end of for + svint32_t swap_isum_tmp = svext_s32(isum_tmp, isum_tmp, 4); + isum_tmp = svadd_s32_x(pg32_4, isum_tmp, swap_isum_tmp); + sum = svmla_f32_x(pg32_4, sum, + svcvt_f32_x(pg32_4, svmla_s32_x(pg32_4, isum_tmp, + svisum_mins, svdup_n_s32(-32))), + svsuper_block_scales); + } + } // end of case 256 + break; + default: + assert(false && "Unsupported vector length"); + break; + } // end of switch + + svst1_f32(pg32_2, s, sum); + svst1_f32(pg32_2, s + bs, svreinterpret_f32_u8(svext_u8(svreinterpret_u8_f32(sum), svdup_n_u8(0), 8))); + + return; + } +#elif defined(__ARM_FEATURE_MATMUL_INT8) if (nrc == 2) { const block_q6_K * GGML_RESTRICT x0 = x; const block_q6_K * GGML_RESTRICT x1 = (const block_q6_K *) ((const uint8_t *)vx + bx); @@ -2594,27 +3019,6 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi // adjust bias, apply superblock scale { int32_t bias[4]; -#ifdef __ARM_FEATURE_SVE - const svbool_t pg16_8 = svptrue_pat_b16(SV_VL8); - const svbool_t pg8_8 = svptrue_pat_b8(SV_VL8); - const svint16_t y0_q8sums_0 = svld1_s16(pg16_8, y0->bsums); - const svint16_t y0_q8sums_1 = svld1_s16(pg16_8, y0->bsums + 8); - const svint16_t y1_q8sums_0 = svld1_s16(pg16_8, y1->bsums); - const svint16_t y1_q8sums_1 = svld1_s16(pg16_8, y1->bsums + 8); - const svint16_t x0_q6scales_0 = svunpklo_s16(svld1_s8(pg8_8, x0->scales)); - const svint16_t x0_q6scales_1 = svunpklo_s16(svld1_s8(pg8_8, x0->scales + 8)); - const svint16_t x1_q6scales_0 = svunpklo_s16(svld1_s8(pg8_8, x1->scales)); - const svint16_t x1_q6scales_1 = svunpklo_s16(svld1_s8(pg8_8, x1->scales + 8)); - const svint64_t zero = svdup_n_s64(0); - bias[0] = svaddv_s64(svptrue_b64(), svadd_s64_x(svptrue_b64(), svdot_s64(zero, y0_q8sums_0, x0_q6scales_0), - svdot_s64(zero, y0_q8sums_1, x0_q6scales_1))); - bias[1] = svaddv_s64(svptrue_b64(), svadd_s64_x(svptrue_b64(), svdot_s64(zero, y1_q8sums_0, x0_q6scales_0), - svdot_s64(zero, y1_q8sums_1, x0_q6scales_1))); - bias[2] = svaddv_s64(svptrue_b64(), svadd_s64_x(svptrue_b64(), svdot_s64(zero, y0_q8sums_0, x1_q6scales_0), - svdot_s64(zero, y0_q8sums_1, x1_q6scales_1))); - bias[3] = svaddv_s64(svptrue_b64(), svadd_s64_x(svptrue_b64(), svdot_s64(zero, y1_q8sums_0, x1_q6scales_0), - svdot_s64(zero, y1_q8sums_1, x1_q6scales_1))); -#else // NEON doesn't support int16 dot product, fallback to separated mul and add const int16x8x2_t q8sums0 = vld1q_s16_x2(y0->bsums); const int16x8x2_t q8sums1 = vld1q_s16_x2(y1->bsums); @@ -2646,7 +3050,6 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi vmull_s16(vget_high_s16(q8sums1.val[1]), vget_high_s16(q6scales1.val[1])))); bias[3] = vaddvq_s32(prod); -#endif const int32x4_t vibias = vmulq_n_s32(vld1q_s32(bias), 32); const float32x4_t superblock_scale = { @@ -2672,7 +3075,6 @@ void ggml_vec_dot_q6_K_q8_K(int n, float * GGML_RESTRICT s, size_t bs, const voi #endif #ifdef __ARM_FEATURE_SVE - const int vector_length = ggml_cpu_get_sve_cnt()*8; float sum = 0; svuint8_t m4b = svdup_n_u8(0xf); svint32_t vzero = svdup_n_s32(0); From c27efd2bd1f27b1ad2f0b7cb417dbb9b62b57d44 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 10 Nov 2025 15:38:42 +0200 Subject: [PATCH 144/185] metal : enable tensor API for A19 (#17087) --- ggml/src/ggml-metal/ggml-metal-device.m | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ggml/src/ggml-metal/ggml-metal-device.m b/ggml/src/ggml-metal/ggml-metal-device.m index 606cfd0a5e2..3471225ab47 100644 --- a/ggml/src/ggml-metal/ggml-metal-device.m +++ b/ggml/src/ggml-metal/ggml-metal-device.m @@ -564,8 +564,10 @@ ggml_metal_device_t ggml_metal_device_init(void) { // TODO: try to update the tensor API kernels to at least match the simdgroup performance if (getenv("GGML_METAL_TENSOR_ENABLE") == NULL && ![[dev->mtl_device name] containsString:@"M5"] && - ![[dev->mtl_device name] containsString:@"M6"]) { - GGML_LOG_WARN("%s: tensor API disabled for pre-M5 device\n", __func__); + ![[dev->mtl_device name] containsString:@"M6"] && + ![[dev->mtl_device name] containsString:@"A19"] && + ![[dev->mtl_device name] containsString:@"A20"]) { + GGML_LOG_WARN("%s: tensor API disabled for pre-M5 and pre-A19 devices\n", __func__); dev->props.has_tensor = false; } From 0c74f3263273cf0d95d1f10930a12cad94c375af Mon Sep 17 00:00:00 2001 From: Gabe Goodhart Date: Mon, 10 Nov 2025 08:14:23 -0700 Subject: [PATCH 145/185] memory: Hybrid context shift (#17009) * feat(memory): Only fail partial erasure of recurrent tail The recurrent state is always assumed to be the state as of the last update from the final token in the sequence. When doing a partial erasure, if the range does not include the final token, the erasure can be considered a success since any memory used for the sequence prior to the final token (which is no memory) has been successfully removed. There is one potential case that this doesn't address which is the pruning of cache to remove sensitive data from the context. This wouldn't work for attention cache partial removal (in the middle) either since the KV state is linearly-dependent and states in later sequence positions would still be based on the state from the sensitive data, even if that data is no longer cached, so I don't think this is relevant, but it is worth noting that the semantics of this change for a partial erasure in the middle of the cache are essentially "my context is already compressed" and not "all trace of the removed tokens has been removed." https://github.com/ggml-org/llama.cpp/issues/16768 Branch: HybridContextShift-16768 Signed-off-by: Gabe Goodhart * fix(main): Check the output of seq_rm for prefix matching This prefix matching is explicitly attempting to remove the tokens at the end of the sequence that don't match. This is the operation that can't be performed on a recurrent cache due to the state being updated in place, so if this removal fails, we need to clear the whole cache. https://github.com/ggml-org/llama.cpp/issues/16768 Branch: HybridContextShift-16768 Signed-off-by: Gabe Goodhart * fix(memory): Fix condition for partial erasure failure if p0 > pos Signed-off-by: Gabe Goodhart Co-authored-by: compilade * style: Fix extra parens Signed-off-by: Gabe Goodhart Co-authored-by: Georgi Gerganov * fix(main.cpp): Set n_matching_session_tokens to 0 on cache clear https://github.com/ggml-org/llama.cpp/issues/16768 Branch: HybridContextShift-16768 Signed-off-by: Gabe Goodhart --------- Signed-off-by: Gabe Goodhart Co-authored-by: compilade Co-authored-by: Georgi Gerganov --- src/llama-memory-recurrent.cpp | 7 ++++--- tools/main/main.cpp | 6 +++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/llama-memory-recurrent.cpp b/src/llama-memory-recurrent.cpp index 276e1697d46..812bf253049 100644 --- a/src/llama-memory-recurrent.cpp +++ b/src/llama-memory-recurrent.cpp @@ -151,7 +151,8 @@ bool llama_memory_recurrent::seq_rm(llama_seq_id seq_id, llama_pos p0, llama_pos p1 = std::numeric_limits::max(); } - // models like Mamba or RWKV can't have a state partially erased + // models like Mamba or RWKV can't have a state partially erased at the end + // of the sequence because their state isn't preserved for previous tokens if (seq_id >= (int64_t) size) { // could be fatal return false; @@ -160,8 +161,8 @@ bool llama_memory_recurrent::seq_rm(llama_seq_id seq_id, llama_pos p0, llama_pos int32_t & tail_id = cells[seq_id].tail; if (tail_id >= 0) { const auto & cell = cells[tail_id]; - // partial intersection is invalid - if ((0 < p0 && p0 < cell.pos) || (0 < p1 && p1 <= cell.pos)) { + // partial intersection is invalid if it includes the final pos + if (0 < p0 && p0 <= cell.pos && p1 > cell.pos) { //printf("[DEBUG] inside `llama_memory_recurrent::seq_rm`: partial intersection is invalid, so returning false\n"); return false; } diff --git a/tools/main/main.cpp b/tools/main/main.cpp index 498e00e3a5e..33e88623357 100644 --- a/tools/main/main.cpp +++ b/tools/main/main.cpp @@ -354,7 +354,11 @@ int main(int argc, char ** argv) { } // remove any "future" tokens that we might have inherited from the previous session - llama_memory_seq_rm(mem, -1, n_matching_session_tokens, -1); + if (!llama_memory_seq_rm(mem, -1, n_matching_session_tokens, -1)) { + LOG_INF("%s: unable to resuse common prefix\n", __func__); + n_matching_session_tokens = 0; + llama_memory_seq_rm(mem, -1, -1, -1); + } } LOG_DBG("recalculate the cached logits (check): embd_inp.size() %zu, n_matching_session_tokens %zu, embd_inp.size() %zu, session_tokens.size() %zu\n", From 85234a4b3aa1084147995a07c12ebcce6310dd9e Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Mon, 10 Nov 2025 16:59:10 +0100 Subject: [PATCH 146/185] vulkan: fix validation issue introduced by #16868 (#17145) --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index a7a28b1934c..e4b7e1ea9e5 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -6831,7 +6831,7 @@ static void ggml_vk_mul_mat_vec_q_f16(ggml_backend_vk_context * ctx, vk_context& vk_buffer d_B = d_D; size_t b_buf_offset = 0; - uint64_t b_sz = 0; + uint64_t b_sz = 1; if (enable_bias) { const ggml_tensor * add = cgraph->nodes[node_idx + 1]; @@ -6965,7 +6965,7 @@ static void ggml_vk_mul_mat_vec_p021_f16_f32(ggml_backend_vk_context * ctx, vk_c vk_buffer d_B = d_D; size_t b_buf_offset = 0; - uint64_t b_sz = 0; + uint64_t b_sz = 1; if (enable_bias) { const ggml_tensor * add = cgraph->nodes[node_idx + 1]; @@ -7101,7 +7101,7 @@ static void ggml_vk_mul_mat_vec_nc_f16_f32(ggml_backend_vk_context * ctx, vk_con vk_buffer d_B = d_D; size_t b_buf_offset = 0; - uint64_t b_sz = 0; + uint64_t b_sz = 1; if (enable_bias) { const ggml_tensor * add = cgraph->nodes[node_idx + 1]; @@ -7676,7 +7676,7 @@ static void ggml_vk_mul_mat_vec_id_q_f16(ggml_backend_vk_context * ctx, vk_conte vk_buffer d_B = d_D; size_t b_buf_offset = 0; - uint64_t b_sz = 0; + uint64_t b_sz = 1; if (enable_bias || enable_scale) { const ggml_tensor * bias = cgraph->nodes[node_idx + 1]->src[1]; From f117be185ef1b76129e51d26676354af253bf664 Mon Sep 17 00:00:00 2001 From: Ruben Ortlam Date: Mon, 10 Nov 2025 16:59:26 +0100 Subject: [PATCH 147/185] vulkan: check glslc executable string (#17144) --- ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp index c2e42cf006e..c8a6f97ecff 100644 --- a/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp +++ b/ggml/src/ggml-vulkan/vulkan-shaders/vulkan-shaders-gen.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #ifdef _WIN32 #define NOMINMAX @@ -1080,6 +1081,11 @@ int main(int argc, char** argv) { if (args.find("--glslc") != args.end()) { GLSLC = args["--glslc"]; // Path to glslc + + if (!std::filesystem::exists(GLSLC) || !std::filesystem::is_regular_file(GLSLC)) { + std::cerr << "Error: glslc not found at " << GLSLC << std::endl; + return EXIT_FAILURE; + } } if (args.find("--source") != args.end()) { input_filepath = args["--source"]; // The shader source file to compile From 967eb4b2bf5971565094122c64bb54090cbdc05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Mon, 10 Nov 2025 20:03:36 +0100 Subject: [PATCH 148/185] ggml-cpu : inspect -march and -mcpu to found the CPU (#16333) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Adrien Gallouët --- ggml/src/ggml-cpu/CMakeLists.txt | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/ggml/src/ggml-cpu/CMakeLists.txt b/ggml/src/ggml-cpu/CMakeLists.txt index 23ec8bb08a7..a55191aede9 100644 --- a/ggml/src/ggml-cpu/CMakeLists.txt +++ b/ggml/src/ggml-cpu/CMakeLists.txt @@ -126,25 +126,36 @@ function(ggml_add_cpu_backend_variant_impl tag_name) ) if (NOT ARM_MCPU_RESULT) string(REGEX MATCH "-mcpu=[^ ']+" ARM_MCPU_FLAG "${ARM_MCPU}") + string(REGEX MATCH "-march=[^ ']+" ARM_MARCH_FLAG "${ARM_MCPU}") + + # on some old GCC we need to read -march= + if (ARM_MARCH_FLAG AND NOT "${ARM_MARCH_FLAG}" STREQUAL "-march=native") + set(ARM_NATIVE_FLAG "${ARM_MARCH_FLAG}") + elseif(ARM_MCPU_FLAG AND NOT "${ARM_MCPU_FLAG}" STREQUAL "-mcpu=native") + set(ARM_NATIVE_FLAG "${ARM_MCPU_FLAG}") + endif() endif() - if ("${ARM_MCPU_FLAG}" STREQUAL "") - set(ARM_MCPU_FLAG -mcpu=native) - message(STATUS "ARM -mcpu not found, -mcpu=native will be used") + + if ("${ARM_NATIVE_FLAG}" STREQUAL "") + set(ARM_NATIVE_FLAG -mcpu=native) + message(WARNING "ARM -march/-mcpu not found, -mcpu=native will be used") + else() + message(STATUS "ARM detected flags: ${ARM_NATIVE_FLAG}") endif() include(CheckCXXSourceRuns) function(check_arm_feature tag code) set(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS}) - set(CMAKE_REQUIRED_FLAGS "${ARM_MCPU_FLAG}+${tag}") + set(CMAKE_REQUIRED_FLAGS "${ARM_NATIVE_FLAG}+${tag}") check_cxx_source_runs("${code}" GGML_MACHINE_SUPPORTS_${tag}) if (GGML_MACHINE_SUPPORTS_${tag}) - set(ARM_MCPU_FLAG_FIX "${ARM_MCPU_FLAG_FIX}+${tag}" PARENT_SCOPE) + set(ARM_NATIVE_FLAG_FIX "${ARM_NATIVE_FLAG_FIX}+${tag}" PARENT_SCOPE) else() - set(CMAKE_REQUIRED_FLAGS "${ARM_MCPU_FLAG}+no${tag}") + set(CMAKE_REQUIRED_FLAGS "${ARM_NATIVE_FLAG}+no${tag}") check_cxx_source_compiles("int main() { return 0; }" GGML_MACHINE_SUPPORTS_no${tag}) if (GGML_MACHINE_SUPPORTS_no${tag}) - set(ARM_MCPU_FLAG_FIX "${ARM_MCPU_FLAG_FIX}+no${tag}" PARENT_SCOPE) + set(ARM_NATIVE_FLAG_FIX "${ARM_NATIVE_FLAG_FIX}+no${tag}" PARENT_SCOPE) endif() endif() set(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE}) @@ -155,7 +166,7 @@ function(ggml_add_cpu_backend_variant_impl tag_name) check_arm_feature(sve "#include \nint main() { svfloat32_t _a, _b; volatile svfloat32_t _c = svadd_f32_z(svptrue_b8(), _a, _b); return 0; }") check_arm_feature(sme "#include \n__arm_locally_streaming int main() { __asm__ volatile(\"smstart; smstop;\"); return 0; }") - list(APPEND ARCH_FLAGS "${ARM_MCPU_FLAG}${ARM_MCPU_FLAG_FIX}") + list(APPEND ARCH_FLAGS "${ARM_NATIVE_FLAG}${ARM_NATIVE_FLAG_FIX}") else() if (GGML_CPU_ARM_ARCH) list(APPEND ARCH_FLAGS -march=${GGML_CPU_ARM_ARCH}) From 13730c183b9e1a32c09bf132b5367697d6c55048 Mon Sep 17 00:00:00 2001 From: Georgi Gerganov Date: Mon, 10 Nov 2025 21:33:35 +0200 Subject: [PATCH 149/185] metal : cap threadgroups size of set_rows (#17146) --- ggml/src/ggml-metal/ggml-metal-ops.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ggml/src/ggml-metal/ggml-metal-ops.cpp b/ggml/src/ggml-metal/ggml-metal-ops.cpp index 7a85edbdcdb..5a8f150a71d 100644 --- a/ggml/src/ggml-metal/ggml-metal-ops.cpp +++ b/ggml/src/ggml-metal/ggml-metal-ops.cpp @@ -1036,6 +1036,11 @@ int ggml_metal_op_set_rows(ggml_metal_op_t ctx, int idx) { nth = std::min(nth, nk0); + if (nth*nrptg > ggml_metal_pipeline_max_theads_per_threadgroup(pipeline)) { + nth = ggml_metal_pipeline_max_theads_per_threadgroup(pipeline); + nrptg = 1; + } + ggml_metal_kargs_set_rows args = { /*.nk0 =*/ nk0, /*.ne01 =*/ ne01, From 395e286bc9bc67f45f01dc951e2a408cca2a6b29 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Mon, 10 Nov 2025 12:44:49 -0800 Subject: [PATCH 150/185] cpu: skip NOPs to avoid barriers (#17133) * cpu: skip NOPs to avoid barriers * cpu: use ggml_op_is_empty --- ggml/src/ggml-cpu/ggml-cpu.c | 37 ++++++++++++++++++--------------- ggml/src/ggml-cpu/ops.cpp | 40 ------------------------------------ ggml/src/ggml-cpu/ops.h | 4 ---- 3 files changed, 21 insertions(+), 60 deletions(-) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index b5466dd703d..086708bae0b 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -1807,22 +1807,6 @@ static void ggml_compute_forward(struct ggml_compute_params * params, struct ggm { ggml_compute_forward_cont(params, tensor); } break; - case GGML_OP_RESHAPE: - { - ggml_compute_forward_reshape(params, tensor); - } break; - case GGML_OP_VIEW: - { - ggml_compute_forward_view(params, tensor); - } break; - case GGML_OP_PERMUTE: - { - ggml_compute_forward_permute(params, tensor); - } break; - case GGML_OP_TRANSPOSE: - { - ggml_compute_forward_transpose(params, tensor); - } break; case GGML_OP_GET_ROWS: { ggml_compute_forward_get_rows(params, tensor); @@ -2042,6 +2026,22 @@ static void ggml_compute_forward(struct ggml_compute_params * params, struct ggm { // nop } break; + case GGML_OP_RESHAPE: + { + // nop + } break; + case GGML_OP_PERMUTE: + { + // nop + } break; + case GGML_OP_VIEW: + { + // nop + } break; + case GGML_OP_TRANSPOSE: + { + // nop + } break; case GGML_OP_COUNT: { GGML_ABORT("fatal error"); @@ -2884,6 +2884,11 @@ static thread_ret_t ggml_graph_compute_thread(void * data) { for (int node_n = 0; node_n < cgraph->n_nodes && atomic_load_explicit(&tp->abort, memory_order_relaxed) != node_n; node_n++) { struct ggml_tensor * node = cgraph->nodes[node_n]; + if (ggml_op_is_empty(node->op)) { + // skip NOPs + continue; + } + ggml_compute_forward(¶ms, node); if (state->ith == 0 && cplan->abort_callback && diff --git a/ggml/src/ggml-cpu/ops.cpp b/ggml/src/ggml-cpu/ops.cpp index 8235f695943..7c42fb78b4a 100644 --- a/ggml/src/ggml-cpu/ops.cpp +++ b/ggml/src/ggml-cpu/ops.cpp @@ -4455,46 +4455,6 @@ void ggml_compute_forward_cont( ggml_compute_forward_dup(params, dst); } -// ggml_compute_forward_reshape - -void ggml_compute_forward_reshape( - const ggml_compute_params * params, - ggml_tensor * dst) { - // NOP - GGML_UNUSED(params); - GGML_UNUSED(dst); -} - -// ggml_compute_forward_view - -void ggml_compute_forward_view( - const ggml_compute_params * params, - ggml_tensor * dst) { - // NOP - GGML_UNUSED(params); - GGML_UNUSED(dst); -} - -// ggml_compute_forward_permute - -void ggml_compute_forward_permute( - const ggml_compute_params * params, - ggml_tensor * dst) { - // NOP - GGML_UNUSED(params); - GGML_UNUSED(dst); -} - -// ggml_compute_forward_transpose - -void ggml_compute_forward_transpose( - const ggml_compute_params * params, - ggml_tensor * dst) { - // NOP - GGML_UNUSED(params); - GGML_UNUSED(dst); -} - // ggml_compute_forward_get_rows static void ggml_compute_forward_get_rows_q( diff --git a/ggml/src/ggml-cpu/ops.h b/ggml/src/ggml-cpu/ops.h index 9824a03b458..2b4127c12b1 100644 --- a/ggml/src/ggml-cpu/ops.h +++ b/ggml/src/ggml-cpu/ops.h @@ -51,10 +51,6 @@ void ggml_compute_forward_scale(const struct ggml_compute_params * params, struc void ggml_compute_forward_set(const struct ggml_compute_params * params, struct ggml_tensor * dst); void ggml_compute_forward_cpy(const struct ggml_compute_params * params, struct ggml_tensor * dst); void ggml_compute_forward_cont(const struct ggml_compute_params * params, struct ggml_tensor * dst); -void ggml_compute_forward_reshape(const struct ggml_compute_params * params, struct ggml_tensor * dst); -void ggml_compute_forward_view(const struct ggml_compute_params * params, struct ggml_tensor * dst); -void ggml_compute_forward_permute(const struct ggml_compute_params * params, struct ggml_tensor * dst); -void ggml_compute_forward_transpose(const struct ggml_compute_params * params, struct ggml_tensor * dst); void ggml_compute_forward_get_rows(const struct ggml_compute_params * params, struct ggml_tensor * dst); void ggml_compute_forward_get_rows_back(const struct ggml_compute_params * params, struct ggml_tensor * dst); void ggml_compute_forward_set_rows(const struct ggml_compute_params * params, struct ggml_tensor * dst); From 7bef684118cc44f9ab8b82df102d68db94a6d9f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sigbj=C3=B8rn=20Skj=C3=A6ret?= Date: Mon, 10 Nov 2025 22:55:30 +0100 Subject: [PATCH 151/185] models : move build_inp_out_ids outside loop (#17151) * move build_inp_out_ids outside loop * realign --- src/models/ernie4-5.cpp | 9 ++++----- src/models/openai-moe-iswa.cpp | 3 ++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/models/ernie4-5.cpp b/src/models/ernie4-5.cpp index 99962af111f..99aead53283 100644 --- a/src/models/ernie4-5.cpp +++ b/src/models/ernie4-5.cpp @@ -1,7 +1,5 @@ #include "models.h" - - llm_build_ernie4_5::llm_build_ernie4_5(const llama_model & model, const llm_graph_params & params) : llm_graph_context(params) { const int64_t n_embd_head = hparams.n_embd_head_v; @@ -19,6 +17,8 @@ llm_build_ernie4_5::llm_build_ernie4_5(const llama_model & model, const llm_grap auto * inp_attn = build_attn_inp_kv(); + ggml_tensor * inp_out_ids = build_inp_out_ids(); + for (int il = 0; il < n_layer; ++il) { ggml_tensor * inpSA = inpL; @@ -67,9 +67,8 @@ llm_build_ernie4_5::llm_build_ernie4_5(const llama_model & model, const llm_grap } if (il == n_layer - 1) { // skip computing output for unused tokens - ggml_tensor * inp_out_ids = build_inp_out_ids(); - cur = ggml_get_rows(ctx0, cur, inp_out_ids); - inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); + cur = ggml_get_rows(ctx0, cur, inp_out_ids); + inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); } ggml_tensor * ffn_inp = ggml_add(ctx0, cur, inpSA); cb(ffn_inp, "ffn_inp", il); diff --git a/src/models/openai-moe-iswa.cpp b/src/models/openai-moe-iswa.cpp index 3c0c0eecf5d..96596709eec 100644 --- a/src/models/openai-moe-iswa.cpp +++ b/src/models/openai-moe-iswa.cpp @@ -11,6 +11,8 @@ llm_build_openai_moe_iswa::llm_build_openai_moe_iswa(const llama_model & model, auto * inp_attn = build_attn_inp_kv_iswa(); + ggml_tensor * inp_out_ids = build_inp_out_ids(); + for (int il = 0; il < n_layer; ++il) { ggml_tensor * inpSA = inpL; @@ -69,7 +71,6 @@ llm_build_openai_moe_iswa::llm_build_openai_moe_iswa(const llama_model & model, } if (il == n_layer - 1) { // skip computing output for unused tokens - ggml_tensor * inp_out_ids = build_inp_out_ids(); cur = ggml_get_rows(ctx0, cur, inp_out_ids); inpSA = ggml_get_rows(ctx0, inpSA, inp_out_ids); } From ece0f5c1771f1835e66900d4168233f0430d819d Mon Sep 17 00:00:00 2001 From: lhez Date: Mon, 10 Nov 2025 15:00:13 -0800 Subject: [PATCH 152/185] opencl: add fastdiv and use it in set_rows, ported from cuda (#17090) * opencl: add fastdiv for mm q8_0 * opencl: use uint4 for fastdiv vals * opencl: use fastdiv for set_rows * opencl: do not use fastdiv for q8_0 mm --- ggml/src/ggml-opencl/ggml-opencl.cpp | 38 +++++++++++++++++- ggml/src/ggml-opencl/kernels/set_rows.cl | 51 ++++++++++++++++-------- 2 files changed, 71 insertions(+), 18 deletions(-) diff --git a/ggml/src/ggml-opencl/ggml-opencl.cpp b/ggml/src/ggml-opencl/ggml-opencl.cpp index 1d3a318a569..465272fab90 100644 --- a/ggml/src/ggml-opencl/ggml-opencl.cpp +++ b/ggml/src/ggml-opencl/ggml-opencl.cpp @@ -53,6 +53,37 @@ bool ggml_cl_compute_forward(ggml_backend_t backend, struct ggml_tensor * tensor); +// See https://gmplib.org/~tege/divcnst-pldi94.pdf figure 4.1. +// Precompute mp (m' in the paper) and L such that division +// can be computed using a multiply (high 32b of 64b result) +// and a shift: +// +// n/d = (mulhi(n, mp) + n) >> L; +struct fastdiv_vals { + uint32_t mp; + uint32_t L; + uint32_t d; + uint32_t pad; +}; +static_assert(sizeof(fastdiv_vals) == 16, "fastdiv_vals size incorrect"); + +static fastdiv_vals init_fastdiv_values(uint64_t d_64) { + GGML_ASSERT(d_64 != 0); + GGML_ASSERT(d_64 <= std::numeric_limits::max()); + + uint32_t d = (uint32_t)d_64; + + // compute L = ceil(log2(d)); + uint32_t L = 0; + while (L < 32 && (uint32_t{ 1 } << L) < d) { + L++; + } + + uint32_t mp = (uint32_t) ((uint64_t{ 1 } << 32) * ((uint64_t{ 1 } << L) - d) / d + 1); + // pack divisor as well to reduce error surface + return { mp, L, d, 0 }; +} + enum GPU_FAMILY { ADRENO, INTEL, @@ -4464,6 +4495,9 @@ static void ggml_cl_set_rows(ggml_backend_t backend, const ggml_tensor * src0, c GGML_ABORT("not implemented"); } + fastdiv_vals ne11_ = init_fastdiv_values(ne11); + fastdiv_vals ne12_ = init_fastdiv_values(ne12); + CL_CHECK(clSetKernelArg(kernel, 0, sizeof(cl_mem), &extra0->data_device)); CL_CHECK(clSetKernelArg(kernel, 1, sizeof(cl_ulong), &offset0)); CL_CHECK(clSetKernelArg(kernel, 2, sizeof(cl_mem), &extra1->data_device)); @@ -4474,8 +4508,8 @@ static void ggml_cl_set_rows(ggml_backend_t backend, const ggml_tensor * src0, c CL_CHECK(clSetKernelArg(kernel, 7, sizeof(cl_ulong), &nb01)); CL_CHECK(clSetKernelArg(kernel, 8, sizeof(cl_ulong), &nb02)); CL_CHECK(clSetKernelArg(kernel, 9, sizeof(cl_ulong), &nb03)); - CL_CHECK(clSetKernelArg(kernel, 10, sizeof(int), &ne11)); - CL_CHECK(clSetKernelArg(kernel, 11, sizeof(int), &ne12)); + CL_CHECK(clSetKernelArg(kernel, 10, sizeof(fastdiv_vals), &ne11_)); + CL_CHECK(clSetKernelArg(kernel, 11, sizeof(fastdiv_vals), &ne12_)); CL_CHECK(clSetKernelArg(kernel, 12, sizeof(cl_ulong), &nb10)); CL_CHECK(clSetKernelArg(kernel, 13, sizeof(cl_ulong), &nb11)); CL_CHECK(clSetKernelArg(kernel, 14, sizeof(cl_ulong), &nb12)); diff --git a/ggml/src/ggml-opencl/kernels/set_rows.cl b/ggml/src/ggml-opencl/kernels/set_rows.cl index dcdc1d1b6fd..fc3ff7aa1e7 100644 --- a/ggml/src/ggml-opencl/kernels/set_rows.cl +++ b/ggml/src/ggml-opencl/kernels/set_rows.cl @@ -1,5 +1,16 @@ #pragma OPENCL EXTENSION cl_khr_fp16 : enable +// v = { mp, L, d } +inline uint fastdiv(uint n, uint4 v) { + uint msbs; + msbs = mul_hi(n, v.s0); + return (msbs + n) >> v.s1; +} +inline uint fastmod(uint n, uint4 v) { + uint q = fastdiv(n, v); + return n - q * v.s2; +} + kernel void kernel_set_rows_f32_i64( global char * src0, ulong offset0, @@ -11,8 +22,8 @@ kernel void kernel_set_rows_f32_i64( ulong nb01, ulong nb02, ulong nb03, - int ne11, - int ne12, + uint4 ne11, + uint4 ne12, ulong nb10, ulong nb11, ulong nb12, @@ -33,8 +44,10 @@ kernel void kernel_set_rows_f32_i64( return; } - int i12 = i03%ne12; - int i11 = i02%ne11; + //int i12 = i03%ne12; + //int i11 = i02%ne11; + int i12 = fastmod(i03, ne12); + int i11 = fastmod(i02, ne11); int i10 = i01; long i1 = ((global long *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0]; @@ -58,8 +71,8 @@ kernel void kernel_set_rows_f16_i64( ulong nb01, ulong nb02, ulong nb03, - int ne11, - int ne12, + uint4 ne11, + uint4 ne12, ulong nb10, ulong nb11, ulong nb12, @@ -80,8 +93,10 @@ kernel void kernel_set_rows_f16_i64( return; } - int i12 = i03%ne12; - int i11 = i02%ne11; + //int i12 = i03%ne12; + //int i11 = i02%ne11; + int i12 = fastmod(i03, ne12); + int i11 = fastmod(i02, ne11); int i10 = i01; long i1 = ((global long *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0]; @@ -105,8 +120,8 @@ kernel void kernel_set_rows_f32_i32( ulong nb01, ulong nb02, ulong nb03, - int ne11, - int ne12, + uint4 ne11, + uint4 ne12, ulong nb10, ulong nb11, ulong nb12, @@ -127,8 +142,10 @@ kernel void kernel_set_rows_f32_i32( return; } - int i12 = i03%ne12; - int i11 = i02%ne11; + //int i12 = i03%ne12; + //int i11 = i02%ne11; + int i12 = fastmod(i03, ne12); + int i11 = fastmod(i02, ne11); int i10 = i01; int i1 = ((global int *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0]; @@ -152,8 +169,8 @@ kernel void kernel_set_rows_f16_i32( ulong nb01, ulong nb02, ulong nb03, - int ne11, - int ne12, + uint4 ne11, + uint4 ne12, ulong nb10, ulong nb11, ulong nb12, @@ -174,8 +191,10 @@ kernel void kernel_set_rows_f16_i32( return; } - int i12 = i03%ne12; - int i11 = i02%ne11; + //int i12 = i03%ne12; + //int i11 = i02%ne11; + int i12 = fastmod(i03, ne12); + int i11 = fastmod(i02, ne11); int i10 = i01; int i1 = ((global int *)(src1 + i10*nb10 + i11*nb11 + i12*nb12))[0]; From 2fc392ce358ac56a198a658ea30467b91ea95685 Mon Sep 17 00:00:00 2001 From: levkropp Date: Tue, 11 Nov 2025 03:38:30 -0500 Subject: [PATCH 153/185] convert : register UMT5Model architecture for T5 conversion (#17160) Register UMT5Model as a supported architecture variant for T5 model conversion. This allows the conversion to work for models downloaded with AutoModel. --- convert_hf_to_gguf.py | 1 + 1 file changed, 1 insertion(+) diff --git a/convert_hf_to_gguf.py b/convert_hf_to_gguf.py index 13448fd6811..cc77a3db273 100755 --- a/convert_hf_to_gguf.py +++ b/convert_hf_to_gguf.py @@ -7354,6 +7354,7 @@ def prepare_tensors(self): @ModelBase.register("T5ForConditionalGeneration") @ModelBase.register("MT5ForConditionalGeneration") @ModelBase.register("UMT5ForConditionalGeneration") +@ModelBase.register("UMT5Model") class T5Model(TextModel): model_arch = gguf.MODEL_ARCH.T5 From d2d626938aa7b0137df6a808e0637151806a9d5a Mon Sep 17 00:00:00 2001 From: "Nicolas B. Pierron" Date: Tue, 11 Nov 2025 11:53:59 +0100 Subject: [PATCH 154/185] Install rpc-server when GGML_RPC is ON. (#17149) --- .devops/nix/package.nix | 2 ++ tools/rpc/CMakeLists.txt | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/.devops/nix/package.nix b/.devops/nix/package.nix index 41748e89d5c..a13996bd68d 100644 --- a/.devops/nix/package.nix +++ b/.devops/nix/package.nix @@ -34,6 +34,7 @@ rocmGpuTargets ? builtins.concatStringsSep ";" rocmPackages.clr.gpuTargets, enableCurl ? true, useVulkan ? false, + useRpc ? false, llamaVersion ? "0.0.0", # Arbitrary version, substituted by the flake # It's necessary to consistently use backendStdenv when building with CUDA support, @@ -175,6 +176,7 @@ effectiveStdenv.mkDerivation (finalAttrs: { (cmakeBool "GGML_METAL" useMetalKit) (cmakeBool "GGML_VULKAN" useVulkan) (cmakeBool "GGML_STATIC" enableStatic) + (cmakeBool "GGML_RPC" useRpc) ] ++ optionals useCuda [ ( diff --git a/tools/rpc/CMakeLists.txt b/tools/rpc/CMakeLists.txt index c2c74814864..20f114ad9ba 100644 --- a/tools/rpc/CMakeLists.txt +++ b/tools/rpc/CMakeLists.txt @@ -2,3 +2,7 @@ set(TARGET rpc-server) add_executable(${TARGET} rpc-server.cpp) target_link_libraries(${TARGET} PRIVATE ggml) target_compile_features(${TARGET} PRIVATE cxx_std_17) + +if(LLAMA_TOOLS_INSTALL) + install(TARGETS ${TARGET} RUNTIME) +endif() From 4a5b8aff40277071dbb98e81b5d0cbbbd3c37283 Mon Sep 17 00:00:00 2001 From: Mike Abbott Date: Tue, 11 Nov 2025 04:19:50 -0700 Subject: [PATCH 155/185] cmake : add version to all shared object files (#17091) When compiling llama.cpp in Yocto, it fails QA checks because the generated so files aren't versioned. This applies a version to all generated so files, allowing the package to build without errors. --- ggml/src/CMakeLists.txt | 16 ++++++++++++++++ src/CMakeLists.txt | 5 +++++ tools/mtmd/CMakeLists.txt | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/ggml/src/CMakeLists.txt b/ggml/src/CMakeLists.txt index f30e4ac9020..628db3fd655 100644 --- a/ggml/src/CMakeLists.txt +++ b/ggml/src/CMakeLists.txt @@ -211,6 +211,11 @@ add_library(ggml-base ggml-quants.h gguf.cpp) +set_target_properties(ggml-base PROPERTIES + VERSION ${GGML_VERSION} + SOVERSION ${GGML_VERSION_MAJOR} +) + target_include_directories(ggml-base PRIVATE .) if (GGML_BACKEND_DL) target_compile_definitions(ggml-base PUBLIC GGML_BACKEND_DL) @@ -220,6 +225,11 @@ add_library(ggml ggml-backend-reg.cpp) add_library(ggml::ggml ALIAS ggml) +set_target_properties(ggml PROPERTIES + VERSION ${GGML_VERSION} + SOVERSION ${GGML_VERSION_MAJOR} +) + if (GGML_BACKEND_DIR) if (NOT GGML_BACKEND_DL) message(FATAL_ERROR "GGML_BACKEND_DIR requires GGML_BACKEND_DL") @@ -259,6 +269,12 @@ function(ggml_add_backend_library backend) target_compile_definitions(${backend} PUBLIC GGML_BACKEND_SHARED) endif() + # Set versioning properties for all backend libraries + set_target_properties(${backend} PROPERTIES + VERSION ${GGML_VERSION} + SOVERSION ${GGML_VERSION_MAJOR} + ) + if(NOT GGML_AVAILABLE_BACKENDS) set(GGML_AVAILABLE_BACKENDS "${backend}" CACHE INTERNAL "List of backends for cmake package") diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 630b2cddf67..6fc5b001010 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -132,6 +132,11 @@ add_library(llama models/graph-context-mamba.cpp ) +set_target_properties(llama PROPERTIES + VERSION ${LLAMA_INSTALL_VERSION} + SOVERSION 0 +) + target_include_directories(llama PRIVATE .) target_include_directories(llama PUBLIC ../include) target_compile_features (llama PRIVATE cxx_std_17) # don't bump diff --git a/tools/mtmd/CMakeLists.txt b/tools/mtmd/CMakeLists.txt index 2381012a0d0..f640ae2a6ea 100644 --- a/tools/mtmd/CMakeLists.txt +++ b/tools/mtmd/CMakeLists.txt @@ -13,6 +13,11 @@ add_library(mtmd mtmd-helper.h ) +set_target_properties(mtmd PROPERTIES + VERSION ${LLAMA_INSTALL_VERSION} + SOVERSION 0 +) + target_link_libraries (mtmd PUBLIC ggml llama) target_link_libraries (mtmd PRIVATE Threads::Threads) target_include_directories(mtmd PUBLIC .) From 8c583242adfe09cbf35e41353aa01fb96da301a0 Mon Sep 17 00:00:00 2001 From: Charles Xu Date: Tue, 11 Nov 2025 12:20:31 +0100 Subject: [PATCH 156/185] kleidiai: add optimized per-channel kernels for Q8_0 (#16993) --- ggml/src/ggml-cpu/CMakeLists.txt | 18 +- ggml/src/ggml-cpu/kleidiai/kernels.cpp | 283 ++++++++++++++++++++++++ ggml/src/ggml-cpu/kleidiai/kernels.h | 1 + ggml/src/ggml-cpu/kleidiai/kleidiai.cpp | 269 +++++++++++++++++++--- 4 files changed, 534 insertions(+), 37 deletions(-) diff --git a/ggml/src/ggml-cpu/CMakeLists.txt b/ggml/src/ggml-cpu/CMakeLists.txt index a55191aede9..e52e050a81a 100644 --- a/ggml/src/ggml-cpu/CMakeLists.txt +++ b/ggml/src/ggml-cpu/CMakeLists.txt @@ -590,6 +590,7 @@ function(ggml_add_cpu_backend_variant_impl tag_name) ${KLEIDIAI_SRC}/kai/ukernels/ ${KLEIDIAI_SRC}/kai/ukernels/matmul/ ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/ + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/ ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_fp32_bf16p_bf16p/ ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/) @@ -608,23 +609,34 @@ function(ggml_add_cpu_backend_variant_impl tag_name) ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_lhs_quant_pack_qsi8d32p4x8sb_f32_neon.c ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon.c ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_lhs_quant_pack_qsi8d32p_f32_neon.c - ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0.c) + ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_lhs_quant_pack_qai8dxp_f32.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_rhs_pack_nxk_qsi8cxp_qsi8cx_neon.c) if (NOT DOTPROD_ENABLED MATCHES -1) list(APPEND GGML_KLEIDIAI_SOURCES ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod.c ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod.c - ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod.c) + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod.c) endif() if (NOT I8MM_ENABLED MATCHES -1) - list(APPEND GGML_KLEIDIAI_SOURCES ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm.c) + list(APPEND GGML_KLEIDIAI_SOURCES + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p4x8_qsi4c32p4x8_16x4_neon_i8mm.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm.c) endif() if (NOT SME_ENABLED MATCHES -1) list(APPEND GGML_KLEIDIAI_SOURCES ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1vlx4_qsi4c32p4vlx4_1vlx4vl_sme2_mopa.c ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qsi8d32p_qsi4c32p/kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa_asm.S + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot.c + ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_f32_qai8dxp_qsi8cxp/kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot_asm.S ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_fp32_bf16p_bf16p/kai_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa.c ${KLEIDIAI_SRC}/kai/ukernels/matmul/matmul_clamp_fp32_bf16p_bf16p/kai_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa_asm.S ${KLEIDIAI_SRC}/kai/ukernels/matmul/pack/kai_lhs_pack_bf16p2vlx2_f32_sme.c diff --git a/ggml/src/ggml-cpu/kleidiai/kernels.cpp b/ggml/src/ggml-cpu/kleidiai/kernels.cpp index 3eaa5e3f410..1d5b44f9fe3 100644 --- a/ggml/src/ggml-cpu/kleidiai/kernels.cpp +++ b/ggml/src/ggml-cpu/kleidiai/kernels.cpp @@ -4,6 +4,7 @@ // KleidiAI micro-kernels #include "kai_matmul_clamp_f32_qsi8d32p_qsi4c32p_interface.h" +#include "kai_matmul_clamp_f32_qai8dxp_qsi8cxp_interface.h" #include "kai_matmul_clamp_f32_qsi8d32p1x8_qsi4c32p4x8_1x4x32_neon_dotprod.h" #include "kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4x4_1x4_neon_dotprod.h" #include "kai_matmul_clamp_f32_qsi8d32p4x4_qsi4c32p4x4_16x4_neon_dotprod.h" @@ -11,20 +12,31 @@ #include "kai_matmul_clamp_f32_qsi8d32p1vlx4_qsi4c32p4vlx4_1vlx4vl_sme2_mopa.h" #include "kai_matmul_clamp_f32_qsi8d32p1x4_qsi4c32p4vlx4_1x4vl_sme2_sdot.h" #include "kai_matmul_clamp_f32_bf16p2vlx2_bf16p2vlx2_2vlx2vl_sme2_mopa.h" +#include "kai_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa.h" +#include "kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot.h" +#include "kai_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod.h" +#include "kai_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod.h" +#include "kai_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod.h" +#include "kai_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm.h" #include "kai_lhs_pack_bf16p2vlx2_f32_sme.h" #include "kai_lhs_quant_pack_qsi8d32p_f32.h" #include "kai_lhs_quant_pack_qsi8d32p4x8sb_f32_neon.h" #include "kai_lhs_quant_pack_qsi8d32p_f32_neon.h" +#include "kai_lhs_quant_pack_qai8dxp_f32.h" #include "kai_rhs_pack_kxn_bf16p2vlx2b_f32_x32_sme.h" #include "kai_rhs_pack_nxk_qsi4c32pscalef16_qsu4c32s16s0.h" #include "kai_rhs_pack_nxk_qsi4c32ps1s0scalef16_qsu4c32s16s0_neon.h" +#include "kai_rhs_pack_nxk_qsi8cxp_qsi8cx_neon.h" #include "kai_common.h" #include "simd-mappings.h" +#define GGML_COMMON_DECL_CPP +#include "ggml-common.h" + #include "kernels.h" #define NELEMS(x) sizeof(x) / sizeof(*x) @@ -55,6 +67,14 @@ static inline void kernel_run_fn10(size_t m, size_t n, size_t k, size_t /*bl*/, Fn(m, n, k, lhs, rhs, dst, dst_stride_row, dst_stride_col, clamp_min, clamp_max); } +template +static inline void kernel_run_float_fn10(size_t m, size_t n, size_t k, size_t /*bl*/, + const void* lhs, const void* rhs, void* dst, + size_t dst_stride_row, size_t dst_stride_col, + float clamp_min, float clamp_max) { + Fn(m, n, k, lhs, rhs, static_cast(dst), dst_stride_row, dst_stride_col, clamp_min, clamp_max); +} + template static inline size_t lhs_ps_fn6(size_t m, size_t k, size_t bl, size_t mr, size_t kr, size_t sr) { return Fn(m, k, bl, mr, kr, sr); @@ -93,6 +113,12 @@ static inline void lhs_pack_void_fn9(size_t m, size_t k, size_t /*bl*/, size_t m Fn(m, k, mr, kr, sr, m_idx_start, lhs, lhs_stride, lhs_packed); } +template +static inline void lhs_pack_float_fn9_no_bl(size_t m, size_t k, size_t /*bl*/, size_t mr, size_t kr, size_t sr, + size_t m_idx_start, const void * lhs, size_t lhs_stride, void * lhs_packed) { + Fn(m, k, mr, kr, sr, m_idx_start, static_cast(lhs), lhs_stride, lhs_packed); +} + template static inline size_t rhs_ps_fn5(size_t n, size_t k, size_t nr, size_t kr, size_t bl) { return Fn(n, k, nr, kr, bl); @@ -124,6 +150,18 @@ static inline void rhs_pack_fn12(size_t num_groups, size_t n, size_t k, size_t n static_cast(params)); } +template +static inline void rhs_pack_scale_fn12(size_t num_groups, size_t n, size_t k, size_t nr, size_t kr, size_t sr, size_t /*bl*/, + size_t /*rhs_stride*/, const void* rhs, const void* bias, const void* scale, + void* rhs_packed, size_t extra_bytes, const void* params) { + Fn(num_groups, n, k, nr, kr, sr, + static_cast(rhs), + static_cast(bias), + static_cast(scale), + rhs_packed, extra_bytes, + static_cast(params)); +} + template static inline void rhs_pack_fn13(size_t num_groups, size_t n, size_t k, size_t nr, size_t kr, size_t sr, size_t /*bl*/, size_t rhs_stride, const void* rhs, const void* bias, const void* scale, @@ -213,6 +251,57 @@ static void dequantize_row_qsi4c32ps1s0scalef16( GGML_UNUSED(kr); } +static void dequantize_row_qsi8cxp( + const void *packed_data, + int32_t row_idx, + int64_t k, + float *out, + size_t nr, + size_t packed_row_stride, + size_t kr, + size_t bl, + size_t num_bytes_multiplier +) { + GGML_UNUSED(bl); + GGML_UNUSED(num_bytes_multiplier); + + const size_t k_internal = ((size_t) k + QK8_0 - 1) / QK8_0 * QK8_0; + const size_t group_idx = row_idx / nr; + const size_t row_in_group = row_idx % nr; + + const uint8_t * group_ptr = static_cast(packed_data) + group_idx * packed_row_stride; + const int8_t * data_base = reinterpret_cast(group_ptr); + + const size_t num_blocks = k_internal / kr; + + for (size_t block = 0; block < num_blocks; ++block) { + const int8_t * block_ptr = data_base + (block * nr + row_in_group) * kr; + for (size_t i = 0; i < kr; ++i) { + const size_t k_idx = block * kr + i; + if (k_idx < (size_t) k) { + out[k_idx] = static_cast(block_ptr[i]); + } + } + } + + const uint8_t * sums_ptr = group_ptr + nr * k_internal; + GGML_UNUSED(sums_ptr); + + const float * scale_ptr = reinterpret_cast(sums_ptr + nr * sizeof(int32_t)); + const float scale = scale_ptr[row_in_group]; + + if (scale == 0.0f) { + for (size_t i = 0; i < (size_t) k; ++i) { + out[i] = 0.0f; + } + return; + } + + for (size_t i = 0; i < (size_t) k; ++i) { + out[i] *= scale; + } +} + static ggml_kleidiai_kernels gemm_gemv_kernels[] = { #if defined(__ARM_FEATURE_SME) { @@ -548,6 +637,174 @@ static ggml_kleidiai_kernels gemm_gemv_kernels[] = { #endif }; +static ggml_kleidiai_kernels gemm_gemv_kernels_q8[] = { +#if defined(__ARM_FEATURE_SME) + { + /* SME GEMM */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1vlx4_qsi8cxp4vlx4_1vlx4vl_sme2_mopa, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemm_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* SME GEMV */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4vlx4_1x4vl_sme2_dot, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemv_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* .rhs_info = */ { + /* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon, + /* .to_float = */ dequantize_row_qsi8cxp, + /* .packed_size_ex = */ &rhs_ps_fn5, + /* .packed_stride_ex = */ &rhs_stride_fn4, + /* .pack_func_ex = */ &rhs_pack_scale_fn12, + }, + /* .required_cpu = */ CPU_FEATURE_SME, + /* .lhs_type = */ GGML_TYPE_F32, + /* .rhs_type = */ GGML_TYPE_Q8_0, + /* .op_type = */ GGML_TYPE_F32, + }, +#endif +#if defined(__ARM_FEATURE_MATMUL_INT8) + { + /* I8MM GEMM */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp4x8_qsi8cxp4x8_16x4_neon_i8mm, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemm_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* I8MM GEMV (dotprod fallback) */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x8_qsi8cxp4x8_1x4_neon_dotprod, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemv_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* .rhs_info = */ { + /* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon, + /* .to_float = */ dequantize_row_qsi8cxp, + /* .packed_size_ex = */ &rhs_ps_fn5, + /* .packed_stride_ex = */ &rhs_stride_fn4, + /* .pack_func_ex = */ &rhs_pack_scale_fn12, + }, + /* .required_cpu = */ CPU_FEATURE_DOTPROD | CPU_FEATURE_I8MM, + /* .lhs_type = */ GGML_TYPE_F32, + /* .rhs_type = */ GGML_TYPE_Q8_0, + /* .op_type = */ GGML_TYPE_F32, + }, +#endif +#if defined(__ARM_FEATURE_DOTPROD) + { + /* DOTPROD GEMM */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp4x4_qsi8cxp4x4_16x4_neon_dotprod, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemm_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* DOTPROD GEMV */ + { + /* .get_m_step = */ kai_get_m_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_n_step = */ kai_get_n_step_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_mr = */ kai_get_mr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_nr = */ kai_get_nr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_kr = */ kai_get_kr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_sr = */ kai_get_sr_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_dst_offset = */ kai_get_dst_offset_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_dst_size = */ kai_get_dst_size_matmul_clamp_f32_qai8dxp1x4_qsi8cxp4x4_1x4_neon_dotprod, + /* .get_lhs_offset_ex = */ &kernel_offs_fn2, + /* .get_rhs_packed_offset_ex = */ &kernel_offs_fn2, + /* .run_kernel_ex = */ &kernel_run_float_fn10, + }, + /* .gemv_lhs_info = */ { + /* .get_offset = */ kai_get_lhs_offset_lhs_quant_pack_qai8dxp_f32, + /* .get_packed_offset_ex = */ &lhs_offs_fn5, + /* .packed_size_ex = */ &lhs_ps_fn5, + /* .pack_func_ex = */ &lhs_pack_float_fn9_no_bl, + }, + /* .rhs_info = */ { + /* .packed_stride = */ kai_get_rhs_packed_stride_rhs_pack_nxk_qsi8cxp_qsi8cx_neon, + /* .to_float = */ dequantize_row_qsi8cxp, + /* .packed_size_ex = */ &rhs_ps_fn5, + /* .packed_stride_ex = */ &rhs_stride_fn4, + /* .pack_func_ex = */ &rhs_pack_scale_fn12, + }, + /* .required_cpu = */ CPU_FEATURE_DOTPROD, + /* .lhs_type = */ GGML_TYPE_F32, + /* .rhs_type = */ GGML_TYPE_Q8_0, + /* .op_type = */ GGML_TYPE_F32, + }, +#endif +}; + ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, const ggml_tensor * tensor) { ggml_kleidiai_kernels * kernel = nullptr; @@ -562,6 +819,17 @@ ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, c break; } } + if (!kernel) { + for (size_t i = 0; i < NELEMS(gemm_gemv_kernels_q8); ++i) { + if ((cpu_features & gemm_gemv_kernels_q8[i].required_cpu) == gemm_gemv_kernels_q8[i].required_cpu && + gemm_gemv_kernels_q8[i].lhs_type == tensor->src[1]->type && + gemm_gemv_kernels_q8[i].rhs_type == tensor->src[0]->type && + gemm_gemv_kernels_q8[i].op_type == tensor->type) { + kernel = &gemm_gemv_kernels_q8[i]; + break; + } + } + } #endif } @@ -582,3 +850,18 @@ ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q4_0(cpu_feature features) return kernels; } + +ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q8_0(cpu_feature features) { + ggml_kleidiai_kernels * kernels = nullptr; + +#if defined(__ARM_FEATURE_SME) || defined(__ARM_FEATURE_DOTPROD) || defined(__ARM_FEATURE_MATMUL_INT8) + for (size_t i = 0; i < NELEMS(gemm_gemv_kernels_q8); ++i) { + if ((features & gemm_gemv_kernels_q8[i].required_cpu) == gemm_gemv_kernels_q8[i].required_cpu) { + kernels = &gemm_gemv_kernels_q8[i]; + break; + } + } +#endif + + return kernels; +} diff --git a/ggml/src/ggml-cpu/kleidiai/kernels.h b/ggml/src/ggml-cpu/kleidiai/kernels.h index a84795a6b2e..129245400b4 100644 --- a/ggml/src/ggml-cpu/kleidiai/kernels.h +++ b/ggml/src/ggml-cpu/kleidiai/kernels.h @@ -87,3 +87,4 @@ struct ggml_kleidiai_kernels { ggml_kleidiai_kernels * ggml_kleidiai_select_kernels(cpu_feature cpu_features, const ggml_tensor * tensor); ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q4_0(cpu_feature features); +ggml_kleidiai_kernels * ggml_kleidiai_select_kernels_q8_0(cpu_feature features); diff --git a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp index 8b3df7d7800..6f2a90fbda7 100644 --- a/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp +++ b/ggml/src/ggml-cpu/kleidiai/kleidiai.cpp @@ -5,10 +5,13 @@ #include #include #include +#include +#include #include #include #include #include +#include #if defined(__linux__) #include #include @@ -38,8 +41,9 @@ struct ggml_kleidiai_context { cpu_feature features; - ggml_kleidiai_kernels * kernels; -} static ctx = { CPU_FEATURE_NONE, NULL }; + ggml_kleidiai_kernels * kernels_q4; + ggml_kleidiai_kernels * kernels_q8; +} static ctx = { CPU_FEATURE_NONE, NULL, NULL }; static const char* cpu_feature_to_string(cpu_feature f) { switch (f) { @@ -73,10 +77,14 @@ static void init_kleidiai_context(void) { if (sme_enabled != 0) { ctx.features |= ggml_cpu_has_sme() ? CPU_FEATURE_SME : CPU_FEATURE_NONE; } - ctx.kernels = ggml_kleidiai_select_kernels_q4_0(ctx.features); + ctx.kernels_q4 = ggml_kleidiai_select_kernels_q4_0(ctx.features); + ctx.kernels_q8 = ggml_kleidiai_select_kernels_q8_0(ctx.features); #ifndef NDEBUG - if (ctx.kernels) { - GGML_LOG_DEBUG("kleidiai: using kernel with CPU feature %s\n", cpu_feature_to_string(ctx.kernels->required_cpu)); + if (ctx.kernels_q4) { + GGML_LOG_DEBUG("kleidiai: using q4 kernel with CPU feature %s\n", cpu_feature_to_string(ctx.kernels_q4->required_cpu)); + } + if (ctx.kernels_q8) { + GGML_LOG_DEBUG("kleidiai: using q8 kernel with CPU feature %s\n", cpu_feature_to_string(ctx.kernels_q8->required_cpu)); } #endif } @@ -130,6 +138,9 @@ class tensor_traits : public ggml::cpu::tensor_traits { if (kernels->rhs_type == GGML_TYPE_Q4_0) { if (!lhs_info->packed_size_ex) return false; size = lhs_info->packed_size_ex(m, k, QK4_0, mr, kr, sr); + } else if (kernels->rhs_type == GGML_TYPE_Q8_0) { + if (!lhs_info->packed_size_ex) return false; + size = lhs_info->packed_size_ex(m, k, QK8_0, mr, kr, sr); } else if (kernels->rhs_type == GGML_TYPE_F16) { if (!lhs_info->packed_size_ex || !kernels->rhs_info.packed_size_ex) return false; const int64_t lhs_batch_size0 = op->src[1]->ne[2]; @@ -149,11 +160,13 @@ class tensor_traits : public ggml::cpu::tensor_traits { if (dst->op == GGML_OP_MUL_MAT) { if (dst->src[0]->type == GGML_TYPE_Q4_0) { return compute_forward_q4_0(params, dst); + } else if (dst->src[0]->type == GGML_TYPE_Q8_0) { + return compute_forward_q8_0(params, dst); } else if (dst->src[0]->type == GGML_TYPE_F16) { return compute_forward_fp16(params, dst); } } else if (dst->op == GGML_OP_GET_ROWS) { - if (dst->src[0]->type == GGML_TYPE_Q4_0) { + if (dst->src[0]->type == GGML_TYPE_Q4_0 || dst->src[0]->type == GGML_TYPE_Q8_0) { return compute_forward_get_rows(params, dst); } } @@ -400,19 +413,120 @@ class tensor_traits : public ggml::cpu::tensor_traits { return true; } - bool compute_forward_get_rows(struct ggml_compute_params * params, struct ggml_tensor * dst) { - GGML_ASSERT(dst->src[0]->type == GGML_TYPE_Q4_0); - if (!ctx.kernels) { + bool compute_forward_q8_0(struct ggml_compute_params * params, struct ggml_tensor * dst) { + GGML_ASSERT(dst->src[0]->type == GGML_TYPE_Q8_0); + + const ggml_tensor * src0 = dst->src[0]; + const ggml_tensor * src1 = dst->src[1]; + + GGML_TENSOR_BINARY_OP_LOCALS + + ggml_kleidiai_kernels *kernels = ggml_kleidiai_select_kernels(ctx.features, dst); + if (!kernels) { return false; } + bool is_gemv = src1->ne[1] == 1; + kernel_info * kernel = is_gemv ? &kernels->gemv : &kernels->gemm; + lhs_packing_info * lhs_info = is_gemv ? &kernels->gemv_lhs_info : &kernels->gemm_lhs_info; + + if (!kernel || !lhs_info->get_packed_offset_ex || !lhs_info->pack_func_ex || + !kernel->get_rhs_packed_offset_ex || !kernel->run_kernel_ex || !kernel->get_dst_offset) { + return false; + } + + const int ith = params->ith; + const int nth_raw = params->nth; + const int nth = nth_raw > 0 ? nth_raw : 1; + + const size_t k = ne00; + const size_t m = ne11; + const size_t n = ne01; + + size_t mr = kernel->get_mr(); + size_t kr = kernel->get_kr(); + size_t sr = kernel->get_sr(); + + const uint8_t * lhs = static_cast(src1->data); + uint8_t * lhs_packed = static_cast(params->wdata); + const uint8_t * rhs_packed = static_cast(src0->data); + + const size_t n_step = kernel->get_n_step(); + const size_t num_n_per_thread = kai_roundup(kai_roundup(n, nth) / nth, n_step); + const size_t n_start = ith * num_n_per_thread; + + size_t n_to_process = 0; + if (n_start < n) { + n_to_process = num_n_per_thread; + if ((n_start + n_to_process) > n) { + n_to_process = n - n_start; + } + } + + const size_t num_m_per_thread = kai_roundup(m, mr * nth) / nth; + const size_t m_start = ith * num_m_per_thread; + size_t m_to_process = num_m_per_thread; + if ((m_start + m_to_process) > m) { + m_to_process = m - m_start; + } + + if (m_start < m) { + const size_t src_stride = src1->nb[1]; + const float * src_ptr = reinterpret_cast(lhs + lhs_info->get_offset(m_start, dst->src[1]->nb[1])); + const size_t lhs_packed_offset = lhs_info->get_packed_offset_ex(m_start, k, 0, mr, kr, sr); + void * lhs_packed_ptr = static_cast(lhs_packed + lhs_packed_offset); + + lhs_info->pack_func_ex(m_to_process, k, 0, mr, kr, sr, 0, src_ptr, src_stride, lhs_packed_ptr); + } + + ggml_barrier(params->threadpool); + + const size_t dst_stride = dst->nb[1]; + const size_t lhs_packed_offset = lhs_info->get_packed_offset_ex(0, k, 0, mr, kr, sr); + const size_t rhs_packed_offset = kernel->get_rhs_packed_offset_ex(n_start, k, 0); + const size_t dst_offset = kernel->get_dst_offset(0, n_start, dst_stride); + const void * rhs_ptr = static_cast(rhs_packed + rhs_packed_offset); + const void * lhs_ptr = static_cast(lhs_packed + lhs_packed_offset); + float * dst_ptr = reinterpret_cast(static_cast(dst->data) + dst_offset); + + if (n_to_process > 0) { + kernel->run_kernel_ex(m, n_to_process, k, 0, lhs_ptr, rhs_ptr, dst_ptr, dst_stride, + sizeof(float), -FLT_MAX, FLT_MAX); + } + + return true; + } + + bool compute_forward_get_rows(struct ggml_compute_params * params, struct ggml_tensor * dst) { const ggml_tensor * src0 = dst->src[0]; const ggml_tensor * src1 = dst->src[1]; GGML_TENSOR_BINARY_OP_LOCALS - rhs_packing_info * rhs_info = &ctx.kernels->rhs_info; - kernel_info * kernel = &ctx.kernels->gemm; + ggml_kleidiai_kernels * kernels = nullptr; + size_t block_len = 0; + size_t num_bytes_multiplier = 0; + + if (dst->src[0]->type == GGML_TYPE_Q4_0) { + if (!ctx.kernels_q4) { + return false; + } + kernels = ctx.kernels_q4; + block_len = QK4_0; + num_bytes_multiplier = sizeof(uint16_t); + } else if (dst->src[0]->type == GGML_TYPE_Q8_0) { + if (!ctx.kernels_q8) { + return false; + } + kernels = ctx.kernels_q8; + block_len = QK8_0; + num_bytes_multiplier = sizeof(float); + } else { + return false; + } + + rhs_packing_info * rhs_info = &kernels->rhs_info; + kernel_info * kernel = &kernels->gemm; if (!rhs_info->to_float || !kernel->get_nr) { return false; } @@ -423,8 +537,7 @@ class tensor_traits : public ggml::cpu::tensor_traits { const size_t block_rows = kernel->get_nr(); const size_t kr = kernel->get_kr(); - const size_t num_bytes_multiplier = sizeof(uint16_t); - const size_t packed_stride = rhs_info->packed_stride(nc, block_rows, kr, QK4_0); + const size_t packed_stride = rhs_info->packed_stride(nc, block_rows, kr, block_len); const int ith = params->ith; const int nth = params->nth; @@ -439,7 +552,7 @@ class tensor_traits : public ggml::cpu::tensor_traits { GGML_ASSERT(row_idx >= 0 && row_idx < src0->ne[1]); float *out = (float *)((char *)dst->data + i * nb1); - rhs_info->to_float(src0->data, row_idx, nc, out, block_rows, packed_stride, kr, QK4_0, num_bytes_multiplier); + rhs_info->to_float(src0->data, row_idx, nc, out, block_rows, packed_stride, kr, block_len, num_bytes_multiplier); } return true; @@ -447,21 +560,91 @@ class tensor_traits : public ggml::cpu::tensor_traits { public: int repack(struct ggml_tensor * tensor, const void * data, size_t data_size) { - GGML_ASSERT(tensor->type == GGML_TYPE_Q4_0); - GGML_ASSERT(ctx.kernels); const size_t n = tensor->ne[1]; const size_t k = tensor->ne[0]; - size_t nr = ctx.kernels->gemm.get_nr(); - size_t kr = ctx.kernels->gemm.get_kr(); - size_t sr = ctx.kernels->gemm.get_sr(); - struct kai_rhs_pack_qs4cxs1s0_param params; - params.lhs_zero_point = 1; - params.rhs_zero_point = 8; - ctx.kernels->rhs_info.pack_func_ex(1, n, k, nr, kr, sr, QK4_0, 0, (const uint8_t*)data, nullptr, nullptr, tensor->data, 0, ¶ms); + if (tensor->type == GGML_TYPE_Q4_0) { + if (!ctx.kernels_q4) { + return -1; + } + size_t nr = ctx.kernels_q4->gemm.get_nr(); + size_t kr = ctx.kernels_q4->gemm.get_kr(); + size_t sr = ctx.kernels_q4->gemm.get_sr(); + + struct kai_rhs_pack_qs4cxs1s0_param params; + params.lhs_zero_point = 1; + params.rhs_zero_point = 8; + ctx.kernels_q4->rhs_info.pack_func_ex(1, n, k, nr, kr, sr, QK4_0, 0, + static_cast(data), + nullptr, nullptr, tensor->data, 0, ¶ms); + GGML_UNUSED(data_size); + return 0; + } else if (tensor->type == GGML_TYPE_Q8_0) { + if (!ctx.kernels_q8) { + return -1; + } + + const size_t row_stride = tensor->nb[1]; + const size_t k_blocks = (k + QK8_0 - 1) / QK8_0; + + std::vector qdata(n * k, 0); + std::vector scales(n, 0.0f); + + for (size_t row = 0; row < n; ++row) { + const auto * row_blocks = reinterpret_cast( + static_cast(data) + row * row_stride); + + float max_abs = 0.0f; + for (size_t block = 0; block < k_blocks; ++block) { + const block_q8_0 & blk = row_blocks[block]; + const float d = GGML_FP16_TO_FP32(blk.d); + for (size_t l = 0; l < QK8_0; ++l) { + const size_t linear_idx = block * QK8_0 + l; + if (linear_idx >= k) { + break; + } + const float value = d * blk.qs[l]; + max_abs = std::max(max_abs, std::fabs(value)); + } + } + + float scale = max_abs > 0.0f ? max_abs / 127.0f : 0.0f; + scales[row] = scale; + const float inv_scale = scale > 0.0f ? 1.0f / scale : 0.0f; + + for (size_t block = 0; block < k_blocks; ++block) { + const block_q8_0 & blk = row_blocks[block]; + const float d = GGML_FP16_TO_FP32(blk.d); + for (size_t l = 0; l < QK8_0; ++l) { + const size_t linear_idx = block * QK8_0 + l; + if (linear_idx >= k) { + break; + } + const float value = d * blk.qs[l]; + int32_t q = scale > 0.0f ? static_cast(std::lround(value * inv_scale)) : 0; + q = std::clamp(q, -127, 127); + qdata[row * k + linear_idx] = static_cast(q); + } + } + } + + size_t nr = ctx.kernels_q8->gemm.get_nr(); + size_t kr = ctx.kernels_q8->gemm.get_kr(); + size_t sr = ctx.kernels_q8->gemm.get_sr(); + + struct kai_rhs_pack_qsi8cx_params params; + params.lhs_zero_point = 1; + params.scale_multiplier = 1.0f; + + ctx.kernels_q8->rhs_info.pack_func_ex(1, n, k, nr, kr, sr, 0, 0, + qdata.data(), nullptr, scales.data(), + tensor->data, 0, ¶ms); + GGML_UNUSED(data_size); + return 0; + } - return 0; GGML_UNUSED(data_size); + return -1; } }; @@ -518,27 +701,45 @@ static size_t ggml_backend_cpu_kleidiai_buffer_type_get_alignment(ggml_backend_b } static size_t ggml_backend_cpu_kleidiai_buffer_type_get_alloc_size(ggml_backend_buffer_type_t buft, const struct ggml_tensor * tensor) { - GGML_ASSERT(tensor->type == GGML_TYPE_Q4_0); - GGML_ASSERT(ctx.kernels); + GGML_UNUSED(buft); - const size_t n = tensor->ne[1]; - const size_t k = tensor->ne[0]; - const size_t nr = ctx.kernels->gemm.get_nr(); - const size_t kr = ctx.kernels->gemm.get_kr(); + const size_t n = tensor->ne[1]; + const size_t k = tensor->ne[0]; + + ggml_kleidiai_kernels * kernels = nullptr; + size_t block_len = 0; + + if (tensor->type == GGML_TYPE_Q4_0) { + GGML_ASSERT(ctx.kernels_q4); + kernels = ctx.kernels_q4; + block_len = QK4_0; + } else if (tensor->type == GGML_TYPE_Q8_0) { + GGML_ASSERT(ctx.kernels_q8); + kernels = ctx.kernels_q8; + block_len = QK8_0; + } else { + return 0; + } - return ctx.kernels->rhs_info.packed_size_ex(n, k, nr, kr, QK4_0); + const size_t nr = kernels->gemm.get_nr(); + const size_t kr = kernels->gemm.get_kr(); + const size_t packed = kernels->rhs_info.packed_size_ex(n, k, nr, kr, block_len); + const size_t raw = ggml_nbytes(tensor); - GGML_UNUSED(buft); + return packed > raw ? packed : raw; } namespace ggml::cpu::kleidiai { class extra_buffer_type : ggml::cpu::extra_buffer_type { bool supports_op(ggml_backend_dev_t, const struct ggml_tensor * op) override { if ((op->op == GGML_OP_MUL_MAT || op->op == GGML_OP_GET_ROWS) && - op->src[0]->type == GGML_TYPE_Q4_0 && + (op->src[0]->type == GGML_TYPE_Q4_0 || op->src[0]->type == GGML_TYPE_Q8_0) && op->src[0]->buffer && (ggml_n_dims(op->src[0]) == 2) && - op->src[0]->buffer->buft == ggml_backend_cpu_kleidiai_buffer_type() && ctx.kernels) { + op->src[0]->buffer->buft == ggml_backend_cpu_kleidiai_buffer_type()) { + if (((op->src[0]->type == GGML_TYPE_Q4_0) ? ctx.kernels_q4 : ctx.kernels_q8) == nullptr) { + return false; + } if (op->src[1]->buffer && !ggml_backend_buft_is_host(op->src[1]->buffer->buft)) { return false; } From 73460f62789a3ed02109d601a2653c3842f2074e Mon Sep 17 00:00:00 2001 From: duduta Date: Tue, 11 Nov 2025 13:33:24 +0200 Subject: [PATCH 157/185] ggml-cpu: templateify ggml_compute_forward_rope_f32 and _f16 (#16805) * extract rotate_pairs logic from ggml_compute_forward_rope_f32 * templateify ggml_compute_forward_rope_f32 and _f16 * abort when rope type not supported, remove GLM from test-rope * add imrope branch to switch * add rope tests for perf * Update ggml/src/ggml-cpu/ops.cpp Co-authored-by: Georgi Gerganov * Update ggml/src/ggml-cpu/ops.cpp Co-authored-by: Georgi Gerganov --------- Co-authored-by: Georgi Gerganov --- ggml/src/ggml-cpu/ops.cpp | 317 +++++++------------------------------ tests/test-backend-ops.cpp | 16 ++ tests/test-rope.cpp | 11 +- 3 files changed, 76 insertions(+), 268 deletions(-) diff --git a/ggml/src/ggml-cpu/ops.cpp b/ggml/src/ggml-cpu/ops.cpp index 7c42fb78b4a..5a272b9abc5 100644 --- a/ggml/src/ggml-cpu/ops.cpp +++ b/ggml/src/ggml-cpu/ops.cpp @@ -5503,194 +5503,28 @@ static void ggml_mrope_cache_init( } } -static void ggml_compute_forward_rope_f32( - const ggml_compute_params * params, - ggml_tensor * dst, - const bool forward) { - - const ggml_tensor * src0 = dst->src[0]; - const ggml_tensor * src1 = dst->src[1]; - const ggml_tensor * src2 = dst->src[2]; - - float freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow; - int sections[4]; - - //const int n_past = ((int32_t *) dst->op_params)[0]; - const int n_dims = ((int32_t *) dst->op_params)[1]; - const int mode = ((int32_t *) dst->op_params)[2]; - //const int n_ctx = ((int32_t *) dst->op_params)[3]; - const int n_ctx_orig = ((int32_t *) dst->op_params)[4]; - - memcpy(&freq_base, (int32_t *) dst->op_params + 5, sizeof(float)); - memcpy(&freq_scale, (int32_t *) dst->op_params + 6, sizeof(float)); - memcpy(&ext_factor, (int32_t *) dst->op_params + 7, sizeof(float)); - memcpy(&attn_factor, (int32_t *) dst->op_params + 8, sizeof(float)); - memcpy(&beta_fast, (int32_t *) dst->op_params + 9, sizeof(float)); - memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); - memcpy(§ions, (int32_t *) dst->op_params + 11, sizeof(int)*4); - - GGML_TENSOR_UNARY_OP_LOCALS - - //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); - //printf("n_past = %d, ne2 = %d\n", n_past, ne2); - - GGML_ASSERT(nb00 == sizeof(float)); - - const int ith = params->ith; - const int nth = params->nth; - - const int nr = ggml_nrows(dst); - - GGML_ASSERT(n_dims <= ne0); - GGML_ASSERT(n_dims % 2 == 0); - - // rows per thread - const int dr = (nr + nth - 1)/nth; - // row range for this thread - const int ir0 = dr*ith; - const int ir1 = MIN(ir0 + dr, nr); - - // row index used to determine which thread to use - int ir = 0; - - const float theta_scale = powf(freq_base, -2.0f/n_dims); - - float corr_dims[2]; - ggml_rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims); - - const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; - const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; // ggml_rope_multi, multimodal rotary position embedding - const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; // qwen3vl apply interleaved mrope - const bool is_vision = mode == GGML_ROPE_TYPE_VISION; - - if (is_mrope) { - GGML_ASSERT(sections[0] > 0 || sections[1] > 0 || sections[2] > 0); - } - - if (is_vision) { - GGML_ASSERT(n_dims == ne0/2); - } +template +static void rotate_pairs(const int64_t n, const int64_t n_offset, const float * cache, const T * src_data, T * dst_data, const int scale = 2) { + for (int64_t i0 = 0; i0 < n; i0 += 2) { + const int64_t ic = i0/scale; // hack for GGML_ROPE_TYPE_NORMAL, where we need ic = i0; for all other cases, ic = i0/2 - const float * freq_factors = NULL; - if (src2 != NULL) { - GGML_ASSERT(src2->type == GGML_TYPE_F32); - GGML_ASSERT(src2->ne[0] >= n_dims / 2); - freq_factors = (const float *) src2->data; - } + const float cos_theta = cache[i0 + 0]; + const float sin_theta = cache[i0 + 1]; - // backward process uses inverse rotation by cos and sin. - // cos and sin build a rotation matrix, where the inverse is the transpose. - // this essentially just switches the sign of sin. - const float sin_sign = forward ? 1.0f : -1.0f; + const T * const src = src_data + ic; + T * dst = dst_data + ic; - const int32_t * pos = (const int32_t *) src1->data; + const float x0 = type_conversion_table::to_f32(src[0]); + const float x1 = type_conversion_table::to_f32(src[n_offset]); - for (int64_t i3 = 0; i3 < ne3; i3++) { // batch - for (int64_t i2 = 0; i2 < ne2; i2++) { // seq-len - - float * cache = (float *) params->wdata + (ne0 + CACHE_LINE_SIZE_F32)*ith; - if (!is_mrope) { - const int64_t p = pos[i2]; - ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); - } - else { - const int64_t p_t = pos[i2]; - const int64_t p_h = pos[i2 + ne2]; - const int64_t p_w = pos[i2 + ne2 * 2]; - const int64_t p_e = pos[i2 + ne2 * 3]; - ggml_mrope_cache_init( - p_t, p_h, p_w, p_e, sections, is_imrope, is_vision, - freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); - } - - for (int64_t i1 = 0; i1 < ne1; i1++) { // attn-heads - if (ir++ < ir0) continue; - if (ir > ir1) break; - - if (is_neox || is_mrope) { - if (is_vision){ - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = src[0]; - const float x1 = src[n_dims]; - - dst_data[0] = x0*cos_theta - x1*sin_theta; - dst_data[n_dims] = x0*sin_theta + x1*cos_theta; - } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = src[0]; - const float x1 = src[n_dims/2]; - - dst_data[0] = x0*cos_theta - x1*sin_theta; - dst_data[n_dims/2] = x0*sin_theta + x1*cos_theta; - } - } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - - const float x0 = src[0]; - const float x1 = src[1]; - - dst_data[0] = x0*cos_theta - x1*sin_theta; - dst_data[1] = x0*sin_theta + x1*cos_theta; - } - } - - if (is_vision) { - for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = src[0]; - const float x1 = src[n_dims]; - - dst_data[0] = x0*cos_theta - x1*sin_theta; - dst_data[n_dims] = x0*sin_theta + x1*cos_theta; - } - } else { - // fill the remain channels with data from src tensor - for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const float * const src = (float *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - float * dst_data = (float *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - - dst_data[0] = src[0]; - dst_data[1] = src[1]; - } - } - } - } - } + dst[0] = type_conversion_table::from_f32(x0*cos_theta - x1*sin_theta); + dst[n_offset] = type_conversion_table::from_f32(x0*sin_theta + x1*cos_theta); + } } -// TODO: deduplicate f16/f32 code -static void ggml_compute_forward_rope_f16( +template //float or ggml_fp16_t +static void ggml_compute_forward_rope_flt( const ggml_compute_params * params, ggml_tensor * dst, const bool forward) { @@ -5699,6 +5533,9 @@ static void ggml_compute_forward_rope_f16( const ggml_tensor * src1 = dst->src[1]; const ggml_tensor * src2 = dst->src[2]; + GGML_ASSERT(src0->type == GGML_TYPE_F32 || src0->type == GGML_TYPE_F16); + GGML_ASSERT(src1->type == GGML_TYPE_I32); + float freq_base, freq_scale, ext_factor, attn_factor, beta_fast, beta_slow; int sections[4]; @@ -5707,6 +5544,7 @@ static void ggml_compute_forward_rope_f16( const int mode = ((int32_t *) dst->op_params)[2]; //const int n_ctx = ((int32_t *) dst->op_params)[3]; const int n_ctx_orig = ((int32_t *) dst->op_params)[4]; + memcpy(&freq_base, (int32_t *) dst->op_params + 5, sizeof(float)); memcpy(&freq_scale, (int32_t *) dst->op_params + 6, sizeof(float)); memcpy(&ext_factor, (int32_t *) dst->op_params + 7, sizeof(float)); @@ -5715,13 +5553,13 @@ static void ggml_compute_forward_rope_f16( memcpy(&beta_slow, (int32_t *) dst->op_params + 10, sizeof(float)); memcpy(§ions, (int32_t *) dst->op_params + 11, sizeof(int)*4); - GGML_TENSOR_UNARY_OP_LOCALS //printf("ne0: %d, ne1: %d, ne2: %d, ne3: %d\n", ne0, ne1, ne2, ne3); //printf("n_past = %d, ne2 = %d\n", n_past, ne2); - GGML_ASSERT(nb0 == sizeof(ggml_fp16_t)); + GGML_ASSERT(nb0 == nb00); + GGML_ASSERT(nb0 == sizeof(T)); const int ith = params->ith; const int nth = params->nth; @@ -5746,12 +5584,11 @@ static void ggml_compute_forward_rope_f16( float corr_dims[2]; ggml_rope_yarn_corr_dims(n_dims, n_ctx_orig, freq_base, beta_fast, beta_slow, corr_dims); - const bool is_neox = mode & GGML_ROPE_TYPE_NEOX; - const bool is_mrope = mode & GGML_ROPE_TYPE_MROPE; - const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; + const bool is_imrope = mode == GGML_ROPE_TYPE_IMROPE; // qwen3vl apply interleaved mrope + const bool mrope_used = mode & GGML_ROPE_TYPE_MROPE; // ggml_rope_multi, note: also true for vision (24 & 8 == true) and for imrope const bool is_vision = mode == GGML_ROPE_TYPE_VISION; - if (is_mrope) { + if (mrope_used) { GGML_ASSERT(sections[0] > 0 || sections[1] > 0 || sections[2] > 0); } @@ -5773,11 +5610,11 @@ static void ggml_compute_forward_rope_f16( const int32_t * pos = (const int32_t *) src1->data; - for (int64_t i3 = 0; i3 < ne3; i3++) { - for (int64_t i2 = 0; i2 < ne2; i2++) { + for (int64_t i3 = 0; i3 < ne3; i3++) { // batch + for (int64_t i2 = 0; i2 < ne2; i2++) { // seq-len float * cache = (float *) params->wdata + (ne0 + CACHE_LINE_SIZE_F32)*ith; - if (!is_mrope) { + if (!mrope_used) { const int64_t p = pos[i2]; ggml_rope_cache_init(p, freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); } @@ -5791,86 +5628,40 @@ static void ggml_compute_forward_rope_f16( freq_scale, freq_factors, corr_dims, ne0, ext_factor, attn_factor, cache, sin_sign, theta_scale); } - for (int64_t i1 = 0; i1 < ne1; i1++) { + for (int64_t i1 = 0; i1 < ne1; i1++) { // attn-heads if (ir++ < ir0) continue; if (ir > ir1) break; - if (is_neox || is_mrope) { - if (is_vision) { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = GGML_CPU_FP16_TO_FP32(src[0]); - const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims]); - - dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); - dst_data[n_dims] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); - } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = GGML_CPU_FP16_TO_FP32(src[0]); - const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims/2]); - - dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); - dst_data[n_dims/2] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); - } - } - } else { - for (int64_t i0 = 0; i0 < n_dims; i0 += 2) { - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); - - const float x0 = GGML_CPU_FP16_TO_FP32(src[0]); - const float x1 = GGML_CPU_FP16_TO_FP32(src[1]); - - dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); - dst_data[1] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); - } + T * src = (T *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01); + T * dst_data = (T *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1); + + switch (mode) { + case GGML_ROPE_TYPE_NORMAL: + rotate_pairs(n_dims, 1, cache, src, dst_data, 1); + break; + case GGML_ROPE_TYPE_NEOX: + case GGML_ROPE_TYPE_MROPE: + case GGML_ROPE_TYPE_IMROPE: + rotate_pairs(n_dims, n_dims/2, cache, src, dst_data); + break; + case GGML_ROPE_TYPE_VISION: + rotate_pairs(ne0, n_dims, cache, src, dst_data); + break; + default: + GGML_ABORT("rope type not supported"); } - if (is_vision) { - for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const int64_t ic = i0/2; - - const float cos_theta = cache[i0 + 0]; - const float sin_theta = cache[i0 + 1]; - - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + ic*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + ic*nb0); - - const float x0 = GGML_CPU_FP16_TO_FP32(src[0]); - const float x1 = GGML_CPU_FP16_TO_FP32(src[n_dims]); - - dst_data[0] = GGML_CPU_FP32_TO_FP16(x0*cos_theta - x1*sin_theta); - dst_data[n_dims] = GGML_CPU_FP32_TO_FP16(x0*sin_theta + x1*cos_theta); - } - } else { + if (!is_vision) { + // fill the remain channels with data from src tensor for (int64_t i0 = n_dims; i0 < ne0; i0 += 2) { - const ggml_fp16_t * const src = (ggml_fp16_t *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); - ggml_fp16_t * dst_data = (ggml_fp16_t *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); + const T * const src = (T *)((char *) src0->data + i3*nb03 + i2*nb02 + i1*nb01 + i0*nb00); + T * dst_data = (T *)((char *) dst->data + i3*nb3 + i2*nb2 + i1*nb1 + i0*nb0); dst_data[0] = src[0]; dst_data[1] = src[1]; } } - } + } //attn-heads } } } @@ -5884,11 +5675,11 @@ void ggml_compute_forward_rope( switch (src0->type) { case GGML_TYPE_F16: { - ggml_compute_forward_rope_f16(params, dst, true); + ggml_compute_forward_rope_flt(params, dst, true); } break; case GGML_TYPE_F32: { - ggml_compute_forward_rope_f32(params, dst, true); + ggml_compute_forward_rope_flt(params, dst, true); } break; default: { @@ -5908,11 +5699,11 @@ void ggml_compute_forward_rope_back( switch (src0->type) { case GGML_TYPE_F16: { - ggml_compute_forward_rope_f16(params, dst, false); + ggml_compute_forward_rope_flt(params, dst, false); } break; case GGML_TYPE_F32: { - ggml_compute_forward_rope_f32(params, dst, false); + ggml_compute_forward_rope_flt(params, dst, false); } break; default: { diff --git a/tests/test-backend-ops.cpp b/tests/test-backend-ops.cpp index eb29b15f204..92c17ac4399 100644 --- a/tests/test-backend-ops.cpp +++ b/tests/test-backend-ops.cpp @@ -7603,6 +7603,22 @@ static std::vector> make_test_cases_perf() { test_cases.emplace_back(new test_add_id(GGML_TYPE_F32, GGML_TYPE_F32, 2880, 32, 4, n_token)); } + for (bool fw : {true, false}) { // fw == forward + for (ggml_type type : {GGML_TYPE_F32, GGML_TYPE_F16}) { + for (bool ff : {false, true}) { // freq_factors + for (float v : { 0, 1 }) { + test_cases.emplace_back(new test_rope(type, {128, 32, 512, 1}, 128, GGML_ROPE_TYPE_NORMAL, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // llama 7B + test_cases.emplace_back(new test_rope(type, {128, 64, 512, 1}, 128, GGML_ROPE_TYPE_NORMAL, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // llama 65B + test_cases.emplace_back(new test_rope(type, { 80, 32, 512, 1}, 20, GGML_ROPE_TYPE_NEOX, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // neox (stablelm) + test_cases.emplace_back(new test_rope(type, { 64, 8, 512, 1}, 64, GGML_ROPE_TYPE_NEOX, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // neox (falcon 40B) + test_cases.emplace_back(new test_rope(type, {128, 12, 512, 1}, 128, GGML_ROPE_TYPE_MROPE, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // rope_multi,m-rope (qwen2vl 2B) + test_cases.emplace_back(new test_rope(type, {128, 12, 2, 1}, 128, GGML_ROPE_TYPE_IMROPE, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // rope_multi,imrope (qwen3vl 2B) + test_cases.emplace_back(new test_rope(type, { 80, 16, 2, 1}, 80, GGML_ROPE_TYPE_VISION, 512, 1.0f, 0.0f, 1.0f, ff, v, fw)); // rope_multi,m-rope (qwen2vl ViT) + } + } + } + } + std::vector> reduce_rows_cases = { { 8192, 1, 1, 1 }, { 8192, 8192, 1, 1 }, diff --git a/tests/test-rope.cpp b/tests/test-rope.cpp index 22c51d81f60..801e4cd8270 100644 --- a/tests/test-rope.cpp +++ b/tests/test-rope.cpp @@ -138,7 +138,7 @@ int main(int /*argc*/, const char ** /*argv*/) { struct ggml_tensor * x; // rope f32 - for (int m = 0; m < 6; ++m) { + for (int m = 0; m < 5; ++m) { const int ndims = 4; const int64_t n_rot = 128; @@ -153,7 +153,7 @@ int main(int /*argc*/, const char ** /*argv*/) { x = get_random_tensor_f32(ctx0, ndims, ne, -1.0f, 1.0f); int mode = -1; - if (m < 3) { + if (m < 2) { struct ggml_tensor * p0 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); struct ggml_tensor * p1 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2]); @@ -163,8 +163,8 @@ int main(int /*argc*/, const char ** /*argv*/) { ((int32_t *) p1->data)[i] = n_past_2 - n_past_0; ((int32_t *) p2->data)[i] = n_past_2 + i; } - // test mode 0, 2, 4 (standard, GPT-NeoX, GLM) - mode = m == 0 ? 0 : m == 1 ? 2 : 4; + // test mode 0, 2 (standard, GPT-NeoX) + mode = m == 0 ? GGML_ROPE_TYPE_NORMAL : GGML_ROPE_TYPE_NEOX; // 100, 101, 102, ..., 172 r0 = ggml_rope(ctx0, x, p0, n_rot, mode); @@ -180,7 +180,8 @@ int main(int /*argc*/, const char ** /*argv*/) { struct ggml_tensor * p2 = ggml_new_tensor_1d(ctx0, GGML_TYPE_I32, ne[2] * 4); int sections[4] = {16, 24, 24, 0}; - mode = (m == 3) ? GGML_ROPE_TYPE_MROPE : (m == 4) ? GGML_ROPE_TYPE_VISION : GGML_ROPE_TYPE_IMROPE; + + mode = (m == 2) ? GGML_ROPE_TYPE_MROPE : (m == 3) ? GGML_ROPE_TYPE_VISION : GGML_ROPE_TYPE_IMROPE; for (int i = 0; i < ne[2]; ++i) { for (int j = 0; j < 4; ++j) { From ca4844062b3f0679a39b76b2fe95ba87cd6fb00d Mon Sep 17 00:00:00 2001 From: ixgbe <1113177880@qq.com> Date: Tue, 11 Nov 2025 19:41:51 +0800 Subject: [PATCH 158/185] ggml-cpu : add RISC-V RVV (Zvfh) optimization for FP16 to FP32 conversion (#17161) Signed-off-by: Wang Yang --- ggml/src/ggml-cpu/ggml-cpu.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/ggml/src/ggml-cpu/ggml-cpu.c b/ggml/src/ggml-cpu/ggml-cpu.c index 086708bae0b..d8e3c48c609 100644 --- a/ggml/src/ggml-cpu/ggml-cpu.c +++ b/ggml/src/ggml-cpu/ggml-cpu.c @@ -3274,6 +3274,13 @@ void ggml_cpu_fp16_to_fp32(const ggml_fp16_t * x, float * y, int64_t n) { __m128 y_vec = _mm_cvtph_ps(x_vec); _mm_storeu_ps(y + i, y_vec); } +#elif defined(__riscv_zvfh) + for (int vl; i < n; i += vl) { + vl = __riscv_vsetvl_e16m1(n - i); + vfloat16m1_t vx = __riscv_vle16_v_f16m1((_Float16 *)&x[i], vl); + vfloat32m2_t vy = __riscv_vfwcvt_f_f_v_f32m2(vx, vl); + __riscv_vse32_v_f32m2(&y[i], vy, vl); + } #endif for (; i < n; ++i) { From 1d45b4228f11c193d6864724ae675734da24ac98 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Tue, 11 Nov 2025 13:32:58 +0100 Subject: [PATCH 159/185] vendor: split httplib to cpp/h files (#17150) * vendor: split httplib to cpp/h files * move defines * include httplib if curl is not used * add TODO * fix build ios * fix build visionos instead --- CMakeLists.txt | 1 + common/CMakeLists.txt | 6 +- scripts/sync_vendor.py | 17 + tools/server/CMakeLists.txt | 2 +- tools/server/utils.hpp | 8 - vendor/cpp-httplib/CMakeLists.txt | 28 + vendor/cpp-httplib/httplib.cpp | 7816 +++++++++++++++++++++ vendor/cpp-httplib/httplib.h | 10178 ++-------------------------- 8 files changed, 8277 insertions(+), 9779 deletions(-) create mode 100644 vendor/cpp-httplib/CMakeLists.txt create mode 100644 vendor/cpp-httplib/httplib.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 4bf8b2789ae..e7410184dfa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -200,6 +200,7 @@ endif() if (LLAMA_BUILD_COMMON) add_subdirectory(common) + add_subdirectory(vendor/cpp-httplib) endif() if (LLAMA_BUILD_COMMON AND LLAMA_BUILD_TESTS AND NOT CMAKE_JS_VERSION) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 7086d08e5e5..1d260507ad5 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -79,10 +79,11 @@ if (BUILD_SHARED_LIBS) set_target_properties(${TARGET} PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() +# TODO: use list(APPEND LLAMA_COMMON_EXTRA_LIBS ...) set(LLAMA_COMMON_EXTRA_LIBS build_info) -# Use curl to download model url if (LLAMA_CURL) + # Use curl to download model url find_package(CURL) if (NOT CURL_FOUND) message(FATAL_ERROR "Could NOT find CURL. Hint: to disable this feature, set -DLLAMA_CURL=OFF") @@ -90,6 +91,9 @@ if (LLAMA_CURL) target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_CURL) include_directories(${CURL_INCLUDE_DIRS}) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} ${CURL_LIBRARIES}) +else() + # otherwise, use cpp-httplib + set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} cpp-httplib) endif() if (LLAMA_OPENSSL) diff --git a/scripts/sync_vendor.py b/scripts/sync_vendor.py index 1151c9f0196..b578cf1e6af 100755 --- a/scripts/sync_vendor.py +++ b/scripts/sync_vendor.py @@ -20,3 +20,20 @@ for url, filename in vendor.items(): print(f"downloading {url} to {filename}") # noqa: NP100 urllib.request.urlretrieve(url, filename) + + # split cpp/h files for httplib + # see: https://github.com/yhirose/cpp-httplib/blob/master/split.py + if 'httplib.h' in filename: + border = '// ----------------------------------------------------------------------------' + with open(filename, 'r') as f: + content = f.read() + header, implementation, footer = content.split(border, 2) + fname_cpp = filename.replace('.h', '.cpp') + with open(filename, 'w') as fh: + fh.write(header) + fh.write(footer) + with open(fname_cpp, 'w') as fc: + fc.write('#include "httplib.h"\n') + fc.write('namespace httplib {\n') + fc.write(implementation.replace('\ninline ', '\n')) + fc.write('} // namespace httplib\n') diff --git a/tools/server/CMakeLists.txt b/tools/server/CMakeLists.txt index 06df3ee49dd..5f8a50320d1 100644 --- a/tools/server/CMakeLists.txt +++ b/tools/server/CMakeLists.txt @@ -33,7 +33,7 @@ install(TARGETS ${TARGET} RUNTIME) target_include_directories(${TARGET} PRIVATE ../mtmd) target_include_directories(${TARGET} PRIVATE ${CMAKE_SOURCE_DIR}) -target_link_libraries(${TARGET} PRIVATE common mtmd ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries(${TARGET} PRIVATE common mtmd cpp-httplib ${CMAKE_THREAD_LIBS_INIT}) if (WIN32) TARGET_LINK_LIBRARIES(${TARGET} PRIVATE ws2_32) diff --git a/tools/server/utils.hpp b/tools/server/utils.hpp index 2bce2f4a47a..e9d4431ddfb 100644 --- a/tools/server/utils.hpp +++ b/tools/server/utils.hpp @@ -9,14 +9,6 @@ #include "mtmd-helper.h" #include "chat.h" -// increase max payload length to allow use of larger context size -#define CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH 1048576 -// increase backlog size to avoid connection resets for >> 1 slots -#define CPPHTTPLIB_LISTEN_BACKLOG 512 -// increase max URI length to handle longer prompts in query string -#define CPPHTTPLIB_REQUEST_URI_MAX_LENGTH 32768 -// disable Nagle's algorithm -#define CPPHTTPLIB_TCP_NODELAY true #include #define JSON_ASSERT GGML_ASSERT diff --git a/vendor/cpp-httplib/CMakeLists.txt b/vendor/cpp-httplib/CMakeLists.txt new file mode 100644 index 00000000000..0033d52371f --- /dev/null +++ b/vendor/cpp-httplib/CMakeLists.txt @@ -0,0 +1,28 @@ +set(TARGET cpp-httplib) + +find_package(Threads REQUIRED) + +add_library(${TARGET} STATIC httplib.cpp httplib.h) +if (NOT MSVC) + # disable warnings in 3rd party code + target_compile_options(${TARGET} PRIVATE -w) +endif() + +target_link_libraries (${TARGET} PRIVATE Threads::Threads) +target_compile_features(${TARGET} PRIVATE cxx_std_17) + +target_compile_definitions(${TARGET} PRIVATE + # increase max payload length to allow use of larger context size + CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH=1048576 + # increase backlog size to avoid connection resets for >> 1 slots + CPPHTTPLIB_LISTEN_BACKLOG=512 + # increase max URI length to handle longer prompts in query string + CPPHTTPLIB_REQUEST_URI_MAX_LENGTH=32768 + # disable Nagle's algorithm + CPPHTTPLIB_TCP_NODELAY=1 +) + +if (${CMAKE_SYSTEM_NAME} MATCHES "visionOS") + # quick fix for https://github.com/ggml-org/llama.cpp/actions/runs/19247291428/job/55024294176?pr=17150 + target_compile_definitions(${TARGET} PRIVATE NI_MAXHOST=1025) +endif() diff --git a/vendor/cpp-httplib/httplib.cpp b/vendor/cpp-httplib/httplib.cpp new file mode 100644 index 00000000000..e5c84d2b221 --- /dev/null +++ b/vendor/cpp-httplib/httplib.cpp @@ -0,0 +1,7816 @@ +#include "httplib.h" +namespace httplib { + + +/* + * Implementation that will be part of the .cc file if split into .h + .cc. + */ + +namespace detail { + +bool is_hex(char c, int &v) { + if (0x20 <= c && isdigit(c)) { + v = c - '0'; + return true; + } else if ('A' <= c && c <= 'F') { + v = c - 'A' + 10; + return true; + } else if ('a' <= c && c <= 'f') { + v = c - 'a' + 10; + return true; + } + return false; +} + +bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, + int &val) { + if (i >= s.size()) { return false; } + + val = 0; + for (; cnt; i++, cnt--) { + if (!s[i]) { return false; } + auto v = 0; + if (is_hex(s[i], v)) { + val = val * 16 + v; + } else { + return false; + } + } + return true; +} + +std::string from_i_to_hex(size_t n) { + static const auto charset = "0123456789abcdef"; + std::string ret; + do { + ret = charset[n & 15] + ret; + n >>= 4; + } while (n > 0); + return ret; +} + +size_t to_utf8(int code, char *buff) { + if (code < 0x0080) { + buff[0] = static_cast(code & 0x7F); + return 1; + } else if (code < 0x0800) { + buff[0] = static_cast(0xC0 | ((code >> 6) & 0x1F)); + buff[1] = static_cast(0x80 | (code & 0x3F)); + return 2; + } else if (code < 0xD800) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0xE000) { // D800 - DFFF is invalid... + return 0; + } else if (code < 0x10000) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0x110000) { + buff[0] = static_cast(0xF0 | ((code >> 18) & 0x7)); + buff[1] = static_cast(0x80 | ((code >> 12) & 0x3F)); + buff[2] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[3] = static_cast(0x80 | (code & 0x3F)); + return 4; + } + + // NOTREACHED + return 0; +} + +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c +std::string base64_encode(const std::string &in) { + static const auto lookup = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + std::string out; + out.reserve(in.size()); + + auto val = 0; + auto valb = -6; + + for (auto c : in) { + val = (val << 8) + static_cast(c); + valb += 8; + while (valb >= 0) { + out.push_back(lookup[(val >> valb) & 0x3F]); + valb -= 6; + } + } + + if (valb > -6) { out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]); } + + while (out.size() % 4) { + out.push_back('='); + } + + return out; +} + +bool is_valid_path(const std::string &path) { + size_t level = 0; + size_t i = 0; + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + + while (i < path.size()) { + // Read component + auto beg = i; + while (i < path.size() && path[i] != '/') { + if (path[i] == '\0') { + return false; + } else if (path[i] == '\\') { + return false; + } + i++; + } + + auto len = i - beg; + assert(len > 0); + + if (!path.compare(beg, len, ".")) { + ; + } else if (!path.compare(beg, len, "..")) { + if (level == 0) { return false; } + level--; + } else { + level++; + } + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + } + + return true; +} + +FileStat::FileStat(const std::string &path) { +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path.c_str()); + ret_ = _wstat(wpath.c_str(), &st_); +#else + ret_ = stat(path.c_str(), &st_); +#endif +} +bool FileStat::is_file() const { + return ret_ >= 0 && S_ISREG(st_.st_mode); +} +bool FileStat::is_dir() const { + return ret_ >= 0 && S_ISDIR(st_.st_mode); +} + +std::string encode_query_param(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +std::string encode_url(const std::string &s) { + std::string result; + result.reserve(s.size()); + + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case ' ': result += "%20"; break; + case '+': result += "%2B"; break; + case '\r': result += "%0D"; break; + case '\n': result += "%0A"; break; + case '\'': result += "%27"; break; + case ',': result += "%2C"; break; + // case ':': result += "%3A"; break; // ok? probably... + case ';': result += "%3B"; break; + default: + auto c = static_cast(s[i]); + if (c >= 0x80) { + result += '%'; + char hex[4]; + auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); + assert(len == 2); + result.append(hex, static_cast(len)); + } else { + result += s[i]; + } + break; + } + } + + return result; +} + +std::string decode_url(const std::string &s, + bool convert_plus_to_space) { + std::string result; + + for (size_t i = 0; i < s.size(); i++) { + if (s[i] == '%' && i + 1 < s.size()) { + if (s[i + 1] == 'u') { + auto val = 0; + if (from_hex_to_i(s, i + 2, 4, val)) { + // 4 digits Unicode codes + char buff[4]; + size_t len = to_utf8(val, buff); + if (len > 0) { result.append(buff, len); } + i += 5; // 'u0000' + } else { + result += s[i]; + } + } else { + auto val = 0; + if (from_hex_to_i(s, i + 1, 2, val)) { + // 2 digits hex codes + result += static_cast(val); + i += 2; // '00' + } else { + result += s[i]; + } + } + } else if (convert_plus_to_space && s[i] == '+') { + result += ' '; + } else { + result += s[i]; + } + } + + return result; +} + +std::string file_extension(const std::string &path) { + std::smatch m; + thread_local auto re = std::regex("\\.([a-zA-Z0-9]+)$"); + if (std::regex_search(path, m, re)) { return m[1].str(); } + return std::string(); +} + +bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } + +std::pair trim(const char *b, const char *e, size_t left, + size_t right) { + while (b + left < e && is_space_or_tab(b[left])) { + left++; + } + while (right > 0 && is_space_or_tab(b[right - 1])) { + right--; + } + return std::make_pair(left, right); +} + +std::string trim_copy(const std::string &s) { + auto r = trim(s.data(), s.data() + s.size(), 0, s.size()); + return s.substr(r.first, r.second - r.first); +} + +std::string trim_double_quotes_copy(const std::string &s) { + if (s.length() >= 2 && s.front() == '"' && s.back() == '"') { + return s.substr(1, s.size() - 2); + } + return s; +} + +void +divide(const char *data, std::size_t size, char d, + std::function + fn) { + const auto it = std::find(data, data + size, d); + const auto found = static_cast(it != data + size); + const auto lhs_data = data; + const auto lhs_size = static_cast(it - data); + const auto rhs_data = it + found; + const auto rhs_size = size - lhs_size - found; + + fn(lhs_data, lhs_size, rhs_data, rhs_size); +} + +void +divide(const std::string &str, char d, + std::function + fn) { + divide(str.data(), str.size(), d, std::move(fn)); +} + +void split(const char *b, const char *e, char d, + std::function fn) { + return split(b, e, d, (std::numeric_limits::max)(), std::move(fn)); +} + +void split(const char *b, const char *e, char d, size_t m, + std::function fn) { + size_t i = 0; + size_t beg = 0; + size_t count = 1; + + while (e ? (b + i < e) : (b[i] != '\0')) { + if (b[i] == d && count < m) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + beg = i + 1; + count++; + } + i++; + } + + if (i) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + } +} + +stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size) + : strm_(strm), fixed_buffer_(fixed_buffer), + fixed_buffer_size_(fixed_buffer_size) {} + +const char *stream_line_reader::ptr() const { + if (growable_buffer_.empty()) { + return fixed_buffer_; + } else { + return growable_buffer_.data(); + } +} + +size_t stream_line_reader::size() const { + if (growable_buffer_.empty()) { + return fixed_buffer_used_size_; + } else { + return growable_buffer_.size(); + } +} + +bool stream_line_reader::end_with_crlf() const { + auto end = ptr() + size(); + return size() >= 2 && end[-2] == '\r' && end[-1] == '\n'; +} + +bool stream_line_reader::getline() { + fixed_buffer_used_size_ = 0; + growable_buffer_.clear(); + +#ifndef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + char prev_byte = 0; +#endif + + for (size_t i = 0;; i++) { + if (size() >= CPPHTTPLIB_MAX_LINE_LENGTH) { + // Treat exceptionally long lines as an error to + // prevent infinite loops/memory exhaustion + return false; + } + char byte; + auto n = strm_.read(&byte, 1); + + if (n < 0) { + return false; + } else if (n == 0) { + if (i == 0) { + return false; + } else { + break; + } + } + + append(byte); + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + if (byte == '\n') { break; } +#else + if (prev_byte == '\r' && byte == '\n') { break; } + prev_byte = byte; +#endif + } + + return true; +} + +void stream_line_reader::append(char c) { + if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) { + fixed_buffer_[fixed_buffer_used_size_++] = c; + fixed_buffer_[fixed_buffer_used_size_] = '\0'; + } else { + if (growable_buffer_.empty()) { + assert(fixed_buffer_[fixed_buffer_used_size_] == '\0'); + growable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_); + } + growable_buffer_ += c; + } +} + +mmap::mmap(const char *path) { open(path); } + +mmap::~mmap() { close(); } + +bool mmap::open(const char *path) { + close(); + +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path); + if (wpath.empty()) { return false; } + +#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 + hFile_ = ::CreateFile2(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, + OPEN_EXISTING, NULL); +#else + hFile_ = ::CreateFileW(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); +#endif + + if (hFile_ == INVALID_HANDLE_VALUE) { return false; } + + LARGE_INTEGER size{}; + if (!::GetFileSizeEx(hFile_, &size)) { return false; } + // If the following line doesn't compile due to QuadPart, update Windows SDK. + // See: + // https://github.com/yhirose/cpp-httplib/issues/1903#issuecomment-2316520721 + if (static_cast(size.QuadPart) > + (std::numeric_limits::max)()) { + // `size_t` might be 32-bits, on 32-bits Windows. + return false; + } + size_ = static_cast(size.QuadPart); + +#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 + hMapping_ = + ::CreateFileMappingFromApp(hFile_, NULL, PAGE_READONLY, size_, NULL); +#else + hMapping_ = ::CreateFileMappingW(hFile_, NULL, PAGE_READONLY, 0, 0, NULL); +#endif + + // Special treatment for an empty file... + if (hMapping_ == NULL && size_ == 0) { + close(); + is_open_empty_file = true; + return true; + } + + if (hMapping_ == NULL) { + close(); + return false; + } + +#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 + addr_ = ::MapViewOfFileFromApp(hMapping_, FILE_MAP_READ, 0, 0); +#else + addr_ = ::MapViewOfFile(hMapping_, FILE_MAP_READ, 0, 0, 0); +#endif + + if (addr_ == nullptr) { + close(); + return false; + } +#else + fd_ = ::open(path, O_RDONLY); + if (fd_ == -1) { return false; } + + struct stat sb; + if (fstat(fd_, &sb) == -1) { + close(); + return false; + } + size_ = static_cast(sb.st_size); + + addr_ = ::mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0); + + // Special treatment for an empty file... + if (addr_ == MAP_FAILED && size_ == 0) { + close(); + is_open_empty_file = true; + return false; + } +#endif + + return true; +} + +bool mmap::is_open() const { + return is_open_empty_file ? true : addr_ != nullptr; +} + +size_t mmap::size() const { return size_; } + +const char *mmap::data() const { + return is_open_empty_file ? "" : static_cast(addr_); +} + +void mmap::close() { +#if defined(_WIN32) + if (addr_) { + ::UnmapViewOfFile(addr_); + addr_ = nullptr; + } + + if (hMapping_) { + ::CloseHandle(hMapping_); + hMapping_ = NULL; + } + + if (hFile_ != INVALID_HANDLE_VALUE) { + ::CloseHandle(hFile_); + hFile_ = INVALID_HANDLE_VALUE; + } + + is_open_empty_file = false; +#else + if (addr_ != nullptr) { + munmap(addr_, size_); + addr_ = nullptr; + } + + if (fd_ != -1) { + ::close(fd_); + fd_ = -1; + } +#endif + size_ = 0; +} +int close_socket(socket_t sock) { +#ifdef _WIN32 + return closesocket(sock); +#else + return close(sock); +#endif +} + +template inline ssize_t handle_EINTR(T fn) { + ssize_t res = 0; + while (true) { + res = fn(); + if (res < 0 && errno == EINTR) { + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } + break; + } + return res; +} + +ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags) { + return handle_EINTR([&]() { + return recv(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +ssize_t send_socket(socket_t sock, const void *ptr, size_t size, + int flags) { + return handle_EINTR([&]() { + return send(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +int poll_wrapper(struct pollfd *fds, nfds_t nfds, int timeout) { +#ifdef _WIN32 + return ::WSAPoll(fds, nfds, timeout); +#else + return ::poll(fds, nfds, timeout); +#endif +} + +template +ssize_t select_impl(socket_t sock, time_t sec, time_t usec) { + struct pollfd pfd; + pfd.fd = sock; + pfd.events = (Read ? POLLIN : POLLOUT); + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + return handle_EINTR([&]() { return poll_wrapper(&pfd, 1, timeout); }); +} + +ssize_t select_read(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, sec, usec); +} + +ssize_t select_write(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, sec, usec); +} + +Error wait_until_socket_is_ready(socket_t sock, time_t sec, + time_t usec) { + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLIN | POLLOUT; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + auto poll_res = + handle_EINTR([&]() { return poll_wrapper(&pfd_read, 1, timeout); }); + + if (poll_res == 0) { return Error::ConnectionTimeout; } + + if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) { + auto error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +} + +bool is_socket_alive(socket_t sock) { + const auto val = detail::select_read(sock, 0, 0); + if (val == 0) { + return true; + } else if (val < 0 && errno == EBADF) { + return false; + } + char buf[1]; + return detail::read_socket(sock, &buf[0], sizeof(buf), MSG_PEEK) > 0; +} + +class SocketStream final : public Stream { +public: + SocketStream(socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + +private: + socket_t sock_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; + + std::vector read_buff_; + size_t read_buff_off_ = 0; + size_t read_buff_content_size_ = 0; + + static const size_t read_buff_size_ = 1024l * 4; +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +class SSLSocketStream final : public Stream { +public: + SSLSocketStream( + socket_t sock, SSL *ssl, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SSLSocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + +private: + socket_t sock_; + SSL *ssl_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; +}; +#endif + +bool keep_alive(const std::atomic &svr_sock, socket_t sock, + time_t keep_alive_timeout_sec) { + using namespace std::chrono; + + const auto interval_usec = + CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND; + + // Avoid expensive `steady_clock::now()` call for the first time + if (select_read(sock, 0, interval_usec) > 0) { return true; } + + const auto start = steady_clock::now() - microseconds{interval_usec}; + const auto timeout = seconds{keep_alive_timeout_sec}; + + while (true) { + if (svr_sock == INVALID_SOCKET) { + break; // Server socket is closed + } + + auto val = select_read(sock, 0, interval_usec); + if (val < 0) { + break; // Ssocket error + } else if (val == 0) { + if (steady_clock::now() - start > timeout) { + break; // Timeout + } + } else { + return true; // Ready for read + } + } + + return false; +} + +template +bool +process_server_socket_core(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, T callback) { + assert(keep_alive_max_count > 0); + auto ret = false; + auto count = keep_alive_max_count; + while (count > 0 && keep_alive(svr_sock, sock, keep_alive_timeout_sec)) { + auto close_connection = count == 1; + auto connection_closed = false; + ret = callback(close_connection, connection_closed); + if (!ret || connection_closed) { break; } + count--; + } + return ret; +} + +template +bool +process_server_socket(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +bool process_client_socket( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, + std::function callback) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +int shutdown_socket(socket_t sock) { +#ifdef _WIN32 + return shutdown(sock, SD_BOTH); +#else + return shutdown(sock, SHUT_RDWR); +#endif +} + +std::string escape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '\0') { + auto ret = s; + ret[0] = '@'; + return ret; + } + return s; +} + +std::string +unescape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '@') { + auto ret = s; + ret[0] = '\0'; + return ret; + } + return s; +} + +template +socket_t create_socket(const std::string &host, const std::string &ip, int port, + int address_family, int socket_flags, bool tcp_nodelay, + bool ipv6_v6only, SocketOptions socket_options, + BindOrConnect bind_or_connect) { + // Get address info + const char *node = nullptr; + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_IP; + + if (!ip.empty()) { + node = ip.c_str(); + // Ask getaddrinfo to convert IP in c-string to address + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICHOST; + } else { + if (!host.empty()) { node = host.c_str(); } + hints.ai_family = address_family; + hints.ai_flags = socket_flags; + } + + if (hints.ai_family == AF_UNIX) { + const auto addrlen = host.length(); + if (addrlen > sizeof(sockaddr_un::sun_path)) { return INVALID_SOCKET; } + +#ifdef SOCK_CLOEXEC + auto sock = socket(hints.ai_family, hints.ai_socktype | SOCK_CLOEXEC, + hints.ai_protocol); +#else + auto sock = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol); +#endif + + if (sock != INVALID_SOCKET) { + sockaddr_un addr{}; + addr.sun_family = AF_UNIX; + + auto unescaped_host = unescape_abstract_namespace_unix_domain(host); + std::copy(unescaped_host.begin(), unescaped_host.end(), addr.sun_path); + + hints.ai_addr = reinterpret_cast(&addr); + hints.ai_addrlen = static_cast( + sizeof(addr) - sizeof(addr.sun_path) + addrlen); + +#ifndef SOCK_CLOEXEC +#ifndef _WIN32 + fcntl(sock, F_SETFD, FD_CLOEXEC); +#endif +#endif + + if (socket_options) { socket_options(sock); } + +#ifdef _WIN32 + // Setting SO_REUSEADDR seems not to work well with AF_UNIX on windows, so + // remove the option. + detail::set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 0); +#endif + + bool dummy; + if (!bind_or_connect(sock, hints, dummy)) { + close_socket(sock); + sock = INVALID_SOCKET; + } + } + return sock; + } + + auto service = std::to_string(port); + + if (getaddrinfo(node, service.c_str(), &hints, &result)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return INVALID_SOCKET; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + // Create a socket +#ifdef _WIN32 + auto sock = + WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, + WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); + /** + * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1 + * and above the socket creation fails on older Windows Systems. + * + * Let's try to create a socket the old way in this case. + * + * Reference: + * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa + * + * WSA_FLAG_NO_HANDLE_INHERIT: + * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with + * SP1, and later + * + */ + if (sock == INVALID_SOCKET) { + sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + } +#else + +#ifdef SOCK_CLOEXEC + auto sock = + socket(rp->ai_family, rp->ai_socktype | SOCK_CLOEXEC, rp->ai_protocol); +#else + auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); +#endif + +#endif + if (sock == INVALID_SOCKET) { continue; } + +#if !defined _WIN32 && !defined SOCK_CLOEXEC + if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { + close_socket(sock); + continue; + } +#endif + + if (tcp_nodelay) { set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); } + + if (rp->ai_family == AF_INET6) { + set_socket_opt(sock, IPPROTO_IPV6, IPV6_V6ONLY, ipv6_v6only ? 1 : 0); + } + + if (socket_options) { socket_options(sock); } + + // bind or connect + auto quit = false; + if (bind_or_connect(sock, *rp, quit)) { return sock; } + + close_socket(sock); + + if (quit) { break; } + } + + return INVALID_SOCKET; +} + +void set_nonblocking(socket_t sock, bool nonblocking) { +#ifdef _WIN32 + auto flags = nonblocking ? 1UL : 0UL; + ioctlsocket(sock, FIONBIO, &flags); +#else + auto flags = fcntl(sock, F_GETFL, 0); + fcntl(sock, F_SETFL, + nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK))); +#endif +} + +bool is_connection_error() { +#ifdef _WIN32 + return WSAGetLastError() != WSAEWOULDBLOCK; +#else + return errno != EINPROGRESS; +#endif +} + +bool bind_ip_address(socket_t sock, const std::string &host) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo(host.c_str(), "0", &hints, &result)) { return false; } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + auto ret = false; + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &ai = *rp; + if (!::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + ret = true; + break; + } + } + + return ret; +} + +#if !defined _WIN32 && !defined ANDROID && !defined _AIX && !defined __MVS__ +#define USE_IF2IP +#endif + +#ifdef USE_IF2IP +std::string if2ip(int address_family, const std::string &ifn) { + struct ifaddrs *ifap; + getifaddrs(&ifap); + auto se = detail::scope_exit([&] { freeifaddrs(ifap); }); + + std::string addr_candidate; + for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifn == ifa->ifa_name && + (AF_UNSPEC == address_family || + ifa->ifa_addr->sa_family == address_family)) { + if (ifa->ifa_addr->sa_family == AF_INET) { + auto sa = reinterpret_cast(ifa->ifa_addr); + char buf[INET_ADDRSTRLEN]; + if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) { + return std::string(buf, INET_ADDRSTRLEN); + } + } else if (ifa->ifa_addr->sa_family == AF_INET6) { + auto sa = reinterpret_cast(ifa->ifa_addr); + if (!IN6_IS_ADDR_LINKLOCAL(&sa->sin6_addr)) { + char buf[INET6_ADDRSTRLEN] = {}; + if (inet_ntop(AF_INET6, &sa->sin6_addr, buf, INET6_ADDRSTRLEN)) { + // equivalent to mac's IN6_IS_ADDR_UNIQUE_LOCAL + auto s6_addr_head = sa->sin6_addr.s6_addr[0]; + if (s6_addr_head == 0xfc || s6_addr_head == 0xfd) { + addr_candidate = std::string(buf, INET6_ADDRSTRLEN); + } else { + return std::string(buf, INET6_ADDRSTRLEN); + } + } + } + } + } + } + return addr_candidate; +} +#endif + +socket_t create_client_socket( + const std::string &host, const std::string &ip, int port, + int address_family, bool tcp_nodelay, bool ipv6_v6only, + SocketOptions socket_options, time_t connection_timeout_sec, + time_t connection_timeout_usec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, const std::string &intf, Error &error) { + auto sock = create_socket( + host, ip, port, address_family, 0, tcp_nodelay, ipv6_v6only, + std::move(socket_options), + [&](socket_t sock2, struct addrinfo &ai, bool &quit) -> bool { + if (!intf.empty()) { +#ifdef USE_IF2IP + auto ip_from_if = if2ip(address_family, intf); + if (ip_from_if.empty()) { ip_from_if = intf; } + if (!bind_ip_address(sock2, ip_from_if)) { + error = Error::BindIPAddress; + return false; + } +#endif + } + + set_nonblocking(sock2, true); + + auto ret = + ::connect(sock2, ai.ai_addr, static_cast(ai.ai_addrlen)); + + if (ret < 0) { + if (is_connection_error()) { + error = Error::Connection; + return false; + } + error = wait_until_socket_is_ready(sock2, connection_timeout_sec, + connection_timeout_usec); + if (error != Error::Success) { + if (error == Error::ConnectionTimeout) { quit = true; } + return false; + } + } + + set_nonblocking(sock2, false); + set_socket_opt_time(sock2, SOL_SOCKET, SO_RCVTIMEO, read_timeout_sec, + read_timeout_usec); + set_socket_opt_time(sock2, SOL_SOCKET, SO_SNDTIMEO, write_timeout_sec, + write_timeout_usec); + + error = Error::Success; + return true; + }); + + if (sock != INVALID_SOCKET) { + error = Error::Success; + } else { + if (error == Error::Success) { error = Error::Connection; } + } + + return sock; +} + +bool get_ip_and_port(const struct sockaddr_storage &addr, + socklen_t addr_len, std::string &ip, int &port) { + if (addr.ss_family == AF_INET) { + port = ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + port = + ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return false; + } + + std::array ipstr{}; + if (getnameinfo(reinterpret_cast(&addr), addr_len, + ipstr.data(), static_cast(ipstr.size()), nullptr, + 0, NI_NUMERICHOST)) { + return false; + } + + ip = ipstr.data(); + return true; +} + +void get_local_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (!getsockname(sock, reinterpret_cast(&addr), + &addr_len)) { + get_ip_and_port(addr, addr_len, ip, port); + } +} + +void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + + if (!getpeername(sock, reinterpret_cast(&addr), + &addr_len)) { +#ifndef _WIN32 + if (addr.ss_family == AF_UNIX) { +#if defined(__linux__) + struct ucred ucred; + socklen_t len = sizeof(ucred); + if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) { + port = ucred.pid; + } +#elif defined(SOL_LOCAL) && defined(SO_PEERPID) // __APPLE__ + pid_t pid; + socklen_t len = sizeof(pid); + if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) { + port = pid; + } +#endif + return; + } +#endif + get_ip_and_port(addr, addr_len, ip, port); + } +} + +constexpr unsigned int str2tag_core(const char *s, size_t l, + unsigned int h) { + return (l == 0) + ? h + : str2tag_core( + s + 1, l - 1, + // Unsets the 6 high bits of h, therefore no overflow happens + (((std::numeric_limits::max)() >> 6) & + h * 33) ^ + static_cast(*s)); +} + +unsigned int str2tag(const std::string &s) { + return str2tag_core(s.data(), s.size(), 0); +} + +namespace udl { + +constexpr unsigned int operator""_t(const char *s, size_t l) { + return str2tag_core(s, l, 0); +} + +} // namespace udl + +std::string +find_content_type(const std::string &path, + const std::map &user_data, + const std::string &default_content_type) { + auto ext = file_extension(path); + + auto it = user_data.find(ext); + if (it != user_data.end()) { return it->second; } + + using udl::operator""_t; + + switch (str2tag(ext)) { + default: return default_content_type; + + case "css"_t: return "text/css"; + case "csv"_t: return "text/csv"; + case "htm"_t: + case "html"_t: return "text/html"; + case "js"_t: + case "mjs"_t: return "text/javascript"; + case "txt"_t: return "text/plain"; + case "vtt"_t: return "text/vtt"; + + case "apng"_t: return "image/apng"; + case "avif"_t: return "image/avif"; + case "bmp"_t: return "image/bmp"; + case "gif"_t: return "image/gif"; + case "png"_t: return "image/png"; + case "svg"_t: return "image/svg+xml"; + case "webp"_t: return "image/webp"; + case "ico"_t: return "image/x-icon"; + case "tif"_t: return "image/tiff"; + case "tiff"_t: return "image/tiff"; + case "jpg"_t: + case "jpeg"_t: return "image/jpeg"; + + case "mp4"_t: return "video/mp4"; + case "mpeg"_t: return "video/mpeg"; + case "webm"_t: return "video/webm"; + + case "mp3"_t: return "audio/mp3"; + case "mpga"_t: return "audio/mpeg"; + case "weba"_t: return "audio/webm"; + case "wav"_t: return "audio/wave"; + + case "otf"_t: return "font/otf"; + case "ttf"_t: return "font/ttf"; + case "woff"_t: return "font/woff"; + case "woff2"_t: return "font/woff2"; + + case "7z"_t: return "application/x-7z-compressed"; + case "atom"_t: return "application/atom+xml"; + case "pdf"_t: return "application/pdf"; + case "json"_t: return "application/json"; + case "rss"_t: return "application/rss+xml"; + case "tar"_t: return "application/x-tar"; + case "xht"_t: + case "xhtml"_t: return "application/xhtml+xml"; + case "xslt"_t: return "application/xslt+xml"; + case "xml"_t: return "application/xml"; + case "gz"_t: return "application/gzip"; + case "zip"_t: return "application/zip"; + case "wasm"_t: return "application/wasm"; + } +} + +bool can_compress_content_type(const std::string &content_type) { + using udl::operator""_t; + + auto tag = str2tag(content_type); + + switch (tag) { + case "image/svg+xml"_t: + case "application/javascript"_t: + case "application/json"_t: + case "application/xml"_t: + case "application/protobuf"_t: + case "application/xhtml+xml"_t: return true; + + case "text/event-stream"_t: return false; + + default: return !content_type.rfind("text/", 0); + } +} + +EncodingType encoding_type(const Request &req, const Response &res) { + auto ret = + detail::can_compress_content_type(res.get_header_value("Content-Type")); + if (!ret) { return EncodingType::None; } + + const auto &s = req.get_header_value("Accept-Encoding"); + (void)(s); + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + // TODO: 'Accept-Encoding' has br, not br;q=0 + ret = s.find("br") != std::string::npos; + if (ret) { return EncodingType::Brotli; } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + // TODO: 'Accept-Encoding' has gzip, not gzip;q=0 + ret = s.find("gzip") != std::string::npos; + if (ret) { return EncodingType::Gzip; } +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + // TODO: 'Accept-Encoding' has zstd, not zstd;q=0 + ret = s.find("zstd") != std::string::npos; + if (ret) { return EncodingType::Zstd; } +#endif + + return EncodingType::None; +} + +bool nocompressor::compress(const char *data, size_t data_length, + bool /*last*/, Callback callback) { + if (!data_length) { return true; } + return callback(data, data_length); +} + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +gzip_compressor::gzip_compressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + is_valid_ = deflateInit2(&strm_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, + Z_DEFAULT_STRATEGY) == Z_OK; +} + +gzip_compressor::~gzip_compressor() { deflateEnd(&strm_); } + +bool gzip_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + assert(is_valid_); + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + auto flush = (last && data_length == 0) ? Z_FINISH : Z_NO_FLUSH; + auto ret = Z_OK; + + std::array buff{}; + do { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = deflate(&strm_, flush); + if (ret == Z_STREAM_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } while (strm_.avail_out == 0); + + assert((flush == Z_FINISH && ret == Z_STREAM_END) || + (flush == Z_NO_FLUSH && ret == Z_OK)); + assert(strm_.avail_in == 0); + } while (data_length > 0); + + return true; +} + +gzip_decompressor::gzip_decompressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + // 15 is the value of wbits, which should be at the maximum possible value + // to ensure that any gzip stream can be decoded. The offset of 32 specifies + // that the stream type should be automatically detected either gzip or + // deflate. + is_valid_ = inflateInit2(&strm_, 32 + 15) == Z_OK; +} + +gzip_decompressor::~gzip_decompressor() { inflateEnd(&strm_); } + +bool gzip_decompressor::is_valid() const { return is_valid_; } + +bool gzip_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + assert(is_valid_); + + auto ret = Z_OK; + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + std::array buff{}; + while (strm_.avail_in > 0 && ret == Z_OK) { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = inflate(&strm_, Z_NO_FLUSH); + + assert(ret != Z_STREAM_ERROR); + switch (ret) { + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_MEM_ERROR: inflateEnd(&strm_); return false; + } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } + + if (ret != Z_OK && ret != Z_STREAM_END) { return false; } + + } while (data_length > 0); + + return true; +} +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +brotli_compressor::brotli_compressor() { + state_ = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr); +} + +brotli_compressor::~brotli_compressor() { + BrotliEncoderDestroyInstance(state_); +} + +bool brotli_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + auto operation = last ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS; + auto available_in = data_length; + auto next_in = reinterpret_cast(data); + + for (;;) { + if (last) { + if (BrotliEncoderIsFinished(state_)) { break; } + } else { + if (!available_in) { break; } + } + + auto available_out = buff.size(); + auto next_out = buff.data(); + + if (!BrotliEncoderCompressStream(state_, operation, &available_in, &next_in, + &available_out, &next_out, nullptr)) { + return false; + } + + auto output_bytes = buff.size() - available_out; + if (output_bytes) { + callback(reinterpret_cast(buff.data()), output_bytes); + } + } + + return true; +} + +brotli_decompressor::brotli_decompressor() { + decoder_s = BrotliDecoderCreateInstance(0, 0, 0); + decoder_r = decoder_s ? BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT + : BROTLI_DECODER_RESULT_ERROR; +} + +brotli_decompressor::~brotli_decompressor() { + if (decoder_s) { BrotliDecoderDestroyInstance(decoder_s); } +} + +bool brotli_decompressor::is_valid() const { return decoder_s; } + +bool brotli_decompressor::decompress(const char *data, + size_t data_length, + Callback callback) { + if (decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_ERROR) { + return 0; + } + + auto next_in = reinterpret_cast(data); + size_t avail_in = data_length; + size_t total_out; + + decoder_r = BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; + + std::array buff{}; + while (decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { + char *next_out = buff.data(); + size_t avail_out = buff.size(); + + decoder_r = BrotliDecoderDecompressStream( + decoder_s, &avail_in, &next_in, &avail_out, + reinterpret_cast(&next_out), &total_out); + + if (decoder_r == BROTLI_DECODER_RESULT_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - avail_out)) { return false; } + } + + return decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; +} +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +zstd_compressor::zstd_compressor() { + ctx_ = ZSTD_createCCtx(); + ZSTD_CCtx_setParameter(ctx_, ZSTD_c_compressionLevel, ZSTD_fast); +} + +zstd_compressor::~zstd_compressor() { ZSTD_freeCCtx(ctx_); } + +bool zstd_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + ZSTD_EndDirective mode = last ? ZSTD_e_end : ZSTD_e_continue; + ZSTD_inBuffer input = {data, data_length, 0}; + + bool finished; + do { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_compressStream2(ctx_, &output, &input, mode); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + + finished = last ? (remaining == 0) : (input.pos == input.size); + + } while (!finished); + + return true; +} + +zstd_decompressor::zstd_decompressor() { ctx_ = ZSTD_createDCtx(); } + +zstd_decompressor::~zstd_decompressor() { ZSTD_freeDCtx(ctx_); } + +bool zstd_decompressor::is_valid() const { return ctx_ != nullptr; } + +bool zstd_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + std::array buff{}; + ZSTD_inBuffer input = {data, data_length, 0}; + + while (input.pos < input.size) { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_decompressStream(ctx_, &output, &input); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + } + + return true; +} +#endif + +bool has_header(const Headers &headers, const std::string &key) { + return headers.find(key) != headers.end(); +} + +const char *get_header_value(const Headers &headers, + const std::string &key, const char *def, + size_t id) { + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.c_str(); } + return def; +} + +template +bool parse_header(const char *beg, const char *end, T fn) { + // Skip trailing spaces and tabs. + while (beg < end && is_space_or_tab(end[-1])) { + end--; + } + + auto p = beg; + while (p < end && *p != ':') { + p++; + } + + auto name = std::string(beg, p); + if (!detail::fields::is_field_name(name)) { return false; } + + if (p == end) { return false; } + + auto key_end = p; + + if (*p++ != ':') { return false; } + + while (p < end && is_space_or_tab(*p)) { + p++; + } + + if (p <= end) { + auto key_len = key_end - beg; + if (!key_len) { return false; } + + auto key = std::string(beg, key_end); + auto val = std::string(p, end); + + if (!detail::fields::is_field_value(val)) { return false; } + + if (case_ignore::equal(key, "Location") || + case_ignore::equal(key, "Referer")) { + fn(key, val); + } else { + fn(key, decode_url(val, false)); + } + + return true; + } + + return false; +} + +bool read_headers(Stream &strm, Headers &headers) { + const auto bufsiz = 2048; + char buf[bufsiz]; + stream_line_reader line_reader(strm, buf, bufsiz); + + for (;;) { + if (!line_reader.getline()) { return false; } + + // Check if the line ends with CRLF. + auto line_terminator_len = 2; + if (line_reader.end_with_crlf()) { + // Blank line indicates end of headers. + if (line_reader.size() == 2) { break; } + } else { +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + // Blank line indicates end of headers. + if (line_reader.size() == 1) { break; } + line_terminator_len = 1; +#else + continue; // Skip invalid line. +#endif + } + + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + + // Exclude line terminator + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + if (!parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + headers.emplace(key, val); + })) { + return false; + } + } + + return true; +} + +bool read_content_with_length(Stream &strm, uint64_t len, + Progress progress, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + + uint64_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return false; } + + if (!out(buf, static_cast(n), r, len)) { return false; } + r += static_cast(n); + + if (progress) { + if (!progress(r, len)) { return false; } + } + } + + return true; +} + +void skip_content_with_length(Stream &strm, uint64_t len) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + uint64_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); + if (n <= 0) { return; } + r += static_cast(n); + } +} + +bool read_content_without_length(Stream &strm, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + uint64_t r = 0; + for (;;) { + auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); + if (n == 0) { return true; } + if (n < 0) { return false; } + + if (!out(buf, static_cast(n), r, 0)) { return false; } + r += static_cast(n); + } + + return true; +} + +template +bool read_content_chunked(Stream &strm, T &x, + ContentReceiverWithProgress out) { + const auto bufsiz = 16; + char buf[bufsiz]; + + stream_line_reader line_reader(strm, buf, bufsiz); + + if (!line_reader.getline()) { return false; } + + unsigned long chunk_len; + while (true) { + char *end_ptr; + + chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); + + if (end_ptr == line_reader.ptr()) { return false; } + if (chunk_len == ULONG_MAX) { return false; } + + if (chunk_len == 0) { break; } + + if (!read_content_with_length(strm, chunk_len, nullptr, out)) { + return false; + } + + if (!line_reader.getline()) { return false; } + + if (strcmp(line_reader.ptr(), "\r\n") != 0) { return false; } + + if (!line_reader.getline()) { return false; } + } + + assert(chunk_len == 0); + + // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked + // transfer coding is complete when a chunk with a chunk-size of zero is + // received, possibly followed by a trailer section, and finally terminated by + // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 + // + // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section + // does't care for the existence of the final CRLF. In other words, it seems + // to be ok whether the final CRLF exists or not in the chunked data. + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 + // + // According to the reference code in RFC 9112, cpp-httplib now allows + // chunked transfer coding data without the final CRLF. + if (!line_reader.getline()) { return true; } + + while (strcmp(line_reader.ptr(), "\r\n") != 0) { + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + + // Exclude line terminator + constexpr auto line_terminator_len = 2; + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + x.headers.emplace(key, val); + }); + + if (!line_reader.getline()) { return false; } + } + + return true; +} + +bool is_chunked_transfer_encoding(const Headers &headers) { + return case_ignore::equal( + get_header_value(headers, "Transfer-Encoding", "", 0), "chunked"); +} + +template +bool prepare_content_receiver(T &x, int &status, + ContentReceiverWithProgress receiver, + bool decompress, U callback) { + if (decompress) { + std::string encoding = x.get_header_value("Content-Encoding"); + std::unique_ptr decompressor; + + if (encoding == "gzip" || encoding == "deflate") { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding.find("br") != std::string::npos) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } else if (encoding == "zstd") { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + decompressor = detail::make_unique(); +#else + status = StatusCode::UnsupportedMediaType_415; + return false; +#endif + } + + if (decompressor) { + if (decompressor->is_valid()) { + ContentReceiverWithProgress out = [&](const char *buf, size_t n, + uint64_t off, uint64_t len) { + return decompressor->decompress(buf, n, + [&](const char *buf2, size_t n2) { + return receiver(buf2, n2, off, len); + }); + }; + return callback(std::move(out)); + } else { + status = StatusCode::InternalServerError_500; + return false; + } + } + } + + ContentReceiverWithProgress out = [&](const char *buf, size_t n, uint64_t off, + uint64_t len) { + return receiver(buf, n, off, len); + }; + return callback(std::move(out)); +} + +template +bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, + Progress progress, ContentReceiverWithProgress receiver, + bool decompress) { + return prepare_content_receiver( + x, status, std::move(receiver), decompress, + [&](const ContentReceiverWithProgress &out) { + auto ret = true; + auto exceed_payload_max_length = false; + + if (is_chunked_transfer_encoding(x.headers)) { + ret = read_content_chunked(strm, x, out); + } else if (!has_header(x.headers, "Content-Length")) { + ret = read_content_without_length(strm, out); + } else { + auto is_invalid_value = false; + auto len = get_header_value_u64( + x.headers, "Content-Length", + (std::numeric_limits::max)(), 0, is_invalid_value); + + if (is_invalid_value) { + ret = false; + } else if (len > payload_max_length) { + exceed_payload_max_length = true; + skip_content_with_length(strm, len); + ret = false; + } else if (len > 0) { + ret = read_content_with_length(strm, len, std::move(progress), out); + } + } + + if (!ret) { + status = exceed_payload_max_length ? StatusCode::PayloadTooLarge_413 + : StatusCode::BadRequest_400; + } + return ret; + }); +} + +ssize_t write_request_line(Stream &strm, const std::string &method, + const std::string &path) { + std::string s = method; + s += " "; + s += path; + s += " HTTP/1.1\r\n"; + return strm.write(s.data(), s.size()); +} + +ssize_t write_response_line(Stream &strm, int status) { + std::string s = "HTTP/1.1 "; + s += std::to_string(status); + s += " "; + s += httplib::status_message(status); + s += "\r\n"; + return strm.write(s.data(), s.size()); +} + +ssize_t write_headers(Stream &strm, const Headers &headers) { + ssize_t write_len = 0; + for (const auto &x : headers) { + std::string s; + s = x.first; + s += ": "; + s += x.second; + s += "\r\n"; + + auto len = strm.write(s.data(), s.size()); + if (len < 0) { return len; } + write_len += len; + } + auto len = strm.write("\r\n"); + if (len < 0) { return len; } + write_len += len; + return write_len; +} + +bool write_data(Stream &strm, const char *d, size_t l) { + size_t offset = 0; + while (offset < l) { + auto length = strm.write(d + offset, l - offset); + if (length < 0) { return false; } + offset += static_cast(length); + } + return true; +} + +template +bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, T is_shutting_down, + Error &error) { + size_t end_offset = offset + length; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + if (write_data(strm, d, l)) { + offset += l; + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + while (offset < end_offset && !is_shutting_down()) { + if (!strm.wait_writable()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, end_offset - offset, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, + const T &is_shutting_down) { + auto error = Error::Success; + return write_content(strm, content_provider, offset, length, is_shutting_down, + error); +} + +template +bool +write_content_without_length(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + offset += l; + if (!write_data(strm, d, l)) { ok = false; } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + data_sink.done = [&](void) { data_available = false; }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable()) { + return false; + } else if (!content_provider(offset, 0, data_sink)) { + return false; + } else if (!ok) { + return false; + } + } + return true; +} + +template +bool +write_content_chunked(Stream &strm, const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor, Error &error) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + data_available = l > 0; + offset += l; + + std::string payload; + if (compressor.compress(d, l, false, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = + from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; + + auto done_with_trailer = [&](const Headers *trailer) { + if (!ok) { return; } + + data_available = false; + + std::string payload; + if (!compressor.compress(nullptr, 0, true, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + ok = false; + return; + } + + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { + ok = false; + return; + } + } + + constexpr const char done_marker[] = "0\r\n"; + if (!write_data(strm, done_marker, str_len(done_marker))) { ok = false; } + + // Trailer + if (trailer) { + for (const auto &kv : *trailer) { + std::string field_line = kv.first + ": " + kv.second + "\r\n"; + if (!write_data(strm, field_line.data(), field_line.size())) { + ok = false; + } + } + } + + constexpr const char crlf[] = "\r\n"; + if (!write_data(strm, crlf, str_len(crlf))) { ok = false; } + }; + + data_sink.done = [&](void) { done_with_trailer(nullptr); }; + + data_sink.done_with_trailer = [&](const Headers &trailer) { + done_with_trailer(&trailer); + }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, 0, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + error = Error::Success; + return true; +} + +template +bool write_content_chunked(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor) { + auto error = Error::Success; + return write_content_chunked(strm, content_provider, is_shutting_down, + compressor, error); +} + +template +bool redirect(T &cli, Request &req, Response &res, + const std::string &path, const std::string &location, + Error &error) { + Request new_req = req; + new_req.path = path; + new_req.redirect_count_ -= 1; + + if (res.status == StatusCode::SeeOther_303 && + (req.method != "GET" && req.method != "HEAD")) { + new_req.method = "GET"; + new_req.body.clear(); + new_req.headers.clear(); + } + + Response new_res; + + auto ret = cli.send(new_req, new_res, error); + if (ret) { + req = new_req; + res = new_res; + + if (res.location.empty()) { res.location = location; } + } + return ret; +} + +std::string params_to_query_str(const Params ¶ms) { + std::string query; + + for (auto it = params.begin(); it != params.end(); ++it) { + if (it != params.begin()) { query += "&"; } + query += it->first; + query += "="; + query += encode_query_param(it->second); + } + return query; +} + +void parse_query_text(const char *data, std::size_t size, + Params ¶ms) { + std::set cache; + split(data, data + size, '&', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(std::move(kv)); + + std::string key; + std::string val; + divide(b, static_cast(e - b), '=', + [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, + std::size_t rhs_size) { + key.assign(lhs_data, lhs_size); + val.assign(rhs_data, rhs_size); + }); + + if (!key.empty()) { + params.emplace(decode_url(key, true), decode_url(val, true)); + } + }); +} + +void parse_query_text(const std::string &s, Params ¶ms) { + parse_query_text(s.data(), s.size(), params); +} + +bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary) { + auto boundary_keyword = "boundary="; + auto pos = content_type.find(boundary_keyword); + if (pos == std::string::npos) { return false; } + auto end = content_type.find(';', pos); + auto beg = pos + strlen(boundary_keyword); + boundary = trim_double_quotes_copy(content_type.substr(beg, end - beg)); + return !boundary.empty(); +} + +void parse_disposition_params(const std::string &s, Params ¶ms) { + std::set cache; + split(s.data(), s.data() + s.size(), ';', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(kv); + + std::string key; + std::string val; + split(b, e, '=', [&](const char *b2, const char *e2) { + if (key.empty()) { + key.assign(b2, e2); + } else { + val.assign(b2, e2); + } + }); + + if (!key.empty()) { + params.emplace(trim_double_quotes_copy((key)), + trim_double_quotes_copy((val))); + } + }); +} + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +bool parse_range_header(const std::string &s, Ranges &ranges) { +#else +bool parse_range_header(const std::string &s, Ranges &ranges) try { +#endif + auto is_valid = [](const std::string &str) { + return std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); + }; + + if (s.size() > 7 && s.compare(0, 6, "bytes=") == 0) { + const auto pos = static_cast(6); + const auto len = static_cast(s.size() - 6); + auto all_valid_ranges = true; + split(&s[pos], &s[pos + len], ',', [&](const char *b, const char *e) { + if (!all_valid_ranges) { return; } + + const auto it = std::find(b, e, '-'); + if (it == e) { + all_valid_ranges = false; + return; + } + + const auto lhs = std::string(b, it); + const auto rhs = std::string(it + 1, e); + if (!is_valid(lhs) || !is_valid(rhs)) { + all_valid_ranges = false; + return; + } + + const auto first = + static_cast(lhs.empty() ? -1 : std::stoll(lhs)); + const auto last = + static_cast(rhs.empty() ? -1 : std::stoll(rhs)); + if ((first == -1 && last == -1) || + (first != -1 && last != -1 && first > last)) { + all_valid_ranges = false; + return; + } + + ranges.emplace_back(first, last); + }); + return all_valid_ranges && !ranges.empty(); + } + return false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +} +#else +} catch (...) { return false; } +#endif + +class MultipartFormDataParser { +public: + MultipartFormDataParser() = default; + + void set_boundary(std::string &&boundary) { + boundary_ = boundary; + dash_boundary_crlf_ = dash_ + boundary_ + crlf_; + crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + } + + bool is_valid() const { return is_valid_; } + + bool parse(const char *buf, size_t n, const ContentReceiver &content_callback, + const MultipartContentHeader &header_callback) { + + buf_append(buf, n); + + while (buf_size() > 0) { + switch (state_) { + case 0: { // Initial boundary + buf_erase(buf_find(dash_boundary_crlf_)); + if (dash_boundary_crlf_.size() > buf_size()) { return true; } + if (!buf_start_with(dash_boundary_crlf_)) { return false; } + buf_erase(dash_boundary_crlf_.size()); + state_ = 1; + break; + } + case 1: { // New entry + clear_file_info(); + state_ = 2; + break; + } + case 2: { // Headers + auto pos = buf_find(crlf_); + if (pos > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + while (pos < buf_size()) { + // Empty line + if (pos == 0) { + if (!header_callback(file_)) { + is_valid_ = false; + return false; + } + buf_erase(crlf_.size()); + state_ = 3; + break; + } + + const auto header = buf_head(pos); + + if (!parse_header(header.data(), header.data() + header.size(), + [&](const std::string &, const std::string &) {})) { + is_valid_ = false; + return false; + } + + constexpr const char header_content_type[] = "Content-Type:"; + + if (start_with_case_ignore(header, header_content_type)) { + file_.content_type = + trim_copy(header.substr(str_len(header_content_type))); + } else { + thread_local const std::regex re_content_disposition( + R"~(^Content-Disposition:\s*form-data;\s*(.*)$)~", + std::regex_constants::icase); + + std::smatch m; + if (std::regex_match(header, m, re_content_disposition)) { + Params params; + parse_disposition_params(m[1], params); + + auto it = params.find("name"); + if (it != params.end()) { + file_.name = it->second; + } else { + is_valid_ = false; + return false; + } + + it = params.find("filename"); + if (it != params.end()) { file_.filename = it->second; } + + it = params.find("filename*"); + if (it != params.end()) { + // Only allow UTF-8 encoding... + thread_local const std::regex re_rfc5987_encoding( + R"~(^UTF-8''(.+?)$)~", std::regex_constants::icase); + + std::smatch m2; + if (std::regex_match(it->second, m2, re_rfc5987_encoding)) { + file_.filename = decode_url(m2[1], false); // override... + } else { + is_valid_ = false; + return false; + } + } + } + } + buf_erase(pos + crlf_.size()); + pos = buf_find(crlf_); + } + if (state_ != 3) { return true; } + break; + } + case 3: { // Body + if (crlf_dash_boundary_.size() > buf_size()) { return true; } + auto pos = buf_find(crlf_dash_boundary_); + if (pos < buf_size()) { + if (!content_callback(buf_data(), pos)) { + is_valid_ = false; + return false; + } + buf_erase(pos + crlf_dash_boundary_.size()); + state_ = 4; + } else { + auto len = buf_size() - crlf_dash_boundary_.size(); + if (len > 0) { + if (!content_callback(buf_data(), len)) { + is_valid_ = false; + return false; + } + buf_erase(len); + } + return true; + } + break; + } + case 4: { // Boundary + if (crlf_.size() > buf_size()) { return true; } + if (buf_start_with(crlf_)) { + buf_erase(crlf_.size()); + state_ = 1; + } else { + if (dash_.size() > buf_size()) { return true; } + if (buf_start_with(dash_)) { + buf_erase(dash_.size()); + is_valid_ = true; + buf_erase(buf_size()); // Remove epilogue + } else { + return true; + } + } + break; + } + } + } + + return true; + } + +private: + void clear_file_info() { + file_.name.clear(); + file_.filename.clear(); + file_.content_type.clear(); + } + + bool start_with_case_ignore(const std::string &a, const char *b) const { + const auto b_len = strlen(b); + if (a.size() < b_len) { return false; } + for (size_t i = 0; i < b_len; i++) { + if (case_ignore::to_lower(a[i]) != case_ignore::to_lower(b[i])) { + return false; + } + } + return true; + } + + const std::string dash_ = "--"; + const std::string crlf_ = "\r\n"; + std::string boundary_; + std::string dash_boundary_crlf_; + std::string crlf_dash_boundary_; + + size_t state_ = 0; + bool is_valid_ = false; + MultipartFormData file_; + + // Buffer + bool start_with(const std::string &a, size_t spos, size_t epos, + const std::string &b) const { + if (epos - spos < b.size()) { return false; } + for (size_t i = 0; i < b.size(); i++) { + if (a[i + spos] != b[i]) { return false; } + } + return true; + } + + size_t buf_size() const { return buf_epos_ - buf_spos_; } + + const char *buf_data() const { return &buf_[buf_spos_]; } + + std::string buf_head(size_t l) const { return buf_.substr(buf_spos_, l); } + + bool buf_start_with(const std::string &s) const { + return start_with(buf_, buf_spos_, buf_epos_, s); + } + + size_t buf_find(const std::string &s) const { + auto c = s.front(); + + size_t off = buf_spos_; + while (off < buf_epos_) { + auto pos = off; + while (true) { + if (pos == buf_epos_) { return buf_size(); } + if (buf_[pos] == c) { break; } + pos++; + } + + auto remaining_size = buf_epos_ - pos; + if (s.size() > remaining_size) { return buf_size(); } + + if (start_with(buf_, pos, buf_epos_, s)) { return pos - buf_spos_; } + + off = pos + 1; + } + + return buf_size(); + } + + void buf_append(const char *data, size_t n) { + auto remaining_size = buf_size(); + if (remaining_size > 0 && buf_spos_ > 0) { + for (size_t i = 0; i < remaining_size; i++) { + buf_[i] = buf_[buf_spos_ + i]; + } + } + buf_spos_ = 0; + buf_epos_ = remaining_size; + + if (remaining_size + n > buf_.size()) { buf_.resize(remaining_size + n); } + + for (size_t i = 0; i < n; i++) { + buf_[buf_epos_ + i] = data[i]; + } + buf_epos_ += n; + } + + void buf_erase(size_t size) { buf_spos_ += size; } + + std::string buf_; + size_t buf_spos_ = 0; + size_t buf_epos_ = 0; +}; + +std::string random_string(size_t length) { + constexpr const char data[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + thread_local auto engine([]() { + // std::random_device might actually be deterministic on some + // platforms, but due to lack of support in the c++ standard library, + // doing better requires either some ugly hacks or breaking portability. + std::random_device seed_gen; + // Request 128 bits of entropy for initialization + std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()}; + return std::mt19937(seed_sequence); + }()); + + std::string result; + for (size_t i = 0; i < length; i++) { + result += data[engine() % (sizeof(data) - 1)]; + } + return result; +} + +std::string make_multipart_data_boundary() { + return "--cpp-httplib-multipart-data-" + detail::random_string(16); +} + +bool is_multipart_boundary_chars_valid(const std::string &boundary) { + auto valid = true; + for (size_t i = 0; i < boundary.size(); i++) { + auto c = boundary[i]; + if (!std::isalnum(c) && c != '-' && c != '_') { + valid = false; + break; + } + } + return valid; +} + +template +std::string +serialize_multipart_formdata_item_begin(const T &item, + const std::string &boundary) { + std::string body = "--" + boundary + "\r\n"; + body += "Content-Disposition: form-data; name=\"" + item.name + "\""; + if (!item.filename.empty()) { + body += "; filename=\"" + item.filename + "\""; + } + body += "\r\n"; + if (!item.content_type.empty()) { + body += "Content-Type: " + item.content_type + "\r\n"; + } + body += "\r\n"; + + return body; +} + +std::string serialize_multipart_formdata_item_end() { return "\r\n"; } + +std::string +serialize_multipart_formdata_finish(const std::string &boundary) { + return "--" + boundary + "--\r\n"; +} + +std::string +serialize_multipart_formdata_get_content_type(const std::string &boundary) { + return "multipart/form-data; boundary=" + boundary; +} + +std::string +serialize_multipart_formdata(const MultipartFormDataItems &items, + const std::string &boundary, bool finish = true) { + std::string body; + + for (const auto &item : items) { + body += serialize_multipart_formdata_item_begin(item, boundary); + body += item.content + serialize_multipart_formdata_item_end(); + } + + if (finish) { body += serialize_multipart_formdata_finish(boundary); } + + return body; +} + +bool range_error(Request &req, Response &res) { + if (!req.ranges.empty() && 200 <= res.status && res.status < 300) { + ssize_t content_len = static_cast( + res.content_length_ ? res.content_length_ : res.body.size()); + + ssize_t prev_first_pos = -1; + ssize_t prev_last_pos = -1; + size_t overwrapping_count = 0; + + // NOTE: The following Range check is based on '14.2. Range' in RFC 9110 + // 'HTTP Semantics' to avoid potential denial-of-service attacks. + // https://www.rfc-editor.org/rfc/rfc9110#section-14.2 + + // Too many ranges + if (req.ranges.size() > CPPHTTPLIB_RANGE_MAX_COUNT) { return true; } + + for (auto &r : req.ranges) { + auto &first_pos = r.first; + auto &last_pos = r.second; + + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = content_len; + } + + if (first_pos == -1) { + first_pos = content_len - last_pos; + last_pos = content_len - 1; + } + + // NOTE: RFC-9110 '14.1.2. Byte Ranges': + // A client can limit the number of bytes requested without knowing the + // size of the selected representation. If the last-pos value is absent, + // or if the value is greater than or equal to the current length of the + // representation data, the byte range is interpreted as the remainder of + // the representation (i.e., the server replaces the value of last-pos + // with a value that is one less than the current length of the selected + // representation). + // https://www.rfc-editor.org/rfc/rfc9110.html#section-14.1.2-6 + if (last_pos == -1 || last_pos >= content_len) { + last_pos = content_len - 1; + } + + // Range must be within content length + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos <= content_len - 1)) { + return true; + } + + // Ranges must be in ascending order + if (first_pos <= prev_first_pos) { return true; } + + // Request must not have more than two overlapping ranges + if (first_pos <= prev_last_pos) { + overwrapping_count++; + if (overwrapping_count > 2) { return true; } + } + + prev_first_pos = (std::max)(prev_first_pos, first_pos); + prev_last_pos = (std::max)(prev_last_pos, last_pos); + } + } + + return false; +} + +std::pair +get_range_offset_and_length(Range r, size_t content_length) { + assert(r.first != -1 && r.second != -1); + assert(0 <= r.first && r.first < static_cast(content_length)); + assert(r.first <= r.second && + r.second < static_cast(content_length)); + (void)(content_length); + return std::make_pair(r.first, static_cast(r.second - r.first) + 1); +} + +std::string make_content_range_header_field( + const std::pair &offset_and_length, size_t content_length) { + auto st = offset_and_length.first; + auto ed = st + offset_and_length.second - 1; + + std::string field = "bytes "; + field += std::to_string(st); + field += "-"; + field += std::to_string(ed); + field += "/"; + field += std::to_string(content_length); + return field; +} + +template +bool process_multipart_ranges_data(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length, SToken stoken, + CToken ctoken, Content content) { + for (size_t i = 0; i < req.ranges.size(); i++) { + ctoken("--"); + stoken(boundary); + ctoken("\r\n"); + if (!content_type.empty()) { + ctoken("Content-Type: "); + stoken(content_type); + ctoken("\r\n"); + } + + auto offset_and_length = + get_range_offset_and_length(req.ranges[i], content_length); + + ctoken("Content-Range: "); + stoken(make_content_range_header_field(offset_and_length, content_length)); + ctoken("\r\n"); + ctoken("\r\n"); + + if (!content(offset_and_length.first, offset_and_length.second)) { + return false; + } + ctoken("\r\n"); + } + + ctoken("--"); + stoken(boundary); + ctoken("--"); + + return true; +} + +void make_multipart_ranges_data(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, + std::string &data) { + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data += token; }, + [&](const std::string &token) { data += token; }, + [&](size_t offset, size_t length) { + assert(offset + length <= content_length); + data += res.body.substr(offset, length); + return true; + }); +} + +size_t get_multipart_ranges_data_length(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length) { + size_t data_length = 0; + + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data_length += token.size(); }, + [&](const std::string &token) { data_length += token.size(); }, + [&](size_t /*offset*/, size_t length) { + data_length += length; + return true; + }); + + return data_length; +} + +template +bool +write_multipart_ranges_data(Stream &strm, const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, const T &is_shutting_down) { + return process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { strm.write(token); }, + [&](const std::string &token) { strm.write(token); }, + [&](size_t offset, size_t length) { + return write_content(strm, res.content_provider_, offset, length, + is_shutting_down); + }); +} + +bool expect_content(const Request &req) { + if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" || + req.method == "DELETE") { + return true; + } + if (req.has_header("Content-Length") && + req.get_header_value_u64("Content-Length") > 0) { + return true; + } + if (is_chunked_transfer_encoding(req.headers)) { return true; } + return false; +} + +bool has_crlf(const std::string &s) { + auto p = s.c_str(); + while (*p) { + if (*p == '\r' || *p == '\n') { return true; } + p++; + } + return false; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +std::string message_digest(const std::string &s, const EVP_MD *algo) { + auto context = std::unique_ptr( + EVP_MD_CTX_new(), EVP_MD_CTX_free); + + unsigned int hash_length = 0; + unsigned char hash[EVP_MAX_MD_SIZE]; + + EVP_DigestInit_ex(context.get(), algo, nullptr); + EVP_DigestUpdate(context.get(), s.c_str(), s.size()); + EVP_DigestFinal_ex(context.get(), hash, &hash_length); + + std::stringstream ss; + for (auto i = 0u; i < hash_length; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << static_cast(hash[i]); + } + + return ss.str(); +} + +std::string MD5(const std::string &s) { + return message_digest(s, EVP_md5()); +} + +std::string SHA_256(const std::string &s) { + return message_digest(s, EVP_sha256()); +} + +std::string SHA_512(const std::string &s) { + return message_digest(s, EVP_sha512()); +} + +std::pair make_digest_authentication_header( + const Request &req, const std::map &auth, + size_t cnonce_count, const std::string &cnonce, const std::string &username, + const std::string &password, bool is_proxy = false) { + std::string nc; + { + std::stringstream ss; + ss << std::setfill('0') << std::setw(8) << std::hex << cnonce_count; + nc = ss.str(); + } + + std::string qop; + if (auth.find("qop") != auth.end()) { + qop = auth.at("qop"); + if (qop.find("auth-int") != std::string::npos) { + qop = "auth-int"; + } else if (qop.find("auth") != std::string::npos) { + qop = "auth"; + } else { + qop.clear(); + } + } + + std::string algo = "MD5"; + if (auth.find("algorithm") != auth.end()) { algo = auth.at("algorithm"); } + + std::string response; + { + auto H = algo == "SHA-256" ? detail::SHA_256 + : algo == "SHA-512" ? detail::SHA_512 + : detail::MD5; + + auto A1 = username + ":" + auth.at("realm") + ":" + password; + + auto A2 = req.method + ":" + req.path; + if (qop == "auth-int") { A2 += ":" + H(req.body); } + + if (qop.empty()) { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + H(A2)); + } else { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + nc + ":" + cnonce + + ":" + qop + ":" + H(A2)); + } + } + + auto opaque = (auth.find("opaque") != auth.end()) ? auth.at("opaque") : ""; + + auto field = "Digest username=\"" + username + "\", realm=\"" + + auth.at("realm") + "\", nonce=\"" + auth.at("nonce") + + "\", uri=\"" + req.path + "\", algorithm=" + algo + + (qop.empty() ? ", response=\"" + : ", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + + cnonce + "\", response=\"") + + response + "\"" + + (opaque.empty() ? "" : ", opaque=\"" + opaque + "\""); + + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, field); +} + +bool is_ssl_peer_could_be_closed(SSL *ssl, socket_t sock) { + detail::set_nonblocking(sock, true); + auto se = detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + char buf[1]; + return !SSL_peek(ssl, buf, 1) && + SSL_get_error(ssl, 0) == SSL_ERROR_ZERO_RETURN; +} + +#ifdef _WIN32 +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store +bool load_system_certs_on_windows(X509_STORE *store) { + auto hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, L"ROOT"); + if (!hStore) { return false; } + + auto result = false; + PCCERT_CONTEXT pContext = NULL; + while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != + nullptr) { + auto encoded_cert = + static_cast(pContext->pbCertEncoded); + + auto x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); + if (x509) { + X509_STORE_add_cert(store, x509); + X509_free(x509); + result = true; + } + } + + CertFreeCertificateContext(pContext); + CertCloseStore(hStore, 0); + + return result; +} +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) +#if TARGET_OS_OSX +template +using CFObjectPtr = + std::unique_ptr::type, void (*)(CFTypeRef)>; + +void cf_object_ptr_deleter(CFTypeRef obj) { + if (obj) { CFRelease(obj); } +} + +bool retrieve_certs_from_keychain(CFObjectPtr &certs) { + CFStringRef keys[] = {kSecClass, kSecMatchLimit, kSecReturnRef}; + CFTypeRef values[] = {kSecClassCertificate, kSecMatchLimitAll, + kCFBooleanTrue}; + + CFObjectPtr query( + CFDictionaryCreate(nullptr, reinterpret_cast(keys), values, + sizeof(keys) / sizeof(keys[0]), + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks), + cf_object_ptr_deleter); + + if (!query) { return false; } + + CFTypeRef security_items = nullptr; + if (SecItemCopyMatching(query.get(), &security_items) != errSecSuccess || + CFArrayGetTypeID() != CFGetTypeID(security_items)) { + return false; + } + + certs.reset(reinterpret_cast(security_items)); + return true; +} + +bool retrieve_root_certs_from_keychain(CFObjectPtr &certs) { + CFArrayRef root_security_items = nullptr; + if (SecTrustCopyAnchorCertificates(&root_security_items) != errSecSuccess) { + return false; + } + + certs.reset(root_security_items); + return true; +} + +bool add_certs_to_x509_store(CFArrayRef certs, X509_STORE *store) { + auto result = false; + for (auto i = 0; i < CFArrayGetCount(certs); ++i) { + const auto cert = reinterpret_cast( + CFArrayGetValueAtIndex(certs, i)); + + if (SecCertificateGetTypeID() != CFGetTypeID(cert)) { continue; } + + CFDataRef cert_data = nullptr; + if (SecItemExport(cert, kSecFormatX509Cert, 0, nullptr, &cert_data) != + errSecSuccess) { + continue; + } + + CFObjectPtr cert_data_ptr(cert_data, cf_object_ptr_deleter); + + auto encoded_cert = static_cast( + CFDataGetBytePtr(cert_data_ptr.get())); + + auto x509 = + d2i_X509(NULL, &encoded_cert, CFDataGetLength(cert_data_ptr.get())); + + if (x509) { + X509_STORE_add_cert(store, x509); + X509_free(x509); + result = true; + } + } + + return result; +} + +bool load_system_certs_on_macos(X509_STORE *store) { + auto result = false; + CFObjectPtr certs(nullptr, cf_object_ptr_deleter); + if (retrieve_certs_from_keychain(certs) && certs) { + result = add_certs_to_x509_store(certs.get(), store); + } + + if (retrieve_root_certs_from_keychain(certs) && certs) { + result = add_certs_to_x509_store(certs.get(), store) || result; + } + + return result; +} +#endif // TARGET_OS_OSX +#endif // _WIN32 +#endif // CPPHTTPLIB_OPENSSL_SUPPORT + +#ifdef _WIN32 +class WSInit { +public: + WSInit() { + WSADATA wsaData; + if (WSAStartup(0x0002, &wsaData) == 0) is_valid_ = true; + } + + ~WSInit() { + if (is_valid_) WSACleanup(); + } + + bool is_valid_ = false; +}; + +static WSInit wsinit_; +#endif + +bool parse_www_authenticate(const Response &res, + std::map &auth, + bool is_proxy) { + auto auth_key = is_proxy ? "Proxy-Authenticate" : "WWW-Authenticate"; + if (res.has_header(auth_key)) { + thread_local auto re = + std::regex(R"~((?:(?:,\s*)?(.+?)=(?:"(.*?)"|([^,]*))))~"); + auto s = res.get_header_value(auth_key); + auto pos = s.find(' '); + if (pos != std::string::npos) { + auto type = s.substr(0, pos); + if (type == "Basic") { + return false; + } else if (type == "Digest") { + s = s.substr(pos + 1); + auto beg = std::sregex_iterator(s.begin(), s.end(), re); + for (auto i = beg; i != std::sregex_iterator(); ++i) { + const auto &m = *i; + auto key = s.substr(static_cast(m.position(1)), + static_cast(m.length(1))); + auto val = m.length(2) > 0 + ? s.substr(static_cast(m.position(2)), + static_cast(m.length(2))) + : s.substr(static_cast(m.position(3)), + static_cast(m.length(3))); + auth[key] = val; + } + return true; + } + } + } + return false; +} + +class ContentProviderAdapter { +public: + explicit ContentProviderAdapter( + ContentProviderWithoutLength &&content_provider) + : content_provider_(content_provider) {} + + bool operator()(size_t offset, size_t, DataSink &sink) { + return content_provider_(offset, sink); + } + +private: + ContentProviderWithoutLength content_provider_; +}; + +} // namespace detail + +std::string hosted_at(const std::string &hostname) { + std::vector addrs; + hosted_at(hostname, addrs); + if (addrs.empty()) { return std::string(); } + return addrs[0]; +} + +void hosted_at(const std::string &hostname, + std::vector &addrs) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo(hostname.c_str(), nullptr, &hints, &result)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &addr = + *reinterpret_cast(rp->ai_addr); + std::string ip; + auto dummy = -1; + if (detail::get_ip_and_port(addr, sizeof(struct sockaddr_storage), ip, + dummy)) { + addrs.push_back(ip); + } + } +} + +std::string append_query_params(const std::string &path, + const Params ¶ms) { + std::string path_with_query = path; + thread_local const std::regex re("[^?]+\\?.*"); + auto delm = std::regex_match(path, re) ? '&' : '?'; + path_with_query += delm + detail::params_to_query_str(params); + return path_with_query; +} + +// Header utilities +std::pair +make_range_header(const Ranges &ranges) { + std::string field = "bytes="; + auto i = 0; + for (const auto &r : ranges) { + if (i != 0) { field += ", "; } + if (r.first != -1) { field += std::to_string(r.first); } + field += '-'; + if (r.second != -1) { field += std::to_string(r.second); } + i++; + } + return std::make_pair("Range", std::move(field)); +} + +std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, bool is_proxy) { + auto field = "Basic " + detail::base64_encode(username + ":" + password); + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +std::pair +make_bearer_token_authentication_header(const std::string &token, + bool is_proxy = false) { + auto field = "Bearer " + token; + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +// Request implementation +bool Request::has_header(const std::string &key) const { + return detail::has_header(headers, key); +} + +std::string Request::get_header_value(const std::string &key, + const char *def, size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +size_t Request::get_header_value_count(const std::string &key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +void Request::set_header(const std::string &key, + const std::string &val) { + if (detail::fields::is_field_name(key) && + detail::fields::is_field_value(val)) { + headers.emplace(key, val); + } +} + +bool Request::has_param(const std::string &key) const { + return params.find(key) != params.end(); +} + +std::string Request::get_param_value(const std::string &key, + size_t id) const { + auto rng = params.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +size_t Request::get_param_value_count(const std::string &key) const { + auto r = params.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +bool Request::is_multipart_form_data() const { + const auto &content_type = get_header_value("Content-Type"); + return !content_type.rfind("multipart/form-data", 0); +} + +bool Request::has_file(const std::string &key) const { + return files.find(key) != files.end(); +} + +MultipartFormData Request::get_file_value(const std::string &key) const { + auto it = files.find(key); + if (it != files.end()) { return it->second; } + return MultipartFormData(); +} + +std::vector +Request::get_file_values(const std::string &key) const { + std::vector values; + auto rng = files.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second); + } + return values; +} + +// Response implementation +bool Response::has_header(const std::string &key) const { + return headers.find(key) != headers.end(); +} + +std::string Response::get_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +size_t Response::get_header_value_count(const std::string &key) const { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +void Response::set_header(const std::string &key, + const std::string &val) { + if (detail::fields::is_field_name(key) && + detail::fields::is_field_value(val)) { + headers.emplace(key, val); + } +} + +void Response::set_redirect(const std::string &url, int stat) { + if (detail::fields::is_field_value(url)) { + set_header("Location", url); + if (300 <= stat && stat < 400) { + this->status = stat; + } else { + this->status = StatusCode::Found_302; + } + } +} + +void Response::set_content(const char *s, size_t n, + const std::string &content_type) { + body.assign(s, n); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +void Response::set_content(const std::string &s, + const std::string &content_type) { + set_content(s.data(), s.size(), content_type); +} + +void Response::set_content(std::string &&s, + const std::string &content_type) { + body = std::move(s); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +void Response::set_content_provider( + size_t in_length, const std::string &content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = in_length; + if (in_length > 0) { content_provider_ = std::move(provider); } + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +void Response::set_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +void Response::set_chunked_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = true; +} + +void Response::set_file_content(const std::string &path, + const std::string &content_type) { + file_content_path_ = path; + file_content_content_type_ = content_type; +} + +void Response::set_file_content(const std::string &path) { + file_content_path_ = path; +} + +// Result implementation +bool Result::has_request_header(const std::string &key) const { + return request_headers_.find(key) != request_headers_.end(); +} + +std::string Result::get_request_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(request_headers_, key, def, id); +} + +size_t +Result::get_request_header_value_count(const std::string &key) const { + auto r = request_headers_.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Stream implementation +ssize_t Stream::write(const char *ptr) { + return write(ptr, strlen(ptr)); +} + +ssize_t Stream::write(const std::string &s) { + return write(s.data(), s.size()); +} + +namespace detail { + +void calc_actual_timeout(time_t max_timeout_msec, time_t duration_msec, + time_t timeout_sec, time_t timeout_usec, + time_t &actual_timeout_sec, + time_t &actual_timeout_usec) { + auto timeout_msec = (timeout_sec * 1000) + (timeout_usec / 1000); + + auto actual_timeout_msec = + (std::min)(max_timeout_msec - duration_msec, timeout_msec); + + if (actual_timeout_msec < 0) { actual_timeout_msec = 0; } + + actual_timeout_sec = actual_timeout_msec / 1000; + actual_timeout_usec = (actual_timeout_msec % 1000) * 1000; +} + +// Socket stream implementation +SocketStream::SocketStream( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time), + read_buff_(read_buff_size_, 0) {} + +SocketStream::~SocketStream() = default; + +bool SocketStream::is_readable() const { + return read_buff_off_ < read_buff_content_size_; +} + +bool SocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +bool SocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_); +} + +ssize_t SocketStream::read(char *ptr, size_t size) { +#ifdef _WIN32 + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#else + size = (std::min)(size, + static_cast((std::numeric_limits::max)())); +#endif + + if (read_buff_off_ < read_buff_content_size_) { + auto remaining_size = read_buff_content_size_ - read_buff_off_; + if (size <= remaining_size) { + memcpy(ptr, read_buff_.data() + read_buff_off_, size); + read_buff_off_ += size; + return static_cast(size); + } else { + memcpy(ptr, read_buff_.data() + read_buff_off_, remaining_size); + read_buff_off_ += remaining_size; + return static_cast(remaining_size); + } + } + + if (!wait_readable()) { return -1; } + + read_buff_off_ = 0; + read_buff_content_size_ = 0; + + if (size < read_buff_size_) { + auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, + CPPHTTPLIB_RECV_FLAGS); + if (n <= 0) { + return n; + } else if (n <= static_cast(size)) { + memcpy(ptr, read_buff_.data(), static_cast(n)); + return n; + } else { + memcpy(ptr, read_buff_.data(), size); + read_buff_off_ = size; + read_buff_content_size_ = static_cast(n); + return static_cast(size); + } + } else { + return read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); + } +} + +ssize_t SocketStream::write(const char *ptr, size_t size) { + if (!wait_writable()) { return -1; } + +#if defined(_WIN32) && !defined(_WIN64) + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#endif + + return send_socket(sock_, ptr, size, CPPHTTPLIB_SEND_FLAGS); +} + +void SocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + return detail::get_remote_ip_and_port(sock_, ip, port); +} + +void SocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + return detail::get_local_ip_and_port(sock_, ip, port); +} + +socket_t SocketStream::socket() const { return sock_; } + +time_t SocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +// Buffer stream implementation +bool BufferStream::is_readable() const { return true; } + +bool BufferStream::wait_readable() const { return true; } + +bool BufferStream::wait_writable() const { return true; } + +ssize_t BufferStream::read(char *ptr, size_t size) { +#if defined(_MSC_VER) && _MSC_VER < 1910 + auto len_read = buffer._Copy_s(ptr, size, size, position); +#else + auto len_read = buffer.copy(ptr, size, position); +#endif + position += static_cast(len_read); + return static_cast(len_read); +} + +ssize_t BufferStream::write(const char *ptr, size_t size) { + buffer.append(ptr, size); + return static_cast(size); +} + +void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +void BufferStream::get_local_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +socket_t BufferStream::socket() const { return 0; } + +time_t BufferStream::duration() const { return 0; } + +const std::string &BufferStream::get_buffer() const { return buffer; } + +PathParamsMatcher::PathParamsMatcher(const std::string &pattern) { + constexpr const char marker[] = "/:"; + + // One past the last ending position of a path param substring + std::size_t last_param_end = 0; + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + // Needed to ensure that parameter names are unique during matcher + // construction + // If exceptions are disabled, only last duplicate path + // parameter will be set + std::unordered_set param_name_set; +#endif + + while (true) { + const auto marker_pos = pattern.find( + marker, last_param_end == 0 ? last_param_end : last_param_end - 1); + if (marker_pos == std::string::npos) { break; } + + static_fragments_.push_back( + pattern.substr(last_param_end, marker_pos - last_param_end + 1)); + + const auto param_name_start = marker_pos + str_len(marker); + + auto sep_pos = pattern.find(separator, param_name_start); + if (sep_pos == std::string::npos) { sep_pos = pattern.length(); } + + auto param_name = + pattern.substr(param_name_start, sep_pos - param_name_start); + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + if (param_name_set.find(param_name) != param_name_set.cend()) { + std::string msg = "Encountered path parameter '" + param_name + + "' multiple times in route pattern '" + pattern + "'."; + throw std::invalid_argument(msg); + } +#endif + + param_names_.push_back(std::move(param_name)); + + last_param_end = sep_pos + 1; + } + + if (last_param_end < pattern.length()) { + static_fragments_.push_back(pattern.substr(last_param_end)); + } +} + +bool PathParamsMatcher::match(Request &request) const { + request.matches = std::smatch(); + request.path_params.clear(); + request.path_params.reserve(param_names_.size()); + + // One past the position at which the path matched the pattern last time + std::size_t starting_pos = 0; + for (size_t i = 0; i < static_fragments_.size(); ++i) { + const auto &fragment = static_fragments_[i]; + + if (starting_pos + fragment.length() > request.path.length()) { + return false; + } + + // Avoid unnecessary allocation by using strncmp instead of substr + + // comparison + if (std::strncmp(request.path.c_str() + starting_pos, fragment.c_str(), + fragment.length()) != 0) { + return false; + } + + starting_pos += fragment.length(); + + // Should only happen when we have a static fragment after a param + // Example: '/users/:id/subscriptions' + // The 'subscriptions' fragment here does not have a corresponding param + if (i >= param_names_.size()) { continue; } + + auto sep_pos = request.path.find(separator, starting_pos); + if (sep_pos == std::string::npos) { sep_pos = request.path.length(); } + + const auto ¶m_name = param_names_[i]; + + request.path_params.emplace( + param_name, request.path.substr(starting_pos, sep_pos - starting_pos)); + + // Mark everything up to '/' as matched + starting_pos = sep_pos + 1; + } + // Returns false if the path is longer than the pattern + return starting_pos >= request.path.length(); +} + +bool RegexMatcher::match(Request &request) const { + request.path_params.clear(); + return std::regex_match(request.path, request.matches, regex_); +} + +} // namespace detail + +// HTTP server implementation +Server::Server() + : new_task_queue( + [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }) { +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); +#endif +} + +Server::~Server() = default; + +std::unique_ptr +Server::make_matcher(const std::string &pattern) { + if (pattern.find("/:") != std::string::npos) { + return detail::make_unique(pattern); + } else { + return detail::make_unique(pattern); + } +} + +Server &Server::Get(const std::string &pattern, Handler handler) { + get_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +Server &Server::Post(const std::string &pattern, Handler handler) { + post_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +Server &Server::Post(const std::string &pattern, + HandlerWithContentReader handler) { + post_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +Server &Server::Put(const std::string &pattern, Handler handler) { + put_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +Server &Server::Put(const std::string &pattern, + HandlerWithContentReader handler) { + put_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +Server &Server::Patch(const std::string &pattern, Handler handler) { + patch_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +Server &Server::Patch(const std::string &pattern, + HandlerWithContentReader handler) { + patch_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +Server &Server::Delete(const std::string &pattern, Handler handler) { + delete_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +Server &Server::Delete(const std::string &pattern, + HandlerWithContentReader handler) { + delete_handlers_for_content_reader_.emplace_back(make_matcher(pattern), + std::move(handler)); + return *this; +} + +Server &Server::Options(const std::string &pattern, Handler handler) { + options_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; +} + +bool Server::set_base_dir(const std::string &dir, + const std::string &mount_point) { + return set_mount_point(mount_point, dir); +} + +bool Server::set_mount_point(const std::string &mount_point, + const std::string &dir, Headers headers) { + detail::FileStat stat(dir); + if (stat.is_dir()) { + std::string mnt = !mount_point.empty() ? mount_point : "/"; + if (!mnt.empty() && mnt[0] == '/') { + base_dirs_.push_back({mnt, dir, std::move(headers)}); + return true; + } + } + return false; +} + +bool Server::remove_mount_point(const std::string &mount_point) { + for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { + if (it->mount_point == mount_point) { + base_dirs_.erase(it); + return true; + } + } + return false; +} + +Server & +Server::set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime) { + file_extension_and_mimetype_map_[ext] = mime; + return *this; +} + +Server &Server::set_default_file_mimetype(const std::string &mime) { + default_file_mimetype_ = mime; + return *this; +} + +Server &Server::set_file_request_handler(Handler handler) { + file_request_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_error_handler_core(HandlerWithResponse handler, + std::true_type) { + error_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_error_handler_core(Handler handler, + std::false_type) { + error_handler_ = [handler](const Request &req, Response &res) { + handler(req, res); + return HandlerResponse::Handled; + }; + return *this; +} + +Server &Server::set_exception_handler(ExceptionHandler handler) { + exception_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_pre_routing_handler(HandlerWithResponse handler) { + pre_routing_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_post_routing_handler(Handler handler) { + post_routing_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_logger(Logger logger) { + logger_ = std::move(logger); + return *this; +} + +Server & +Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { + expect_100_continue_handler_ = std::move(handler); + return *this; +} + +Server &Server::set_address_family(int family) { + address_family_ = family; + return *this; +} + +Server &Server::set_tcp_nodelay(bool on) { + tcp_nodelay_ = on; + return *this; +} + +Server &Server::set_ipv6_v6only(bool on) { + ipv6_v6only_ = on; + return *this; +} + +Server &Server::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); + return *this; +} + +Server &Server::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); + return *this; +} + +Server &Server::set_header_writer( + std::function const &writer) { + header_writer_ = writer; + return *this; +} + +Server &Server::set_keep_alive_max_count(size_t count) { + keep_alive_max_count_ = count; + return *this; +} + +Server &Server::set_keep_alive_timeout(time_t sec) { + keep_alive_timeout_sec_ = sec; + return *this; +} + +Server &Server::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; + return *this; +} + +Server &Server::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; + return *this; +} + +Server &Server::set_idle_interval(time_t sec, time_t usec) { + idle_interval_sec_ = sec; + idle_interval_usec_ = usec; + return *this; +} + +Server &Server::set_payload_max_length(size_t length) { + payload_max_length_ = length; + return *this; +} + +bool Server::bind_to_port(const std::string &host, int port, + int socket_flags) { + auto ret = bind_internal(host, port, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret >= 0; +} +int Server::bind_to_any_port(const std::string &host, int socket_flags) { + auto ret = bind_internal(host, 0, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret; +} + +bool Server::listen_after_bind() { return listen_internal(); } + +bool Server::listen(const std::string &host, int port, + int socket_flags) { + return bind_to_port(host, port, socket_flags) && listen_internal(); +} + +bool Server::is_running() const { return is_running_; } + +void Server::wait_until_ready() const { + while (!is_running_ && !is_decommissioned) { + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } +} + +void Server::stop() { + if (is_running_) { + assert(svr_sock_ != INVALID_SOCKET); + std::atomic sock(svr_sock_.exchange(INVALID_SOCKET)); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + is_decommissioned = false; +} + +void Server::decommission() { is_decommissioned = true; } + +bool Server::parse_request_line(const char *s, Request &req) const { + auto len = strlen(s); + if (len < 2 || s[len - 2] != '\r' || s[len - 1] != '\n') { return false; } + len -= 2; + + { + size_t count = 0; + + detail::split(s, s + len, ' ', [&](const char *b, const char *e) { + switch (count) { + case 0: req.method = std::string(b, e); break; + case 1: req.target = std::string(b, e); break; + case 2: req.version = std::string(b, e); break; + default: break; + } + count++; + }); + + if (count != 3) { return false; } + } + + thread_local const std::set methods{ + "GET", "HEAD", "POST", "PUT", "DELETE", + "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; + + if (methods.find(req.method) == methods.end()) { return false; } + + if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { return false; } + + { + // Skip URL fragment + for (size_t i = 0; i < req.target.size(); i++) { + if (req.target[i] == '#') { + req.target.erase(i); + break; + } + } + + detail::divide(req.target, '?', + [&](const char *lhs_data, std::size_t lhs_size, + const char *rhs_data, std::size_t rhs_size) { + req.path = detail::decode_url( + std::string(lhs_data, lhs_size), false); + detail::parse_query_text(rhs_data, rhs_size, req.params); + }); + } + + return true; +} + +bool Server::write_response(Stream &strm, bool close_connection, + Request &req, Response &res) { + // NOTE: `req.ranges` should be empty, otherwise it will be applied + // incorrectly to the error content. + req.ranges.clear(); + return write_response_core(strm, close_connection, req, res, false); +} + +bool Server::write_response_with_content(Stream &strm, + bool close_connection, + const Request &req, + Response &res) { + return write_response_core(strm, close_connection, req, res, true); +} + +bool Server::write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges) { + assert(res.status != -1); + + if (400 <= res.status && error_handler_ && + error_handler_(req, res) == HandlerResponse::Handled) { + need_apply_ranges = true; + } + + std::string content_type; + std::string boundary; + if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); } + + // Prepare additional headers + if (close_connection || req.get_header_value("Connection") == "close") { + res.set_header("Connection", "close"); + } else { + std::string s = "timeout="; + s += std::to_string(keep_alive_timeout_sec_); + s += ", max="; + s += std::to_string(keep_alive_max_count_); + res.set_header("Keep-Alive", s); + } + + if ((!res.body.empty() || res.content_length_ > 0 || res.content_provider_) && + !res.has_header("Content-Type")) { + res.set_header("Content-Type", "text/plain"); + } + + if (res.body.empty() && !res.content_length_ && !res.content_provider_ && + !res.has_header("Content-Length")) { + res.set_header("Content-Length", "0"); + } + + if (req.method == "HEAD" && !res.has_header("Accept-Ranges")) { + res.set_header("Accept-Ranges", "bytes"); + } + + if (post_routing_handler_) { post_routing_handler_(req, res); } + + // Response line and headers + { + detail::BufferStream bstrm; + if (!detail::write_response_line(bstrm, res.status)) { return false; } + if (!header_writer_(bstrm, res.headers)) { return false; } + + // Flush buffer + auto &data = bstrm.get_buffer(); + detail::write_data(strm, data.data(), data.size()); + } + + // Body + auto ret = true; + if (req.method != "HEAD") { + if (!res.body.empty()) { + if (!detail::write_data(strm, res.body.data(), res.body.size())) { + ret = false; + } + } else if (res.content_provider_) { + if (write_content_with_provider(strm, req, res, boundary, content_type)) { + res.content_provider_success_ = true; + } else { + ret = false; + } + } + } + + // Log + if (logger_) { logger_(req, res); } + + return ret; +} + +bool +Server::write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type) { + auto is_shutting_down = [this]() { + return this->svr_sock_ == INVALID_SOCKET; + }; + + if (res.content_length_ > 0) { + if (req.ranges.empty()) { + return detail::write_content(strm, res.content_provider_, 0, + res.content_length_, is_shutting_down); + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + return detail::write_content(strm, res.content_provider_, + offset_and_length.first, + offset_and_length.second, is_shutting_down); + } else { + return detail::write_multipart_ranges_data( + strm, req, res, boundary, content_type, res.content_length_, + is_shutting_down); + } + } else { + if (res.is_chunked_content_provider_) { + auto type = detail::encoding_type(req, res); + + std::unique_ptr compressor; + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); +#endif + } else if (type == detail::EncodingType::Zstd) { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + compressor = detail::make_unique(); +#endif + } else { + compressor = detail::make_unique(); + } + assert(compressor != nullptr); + + return detail::write_content_chunked(strm, res.content_provider_, + is_shutting_down, *compressor); + } else { + return detail::write_content_without_length(strm, res.content_provider_, + is_shutting_down); + } + } +} + +bool Server::read_content(Stream &strm, Request &req, Response &res) { + MultipartFormDataMap::iterator cur; + auto file_count = 0; + if (read_content_core( + strm, req, res, + // Regular + [&](const char *buf, size_t n) { + if (req.body.size() + n > req.body.max_size()) { return false; } + req.body.append(buf, n); + return true; + }, + // Multipart + [&](const MultipartFormData &file) { + if (file_count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + return false; + } + cur = req.files.emplace(file.name, file); + return true; + }, + [&](const char *buf, size_t n) { + auto &content = cur->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + return true; + })) { + const auto &content_type = req.get_header_value("Content-Type"); + if (!content_type.find("application/x-www-form-urlencoded")) { + if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { + res.status = StatusCode::PayloadTooLarge_413; // NOTE: should be 414? + return false; + } + detail::parse_query_text(req.body, req.params); + } + return true; + } + return false; +} + +bool Server::read_content_with_content_receiver( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + MultipartContentHeader multipart_header, + ContentReceiver multipart_receiver) { + return read_content_core(strm, req, res, std::move(receiver), + std::move(multipart_header), + std::move(multipart_receiver)); +} + +bool +Server::read_content_core(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + MultipartContentHeader multipart_header, + ContentReceiver multipart_receiver) const { + detail::MultipartFormDataParser multipart_form_data_parser; + ContentReceiverWithProgress out; + + if (req.is_multipart_form_data()) { + const auto &content_type = req.get_header_value("Content-Type"); + std::string boundary; + if (!detail::parse_multipart_boundary(content_type, boundary)) { + res.status = StatusCode::BadRequest_400; + return false; + } + + multipart_form_data_parser.set_boundary(std::move(boundary)); + out = [&](const char *buf, size_t n, uint64_t /*off*/, uint64_t /*len*/) { + /* For debug + size_t pos = 0; + while (pos < n) { + auto read_size = (std::min)(1, n - pos); + auto ret = multipart_form_data_parser.parse( + buf + pos, read_size, multipart_receiver, multipart_header); + if (!ret) { return false; } + pos += read_size; + } + return true; + */ + return multipart_form_data_parser.parse(buf, n, multipart_receiver, + multipart_header); + }; + } else { + out = [receiver](const char *buf, size_t n, uint64_t /*off*/, + uint64_t /*len*/) { return receiver(buf, n); }; + } + + if (req.method == "DELETE" && !req.has_header("Content-Length")) { + return true; + } + + if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, + out, true)) { + return false; + } + + if (req.is_multipart_form_data()) { + if (!multipart_form_data_parser.is_valid()) { + res.status = StatusCode::BadRequest_400; + return false; + } + } + + return true; +} + +bool Server::handle_file_request(const Request &req, Response &res, + bool head) { + for (const auto &entry : base_dirs_) { + // Prefix match + if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { + std::string sub_path = "/" + req.path.substr(entry.mount_point.size()); + if (detail::is_valid_path(sub_path)) { + auto path = entry.base_dir + sub_path; + if (path.back() == '/') { path += "index.html"; } + + detail::FileStat stat(path); + + if (stat.is_dir()) { + res.set_redirect(sub_path + "/", StatusCode::MovedPermanently_301); + return true; + } + + if (stat.is_file()) { + for (const auto &kv : entry.headers) { + res.set_header(kv.first, kv.second); + } + + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { return false; } + + res.set_content_provider( + mm->size(), + detail::find_content_type(path, file_extension_and_mimetype_map_, + default_file_mimetype_), + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + + if (!head && file_request_handler_) { + file_request_handler_(req, res); + } + + return true; + } + } + } + } + return false; +} + +socket_t +Server::create_server_socket(const std::string &host, int port, + int socket_flags, + SocketOptions socket_options) const { + return detail::create_socket( + host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, + ipv6_v6only_, std::move(socket_options), + [](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { + if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + return false; + } + if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { return false; } + return true; + }); +} + +int Server::bind_internal(const std::string &host, int port, + int socket_flags) { + if (is_decommissioned) { return -1; } + + if (!is_valid()) { return -1; } + + svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); + if (svr_sock_ == INVALID_SOCKET) { return -1; } + + if (port == 0) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(svr_sock_, reinterpret_cast(&addr), + &addr_len) == -1) { + return -1; + } + if (addr.ss_family == AF_INET) { + return ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + return ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return -1; + } + } else { + return port; + } +} + +bool Server::listen_internal() { + if (is_decommissioned) { return false; } + + auto ret = true; + is_running_ = true; + auto se = detail::scope_exit([&]() { is_running_ = false; }); + + { + std::unique_ptr task_queue(new_task_queue()); + + while (svr_sock_ != INVALID_SOCKET) { +#ifndef _WIN32 + if (idle_interval_sec_ > 0 || idle_interval_usec_ > 0) { +#endif + auto val = detail::select_read(svr_sock_, idle_interval_sec_, + idle_interval_usec_); + if (val == 0) { // Timeout + task_queue->on_idle(); + continue; + } +#ifndef _WIN32 + } +#endif + +#if defined _WIN32 + // sockets connected via WASAccept inherit flags NO_HANDLE_INHERIT, + // OVERLAPPED + socket_t sock = WSAAccept(svr_sock_, nullptr, nullptr, nullptr, 0); +#elif defined SOCK_CLOEXEC + socket_t sock = accept4(svr_sock_, nullptr, nullptr, SOCK_CLOEXEC); +#else + socket_t sock = accept(svr_sock_, nullptr, nullptr); +#endif + + if (sock == INVALID_SOCKET) { + if (errno == EMFILE) { + // The per-process limit of open file descriptors has been reached. + // Try to accept new connections after a short sleep. + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } else if (errno == EINTR || errno == EAGAIN) { + continue; + } + if (svr_sock_ != INVALID_SOCKET) { + detail::close_socket(svr_sock_); + ret = false; + } else { + ; // The server socket was closed by user. + } + break; + } + + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_RCVTIMEO, + read_timeout_sec_, read_timeout_usec_); + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_SNDTIMEO, + write_timeout_sec_, write_timeout_usec_); + + if (!task_queue->enqueue( + [this, sock]() { process_and_close_socket(sock); })) { + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + } + + task_queue->shutdown(); + } + + is_decommissioned = !ret; + return ret; +} + +bool Server::routing(Request &req, Response &res, Stream &strm) { + if (pre_routing_handler_ && + pre_routing_handler_(req, res) == HandlerResponse::Handled) { + return true; + } + + // File handler + auto is_head_request = req.method == "HEAD"; + if ((req.method == "GET" || is_head_request) && + handle_file_request(req, res, is_head_request)) { + return true; + } + + if (detail::expect_content(req)) { + // Content reader handler + { + ContentReader reader( + [&](ContentReceiver receiver) { + return read_content_with_content_receiver( + strm, req, res, std::move(receiver), nullptr, nullptr); + }, + [&](MultipartContentHeader header, ContentReceiver receiver) { + return read_content_with_content_receiver(strm, req, res, nullptr, + std::move(header), + std::move(receiver)); + }); + + if (req.method == "POST") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + post_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PUT") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + put_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "PATCH") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + patch_handlers_for_content_reader_)) { + return true; + } + } else if (req.method == "DELETE") { + if (dispatch_request_for_content_reader( + req, res, std::move(reader), + delete_handlers_for_content_reader_)) { + return true; + } + } + } + + // Read content into `req.body` + if (!read_content(strm, req, res)) { return false; } + } + + // Regular handler + if (req.method == "GET" || req.method == "HEAD") { + return dispatch_request(req, res, get_handlers_); + } else if (req.method == "POST") { + return dispatch_request(req, res, post_handlers_); + } else if (req.method == "PUT") { + return dispatch_request(req, res, put_handlers_); + } else if (req.method == "DELETE") { + return dispatch_request(req, res, delete_handlers_); + } else if (req.method == "OPTIONS") { + return dispatch_request(req, res, options_handlers_); + } else if (req.method == "PATCH") { + return dispatch_request(req, res, patch_handlers_); + } + + res.status = StatusCode::BadRequest_400; + return false; +} + +bool Server::dispatch_request(Request &req, Response &res, + const Handlers &handlers) const { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + handler(req, res); + return true; + } + } + return false; +} + +void Server::apply_ranges(const Request &req, Response &res, + std::string &content_type, + std::string &boundary) const { + if (req.ranges.size() > 1 && res.status == StatusCode::PartialContent_206) { + auto it = res.headers.find("Content-Type"); + if (it != res.headers.end()) { + content_type = it->second; + res.headers.erase(it); + } + + boundary = detail::make_multipart_data_boundary(); + + res.set_header("Content-Type", + "multipart/byteranges; boundary=" + boundary); + } + + auto type = detail::encoding_type(req, res); + + if (res.body.empty()) { + if (res.content_length_ > 0) { + size_t length = 0; + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + length = res.content_length_; + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.content_length_); + res.set_header("Content-Range", content_range); + } else { + length = detail::get_multipart_ranges_data_length( + req, boundary, content_type, res.content_length_); + } + res.set_header("Content-Length", std::to_string(length)); + } else { + if (res.content_provider_) { + if (res.is_chunked_content_provider_) { + res.set_header("Transfer-Encoding", "chunked"); + if (type == detail::EncodingType::Gzip) { + res.set_header("Content-Encoding", "gzip"); + } else if (type == detail::EncodingType::Brotli) { + res.set_header("Content-Encoding", "br"); + } else if (type == detail::EncodingType::Zstd) { + res.set_header("Content-Encoding", "zstd"); + } + } + } + } + } else { + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + ; + } else if (req.ranges.size() == 1) { + auto offset_and_length = + detail::get_range_offset_and_length(req.ranges[0], res.body.size()); + auto offset = offset_and_length.first; + auto length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.body.size()); + res.set_header("Content-Range", content_range); + + assert(offset + length <= res.body.size()); + res.body = res.body.substr(offset, length); + } else { + std::string data; + detail::make_multipart_ranges_data(req, res, boundary, content_type, + res.body.size(), data); + res.body.swap(data); + } + + if (type != detail::EncodingType::None) { + std::unique_ptr compressor; + std::string content_encoding; + + if (type == detail::EncodingType::Gzip) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + compressor = detail::make_unique(); + content_encoding = "gzip"; +#endif + } else if (type == detail::EncodingType::Brotli) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + compressor = detail::make_unique(); + content_encoding = "br"; +#endif + } else if (type == detail::EncodingType::Zstd) { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + compressor = detail::make_unique(); + content_encoding = "zstd"; +#endif + } + + if (compressor) { + std::string compressed; + if (compressor->compress(res.body.data(), res.body.size(), true, + [&](const char *data, size_t data_len) { + compressed.append(data, data_len); + return true; + })) { + res.body.swap(compressed); + res.set_header("Content-Encoding", content_encoding); + } + } + } + + auto length = std::to_string(res.body.size()); + res.set_header("Content-Length", length); + } +} + +bool Server::dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) const { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + handler(req, res, content_reader); + return true; + } + } + return false; +} + +bool +Server::process_request(Stream &strm, const std::string &remote_addr, + int remote_port, const std::string &local_addr, + int local_port, bool close_connection, + bool &connection_closed, + const std::function &setup_request) { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + // Connection has been closed on client + if (!line_reader.getline()) { return false; } + + Request req; + + Response res; + res.version = "HTTP/1.1"; + res.headers = default_headers_; + + // Request line and headers + if (!parse_request_line(line_reader.ptr(), req) || + !detail::read_headers(strm, req.headers)) { + res.status = StatusCode::BadRequest_400; + return write_response(strm, close_connection, req, res); + } + + // Check if the request URI doesn't exceed the limit + if (req.target.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + Headers dummy; + detail::read_headers(strm, dummy); + res.status = StatusCode::UriTooLong_414; + return write_response(strm, close_connection, req, res); + } + + if (req.get_header_value("Connection") == "close") { + connection_closed = true; + } + + if (req.version == "HTTP/1.0" && + req.get_header_value("Connection") != "Keep-Alive") { + connection_closed = true; + } + + req.remote_addr = remote_addr; + req.remote_port = remote_port; + req.set_header("REMOTE_ADDR", req.remote_addr); + req.set_header("REMOTE_PORT", std::to_string(req.remote_port)); + + req.local_addr = local_addr; + req.local_port = local_port; + req.set_header("LOCAL_ADDR", req.local_addr); + req.set_header("LOCAL_PORT", std::to_string(req.local_port)); + + if (req.has_header("Range")) { + const auto &range_header_value = req.get_header_value("Range"); + if (!detail::parse_range_header(range_header_value, req.ranges)) { + res.status = StatusCode::RangeNotSatisfiable_416; + return write_response(strm, close_connection, req, res); + } + } + + if (setup_request) { setup_request(req); } + + if (req.get_header_value("Expect") == "100-continue") { + int status = StatusCode::Continue_100; + if (expect_100_continue_handler_) { + status = expect_100_continue_handler_(req, res); + } + switch (status) { + case StatusCode::Continue_100: + case StatusCode::ExpectationFailed_417: + detail::write_response_line(strm, status); + strm.write("\r\n"); + break; + default: + connection_closed = true; + return write_response(strm, true, req, res); + } + } + + // Setup `is_connection_closed` method + auto sock = strm.socket(); + req.is_connection_closed = [sock]() { + return !detail::is_socket_alive(sock); + }; + + // Routing + auto routed = false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + routed = routing(req, res, strm); +#else + try { + routed = routing(req, res, strm); + } catch (std::exception &e) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + std::string val; + auto s = e.what(); + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case '\r': val += "\\r"; break; + case '\n': val += "\\n"; break; + default: val += s[i]; break; + } + } + res.set_header("EXCEPTION_WHAT", val); + } + } catch (...) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + res.set_header("EXCEPTION_WHAT", "UNKNOWN"); + } + } +#endif + if (routed) { + if (res.status == -1) { + res.status = req.ranges.empty() ? StatusCode::OK_200 + : StatusCode::PartialContent_206; + } + + // Serve file content by using a content provider + if (!res.file_content_path_.empty()) { + const auto &path = res.file_content_path_; + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::NotFound_404; + return write_response(strm, close_connection, req, res); + } + + auto content_type = res.file_content_content_type_; + if (content_type.empty()) { + content_type = detail::find_content_type( + path, file_extension_and_mimetype_map_, default_file_mimetype_); + } + + res.set_content_provider( + mm->size(), content_type, + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + } + + if (detail::range_error(req, res)) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::RangeNotSatisfiable_416; + return write_response(strm, close_connection, req, res); + } + + return write_response_with_content(strm, close_connection, req, res); + } else { + if (res.status == -1) { res.status = StatusCode::NotFound_404; } + + return write_response(strm, close_connection, req, res); + } +} + +bool Server::is_valid() const { return true; } + +bool Server::process_and_close_socket(socket_t sock) { + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + auto ret = detail::process_server_socket( + svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, remote_addr, remote_port, local_addr, + local_port, close_connection, connection_closed, + nullptr); + }); + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +// HTTP client implementation +ClientImpl::ClientImpl(const std::string &host) + : ClientImpl(host, 80, std::string(), std::string()) {} + +ClientImpl::ClientImpl(const std::string &host, int port) + : ClientImpl(host, port, std::string(), std::string()) {} + +ClientImpl::ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), + host_and_port_(adjust_host_string(host_) + ":" + std::to_string(port)), + client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} + +ClientImpl::~ClientImpl() { + // Wait until all the requests in flight are handled. + size_t retry_count = 10; + while (retry_count-- > 0) { + { + std::lock_guard guard(socket_mutex_); + if (socket_requests_in_flight_ == 0) { break; } + } + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } + + std::lock_guard guard(socket_mutex_); + shutdown_socket(socket_); + close_socket(socket_); +} + +bool ClientImpl::is_valid() const { return true; } + +void ClientImpl::copy_settings(const ClientImpl &rhs) { + client_cert_path_ = rhs.client_cert_path_; + client_key_path_ = rhs.client_key_path_; + connection_timeout_sec_ = rhs.connection_timeout_sec_; + read_timeout_sec_ = rhs.read_timeout_sec_; + read_timeout_usec_ = rhs.read_timeout_usec_; + write_timeout_sec_ = rhs.write_timeout_sec_; + write_timeout_usec_ = rhs.write_timeout_usec_; + max_timeout_msec_ = rhs.max_timeout_msec_; + basic_auth_username_ = rhs.basic_auth_username_; + basic_auth_password_ = rhs.basic_auth_password_; + bearer_token_auth_token_ = rhs.bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + digest_auth_username_ = rhs.digest_auth_username_; + digest_auth_password_ = rhs.digest_auth_password_; +#endif + keep_alive_ = rhs.keep_alive_; + follow_location_ = rhs.follow_location_; + url_encode_ = rhs.url_encode_; + address_family_ = rhs.address_family_; + tcp_nodelay_ = rhs.tcp_nodelay_; + ipv6_v6only_ = rhs.ipv6_v6only_; + socket_options_ = rhs.socket_options_; + compress_ = rhs.compress_; + decompress_ = rhs.decompress_; + interface_ = rhs.interface_; + proxy_host_ = rhs.proxy_host_; + proxy_port_ = rhs.proxy_port_; + proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_; + proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_; + proxy_bearer_token_auth_token_ = rhs.proxy_bearer_token_auth_token_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_; + proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + ca_cert_file_path_ = rhs.ca_cert_file_path_; + ca_cert_dir_path_ = rhs.ca_cert_dir_path_; + ca_cert_store_ = rhs.ca_cert_store_; +#endif +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + server_certificate_verification_ = rhs.server_certificate_verification_; + server_hostname_verification_ = rhs.server_hostname_verification_; + server_certificate_verifier_ = rhs.server_certificate_verifier_; +#endif + logger_ = rhs.logger_; +} + +socket_t ClientImpl::create_client_socket(Error &error) const { + if (!proxy_host_.empty() && proxy_port_ != -1) { + return detail::create_client_socket( + proxy_host_, std::string(), proxy_port_, address_family_, tcp_nodelay_, + ipv6_v6only_, socket_options_, connection_timeout_sec_, + connection_timeout_usec_, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, interface_, error); + } + + // Check is custom IP specified for host_ + std::string ip; + auto it = addr_map_.find(host_); + if (it != addr_map_.end()) { ip = it->second; } + + return detail::create_client_socket( + host_, ip, port_, address_family_, tcp_nodelay_, ipv6_v6only_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); +} + +bool ClientImpl::create_and_connect_socket(Socket &socket, + Error &error) { + auto sock = create_client_socket(error); + if (sock == INVALID_SOCKET) { return false; } + socket.sock = sock; + return true; +} + +void ClientImpl::shutdown_ssl(Socket & /*socket*/, + bool /*shutdown_gracefully*/) { + // If there are any requests in flight from threads other than us, then it's + // a thread-unsafe race because individual ssl* objects are not thread-safe. + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); +} + +void ClientImpl::shutdown_socket(Socket &socket) const { + if (socket.sock == INVALID_SOCKET) { return; } + detail::shutdown_socket(socket.sock); +} + +void ClientImpl::close_socket(Socket &socket) { + // If there are requests in flight in another thread, usually closing + // the socket will be fine and they will simply receive an error when + // using the closed socket, but it is still a bug since rarely the OS + // may reassign the socket id to be used for a new socket, and then + // suddenly they will be operating on a live socket that is different + // than the one they intended! + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); + + // It is also a bug if this happens while SSL is still active +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + assert(socket.ssl == nullptr); +#endif + if (socket.sock == INVALID_SOCKET) { return; } + detail::close_socket(socket.sock); + socket.sock = INVALID_SOCKET; +} + +bool ClientImpl::read_response_line(Stream &strm, const Request &req, + Response &res) const { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + if (!line_reader.getline()) { return false; } + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r?\n"); +#else + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r\n"); +#endif + + std::cmatch m; + if (!std::regex_match(line_reader.ptr(), m, re)) { + return req.method == "CONNECT"; + } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + + // Ignore '100 Continue' + while (res.status == StatusCode::Continue_100) { + if (!line_reader.getline()) { return false; } // CRLF + if (!line_reader.getline()) { return false; } // next response line + + if (!std::regex_match(line_reader.ptr(), m, re)) { return false; } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + } + + return true; +} + +bool ClientImpl::send(Request &req, Response &res, Error &error) { + std::lock_guard request_mutex_guard(request_mutex_); + auto ret = send_(req, res, error); + if (error == Error::SSLPeerCouldBeClosed_) { + assert(!ret); + ret = send_(req, res, error); + } + return ret; +} + +bool ClientImpl::send_(Request &req, Response &res, Error &error) { + { + std::lock_guard guard(socket_mutex_); + + // Set this to false immediately - if it ever gets set to true by the end of + // the request, we know another thread instructed us to close the socket. + socket_should_be_closed_when_request_is_done_ = false; + + auto is_alive = false; + if (socket_.is_open()) { + is_alive = detail::is_socket_alive(socket_.sock); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (is_alive && is_ssl()) { + if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { + is_alive = false; + } + } +#endif + + if (!is_alive) { + // Attempt to avoid sigpipe by shutting down non-gracefully if it seems + // like the other side has already closed the connection Also, there + // cannot be any requests in flight from other threads since we locked + // request_mutex_, so safe to close everything immediately + const bool shutdown_gracefully = false; + shutdown_ssl(socket_, shutdown_gracefully); + shutdown_socket(socket_); + close_socket(socket_); + } + } + + if (!is_alive) { + if (!create_and_connect_socket(socket_, error)) { return false; } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // TODO: refactoring + if (is_ssl()) { + auto &scli = static_cast(*this); + if (!proxy_host_.empty() && proxy_port_ != -1) { + auto success = false; + if (!scli.connect_with_proxy(socket_, req.start_time_, res, success, + error)) { + return success; + } + } + + if (!scli.initialize_ssl(socket_, error)) { return false; } + } +#endif + } + + // Mark the current socket as being in use so that it cannot be closed by + // anyone else while this request is ongoing, even though we will be + // releasing the mutex. + if (socket_requests_in_flight_ > 1) { + assert(socket_requests_are_from_thread_ == std::this_thread::get_id()); + } + socket_requests_in_flight_ += 1; + socket_requests_are_from_thread_ = std::this_thread::get_id(); + } + + for (const auto &header : default_headers_) { + if (req.headers.find(header.first) == req.headers.end()) { + req.headers.insert(header); + } + } + + auto ret = false; + auto close_connection = !keep_alive_; + + auto se = detail::scope_exit([&]() { + // Briefly lock mutex in order to mark that a request is no longer ongoing + std::lock_guard guard(socket_mutex_); + socket_requests_in_flight_ -= 1; + if (socket_requests_in_flight_ <= 0) { + assert(socket_requests_in_flight_ == 0); + socket_requests_are_from_thread_ = std::thread::id(); + } + + if (socket_should_be_closed_when_request_is_done_ || close_connection || + !ret) { + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + }); + + ret = process_socket(socket_, req.start_time_, [&](Stream &strm) { + return handle_request(strm, req, res, close_connection, error); + }); + + if (!ret) { + if (error == Error::Success) { error = Error::Unknown; } + } + + return ret; +} + +Result ClientImpl::send(const Request &req) { + auto req2 = req; + return send_(std::move(req2)); +} + +Result ClientImpl::send_(Request &&req) { + auto res = detail::make_unique(); + auto error = Error::Success; + auto ret = send(req, *res, error); + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; +} + +bool ClientImpl::handle_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + if (req.path.empty()) { + error = Error::Connection; + return false; + } + + auto req_save = req; + + bool ret; + + if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) { + auto req2 = req; + req2.path = "http://" + host_and_port_ + req.path; + ret = process_request(strm, req2, res, close_connection, error); + req = req2; + req.path = req_save.path; + } else { + ret = process_request(strm, req, res, close_connection, error); + } + + if (!ret) { return false; } + + if (res.get_header_value("Connection") == "close" || + (res.version == "HTTP/1.0" && res.reason != "Connection established")) { + // TODO this requires a not-entirely-obvious chain of calls to be correct + // for this to be safe. + + // This is safe to call because handle_request is only called by send_ + // which locks the request mutex during the process. It would be a bug + // to call it from a different thread since it's a thread-safety issue + // to do these things to the socket if another thread is using the socket. + std::lock_guard guard(socket_mutex_); + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); + } + + if (300 < res.status && res.status < 400 && follow_location_) { + req = req_save; + ret = redirect(req, res, error); + } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if ((res.status == StatusCode::Unauthorized_401 || + res.status == StatusCode::ProxyAuthenticationRequired_407) && + req.authorization_count_ < 5) { + auto is_proxy = res.status == StatusCode::ProxyAuthenticationRequired_407; + const auto &username = + is_proxy ? proxy_digest_auth_username_ : digest_auth_username_; + const auto &password = + is_proxy ? proxy_digest_auth_password_ : digest_auth_password_; + + if (!username.empty() && !password.empty()) { + std::map auth; + if (detail::parse_www_authenticate(res, auth, is_proxy)) { + Request new_req = req; + new_req.authorization_count_ += 1; + new_req.headers.erase(is_proxy ? "Proxy-Authorization" + : "Authorization"); + new_req.headers.insert(detail::make_digest_authentication_header( + req, auth, new_req.authorization_count_, detail::random_string(10), + username, password, is_proxy)); + + Response new_res; + + ret = send(new_req, new_res, error); + if (ret) { res = new_res; } + } + } + } +#endif + + return ret; +} + +bool ClientImpl::redirect(Request &req, Response &res, Error &error) { + if (req.redirect_count_ == 0) { + error = Error::ExceedRedirectCount; + return false; + } + + auto location = res.get_header_value("location"); + if (location.empty()) { return false; } + + thread_local const std::regex re( + R"((?:(https?):)?(?://(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)?([^?#]*)(\?[^#]*)?(?:#.*)?)"); + + std::smatch m; + if (!std::regex_match(location, m, re)) { return false; } + + auto scheme = is_ssl() ? "https" : "http"; + + auto next_scheme = m[1].str(); + auto next_host = m[2].str(); + if (next_host.empty()) { next_host = m[3].str(); } + auto port_str = m[4].str(); + auto next_path = m[5].str(); + auto next_query = m[6].str(); + + auto next_port = port_; + if (!port_str.empty()) { + next_port = std::stoi(port_str); + } else if (!next_scheme.empty()) { + next_port = next_scheme == "https" ? 443 : 80; + } + + if (next_scheme.empty()) { next_scheme = scheme; } + if (next_host.empty()) { next_host = host_; } + if (next_path.empty()) { next_path = "/"; } + + auto path = detail::decode_url(next_path, true) + next_query; + + if (next_scheme == scheme && next_host == host_ && next_port == port_) { + return detail::redirect(*this, req, res, path, location, error); + } else { + if (next_scheme == "https") { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + SSLClient cli(next_host, next_port); + cli.copy_settings(*this); + if (ca_cert_store_) { cli.set_ca_cert_store(ca_cert_store_); } + return detail::redirect(cli, req, res, path, location, error); +#else + return false; +#endif + } else { + ClientImpl cli(next_host, next_port); + cli.copy_settings(*this); + return detail::redirect(cli, req, res, path, location, error); + } + } +} + +bool ClientImpl::write_content_with_provider(Stream &strm, + const Request &req, + Error &error) const { + auto is_shutting_down = []() { return false; }; + + if (req.is_chunked_content_provider_) { + // TODO: Brotli support + std::unique_ptr compressor; +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { + compressor = detail::make_unique(); + } else +#endif + { + compressor = detail::make_unique(); + } + + return detail::write_content_chunked(strm, req.content_provider_, + is_shutting_down, *compressor, error); + } else { + return detail::write_content(strm, req.content_provider_, 0, + req.content_length_, is_shutting_down, error); + } +} + +bool ClientImpl::write_request(Stream &strm, Request &req, + bool close_connection, Error &error) { + // Prepare additional headers + if (close_connection) { + if (!req.has_header("Connection")) { + req.set_header("Connection", "close"); + } + } + + if (!req.has_header("Host")) { + if (is_ssl()) { + if (port_ == 443) { + req.set_header("Host", host_); + } else { + req.set_header("Host", host_and_port_); + } + } else { + if (port_ == 80) { + req.set_header("Host", host_); + } else { + req.set_header("Host", host_and_port_); + } + } + } + + if (!req.has_header("Accept")) { req.set_header("Accept", "*/*"); } + + if (!req.content_receiver) { + if (!req.has_header("Accept-Encoding")) { + std::string accept_encoding; +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + accept_encoding = "br"; +#endif +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "gzip, deflate"; +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "zstd"; +#endif + req.set_header("Accept-Encoding", accept_encoding); + } + +#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT + if (!req.has_header("User-Agent")) { + auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; + req.set_header("User-Agent", agent); + } +#endif + }; + + if (req.body.empty()) { + if (req.content_provider_) { + if (!req.is_chunked_content_provider_) { + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.content_length_); + req.set_header("Content-Length", length); + } + } + } else { + if (req.method == "POST" || req.method == "PUT" || + req.method == "PATCH") { + req.set_header("Content-Length", "0"); + } + } + } else { + if (!req.has_header("Content-Type")) { + req.set_header("Content-Type", "text/plain"); + } + + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.body.size()); + req.set_header("Content-Length", length); + } + } + + if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_basic_authentication_header( + basic_auth_username_, basic_auth_password_, false)); + } + } + + if (!proxy_basic_auth_username_.empty() && + !proxy_basic_auth_password_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_basic_authentication_header( + proxy_basic_auth_username_, proxy_basic_auth_password_, true)); + } + } + + if (!bearer_token_auth_token_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + bearer_token_auth_token_, false)); + } + } + + if (!proxy_bearer_token_auth_token_.empty()) { + if (!req.has_header("Proxy-Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + proxy_bearer_token_auth_token_, true)); + } + } + + // Request line and headers + { + detail::BufferStream bstrm; + + const auto &path_with_query = + req.params.empty() ? req.path + : append_query_params(req.path, req.params); + + const auto &path = + url_encode_ ? detail::encode_url(path_with_query) : path_with_query; + + detail::write_request_line(bstrm, req.method, path); + + header_writer_(bstrm, req.headers); + + // Flush buffer + auto &data = bstrm.get_buffer(); + if (!detail::write_data(strm, data.data(), data.size())) { + error = Error::Write; + return false; + } + } + + // Body + if (req.body.empty()) { + return write_content_with_provider(strm, req, error); + } + + if (!detail::write_data(strm, req.body.data(), req.body.size())) { + error = Error::Write; + return false; + } + + return true; +} + +std::unique_ptr ClientImpl::send_with_content_provider( + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, Error &error) { + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_) { req.set_header("Content-Encoding", "gzip"); } +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (compress_ && !content_provider_without_length) { + // TODO: Brotli support + detail::gzip_compressor compressor; + + if (content_provider) { + auto ok = true; + size_t offset = 0; + DataSink data_sink; + + data_sink.write = [&](const char *data, size_t data_len) -> bool { + if (ok) { + auto last = offset + data_len == content_length; + + auto ret = compressor.compress( + data, data_len, last, + [&](const char *compressed_data, size_t compressed_data_len) { + req.body.append(compressed_data, compressed_data_len); + return true; + }); + + if (ret) { + offset += data_len; + } else { + ok = false; + } + } + return ok; + }; + + while (ok && offset < content_length) { + if (!content_provider(offset, content_length - offset, data_sink)) { + error = Error::Canceled; + return nullptr; + } + } + } else { + if (!compressor.compress(body, content_length, true, + [&](const char *data, size_t data_len) { + req.body.append(data, data_len); + return true; + })) { + error = Error::Compression; + return nullptr; + } + } + } else +#endif + { + if (content_provider) { + req.content_length_ = content_length; + req.content_provider_ = std::move(content_provider); + req.is_chunked_content_provider_ = false; + } else if (content_provider_without_length) { + req.content_length_ = 0; + req.content_provider_ = detail::ContentProviderAdapter( + std::move(content_provider_without_length)); + req.is_chunked_content_provider_ = true; + req.set_header("Transfer-Encoding", "chunked"); + } else { + req.body.assign(body, content_length); + } + } + + auto res = detail::make_unique(); + return send(req, *res, error) ? std::move(res) : nullptr; +} + +Result ClientImpl::send_with_content_provider( + const std::string &method, const std::string &path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, Progress progress) { + Request req; + req.method = method; + req.headers = headers; + req.path = path; + req.progress = progress; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + auto error = Error::Success; + + auto res = send_with_content_provider( + req, body, content_length, std::move(content_provider), + std::move(content_provider_without_length), content_type, error); + + return Result{std::move(res), error, std::move(req.headers)}; +} + +std::string +ClientImpl::adjust_host_string(const std::string &host) const { + if (host.find(':') != std::string::npos) { return "[" + host + "]"; } + return host; +} + +bool ClientImpl::process_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + // Send request + if (!write_request(strm, req, close_connection, error)) { return false; } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (is_ssl()) { + auto is_proxy_enabled = !proxy_host_.empty() && proxy_port_ != -1; + if (!is_proxy_enabled) { + if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { + error = Error::SSLPeerCouldBeClosed_; + return false; + } + } + } +#endif + + // Receive response and headers + if (!read_response_line(strm, req, res) || + !detail::read_headers(strm, res.headers)) { + error = Error::Read; + return false; + } + + // Body + if ((res.status != StatusCode::NoContent_204) && req.method != "HEAD" && + req.method != "CONNECT") { + auto redirect = 300 < res.status && res.status < 400 && + res.status != StatusCode::NotModified_304 && + follow_location_; + + if (req.response_handler && !redirect) { + if (!req.response_handler(res)) { + error = Error::Canceled; + return false; + } + } + + auto out = + req.content_receiver + ? static_cast( + [&](const char *buf, size_t n, uint64_t off, uint64_t len) { + if (redirect) { return true; } + auto ret = req.content_receiver(buf, n, off, len); + if (!ret) { error = Error::Canceled; } + return ret; + }) + : static_cast( + [&](const char *buf, size_t n, uint64_t /*off*/, + uint64_t /*len*/) { + assert(res.body.size() + n <= res.body.max_size()); + res.body.append(buf, n); + return true; + }); + + auto progress = [&](uint64_t current, uint64_t total) { + if (!req.progress || redirect) { return true; } + auto ret = req.progress(current, total); + if (!ret) { error = Error::Canceled; } + return ret; + }; + + if (res.has_header("Content-Length")) { + if (!req.content_receiver) { + auto len = res.get_header_value_u64("Content-Length"); + if (len > res.body.max_size()) { + error = Error::Read; + return false; + } + res.body.reserve(static_cast(len)); + } + } + + if (res.status != StatusCode::NotModified_304) { + int dummy_status; + if (!detail::read_content(strm, res, (std::numeric_limits::max)(), + dummy_status, std::move(progress), + std::move(out), decompress_)) { + if (error != Error::Canceled) { error = Error::Read; } + return false; + } + } + } + + // Log + if (logger_) { logger_(req, res); } + + return true; +} + +ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( + const std::string &boundary, const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) const { + size_t cur_item = 0; + size_t cur_start = 0; + // cur_item and cur_start are copied to within the std::function and maintain + // state between successive calls + return [&, cur_item, cur_start](size_t offset, + DataSink &sink) mutable -> bool { + if (!offset && !items.empty()) { + sink.os << detail::serialize_multipart_formdata(items, boundary, false); + return true; + } else if (cur_item < provider_items.size()) { + if (!cur_start) { + const auto &begin = detail::serialize_multipart_formdata_item_begin( + provider_items[cur_item], boundary); + offset += begin.size(); + cur_start = offset; + sink.os << begin; + } + + DataSink cur_sink; + auto has_data = true; + cur_sink.write = sink.write; + cur_sink.done = [&]() { has_data = false; }; + + if (!provider_items[cur_item].provider(offset - cur_start, cur_sink)) { + return false; + } + + if (!has_data) { + sink.os << detail::serialize_multipart_formdata_item_end(); + cur_item++; + cur_start = 0; + } + return true; + } else { + sink.os << detail::serialize_multipart_formdata_finish(boundary); + sink.done(); + return true; + } + }; +} + +bool ClientImpl::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + return detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, max_timeout_msec_, start_time, std::move(callback)); +} + +bool ClientImpl::is_ssl() const { return false; } + +Result ClientImpl::Get(const std::string &path) { + return Get(path, Headers(), Progress()); +} + +Result ClientImpl::Get(const std::string &path, Progress progress) { + return Get(path, Headers(), std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers) { + return Get(path, headers, Progress()); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers, + Progress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +Result ClientImpl::Get(const std::string &path, + ContentReceiver content_receiver) { + return Get(path, Headers(), nullptr, std::move(content_receiver), nullptr); +} + +Result ClientImpl::Get(const std::string &path, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, Headers(), nullptr, std::move(content_receiver), + std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver) { + return Get(path, headers, nullptr, std::move(content_receiver), nullptr); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), nullptr); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return Get(path, headers, std::move(response_handler), + std::move(content_receiver), nullptr); +} + +Result ClientImpl::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.response_handler = std::move(response_handler); + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + uint64_t /*offset*/, uint64_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress) { + if (params.empty()) { return Get(path, headers); } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + Progress progress) { + return Get(path, params, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + Progress progress) { + if (params.empty()) { + return Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); + } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +Result ClientImpl::Head(const std::string &path) { + return Head(path, Headers()); +} + +Result ClientImpl::Head(const std::string &path, + const Headers &headers) { + Request req; + req.method = "HEAD"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +Result ClientImpl::Post(const std::string &path) { + return Post(path, std::string(), std::string()); +} + +Result ClientImpl::Post(const std::string &path, + const Headers &headers) { + return Post(path, headers, nullptr, 0, std::string()); +} + +Result ClientImpl::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return Post(path, Headers(), body, content_length, content_type, nullptr); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return send_with_content_provider("POST", path, headers, body, content_length, + nullptr, nullptr, content_type, nullptr); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("POST", path, headers, body, content_length, + nullptr, nullptr, content_type, progress); +} + +Result ClientImpl::Post(const std::string &path, const std::string &body, + const std::string &content_type) { + return Post(path, Headers(), body, content_type); +} + +Result ClientImpl::Post(const std::string &path, const std::string &body, + const std::string &content_type, + Progress progress) { + return Post(path, Headers(), body, content_type, progress); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return send_with_content_provider("POST", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + nullptr); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("POST", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + progress); +} + +Result ClientImpl::Post(const std::string &path, const Params ¶ms) { + return Post(path, Headers(), params); +} + +Result ClientImpl::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +Result ClientImpl::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return Post(path, Headers(), std::move(content_provider), content_type); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return send_with_content_provider("POST", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type, nullptr); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type, + nullptr); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Post(path, headers, query, "application/x-www-form-urlencoded"); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress) { + auto query = detail::params_to_query_str(params); + return Post(path, headers, query, "application/x-www-form-urlencoded", + progress); +} + +Result ClientImpl::Post(const std::string &path, + const MultipartFormDataItems &items) { + return Post(path, Headers(), items); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Post(path, headers, body, content_type); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Post(path, headers, body, content_type); +} + +Result +ClientImpl::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider( + "POST", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr); +} + +Result ClientImpl::Put(const std::string &path) { + return Put(path, std::string(), std::string()); +} + +Result ClientImpl::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return Put(path, Headers(), body, content_length, content_type); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return send_with_content_provider("PUT", path, headers, body, content_length, + nullptr, nullptr, content_type, nullptr); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("PUT", path, headers, body, content_length, + nullptr, nullptr, content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const std::string &body, + const std::string &content_type) { + return Put(path, Headers(), body, content_type); +} + +Result ClientImpl::Put(const std::string &path, const std::string &body, + const std::string &content_type, + Progress progress) { + return Put(path, Headers(), body, content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return send_with_content_provider("PUT", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + nullptr); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("PUT", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + progress); +} + +Result ClientImpl::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +Result ClientImpl::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return Put(path, Headers(), std::move(content_provider), content_type); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return send_with_content_provider("PUT", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type, nullptr); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type, + nullptr); +} + +Result ClientImpl::Put(const std::string &path, const Params ¶ms) { + return Put(path, Headers(), params); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Put(path, headers, query, "application/x-www-form-urlencoded"); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress) { + auto query = detail::params_to_query_str(params); + return Put(path, headers, query, "application/x-www-form-urlencoded", + progress); +} + +Result ClientImpl::Put(const std::string &path, + const MultipartFormDataItems &items) { + return Put(path, Headers(), items); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Put(path, headers, body, content_type); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Put(path, headers, body, content_type); +} + +Result +ClientImpl::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider( + "PUT", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr); +} +Result ClientImpl::Patch(const std::string &path) { + return Patch(path, std::string(), std::string()); +} + +Result ClientImpl::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return Patch(path, Headers(), body, content_length, content_type); +} + +Result ClientImpl::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + Progress progress) { + return Patch(path, Headers(), body, content_length, content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return Patch(path, headers, body, content_length, content_type, nullptr); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("PATCH", path, headers, body, + content_length, nullptr, nullptr, + content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type) { + return Patch(path, Headers(), body, content_type); +} + +Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type, + Progress progress) { + return Patch(path, Headers(), body, content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return Patch(path, headers, body, content_type, nullptr); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return send_with_content_provider("PATCH", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + progress); +} + +Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type); +} + +Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return Patch(path, Headers(), std::move(content_provider), content_type); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return send_with_content_provider("PATCH", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type, nullptr); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type, + nullptr); +} + +Result ClientImpl::Delete(const std::string &path) { + return Delete(path, Headers(), std::string(), std::string()); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers) { + return Delete(path, headers, std::string(), std::string()); +} + +Result ClientImpl::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return Delete(path, Headers(), body, content_length, content_type); +} + +Result ClientImpl::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + Progress progress) { + return Delete(path, Headers(), body, content_length, content_type, progress); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const char *body, + size_t content_length, + const std::string &content_type) { + return Delete(path, headers, body, content_length, content_type, nullptr); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const char *body, + size_t content_length, + const std::string &content_type, + Progress progress) { + Request req; + req.method = "DELETE"; + req.headers = headers; + req.path = path; + req.progress = progress; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + req.body.assign(body, content_length); + + return send_(std::move(req)); +} + +Result ClientImpl::Delete(const std::string &path, + const std::string &body, + const std::string &content_type) { + return Delete(path, Headers(), body.data(), body.size(), content_type); +} + +Result ClientImpl::Delete(const std::string &path, + const std::string &body, + const std::string &content_type, + Progress progress) { + return Delete(path, Headers(), body.data(), body.size(), content_type, + progress); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + const std::string &body, + const std::string &content_type) { + return Delete(path, headers, body.data(), body.size(), content_type); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return Delete(path, headers, body.data(), body.size(), content_type, + progress); +} + +Result ClientImpl::Options(const std::string &path) { + return Options(path, Headers()); +} + +Result ClientImpl::Options(const std::string &path, + const Headers &headers) { + Request req; + req.method = "OPTIONS"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +void ClientImpl::stop() { + std::lock_guard guard(socket_mutex_); + + // If there is anything ongoing right now, the ONLY thread-safe thing we can + // do is to shutdown_socket, so that threads using this socket suddenly + // discover they can't read/write any more and error out. Everything else + // (closing the socket, shutting ssl down) is unsafe because these actions are + // not thread-safe. + if (socket_requests_in_flight_ > 0) { + shutdown_socket(socket_); + + // Aside from that, we set a flag for the socket to be closed when we're + // done. + socket_should_be_closed_when_request_is_done_ = true; + return; + } + + // Otherwise, still holding the mutex, we can shut everything down ourselves + shutdown_ssl(socket_, true); + shutdown_socket(socket_); + close_socket(socket_); +} + +std::string ClientImpl::host() const { return host_; } + +int ClientImpl::port() const { return port_; } + +size_t ClientImpl::is_socket_open() const { + std::lock_guard guard(socket_mutex_); + return socket_.is_open(); +} + +socket_t ClientImpl::socket() const { return socket_.sock; } + +void ClientImpl::set_connection_timeout(time_t sec, time_t usec) { + connection_timeout_sec_ = sec; + connection_timeout_usec_ = usec; +} + +void ClientImpl::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +void ClientImpl::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; +} + +void ClientImpl::set_max_timeout(time_t msec) { + max_timeout_msec_ = msec; +} + +void ClientImpl::set_basic_auth(const std::string &username, + const std::string &password) { + basic_auth_username_ = username; + basic_auth_password_ = password; +} + +void ClientImpl::set_bearer_token_auth(const std::string &token) { + bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void ClientImpl::set_digest_auth(const std::string &username, + const std::string &password) { + digest_auth_username_ = username; + digest_auth_password_ = password; +} +#endif + +void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } + +void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } + +void ClientImpl::set_url_encode(bool on) { url_encode_ = on; } + +void +ClientImpl::set_hostname_addr_map(std::map addr_map) { + addr_map_ = std::move(addr_map); +} + +void ClientImpl::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); +} + +void ClientImpl::set_header_writer( + std::function const &writer) { + header_writer_ = writer; +} + +void ClientImpl::set_address_family(int family) { + address_family_ = family; +} + +void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } + +void ClientImpl::set_ipv6_v6only(bool on) { ipv6_v6only_ = on; } + +void ClientImpl::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); +} + +void ClientImpl::set_compress(bool on) { compress_ = on; } + +void ClientImpl::set_decompress(bool on) { decompress_ = on; } + +void ClientImpl::set_interface(const std::string &intf) { + interface_ = intf; +} + +void ClientImpl::set_proxy(const std::string &host, int port) { + proxy_host_ = host; + proxy_port_ = port; +} + +void ClientImpl::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + proxy_basic_auth_username_ = username; + proxy_basic_auth_password_ = password; +} + +void ClientImpl::set_proxy_bearer_token_auth(const std::string &token) { + proxy_bearer_token_auth_token_ = token; +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void ClientImpl::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + proxy_digest_auth_username_ = username; + proxy_digest_auth_password_ = password; +} + +void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + ca_cert_file_path_ = ca_cert_file_path; + ca_cert_dir_path_ = ca_cert_dir_path; +} + +void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store && ca_cert_store != ca_cert_store_) { + ca_cert_store_ = ca_cert_store; + } +} + +X509_STORE *ClientImpl::create_ca_cert_store(const char *ca_cert, + std::size_t size) const { + auto mem = BIO_new_mem_buf(ca_cert, static_cast(size)); + auto se = detail::scope_exit([&] { BIO_free_all(mem); }); + if (!mem) { return nullptr; } + + auto inf = PEM_X509_INFO_read_bio(mem, nullptr, nullptr, nullptr); + if (!inf) { return nullptr; } + + auto cts = X509_STORE_new(); + if (cts) { + for (auto i = 0; i < static_cast(sk_X509_INFO_num(inf)); i++) { + auto itmp = sk_X509_INFO_value(inf, i); + if (!itmp) { continue; } + + if (itmp->x509) { X509_STORE_add_cert(cts, itmp->x509); } + if (itmp->crl) { X509_STORE_add_crl(cts, itmp->crl); } + } + } + + sk_X509_INFO_pop_free(inf, X509_INFO_free); + return cts; +} + +void ClientImpl::enable_server_certificate_verification(bool enabled) { + server_certificate_verification_ = enabled; +} + +void ClientImpl::enable_server_hostname_verification(bool enabled) { + server_hostname_verification_ = enabled; +} + +void ClientImpl::set_server_certificate_verifier( + std::function verifier) { + server_certificate_verifier_ = verifier; +} +#endif + +void ClientImpl::set_logger(Logger logger) { + logger_ = std::move(logger); +} + +/* + * SSL Implementation + */ +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +namespace detail { + +template +SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex, + U SSL_connect_or_accept, V setup) { + SSL *ssl = nullptr; + { + std::lock_guard guard(ctx_mutex); + ssl = SSL_new(ctx); + } + + if (ssl) { + set_nonblocking(sock, true); + auto bio = BIO_new_socket(static_cast(sock), BIO_NOCLOSE); + BIO_set_nbio(bio, 1); + SSL_set_bio(ssl, bio, bio); + + if (!setup(ssl) || SSL_connect_or_accept(ssl) != 1) { + SSL_shutdown(ssl); + { + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); + } + set_nonblocking(sock, false); + return nullptr; + } + BIO_set_nbio(bio, 0); + set_nonblocking(sock, false); + } + + return ssl; +} + +void ssl_delete(std::mutex &ctx_mutex, SSL *ssl, socket_t sock, + bool shutdown_gracefully) { + // sometimes we may want to skip this to try to avoid SIGPIPE if we know + // the remote has closed the network connection + // Note that it is not always possible to avoid SIGPIPE, this is merely a + // best-efforts. + if (shutdown_gracefully) { + (void)(sock); + // SSL_shutdown() returns 0 on first call (indicating close_notify alert + // sent) and 1 on subsequent call (indicating close_notify alert received) + if (SSL_shutdown(ssl) == 0) { + // Expected to return 1, but even if it doesn't, we free ssl + SSL_shutdown(ssl); + } + } + + std::lock_guard guard(ctx_mutex); + SSL_free(ssl); +} + +template +bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, + U ssl_connect_or_accept, + time_t timeout_sec, + time_t timeout_usec) { + auto res = 0; + while ((res = ssl_connect_or_accept(ssl)) != 1) { + auto err = SSL_get_error(ssl, res); + switch (err) { + case SSL_ERROR_WANT_READ: + if (select_read(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + case SSL_ERROR_WANT_WRITE: + if (select_write(sock, timeout_sec, timeout_usec) > 0) { continue; } + break; + default: break; + } + return false; + } + return true; +} + +template +bool process_server_socket_ssl( + const std::atomic &svr_sock, SSL *ssl, socket_t sock, + size_t keep_alive_max_count, time_t keep_alive_timeout_sec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +template +bool process_client_socket_ssl( + SSL *ssl, socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, T callback) { + SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +// SSL socket stream implementation +SSLSocketStream::SSLSocketStream( + socket_t sock, SSL *ssl, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), ssl_(ssl), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time) { + SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY); +} + +SSLSocketStream::~SSLSocketStream() = default; + +bool SSLSocketStream::is_readable() const { + return SSL_pending(ssl_) > 0; +} + +bool SSLSocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +bool SSLSocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_); +} + +ssize_t SSLSocketStream::read(char *ptr, size_t size) { + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (wait_readable()) { + auto ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_READ || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_READ) { +#endif + if (SSL_pending(ssl_) > 0) { + return SSL_read(ssl_, ptr, static_cast(size)); + } else if (wait_readable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = SSL_read(ssl_, ptr, static_cast(size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } + } + return ret; + } else { + return -1; + } +} + +ssize_t SSLSocketStream::write(const char *ptr, size_t size) { + if (wait_writable()) { + auto handle_size = static_cast( + std::min(size, (std::numeric_limits::max)())); + + auto ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret < 0) { + auto err = SSL_get_error(ssl_, ret); + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE || + (err == SSL_ERROR_SYSCALL && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { +#endif + if (wait_writable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = SSL_write(ssl_, ptr, static_cast(handle_size)); + if (ret >= 0) { return ret; } + err = SSL_get_error(ssl_, ret); + } else { + return -1; + } + } + } + return ret; + } + return -1; +} + +void SSLSocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + detail::get_remote_ip_and_port(sock_, ip, port); +} + +void SSLSocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + detail::get_local_ip_and_port(sock_, ip, port); +} + +socket_t SSLSocketStream::socket() const { return sock_; } + +time_t SSLSocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +} // namespace detail + +// SSL HTTP server implementation +SSLServer::SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path, + const char *client_ca_cert_dir_path, + const char *private_key_password) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + if (private_key_password != nullptr && (private_key_password[0] != '\0')) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, + reinterpret_cast(const_cast(private_key_password))); + } + + if (SSL_CTX_use_certificate_chain_file(ctx_, cert_path) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, private_key_path, SSL_FILETYPE_PEM) != + 1 || + SSL_CTX_check_private_key(ctx_) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_file_path || client_ca_cert_dir_path) { + SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, + client_ca_cert_dir_path); + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store) { + ctx_ = SSL_CTX_new(TLS_server_method()); + + if (ctx_) { + SSL_CTX_set_options(ctx_, + SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + if (SSL_CTX_use_certificate(ctx_, cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, private_key) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } else if (client_ca_cert_store) { + SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + + SSL_CTX_set_verify( + ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); + } + } +} + +SSLServer::SSLServer( + const std::function &setup_ssl_ctx_callback) { + ctx_ = SSL_CTX_new(TLS_method()); + if (ctx_) { + if (!setup_ssl_ctx_callback(*ctx_)) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +SSLServer::~SSLServer() { + if (ctx_) { SSL_CTX_free(ctx_); } +} + +bool SSLServer::is_valid() const { return ctx_; } + +SSL_CTX *SSLServer::ssl_context() const { return ctx_; } + +void SSLServer::update_certs(X509 *cert, EVP_PKEY *private_key, + X509_STORE *client_ca_cert_store) { + + std::lock_guard guard(ctx_mutex_); + + SSL_CTX_use_certificate(ctx_, cert); + SSL_CTX_use_PrivateKey(ctx_, private_key); + + if (client_ca_cert_store != nullptr) { + SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + } +} + +bool SSLServer::process_and_close_socket(socket_t sock) { + auto ssl = detail::ssl_new( + sock, ctx_, ctx_mutex_, + [&](SSL *ssl2) { + return detail::ssl_connect_or_accept_nonblocking( + sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_); + }, + [](SSL * /*ssl2*/) { return true; }); + + auto ret = false; + if (ssl) { + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + ret = detail::process_server_socket_ssl( + svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, remote_addr, remote_port, local_addr, + local_port, close_connection, + connection_closed, + [&](Request &req) { req.ssl = ssl; }); + }); + + // Shutdown gracefully if the result seemed successful, non-gracefully if + // the connection appeared to be closed. + const bool shutdown_gracefully = ret; + detail::ssl_delete(ctx_mutex_, ssl, sock, shutdown_gracefully); + } + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +// SSL HTTP client implementation +SSLClient::SSLClient(const std::string &host) + : SSLClient(host, 443, std::string(), std::string()) {} + +SSLClient::SSLClient(const std::string &host, int port) + : SSLClient(host, port, std::string(), std::string()) {} + +SSLClient::SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path, + const std::string &private_key_password) + : ClientImpl(host, port, client_cert_path, client_key_path) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(b, e); + }); + + if (!client_cert_path.empty() && !client_key_path.empty()) { + if (!private_key_password.empty()) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, reinterpret_cast( + const_cast(private_key_password.c_str()))); + } + + if (SSL_CTX_use_certificate_file(ctx_, client_cert_path.c_str(), + SSL_FILETYPE_PEM) != 1 || + SSL_CTX_use_PrivateKey_file(ctx_, client_key_path.c_str(), + SSL_FILETYPE_PEM) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +SSLClient::SSLClient(const std::string &host, int port, + X509 *client_cert, EVP_PKEY *client_key, + const std::string &private_key_password) + : ClientImpl(host, port) { + ctx_ = SSL_CTX_new(TLS_client_method()); + + detail::split(&host_[0], &host_[host_.size()], '.', + [&](const char *b, const char *e) { + host_components_.emplace_back(b, e); + }); + + if (client_cert != nullptr && client_key != nullptr) { + if (!private_key_password.empty()) { + SSL_CTX_set_default_passwd_cb_userdata( + ctx_, reinterpret_cast( + const_cast(private_key_password.c_str()))); + } + + if (SSL_CTX_use_certificate(ctx_, client_cert) != 1 || + SSL_CTX_use_PrivateKey(ctx_, client_key) != 1) { + SSL_CTX_free(ctx_); + ctx_ = nullptr; + } + } +} + +SSLClient::~SSLClient() { + if (ctx_) { SSL_CTX_free(ctx_); } + // Make sure to shut down SSL since shutdown_ssl will resolve to the + // base function rather than the derived function once we get to the + // base class destructor, and won't free the SSL (causing a leak). + shutdown_ssl_impl(socket_, true); +} + +bool SSLClient::is_valid() const { return ctx_; } + +void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (ca_cert_store) { + if (ctx_) { + if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { + // Free memory allocated for old cert and use new store `ca_cert_store` + SSL_CTX_set_cert_store(ctx_, ca_cert_store); + } + } else { + X509_STORE_free(ca_cert_store); + } + } +} + +void SSLClient::load_ca_cert_store(const char *ca_cert, + std::size_t size) { + set_ca_cert_store(ClientImpl::create_ca_cert_store(ca_cert, size)); +} + +long SSLClient::get_openssl_verify_result() const { + return verify_result_; +} + +SSL_CTX *SSLClient::ssl_context() const { return ctx_; } + +bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { + return is_valid() && ClientImpl::create_and_connect_socket(socket, error); +} + +// Assumes that socket_mutex_ is locked and that there are no requests in flight +bool SSLClient::connect_with_proxy( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) { + success = true; + Response proxy_res; + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req2; + req2.method = "CONNECT"; + req2.path = host_and_port_; + if (max_timeout_msec_ > 0) { + req2.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req2, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are no + // requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + + if (proxy_res.status == StatusCode::ProxyAuthenticationRequired_407) { + if (!proxy_digest_auth_username_.empty() && + !proxy_digest_auth_password_.empty()) { + std::map auth; + if (detail::parse_www_authenticate(proxy_res, auth, true)) { + proxy_res = Response(); + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req3; + req3.method = "CONNECT"; + req3.path = host_and_port_; + req3.headers.insert(detail::make_digest_authentication_header( + req3, auth, 1, detail::random_string(10), + proxy_digest_auth_username_, proxy_digest_auth_password_, + true)); + if (max_timeout_msec_ > 0) { + req3.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req3, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + } + } + } + + // If status code is not 200, proxy request is failed. + // Set error to ProxyConnection and return proxy response + // as the response of the request + if (proxy_res.status != StatusCode::OK_200) { + error = Error::ProxyConnection; + res = std::move(proxy_res); + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + return false; + } + + return true; +} + +bool SSLClient::load_certs() { + auto ret = true; + + std::call_once(initialize_cert_, [&]() { + std::lock_guard guard(ctx_mutex_); + if (!ca_cert_file_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, ca_cert_file_path_.c_str(), + nullptr)) { + ret = false; + } + } else if (!ca_cert_dir_path_.empty()) { + if (!SSL_CTX_load_verify_locations(ctx_, nullptr, + ca_cert_dir_path_.c_str())) { + ret = false; + } + } else { + auto loaded = false; +#ifdef _WIN32 + loaded = + detail::load_system_certs_on_windows(SSL_CTX_get_cert_store(ctx_)); +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) +#if TARGET_OS_OSX + loaded = detail::load_system_certs_on_macos(SSL_CTX_get_cert_store(ctx_)); +#endif // TARGET_OS_OSX +#endif // _WIN32 + if (!loaded) { SSL_CTX_set_default_verify_paths(ctx_); } + } + }); + + return ret; +} + +bool SSLClient::initialize_ssl(Socket &socket, Error &error) { + auto ssl = detail::ssl_new( + socket.sock, ctx_, ctx_mutex_, + [&](SSL *ssl2) { + if (server_certificate_verification_) { + if (!load_certs()) { + error = Error::SSLLoadingCerts; + return false; + } + SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); + } + + if (!detail::ssl_connect_or_accept_nonblocking( + socket.sock, ssl2, SSL_connect, connection_timeout_sec_, + connection_timeout_usec_)) { + error = Error::SSLConnection; + return false; + } + + if (server_certificate_verification_) { + auto verification_status = SSLVerifierResponse::NoDecisionMade; + + if (server_certificate_verifier_) { + verification_status = server_certificate_verifier_(ssl2); + } + + if (verification_status == SSLVerifierResponse::CertificateRejected) { + error = Error::SSLServerVerification; + return false; + } + + if (verification_status == SSLVerifierResponse::NoDecisionMade) { + verify_result_ = SSL_get_verify_result(ssl2); + + if (verify_result_ != X509_V_OK) { + error = Error::SSLServerVerification; + return false; + } + + auto server_cert = SSL_get1_peer_certificate(ssl2); + auto se = detail::scope_exit([&] { X509_free(server_cert); }); + + if (server_cert == nullptr) { + error = Error::SSLServerVerification; + return false; + } + + if (server_hostname_verification_) { + if (!verify_host(server_cert)) { + error = Error::SSLServerHostnameVerification; + return false; + } + } + } + } + + return true; + }, + [&](SSL *ssl2) { +#if defined(OPENSSL_IS_BORINGSSL) + SSL_set_tlsext_host_name(ssl2, host_.c_str()); +#else + // NOTE: Direct call instead of using the OpenSSL macro to suppress + // -Wold-style-cast warning + SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, + static_cast(const_cast(host_.c_str()))); +#endif + return true; + }); + + if (ssl) { + socket.ssl = ssl; + return true; + } + + shutdown_socket(socket); + close_socket(socket); + return false; +} + +void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracefully) { + shutdown_ssl_impl(socket, shutdown_gracefully); +} + +void SSLClient::shutdown_ssl_impl(Socket &socket, + bool shutdown_gracefully) { + if (socket.sock == INVALID_SOCKET) { + assert(socket.ssl == nullptr); + return; + } + if (socket.ssl) { + detail::ssl_delete(ctx_mutex_, socket.ssl, socket.sock, + shutdown_gracefully); + socket.ssl = nullptr; + } + assert(socket.ssl == nullptr); +} + +bool SSLClient::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + assert(socket.ssl); + return detail::process_client_socket_ssl( + socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, start_time, + std::move(callback)); +} + +bool SSLClient::is_ssl() const { return true; } + +bool SSLClient::verify_host(X509 *server_cert) const { + /* Quote from RFC2818 section 3.1 "Server Identity" + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. + + Matching is performed using the matching rules specified by + [RFC2459]. If more than one identity of a given type is present in + the certificate (e.g., more than one dNSName name, a match in any one + of the set is considered acceptable.) Names may contain the wildcard + character * which is considered to match any single domain name + component or component fragment. E.g., *.a.com matches foo.a.com but + not bar.foo.a.com. f*.com matches foo.com but not bar.com. + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. + + */ + return verify_host_with_subject_alt_name(server_cert) || + verify_host_with_common_name(server_cert); +} + +bool +SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { + auto ret = false; + + auto type = GEN_DNS; + + struct in6_addr addr6 = {}; + struct in_addr addr = {}; + size_t addr_len = 0; + +#ifndef __MINGW32__ + if (inet_pton(AF_INET6, host_.c_str(), &addr6)) { + type = GEN_IPADD; + addr_len = sizeof(struct in6_addr); + } else if (inet_pton(AF_INET, host_.c_str(), &addr)) { + type = GEN_IPADD; + addr_len = sizeof(struct in_addr); + } +#endif + + auto alt_names = static_cast( + X509_get_ext_d2i(server_cert, NID_subject_alt_name, nullptr, nullptr)); + + if (alt_names) { + auto dsn_matched = false; + auto ip_matched = false; + + auto count = sk_GENERAL_NAME_num(alt_names); + + for (decltype(count) i = 0; i < count && !dsn_matched; i++) { + auto val = sk_GENERAL_NAME_value(alt_names, i); + if (val->type == type) { + auto name = + reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); + auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); + + switch (type) { + case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; + + case GEN_IPADD: + if (!memcmp(&addr6, name, addr_len) || + !memcmp(&addr, name, addr_len)) { + ip_matched = true; + } + break; + } + } + } + + if (dsn_matched || ip_matched) { ret = true; } + } + + GENERAL_NAMES_free(const_cast( + reinterpret_cast(alt_names))); + return ret; +} + +bool SSLClient::verify_host_with_common_name(X509 *server_cert) const { + const auto subject_name = X509_get_subject_name(server_cert); + + if (subject_name != nullptr) { + char name[BUFSIZ]; + auto name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName, + name, sizeof(name)); + + if (name_len != -1) { + return check_host_name(name, static_cast(name_len)); + } + } + + return false; +} + +bool SSLClient::check_host_name(const char *pattern, + size_t pattern_len) const { + if (host_.size() == pattern_len && host_ == pattern) { return true; } + + // Wildcard match + // https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/376484 + std::vector pattern_components; + detail::split(&pattern[0], &pattern[pattern_len], '.', + [&](const char *b, const char *e) { + pattern_components.emplace_back(b, e); + }); + + if (host_components_.size() != pattern_components.size()) { return false; } + + auto itr = pattern_components.begin(); + for (const auto &h : host_components_) { + auto &p = *itr; + if (p != h && p != "*") { + auto partial_match = (p.size() > 0 && p[p.size() - 1] == '*' && + !p.compare(0, p.size() - 1, h)); + if (!partial_match) { return false; } + } + ++itr; + } + + return true; +} +#endif + +// Universal client implementation +Client::Client(const std::string &scheme_host_port) + : Client(scheme_host_port, std::string(), std::string()) {} + +Client::Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path) { + const static std::regex re( + R"((?:([a-z]+):\/\/)?(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); + + std::smatch m; + if (std::regex_match(scheme_host_port, m, re)) { + auto scheme = m[1].str(); + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!scheme.empty() && (scheme != "http" && scheme != "https")) { +#else + if (!scheme.empty() && scheme != "http") { +#endif +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "'" + scheme + "' scheme is not supported."; + throw std::invalid_argument(msg); +#endif + return; + } + + auto is_ssl = scheme == "https"; + + auto host = m[2].str(); + if (host.empty()) { host = m[3].str(); } + + auto port_str = m[4].str(); + auto port = !port_str.empty() ? std::stoi(port_str) : (is_ssl ? 443 : 80); + + if (is_ssl) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + is_ssl_ = is_ssl; +#endif + } else { + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + } + } else { + // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress) + // if port param below changes. + cli_ = detail::make_unique(scheme_host_port, 80, + client_cert_path, client_key_path); + } +} // namespace detail + +Client::Client(const std::string &host, int port) + : cli_(detail::make_unique(host, port)) {} + +Client::Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : cli_(detail::make_unique(host, port, client_cert_path, + client_key_path)) {} + +Client::~Client() = default; + +bool Client::is_valid() const { + return cli_ != nullptr && cli_->is_valid(); +} + +Result Client::Get(const std::string &path) { return cli_->Get(path); } +Result Client::Get(const std::string &path, const Headers &headers) { + return cli_->Get(path, headers); +} +Result Client::Get(const std::string &path, Progress progress) { + return cli_->Get(path, std::move(progress)); +} +Result Client::Get(const std::string &path, const Headers &headers, + Progress progress) { + return cli_->Get(path, headers, std::move(progress)); +} +Result Client::Get(const std::string &path, + ContentReceiver content_receiver) { + return cli_->Get(path, std::move(content_receiver)); +} +Result Client::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver) { + return cli_->Get(path, headers, std::move(content_receiver)); +} +Result Client::Get(const std::string &path, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, std::move(content_receiver), std::move(progress)); +} +Result Client::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, headers, std::move(content_receiver), + std::move(progress)); +} +Result Client::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver)); +} +Result Client::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver)); +} +Result Client::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +Result Client::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress) { + return cli_->Get(path, params, headers, std::move(progress)); +} +Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, params, headers, std::move(content_receiver), + std::move(progress)); +} +Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress) { + return cli_->Get(path, params, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +Result Client::Head(const std::string &path) { return cli_->Head(path); } +Result Client::Head(const std::string &path, const Headers &headers) { + return cli_->Head(path, headers); +} + +Result Client::Post(const std::string &path) { return cli_->Post(path); } +Result Client::Post(const std::string &path, const Headers &headers) { + return cli_->Post(path, headers); +} +Result Client::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return cli_->Post(path, body, content_length, content_type); +} +Result Client::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return cli_->Post(path, headers, body, content_length, content_type); +} +Result Client::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress) { + return cli_->Post(path, headers, body, content_length, content_type, + progress); +} +Result Client::Post(const std::string &path, const std::string &body, + const std::string &content_type) { + return cli_->Post(path, body, content_type); +} +Result Client::Post(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress) { + return cli_->Post(path, body, content_type, progress); +} +Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return cli_->Post(path, headers, body, content_type); +} +Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, Progress progress) { + return cli_->Post(path, headers, body, content_type, progress); +} +Result Client::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type); +} +Result Client::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Post(path, std::move(content_provider), content_type); +} +Result Client::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type); +} +Result Client::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Post(path, headers, std::move(content_provider), content_type); +} +Result Client::Post(const std::string &path, const Params ¶ms) { + return cli_->Post(path, params); +} +Result Client::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Post(path, headers, params); +} +Result Client::Post(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress) { + return cli_->Post(path, headers, params, progress); +} +Result Client::Post(const std::string &path, + const MultipartFormDataItems &items) { + return cli_->Post(path, items); +} +Result Client::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + return cli_->Post(path, headers, items); +} +Result Client::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + return cli_->Post(path, headers, items, boundary); +} +Result +Client::Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) { + return cli_->Post(path, headers, items, provider_items); +} +Result Client::Put(const std::string &path) { return cli_->Put(path); } +Result Client::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return cli_->Put(path, body, content_length, content_type); +} +Result Client::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return cli_->Put(path, headers, body, content_length, content_type); +} +Result Client::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress) { + return cli_->Put(path, headers, body, content_length, content_type, progress); +} +Result Client::Put(const std::string &path, const std::string &body, + const std::string &content_type) { + return cli_->Put(path, body, content_type); +} +Result Client::Put(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress) { + return cli_->Put(path, body, content_type, progress); +} +Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return cli_->Put(path, headers, body, content_type); +} +Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, Progress progress) { + return cli_->Put(path, headers, body, content_type, progress); +} +Result Client::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type); +} +Result Client::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Put(path, std::move(content_provider), content_type); +} +Result Client::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type); +} +Result Client::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Put(path, headers, std::move(content_provider), content_type); +} +Result Client::Put(const std::string &path, const Params ¶ms) { + return cli_->Put(path, params); +} +Result Client::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Put(path, headers, params); +} +Result Client::Put(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress) { + return cli_->Put(path, headers, params, progress); +} +Result Client::Put(const std::string &path, + const MultipartFormDataItems &items) { + return cli_->Put(path, items); +} +Result Client::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items) { + return cli_->Put(path, headers, items); +} +Result Client::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const std::string &boundary) { + return cli_->Put(path, headers, items, boundary); +} +Result +Client::Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) { + return cli_->Put(path, headers, items, provider_items); +} +Result Client::Patch(const std::string &path) { + return cli_->Patch(path); +} +Result Client::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return cli_->Patch(path, body, content_length, content_type); +} +Result Client::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + Progress progress) { + return cli_->Patch(path, body, content_length, content_type, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return cli_->Patch(path, headers, body, content_length, content_type); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + Progress progress) { + return cli_->Patch(path, headers, body, content_length, content_type, + progress); +} +Result Client::Patch(const std::string &path, const std::string &body, + const std::string &content_type) { + return cli_->Patch(path, body, content_type); +} +Result Client::Patch(const std::string &path, const std::string &body, + const std::string &content_type, + Progress progress) { + return cli_->Patch(path, body, content_type, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return cli_->Patch(path, headers, body, content_type); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return cli_->Patch(path, headers, body, content_type, progress); +} +Result Client::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type); +} +Result Client::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Patch(path, std::move(content_provider), content_type); +} +Result Client::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type); +} +Result Client::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type) { + return cli_->Patch(path, headers, std::move(content_provider), content_type); +} +Result Client::Delete(const std::string &path) { + return cli_->Delete(path); +} +Result Client::Delete(const std::string &path, const Headers &headers) { + return cli_->Delete(path, headers); +} +Result Client::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type) { + return cli_->Delete(path, body, content_length, content_type); +} +Result Client::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + Progress progress) { + return cli_->Delete(path, body, content_length, content_type, progress); +} +Result Client::Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type) { + return cli_->Delete(path, headers, body, content_length, content_type); +} +Result Client::Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + Progress progress) { + return cli_->Delete(path, headers, body, content_length, content_type, + progress); +} +Result Client::Delete(const std::string &path, const std::string &body, + const std::string &content_type) { + return cli_->Delete(path, body, content_type); +} +Result Client::Delete(const std::string &path, const std::string &body, + const std::string &content_type, + Progress progress) { + return cli_->Delete(path, body, content_type, progress); +} +Result Client::Delete(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type) { + return cli_->Delete(path, headers, body, content_type); +} +Result Client::Delete(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + Progress progress) { + return cli_->Delete(path, headers, body, content_type, progress); +} +Result Client::Options(const std::string &path) { + return cli_->Options(path); +} +Result Client::Options(const std::string &path, const Headers &headers) { + return cli_->Options(path, headers); +} + +bool Client::send(Request &req, Response &res, Error &error) { + return cli_->send(req, res, error); +} + +Result Client::send(const Request &req) { return cli_->send(req); } + +void Client::stop() { cli_->stop(); } + +std::string Client::host() const { return cli_->host(); } + +int Client::port() const { return cli_->port(); } + +size_t Client::is_socket_open() const { return cli_->is_socket_open(); } + +socket_t Client::socket() const { return cli_->socket(); } + +void +Client::set_hostname_addr_map(std::map addr_map) { + cli_->set_hostname_addr_map(std::move(addr_map)); +} + +void Client::set_default_headers(Headers headers) { + cli_->set_default_headers(std::move(headers)); +} + +void Client::set_header_writer( + std::function const &writer) { + cli_->set_header_writer(writer); +} + +void Client::set_address_family(int family) { + cli_->set_address_family(family); +} + +void Client::set_tcp_nodelay(bool on) { cli_->set_tcp_nodelay(on); } + +void Client::set_socket_options(SocketOptions socket_options) { + cli_->set_socket_options(std::move(socket_options)); +} + +void Client::set_connection_timeout(time_t sec, time_t usec) { + cli_->set_connection_timeout(sec, usec); +} + +void Client::set_read_timeout(time_t sec, time_t usec) { + cli_->set_read_timeout(sec, usec); +} + +void Client::set_write_timeout(time_t sec, time_t usec) { + cli_->set_write_timeout(sec, usec); +} + +void Client::set_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_basic_auth(username, password); +} +void Client::set_bearer_token_auth(const std::string &token) { + cli_->set_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void Client::set_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_digest_auth(username, password); +} +#endif + +void Client::set_keep_alive(bool on) { cli_->set_keep_alive(on); } +void Client::set_follow_location(bool on) { + cli_->set_follow_location(on); +} + +void Client::set_url_encode(bool on) { cli_->set_url_encode(on); } + +void Client::set_compress(bool on) { cli_->set_compress(on); } + +void Client::set_decompress(bool on) { cli_->set_decompress(on); } + +void Client::set_interface(const std::string &intf) { + cli_->set_interface(intf); +} + +void Client::set_proxy(const std::string &host, int port) { + cli_->set_proxy(host, port); +} +void Client::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_basic_auth(username, password); +} +void Client::set_proxy_bearer_token_auth(const std::string &token) { + cli_->set_proxy_bearer_token_auth(token); +} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void Client::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_digest_auth(username, password); +} +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void Client::enable_server_certificate_verification(bool enabled) { + cli_->enable_server_certificate_verification(enabled); +} + +void Client::enable_server_hostname_verification(bool enabled) { + cli_->enable_server_hostname_verification(enabled); +} + +void Client::set_server_certificate_verifier( + std::function verifier) { + cli_->set_server_certificate_verifier(verifier); +} +#endif + +void Client::set_logger(Logger logger) { + cli_->set_logger(std::move(logger)); +} + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +void Client::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); +} + +void Client::set_ca_cert_store(X509_STORE *ca_cert_store) { + if (is_ssl_) { + static_cast(*cli_).set_ca_cert_store(ca_cert_store); + } else { + cli_->set_ca_cert_store(ca_cert_store); + } +} + +void Client::load_ca_cert_store(const char *ca_cert, std::size_t size) { + set_ca_cert_store(cli_->create_ca_cert_store(ca_cert, size)); +} + +long Client::get_openssl_verify_result() const { + if (is_ssl_) { + return static_cast(*cli_).get_openssl_verify_result(); + } + return -1; // NOTE: -1 doesn't match any of X509_V_ERR_??? +} + +SSL_CTX *Client::ssl_context() const { + if (is_ssl_) { return static_cast(*cli_).ssl_context(); } + return nullptr; +} +#endif + +} // namespace httplib diff --git a/vendor/cpp-httplib/httplib.h b/vendor/cpp-httplib/httplib.h index b76a17d07ac..7ee219380f9 100644 --- a/vendor/cpp-httplib/httplib.h +++ b/vendor/cpp-httplib/httplib.h @@ -8,35 +8,7 @@ #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.27.0" -#define CPPHTTPLIB_VERSION_NUM "0x001B00" - -/* - * Platform compatibility check - */ - -#if defined(_WIN32) && !defined(_WIN64) -#if defined(_MSC_VER) -#pragma message( \ - "cpp-httplib doesn't support 32-bit Windows. Please use a 64-bit compiler.") -#else -#warning \ - "cpp-httplib doesn't support 32-bit Windows. Please use a 64-bit compiler." -#endif -#elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ < 8 -#warning \ - "cpp-httplib doesn't support 32-bit platforms. Please use a 64-bit compiler." -#elif defined(__SIZEOF_SIZE_T__) && __SIZEOF_SIZE_T__ < 8 -#warning \ - "cpp-httplib doesn't support platforms where size_t is less than 64 bits." -#endif - -#ifdef _WIN32 -#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0A00 -#error \ - "cpp-httplib doesn't support Windows 8 or lower. Please use Windows 10 or later." -#endif -#endif +#define CPPHTTPLIB_VERSION "0.20.1" /* * Configuration @@ -104,7 +76,7 @@ #ifndef CPPHTTPLIB_IDLE_INTERVAL_USECOND #ifdef _WIN32 -#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 1000 +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 10000 #else #define CPPHTTPLIB_IDLE_INTERVAL_USECOND 0 #endif @@ -118,10 +90,6 @@ #define CPPHTTPLIB_HEADER_MAX_LENGTH 8192 #endif -#ifndef CPPHTTPLIB_HEADER_MAX_COUNT -#define CPPHTTPLIB_HEADER_MAX_COUNT 100 -#endif - #ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT #define CPPHTTPLIB_REDIRECT_MAX_COUNT 20 #endif @@ -154,10 +122,6 @@ #define CPPHTTPLIB_RECV_BUFSIZ size_t(16384u) #endif -#ifndef CPPHTTPLIB_SEND_BUFSIZ -#define CPPHTTPLIB_SEND_BUFSIZ size_t(16384u) -#endif - #ifndef CPPHTTPLIB_COMPRESSION_BUFSIZ #define CPPHTTPLIB_COMPRESSION_BUFSIZ size_t(16384u) #endif @@ -205,7 +169,11 @@ #pragma comment(lib, "ws2_32.lib") +#ifdef _WIN64 using ssize_t = __int64; +#else +using ssize_t = long; +#endif #endif // _MSC_VER #ifndef S_ISREG @@ -224,13 +192,8 @@ using ssize_t = __int64; #include #include -#if defined(__has_include) -#if __has_include() // afunix.h uses types declared in winsock2.h, so has to be included after it. #include -#define CPPHTTPLIB_HAVE_AFUNIX_H 1 -#endif -#endif #ifndef WSA_FLAG_NO_HANDLE_INHERIT #define WSA_FLAG_NO_HANDLE_INHERIT 0x80 @@ -273,10 +236,6 @@ using socket_t = int; #endif #endif //_WIN32 -#if defined(__APPLE__) -#include -#endif - #include #include #include @@ -306,15 +265,6 @@ using socket_t = int; #include #include -#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \ - defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) -#if TARGET_OS_MAC -#include -#include -#endif -#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or - // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN - #ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef _WIN32 #include @@ -329,13 +279,13 @@ using socket_t = int; #ifdef _MSC_VER #pragma comment(lib, "crypt32.lib") #endif -#endif // _WIN32 - -#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) -#if TARGET_OS_MAC +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) +#include +#if TARGET_OS_OSX +#include #include -#endif -#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO +#endif // TARGET_OS_OSX +#endif // _WIN32 #include #include @@ -358,7 +308,7 @@ using socket_t = int; #error Sorry, OpenSSL versions prior to 3.0.0 are not supported #endif -#endif // CPPHTTPLIB_OPENSSL_SUPPORT +#endif #ifdef CPPHTTPLIB_ZLIB_SUPPORT #include @@ -456,10 +406,6 @@ struct hash { } }; -template -using unordered_set = std::unordered_set; - } // namespace case_ignore // This is based on @@ -583,53 +529,19 @@ using Headers = using Params = std::multimap; using Match = std::smatch; -using DownloadProgress = std::function; -using UploadProgress = std::function; +using Progress = std::function; struct Response; using ResponseHandler = std::function; -struct FormData { - std::string name; - std::string content; - std::string filename; - std::string content_type; - Headers headers; -}; - -struct FormField { - std::string name; - std::string content; - Headers headers; -}; -using FormFields = std::multimap; - -using FormFiles = std::multimap; - struct MultipartFormData { - FormFields fields; // Text fields from multipart - FormFiles files; // Files from multipart - - // Text field access - std::string get_field(const std::string &key, size_t id = 0) const; - std::vector get_fields(const std::string &key) const; - bool has_field(const std::string &key) const; - size_t get_field_count(const std::string &key) const; - - // File access - FormData get_file(const std::string &key, size_t id = 0) const; - std::vector get_files(const std::string &key) const; - bool has_file(const std::string &key) const; - size_t get_file_count(const std::string &key) const; -}; - -struct UploadFormData { std::string name; std::string content; std::string filename; std::string content_type; }; -using UploadFormDataItems = std::vector; +using MultipartFormDataItems = std::vector; +using MultipartFormDataMap = std::multimap; class DataSink { public: @@ -672,34 +584,37 @@ using ContentProviderWithoutLength = using ContentProviderResourceReleaser = std::function; -struct FormDataProvider { +struct MultipartFormDataProvider { std::string name; ContentProviderWithoutLength provider; std::string filename; std::string content_type; }; -using FormDataProviderItems = std::vector; +using MultipartFormDataProviderItems = std::vector; -using ContentReceiverWithProgress = std::function; +using ContentReceiverWithProgress = + std::function; using ContentReceiver = std::function; -using FormDataHeader = std::function; +using MultipartContentHeader = + std::function; class ContentReader { public: using Reader = std::function; - using FormDataReader = - std::function; + using MultipartReader = std::function; - ContentReader(Reader reader, FormDataReader multipart_reader) + ContentReader(Reader reader, MultipartReader multipart_reader) : reader_(std::move(reader)), - formdata_reader_(std::move(multipart_reader)) {} + multipart_reader_(std::move(multipart_reader)) {} - bool operator()(FormDataHeader header, ContentReceiver receiver) const { - return formdata_reader_(std::move(header), std::move(receiver)); + bool operator()(MultipartContentHeader header, + ContentReceiver receiver) const { + return multipart_reader_(std::move(header), std::move(receiver)); } bool operator()(ContentReceiver receiver) const { @@ -707,7 +622,7 @@ class ContentReader { } Reader reader_; - FormDataReader formdata_reader_; + MultipartReader multipart_reader_; }; using Range = std::pair; @@ -716,10 +631,8 @@ using Ranges = std::vector; struct Request { std::string method; std::string path; - std::string matched_route; Params params; Headers headers; - Headers trailers; std::string body; std::string remote_addr; @@ -730,18 +643,16 @@ struct Request { // for server std::string version; std::string target; - MultipartFormData form; + MultipartFormDataMap files; Ranges ranges; Match matches; std::unordered_map path_params; std::function is_connection_closed = []() { return true; }; // for client - std::vector accept_content_types; ResponseHandler response_handler; ContentReceiverWithProgress content_receiver; - DownloadProgress download_progress; - UploadProgress upload_progress; + Progress progress; #ifdef CPPHTTPLIB_OPENSSL_SUPPORT const SSL *ssl = nullptr; #endif @@ -749,21 +660,21 @@ struct Request { bool has_header(const std::string &key) const; std::string get_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - size_t get_header_value_u64(const std::string &key, size_t def = 0, - size_t id = 0) const; + uint64_t get_header_value_u64(const std::string &key, uint64_t def = 0, + size_t id = 0) const; size_t get_header_value_count(const std::string &key) const; void set_header(const std::string &key, const std::string &val); - bool has_trailer(const std::string &key) const; - std::string get_trailer_value(const std::string &key, size_t id = 0) const; - size_t get_trailer_value_count(const std::string &key) const; - bool has_param(const std::string &key) const; std::string get_param_value(const std::string &key, size_t id = 0) const; size_t get_param_value_count(const std::string &key) const; bool is_multipart_form_data() const; + bool has_file(const std::string &key) const; + MultipartFormData get_file_value(const std::string &key) const; + std::vector get_file_values(const std::string &key) const; + // private members... size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; size_t content_length_ = 0; @@ -779,22 +690,17 @@ struct Response { int status = -1; std::string reason; Headers headers; - Headers trailers; std::string body; std::string location; // Redirect location bool has_header(const std::string &key) const; std::string get_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - size_t get_header_value_u64(const std::string &key, size_t def = 0, - size_t id = 0) const; + uint64_t get_header_value_u64(const std::string &key, uint64_t def = 0, + size_t id = 0) const; size_t get_header_value_count(const std::string &key) const; void set_header(const std::string &key, const std::string &val); - bool has_trailer(const std::string &key) const; - std::string get_trailer_value(const std::string &key, size_t id = 0) const; - size_t get_trailer_value_count(const std::string &key) const; - void set_redirect(const std::string &url, int status = StatusCode::Found_302); void set_content(const char *s, size_t n, const std::string &content_type); void set_content(const std::string &s, const std::string &content_type); @@ -954,10 +860,6 @@ class ThreadPool final : public TaskQueue { using Logger = std::function; -// Forward declaration for Error type -enum class Error; -using ErrorLogger = std::function; - using SocketOptions = std::function; namespace detail { @@ -980,16 +882,10 @@ namespace detail { class MatcherBase { public: - MatcherBase(std::string pattern) : pattern_(pattern) {} virtual ~MatcherBase() = default; - const std::string &pattern() const { return pattern_; } - // Match request path and populate its matches and virtual bool match(Request &request) const = 0; - -private: - std::string pattern_; }; /** @@ -1041,8 +937,7 @@ class PathParamsMatcher final : public MatcherBase { */ class RegexMatcher final : public MatcherBase { public: - RegexMatcher(const std::string &pattern) - : MatcherBase(pattern), regex_(pattern) {} + RegexMatcher(const std::string &pattern) : regex_(pattern) {} bool match(Request &request) const override; @@ -1052,9 +947,6 @@ class RegexMatcher final : public MatcherBase { ssize_t write_headers(Stream &strm, const Headers &headers); -std::string make_host_and_port_string(const std::string &host, int port, - bool is_ssl); - } // namespace detail class Server { @@ -1112,16 +1004,11 @@ class Server { } Server &set_exception_handler(ExceptionHandler handler); - Server &set_pre_routing_handler(HandlerWithResponse handler); Server &set_post_routing_handler(Handler handler); - Server &set_pre_request_handler(HandlerWithResponse handler); - Server &set_expect_100_continue_handler(Expect100ContinueHandler handler); Server &set_logger(Logger logger); - Server &set_pre_compression_logger(Logger logger); - Server &set_error_logger(ErrorLogger error_logger); Server &set_address_family(int family); Server &set_tcp_nodelay(bool on); @@ -1132,8 +1019,6 @@ class Server { Server & set_header_writer(std::function const &writer); - Server &set_trusted_proxies(const std::vector &proxies); - Server &set_keep_alive_max_count(size_t count); Server &set_keep_alive_timeout(time_t sec); @@ -1172,9 +1057,6 @@ class Server { const std::function &setup_request); std::atomic svr_sock_{INVALID_SOCKET}; - - std::vector trusted_proxies_; - size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; time_t read_timeout_sec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND; @@ -1205,7 +1087,8 @@ class Server { bool listen_internal(); bool routing(Request &req, Response &res, Stream &strm); - bool handle_file_request(const Request &req, Response &res); + bool handle_file_request(const Request &req, Response &res, + bool head = false); bool dispatch_request(Request &req, Response &res, const Handlers &handlers) const; bool dispatch_request_for_content_reader( @@ -1226,23 +1109,18 @@ class Server { Response &res, const std::string &boundary, const std::string &content_type); bool read_content(Stream &strm, Request &req, Response &res); - bool read_content_with_content_receiver(Stream &strm, Request &req, - Response &res, - ContentReceiver receiver, - FormDataHeader multipart_header, - ContentReceiver multipart_receiver); + bool + read_content_with_content_receiver(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + MultipartContentHeader multipart_header, + ContentReceiver multipart_receiver); bool read_content_core(Stream &strm, Request &req, Response &res, ContentReceiver receiver, - FormDataHeader multipart_header, + MultipartContentHeader multipart_header, ContentReceiver multipart_receiver) const; virtual bool process_and_close_socket(socket_t sock); - void output_log(const Request &req, const Response &res) const; - void output_pre_compression_log(const Request &req, - const Response &res) const; - void output_error_log(const Error &err, const Request *req) const; - std::atomic is_running_{false}; std::atomic is_decommissioned{false}; @@ -1271,13 +1149,9 @@ class Server { ExceptionHandler exception_handler_; HandlerWithResponse pre_routing_handler_; Handler post_routing_handler_; - HandlerWithResponse pre_request_handler_; Expect100ContinueHandler expect_100_continue_handler_; - mutable std::mutex logger_mutex_; Logger logger_; - Logger pre_compression_logger_; - ErrorLogger error_logger_; int address_family_ = AF_UNSPEC; bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; @@ -1306,22 +1180,6 @@ enum class Error { Compression, ConnectionTimeout, ProxyConnection, - ResourceExhaustion, - TooManyFormDataFiles, - ExceedMaxPayloadSize, - ExceedUriMaxLength, - ExceedMaxSocketDescriptorCount, - InvalidRequestLine, - InvalidHTTPMethod, - InvalidHTTPVersion, - InvalidHeaders, - MultipartParsing, - OpenFile, - Listen, - GetSockName, - UnsupportedAddressFamily, - HTTPParsing, - InvalidRangeHeader, // For internal use only SSLPeerCouldBeClosed_, @@ -1338,17 +1196,6 @@ class Result { Headers &&request_headers = Headers{}) : res_(std::move(res)), err_(err), request_headers_(std::move(request_headers)) {} -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - Result(std::unique_ptr &&res, Error err, Headers &&request_headers, - int ssl_error) - : res_(std::move(res)), err_(err), - request_headers_(std::move(request_headers)), ssl_error_(ssl_error) {} - Result(std::unique_ptr &&res, Error err, Headers &&request_headers, - int ssl_error, unsigned long ssl_openssl_error) - : res_(std::move(res)), err_(err), - request_headers_(std::move(request_headers)), ssl_error_(ssl_error), - ssl_openssl_error_(ssl_openssl_error) {} -#endif // Response operator bool() const { return res_ != nullptr; } bool operator==(std::nullptr_t) const { return res_ == nullptr; } @@ -1363,30 +1210,19 @@ class Result { // Error Error error() const { return err_; } -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - // SSL Error - int ssl_error() const { return ssl_error_; } - // OpenSSL Error - unsigned long ssl_openssl_error() const { return ssl_openssl_error_; } -#endif - // Request Headers bool has_request_header(const std::string &key) const; std::string get_request_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - size_t get_request_header_value_u64(const std::string &key, size_t def = 0, - size_t id = 0) const; + uint64_t get_request_header_value_u64(const std::string &key, + uint64_t def = 0, size_t id = 0) const; size_t get_request_header_value_count(const std::string &key) const; private: std::unique_ptr res_; Error err_ = Error::Unknown; Headers request_headers_; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - int ssl_error_ = 0; - unsigned long ssl_openssl_error_ = 0; -#endif }; class ClientImpl { @@ -1403,86 +1239,185 @@ class ClientImpl { virtual bool is_valid() const; - // clang-format off - Result Get(const std::string &path, DownloadProgress progress = nullptr); - Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path); + Result Get(const std::string &path, const Headers &headers); + Result Get(const std::string &path, Progress progress); + Result Get(const std::string &path, const Headers &headers, + Progress progress); + Result Get(const std::string &path, ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver); + Result Get(const std::string &path, ContentReceiver content_receiver, + Progress progress); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress); + Result Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress); + + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ContentReceiver content_receiver, + Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress = nullptr); Result Head(const std::string &path); Result Head(const std::string &path, const Headers &headers); Result Post(const std::string &path); - Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Params ¶ms); - Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers); - Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress); + Result Post(const std::string &path, const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items); Result Put(const std::string &path); - Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Put(const std::string &path, size_t content_length, + ContentProvider content_provider, const std::string &content_type); + Result Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); Result Put(const std::string &path, const Params ¶ms); - Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers); - Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress); + Result Put(const std::string &path, const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items); Result Patch(const std::string &path); - Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Params ¶ms); - Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - - Result Delete(const std::string &path, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + + Result Delete(const std::string &path); + Result Delete(const std::string &path, const Headers &headers); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); Result Options(const std::string &path); Result Options(const std::string &path, const Headers &headers); - // clang-format on bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -1534,7 +1469,7 @@ class ClientImpl { void set_keep_alive(bool on); void set_follow_location(bool on); - void set_path_encode(bool on); + void set_url_encode(bool on); void set_compress(bool on); @@ -1566,7 +1501,6 @@ class ClientImpl { #endif void set_logger(Logger logger); - void set_error_logger(ErrorLogger error_logger); protected: struct Socket { @@ -1599,9 +1533,6 @@ class ClientImpl { void copy_settings(const ClientImpl &rhs); - void output_log(const Request &req, const Response &res) const; - void output_error_log(const Error &err, const Request *req) const; - // Socket endpoint information const std::string host_; const int port_; @@ -1650,7 +1581,7 @@ class ClientImpl { bool keep_alive_ = false; bool follow_location_ = false; - bool path_encode_ = true; + bool url_encode_ = true; int address_family_ = AF_UNSPEC; bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; @@ -1686,14 +1617,7 @@ class ClientImpl { std::function server_certificate_verifier_; #endif - mutable std::mutex logger_mutex_; Logger logger_; - ErrorLogger error_logger_; - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - int last_ssl_error_ = 0; - unsigned long last_openssl_error_ = 0; -#endif private: bool send_(Request &req, Response &res, Error &error); @@ -1705,11 +1629,6 @@ class ClientImpl { bool write_request(Stream &strm, Request &req, bool close_connection, Error &error); bool redirect(Request &req, Response &res, Error &error); - bool create_redirect_client(const std::string &scheme, - const std::string &host, int port, Request &req, - Response &res, const std::string &path, - const std::string &location, Error &error); - template void setup_redirect_client(ClientType &client); bool handle_request(Stream &strm, Request &req, Response &res, bool close_connection, Error &error); std::unique_ptr send_with_content_provider( @@ -1722,10 +1641,12 @@ class ClientImpl { const Headers &headers, const char *body, size_t content_length, ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const std::string &content_type, UploadProgress progress); + const std::string &content_type, Progress progress); ContentProviderWithoutLength get_multipart_content_provider( - const std::string &boundary, const UploadFormDataItems &items, - const FormDataProviderItems &provider_items) const; + const std::string &boundary, const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items) const; + + std::string adjust_host_string(const std::string &host) const; virtual bool process_socket(const Socket &socket, @@ -1757,86 +1678,185 @@ class Client { bool is_valid() const; - // clang-format off - Result Get(const std::string &path, DownloadProgress progress = nullptr); - Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path); + Result Get(const std::string &path, const Headers &headers); + Result Get(const std::string &path, Progress progress); + Result Get(const std::string &path, const Headers &headers, + Progress progress); + Result Get(const std::string &path, ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver); + Result Get(const std::string &path, ContentReceiver content_receiver, + Progress progress); + Result Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, Progress progress); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver); + Result Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, ContentReceiver content_receiver, + Progress progress); + Result Get(const std::string &path, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress); + + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ContentReceiver content_receiver, + Progress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, + const Headers &headers, ResponseHandler response_handler, + ContentReceiver content_receiver, Progress progress = nullptr); Result Head(const std::string &path); Result Head(const std::string &path, const Headers &headers); Result Post(const std::string &path); - Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Params ¶ms); - Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); Result Post(const std::string &path, const Headers &headers); - Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type); + Result Post(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress); + Result Post(const std::string &path, const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Post(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items); Result Put(const std::string &path); - Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type); + Result Put(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Put(const std::string &path, size_t content_length, + ContentProvider content_provider, const std::string &content_type); + Result Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); Result Put(const std::string &path, const Params ¶ms); - Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers); - Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, + const Params ¶ms, Progress progress); + Result Put(const std::string &path, const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, const std::string &boundary); + Result Put(const std::string &path, const Headers &headers, + const MultipartFormDataItems &items, + const MultipartFormDataProviderItems &provider_items); Result Patch(const std::string &path); - Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Params ¶ms); - Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers); - Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); - Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); - - Result Delete(const std::string &path, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); - Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type); + Result Patch(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); + Result Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + size_t content_length, ContentProvider content_provider, + const std::string &content_type); + Result Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type); + + Result Delete(const std::string &path); + Result Delete(const std::string &path, const Headers &headers); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type); + Result Delete(const std::string &path, const char *body, + size_t content_length, const std::string &content_type, + Progress progress); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, Progress progress); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type); + Result Delete(const std::string &path, const std::string &body, + const std::string &content_type, Progress progress); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type); + Result Delete(const std::string &path, const Headers &headers, + const std::string &body, const std::string &content_type, + Progress progress); Result Options(const std::string &path); Result Options(const std::string &path, const Headers &headers); - // clang-format on bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -1887,7 +1907,6 @@ class Client { void set_keep_alive(bool on); void set_follow_location(bool on); - void set_path_encode(bool on); void set_url_encode(bool on); void set_compress(bool on); @@ -1913,7 +1932,6 @@ class Client { #endif void set_logger(Logger logger); - void set_error_logger(ErrorLogger error_logger); // SSL #ifdef CPPHTTPLIB_OPENSSL_SUPPORT @@ -1959,17 +1977,11 @@ class SSLServer : public Server { void update_certs(X509 *cert, EVP_PKEY *private_key, X509_STORE *client_ca_cert_store = nullptr); - int ssl_last_error() const { return last_ssl_error_; } - private: bool process_and_close_socket(socket_t sock) override; - STACK_OF(X509_NAME) * extract_ca_names_from_x509_store(X509_STORE *store); - SSL_CTX *ctx_; std::mutex ctx_mutex_; - - int last_ssl_error_ = 0; }; class SSLClient final : public ClientImpl { @@ -2054,14 +2066,12 @@ template inline constexpr size_t str_len(const char (&)[N]) { } inline bool is_numeric(const std::string &str) { - return !str.empty() && - std::all_of(str.cbegin(), str.cend(), - [](unsigned char c) { return std::isdigit(c); }); + return !str.empty() && std::all_of(str.begin(), str.end(), ::isdigit); } -inline size_t get_header_value_u64(const Headers &headers, - const std::string &key, size_t def, - size_t id, bool &is_invalid_value) { +inline uint64_t get_header_value_u64(const Headers &headers, + const std::string &key, uint64_t def, + size_t id, bool &is_invalid_value) { is_invalid_value = false; auto rng = headers.equal_range(key); auto it = rng.first; @@ -2076,22 +2086,22 @@ inline size_t get_header_value_u64(const Headers &headers, return def; } -inline size_t get_header_value_u64(const Headers &headers, - const std::string &key, size_t def, - size_t id) { - auto dummy = false; +inline uint64_t get_header_value_u64(const Headers &headers, + const std::string &key, uint64_t def, + size_t id) { + bool dummy = false; return get_header_value_u64(headers, key, def, id, dummy); } } // namespace detail -inline size_t Request::get_header_value_u64(const std::string &key, size_t def, - size_t id) const { +inline uint64_t Request::get_header_value_u64(const std::string &key, + uint64_t def, size_t id) const { return detail::get_header_value_u64(headers, key, def, id); } -inline size_t Response::get_header_value_u64(const std::string &key, size_t def, - size_t id) const { +inline uint64_t Response::get_header_value_u64(const std::string &key, + uint64_t def, size_t id) const { return detail::get_header_value_u64(headers, key, def, id); } @@ -2248,7 +2258,6 @@ Server::set_idle_interval(const std::chrono::duration &duration) { inline std::string to_string(const Error error) { switch (error) { case Error::Success: return "Success (no error)"; - case Error::Unknown: return "Unknown"; case Error::Connection: return "Could not establish connection"; case Error::BindIPAddress: return "Failed to bind IP address"; case Error::Read: return "Failed to read connection"; @@ -2265,23 +2274,7 @@ inline std::string to_string(const Error error) { case Error::Compression: return "Compression failed"; case Error::ConnectionTimeout: return "Connection timed out"; case Error::ProxyConnection: return "Proxy connection failed"; - case Error::ResourceExhaustion: return "Resource exhaustion"; - case Error::TooManyFormDataFiles: return "Too many form data files"; - case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; - case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; - case Error::ExceedMaxSocketDescriptorCount: - return "Exceeded maximum socket descriptor count"; - case Error::InvalidRequestLine: return "Invalid request line"; - case Error::InvalidHTTPMethod: return "Invalid HTTP method"; - case Error::InvalidHTTPVersion: return "Invalid HTTP version"; - case Error::InvalidHeaders: return "Invalid headers"; - case Error::MultipartParsing: return "Multipart parsing failed"; - case Error::OpenFile: return "Failed to open file"; - case Error::Listen: return "Failed to listen on socket"; - case Error::GetSockName: return "Failed to get socket name"; - case Error::UnsupportedAddressFamily: return "Unsupported address family"; - case Error::HTTPParsing: return "HTTP parsing failed"; - case Error::InvalidRangeHeader: return "Invalid Range header"; + case Error::Unknown: return "Unknown"; default: break; } @@ -2294,9 +2287,9 @@ inline std::ostream &operator<<(std::ostream &os, const Error &obj) { return os; } -inline size_t Result::get_request_header_value_u64(const std::string &key, - size_t def, - size_t id) const { +inline uint64_t Result::get_request_header_value_u64(const std::string &key, + uint64_t def, + size_t id) const { return detail::get_header_value_u64(request_headers_, key, def, id); } @@ -2348,10 +2341,6 @@ Client::set_write_timeout(const std::chrono::duration &duration) { cli_->set_write_timeout(duration); } -inline void Client::set_max_timeout(time_t msec) { - cli_->set_max_timeout(msec); -} - template inline void Client::set_max_timeout(const std::chrono::duration &duration) { @@ -2367,20 +2356,6 @@ std::string hosted_at(const std::string &hostname); void hosted_at(const std::string &hostname, std::vector &addrs); -// JavaScript-style URL encoding/decoding functions -std::string encode_uri_component(const std::string &value); -std::string encode_uri(const std::string &value); -std::string decode_uri_component(const std::string &value); -std::string decode_uri(const std::string &value); - -// RFC 3986 compliant URL component encoding/decoding functions -std::string encode_path_component(const std::string &component); -std::string decode_path_component(const std::string &component); -std::string encode_query_component(const std::string &component, - bool space_as_plus = true); -std::string decode_query_component(const std::string &component, - bool plus_as_space = true); - std::string append_query_params(const std::string &path, const Params ¶ms); std::pair make_range_header(const Ranges &ranges); @@ -2422,6 +2397,10 @@ struct FileStat { int ret_ = -1; }; +std::string encode_query_param(const std::string &value); + +std::string decode_url(const std::string &s, bool convert_plus_to_space); + std::string trim_copy(const std::string &s); void divide( @@ -2471,9 +2450,6 @@ bool parse_multipart_boundary(const std::string &content_type, bool parse_range_header(const std::string &s, Ranges &ranges); -bool parse_accept_header(const std::string &s, - std::vector &content_types); - int close_socket(socket_t sock); ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags); @@ -2722,9343 +2698,7 @@ inline bool is_field_value(const std::string &s) { return is_field_content(s); } } // namespace detail -// ---------------------------------------------------------------------------- - -/* - * Implementation that will be part of the .cc file if split into .h + .cc. - */ - -namespace detail { - -inline bool is_hex(char c, int &v) { - if (0x20 <= c && isdigit(c)) { - v = c - '0'; - return true; - } else if ('A' <= c && c <= 'F') { - v = c - 'A' + 10; - return true; - } else if ('a' <= c && c <= 'f') { - v = c - 'a' + 10; - return true; - } - return false; -} - -inline bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, - int &val) { - if (i >= s.size()) { return false; } - - val = 0; - for (; cnt; i++, cnt--) { - if (!s[i]) { return false; } - auto v = 0; - if (is_hex(s[i], v)) { - val = val * 16 + v; - } else { - return false; - } - } - return true; -} - -inline std::string from_i_to_hex(size_t n) { - static const auto charset = "0123456789abcdef"; - std::string ret; - do { - ret = charset[n & 15] + ret; - n >>= 4; - } while (n > 0); - return ret; -} - -inline size_t to_utf8(int code, char *buff) { - if (code < 0x0080) { - buff[0] = static_cast(code & 0x7F); - return 1; - } else if (code < 0x0800) { - buff[0] = static_cast(0xC0 | ((code >> 6) & 0x1F)); - buff[1] = static_cast(0x80 | (code & 0x3F)); - return 2; - } else if (code < 0xD800) { - buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); - buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); - buff[2] = static_cast(0x80 | (code & 0x3F)); - return 3; - } else if (code < 0xE000) { // D800 - DFFF is invalid... - return 0; - } else if (code < 0x10000) { - buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); - buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); - buff[2] = static_cast(0x80 | (code & 0x3F)); - return 3; - } else if (code < 0x110000) { - buff[0] = static_cast(0xF0 | ((code >> 18) & 0x7)); - buff[1] = static_cast(0x80 | ((code >> 12) & 0x3F)); - buff[2] = static_cast(0x80 | ((code >> 6) & 0x3F)); - buff[3] = static_cast(0x80 | (code & 0x3F)); - return 4; - } - - // NOTREACHED - return 0; -} - -// NOTE: This code came up with the following stackoverflow post: -// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c -inline std::string base64_encode(const std::string &in) { - static const auto lookup = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - std::string out; - out.reserve(in.size()); - - auto val = 0; - auto valb = -6; - - for (auto c : in) { - val = (val << 8) + static_cast(c); - valb += 8; - while (valb >= 0) { - out.push_back(lookup[(val >> valb) & 0x3F]); - valb -= 6; - } - } - - if (valb > -6) { out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]); } - - while (out.size() % 4) { - out.push_back('='); - } - - return out; -} - -inline bool is_valid_path(const std::string &path) { - size_t level = 0; - size_t i = 0; - - // Skip slash - while (i < path.size() && path[i] == '/') { - i++; - } - - while (i < path.size()) { - // Read component - auto beg = i; - while (i < path.size() && path[i] != '/') { - if (path[i] == '\0') { - return false; - } else if (path[i] == '\\') { - return false; - } - i++; - } - - auto len = i - beg; - assert(len > 0); - - if (!path.compare(beg, len, ".")) { - ; - } else if (!path.compare(beg, len, "..")) { - if (level == 0) { return false; } - level--; - } else { - level++; - } - - // Skip slash - while (i < path.size() && path[i] == '/') { - i++; - } - } - - return true; -} - -inline FileStat::FileStat(const std::string &path) { -#if defined(_WIN32) - auto wpath = u8string_to_wstring(path.c_str()); - ret_ = _wstat(wpath.c_str(), &st_); -#else - ret_ = stat(path.c_str(), &st_); -#endif -} -inline bool FileStat::is_file() const { - return ret_ >= 0 && S_ISREG(st_.st_mode); -} -inline bool FileStat::is_dir() const { - return ret_ >= 0 && S_ISDIR(st_.st_mode); -} - -inline std::string encode_path(const std::string &s) { - std::string result; - result.reserve(s.size()); - - for (size_t i = 0; s[i]; i++) { - switch (s[i]) { - case ' ': result += "%20"; break; - case '+': result += "%2B"; break; - case '\r': result += "%0D"; break; - case '\n': result += "%0A"; break; - case '\'': result += "%27"; break; - case ',': result += "%2C"; break; - // case ':': result += "%3A"; break; // ok? probably... - case ';': result += "%3B"; break; - default: - auto c = static_cast(s[i]); - if (c >= 0x80) { - result += '%'; - char hex[4]; - auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); - assert(len == 2); - result.append(hex, static_cast(len)); - } else { - result += s[i]; - } - break; - } - } - - return result; -} - -inline std::string file_extension(const std::string &path) { - std::smatch m; - thread_local auto re = std::regex("\\.([a-zA-Z0-9]+)$"); - if (std::regex_search(path, m, re)) { return m[1].str(); } - return std::string(); -} - -inline bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } - -inline std::pair trim(const char *b, const char *e, size_t left, - size_t right) { - while (b + left < e && is_space_or_tab(b[left])) { - left++; - } - while (right > 0 && is_space_or_tab(b[right - 1])) { - right--; - } - return std::make_pair(left, right); -} - -inline std::string trim_copy(const std::string &s) { - auto r = trim(s.data(), s.data() + s.size(), 0, s.size()); - return s.substr(r.first, r.second - r.first); -} - -inline std::string trim_double_quotes_copy(const std::string &s) { - if (s.length() >= 2 && s.front() == '"' && s.back() == '"') { - return s.substr(1, s.size() - 2); - } - return s; -} - -inline void -divide(const char *data, std::size_t size, char d, - std::function - fn) { - const auto it = std::find(data, data + size, d); - const auto found = static_cast(it != data + size); - const auto lhs_data = data; - const auto lhs_size = static_cast(it - data); - const auto rhs_data = it + found; - const auto rhs_size = size - lhs_size - found; - - fn(lhs_data, lhs_size, rhs_data, rhs_size); -} - -inline void -divide(const std::string &str, char d, - std::function - fn) { - divide(str.data(), str.size(), d, std::move(fn)); -} - -inline void split(const char *b, const char *e, char d, - std::function fn) { - return split(b, e, d, (std::numeric_limits::max)(), std::move(fn)); -} - -inline void split(const char *b, const char *e, char d, size_t m, - std::function fn) { - size_t i = 0; - size_t beg = 0; - size_t count = 1; - - while (e ? (b + i < e) : (b[i] != '\0')) { - if (b[i] == d && count < m) { - auto r = trim(b, e, beg, i); - if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } - beg = i + 1; - count++; - } - i++; - } - - if (i) { - auto r = trim(b, e, beg, i); - if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } - } -} - -inline stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, - size_t fixed_buffer_size) - : strm_(strm), fixed_buffer_(fixed_buffer), - fixed_buffer_size_(fixed_buffer_size) {} - -inline const char *stream_line_reader::ptr() const { - if (growable_buffer_.empty()) { - return fixed_buffer_; - } else { - return growable_buffer_.data(); - } -} - -inline size_t stream_line_reader::size() const { - if (growable_buffer_.empty()) { - return fixed_buffer_used_size_; - } else { - return growable_buffer_.size(); - } -} - -inline bool stream_line_reader::end_with_crlf() const { - auto end = ptr() + size(); - return size() >= 2 && end[-2] == '\r' && end[-1] == '\n'; -} - -inline bool stream_line_reader::getline() { - fixed_buffer_used_size_ = 0; - growable_buffer_.clear(); - -#ifndef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR - char prev_byte = 0; -#endif - - for (size_t i = 0;; i++) { - if (size() >= CPPHTTPLIB_MAX_LINE_LENGTH) { - // Treat exceptionally long lines as an error to - // prevent infinite loops/memory exhaustion - return false; - } - char byte; - auto n = strm_.read(&byte, 1); - - if (n < 0) { - return false; - } else if (n == 0) { - if (i == 0) { - return false; - } else { - break; - } - } - - append(byte); - -#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR - if (byte == '\n') { break; } -#else - if (prev_byte == '\r' && byte == '\n') { break; } - prev_byte = byte; -#endif - } - - return true; -} - -inline void stream_line_reader::append(char c) { - if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) { - fixed_buffer_[fixed_buffer_used_size_++] = c; - fixed_buffer_[fixed_buffer_used_size_] = '\0'; - } else { - if (growable_buffer_.empty()) { - assert(fixed_buffer_[fixed_buffer_used_size_] == '\0'); - growable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_); - } - growable_buffer_ += c; - } -} - -inline mmap::mmap(const char *path) { open(path); } - -inline mmap::~mmap() { close(); } - -inline bool mmap::open(const char *path) { - close(); - -#if defined(_WIN32) - auto wpath = u8string_to_wstring(path); - if (wpath.empty()) { return false; } - - hFile_ = ::CreateFile2(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, - OPEN_EXISTING, NULL); - - if (hFile_ == INVALID_HANDLE_VALUE) { return false; } - - LARGE_INTEGER size{}; - if (!::GetFileSizeEx(hFile_, &size)) { return false; } - // If the following line doesn't compile due to QuadPart, update Windows SDK. - // See: - // https://github.com/yhirose/cpp-httplib/issues/1903#issuecomment-2316520721 - if (static_cast(size.QuadPart) > - (std::numeric_limits::max)()) { - // `size_t` might be 32-bits, on 32-bits Windows. - return false; - } - size_ = static_cast(size.QuadPart); - - hMapping_ = - ::CreateFileMappingFromApp(hFile_, NULL, PAGE_READONLY, size_, NULL); - - // Special treatment for an empty file... - if (hMapping_ == NULL && size_ == 0) { - close(); - is_open_empty_file = true; - return true; - } - - if (hMapping_ == NULL) { - close(); - return false; - } - - addr_ = ::MapViewOfFileFromApp(hMapping_, FILE_MAP_READ, 0, 0); - - if (addr_ == nullptr) { - close(); - return false; - } -#else - fd_ = ::open(path, O_RDONLY); - if (fd_ == -1) { return false; } - - struct stat sb; - if (fstat(fd_, &sb) == -1) { - close(); - return false; - } - size_ = static_cast(sb.st_size); - - addr_ = ::mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0); - - // Special treatment for an empty file... - if (addr_ == MAP_FAILED && size_ == 0) { - close(); - is_open_empty_file = true; - return false; - } -#endif - - return true; -} - -inline bool mmap::is_open() const { - return is_open_empty_file ? true : addr_ != nullptr; -} - -inline size_t mmap::size() const { return size_; } - -inline const char *mmap::data() const { - return is_open_empty_file ? "" : static_cast(addr_); -} - -inline void mmap::close() { -#if defined(_WIN32) - if (addr_) { - ::UnmapViewOfFile(addr_); - addr_ = nullptr; - } - - if (hMapping_) { - ::CloseHandle(hMapping_); - hMapping_ = NULL; - } - - if (hFile_ != INVALID_HANDLE_VALUE) { - ::CloseHandle(hFile_); - hFile_ = INVALID_HANDLE_VALUE; - } - - is_open_empty_file = false; -#else - if (addr_ != nullptr) { - munmap(addr_, size_); - addr_ = nullptr; - } - - if (fd_ != -1) { - ::close(fd_); - fd_ = -1; - } -#endif - size_ = 0; -} -inline int close_socket(socket_t sock) { -#ifdef _WIN32 - return closesocket(sock); -#else - return close(sock); -#endif -} - -template inline ssize_t handle_EINTR(T fn) { - ssize_t res = 0; - while (true) { - res = fn(); - if (res < 0 && errno == EINTR) { - std::this_thread::sleep_for(std::chrono::microseconds{1}); - continue; - } - break; - } - return res; -} - -inline ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags) { - return handle_EINTR([&]() { - return recv(sock, -#ifdef _WIN32 - static_cast(ptr), static_cast(size), -#else - ptr, size, -#endif - flags); - }); -} - -inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size, - int flags) { - return handle_EINTR([&]() { - return send(sock, -#ifdef _WIN32 - static_cast(ptr), static_cast(size), -#else - ptr, size, -#endif - flags); - }); -} - -inline int poll_wrapper(struct pollfd *fds, nfds_t nfds, int timeout) { -#ifdef _WIN32 - return ::WSAPoll(fds, nfds, timeout); -#else - return ::poll(fds, nfds, timeout); -#endif -} - -template -inline ssize_t select_impl(socket_t sock, time_t sec, time_t usec) { -#ifdef __APPLE__ - if (sock >= FD_SETSIZE) { return -1; } - - fd_set fds, *rfds, *wfds; - FD_ZERO(&fds); - FD_SET(sock, &fds); - rfds = (Read ? &fds : nullptr); - wfds = (Read ? nullptr : &fds); - - timeval tv; - tv.tv_sec = static_cast(sec); - tv.tv_usec = static_cast(usec); - - return handle_EINTR([&]() { - return select(static_cast(sock + 1), rfds, wfds, nullptr, &tv); - }); -#else - struct pollfd pfd; - pfd.fd = sock; - pfd.events = (Read ? POLLIN : POLLOUT); - - auto timeout = static_cast(sec * 1000 + usec / 1000); - - return handle_EINTR([&]() { return poll_wrapper(&pfd, 1, timeout); }); -#endif -} - -inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { - return select_impl(sock, sec, usec); -} - -inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) { - return select_impl(sock, sec, usec); -} - -inline Error wait_until_socket_is_ready(socket_t sock, time_t sec, - time_t usec) { -#ifdef __APPLE__ - if (sock >= FD_SETSIZE) { return Error::Connection; } - - fd_set fdsr, fdsw; - FD_ZERO(&fdsr); - FD_ZERO(&fdsw); - FD_SET(sock, &fdsr); - FD_SET(sock, &fdsw); - - timeval tv; - tv.tv_sec = static_cast(sec); - tv.tv_usec = static_cast(usec); - - auto ret = handle_EINTR([&]() { - return select(static_cast(sock + 1), &fdsr, &fdsw, nullptr, &tv); - }); - - if (ret == 0) { return Error::ConnectionTimeout; } - - if (ret > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) { - auto error = 0; - socklen_t len = sizeof(error); - auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, - reinterpret_cast(&error), &len); - auto successful = res >= 0 && !error; - return successful ? Error::Success : Error::Connection; - } - - return Error::Connection; -#else - struct pollfd pfd_read; - pfd_read.fd = sock; - pfd_read.events = POLLIN | POLLOUT; - - auto timeout = static_cast(sec * 1000 + usec / 1000); - - auto poll_res = - handle_EINTR([&]() { return poll_wrapper(&pfd_read, 1, timeout); }); - - if (poll_res == 0) { return Error::ConnectionTimeout; } - - if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) { - auto error = 0; - socklen_t len = sizeof(error); - auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, - reinterpret_cast(&error), &len); - auto successful = res >= 0 && !error; - return successful ? Error::Success : Error::Connection; - } - - return Error::Connection; -#endif -} - -inline bool is_socket_alive(socket_t sock) { - const auto val = detail::select_read(sock, 0, 0); - if (val == 0) { - return true; - } else if (val < 0 && errno == EBADF) { - return false; - } - char buf[1]; - return detail::read_socket(sock, &buf[0], sizeof(buf), MSG_PEEK) > 0; -} - -class SocketStream final : public Stream { -public: - SocketStream(socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, - time_t write_timeout_sec, time_t write_timeout_usec, - time_t max_timeout_msec = 0, - std::chrono::time_point start_time = - (std::chrono::steady_clock::time_point::min)()); - ~SocketStream() override; - - bool is_readable() const override; - bool wait_readable() const override; - bool wait_writable() const override; - ssize_t read(char *ptr, size_t size) override; - ssize_t write(const char *ptr, size_t size) override; - void get_remote_ip_and_port(std::string &ip, int &port) const override; - void get_local_ip_and_port(std::string &ip, int &port) const override; - socket_t socket() const override; - time_t duration() const override; - -private: - socket_t sock_; - time_t read_timeout_sec_; - time_t read_timeout_usec_; - time_t write_timeout_sec_; - time_t write_timeout_usec_; - time_t max_timeout_msec_; - const std::chrono::time_point start_time_; - - std::vector read_buff_; - size_t read_buff_off_ = 0; - size_t read_buff_content_size_ = 0; - - static const size_t read_buff_size_ = 1024l * 4; -}; - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -class SSLSocketStream final : public Stream { -public: - SSLSocketStream( - socket_t sock, SSL *ssl, time_t read_timeout_sec, - time_t read_timeout_usec, time_t write_timeout_sec, - time_t write_timeout_usec, time_t max_timeout_msec = 0, - std::chrono::time_point start_time = - (std::chrono::steady_clock::time_point::min)()); - ~SSLSocketStream() override; - - bool is_readable() const override; - bool wait_readable() const override; - bool wait_writable() const override; - ssize_t read(char *ptr, size_t size) override; - ssize_t write(const char *ptr, size_t size) override; - void get_remote_ip_and_port(std::string &ip, int &port) const override; - void get_local_ip_and_port(std::string &ip, int &port) const override; - socket_t socket() const override; - time_t duration() const override; - -private: - socket_t sock_; - SSL *ssl_; - time_t read_timeout_sec_; - time_t read_timeout_usec_; - time_t write_timeout_sec_; - time_t write_timeout_usec_; - time_t max_timeout_msec_; - const std::chrono::time_point start_time_; -}; -#endif - -inline bool keep_alive(const std::atomic &svr_sock, socket_t sock, - time_t keep_alive_timeout_sec) { - using namespace std::chrono; - - const auto interval_usec = - CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND; - - // Avoid expensive `steady_clock::now()` call for the first time - if (select_read(sock, 0, interval_usec) > 0) { return true; } - - const auto start = steady_clock::now() - microseconds{interval_usec}; - const auto timeout = seconds{keep_alive_timeout_sec}; - - while (true) { - if (svr_sock == INVALID_SOCKET) { - break; // Server socket is closed - } - - auto val = select_read(sock, 0, interval_usec); - if (val < 0) { - break; // Ssocket error - } else if (val == 0) { - if (steady_clock::now() - start > timeout) { - break; // Timeout - } - } else { - return true; // Ready for read - } - } - - return false; -} - -template -inline bool -process_server_socket_core(const std::atomic &svr_sock, socket_t sock, - size_t keep_alive_max_count, - time_t keep_alive_timeout_sec, T callback) { - assert(keep_alive_max_count > 0); - auto ret = false; - auto count = keep_alive_max_count; - while (count > 0 && keep_alive(svr_sock, sock, keep_alive_timeout_sec)) { - auto close_connection = count == 1; - auto connection_closed = false; - ret = callback(close_connection, connection_closed); - if (!ret || connection_closed) { break; } - count--; - } - return ret; -} - -template -inline bool -process_server_socket(const std::atomic &svr_sock, socket_t sock, - size_t keep_alive_max_count, - time_t keep_alive_timeout_sec, time_t read_timeout_sec, - time_t read_timeout_usec, time_t write_timeout_sec, - time_t write_timeout_usec, T callback) { - return process_server_socket_core( - svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, - [&](bool close_connection, bool &connection_closed) { - SocketStream strm(sock, read_timeout_sec, read_timeout_usec, - write_timeout_sec, write_timeout_usec); - return callback(strm, close_connection, connection_closed); - }); -} - -inline bool process_client_socket( - socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, - time_t write_timeout_sec, time_t write_timeout_usec, - time_t max_timeout_msec, - std::chrono::time_point start_time, - std::function callback) { - SocketStream strm(sock, read_timeout_sec, read_timeout_usec, - write_timeout_sec, write_timeout_usec, max_timeout_msec, - start_time); - return callback(strm); -} - -inline int shutdown_socket(socket_t sock) { -#ifdef _WIN32 - return shutdown(sock, SD_BOTH); -#else - return shutdown(sock, SHUT_RDWR); -#endif -} - -inline std::string escape_abstract_namespace_unix_domain(const std::string &s) { - if (s.size() > 1 && s[0] == '\0') { - auto ret = s; - ret[0] = '@'; - return ret; - } - return s; -} - -inline std::string -unescape_abstract_namespace_unix_domain(const std::string &s) { - if (s.size() > 1 && s[0] == '@') { - auto ret = s; - ret[0] = '\0'; - return ret; - } - return s; -} - -inline int getaddrinfo_with_timeout(const char *node, const char *service, - const struct addrinfo *hints, - struct addrinfo **res, time_t timeout_sec) { -#ifdef CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO - if (timeout_sec <= 0) { - // No timeout specified, use standard getaddrinfo - return getaddrinfo(node, service, hints, res); - } - -#ifdef _WIN32 - // Windows-specific implementation using GetAddrInfoEx with overlapped I/O - OVERLAPPED overlapped = {0}; - HANDLE event = CreateEventW(nullptr, TRUE, FALSE, nullptr); - if (!event) { return EAI_FAIL; } - - overlapped.hEvent = event; - - PADDRINFOEXW result_addrinfo = nullptr; - HANDLE cancel_handle = nullptr; - - ADDRINFOEXW hints_ex = {0}; - if (hints) { - hints_ex.ai_flags = hints->ai_flags; - hints_ex.ai_family = hints->ai_family; - hints_ex.ai_socktype = hints->ai_socktype; - hints_ex.ai_protocol = hints->ai_protocol; - } - - auto wnode = u8string_to_wstring(node); - auto wservice = u8string_to_wstring(service); - - auto ret = ::GetAddrInfoExW(wnode.data(), wservice.data(), NS_DNS, nullptr, - hints ? &hints_ex : nullptr, &result_addrinfo, - nullptr, &overlapped, nullptr, &cancel_handle); - - if (ret == WSA_IO_PENDING) { - auto wait_result = - ::WaitForSingleObject(event, static_cast(timeout_sec * 1000)); - if (wait_result == WAIT_TIMEOUT) { - if (cancel_handle) { ::GetAddrInfoExCancel(&cancel_handle); } - ::CloseHandle(event); - return EAI_AGAIN; - } - - DWORD bytes_returned; - if (!::GetOverlappedResult((HANDLE)INVALID_SOCKET, &overlapped, - &bytes_returned, FALSE)) { - ::CloseHandle(event); - return ::WSAGetLastError(); - } - } - - ::CloseHandle(event); - - if (ret == NO_ERROR || ret == WSA_IO_PENDING) { - *res = reinterpret_cast(result_addrinfo); - return 0; - } - - return ret; -#elif TARGET_OS_MAC - // macOS implementation using CFHost API for asynchronous DNS resolution - CFStringRef hostname_ref = CFStringCreateWithCString( - kCFAllocatorDefault, node, kCFStringEncodingUTF8); - if (!hostname_ref) { return EAI_MEMORY; } - - CFHostRef host_ref = CFHostCreateWithName(kCFAllocatorDefault, hostname_ref); - CFRelease(hostname_ref); - if (!host_ref) { return EAI_MEMORY; } - - // Set up context for callback - struct CFHostContext { - bool completed = false; - bool success = false; - CFArrayRef addresses = nullptr; - std::mutex mutex; - std::condition_variable cv; - } context; - - CFHostClientContext client_context; - memset(&client_context, 0, sizeof(client_context)); - client_context.info = &context; - - // Set callback - auto callback = [](CFHostRef theHost, CFHostInfoType /*typeInfo*/, - const CFStreamError *error, void *info) { - auto ctx = static_cast(info); - std::lock_guard lock(ctx->mutex); - - if (error && error->error != 0) { - ctx->success = false; - } else { - Boolean hasBeenResolved; - ctx->addresses = CFHostGetAddressing(theHost, &hasBeenResolved); - if (ctx->addresses && hasBeenResolved) { - CFRetain(ctx->addresses); - ctx->success = true; - } else { - ctx->success = false; - } - } - ctx->completed = true; - ctx->cv.notify_one(); - }; - - if (!CFHostSetClient(host_ref, callback, &client_context)) { - CFRelease(host_ref); - return EAI_SYSTEM; - } - - // Schedule on run loop - CFRunLoopRef run_loop = CFRunLoopGetCurrent(); - CFHostScheduleWithRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); - - // Start resolution - CFStreamError stream_error; - if (!CFHostStartInfoResolution(host_ref, kCFHostAddresses, &stream_error)) { - CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); - CFRelease(host_ref); - return EAI_FAIL; - } - - // Wait for completion with timeout - auto timeout_time = - std::chrono::steady_clock::now() + std::chrono::seconds(timeout_sec); - bool timed_out = false; - - { - std::unique_lock lock(context.mutex); - - while (!context.completed) { - auto now = std::chrono::steady_clock::now(); - if (now >= timeout_time) { - timed_out = true; - break; - } - - // Run the runloop for a short time - lock.unlock(); - CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, true); - lock.lock(); - } - } - - // Clean up - CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); - CFHostSetClient(host_ref, nullptr, nullptr); - - if (timed_out || !context.completed) { - CFHostCancelInfoResolution(host_ref, kCFHostAddresses); - CFRelease(host_ref); - return EAI_AGAIN; - } - - if (!context.success || !context.addresses) { - CFRelease(host_ref); - return EAI_NODATA; - } - - // Convert CFArray to addrinfo - CFIndex count = CFArrayGetCount(context.addresses); - if (count == 0) { - CFRelease(context.addresses); - CFRelease(host_ref); - return EAI_NODATA; - } - - struct addrinfo *result_addrinfo = nullptr; - struct addrinfo **current = &result_addrinfo; - - for (CFIndex i = 0; i < count; i++) { - CFDataRef addr_data = - static_cast(CFArrayGetValueAtIndex(context.addresses, i)); - if (!addr_data) continue; - - const struct sockaddr *sockaddr_ptr = - reinterpret_cast(CFDataGetBytePtr(addr_data)); - socklen_t sockaddr_len = static_cast(CFDataGetLength(addr_data)); - - // Allocate addrinfo structure - *current = static_cast(malloc(sizeof(struct addrinfo))); - if (!*current) { - freeaddrinfo(result_addrinfo); - CFRelease(context.addresses); - CFRelease(host_ref); - return EAI_MEMORY; - } - - memset(*current, 0, sizeof(struct addrinfo)); - - // Set up addrinfo fields - (*current)->ai_family = sockaddr_ptr->sa_family; - (*current)->ai_socktype = hints ? hints->ai_socktype : SOCK_STREAM; - (*current)->ai_protocol = hints ? hints->ai_protocol : IPPROTO_TCP; - (*current)->ai_addrlen = sockaddr_len; - - // Copy sockaddr - (*current)->ai_addr = static_cast(malloc(sockaddr_len)); - if (!(*current)->ai_addr) { - freeaddrinfo(result_addrinfo); - CFRelease(context.addresses); - CFRelease(host_ref); - return EAI_MEMORY; - } - memcpy((*current)->ai_addr, sockaddr_ptr, sockaddr_len); - - // Set port if service is specified - if (service && strlen(service) > 0) { - int port = atoi(service); - if (port > 0) { - if (sockaddr_ptr->sa_family == AF_INET) { - reinterpret_cast((*current)->ai_addr) - ->sin_port = htons(static_cast(port)); - } else if (sockaddr_ptr->sa_family == AF_INET6) { - reinterpret_cast((*current)->ai_addr) - ->sin6_port = htons(static_cast(port)); - } - } - } - - current = &((*current)->ai_next); - } - - CFRelease(context.addresses); - CFRelease(host_ref); - - *res = result_addrinfo; - return 0; -#elif defined(_GNU_SOURCE) && defined(__GLIBC__) && \ - (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) - // Linux implementation using getaddrinfo_a for asynchronous DNS resolution - struct gaicb request; - struct gaicb *requests[1] = {&request}; - struct sigevent sevp; - struct timespec timeout; - - // Initialize the request structure - memset(&request, 0, sizeof(request)); - request.ar_name = node; - request.ar_service = service; - request.ar_request = hints; - - // Set up timeout - timeout.tv_sec = timeout_sec; - timeout.tv_nsec = 0; - - // Initialize sigevent structure (not used, but required) - memset(&sevp, 0, sizeof(sevp)); - sevp.sigev_notify = SIGEV_NONE; - - // Start asynchronous resolution - int start_result = getaddrinfo_a(GAI_NOWAIT, requests, 1, &sevp); - if (start_result != 0) { return start_result; } - - // Wait for completion with timeout - int wait_result = - gai_suspend((const struct gaicb *const *)requests, 1, &timeout); - - if (wait_result == 0 || wait_result == EAI_ALLDONE) { - // Completed successfully, get the result - int gai_result = gai_error(&request); - if (gai_result == 0) { - *res = request.ar_result; - return 0; - } else { - // Clean up on error - if (request.ar_result) { freeaddrinfo(request.ar_result); } - return gai_result; - } - } else if (wait_result == EAI_AGAIN) { - // Timeout occurred, cancel the request - gai_cancel(&request); - return EAI_AGAIN; - } else { - // Other error occurred - gai_cancel(&request); - return wait_result; - } -#else - // Fallback implementation using thread-based timeout for other Unix systems - - struct GetAddrInfoState { - std::mutex mutex; - std::condition_variable result_cv; - bool completed = false; - int result = EAI_SYSTEM; - std::string node = node; - std::string service = service; - struct addrinfo hints = hints; - struct addrinfo *info = nullptr; - }; - - // Allocate on the heap, so the resolver thread can keep using the data. - auto state = std::make_shared(); - - std::thread resolve_thread([=]() { - auto thread_result = getaddrinfo( - state->node.c_str(), state->service.c_str(), hints, &state->info); - - std::lock_guard lock(state->mutex); - state->result = thread_result; - state->completed = true; - state->result_cv.notify_one(); - }); - - // Wait for completion or timeout - std::unique_lock lock(state->mutex); - auto finished = - state->result_cv.wait_for(lock, std::chrono::seconds(timeout_sec), - [&] { return state->completed; }); - - if (finished) { - // Operation completed within timeout - resolve_thread.join(); - *res = state->info; - return state->result; - } else { - // Timeout occurred - resolve_thread.detach(); // Let the thread finish in background - return EAI_AGAIN; // Return timeout error - } -#endif -#else - (void)(timeout_sec); // Unused parameter for non-blocking getaddrinfo - return getaddrinfo(node, service, hints, res); -#endif -} - -template -socket_t create_socket(const std::string &host, const std::string &ip, int port, - int address_family, int socket_flags, bool tcp_nodelay, - bool ipv6_v6only, SocketOptions socket_options, - BindOrConnect bind_or_connect, time_t timeout_sec = 0) { - // Get address info - const char *node = nullptr; - struct addrinfo hints; - struct addrinfo *result; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = IPPROTO_IP; - - if (!ip.empty()) { - node = ip.c_str(); - // Ask getaddrinfo to convert IP in c-string to address - hints.ai_family = AF_UNSPEC; - hints.ai_flags = AI_NUMERICHOST; - } else { - if (!host.empty()) { node = host.c_str(); } - hints.ai_family = address_family; - hints.ai_flags = socket_flags; - } - -#if !defined(_WIN32) || defined(CPPHTTPLIB_HAVE_AFUNIX_H) - if (hints.ai_family == AF_UNIX) { - const auto addrlen = host.length(); - if (addrlen > sizeof(sockaddr_un::sun_path)) { return INVALID_SOCKET; } - -#ifdef SOCK_CLOEXEC - auto sock = socket(hints.ai_family, hints.ai_socktype | SOCK_CLOEXEC, - hints.ai_protocol); -#else - auto sock = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol); -#endif - - if (sock != INVALID_SOCKET) { - sockaddr_un addr{}; - addr.sun_family = AF_UNIX; - - auto unescaped_host = unescape_abstract_namespace_unix_domain(host); - std::copy(unescaped_host.begin(), unescaped_host.end(), addr.sun_path); - - hints.ai_addr = reinterpret_cast(&addr); - hints.ai_addrlen = static_cast( - sizeof(addr) - sizeof(addr.sun_path) + addrlen); - -#ifndef SOCK_CLOEXEC -#ifndef _WIN32 - fcntl(sock, F_SETFD, FD_CLOEXEC); -#endif -#endif - - if (socket_options) { socket_options(sock); } - -#ifdef _WIN32 - // Setting SO_REUSEADDR seems not to work well with AF_UNIX on windows, so - // remove the option. - detail::set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 0); -#endif - - bool dummy; - if (!bind_or_connect(sock, hints, dummy)) { - close_socket(sock); - sock = INVALID_SOCKET; - } - } - return sock; - } -#endif - - auto service = std::to_string(port); - - if (getaddrinfo_with_timeout(node, service.c_str(), &hints, &result, - timeout_sec)) { -#if defined __linux__ && !defined __ANDROID__ - res_init(); -#endif - return INVALID_SOCKET; - } - auto se = detail::scope_exit([&] { freeaddrinfo(result); }); - - for (auto rp = result; rp; rp = rp->ai_next) { - // Create a socket -#ifdef _WIN32 - auto sock = - WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, - WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); - /** - * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1 - * and above the socket creation fails on older Windows Systems. - * - * Let's try to create a socket the old way in this case. - * - * Reference: - * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa - * - * WSA_FLAG_NO_HANDLE_INHERIT: - * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with - * SP1, and later - * - */ - if (sock == INVALID_SOCKET) { - sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); - } -#else - -#ifdef SOCK_CLOEXEC - auto sock = - socket(rp->ai_family, rp->ai_socktype | SOCK_CLOEXEC, rp->ai_protocol); -#else - auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); -#endif - -#endif - if (sock == INVALID_SOCKET) { continue; } - -#if !defined _WIN32 && !defined SOCK_CLOEXEC - if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { - close_socket(sock); - continue; - } -#endif - - if (tcp_nodelay) { set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); } - - if (rp->ai_family == AF_INET6) { - set_socket_opt(sock, IPPROTO_IPV6, IPV6_V6ONLY, ipv6_v6only ? 1 : 0); - } - - if (socket_options) { socket_options(sock); } - - // bind or connect - auto quit = false; - if (bind_or_connect(sock, *rp, quit)) { return sock; } - - close_socket(sock); - - if (quit) { break; } - } - - return INVALID_SOCKET; -} - -inline void set_nonblocking(socket_t sock, bool nonblocking) { -#ifdef _WIN32 - auto flags = nonblocking ? 1UL : 0UL; - ioctlsocket(sock, FIONBIO, &flags); -#else - auto flags = fcntl(sock, F_GETFL, 0); - fcntl(sock, F_SETFL, - nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK))); -#endif -} - -inline bool is_connection_error() { -#ifdef _WIN32 - return WSAGetLastError() != WSAEWOULDBLOCK; -#else - return errno != EINPROGRESS; -#endif -} - -inline bool bind_ip_address(socket_t sock, const std::string &host) { - struct addrinfo hints; - struct addrinfo *result; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = 0; - - if (getaddrinfo_with_timeout(host.c_str(), "0", &hints, &result, 0)) { - return false; - } - - auto se = detail::scope_exit([&] { freeaddrinfo(result); }); - - auto ret = false; - for (auto rp = result; rp; rp = rp->ai_next) { - const auto &ai = *rp; - if (!::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { - ret = true; - break; - } - } - - return ret; -} - -#if !defined _WIN32 && !defined ANDROID && !defined _AIX && !defined __MVS__ -#define USE_IF2IP -#endif - -#ifdef USE_IF2IP -inline std::string if2ip(int address_family, const std::string &ifn) { - struct ifaddrs *ifap; - getifaddrs(&ifap); - auto se = detail::scope_exit([&] { freeifaddrs(ifap); }); - - std::string addr_candidate; - for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) { - if (ifa->ifa_addr && ifn == ifa->ifa_name && - (AF_UNSPEC == address_family || - ifa->ifa_addr->sa_family == address_family)) { - if (ifa->ifa_addr->sa_family == AF_INET) { - auto sa = reinterpret_cast(ifa->ifa_addr); - char buf[INET_ADDRSTRLEN]; - if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) { - return std::string(buf, INET_ADDRSTRLEN); - } - } else if (ifa->ifa_addr->sa_family == AF_INET6) { - auto sa = reinterpret_cast(ifa->ifa_addr); - if (!IN6_IS_ADDR_LINKLOCAL(&sa->sin6_addr)) { - char buf[INET6_ADDRSTRLEN] = {}; - if (inet_ntop(AF_INET6, &sa->sin6_addr, buf, INET6_ADDRSTRLEN)) { - // equivalent to mac's IN6_IS_ADDR_UNIQUE_LOCAL - auto s6_addr_head = sa->sin6_addr.s6_addr[0]; - if (s6_addr_head == 0xfc || s6_addr_head == 0xfd) { - addr_candidate = std::string(buf, INET6_ADDRSTRLEN); - } else { - return std::string(buf, INET6_ADDRSTRLEN); - } - } - } - } - } - } - return addr_candidate; -} -#endif - -inline socket_t create_client_socket( - const std::string &host, const std::string &ip, int port, - int address_family, bool tcp_nodelay, bool ipv6_v6only, - SocketOptions socket_options, time_t connection_timeout_sec, - time_t connection_timeout_usec, time_t read_timeout_sec, - time_t read_timeout_usec, time_t write_timeout_sec, - time_t write_timeout_usec, const std::string &intf, Error &error) { - auto sock = create_socket( - host, ip, port, address_family, 0, tcp_nodelay, ipv6_v6only, - std::move(socket_options), - [&](socket_t sock2, struct addrinfo &ai, bool &quit) -> bool { - if (!intf.empty()) { -#ifdef USE_IF2IP - auto ip_from_if = if2ip(address_family, intf); - if (ip_from_if.empty()) { ip_from_if = intf; } - if (!bind_ip_address(sock2, ip_from_if)) { - error = Error::BindIPAddress; - return false; - } -#endif - } - - set_nonblocking(sock2, true); - - auto ret = - ::connect(sock2, ai.ai_addr, static_cast(ai.ai_addrlen)); - - if (ret < 0) { - if (is_connection_error()) { - error = Error::Connection; - return false; - } - error = wait_until_socket_is_ready(sock2, connection_timeout_sec, - connection_timeout_usec); - if (error != Error::Success) { - if (error == Error::ConnectionTimeout) { quit = true; } - return false; - } - } - - set_nonblocking(sock2, false); - set_socket_opt_time(sock2, SOL_SOCKET, SO_RCVTIMEO, read_timeout_sec, - read_timeout_usec); - set_socket_opt_time(sock2, SOL_SOCKET, SO_SNDTIMEO, write_timeout_sec, - write_timeout_usec); - - error = Error::Success; - return true; - }, - connection_timeout_sec); // Pass DNS timeout - - if (sock != INVALID_SOCKET) { - error = Error::Success; - } else { - if (error == Error::Success) { error = Error::Connection; } - } - - return sock; -} - -inline bool get_ip_and_port(const struct sockaddr_storage &addr, - socklen_t addr_len, std::string &ip, int &port) { - if (addr.ss_family == AF_INET) { - port = ntohs(reinterpret_cast(&addr)->sin_port); - } else if (addr.ss_family == AF_INET6) { - port = - ntohs(reinterpret_cast(&addr)->sin6_port); - } else { - return false; - } - - std::array ipstr{}; - if (getnameinfo(reinterpret_cast(&addr), addr_len, - ipstr.data(), static_cast(ipstr.size()), nullptr, - 0, NI_NUMERICHOST)) { - return false; - } - - ip = ipstr.data(); - return true; -} - -inline void get_local_ip_and_port(socket_t sock, std::string &ip, int &port) { - struct sockaddr_storage addr; - socklen_t addr_len = sizeof(addr); - if (!getsockname(sock, reinterpret_cast(&addr), - &addr_len)) { - get_ip_and_port(addr, addr_len, ip, port); - } -} - -inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { - struct sockaddr_storage addr; - socklen_t addr_len = sizeof(addr); - - if (!getpeername(sock, reinterpret_cast(&addr), - &addr_len)) { -#ifndef _WIN32 - if (addr.ss_family == AF_UNIX) { -#if defined(__linux__) - struct ucred ucred; - socklen_t len = sizeof(ucred); - if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) { - port = ucred.pid; - } -#elif defined(SOL_LOCAL) && defined(SO_PEERPID) - pid_t pid; - socklen_t len = sizeof(pid); - if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) { - port = pid; - } -#endif - return; - } -#endif - get_ip_and_port(addr, addr_len, ip, port); - } -} - -inline constexpr unsigned int str2tag_core(const char *s, size_t l, - unsigned int h) { - return (l == 0) - ? h - : str2tag_core( - s + 1, l - 1, - // Unsets the 6 high bits of h, therefore no overflow happens - (((std::numeric_limits::max)() >> 6) & - h * 33) ^ - static_cast(*s)); -} - -inline unsigned int str2tag(const std::string &s) { - return str2tag_core(s.data(), s.size(), 0); -} - -namespace udl { - -inline constexpr unsigned int operator""_t(const char *s, size_t l) { - return str2tag_core(s, l, 0); -} - -} // namespace udl - -inline std::string -find_content_type(const std::string &path, - const std::map &user_data, - const std::string &default_content_type) { - auto ext = file_extension(path); - - auto it = user_data.find(ext); - if (it != user_data.end()) { return it->second; } - - using udl::operator""_t; - - switch (str2tag(ext)) { - default: return default_content_type; - - case "css"_t: return "text/css"; - case "csv"_t: return "text/csv"; - case "htm"_t: - case "html"_t: return "text/html"; - case "js"_t: - case "mjs"_t: return "text/javascript"; - case "txt"_t: return "text/plain"; - case "vtt"_t: return "text/vtt"; - - case "apng"_t: return "image/apng"; - case "avif"_t: return "image/avif"; - case "bmp"_t: return "image/bmp"; - case "gif"_t: return "image/gif"; - case "png"_t: return "image/png"; - case "svg"_t: return "image/svg+xml"; - case "webp"_t: return "image/webp"; - case "ico"_t: return "image/x-icon"; - case "tif"_t: return "image/tiff"; - case "tiff"_t: return "image/tiff"; - case "jpg"_t: - case "jpeg"_t: return "image/jpeg"; - - case "mp4"_t: return "video/mp4"; - case "mpeg"_t: return "video/mpeg"; - case "webm"_t: return "video/webm"; - - case "mp3"_t: return "audio/mp3"; - case "mpga"_t: return "audio/mpeg"; - case "weba"_t: return "audio/webm"; - case "wav"_t: return "audio/wave"; - - case "otf"_t: return "font/otf"; - case "ttf"_t: return "font/ttf"; - case "woff"_t: return "font/woff"; - case "woff2"_t: return "font/woff2"; - - case "7z"_t: return "application/x-7z-compressed"; - case "atom"_t: return "application/atom+xml"; - case "pdf"_t: return "application/pdf"; - case "json"_t: return "application/json"; - case "rss"_t: return "application/rss+xml"; - case "tar"_t: return "application/x-tar"; - case "xht"_t: - case "xhtml"_t: return "application/xhtml+xml"; - case "xslt"_t: return "application/xslt+xml"; - case "xml"_t: return "application/xml"; - case "gz"_t: return "application/gzip"; - case "zip"_t: return "application/zip"; - case "wasm"_t: return "application/wasm"; - } -} - -inline bool can_compress_content_type(const std::string &content_type) { - using udl::operator""_t; - - auto tag = str2tag(content_type); - - switch (tag) { - case "image/svg+xml"_t: - case "application/javascript"_t: - case "application/json"_t: - case "application/xml"_t: - case "application/protobuf"_t: - case "application/xhtml+xml"_t: return true; - - case "text/event-stream"_t: return false; - - default: return !content_type.rfind("text/", 0); - } -} - -inline EncodingType encoding_type(const Request &req, const Response &res) { - auto ret = - detail::can_compress_content_type(res.get_header_value("Content-Type")); - if (!ret) { return EncodingType::None; } - - const auto &s = req.get_header_value("Accept-Encoding"); - (void)(s); - -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - // TODO: 'Accept-Encoding' has br, not br;q=0 - ret = s.find("br") != std::string::npos; - if (ret) { return EncodingType::Brotli; } -#endif - -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - // TODO: 'Accept-Encoding' has gzip, not gzip;q=0 - ret = s.find("gzip") != std::string::npos; - if (ret) { return EncodingType::Gzip; } -#endif - -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - // TODO: 'Accept-Encoding' has zstd, not zstd;q=0 - ret = s.find("zstd") != std::string::npos; - if (ret) { return EncodingType::Zstd; } -#endif - - return EncodingType::None; -} - -inline bool nocompressor::compress(const char *data, size_t data_length, - bool /*last*/, Callback callback) { - if (!data_length) { return true; } - return callback(data, data_length); -} - -#ifdef CPPHTTPLIB_ZLIB_SUPPORT -inline gzip_compressor::gzip_compressor() { - std::memset(&strm_, 0, sizeof(strm_)); - strm_.zalloc = Z_NULL; - strm_.zfree = Z_NULL; - strm_.opaque = Z_NULL; - - is_valid_ = deflateInit2(&strm_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, - Z_DEFAULT_STRATEGY) == Z_OK; -} - -inline gzip_compressor::~gzip_compressor() { deflateEnd(&strm_); } - -inline bool gzip_compressor::compress(const char *data, size_t data_length, - bool last, Callback callback) { - assert(is_valid_); - - do { - constexpr size_t max_avail_in = - (std::numeric_limits::max)(); - - strm_.avail_in = static_cast( - (std::min)(data_length, max_avail_in)); - strm_.next_in = const_cast(reinterpret_cast(data)); - - data_length -= strm_.avail_in; - data += strm_.avail_in; - - auto flush = (last && data_length == 0) ? Z_FINISH : Z_NO_FLUSH; - auto ret = Z_OK; - - std::array buff{}; - do { - strm_.avail_out = static_cast(buff.size()); - strm_.next_out = reinterpret_cast(buff.data()); - - ret = deflate(&strm_, flush); - if (ret == Z_STREAM_ERROR) { return false; } - - if (!callback(buff.data(), buff.size() - strm_.avail_out)) { - return false; - } - } while (strm_.avail_out == 0); - - assert((flush == Z_FINISH && ret == Z_STREAM_END) || - (flush == Z_NO_FLUSH && ret == Z_OK)); - assert(strm_.avail_in == 0); - } while (data_length > 0); - - return true; -} - -inline gzip_decompressor::gzip_decompressor() { - std::memset(&strm_, 0, sizeof(strm_)); - strm_.zalloc = Z_NULL; - strm_.zfree = Z_NULL; - strm_.opaque = Z_NULL; - - // 15 is the value of wbits, which should be at the maximum possible value - // to ensure that any gzip stream can be decoded. The offset of 32 specifies - // that the stream type should be automatically detected either gzip or - // deflate. - is_valid_ = inflateInit2(&strm_, 32 + 15) == Z_OK; -} - -inline gzip_decompressor::~gzip_decompressor() { inflateEnd(&strm_); } - -inline bool gzip_decompressor::is_valid() const { return is_valid_; } - -inline bool gzip_decompressor::decompress(const char *data, size_t data_length, - Callback callback) { - assert(is_valid_); - - auto ret = Z_OK; - - do { - constexpr size_t max_avail_in = - (std::numeric_limits::max)(); - - strm_.avail_in = static_cast( - (std::min)(data_length, max_avail_in)); - strm_.next_in = const_cast(reinterpret_cast(data)); - - data_length -= strm_.avail_in; - data += strm_.avail_in; - - std::array buff{}; - while (strm_.avail_in > 0 && ret == Z_OK) { - strm_.avail_out = static_cast(buff.size()); - strm_.next_out = reinterpret_cast(buff.data()); - - ret = inflate(&strm_, Z_NO_FLUSH); - - assert(ret != Z_STREAM_ERROR); - switch (ret) { - case Z_NEED_DICT: - case Z_DATA_ERROR: - case Z_MEM_ERROR: inflateEnd(&strm_); return false; - } - - if (!callback(buff.data(), buff.size() - strm_.avail_out)) { - return false; - } - } - - if (ret != Z_OK && ret != Z_STREAM_END) { return false; } - - } while (data_length > 0); - - return true; -} -#endif - -#ifdef CPPHTTPLIB_BROTLI_SUPPORT -inline brotli_compressor::brotli_compressor() { - state_ = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr); -} - -inline brotli_compressor::~brotli_compressor() { - BrotliEncoderDestroyInstance(state_); -} - -inline bool brotli_compressor::compress(const char *data, size_t data_length, - bool last, Callback callback) { - std::array buff{}; - - auto operation = last ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS; - auto available_in = data_length; - auto next_in = reinterpret_cast(data); - - for (;;) { - if (last) { - if (BrotliEncoderIsFinished(state_)) { break; } - } else { - if (!available_in) { break; } - } - - auto available_out = buff.size(); - auto next_out = buff.data(); - - if (!BrotliEncoderCompressStream(state_, operation, &available_in, &next_in, - &available_out, &next_out, nullptr)) { - return false; - } - - auto output_bytes = buff.size() - available_out; - if (output_bytes) { - callback(reinterpret_cast(buff.data()), output_bytes); - } - } - - return true; -} - -inline brotli_decompressor::brotli_decompressor() { - decoder_s = BrotliDecoderCreateInstance(0, 0, 0); - decoder_r = decoder_s ? BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT - : BROTLI_DECODER_RESULT_ERROR; -} - -inline brotli_decompressor::~brotli_decompressor() { - if (decoder_s) { BrotliDecoderDestroyInstance(decoder_s); } -} - -inline bool brotli_decompressor::is_valid() const { return decoder_s; } - -inline bool brotli_decompressor::decompress(const char *data, - size_t data_length, - Callback callback) { - if (decoder_r == BROTLI_DECODER_RESULT_SUCCESS || - decoder_r == BROTLI_DECODER_RESULT_ERROR) { - return 0; - } - - auto next_in = reinterpret_cast(data); - size_t avail_in = data_length; - size_t total_out; - - decoder_r = BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; - - std::array buff{}; - while (decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { - char *next_out = buff.data(); - size_t avail_out = buff.size(); - - decoder_r = BrotliDecoderDecompressStream( - decoder_s, &avail_in, &next_in, &avail_out, - reinterpret_cast(&next_out), &total_out); - - if (decoder_r == BROTLI_DECODER_RESULT_ERROR) { return false; } - - if (!callback(buff.data(), buff.size() - avail_out)) { return false; } - } - - return decoder_r == BROTLI_DECODER_RESULT_SUCCESS || - decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; -} -#endif - -#ifdef CPPHTTPLIB_ZSTD_SUPPORT -inline zstd_compressor::zstd_compressor() { - ctx_ = ZSTD_createCCtx(); - ZSTD_CCtx_setParameter(ctx_, ZSTD_c_compressionLevel, ZSTD_fast); -} - -inline zstd_compressor::~zstd_compressor() { ZSTD_freeCCtx(ctx_); } - -inline bool zstd_compressor::compress(const char *data, size_t data_length, - bool last, Callback callback) { - std::array buff{}; - - ZSTD_EndDirective mode = last ? ZSTD_e_end : ZSTD_e_continue; - ZSTD_inBuffer input = {data, data_length, 0}; - - bool finished; - do { - ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; - size_t const remaining = ZSTD_compressStream2(ctx_, &output, &input, mode); - - if (ZSTD_isError(remaining)) { return false; } - - if (!callback(buff.data(), output.pos)) { return false; } - - finished = last ? (remaining == 0) : (input.pos == input.size); - - } while (!finished); - - return true; -} - -inline zstd_decompressor::zstd_decompressor() { ctx_ = ZSTD_createDCtx(); } - -inline zstd_decompressor::~zstd_decompressor() { ZSTD_freeDCtx(ctx_); } - -inline bool zstd_decompressor::is_valid() const { return ctx_ != nullptr; } - -inline bool zstd_decompressor::decompress(const char *data, size_t data_length, - Callback callback) { - std::array buff{}; - ZSTD_inBuffer input = {data, data_length, 0}; - - while (input.pos < input.size) { - ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; - size_t const remaining = ZSTD_decompressStream(ctx_, &output, &input); - - if (ZSTD_isError(remaining)) { return false; } - - if (!callback(buff.data(), output.pos)) { return false; } - } - - return true; -} -#endif - -inline bool is_prohibited_header_name(const std::string &name) { - using udl::operator""_t; - - switch (str2tag(name)) { - case "REMOTE_ADDR"_t: - case "REMOTE_PORT"_t: - case "LOCAL_ADDR"_t: - case "LOCAL_PORT"_t: return true; - default: return false; - } -} - -inline bool has_header(const Headers &headers, const std::string &key) { - if (is_prohibited_header_name(key)) { return false; } - return headers.find(key) != headers.end(); -} - -inline const char *get_header_value(const Headers &headers, - const std::string &key, const char *def, - size_t id) { - if (is_prohibited_header_name(key)) { -#ifndef CPPHTTPLIB_NO_EXCEPTIONS - std::string msg = "Prohibited header name '" + key + "' is specified."; - throw std::invalid_argument(msg); -#else - return ""; -#endif - } - - auto rng = headers.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second.c_str(); } - return def; -} - -template -inline bool parse_header(const char *beg, const char *end, T fn) { - // Skip trailing spaces and tabs. - while (beg < end && is_space_or_tab(end[-1])) { - end--; - } - - auto p = beg; - while (p < end && *p != ':') { - p++; - } - - auto name = std::string(beg, p); - if (!detail::fields::is_field_name(name)) { return false; } - - if (p == end) { return false; } - - auto key_end = p; - - if (*p++ != ':') { return false; } - - while (p < end && is_space_or_tab(*p)) { - p++; - } - - if (p <= end) { - auto key_len = key_end - beg; - if (!key_len) { return false; } - - auto key = std::string(beg, key_end); - auto val = std::string(p, end); - - if (!detail::fields::is_field_value(val)) { return false; } - - if (case_ignore::equal(key, "Location") || - case_ignore::equal(key, "Referer")) { - fn(key, val); - } else { - fn(key, decode_path_component(val)); - } - - return true; - } - - return false; -} - -inline bool read_headers(Stream &strm, Headers &headers) { - const auto bufsiz = 2048; - char buf[bufsiz]; - stream_line_reader line_reader(strm, buf, bufsiz); - - size_t header_count = 0; - - for (;;) { - if (!line_reader.getline()) { return false; } - - // Check if the line ends with CRLF. - auto line_terminator_len = 2; - if (line_reader.end_with_crlf()) { - // Blank line indicates end of headers. - if (line_reader.size() == 2) { break; } - } else { -#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR - // Blank line indicates end of headers. - if (line_reader.size() == 1) { break; } - line_terminator_len = 1; -#else - continue; // Skip invalid line. -#endif - } - - if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } - - // Check header count limit - if (header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } - - // Exclude line terminator - auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; - - if (!parse_header(line_reader.ptr(), end, - [&](const std::string &key, const std::string &val) { - headers.emplace(key, val); - })) { - return false; - } - - header_count++; - } - - return true; -} - -inline bool read_content_with_length(Stream &strm, size_t len, - DownloadProgress progress, - ContentReceiverWithProgress out) { - char buf[CPPHTTPLIB_RECV_BUFSIZ]; - - size_t r = 0; - while (r < len) { - auto read_len = static_cast(len - r); - auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); - if (n <= 0) { return false; } - - if (!out(buf, static_cast(n), r, len)) { return false; } - r += static_cast(n); - - if (progress) { - if (!progress(r, len)) { return false; } - } - } - - return true; -} - -inline void skip_content_with_length(Stream &strm, size_t len) { - char buf[CPPHTTPLIB_RECV_BUFSIZ]; - size_t r = 0; - while (r < len) { - auto read_len = static_cast(len - r); - auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); - if (n <= 0) { return; } - r += static_cast(n); - } -} - -enum class ReadContentResult { - Success, // Successfully read the content - PayloadTooLarge, // The content exceeds the specified payload limit - Error // An error occurred while reading the content -}; - -inline ReadContentResult -read_content_without_length(Stream &strm, size_t payload_max_length, - ContentReceiverWithProgress out) { - char buf[CPPHTTPLIB_RECV_BUFSIZ]; - size_t r = 0; - for (;;) { - auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); - if (n == 0) { return ReadContentResult::Success; } - if (n < 0) { return ReadContentResult::Error; } - - // Check if adding this data would exceed the payload limit - if (r > payload_max_length || - payload_max_length - r < static_cast(n)) { - return ReadContentResult::PayloadTooLarge; - } - - if (!out(buf, static_cast(n), r, 0)) { - return ReadContentResult::Error; - } - r += static_cast(n); - } - - return ReadContentResult::Success; -} - -template -inline ReadContentResult read_content_chunked(Stream &strm, T &x, - size_t payload_max_length, - ContentReceiverWithProgress out) { - const auto bufsiz = 16; - char buf[bufsiz]; - - stream_line_reader line_reader(strm, buf, bufsiz); - - if (!line_reader.getline()) { return ReadContentResult::Error; } - - unsigned long chunk_len; - size_t total_len = 0; - while (true) { - char *end_ptr; - - chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); - - if (end_ptr == line_reader.ptr()) { return ReadContentResult::Error; } - if (chunk_len == ULONG_MAX) { return ReadContentResult::Error; } - - if (chunk_len == 0) { break; } - - // Check if adding this chunk would exceed the payload limit - if (total_len > payload_max_length || - payload_max_length - total_len < chunk_len) { - return ReadContentResult::PayloadTooLarge; - } - - total_len += chunk_len; - - if (!read_content_with_length(strm, chunk_len, nullptr, out)) { - return ReadContentResult::Error; - } - - if (!line_reader.getline()) { return ReadContentResult::Error; } - - if (strcmp(line_reader.ptr(), "\r\n") != 0) { - return ReadContentResult::Error; - } - - if (!line_reader.getline()) { return ReadContentResult::Error; } - } - - assert(chunk_len == 0); - - // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked - // transfer coding is complete when a chunk with a chunk-size of zero is - // received, possibly followed by a trailer section, and finally terminated by - // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 - // - // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section - // does't care for the existence of the final CRLF. In other words, it seems - // to be ok whether the final CRLF exists or not in the chunked data. - // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 - // - // According to the reference code in RFC 9112, cpp-httplib now allows - // chunked transfer coding data without the final CRLF. - if (!line_reader.getline()) { return ReadContentResult::Success; } - - // RFC 7230 Section 4.1.2 - Headers prohibited in trailers - thread_local case_ignore::unordered_set prohibited_trailers = { - // Message framing - "transfer-encoding", "content-length", - - // Routing - "host", - - // Authentication - "authorization", "www-authenticate", "proxy-authenticate", - "proxy-authorization", "cookie", "set-cookie", - - // Request modifiers - "cache-control", "expect", "max-forwards", "pragma", "range", "te", - - // Response control - "age", "expires", "date", "location", "retry-after", "vary", "warning", - - // Payload processing - "content-encoding", "content-type", "content-range", "trailer"}; - - // Parse declared trailer headers once for performance - case_ignore::unordered_set declared_trailers; - if (has_header(x.headers, "Trailer")) { - auto trailer_header = get_header_value(x.headers, "Trailer", "", 0); - auto len = std::strlen(trailer_header); - - split(trailer_header, trailer_header + len, ',', - [&](const char *b, const char *e) { - std::string key(b, e); - if (prohibited_trailers.find(key) == prohibited_trailers.end()) { - declared_trailers.insert(key); - } - }); - } - - size_t trailer_header_count = 0; - while (strcmp(line_reader.ptr(), "\r\n") != 0) { - if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { - return ReadContentResult::Error; - } - - // Check trailer header count limit - if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { - return ReadContentResult::Error; - } - - // Exclude line terminator - constexpr auto line_terminator_len = 2; - auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; - - parse_header(line_reader.ptr(), end, - [&](const std::string &key, const std::string &val) { - if (declared_trailers.find(key) != declared_trailers.end()) { - x.trailers.emplace(key, val); - trailer_header_count++; - } - }); - - if (!line_reader.getline()) { return ReadContentResult::Error; } - } - - return ReadContentResult::Success; -} - -inline bool is_chunked_transfer_encoding(const Headers &headers) { - return case_ignore::equal( - get_header_value(headers, "Transfer-Encoding", "", 0), "chunked"); -} - -template -bool prepare_content_receiver(T &x, int &status, - ContentReceiverWithProgress receiver, - bool decompress, U callback) { - if (decompress) { - std::string encoding = x.get_header_value("Content-Encoding"); - std::unique_ptr decompressor; - - if (encoding == "gzip" || encoding == "deflate") { -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - decompressor = detail::make_unique(); -#else - status = StatusCode::UnsupportedMediaType_415; - return false; -#endif - } else if (encoding.find("br") != std::string::npos) { -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - decompressor = detail::make_unique(); -#else - status = StatusCode::UnsupportedMediaType_415; - return false; -#endif - } else if (encoding == "zstd") { -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - decompressor = detail::make_unique(); -#else - status = StatusCode::UnsupportedMediaType_415; - return false; -#endif - } - - if (decompressor) { - if (decompressor->is_valid()) { - ContentReceiverWithProgress out = [&](const char *buf, size_t n, - size_t off, size_t len) { - return decompressor->decompress(buf, n, - [&](const char *buf2, size_t n2) { - return receiver(buf2, n2, off, len); - }); - }; - return callback(std::move(out)); - } else { - status = StatusCode::InternalServerError_500; - return false; - } - } - } - - ContentReceiverWithProgress out = [&](const char *buf, size_t n, size_t off, - size_t len) { - return receiver(buf, n, off, len); - }; - return callback(std::move(out)); -} - -template -bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, - DownloadProgress progress, - ContentReceiverWithProgress receiver, bool decompress) { - return prepare_content_receiver( - x, status, std::move(receiver), decompress, - [&](const ContentReceiverWithProgress &out) { - auto ret = true; - auto exceed_payload_max_length = false; - - if (is_chunked_transfer_encoding(x.headers)) { - auto result = read_content_chunked(strm, x, payload_max_length, out); - if (result == ReadContentResult::Success) { - ret = true; - } else if (result == ReadContentResult::PayloadTooLarge) { - exceed_payload_max_length = true; - ret = false; - } else { - ret = false; - } - } else if (!has_header(x.headers, "Content-Length")) { - auto result = - read_content_without_length(strm, payload_max_length, out); - if (result == ReadContentResult::Success) { - ret = true; - } else if (result == ReadContentResult::PayloadTooLarge) { - exceed_payload_max_length = true; - ret = false; - } else { - ret = false; - } - } else { - auto is_invalid_value = false; - auto len = get_header_value_u64(x.headers, "Content-Length", - (std::numeric_limits::max)(), - 0, is_invalid_value); - - if (is_invalid_value) { - ret = false; - } else if (len > payload_max_length) { - exceed_payload_max_length = true; - skip_content_with_length(strm, len); - ret = false; - } else if (len > 0) { - ret = read_content_with_length(strm, len, std::move(progress), out); - } - } - - if (!ret) { - status = exceed_payload_max_length ? StatusCode::PayloadTooLarge_413 - : StatusCode::BadRequest_400; - } - return ret; - }); -} - -inline ssize_t write_request_line(Stream &strm, const std::string &method, - const std::string &path) { - std::string s = method; - s += " "; - s += path; - s += " HTTP/1.1\r\n"; - return strm.write(s.data(), s.size()); -} - -inline ssize_t write_response_line(Stream &strm, int status) { - std::string s = "HTTP/1.1 "; - s += std::to_string(status); - s += " "; - s += httplib::status_message(status); - s += "\r\n"; - return strm.write(s.data(), s.size()); -} - -inline ssize_t write_headers(Stream &strm, const Headers &headers) { - ssize_t write_len = 0; - for (const auto &x : headers) { - std::string s; - s = x.first; - s += ": "; - s += x.second; - s += "\r\n"; - - auto len = strm.write(s.data(), s.size()); - if (len < 0) { return len; } - write_len += len; - } - auto len = strm.write("\r\n"); - if (len < 0) { return len; } - write_len += len; - return write_len; -} - -inline bool write_data(Stream &strm, const char *d, size_t l) { - size_t offset = 0; - while (offset < l) { - auto length = strm.write(d + offset, l - offset); - if (length < 0) { return false; } - offset += static_cast(length); - } - return true; -} - -template -inline bool write_content_with_progress(Stream &strm, - const ContentProvider &content_provider, - size_t offset, size_t length, - T is_shutting_down, - const UploadProgress &upload_progress, - Error &error) { - size_t end_offset = offset + length; - size_t start_offset = offset; - auto ok = true; - DataSink data_sink; - - data_sink.write = [&](const char *d, size_t l) -> bool { - if (ok) { - if (write_data(strm, d, l)) { - offset += l; - - if (upload_progress && length > 0) { - size_t current_written = offset - start_offset; - if (!upload_progress(current_written, length)) { - ok = false; - return false; - } - } - } else { - ok = false; - } - } - return ok; - }; - - data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; - - while (offset < end_offset && !is_shutting_down()) { - if (!strm.wait_writable()) { - error = Error::Write; - return false; - } else if (!content_provider(offset, end_offset - offset, data_sink)) { - error = Error::Canceled; - return false; - } else if (!ok) { - error = Error::Write; - return false; - } - } - - error = Error::Success; - return true; -} - -template -inline bool write_content(Stream &strm, const ContentProvider &content_provider, - size_t offset, size_t length, T is_shutting_down, - Error &error) { - return write_content_with_progress(strm, content_provider, offset, length, - is_shutting_down, nullptr, error); -} - -template -inline bool write_content(Stream &strm, const ContentProvider &content_provider, - size_t offset, size_t length, - const T &is_shutting_down) { - auto error = Error::Success; - return write_content(strm, content_provider, offset, length, is_shutting_down, - error); -} - -template -inline bool -write_content_without_length(Stream &strm, - const ContentProvider &content_provider, - const T &is_shutting_down) { - size_t offset = 0; - auto data_available = true; - auto ok = true; - DataSink data_sink; - - data_sink.write = [&](const char *d, size_t l) -> bool { - if (ok) { - offset += l; - if (!write_data(strm, d, l)) { ok = false; } - } - return ok; - }; - - data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; - - data_sink.done = [&](void) { data_available = false; }; - - while (data_available && !is_shutting_down()) { - if (!strm.wait_writable()) { - return false; - } else if (!content_provider(offset, 0, data_sink)) { - return false; - } else if (!ok) { - return false; - } - } - return true; -} - -template -inline bool -write_content_chunked(Stream &strm, const ContentProvider &content_provider, - const T &is_shutting_down, U &compressor, Error &error) { - size_t offset = 0; - auto data_available = true; - auto ok = true; - DataSink data_sink; - - data_sink.write = [&](const char *d, size_t l) -> bool { - if (ok) { - data_available = l > 0; - offset += l; - - std::string payload; - if (compressor.compress(d, l, false, - [&](const char *data, size_t data_len) { - payload.append(data, data_len); - return true; - })) { - if (!payload.empty()) { - // Emit chunked response header and footer for each chunk - auto chunk = - from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; - if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; } - } - } else { - ok = false; - } - } - return ok; - }; - - data_sink.is_writable = [&]() -> bool { return strm.wait_writable(); }; - - auto done_with_trailer = [&](const Headers *trailer) { - if (!ok) { return; } - - data_available = false; - - std::string payload; - if (!compressor.compress(nullptr, 0, true, - [&](const char *data, size_t data_len) { - payload.append(data, data_len); - return true; - })) { - ok = false; - return; - } - - if (!payload.empty()) { - // Emit chunked response header and footer for each chunk - auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; - if (!write_data(strm, chunk.data(), chunk.size())) { - ok = false; - return; - } - } - - constexpr const char done_marker[] = "0\r\n"; - if (!write_data(strm, done_marker, str_len(done_marker))) { ok = false; } - - // Trailer - if (trailer) { - for (const auto &kv : *trailer) { - std::string field_line = kv.first + ": " + kv.second + "\r\n"; - if (!write_data(strm, field_line.data(), field_line.size())) { - ok = false; - } - } - } - - constexpr const char crlf[] = "\r\n"; - if (!write_data(strm, crlf, str_len(crlf))) { ok = false; } - }; - - data_sink.done = [&](void) { done_with_trailer(nullptr); }; - - data_sink.done_with_trailer = [&](const Headers &trailer) { - done_with_trailer(&trailer); - }; - - while (data_available && !is_shutting_down()) { - if (!strm.wait_writable()) { - error = Error::Write; - return false; - } else if (!content_provider(offset, 0, data_sink)) { - error = Error::Canceled; - return false; - } else if (!ok) { - error = Error::Write; - return false; - } - } - - error = Error::Success; - return true; -} - -template -inline bool write_content_chunked(Stream &strm, - const ContentProvider &content_provider, - const T &is_shutting_down, U &compressor) { - auto error = Error::Success; - return write_content_chunked(strm, content_provider, is_shutting_down, - compressor, error); -} - -template -inline bool redirect(T &cli, Request &req, Response &res, - const std::string &path, const std::string &location, - Error &error) { - Request new_req = req; - new_req.path = path; - new_req.redirect_count_ -= 1; - - if (res.status == StatusCode::SeeOther_303 && - (req.method != "GET" && req.method != "HEAD")) { - new_req.method = "GET"; - new_req.body.clear(); - new_req.headers.clear(); - } - - Response new_res; - - auto ret = cli.send(new_req, new_res, error); - if (ret) { - req = new_req; - res = new_res; - - if (res.location.empty()) { res.location = location; } - } - return ret; -} - -inline std::string params_to_query_str(const Params ¶ms) { - std::string query; - - for (auto it = params.begin(); it != params.end(); ++it) { - if (it != params.begin()) { query += "&"; } - query += encode_query_component(it->first); - query += "="; - query += encode_query_component(it->second); - } - return query; -} - -inline void parse_query_text(const char *data, std::size_t size, - Params ¶ms) { - std::set cache; - split(data, data + size, '&', [&](const char *b, const char *e) { - std::string kv(b, e); - if (cache.find(kv) != cache.end()) { return; } - cache.insert(std::move(kv)); - - std::string key; - std::string val; - divide(b, static_cast(e - b), '=', - [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, - std::size_t rhs_size) { - key.assign(lhs_data, lhs_size); - val.assign(rhs_data, rhs_size); - }); - - if (!key.empty()) { - params.emplace(decode_query_component(key), decode_query_component(val)); - } - }); -} - -inline void parse_query_text(const std::string &s, Params ¶ms) { - parse_query_text(s.data(), s.size(), params); -} - -inline bool parse_multipart_boundary(const std::string &content_type, - std::string &boundary) { - auto boundary_keyword = "boundary="; - auto pos = content_type.find(boundary_keyword); - if (pos == std::string::npos) { return false; } - auto end = content_type.find(';', pos); - auto beg = pos + strlen(boundary_keyword); - boundary = trim_double_quotes_copy(content_type.substr(beg, end - beg)); - return !boundary.empty(); -} - -inline void parse_disposition_params(const std::string &s, Params ¶ms) { - std::set cache; - split(s.data(), s.data() + s.size(), ';', [&](const char *b, const char *e) { - std::string kv(b, e); - if (cache.find(kv) != cache.end()) { return; } - cache.insert(kv); - - std::string key; - std::string val; - split(b, e, '=', [&](const char *b2, const char *e2) { - if (key.empty()) { - key.assign(b2, e2); - } else { - val.assign(b2, e2); - } - }); - - if (!key.empty()) { - params.emplace(trim_double_quotes_copy((key)), - trim_double_quotes_copy((val))); - } - }); -} - -#ifdef CPPHTTPLIB_NO_EXCEPTIONS -inline bool parse_range_header(const std::string &s, Ranges &ranges) { -#else -inline bool parse_range_header(const std::string &s, Ranges &ranges) try { -#endif - auto is_valid = [](const std::string &str) { - return std::all_of(str.cbegin(), str.cend(), - [](unsigned char c) { return std::isdigit(c); }); - }; - - if (s.size() > 7 && s.compare(0, 6, "bytes=") == 0) { - const auto pos = static_cast(6); - const auto len = static_cast(s.size() - 6); - auto all_valid_ranges = true; - split(&s[pos], &s[pos + len], ',', [&](const char *b, const char *e) { - if (!all_valid_ranges) { return; } - - const auto it = std::find(b, e, '-'); - if (it == e) { - all_valid_ranges = false; - return; - } - - const auto lhs = std::string(b, it); - const auto rhs = std::string(it + 1, e); - if (!is_valid(lhs) || !is_valid(rhs)) { - all_valid_ranges = false; - return; - } - - const auto first = - static_cast(lhs.empty() ? -1 : std::stoll(lhs)); - const auto last = - static_cast(rhs.empty() ? -1 : std::stoll(rhs)); - if ((first == -1 && last == -1) || - (first != -1 && last != -1 && first > last)) { - all_valid_ranges = false; - return; - } - - ranges.emplace_back(first, last); - }); - return all_valid_ranges && !ranges.empty(); - } - return false; -#ifdef CPPHTTPLIB_NO_EXCEPTIONS -} -#else -} catch (...) { return false; } -#endif - -inline bool parse_accept_header(const std::string &s, - std::vector &content_types) { - content_types.clear(); - - // Empty string is considered valid (no preference) - if (s.empty()) { return true; } - - // Check for invalid patterns: leading/trailing commas or consecutive commas - if (s.front() == ',' || s.back() == ',' || - s.find(",,") != std::string::npos) { - return false; - } - - struct AcceptEntry { - std::string media_type; - double quality; - int order; // Original order in header - }; - - std::vector entries; - int order = 0; - bool has_invalid_entry = false; - - // Split by comma and parse each entry - split(s.data(), s.data() + s.size(), ',', [&](const char *b, const char *e) { - std::string entry(b, e); - entry = trim_copy(entry); - - if (entry.empty()) { - has_invalid_entry = true; - return; - } - - AcceptEntry accept_entry; - accept_entry.quality = 1.0; // Default quality - accept_entry.order = order++; - - // Find q= parameter - auto q_pos = entry.find(";q="); - if (q_pos == std::string::npos) { q_pos = entry.find("; q="); } - - if (q_pos != std::string::npos) { - // Extract media type (before q parameter) - accept_entry.media_type = trim_copy(entry.substr(0, q_pos)); - - // Extract quality value - auto q_start = entry.find('=', q_pos) + 1; - auto q_end = entry.find(';', q_start); - if (q_end == std::string::npos) { q_end = entry.length(); } - - std::string quality_str = - trim_copy(entry.substr(q_start, q_end - q_start)); - if (quality_str.empty()) { - has_invalid_entry = true; - return; - } - -#ifdef CPPHTTPLIB_NO_EXCEPTIONS - { - std::istringstream iss(quality_str); - iss >> accept_entry.quality; - - // Check if conversion was successful and entire string was consumed - if (iss.fail() || !iss.eof()) { - has_invalid_entry = true; - return; - } - } -#else - try { - accept_entry.quality = std::stod(quality_str); - } catch (...) { - has_invalid_entry = true; - return; - } -#endif - // Check if quality is in valid range [0.0, 1.0] - if (accept_entry.quality < 0.0 || accept_entry.quality > 1.0) { - has_invalid_entry = true; - return; - } - } else { - // No quality parameter, use entire entry as media type - accept_entry.media_type = entry; - } - - // Remove additional parameters from media type - auto param_pos = accept_entry.media_type.find(';'); - if (param_pos != std::string::npos) { - accept_entry.media_type = - trim_copy(accept_entry.media_type.substr(0, param_pos)); - } - - // Basic validation of media type format - if (accept_entry.media_type.empty()) { - has_invalid_entry = true; - return; - } - - // Check for basic media type format (should contain '/' or be '*') - if (accept_entry.media_type != "*" && - accept_entry.media_type.find('/') == std::string::npos) { - has_invalid_entry = true; - return; - } - - entries.push_back(accept_entry); - }); - - // Return false if any invalid entry was found - if (has_invalid_entry) { return false; } - - // Sort by quality (descending), then by original order (ascending) - std::sort(entries.begin(), entries.end(), - [](const AcceptEntry &a, const AcceptEntry &b) { - if (a.quality != b.quality) { - return a.quality > b.quality; // Higher quality first - } - return a.order < b.order; // Earlier order first for same quality - }); - - // Extract sorted media types - content_types.reserve(entries.size()); - for (const auto &entry : entries) { - content_types.push_back(entry.media_type); - } - - return true; -} - -class FormDataParser { -public: - FormDataParser() = default; - - void set_boundary(std::string &&boundary) { - boundary_ = boundary; - dash_boundary_crlf_ = dash_ + boundary_ + crlf_; - crlf_dash_boundary_ = crlf_ + dash_ + boundary_; - } - - bool is_valid() const { return is_valid_; } - - bool parse(const char *buf, size_t n, const FormDataHeader &header_callback, - const ContentReceiver &content_callback) { - - buf_append(buf, n); - - while (buf_size() > 0) { - switch (state_) { - case 0: { // Initial boundary - auto pos = buf_find(dash_boundary_crlf_); - if (pos == buf_size()) { return true; } - buf_erase(pos + dash_boundary_crlf_.size()); - state_ = 1; - break; - } - case 1: { // New entry - clear_file_info(); - state_ = 2; - break; - } - case 2: { // Headers - auto pos = buf_find(crlf_); - if (pos > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } - while (pos < buf_size()) { - // Empty line - if (pos == 0) { - if (!header_callback(file_)) { - is_valid_ = false; - return false; - } - buf_erase(crlf_.size()); - state_ = 3; - break; - } - - const auto header = buf_head(pos); - - if (!parse_header(header.data(), header.data() + header.size(), - [&](const std::string &, const std::string &) {})) { - is_valid_ = false; - return false; - } - - // Parse and emplace space trimmed headers into a map - if (!parse_header( - header.data(), header.data() + header.size(), - [&](const std::string &key, const std::string &val) { - file_.headers.emplace(key, val); - })) { - is_valid_ = false; - return false; - } - - constexpr const char header_content_type[] = "Content-Type:"; - - if (start_with_case_ignore(header, header_content_type)) { - file_.content_type = - trim_copy(header.substr(str_len(header_content_type))); - } else { - thread_local const std::regex re_content_disposition( - R"~(^Content-Disposition:\s*form-data;\s*(.*)$)~", - std::regex_constants::icase); - - std::smatch m; - if (std::regex_match(header, m, re_content_disposition)) { - Params params; - parse_disposition_params(m[1], params); - - auto it = params.find("name"); - if (it != params.end()) { - file_.name = it->second; - } else { - is_valid_ = false; - return false; - } - - it = params.find("filename"); - if (it != params.end()) { file_.filename = it->second; } - - it = params.find("filename*"); - if (it != params.end()) { - // Only allow UTF-8 encoding... - thread_local const std::regex re_rfc5987_encoding( - R"~(^UTF-8''(.+?)$)~", std::regex_constants::icase); - - std::smatch m2; - if (std::regex_match(it->second, m2, re_rfc5987_encoding)) { - file_.filename = decode_path_component(m2[1]); // override... - } else { - is_valid_ = false; - return false; - } - } - } - } - buf_erase(pos + crlf_.size()); - pos = buf_find(crlf_); - } - if (state_ != 3) { return true; } - break; - } - case 3: { // Body - if (crlf_dash_boundary_.size() > buf_size()) { return true; } - auto pos = buf_find(crlf_dash_boundary_); - if (pos < buf_size()) { - if (!content_callback(buf_data(), pos)) { - is_valid_ = false; - return false; - } - buf_erase(pos + crlf_dash_boundary_.size()); - state_ = 4; - } else { - auto len = buf_size() - crlf_dash_boundary_.size(); - if (len > 0) { - if (!content_callback(buf_data(), len)) { - is_valid_ = false; - return false; - } - buf_erase(len); - } - return true; - } - break; - } - case 4: { // Boundary - if (crlf_.size() > buf_size()) { return true; } - if (buf_start_with(crlf_)) { - buf_erase(crlf_.size()); - state_ = 1; - } else { - if (dash_.size() > buf_size()) { return true; } - if (buf_start_with(dash_)) { - buf_erase(dash_.size()); - is_valid_ = true; - buf_erase(buf_size()); // Remove epilogue - } else { - return true; - } - } - break; - } - } - } - - return true; - } - -private: - void clear_file_info() { - file_.name.clear(); - file_.filename.clear(); - file_.content_type.clear(); - file_.headers.clear(); - } - - bool start_with_case_ignore(const std::string &a, const char *b) const { - const auto b_len = strlen(b); - if (a.size() < b_len) { return false; } - for (size_t i = 0; i < b_len; i++) { - if (case_ignore::to_lower(a[i]) != case_ignore::to_lower(b[i])) { - return false; - } - } - return true; - } - - const std::string dash_ = "--"; - const std::string crlf_ = "\r\n"; - std::string boundary_; - std::string dash_boundary_crlf_; - std::string crlf_dash_boundary_; - - size_t state_ = 0; - bool is_valid_ = false; - FormData file_; - - // Buffer - bool start_with(const std::string &a, size_t spos, size_t epos, - const std::string &b) const { - if (epos - spos < b.size()) { return false; } - for (size_t i = 0; i < b.size(); i++) { - if (a[i + spos] != b[i]) { return false; } - } - return true; - } - - size_t buf_size() const { return buf_epos_ - buf_spos_; } - - const char *buf_data() const { return &buf_[buf_spos_]; } - - std::string buf_head(size_t l) const { return buf_.substr(buf_spos_, l); } - - bool buf_start_with(const std::string &s) const { - return start_with(buf_, buf_spos_, buf_epos_, s); - } - - size_t buf_find(const std::string &s) const { - auto c = s.front(); - - size_t off = buf_spos_; - while (off < buf_epos_) { - auto pos = off; - while (true) { - if (pos == buf_epos_) { return buf_size(); } - if (buf_[pos] == c) { break; } - pos++; - } - - auto remaining_size = buf_epos_ - pos; - if (s.size() > remaining_size) { return buf_size(); } - - if (start_with(buf_, pos, buf_epos_, s)) { return pos - buf_spos_; } - - off = pos + 1; - } - - return buf_size(); - } - - void buf_append(const char *data, size_t n) { - auto remaining_size = buf_size(); - if (remaining_size > 0 && buf_spos_ > 0) { - for (size_t i = 0; i < remaining_size; i++) { - buf_[i] = buf_[buf_spos_ + i]; - } - } - buf_spos_ = 0; - buf_epos_ = remaining_size; - - if (remaining_size + n > buf_.size()) { buf_.resize(remaining_size + n); } - - for (size_t i = 0; i < n; i++) { - buf_[buf_epos_ + i] = data[i]; - } - buf_epos_ += n; - } - - void buf_erase(size_t size) { buf_spos_ += size; } - - std::string buf_; - size_t buf_spos_ = 0; - size_t buf_epos_ = 0; -}; - -inline std::string random_string(size_t length) { - constexpr const char data[] = - "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; - - thread_local auto engine([]() { - // std::random_device might actually be deterministic on some - // platforms, but due to lack of support in the c++ standard library, - // doing better requires either some ugly hacks or breaking portability. - std::random_device seed_gen; - // Request 128 bits of entropy for initialization - std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()}; - return std::mt19937(seed_sequence); - }()); - - std::string result; - for (size_t i = 0; i < length; i++) { - result += data[engine() % (sizeof(data) - 1)]; - } - return result; -} - -inline std::string make_multipart_data_boundary() { - return "--cpp-httplib-multipart-data-" + detail::random_string(16); -} - -inline bool is_multipart_boundary_chars_valid(const std::string &boundary) { - auto valid = true; - for (size_t i = 0; i < boundary.size(); i++) { - auto c = boundary[i]; - if (!std::isalnum(c) && c != '-' && c != '_') { - valid = false; - break; - } - } - return valid; -} - -template -inline std::string -serialize_multipart_formdata_item_begin(const T &item, - const std::string &boundary) { - std::string body = "--" + boundary + "\r\n"; - body += "Content-Disposition: form-data; name=\"" + item.name + "\""; - if (!item.filename.empty()) { - body += "; filename=\"" + item.filename + "\""; - } - body += "\r\n"; - if (!item.content_type.empty()) { - body += "Content-Type: " + item.content_type + "\r\n"; - } - body += "\r\n"; - - return body; -} - -inline std::string serialize_multipart_formdata_item_end() { return "\r\n"; } - -inline std::string -serialize_multipart_formdata_finish(const std::string &boundary) { - return "--" + boundary + "--\r\n"; -} - -inline std::string -serialize_multipart_formdata_get_content_type(const std::string &boundary) { - return "multipart/form-data; boundary=" + boundary; -} - -inline std::string -serialize_multipart_formdata(const UploadFormDataItems &items, - const std::string &boundary, bool finish = true) { - std::string body; - - for (const auto &item : items) { - body += serialize_multipart_formdata_item_begin(item, boundary); - body += item.content + serialize_multipart_formdata_item_end(); - } - - if (finish) { body += serialize_multipart_formdata_finish(boundary); } - - return body; -} - -inline void coalesce_ranges(Ranges &ranges, size_t content_length) { - if (ranges.size() <= 1) return; - - // Sort ranges by start position - std::sort(ranges.begin(), ranges.end(), - [](const Range &a, const Range &b) { return a.first < b.first; }); - - Ranges coalesced; - coalesced.reserve(ranges.size()); - - for (auto &r : ranges) { - auto first_pos = r.first; - auto last_pos = r.second; - - // Handle special cases like in range_error - if (first_pos == -1 && last_pos == -1) { - first_pos = 0; - last_pos = static_cast(content_length); - } - - if (first_pos == -1) { - first_pos = static_cast(content_length) - last_pos; - last_pos = static_cast(content_length) - 1; - } - - if (last_pos == -1 || last_pos >= static_cast(content_length)) { - last_pos = static_cast(content_length) - 1; - } - - // Skip invalid ranges - if (!(0 <= first_pos && first_pos <= last_pos && - last_pos < static_cast(content_length))) { - continue; - } - - // Coalesce with previous range if overlapping or adjacent (but not - // identical) - if (!coalesced.empty()) { - auto &prev = coalesced.back(); - // Check if current range overlaps or is adjacent to previous range - // but don't coalesce identical ranges (allow duplicates) - if (first_pos <= prev.second + 1 && - !(first_pos == prev.first && last_pos == prev.second)) { - // Extend the previous range - prev.second = (std::max)(prev.second, last_pos); - continue; - } - } - - // Add new range - coalesced.emplace_back(first_pos, last_pos); - } - - ranges = std::move(coalesced); -} - -inline bool range_error(Request &req, Response &res) { - if (!req.ranges.empty() && 200 <= res.status && res.status < 300) { - ssize_t content_len = static_cast( - res.content_length_ ? res.content_length_ : res.body.size()); - - std::vector> processed_ranges; - size_t overwrapping_count = 0; - - // NOTE: The following Range check is based on '14.2. Range' in RFC 9110 - // 'HTTP Semantics' to avoid potential denial-of-service attacks. - // https://www.rfc-editor.org/rfc/rfc9110#section-14.2 - - // Too many ranges - if (req.ranges.size() > CPPHTTPLIB_RANGE_MAX_COUNT) { return true; } - - for (auto &r : req.ranges) { - auto &first_pos = r.first; - auto &last_pos = r.second; - - if (first_pos == -1 && last_pos == -1) { - first_pos = 0; - last_pos = content_len; - } - - if (first_pos == -1) { - first_pos = content_len - last_pos; - last_pos = content_len - 1; - } - - // NOTE: RFC-9110 '14.1.2. Byte Ranges': - // A client can limit the number of bytes requested without knowing the - // size of the selected representation. If the last-pos value is absent, - // or if the value is greater than or equal to the current length of the - // representation data, the byte range is interpreted as the remainder of - // the representation (i.e., the server replaces the value of last-pos - // with a value that is one less than the current length of the selected - // representation). - // https://www.rfc-editor.org/rfc/rfc9110.html#section-14.1.2-6 - if (last_pos == -1 || last_pos >= content_len) { - last_pos = content_len - 1; - } - - // Range must be within content length - if (!(0 <= first_pos && first_pos <= last_pos && - last_pos <= content_len - 1)) { - return true; - } - - // Request must not have more than two overlapping ranges - for (const auto &processed_range : processed_ranges) { - if (!(last_pos < processed_range.first || - first_pos > processed_range.second)) { - overwrapping_count++; - if (overwrapping_count > 2) { return true; } - break; // Only count once per range - } - } - - processed_ranges.emplace_back(first_pos, last_pos); - } - - // After validation, coalesce overlapping ranges as per RFC 9110 - coalesce_ranges(req.ranges, static_cast(content_len)); - } - - return false; -} - -inline std::pair -get_range_offset_and_length(Range r, size_t content_length) { - assert(r.first != -1 && r.second != -1); - assert(0 <= r.first && r.first < static_cast(content_length)); - assert(r.first <= r.second && - r.second < static_cast(content_length)); - (void)(content_length); - return std::make_pair(r.first, static_cast(r.second - r.first) + 1); -} - -inline std::string make_content_range_header_field( - const std::pair &offset_and_length, size_t content_length) { - auto st = offset_and_length.first; - auto ed = st + offset_and_length.second - 1; - - std::string field = "bytes "; - field += std::to_string(st); - field += "-"; - field += std::to_string(ed); - field += "/"; - field += std::to_string(content_length); - return field; -} - -template -bool process_multipart_ranges_data(const Request &req, - const std::string &boundary, - const std::string &content_type, - size_t content_length, SToken stoken, - CToken ctoken, Content content) { - for (size_t i = 0; i < req.ranges.size(); i++) { - ctoken("--"); - stoken(boundary); - ctoken("\r\n"); - if (!content_type.empty()) { - ctoken("Content-Type: "); - stoken(content_type); - ctoken("\r\n"); - } - - auto offset_and_length = - get_range_offset_and_length(req.ranges[i], content_length); - - ctoken("Content-Range: "); - stoken(make_content_range_header_field(offset_and_length, content_length)); - ctoken("\r\n"); - ctoken("\r\n"); - - if (!content(offset_and_length.first, offset_and_length.second)) { - return false; - } - ctoken("\r\n"); - } - - ctoken("--"); - stoken(boundary); - ctoken("--"); - - return true; -} - -inline void make_multipart_ranges_data(const Request &req, Response &res, - const std::string &boundary, - const std::string &content_type, - size_t content_length, - std::string &data) { - process_multipart_ranges_data( - req, boundary, content_type, content_length, - [&](const std::string &token) { data += token; }, - [&](const std::string &token) { data += token; }, - [&](size_t offset, size_t length) { - assert(offset + length <= content_length); - data += res.body.substr(offset, length); - return true; - }); -} - -inline size_t get_multipart_ranges_data_length(const Request &req, - const std::string &boundary, - const std::string &content_type, - size_t content_length) { - size_t data_length = 0; - - process_multipart_ranges_data( - req, boundary, content_type, content_length, - [&](const std::string &token) { data_length += token.size(); }, - [&](const std::string &token) { data_length += token.size(); }, - [&](size_t /*offset*/, size_t length) { - data_length += length; - return true; - }); - - return data_length; -} - -template -inline bool -write_multipart_ranges_data(Stream &strm, const Request &req, Response &res, - const std::string &boundary, - const std::string &content_type, - size_t content_length, const T &is_shutting_down) { - return process_multipart_ranges_data( - req, boundary, content_type, content_length, - [&](const std::string &token) { strm.write(token); }, - [&](const std::string &token) { strm.write(token); }, - [&](size_t offset, size_t length) { - return write_content(strm, res.content_provider_, offset, length, - is_shutting_down); - }); -} - -inline bool expect_content(const Request &req) { - if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" || - req.method == "DELETE") { - return true; - } - if (req.has_header("Content-Length") && - req.get_header_value_u64("Content-Length") > 0) { - return true; - } - if (is_chunked_transfer_encoding(req.headers)) { return true; } - return false; -} - -inline bool has_crlf(const std::string &s) { - auto p = s.c_str(); - while (*p) { - if (*p == '\r' || *p == '\n') { return true; } - p++; - } - return false; -} - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline std::string message_digest(const std::string &s, const EVP_MD *algo) { - auto context = std::unique_ptr( - EVP_MD_CTX_new(), EVP_MD_CTX_free); - - unsigned int hash_length = 0; - unsigned char hash[EVP_MAX_MD_SIZE]; - - EVP_DigestInit_ex(context.get(), algo, nullptr); - EVP_DigestUpdate(context.get(), s.c_str(), s.size()); - EVP_DigestFinal_ex(context.get(), hash, &hash_length); - - std::stringstream ss; - for (auto i = 0u; i < hash_length; ++i) { - ss << std::hex << std::setw(2) << std::setfill('0') - << static_cast(hash[i]); - } - - return ss.str(); -} - -inline std::string MD5(const std::string &s) { - return message_digest(s, EVP_md5()); -} - -inline std::string SHA_256(const std::string &s) { - return message_digest(s, EVP_sha256()); -} - -inline std::string SHA_512(const std::string &s) { - return message_digest(s, EVP_sha512()); -} - -inline std::pair make_digest_authentication_header( - const Request &req, const std::map &auth, - size_t cnonce_count, const std::string &cnonce, const std::string &username, - const std::string &password, bool is_proxy = false) { - std::string nc; - { - std::stringstream ss; - ss << std::setfill('0') << std::setw(8) << std::hex << cnonce_count; - nc = ss.str(); - } - - std::string qop; - if (auth.find("qop") != auth.end()) { - qop = auth.at("qop"); - if (qop.find("auth-int") != std::string::npos) { - qop = "auth-int"; - } else if (qop.find("auth") != std::string::npos) { - qop = "auth"; - } else { - qop.clear(); - } - } - - std::string algo = "MD5"; - if (auth.find("algorithm") != auth.end()) { algo = auth.at("algorithm"); } - - std::string response; - { - auto H = algo == "SHA-256" ? detail::SHA_256 - : algo == "SHA-512" ? detail::SHA_512 - : detail::MD5; - - auto A1 = username + ":" + auth.at("realm") + ":" + password; - - auto A2 = req.method + ":" + req.path; - if (qop == "auth-int") { A2 += ":" + H(req.body); } - - if (qop.empty()) { - response = H(H(A1) + ":" + auth.at("nonce") + ":" + H(A2)); - } else { - response = H(H(A1) + ":" + auth.at("nonce") + ":" + nc + ":" + cnonce + - ":" + qop + ":" + H(A2)); - } - } - - auto opaque = (auth.find("opaque") != auth.end()) ? auth.at("opaque") : ""; - - auto field = "Digest username=\"" + username + "\", realm=\"" + - auth.at("realm") + "\", nonce=\"" + auth.at("nonce") + - "\", uri=\"" + req.path + "\", algorithm=" + algo + - (qop.empty() ? ", response=\"" - : ", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + - cnonce + "\", response=\"") + - response + "\"" + - (opaque.empty() ? "" : ", opaque=\"" + opaque + "\""); - - auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; - return std::make_pair(key, field); -} - -inline bool is_ssl_peer_could_be_closed(SSL *ssl, socket_t sock) { - detail::set_nonblocking(sock, true); - auto se = detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); - - char buf[1]; - return !SSL_peek(ssl, buf, 1) && - SSL_get_error(ssl, 0) == SSL_ERROR_ZERO_RETURN; -} - -#ifdef _WIN32 -// NOTE: This code came up with the following stackoverflow post: -// https://stackoverflow.com/questions/9507184/can-openssl-on-windows-use-the-system-certificate-store -inline bool load_system_certs_on_windows(X509_STORE *store) { - auto hStore = CertOpenSystemStoreW((HCRYPTPROV_LEGACY)NULL, L"ROOT"); - if (!hStore) { return false; } - - auto result = false; - PCCERT_CONTEXT pContext = NULL; - while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != - nullptr) { - auto encoded_cert = - static_cast(pContext->pbCertEncoded); - - auto x509 = d2i_X509(NULL, &encoded_cert, pContext->cbCertEncoded); - if (x509) { - X509_STORE_add_cert(store, x509); - X509_free(x509); - result = true; - } - } - - CertFreeCertificateContext(pContext); - CertCloseStore(hStore, 0); - - return result; -} -#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC -template -using CFObjectPtr = - std::unique_ptr::type, void (*)(CFTypeRef)>; - -inline void cf_object_ptr_deleter(CFTypeRef obj) { - if (obj) { CFRelease(obj); } -} - -inline bool retrieve_certs_from_keychain(CFObjectPtr &certs) { - CFStringRef keys[] = {kSecClass, kSecMatchLimit, kSecReturnRef}; - CFTypeRef values[] = {kSecClassCertificate, kSecMatchLimitAll, - kCFBooleanTrue}; - - CFObjectPtr query( - CFDictionaryCreate(nullptr, reinterpret_cast(keys), values, - sizeof(keys) / sizeof(keys[0]), - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks), - cf_object_ptr_deleter); - - if (!query) { return false; } - - CFTypeRef security_items = nullptr; - if (SecItemCopyMatching(query.get(), &security_items) != errSecSuccess || - CFArrayGetTypeID() != CFGetTypeID(security_items)) { - return false; - } - - certs.reset(reinterpret_cast(security_items)); - return true; -} - -inline bool retrieve_root_certs_from_keychain(CFObjectPtr &certs) { - CFArrayRef root_security_items = nullptr; - if (SecTrustCopyAnchorCertificates(&root_security_items) != errSecSuccess) { - return false; - } - - certs.reset(root_security_items); - return true; -} - -inline bool add_certs_to_x509_store(CFArrayRef certs, X509_STORE *store) { - auto result = false; - for (auto i = 0; i < CFArrayGetCount(certs); ++i) { - const auto cert = reinterpret_cast( - CFArrayGetValueAtIndex(certs, i)); - - if (SecCertificateGetTypeID() != CFGetTypeID(cert)) { continue; } - - CFDataRef cert_data = nullptr; - if (SecItemExport(cert, kSecFormatX509Cert, 0, nullptr, &cert_data) != - errSecSuccess) { - continue; - } - - CFObjectPtr cert_data_ptr(cert_data, cf_object_ptr_deleter); - - auto encoded_cert = static_cast( - CFDataGetBytePtr(cert_data_ptr.get())); - - auto x509 = - d2i_X509(NULL, &encoded_cert, CFDataGetLength(cert_data_ptr.get())); - - if (x509) { - X509_STORE_add_cert(store, x509); - X509_free(x509); - result = true; - } - } - - return result; -} - -inline bool load_system_certs_on_macos(X509_STORE *store) { - auto result = false; - CFObjectPtr certs(nullptr, cf_object_ptr_deleter); - if (retrieve_certs_from_keychain(certs) && certs) { - result = add_certs_to_x509_store(certs.get(), store); - } - - if (retrieve_root_certs_from_keychain(certs) && certs) { - result = add_certs_to_x509_store(certs.get(), store) || result; - } - - return result; -} -#endif // _WIN32 -#endif // CPPHTTPLIB_OPENSSL_SUPPORT - -#ifdef _WIN32 -class WSInit { -public: - WSInit() { - WSADATA wsaData; - if (WSAStartup(0x0002, &wsaData) == 0) is_valid_ = true; - } - - ~WSInit() { - if (is_valid_) WSACleanup(); - } - - bool is_valid_ = false; -}; - -static WSInit wsinit_; -#endif - -inline bool parse_www_authenticate(const Response &res, - std::map &auth, - bool is_proxy) { - auto auth_key = is_proxy ? "Proxy-Authenticate" : "WWW-Authenticate"; - if (res.has_header(auth_key)) { - thread_local auto re = - std::regex(R"~((?:(?:,\s*)?(.+?)=(?:"(.*?)"|([^,]*))))~"); - auto s = res.get_header_value(auth_key); - auto pos = s.find(' '); - if (pos != std::string::npos) { - auto type = s.substr(0, pos); - if (type == "Basic") { - return false; - } else if (type == "Digest") { - s = s.substr(pos + 1); - auto beg = std::sregex_iterator(s.begin(), s.end(), re); - for (auto i = beg; i != std::sregex_iterator(); ++i) { - const auto &m = *i; - auto key = s.substr(static_cast(m.position(1)), - static_cast(m.length(1))); - auto val = m.length(2) > 0 - ? s.substr(static_cast(m.position(2)), - static_cast(m.length(2))) - : s.substr(static_cast(m.position(3)), - static_cast(m.length(3))); - auth[key] = val; - } - return true; - } - } - } - return false; -} - -class ContentProviderAdapter { -public: - explicit ContentProviderAdapter( - ContentProviderWithoutLength &&content_provider) - : content_provider_(content_provider) {} - - bool operator()(size_t offset, size_t, DataSink &sink) { - return content_provider_(offset, sink); - } - -private: - ContentProviderWithoutLength content_provider_; -}; - -} // namespace detail - -inline std::string hosted_at(const std::string &hostname) { - std::vector addrs; - hosted_at(hostname, addrs); - if (addrs.empty()) { return std::string(); } - return addrs[0]; -} - -inline void hosted_at(const std::string &hostname, - std::vector &addrs) { - struct addrinfo hints; - struct addrinfo *result; - - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; - hints.ai_protocol = 0; - - if (detail::getaddrinfo_with_timeout(hostname.c_str(), nullptr, &hints, - &result, 0)) { -#if defined __linux__ && !defined __ANDROID__ - res_init(); -#endif - return; - } - auto se = detail::scope_exit([&] { freeaddrinfo(result); }); - - for (auto rp = result; rp; rp = rp->ai_next) { - const auto &addr = - *reinterpret_cast(rp->ai_addr); - std::string ip; - auto dummy = -1; - if (detail::get_ip_and_port(addr, sizeof(struct sockaddr_storage), ip, - dummy)) { - addrs.push_back(ip); - } - } -} - -inline std::string encode_uri_component(const std::string &value) { - std::ostringstream escaped; - escaped.fill('0'); - escaped << std::hex; - - for (auto c : value) { - if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || - c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || - c == ')') { - escaped << c; - } else { - escaped << std::uppercase; - escaped << '%' << std::setw(2) - << static_cast(static_cast(c)); - escaped << std::nouppercase; - } - } - - return escaped.str(); -} - -inline std::string encode_uri(const std::string &value) { - std::ostringstream escaped; - escaped.fill('0'); - escaped << std::hex; - - for (auto c : value) { - if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || - c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || - c == ')' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || - c == '&' || c == '=' || c == '+' || c == '$' || c == ',' || c == '#') { - escaped << c; - } else { - escaped << std::uppercase; - escaped << '%' << std::setw(2) - << static_cast(static_cast(c)); - escaped << std::nouppercase; - } - } - - return escaped.str(); -} - -inline std::string decode_uri_component(const std::string &value) { - std::string result; - - for (size_t i = 0; i < value.size(); i++) { - if (value[i] == '%' && i + 2 < value.size()) { - auto val = 0; - if (detail::from_hex_to_i(value, i + 1, 2, val)) { - result += static_cast(val); - i += 2; - } else { - result += value[i]; - } - } else { - result += value[i]; - } - } - - return result; -} - -inline std::string decode_uri(const std::string &value) { - std::string result; - - for (size_t i = 0; i < value.size(); i++) { - if (value[i] == '%' && i + 2 < value.size()) { - auto val = 0; - if (detail::from_hex_to_i(value, i + 1, 2, val)) { - result += static_cast(val); - i += 2; - } else { - result += value[i]; - } - } else { - result += value[i]; - } - } - - return result; -} - -inline std::string encode_path_component(const std::string &component) { - std::string result; - result.reserve(component.size() * 3); - - for (size_t i = 0; i < component.size(); i++) { - auto c = static_cast(component[i]); - - // Unreserved characters per RFC 3986: ALPHA / DIGIT / "-" / "." / "_" / "~" - if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { - result += static_cast(c); - } - // Path-safe sub-delimiters: "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / - // "," / ";" / "=" - else if (c == '!' || c == '$' || c == '&' || c == '\'' || c == '(' || - c == ')' || c == '*' || c == '+' || c == ',' || c == ';' || - c == '=') { - result += static_cast(c); - } - // Colon is allowed in path segments except first segment - else if (c == ':') { - result += static_cast(c); - } - // @ is allowed in path - else if (c == '@') { - result += static_cast(c); - } else { - result += '%'; - char hex[3]; - snprintf(hex, sizeof(hex), "%02X", c); - result.append(hex, 2); - } - } - return result; -} - -inline std::string decode_path_component(const std::string &component) { - std::string result; - result.reserve(component.size()); - - for (size_t i = 0; i < component.size(); i++) { - if (component[i] == '%' && i + 1 < component.size()) { - if (component[i + 1] == 'u') { - // Unicode %uXXXX encoding - auto val = 0; - if (detail::from_hex_to_i(component, i + 2, 4, val)) { - // 4 digits Unicode codes - char buff[4]; - size_t len = detail::to_utf8(val, buff); - if (len > 0) { result.append(buff, len); } - i += 5; // 'u0000' - } else { - result += component[i]; - } - } else { - // Standard %XX encoding - auto val = 0; - if (detail::from_hex_to_i(component, i + 1, 2, val)) { - // 2 digits hex codes - result += static_cast(val); - i += 2; // 'XX' - } else { - result += component[i]; - } - } - } else { - result += component[i]; - } - } - return result; -} - -inline std::string encode_query_component(const std::string &component, - bool space_as_plus) { - std::string result; - result.reserve(component.size() * 3); - - for (size_t i = 0; i < component.size(); i++) { - auto c = static_cast(component[i]); - - // Unreserved characters per RFC 3986 - if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { - result += static_cast(c); - } - // Space handling - else if (c == ' ') { - if (space_as_plus) { - result += '+'; - } else { - result += "%20"; - } - } - // Plus sign handling - else if (c == '+') { - if (space_as_plus) { - result += "%2B"; - } else { - result += static_cast(c); - } - } - // Query-safe sub-delimiters (excluding & and = which are query delimiters) - else if (c == '!' || c == '$' || c == '\'' || c == '(' || c == ')' || - c == '*' || c == ',' || c == ';') { - result += static_cast(c); - } - // Colon and @ are allowed in query - else if (c == ':' || c == '@') { - result += static_cast(c); - } - // Forward slash is allowed in query values - else if (c == '/') { - result += static_cast(c); - } - // Question mark is allowed in query values (after first ?) - else if (c == '?') { - result += static_cast(c); - } else { - result += '%'; - char hex[3]; - snprintf(hex, sizeof(hex), "%02X", c); - result.append(hex, 2); - } - } - return result; -} - -inline std::string decode_query_component(const std::string &component, - bool plus_as_space) { - std::string result; - result.reserve(component.size()); - - for (size_t i = 0; i < component.size(); i++) { - if (component[i] == '%' && i + 2 < component.size()) { - std::string hex = component.substr(i + 1, 2); - char *end; - unsigned long value = std::strtoul(hex.c_str(), &end, 16); - if (end == hex.c_str() + 2) { - result += static_cast(value); - i += 2; - } else { - result += component[i]; - } - } else if (component[i] == '+' && plus_as_space) { - result += ' '; // + becomes space in form-urlencoded - } else { - result += component[i]; - } - } - return result; -} - -inline std::string append_query_params(const std::string &path, - const Params ¶ms) { - std::string path_with_query = path; - thread_local const std::regex re("[^?]+\\?.*"); - auto delm = std::regex_match(path, re) ? '&' : '?'; - path_with_query += delm + detail::params_to_query_str(params); - return path_with_query; -} - -// Header utilities -inline std::pair -make_range_header(const Ranges &ranges) { - std::string field = "bytes="; - auto i = 0; - for (const auto &r : ranges) { - if (i != 0) { field += ", "; } - if (r.first != -1) { field += std::to_string(r.first); } - field += '-'; - if (r.second != -1) { field += std::to_string(r.second); } - i++; - } - return std::make_pair("Range", std::move(field)); -} - -inline std::pair -make_basic_authentication_header(const std::string &username, - const std::string &password, bool is_proxy) { - auto field = "Basic " + detail::base64_encode(username + ":" + password); - auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; - return std::make_pair(key, std::move(field)); -} - -inline std::pair -make_bearer_token_authentication_header(const std::string &token, - bool is_proxy = false) { - auto field = "Bearer " + token; - auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; - return std::make_pair(key, std::move(field)); -} - -// Request implementation -inline bool Request::has_header(const std::string &key) const { - return detail::has_header(headers, key); -} - -inline std::string Request::get_header_value(const std::string &key, - const char *def, size_t id) const { - return detail::get_header_value(headers, key, def, id); -} - -inline size_t Request::get_header_value_count(const std::string &key) const { - auto r = headers.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline void Request::set_header(const std::string &key, - const std::string &val) { - if (detail::fields::is_field_name(key) && - detail::fields::is_field_value(val)) { - headers.emplace(key, val); - } -} - -inline bool Request::has_trailer(const std::string &key) const { - return trailers.find(key) != trailers.end(); -} - -inline std::string Request::get_trailer_value(const std::string &key, - size_t id) const { - auto rng = trailers.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second; } - return std::string(); -} - -inline size_t Request::get_trailer_value_count(const std::string &key) const { - auto r = trailers.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline bool Request::has_param(const std::string &key) const { - return params.find(key) != params.end(); -} - -inline std::string Request::get_param_value(const std::string &key, - size_t id) const { - auto rng = params.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second; } - return std::string(); -} - -inline size_t Request::get_param_value_count(const std::string &key) const { - auto r = params.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline bool Request::is_multipart_form_data() const { - const auto &content_type = get_header_value("Content-Type"); - return !content_type.rfind("multipart/form-data", 0); -} - -// Multipart FormData implementation -inline std::string MultipartFormData::get_field(const std::string &key, - size_t id) const { - auto rng = fields.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second.content; } - return std::string(); -} - -inline std::vector -MultipartFormData::get_fields(const std::string &key) const { - std::vector values; - auto rng = fields.equal_range(key); - for (auto it = rng.first; it != rng.second; it++) { - values.push_back(it->second.content); - } - return values; -} - -inline bool MultipartFormData::has_field(const std::string &key) const { - return fields.find(key) != fields.end(); -} - -inline size_t MultipartFormData::get_field_count(const std::string &key) const { - auto r = fields.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline FormData MultipartFormData::get_file(const std::string &key, - size_t id) const { - auto rng = files.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second; } - return FormData(); -} - -inline std::vector -MultipartFormData::get_files(const std::string &key) const { - std::vector values; - auto rng = files.equal_range(key); - for (auto it = rng.first; it != rng.second; it++) { - values.push_back(it->second); - } - return values; -} - -inline bool MultipartFormData::has_file(const std::string &key) const { - return files.find(key) != files.end(); -} - -inline size_t MultipartFormData::get_file_count(const std::string &key) const { - auto r = files.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -// Response implementation -inline bool Response::has_header(const std::string &key) const { - return headers.find(key) != headers.end(); -} - -inline std::string Response::get_header_value(const std::string &key, - const char *def, - size_t id) const { - return detail::get_header_value(headers, key, def, id); -} - -inline size_t Response::get_header_value_count(const std::string &key) const { - auto r = headers.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline void Response::set_header(const std::string &key, - const std::string &val) { - if (detail::fields::is_field_name(key) && - detail::fields::is_field_value(val)) { - headers.emplace(key, val); - } -} -inline bool Response::has_trailer(const std::string &key) const { - return trailers.find(key) != trailers.end(); -} - -inline std::string Response::get_trailer_value(const std::string &key, - size_t id) const { - auto rng = trailers.equal_range(key); - auto it = rng.first; - std::advance(it, static_cast(id)); - if (it != rng.second) { return it->second; } - return std::string(); -} - -inline size_t Response::get_trailer_value_count(const std::string &key) const { - auto r = trailers.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -inline void Response::set_redirect(const std::string &url, int stat) { - if (detail::fields::is_field_value(url)) { - set_header("Location", url); - if (300 <= stat && stat < 400) { - this->status = stat; - } else { - this->status = StatusCode::Found_302; - } - } -} - -inline void Response::set_content(const char *s, size_t n, - const std::string &content_type) { - body.assign(s, n); - - auto rng = headers.equal_range("Content-Type"); - headers.erase(rng.first, rng.second); - set_header("Content-Type", content_type); -} - -inline void Response::set_content(const std::string &s, - const std::string &content_type) { - set_content(s.data(), s.size(), content_type); -} - -inline void Response::set_content(std::string &&s, - const std::string &content_type) { - body = std::move(s); - - auto rng = headers.equal_range("Content-Type"); - headers.erase(rng.first, rng.second); - set_header("Content-Type", content_type); -} - -inline void Response::set_content_provider( - size_t in_length, const std::string &content_type, ContentProvider provider, - ContentProviderResourceReleaser resource_releaser) { - set_header("Content-Type", content_type); - content_length_ = in_length; - if (in_length > 0) { content_provider_ = std::move(provider); } - content_provider_resource_releaser_ = std::move(resource_releaser); - is_chunked_content_provider_ = false; -} - -inline void Response::set_content_provider( - const std::string &content_type, ContentProviderWithoutLength provider, - ContentProviderResourceReleaser resource_releaser) { - set_header("Content-Type", content_type); - content_length_ = 0; - content_provider_ = detail::ContentProviderAdapter(std::move(provider)); - content_provider_resource_releaser_ = std::move(resource_releaser); - is_chunked_content_provider_ = false; -} - -inline void Response::set_chunked_content_provider( - const std::string &content_type, ContentProviderWithoutLength provider, - ContentProviderResourceReleaser resource_releaser) { - set_header("Content-Type", content_type); - content_length_ = 0; - content_provider_ = detail::ContentProviderAdapter(std::move(provider)); - content_provider_resource_releaser_ = std::move(resource_releaser); - is_chunked_content_provider_ = true; -} - -inline void Response::set_file_content(const std::string &path, - const std::string &content_type) { - file_content_path_ = path; - file_content_content_type_ = content_type; -} - -inline void Response::set_file_content(const std::string &path) { - file_content_path_ = path; -} - -// Result implementation -inline bool Result::has_request_header(const std::string &key) const { - return request_headers_.find(key) != request_headers_.end(); -} - -inline std::string Result::get_request_header_value(const std::string &key, - const char *def, - size_t id) const { - return detail::get_header_value(request_headers_, key, def, id); -} - -inline size_t -Result::get_request_header_value_count(const std::string &key) const { - auto r = request_headers_.equal_range(key); - return static_cast(std::distance(r.first, r.second)); -} - -// Stream implementation -inline ssize_t Stream::write(const char *ptr) { - return write(ptr, strlen(ptr)); -} - -inline ssize_t Stream::write(const std::string &s) { - return write(s.data(), s.size()); -} - -namespace detail { - -inline void calc_actual_timeout(time_t max_timeout_msec, time_t duration_msec, - time_t timeout_sec, time_t timeout_usec, - time_t &actual_timeout_sec, - time_t &actual_timeout_usec) { - auto timeout_msec = (timeout_sec * 1000) + (timeout_usec / 1000); - - auto actual_timeout_msec = - (std::min)(max_timeout_msec - duration_msec, timeout_msec); - - if (actual_timeout_msec < 0) { actual_timeout_msec = 0; } - - actual_timeout_sec = actual_timeout_msec / 1000; - actual_timeout_usec = (actual_timeout_msec % 1000) * 1000; -} - -// Socket stream implementation -inline SocketStream::SocketStream( - socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, - time_t write_timeout_sec, time_t write_timeout_usec, - time_t max_timeout_msec, - std::chrono::time_point start_time) - : sock_(sock), read_timeout_sec_(read_timeout_sec), - read_timeout_usec_(read_timeout_usec), - write_timeout_sec_(write_timeout_sec), - write_timeout_usec_(write_timeout_usec), - max_timeout_msec_(max_timeout_msec), start_time_(start_time), - read_buff_(read_buff_size_, 0) {} - -inline SocketStream::~SocketStream() = default; - -inline bool SocketStream::is_readable() const { - return read_buff_off_ < read_buff_content_size_; -} - -inline bool SocketStream::wait_readable() const { - if (max_timeout_msec_ <= 0) { - return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; - } - - time_t read_timeout_sec; - time_t read_timeout_usec; - calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, - read_timeout_usec_, read_timeout_sec, read_timeout_usec); - - return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; -} - -inline bool SocketStream::wait_writable() const { - return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && - is_socket_alive(sock_); -} - -inline ssize_t SocketStream::read(char *ptr, size_t size) { -#ifdef _WIN32 - size = - (std::min)(size, static_cast((std::numeric_limits::max)())); -#else - size = (std::min)(size, - static_cast((std::numeric_limits::max)())); -#endif - - if (read_buff_off_ < read_buff_content_size_) { - auto remaining_size = read_buff_content_size_ - read_buff_off_; - if (size <= remaining_size) { - memcpy(ptr, read_buff_.data() + read_buff_off_, size); - read_buff_off_ += size; - return static_cast(size); - } else { - memcpy(ptr, read_buff_.data() + read_buff_off_, remaining_size); - read_buff_off_ += remaining_size; - return static_cast(remaining_size); - } - } - - if (!wait_readable()) { return -1; } - - read_buff_off_ = 0; - read_buff_content_size_ = 0; - - if (size < read_buff_size_) { - auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, - CPPHTTPLIB_RECV_FLAGS); - if (n <= 0) { - return n; - } else if (n <= static_cast(size)) { - memcpy(ptr, read_buff_.data(), static_cast(n)); - return n; - } else { - memcpy(ptr, read_buff_.data(), size); - read_buff_off_ = size; - read_buff_content_size_ = static_cast(n); - return static_cast(size); - } - } else { - return read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); - } -} - -inline ssize_t SocketStream::write(const char *ptr, size_t size) { - if (!wait_writable()) { return -1; } - -#if defined(_WIN32) && !defined(_WIN64) - size = - (std::min)(size, static_cast((std::numeric_limits::max)())); -#endif - - return send_socket(sock_, ptr, size, CPPHTTPLIB_SEND_FLAGS); -} - -inline void SocketStream::get_remote_ip_and_port(std::string &ip, - int &port) const { - return detail::get_remote_ip_and_port(sock_, ip, port); -} - -inline void SocketStream::get_local_ip_and_port(std::string &ip, - int &port) const { - return detail::get_local_ip_and_port(sock_, ip, port); -} - -inline socket_t SocketStream::socket() const { return sock_; } - -inline time_t SocketStream::duration() const { - return std::chrono::duration_cast( - std::chrono::steady_clock::now() - start_time_) - .count(); -} - -// Buffer stream implementation -inline bool BufferStream::is_readable() const { return true; } - -inline bool BufferStream::wait_readable() const { return true; } - -inline bool BufferStream::wait_writable() const { return true; } - -inline ssize_t BufferStream::read(char *ptr, size_t size) { -#if defined(_MSC_VER) && _MSC_VER < 1910 - auto len_read = buffer._Copy_s(ptr, size, size, position); -#else - auto len_read = buffer.copy(ptr, size, position); -#endif - position += static_cast(len_read); - return static_cast(len_read); -} - -inline ssize_t BufferStream::write(const char *ptr, size_t size) { - buffer.append(ptr, size); - return static_cast(size); -} - -inline void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, - int & /*port*/) const {} - -inline void BufferStream::get_local_ip_and_port(std::string & /*ip*/, - int & /*port*/) const {} - -inline socket_t BufferStream::socket() const { return 0; } - -inline time_t BufferStream::duration() const { return 0; } - -inline const std::string &BufferStream::get_buffer() const { return buffer; } - -inline PathParamsMatcher::PathParamsMatcher(const std::string &pattern) - : MatcherBase(pattern) { - constexpr const char marker[] = "/:"; - - // One past the last ending position of a path param substring - std::size_t last_param_end = 0; - -#ifndef CPPHTTPLIB_NO_EXCEPTIONS - // Needed to ensure that parameter names are unique during matcher - // construction - // If exceptions are disabled, only last duplicate path - // parameter will be set - std::unordered_set param_name_set; -#endif - - while (true) { - const auto marker_pos = pattern.find( - marker, last_param_end == 0 ? last_param_end : last_param_end - 1); - if (marker_pos == std::string::npos) { break; } - - static_fragments_.push_back( - pattern.substr(last_param_end, marker_pos - last_param_end + 1)); - - const auto param_name_start = marker_pos + str_len(marker); - - auto sep_pos = pattern.find(separator, param_name_start); - if (sep_pos == std::string::npos) { sep_pos = pattern.length(); } - - auto param_name = - pattern.substr(param_name_start, sep_pos - param_name_start); - -#ifndef CPPHTTPLIB_NO_EXCEPTIONS - if (param_name_set.find(param_name) != param_name_set.cend()) { - std::string msg = "Encountered path parameter '" + param_name + - "' multiple times in route pattern '" + pattern + "'."; - throw std::invalid_argument(msg); - } -#endif - - param_names_.push_back(std::move(param_name)); - - last_param_end = sep_pos + 1; - } - - if (last_param_end < pattern.length()) { - static_fragments_.push_back(pattern.substr(last_param_end)); - } -} - -inline bool PathParamsMatcher::match(Request &request) const { - request.matches = std::smatch(); - request.path_params.clear(); - request.path_params.reserve(param_names_.size()); - - // One past the position at which the path matched the pattern last time - std::size_t starting_pos = 0; - for (size_t i = 0; i < static_fragments_.size(); ++i) { - const auto &fragment = static_fragments_[i]; - - if (starting_pos + fragment.length() > request.path.length()) { - return false; - } - - // Avoid unnecessary allocation by using strncmp instead of substr + - // comparison - if (std::strncmp(request.path.c_str() + starting_pos, fragment.c_str(), - fragment.length()) != 0) { - return false; - } - - starting_pos += fragment.length(); - - // Should only happen when we have a static fragment after a param - // Example: '/users/:id/subscriptions' - // The 'subscriptions' fragment here does not have a corresponding param - if (i >= param_names_.size()) { continue; } - - auto sep_pos = request.path.find(separator, starting_pos); - if (sep_pos == std::string::npos) { sep_pos = request.path.length(); } - - const auto ¶m_name = param_names_[i]; - - request.path_params.emplace( - param_name, request.path.substr(starting_pos, sep_pos - starting_pos)); - - // Mark everything up to '/' as matched - starting_pos = sep_pos + 1; - } - // Returns false if the path is longer than the pattern - return starting_pos >= request.path.length(); -} - -inline bool RegexMatcher::match(Request &request) const { - request.path_params.clear(); - return std::regex_match(request.path, request.matches, regex_); -} - -inline std::string make_host_and_port_string(const std::string &host, int port, - bool is_ssl) { - std::string result; - - // Enclose IPv6 address in brackets (but not if already enclosed) - if (host.find(':') == std::string::npos || - (!host.empty() && host[0] == '[')) { - // IPv4, hostname, or already bracketed IPv6 - result = host; - } else { - // IPv6 address without brackets - result = "[" + host + "]"; - } - - // Append port if not default - if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { - ; // do nothing - } else { - result += ":" + std::to_string(port); - } - - return result; -} - -} // namespace detail - -// HTTP server implementation -inline Server::Server() - : new_task_queue( - [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }) { -#ifndef _WIN32 - signal(SIGPIPE, SIG_IGN); -#endif -} - -inline Server::~Server() = default; - -inline std::unique_ptr -Server::make_matcher(const std::string &pattern) { - if (pattern.find("/:") != std::string::npos) { - return detail::make_unique(pattern); - } else { - return detail::make_unique(pattern); - } -} - -inline Server &Server::Get(const std::string &pattern, Handler handler) { - get_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline Server &Server::Post(const std::string &pattern, Handler handler) { - post_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline Server &Server::Post(const std::string &pattern, - HandlerWithContentReader handler) { - post_handlers_for_content_reader_.emplace_back(make_matcher(pattern), - std::move(handler)); - return *this; -} - -inline Server &Server::Put(const std::string &pattern, Handler handler) { - put_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline Server &Server::Put(const std::string &pattern, - HandlerWithContentReader handler) { - put_handlers_for_content_reader_.emplace_back(make_matcher(pattern), - std::move(handler)); - return *this; -} - -inline Server &Server::Patch(const std::string &pattern, Handler handler) { - patch_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline Server &Server::Patch(const std::string &pattern, - HandlerWithContentReader handler) { - patch_handlers_for_content_reader_.emplace_back(make_matcher(pattern), - std::move(handler)); - return *this; -} - -inline Server &Server::Delete(const std::string &pattern, Handler handler) { - delete_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline Server &Server::Delete(const std::string &pattern, - HandlerWithContentReader handler) { - delete_handlers_for_content_reader_.emplace_back(make_matcher(pattern), - std::move(handler)); - return *this; -} - -inline Server &Server::Options(const std::string &pattern, Handler handler) { - options_handlers_.emplace_back(make_matcher(pattern), std::move(handler)); - return *this; -} - -inline bool Server::set_base_dir(const std::string &dir, - const std::string &mount_point) { - return set_mount_point(mount_point, dir); -} - -inline bool Server::set_mount_point(const std::string &mount_point, - const std::string &dir, Headers headers) { - detail::FileStat stat(dir); - if (stat.is_dir()) { - std::string mnt = !mount_point.empty() ? mount_point : "/"; - if (!mnt.empty() && mnt[0] == '/') { - base_dirs_.push_back({mnt, dir, std::move(headers)}); - return true; - } - } - return false; -} - -inline bool Server::remove_mount_point(const std::string &mount_point) { - for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { - if (it->mount_point == mount_point) { - base_dirs_.erase(it); - return true; - } - } - return false; -} - -inline Server & -Server::set_file_extension_and_mimetype_mapping(const std::string &ext, - const std::string &mime) { - file_extension_and_mimetype_map_[ext] = mime; - return *this; -} - -inline Server &Server::set_default_file_mimetype(const std::string &mime) { - default_file_mimetype_ = mime; - return *this; -} - -inline Server &Server::set_file_request_handler(Handler handler) { - file_request_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_error_handler_core(HandlerWithResponse handler, - std::true_type) { - error_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_error_handler_core(Handler handler, - std::false_type) { - error_handler_ = [handler](const Request &req, Response &res) { - handler(req, res); - return HandlerResponse::Handled; - }; - return *this; -} - -inline Server &Server::set_exception_handler(ExceptionHandler handler) { - exception_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_pre_routing_handler(HandlerWithResponse handler) { - pre_routing_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_post_routing_handler(Handler handler) { - post_routing_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_pre_request_handler(HandlerWithResponse handler) { - pre_request_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_logger(Logger logger) { - logger_ = std::move(logger); - return *this; -} - -inline Server &Server::set_error_logger(ErrorLogger error_logger) { - error_logger_ = std::move(error_logger); - return *this; -} - -inline Server &Server::set_pre_compression_logger(Logger logger) { - pre_compression_logger_ = std::move(logger); - return *this; -} - -inline Server & -Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { - expect_100_continue_handler_ = std::move(handler); - return *this; -} - -inline Server &Server::set_address_family(int family) { - address_family_ = family; - return *this; -} - -inline Server &Server::set_tcp_nodelay(bool on) { - tcp_nodelay_ = on; - return *this; -} - -inline Server &Server::set_ipv6_v6only(bool on) { - ipv6_v6only_ = on; - return *this; -} - -inline Server &Server::set_socket_options(SocketOptions socket_options) { - socket_options_ = std::move(socket_options); - return *this; -} - -inline Server &Server::set_default_headers(Headers headers) { - default_headers_ = std::move(headers); - return *this; -} - -inline Server &Server::set_header_writer( - std::function const &writer) { - header_writer_ = writer; - return *this; -} - -inline Server & -Server::set_trusted_proxies(const std::vector &proxies) { - trusted_proxies_ = proxies; - return *this; -} - -inline Server &Server::set_keep_alive_max_count(size_t count) { - keep_alive_max_count_ = count; - return *this; -} - -inline Server &Server::set_keep_alive_timeout(time_t sec) { - keep_alive_timeout_sec_ = sec; - return *this; -} - -inline Server &Server::set_read_timeout(time_t sec, time_t usec) { - read_timeout_sec_ = sec; - read_timeout_usec_ = usec; - return *this; -} - -inline Server &Server::set_write_timeout(time_t sec, time_t usec) { - write_timeout_sec_ = sec; - write_timeout_usec_ = usec; - return *this; -} - -inline Server &Server::set_idle_interval(time_t sec, time_t usec) { - idle_interval_sec_ = sec; - idle_interval_usec_ = usec; - return *this; -} - -inline Server &Server::set_payload_max_length(size_t length) { - payload_max_length_ = length; - return *this; -} - -inline bool Server::bind_to_port(const std::string &host, int port, - int socket_flags) { - auto ret = bind_internal(host, port, socket_flags); - if (ret == -1) { is_decommissioned = true; } - return ret >= 0; -} -inline int Server::bind_to_any_port(const std::string &host, int socket_flags) { - auto ret = bind_internal(host, 0, socket_flags); - if (ret == -1) { is_decommissioned = true; } - return ret; -} - -inline bool Server::listen_after_bind() { return listen_internal(); } - -inline bool Server::listen(const std::string &host, int port, - int socket_flags) { - return bind_to_port(host, port, socket_flags) && listen_internal(); -} - -inline bool Server::is_running() const { return is_running_; } - -inline void Server::wait_until_ready() const { - while (!is_running_ && !is_decommissioned) { - std::this_thread::sleep_for(std::chrono::milliseconds{1}); - } -} - -inline void Server::stop() { - if (is_running_) { - assert(svr_sock_ != INVALID_SOCKET); - std::atomic sock(svr_sock_.exchange(INVALID_SOCKET)); - detail::shutdown_socket(sock); - detail::close_socket(sock); - } - is_decommissioned = false; -} - -inline void Server::decommission() { is_decommissioned = true; } - -inline bool Server::parse_request_line(const char *s, Request &req) const { - auto len = strlen(s); - if (len < 2 || s[len - 2] != '\r' || s[len - 1] != '\n') { return false; } - len -= 2; - - { - size_t count = 0; - - detail::split(s, s + len, ' ', [&](const char *b, const char *e) { - switch (count) { - case 0: req.method = std::string(b, e); break; - case 1: req.target = std::string(b, e); break; - case 2: req.version = std::string(b, e); break; - default: break; - } - count++; - }); - - if (count != 3) { return false; } - } - - thread_local const std::set methods{ - "GET", "HEAD", "POST", "PUT", "DELETE", - "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; - - if (methods.find(req.method) == methods.end()) { - output_error_log(Error::InvalidHTTPMethod, &req); - return false; - } - - if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { - output_error_log(Error::InvalidHTTPVersion, &req); - return false; - } - - { - // Skip URL fragment - for (size_t i = 0; i < req.target.size(); i++) { - if (req.target[i] == '#') { - req.target.erase(i); - break; - } - } - - detail::divide(req.target, '?', - [&](const char *lhs_data, std::size_t lhs_size, - const char *rhs_data, std::size_t rhs_size) { - req.path = - decode_path_component(std::string(lhs_data, lhs_size)); - detail::parse_query_text(rhs_data, rhs_size, req.params); - }); - } - - return true; -} - -inline bool Server::write_response(Stream &strm, bool close_connection, - Request &req, Response &res) { - // NOTE: `req.ranges` should be empty, otherwise it will be applied - // incorrectly to the error content. - req.ranges.clear(); - return write_response_core(strm, close_connection, req, res, false); -} - -inline bool Server::write_response_with_content(Stream &strm, - bool close_connection, - const Request &req, - Response &res) { - return write_response_core(strm, close_connection, req, res, true); -} - -inline bool Server::write_response_core(Stream &strm, bool close_connection, - const Request &req, Response &res, - bool need_apply_ranges) { - assert(res.status != -1); - - if (400 <= res.status && error_handler_ && - error_handler_(req, res) == HandlerResponse::Handled) { - need_apply_ranges = true; - } - - std::string content_type; - std::string boundary; - if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); } - - // Prepare additional headers - if (close_connection || req.get_header_value("Connection") == "close") { - res.set_header("Connection", "close"); - } else { - std::string s = "timeout="; - s += std::to_string(keep_alive_timeout_sec_); - s += ", max="; - s += std::to_string(keep_alive_max_count_); - res.set_header("Keep-Alive", s); - } - - if ((!res.body.empty() || res.content_length_ > 0 || res.content_provider_) && - !res.has_header("Content-Type")) { - res.set_header("Content-Type", "text/plain"); - } - - if (res.body.empty() && !res.content_length_ && !res.content_provider_ && - !res.has_header("Content-Length")) { - res.set_header("Content-Length", "0"); - } - - if (req.method == "HEAD" && !res.has_header("Accept-Ranges")) { - res.set_header("Accept-Ranges", "bytes"); - } - - if (post_routing_handler_) { post_routing_handler_(req, res); } - - // Response line and headers - { - detail::BufferStream bstrm; - if (!detail::write_response_line(bstrm, res.status)) { return false; } - if (!header_writer_(bstrm, res.headers)) { return false; } - - // Flush buffer - auto &data = bstrm.get_buffer(); - detail::write_data(strm, data.data(), data.size()); - } - - // Body - auto ret = true; - if (req.method != "HEAD") { - if (!res.body.empty()) { - if (!detail::write_data(strm, res.body.data(), res.body.size())) { - ret = false; - } - } else if (res.content_provider_) { - if (write_content_with_provider(strm, req, res, boundary, content_type)) { - res.content_provider_success_ = true; - } else { - ret = false; - } - } - } - - // Log - output_log(req, res); - - return ret; -} - -inline bool -Server::write_content_with_provider(Stream &strm, const Request &req, - Response &res, const std::string &boundary, - const std::string &content_type) { - auto is_shutting_down = [this]() { - return this->svr_sock_ == INVALID_SOCKET; - }; - - if (res.content_length_ > 0) { - if (req.ranges.empty()) { - return detail::write_content(strm, res.content_provider_, 0, - res.content_length_, is_shutting_down); - } else if (req.ranges.size() == 1) { - auto offset_and_length = detail::get_range_offset_and_length( - req.ranges[0], res.content_length_); - - return detail::write_content(strm, res.content_provider_, - offset_and_length.first, - offset_and_length.second, is_shutting_down); - } else { - return detail::write_multipart_ranges_data( - strm, req, res, boundary, content_type, res.content_length_, - is_shutting_down); - } - } else { - if (res.is_chunked_content_provider_) { - auto type = detail::encoding_type(req, res); - - std::unique_ptr compressor; - if (type == detail::EncodingType::Gzip) { -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - compressor = detail::make_unique(); -#endif - } else if (type == detail::EncodingType::Brotli) { -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - compressor = detail::make_unique(); -#endif - } else if (type == detail::EncodingType::Zstd) { -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - compressor = detail::make_unique(); -#endif - } else { - compressor = detail::make_unique(); - } - assert(compressor != nullptr); - - return detail::write_content_chunked(strm, res.content_provider_, - is_shutting_down, *compressor); - } else { - return detail::write_content_without_length(strm, res.content_provider_, - is_shutting_down); - } - } -} - -inline bool Server::read_content(Stream &strm, Request &req, Response &res) { - FormFields::iterator cur_field; - FormFiles::iterator cur_file; - auto is_text_field = false; - size_t count = 0; - if (read_content_core( - strm, req, res, - // Regular - [&](const char *buf, size_t n) { - if (req.body.size() + n > req.body.max_size()) { return false; } - req.body.append(buf, n); - return true; - }, - // Multipart FormData - [&](const FormData &file) { - if (count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { - output_error_log(Error::TooManyFormDataFiles, &req); - return false; - } - - if (file.filename.empty()) { - cur_field = req.form.fields.emplace( - file.name, FormField{file.name, file.content, file.headers}); - is_text_field = true; - } else { - cur_file = req.form.files.emplace(file.name, file); - is_text_field = false; - } - return true; - }, - [&](const char *buf, size_t n) { - if (is_text_field) { - auto &content = cur_field->second.content; - if (content.size() + n > content.max_size()) { return false; } - content.append(buf, n); - } else { - auto &content = cur_file->second.content; - if (content.size() + n > content.max_size()) { return false; } - content.append(buf, n); - } - return true; - })) { - const auto &content_type = req.get_header_value("Content-Type"); - if (!content_type.find("application/x-www-form-urlencoded")) { - if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { - res.status = StatusCode::PayloadTooLarge_413; // NOTE: should be 414? - output_error_log(Error::ExceedMaxPayloadSize, &req); - return false; - } - detail::parse_query_text(req.body, req.params); - } - return true; - } - return false; -} - -inline bool Server::read_content_with_content_receiver( - Stream &strm, Request &req, Response &res, ContentReceiver receiver, - FormDataHeader multipart_header, ContentReceiver multipart_receiver) { - return read_content_core(strm, req, res, std::move(receiver), - std::move(multipart_header), - std::move(multipart_receiver)); -} - -inline bool Server::read_content_core( - Stream &strm, Request &req, Response &res, ContentReceiver receiver, - FormDataHeader multipart_header, ContentReceiver multipart_receiver) const { - detail::FormDataParser multipart_form_data_parser; - ContentReceiverWithProgress out; - - if (req.is_multipart_form_data()) { - const auto &content_type = req.get_header_value("Content-Type"); - std::string boundary; - if (!detail::parse_multipart_boundary(content_type, boundary)) { - res.status = StatusCode::BadRequest_400; - output_error_log(Error::MultipartParsing, &req); - return false; - } - - multipart_form_data_parser.set_boundary(std::move(boundary)); - out = [&](const char *buf, size_t n, size_t /*off*/, size_t /*len*/) { - return multipart_form_data_parser.parse(buf, n, multipart_header, - multipart_receiver); - }; - } else { - out = [receiver](const char *buf, size_t n, size_t /*off*/, - size_t /*len*/) { return receiver(buf, n); }; - } - - if (req.method == "DELETE" && !req.has_header("Content-Length")) { - return true; - } - - if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, - out, true)) { - return false; - } - - if (req.is_multipart_form_data()) { - if (!multipart_form_data_parser.is_valid()) { - res.status = StatusCode::BadRequest_400; - output_error_log(Error::MultipartParsing, &req); - return false; - } - } - - return true; -} - -inline bool Server::handle_file_request(const Request &req, Response &res) { - for (const auto &entry : base_dirs_) { - // Prefix match - if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { - std::string sub_path = "/" + req.path.substr(entry.mount_point.size()); - if (detail::is_valid_path(sub_path)) { - auto path = entry.base_dir + sub_path; - if (path.back() == '/') { path += "index.html"; } - - detail::FileStat stat(path); - - if (stat.is_dir()) { - res.set_redirect(sub_path + "/", StatusCode::MovedPermanently_301); - return true; - } - - if (stat.is_file()) { - for (const auto &kv : entry.headers) { - res.set_header(kv.first, kv.second); - } - - auto mm = std::make_shared(path.c_str()); - if (!mm->is_open()) { - output_error_log(Error::OpenFile, &req); - return false; - } - - res.set_content_provider( - mm->size(), - detail::find_content_type(path, file_extension_and_mimetype_map_, - default_file_mimetype_), - [mm](size_t offset, size_t length, DataSink &sink) -> bool { - sink.write(mm->data() + offset, length); - return true; - }); - - if (req.method != "HEAD" && file_request_handler_) { - file_request_handler_(req, res); - } - - return true; - } else { - output_error_log(Error::OpenFile, &req); - } - } - } - } - return false; -} - -inline socket_t -Server::create_server_socket(const std::string &host, int port, - int socket_flags, - SocketOptions socket_options) const { - return detail::create_socket( - host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, - ipv6_v6only_, std::move(socket_options), - [&](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { - if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { - output_error_log(Error::BindIPAddress, nullptr); - return false; - } - if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { - output_error_log(Error::Listen, nullptr); - return false; - } - return true; - }); -} - -inline int Server::bind_internal(const std::string &host, int port, - int socket_flags) { - if (is_decommissioned) { return -1; } - - if (!is_valid()) { return -1; } - - svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); - if (svr_sock_ == INVALID_SOCKET) { return -1; } - - if (port == 0) { - struct sockaddr_storage addr; - socklen_t addr_len = sizeof(addr); - if (getsockname(svr_sock_, reinterpret_cast(&addr), - &addr_len) == -1) { - output_error_log(Error::GetSockName, nullptr); - return -1; - } - if (addr.ss_family == AF_INET) { - return ntohs(reinterpret_cast(&addr)->sin_port); - } else if (addr.ss_family == AF_INET6) { - return ntohs(reinterpret_cast(&addr)->sin6_port); - } else { - output_error_log(Error::UnsupportedAddressFamily, nullptr); - return -1; - } - } else { - return port; - } -} - -inline bool Server::listen_internal() { - if (is_decommissioned) { return false; } - - auto ret = true; - is_running_ = true; - auto se = detail::scope_exit([&]() { is_running_ = false; }); - - { - std::unique_ptr task_queue(new_task_queue()); - - while (svr_sock_ != INVALID_SOCKET) { -#ifndef _WIN32 - if (idle_interval_sec_ > 0 || idle_interval_usec_ > 0) { -#endif - auto val = detail::select_read(svr_sock_, idle_interval_sec_, - idle_interval_usec_); - if (val == 0) { // Timeout - task_queue->on_idle(); - continue; - } -#ifndef _WIN32 - } -#endif - -#if defined _WIN32 - // sockets connected via WASAccept inherit flags NO_HANDLE_INHERIT, - // OVERLAPPED - socket_t sock = WSAAccept(svr_sock_, nullptr, nullptr, nullptr, 0); -#elif defined SOCK_CLOEXEC - socket_t sock = accept4(svr_sock_, nullptr, nullptr, SOCK_CLOEXEC); -#else - socket_t sock = accept(svr_sock_, nullptr, nullptr); -#endif - - if (sock == INVALID_SOCKET) { - if (errno == EMFILE) { - // The per-process limit of open file descriptors has been reached. - // Try to accept new connections after a short sleep. - std::this_thread::sleep_for(std::chrono::microseconds{1}); - continue; - } else if (errno == EINTR || errno == EAGAIN) { - continue; - } - if (svr_sock_ != INVALID_SOCKET) { - detail::close_socket(svr_sock_); - ret = false; - output_error_log(Error::Connection, nullptr); - } else { - ; // The server socket was closed by user. - } - break; - } - - detail::set_socket_opt_time(sock, SOL_SOCKET, SO_RCVTIMEO, - read_timeout_sec_, read_timeout_usec_); - detail::set_socket_opt_time(sock, SOL_SOCKET, SO_SNDTIMEO, - write_timeout_sec_, write_timeout_usec_); - - if (!task_queue->enqueue( - [this, sock]() { process_and_close_socket(sock); })) { - output_error_log(Error::ResourceExhaustion, nullptr); - detail::shutdown_socket(sock); - detail::close_socket(sock); - } - } - - task_queue->shutdown(); - } - - is_decommissioned = !ret; - return ret; -} - -inline bool Server::routing(Request &req, Response &res, Stream &strm) { - if (pre_routing_handler_ && - pre_routing_handler_(req, res) == HandlerResponse::Handled) { - return true; - } - - // File handler - if ((req.method == "GET" || req.method == "HEAD") && - handle_file_request(req, res)) { - return true; - } - - if (detail::expect_content(req)) { - // Content reader handler - { - ContentReader reader( - [&](ContentReceiver receiver) { - auto result = read_content_with_content_receiver( - strm, req, res, std::move(receiver), nullptr, nullptr); - if (!result) { output_error_log(Error::Read, &req); } - return result; - }, - [&](FormDataHeader header, ContentReceiver receiver) { - auto result = read_content_with_content_receiver( - strm, req, res, nullptr, std::move(header), - std::move(receiver)); - if (!result) { output_error_log(Error::Read, &req); } - return result; - }); - - if (req.method == "POST") { - if (dispatch_request_for_content_reader( - req, res, std::move(reader), - post_handlers_for_content_reader_)) { - return true; - } - } else if (req.method == "PUT") { - if (dispatch_request_for_content_reader( - req, res, std::move(reader), - put_handlers_for_content_reader_)) { - return true; - } - } else if (req.method == "PATCH") { - if (dispatch_request_for_content_reader( - req, res, std::move(reader), - patch_handlers_for_content_reader_)) { - return true; - } - } else if (req.method == "DELETE") { - if (dispatch_request_for_content_reader( - req, res, std::move(reader), - delete_handlers_for_content_reader_)) { - return true; - } - } - } - - // Read content into `req.body` - if (!read_content(strm, req, res)) { - output_error_log(Error::Read, &req); - return false; - } - } - - // Regular handler - if (req.method == "GET" || req.method == "HEAD") { - return dispatch_request(req, res, get_handlers_); - } else if (req.method == "POST") { - return dispatch_request(req, res, post_handlers_); - } else if (req.method == "PUT") { - return dispatch_request(req, res, put_handlers_); - } else if (req.method == "DELETE") { - return dispatch_request(req, res, delete_handlers_); - } else if (req.method == "OPTIONS") { - return dispatch_request(req, res, options_handlers_); - } else if (req.method == "PATCH") { - return dispatch_request(req, res, patch_handlers_); - } - - res.status = StatusCode::BadRequest_400; - return false; -} - -inline bool Server::dispatch_request(Request &req, Response &res, - const Handlers &handlers) const { - for (const auto &x : handlers) { - const auto &matcher = x.first; - const auto &handler = x.second; - - if (matcher->match(req)) { - req.matched_route = matcher->pattern(); - if (!pre_request_handler_ || - pre_request_handler_(req, res) != HandlerResponse::Handled) { - handler(req, res); - } - return true; - } - } - return false; -} - -inline void Server::apply_ranges(const Request &req, Response &res, - std::string &content_type, - std::string &boundary) const { - if (req.ranges.size() > 1 && res.status == StatusCode::PartialContent_206) { - auto it = res.headers.find("Content-Type"); - if (it != res.headers.end()) { - content_type = it->second; - res.headers.erase(it); - } - - boundary = detail::make_multipart_data_boundary(); - - res.set_header("Content-Type", - "multipart/byteranges; boundary=" + boundary); - } - - auto type = detail::encoding_type(req, res); - - if (res.body.empty()) { - if (res.content_length_ > 0) { - size_t length = 0; - if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { - length = res.content_length_; - } else if (req.ranges.size() == 1) { - auto offset_and_length = detail::get_range_offset_and_length( - req.ranges[0], res.content_length_); - - length = offset_and_length.second; - - auto content_range = detail::make_content_range_header_field( - offset_and_length, res.content_length_); - res.set_header("Content-Range", content_range); - } else { - length = detail::get_multipart_ranges_data_length( - req, boundary, content_type, res.content_length_); - } - res.set_header("Content-Length", std::to_string(length)); - } else { - if (res.content_provider_) { - if (res.is_chunked_content_provider_) { - res.set_header("Transfer-Encoding", "chunked"); - if (type == detail::EncodingType::Gzip) { - res.set_header("Content-Encoding", "gzip"); - } else if (type == detail::EncodingType::Brotli) { - res.set_header("Content-Encoding", "br"); - } else if (type == detail::EncodingType::Zstd) { - res.set_header("Content-Encoding", "zstd"); - } - } - } - } - } else { - if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { - ; - } else if (req.ranges.size() == 1) { - auto offset_and_length = - detail::get_range_offset_and_length(req.ranges[0], res.body.size()); - auto offset = offset_and_length.first; - auto length = offset_and_length.second; - - auto content_range = detail::make_content_range_header_field( - offset_and_length, res.body.size()); - res.set_header("Content-Range", content_range); - - assert(offset + length <= res.body.size()); - res.body = res.body.substr(offset, length); - } else { - std::string data; - detail::make_multipart_ranges_data(req, res, boundary, content_type, - res.body.size(), data); - res.body.swap(data); - } - - if (type != detail::EncodingType::None) { - output_pre_compression_log(req, res); - - std::unique_ptr compressor; - std::string content_encoding; - - if (type == detail::EncodingType::Gzip) { -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - compressor = detail::make_unique(); - content_encoding = "gzip"; -#endif - } else if (type == detail::EncodingType::Brotli) { -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - compressor = detail::make_unique(); - content_encoding = "br"; -#endif - } else if (type == detail::EncodingType::Zstd) { -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - compressor = detail::make_unique(); - content_encoding = "zstd"; -#endif - } - - if (compressor) { - std::string compressed; - if (compressor->compress(res.body.data(), res.body.size(), true, - [&](const char *data, size_t data_len) { - compressed.append(data, data_len); - return true; - })) { - res.body.swap(compressed); - res.set_header("Content-Encoding", content_encoding); - } - } - } - - auto length = std::to_string(res.body.size()); - res.set_header("Content-Length", length); - } -} - -inline bool Server::dispatch_request_for_content_reader( - Request &req, Response &res, ContentReader content_reader, - const HandlersForContentReader &handlers) const { - for (const auto &x : handlers) { - const auto &matcher = x.first; - const auto &handler = x.second; - - if (matcher->match(req)) { - req.matched_route = matcher->pattern(); - if (!pre_request_handler_ || - pre_request_handler_(req, res) != HandlerResponse::Handled) { - handler(req, res, content_reader); - } - return true; - } - } - return false; -} - -inline std::string -get_client_ip(const std::string &x_forwarded_for, - const std::vector &trusted_proxies) { - // X-Forwarded-For is a comma-separated list per RFC 7239 - std::vector ip_list; - detail::split(x_forwarded_for.data(), - x_forwarded_for.data() + x_forwarded_for.size(), ',', - [&](const char *b, const char *e) { - auto r = detail::trim(b, e, 0, static_cast(e - b)); - ip_list.emplace_back(std::string(b + r.first, b + r.second)); - }); - - for (size_t i = 0; i < ip_list.size(); ++i) { - auto ip = ip_list[i]; - - auto is_trusted_proxy = - std::any_of(trusted_proxies.begin(), trusted_proxies.end(), - [&](const std::string &proxy) { return ip == proxy; }); - - if (is_trusted_proxy) { - if (i == 0) { - // If the trusted proxy is the first IP, there's no preceding client IP - return ip; - } else { - // Return the IP immediately before the trusted proxy - return ip_list[i - 1]; - } - } - } - - // If no trusted proxy is found, return the first IP in the list - return ip_list.front(); -} - -inline bool -Server::process_request(Stream &strm, const std::string &remote_addr, - int remote_port, const std::string &local_addr, - int local_port, bool close_connection, - bool &connection_closed, - const std::function &setup_request) { - std::array buf{}; - - detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); - - // Connection has been closed on client - if (!line_reader.getline()) { return false; } - - Request req; - req.start_time_ = std::chrono::steady_clock::now(); - - Response res; - res.version = "HTTP/1.1"; - res.headers = default_headers_; - -#ifdef __APPLE__ - // Socket file descriptor exceeded FD_SETSIZE... - if (strm.socket() >= FD_SETSIZE) { - Headers dummy; - detail::read_headers(strm, dummy); - res.status = StatusCode::InternalServerError_500; - output_error_log(Error::ExceedMaxSocketDescriptorCount, &req); - return write_response(strm, close_connection, req, res); - } -#endif - - // Request line and headers - if (!parse_request_line(line_reader.ptr(), req)) { - res.status = StatusCode::BadRequest_400; - output_error_log(Error::InvalidRequestLine, &req); - return write_response(strm, close_connection, req, res); - } - - // Request headers - if (!detail::read_headers(strm, req.headers)) { - res.status = StatusCode::BadRequest_400; - output_error_log(Error::InvalidHeaders, &req); - return write_response(strm, close_connection, req, res); - } - - // Check if the request URI doesn't exceed the limit - if (req.target.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { - Headers dummy; - detail::read_headers(strm, dummy); - res.status = StatusCode::UriTooLong_414; - output_error_log(Error::ExceedUriMaxLength, &req); - return write_response(strm, close_connection, req, res); - } - - if (req.get_header_value("Connection") == "close") { - connection_closed = true; - } - - if (req.version == "HTTP/1.0" && - req.get_header_value("Connection") != "Keep-Alive") { - connection_closed = true; - } - - if (!trusted_proxies_.empty() && req.has_header("X-Forwarded-For")) { - auto x_forwarded_for = req.get_header_value("X-Forwarded-For"); - req.remote_addr = get_client_ip(x_forwarded_for, trusted_proxies_); - } else { - req.remote_addr = remote_addr; - } - req.remote_port = remote_port; - - req.local_addr = local_addr; - req.local_port = local_port; - - if (req.has_header("Accept")) { - const auto &accept_header = req.get_header_value("Accept"); - if (!detail::parse_accept_header(accept_header, req.accept_content_types)) { - res.status = StatusCode::BadRequest_400; - output_error_log(Error::HTTPParsing, &req); - return write_response(strm, close_connection, req, res); - } - } - - if (req.has_header("Range")) { - const auto &range_header_value = req.get_header_value("Range"); - if (!detail::parse_range_header(range_header_value, req.ranges)) { - res.status = StatusCode::RangeNotSatisfiable_416; - output_error_log(Error::InvalidRangeHeader, &req); - return write_response(strm, close_connection, req, res); - } - } - - if (setup_request) { setup_request(req); } - - if (req.get_header_value("Expect") == "100-continue") { - int status = StatusCode::Continue_100; - if (expect_100_continue_handler_) { - status = expect_100_continue_handler_(req, res); - } - switch (status) { - case StatusCode::Continue_100: - case StatusCode::ExpectationFailed_417: - detail::write_response_line(strm, status); - strm.write("\r\n"); - break; - default: - connection_closed = true; - return write_response(strm, true, req, res); - } - } - - // Setup `is_connection_closed` method - auto sock = strm.socket(); - req.is_connection_closed = [sock]() { - return !detail::is_socket_alive(sock); - }; - - // Routing - auto routed = false; -#ifdef CPPHTTPLIB_NO_EXCEPTIONS - routed = routing(req, res, strm); -#else - try { - routed = routing(req, res, strm); - } catch (std::exception &e) { - if (exception_handler_) { - auto ep = std::current_exception(); - exception_handler_(req, res, ep); - routed = true; - } else { - res.status = StatusCode::InternalServerError_500; - std::string val; - auto s = e.what(); - for (size_t i = 0; s[i]; i++) { - switch (s[i]) { - case '\r': val += "\\r"; break; - case '\n': val += "\\n"; break; - default: val += s[i]; break; - } - } - res.set_header("EXCEPTION_WHAT", val); - } - } catch (...) { - if (exception_handler_) { - auto ep = std::current_exception(); - exception_handler_(req, res, ep); - routed = true; - } else { - res.status = StatusCode::InternalServerError_500; - res.set_header("EXCEPTION_WHAT", "UNKNOWN"); - } - } -#endif - if (routed) { - if (res.status == -1) { - res.status = req.ranges.empty() ? StatusCode::OK_200 - : StatusCode::PartialContent_206; - } - - // Serve file content by using a content provider - if (!res.file_content_path_.empty()) { - const auto &path = res.file_content_path_; - auto mm = std::make_shared(path.c_str()); - if (!mm->is_open()) { - res.body.clear(); - res.content_length_ = 0; - res.content_provider_ = nullptr; - res.status = StatusCode::NotFound_404; - output_error_log(Error::OpenFile, &req); - return write_response(strm, close_connection, req, res); - } - - auto content_type = res.file_content_content_type_; - if (content_type.empty()) { - content_type = detail::find_content_type( - path, file_extension_and_mimetype_map_, default_file_mimetype_); - } - - res.set_content_provider( - mm->size(), content_type, - [mm](size_t offset, size_t length, DataSink &sink) -> bool { - sink.write(mm->data() + offset, length); - return true; - }); - } - - if (detail::range_error(req, res)) { - res.body.clear(); - res.content_length_ = 0; - res.content_provider_ = nullptr; - res.status = StatusCode::RangeNotSatisfiable_416; - return write_response(strm, close_connection, req, res); - } - - return write_response_with_content(strm, close_connection, req, res); - } else { - if (res.status == -1) { res.status = StatusCode::NotFound_404; } - - return write_response(strm, close_connection, req, res); - } -} - -inline bool Server::is_valid() const { return true; } - -inline bool Server::process_and_close_socket(socket_t sock) { - std::string remote_addr; - int remote_port = 0; - detail::get_remote_ip_and_port(sock, remote_addr, remote_port); - - std::string local_addr; - int local_port = 0; - detail::get_local_ip_and_port(sock, local_addr, local_port); - - auto ret = detail::process_server_socket( - svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_, - read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, - write_timeout_usec_, - [&](Stream &strm, bool close_connection, bool &connection_closed) { - return process_request(strm, remote_addr, remote_port, local_addr, - local_port, close_connection, connection_closed, - nullptr); - }); - - detail::shutdown_socket(sock); - detail::close_socket(sock); - return ret; -} - -inline void Server::output_log(const Request &req, const Response &res) const { - if (logger_) { - std::lock_guard guard(logger_mutex_); - logger_(req, res); - } -} - -inline void Server::output_pre_compression_log(const Request &req, - const Response &res) const { - if (pre_compression_logger_) { - std::lock_guard guard(logger_mutex_); - pre_compression_logger_(req, res); - } -} - -inline void Server::output_error_log(const Error &err, - const Request *req) const { - if (error_logger_) { - std::lock_guard guard(logger_mutex_); - error_logger_(err, req); - } -} - -// HTTP client implementation -inline ClientImpl::ClientImpl(const std::string &host) - : ClientImpl(host, 80, std::string(), std::string()) {} - -inline ClientImpl::ClientImpl(const std::string &host, int port) - : ClientImpl(host, port, std::string(), std::string()) {} - -inline ClientImpl::ClientImpl(const std::string &host, int port, - const std::string &client_cert_path, - const std::string &client_key_path) - : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), - host_and_port_(detail::make_host_and_port_string(host_, port, is_ssl())), - client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} - -inline ClientImpl::~ClientImpl() { - // Wait until all the requests in flight are handled. - size_t retry_count = 10; - while (retry_count-- > 0) { - { - std::lock_guard guard(socket_mutex_); - if (socket_requests_in_flight_ == 0) { break; } - } - std::this_thread::sleep_for(std::chrono::milliseconds{1}); - } - - std::lock_guard guard(socket_mutex_); - shutdown_socket(socket_); - close_socket(socket_); -} - -inline bool ClientImpl::is_valid() const { return true; } - -inline void ClientImpl::copy_settings(const ClientImpl &rhs) { - client_cert_path_ = rhs.client_cert_path_; - client_key_path_ = rhs.client_key_path_; - connection_timeout_sec_ = rhs.connection_timeout_sec_; - read_timeout_sec_ = rhs.read_timeout_sec_; - read_timeout_usec_ = rhs.read_timeout_usec_; - write_timeout_sec_ = rhs.write_timeout_sec_; - write_timeout_usec_ = rhs.write_timeout_usec_; - max_timeout_msec_ = rhs.max_timeout_msec_; - basic_auth_username_ = rhs.basic_auth_username_; - basic_auth_password_ = rhs.basic_auth_password_; - bearer_token_auth_token_ = rhs.bearer_token_auth_token_; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - digest_auth_username_ = rhs.digest_auth_username_; - digest_auth_password_ = rhs.digest_auth_password_; -#endif - keep_alive_ = rhs.keep_alive_; - follow_location_ = rhs.follow_location_; - path_encode_ = rhs.path_encode_; - address_family_ = rhs.address_family_; - tcp_nodelay_ = rhs.tcp_nodelay_; - ipv6_v6only_ = rhs.ipv6_v6only_; - socket_options_ = rhs.socket_options_; - compress_ = rhs.compress_; - decompress_ = rhs.decompress_; - interface_ = rhs.interface_; - proxy_host_ = rhs.proxy_host_; - proxy_port_ = rhs.proxy_port_; - proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_; - proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_; - proxy_bearer_token_auth_token_ = rhs.proxy_bearer_token_auth_token_; -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_; - proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_; -#endif -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - ca_cert_file_path_ = rhs.ca_cert_file_path_; - ca_cert_dir_path_ = rhs.ca_cert_dir_path_; - ca_cert_store_ = rhs.ca_cert_store_; -#endif -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - server_certificate_verification_ = rhs.server_certificate_verification_; - server_hostname_verification_ = rhs.server_hostname_verification_; - server_certificate_verifier_ = rhs.server_certificate_verifier_; -#endif - logger_ = rhs.logger_; - error_logger_ = rhs.error_logger_; -} - -inline socket_t ClientImpl::create_client_socket(Error &error) const { - if (!proxy_host_.empty() && proxy_port_ != -1) { - return detail::create_client_socket( - proxy_host_, std::string(), proxy_port_, address_family_, tcp_nodelay_, - ipv6_v6only_, socket_options_, connection_timeout_sec_, - connection_timeout_usec_, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_, interface_, error); - } - - // Check is custom IP specified for host_ - std::string ip; - auto it = addr_map_.find(host_); - if (it != addr_map_.end()) { ip = it->second; } - - return detail::create_client_socket( - host_, ip, port_, address_family_, tcp_nodelay_, ipv6_v6only_, - socket_options_, connection_timeout_sec_, connection_timeout_usec_, - read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, - write_timeout_usec_, interface_, error); -} - -inline bool ClientImpl::create_and_connect_socket(Socket &socket, - Error &error) { - auto sock = create_client_socket(error); - if (sock == INVALID_SOCKET) { return false; } - socket.sock = sock; - return true; -} - -inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, - bool /*shutdown_gracefully*/) { - // If there are any requests in flight from threads other than us, then it's - // a thread-unsafe race because individual ssl* objects are not thread-safe. - assert(socket_requests_in_flight_ == 0 || - socket_requests_are_from_thread_ == std::this_thread::get_id()); -} - -inline void ClientImpl::shutdown_socket(Socket &socket) const { - if (socket.sock == INVALID_SOCKET) { return; } - detail::shutdown_socket(socket.sock); -} - -inline void ClientImpl::close_socket(Socket &socket) { - // If there are requests in flight in another thread, usually closing - // the socket will be fine and they will simply receive an error when - // using the closed socket, but it is still a bug since rarely the OS - // may reassign the socket id to be used for a new socket, and then - // suddenly they will be operating on a live socket that is different - // than the one they intended! - assert(socket_requests_in_flight_ == 0 || - socket_requests_are_from_thread_ == std::this_thread::get_id()); - - // It is also a bug if this happens while SSL is still active -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - assert(socket.ssl == nullptr); -#endif - if (socket.sock == INVALID_SOCKET) { return; } - detail::close_socket(socket.sock); - socket.sock = INVALID_SOCKET; -} - -inline bool ClientImpl::read_response_line(Stream &strm, const Request &req, - Response &res) const { - std::array buf{}; - - detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); - - if (!line_reader.getline()) { return false; } - -#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR - thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r?\n"); -#else - thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r\n"); -#endif - - std::cmatch m; - if (!std::regex_match(line_reader.ptr(), m, re)) { - return req.method == "CONNECT"; - } - res.version = std::string(m[1]); - res.status = std::stoi(std::string(m[2])); - res.reason = std::string(m[3]); - - // Ignore '100 Continue' - while (res.status == StatusCode::Continue_100) { - if (!line_reader.getline()) { return false; } // CRLF - if (!line_reader.getline()) { return false; } // next response line - - if (!std::regex_match(line_reader.ptr(), m, re)) { return false; } - res.version = std::string(m[1]); - res.status = std::stoi(std::string(m[2])); - res.reason = std::string(m[3]); - } - - return true; -} - -inline bool ClientImpl::send(Request &req, Response &res, Error &error) { - std::lock_guard request_mutex_guard(request_mutex_); - auto ret = send_(req, res, error); - if (error == Error::SSLPeerCouldBeClosed_) { - assert(!ret); - ret = send_(req, res, error); - } - return ret; -} - -inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { - { - std::lock_guard guard(socket_mutex_); - - // Set this to false immediately - if it ever gets set to true by the end - // of the request, we know another thread instructed us to close the - // socket. - socket_should_be_closed_when_request_is_done_ = false; - - auto is_alive = false; - if (socket_.is_open()) { - is_alive = detail::is_socket_alive(socket_.sock); - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (is_alive && is_ssl()) { - if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { - is_alive = false; - } - } -#endif - - if (!is_alive) { - // Attempt to avoid sigpipe by shutting down non-gracefully if it - // seems like the other side has already closed the connection Also, - // there cannot be any requests in flight from other threads since we - // locked request_mutex_, so safe to close everything immediately - const bool shutdown_gracefully = false; - shutdown_ssl(socket_, shutdown_gracefully); - shutdown_socket(socket_); - close_socket(socket_); - } - } - - if (!is_alive) { - if (!create_and_connect_socket(socket_, error)) { - output_error_log(error, &req); - return false; - } - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - // TODO: refactoring - if (is_ssl()) { - auto &scli = static_cast(*this); - if (!proxy_host_.empty() && proxy_port_ != -1) { - auto success = false; - if (!scli.connect_with_proxy(socket_, req.start_time_, res, success, - error)) { - if (!success) { output_error_log(error, &req); } - return success; - } - } - - if (!scli.initialize_ssl(socket_, error)) { - output_error_log(error, &req); - return false; - } - } -#endif - } - - // Mark the current socket as being in use so that it cannot be closed by - // anyone else while this request is ongoing, even though we will be - // releasing the mutex. - if (socket_requests_in_flight_ > 1) { - assert(socket_requests_are_from_thread_ == std::this_thread::get_id()); - } - socket_requests_in_flight_ += 1; - socket_requests_are_from_thread_ = std::this_thread::get_id(); - } - - for (const auto &header : default_headers_) { - if (req.headers.find(header.first) == req.headers.end()) { - req.headers.insert(header); - } - } - - auto ret = false; - auto close_connection = !keep_alive_; - - auto se = detail::scope_exit([&]() { - // Briefly lock mutex in order to mark that a request is no longer ongoing - std::lock_guard guard(socket_mutex_); - socket_requests_in_flight_ -= 1; - if (socket_requests_in_flight_ <= 0) { - assert(socket_requests_in_flight_ == 0); - socket_requests_are_from_thread_ = std::thread::id(); - } - - if (socket_should_be_closed_when_request_is_done_ || close_connection || - !ret) { - shutdown_ssl(socket_, true); - shutdown_socket(socket_); - close_socket(socket_); - } - }); - - ret = process_socket(socket_, req.start_time_, [&](Stream &strm) { - return handle_request(strm, req, res, close_connection, error); - }); - - if (!ret) { - if (error == Error::Success) { - error = Error::Unknown; - output_error_log(error, &req); - } - } - - return ret; -} - -inline Result ClientImpl::send(const Request &req) { - auto req2 = req; - return send_(std::move(req2)); -} - -inline Result ClientImpl::send_(Request &&req) { - auto res = detail::make_unique(); - auto error = Error::Success; - auto ret = send(req, *res, error); -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers), - last_ssl_error_, last_openssl_error_}; -#else - return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; -#endif -} - -inline bool ClientImpl::handle_request(Stream &strm, Request &req, - Response &res, bool close_connection, - Error &error) { - if (req.path.empty()) { - error = Error::Connection; - output_error_log(error, &req); - return false; - } - - auto req_save = req; - - bool ret; - - if (!is_ssl() && !proxy_host_.empty() && proxy_port_ != -1) { - auto req2 = req; - req2.path = "http://" + host_and_port_ + req.path; - ret = process_request(strm, req2, res, close_connection, error); - req = req2; - req.path = req_save.path; - } else { - ret = process_request(strm, req, res, close_connection, error); - } - - if (!ret) { return false; } - - if (res.get_header_value("Connection") == "close" || - (res.version == "HTTP/1.0" && res.reason != "Connection established")) { - // TODO this requires a not-entirely-obvious chain of calls to be correct - // for this to be safe. - - // This is safe to call because handle_request is only called by send_ - // which locks the request mutex during the process. It would be a bug - // to call it from a different thread since it's a thread-safety issue - // to do these things to the socket if another thread is using the socket. - std::lock_guard guard(socket_mutex_); - shutdown_ssl(socket_, true); - shutdown_socket(socket_); - close_socket(socket_); - } - - if (300 < res.status && res.status < 400 && follow_location_) { - req = req_save; - ret = redirect(req, res, error); - } - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if ((res.status == StatusCode::Unauthorized_401 || - res.status == StatusCode::ProxyAuthenticationRequired_407) && - req.authorization_count_ < 5) { - auto is_proxy = res.status == StatusCode::ProxyAuthenticationRequired_407; - const auto &username = - is_proxy ? proxy_digest_auth_username_ : digest_auth_username_; - const auto &password = - is_proxy ? proxy_digest_auth_password_ : digest_auth_password_; - - if (!username.empty() && !password.empty()) { - std::map auth; - if (detail::parse_www_authenticate(res, auth, is_proxy)) { - Request new_req = req; - new_req.authorization_count_ += 1; - new_req.headers.erase(is_proxy ? "Proxy-Authorization" - : "Authorization"); - new_req.headers.insert(detail::make_digest_authentication_header( - req, auth, new_req.authorization_count_, detail::random_string(10), - username, password, is_proxy)); - - Response new_res; - - ret = send(new_req, new_res, error); - if (ret) { res = new_res; } - } - } - } -#endif - - return ret; -} - -inline bool ClientImpl::redirect(Request &req, Response &res, Error &error) { - if (req.redirect_count_ == 0) { - error = Error::ExceedRedirectCount; - output_error_log(error, &req); - return false; - } - - auto location = res.get_header_value("location"); - if (location.empty()) { return false; } - - thread_local const std::regex re( - R"((?:(https?):)?(?://(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)?([^?#]*)(\?[^#]*)?(?:#.*)?)"); - - std::smatch m; - if (!std::regex_match(location, m, re)) { return false; } - - auto scheme = is_ssl() ? "https" : "http"; - - auto next_scheme = m[1].str(); - auto next_host = m[2].str(); - if (next_host.empty()) { next_host = m[3].str(); } - auto port_str = m[4].str(); - auto next_path = m[5].str(); - auto next_query = m[6].str(); - - auto next_port = port_; - if (!port_str.empty()) { - next_port = std::stoi(port_str); - } else if (!next_scheme.empty()) { - next_port = next_scheme == "https" ? 443 : 80; - } - - if (next_scheme.empty()) { next_scheme = scheme; } - if (next_host.empty()) { next_host = host_; } - if (next_path.empty()) { next_path = "/"; } - - auto path = decode_query_component(next_path, true) + next_query; - - // Same host redirect - use current client - if (next_scheme == scheme && next_host == host_ && next_port == port_) { - return detail::redirect(*this, req, res, path, location, error); - } - - // Cross-host/scheme redirect - create new client with robust setup - return create_redirect_client(next_scheme, next_host, next_port, req, res, - path, location, error); -} - -// New method for robust redirect client creation -inline bool ClientImpl::create_redirect_client( - const std::string &scheme, const std::string &host, int port, Request &req, - Response &res, const std::string &path, const std::string &location, - Error &error) { - // Determine if we need SSL - auto need_ssl = (scheme == "https"); - - // Clean up request headers that are host/client specific - // Remove headers that should not be carried over to new host - auto headers_to_remove = - std::vector{"Host", "Proxy-Authorization", "Authorization"}; - - for (const auto &header_name : headers_to_remove) { - auto it = req.headers.find(header_name); - while (it != req.headers.end()) { - it = req.headers.erase(it); - it = req.headers.find(header_name); - } - } - - // Create appropriate client type and handle redirect - if (need_ssl) { -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - // Create SSL client for HTTPS redirect - SSLClient redirect_client(host, port); - - // Setup basic client configuration first - setup_redirect_client(redirect_client); - - // SSL-specific configuration for proxy environments - if (!proxy_host_.empty() && proxy_port_ != -1) { - // Critical: Disable SSL verification for proxy environments - redirect_client.enable_server_certificate_verification(false); - redirect_client.enable_server_hostname_verification(false); - } else { - // For direct SSL connections, copy SSL verification settings - redirect_client.enable_server_certificate_verification( - server_certificate_verification_); - redirect_client.enable_server_hostname_verification( - server_hostname_verification_); - } - - // Handle CA certificate store and paths if available - if (ca_cert_store_ && X509_STORE_up_ref(ca_cert_store_)) { - redirect_client.set_ca_cert_store(ca_cert_store_); - } - if (!ca_cert_file_path_.empty()) { - redirect_client.set_ca_cert_path(ca_cert_file_path_, ca_cert_dir_path_); - } - - // Client certificates are set through constructor for SSLClient - // NOTE: SSLClient constructor already takes client_cert_path and - // client_key_path so we need to create it properly if client certs are - // needed - - // Execute the redirect - return detail::redirect(redirect_client, req, res, path, location, error); -#else - // SSL not supported - set appropriate error - error = Error::SSLConnection; - output_error_log(error, &req); - return false; -#endif - } else { - // HTTP redirect - ClientImpl redirect_client(host, port); - - // Setup client with robust configuration - setup_redirect_client(redirect_client); - - // Execute the redirect - return detail::redirect(redirect_client, req, res, path, location, error); - } -} - -// New method for robust client setup (based on basic_manual_redirect.cpp -// logic) -template -inline void ClientImpl::setup_redirect_client(ClientType &client) { - // Copy basic settings first - client.set_connection_timeout(connection_timeout_sec_); - client.set_read_timeout(read_timeout_sec_, read_timeout_usec_); - client.set_write_timeout(write_timeout_sec_, write_timeout_usec_); - client.set_keep_alive(keep_alive_); - client.set_follow_location( - true); // Enable redirects to handle multi-step redirects - client.set_path_encode(path_encode_); - client.set_compress(compress_); - client.set_decompress(decompress_); - - // Copy authentication settings BEFORE proxy setup - if (!basic_auth_username_.empty()) { - client.set_basic_auth(basic_auth_username_, basic_auth_password_); - } - if (!bearer_token_auth_token_.empty()) { - client.set_bearer_token_auth(bearer_token_auth_token_); - } -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (!digest_auth_username_.empty()) { - client.set_digest_auth(digest_auth_username_, digest_auth_password_); - } -#endif - - // Setup proxy configuration (CRITICAL ORDER - proxy must be set - // before proxy auth) - if (!proxy_host_.empty() && proxy_port_ != -1) { - // First set proxy host and port - client.set_proxy(proxy_host_, proxy_port_); - - // Then set proxy authentication (order matters!) - if (!proxy_basic_auth_username_.empty()) { - client.set_proxy_basic_auth(proxy_basic_auth_username_, - proxy_basic_auth_password_); - } - if (!proxy_bearer_token_auth_token_.empty()) { - client.set_proxy_bearer_token_auth(proxy_bearer_token_auth_token_); - } -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (!proxy_digest_auth_username_.empty()) { - client.set_proxy_digest_auth(proxy_digest_auth_username_, - proxy_digest_auth_password_); - } -#endif - } - - // Copy network and socket settings - client.set_address_family(address_family_); - client.set_tcp_nodelay(tcp_nodelay_); - client.set_ipv6_v6only(ipv6_v6only_); - if (socket_options_) { client.set_socket_options(socket_options_); } - if (!interface_.empty()) { client.set_interface(interface_); } - - // Copy logging and headers - if (logger_) { client.set_logger(logger_); } - if (error_logger_) { client.set_error_logger(error_logger_); } - - // NOTE: DO NOT copy default_headers_ as they may contain stale Host headers - // Each new client should generate its own headers based on its target host -} - -inline bool ClientImpl::write_content_with_provider(Stream &strm, - const Request &req, - Error &error) const { - auto is_shutting_down = []() { return false; }; - - if (req.is_chunked_content_provider_) { - // TODO: Brotli support - std::unique_ptr compressor; -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - if (compress_) { - compressor = detail::make_unique(); - } else -#endif - { - compressor = detail::make_unique(); - } - - return detail::write_content_chunked(strm, req.content_provider_, - is_shutting_down, *compressor, error); - } else { - return detail::write_content_with_progress( - strm, req.content_provider_, 0, req.content_length_, is_shutting_down, - req.upload_progress, error); - } -} - -inline bool ClientImpl::write_request(Stream &strm, Request &req, - bool close_connection, Error &error) { - // Prepare additional headers - if (close_connection) { - if (!req.has_header("Connection")) { - req.set_header("Connection", "close"); - } - } - - if (!req.has_header("Host")) { - // For Unix socket connections, use "localhost" as Host header (similar to - // curl behavior) - if (address_family_ == AF_UNIX) { - req.set_header("Host", "localhost"); - } else { - req.set_header("Host", host_and_port_); - } - } - - if (!req.has_header("Accept")) { req.set_header("Accept", "*/*"); } - - if (!req.content_receiver) { - if (!req.has_header("Accept-Encoding")) { - std::string accept_encoding; -#ifdef CPPHTTPLIB_BROTLI_SUPPORT - accept_encoding = "br"; -#endif -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - if (!accept_encoding.empty()) { accept_encoding += ", "; } - accept_encoding += "gzip, deflate"; -#endif -#ifdef CPPHTTPLIB_ZSTD_SUPPORT - if (!accept_encoding.empty()) { accept_encoding += ", "; } - accept_encoding += "zstd"; -#endif - req.set_header("Accept-Encoding", accept_encoding); - } - -#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT - if (!req.has_header("User-Agent")) { - auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; - req.set_header("User-Agent", agent); - } -#endif - }; - - if (req.body.empty()) { - if (req.content_provider_) { - if (!req.is_chunked_content_provider_) { - if (!req.has_header("Content-Length")) { - auto length = std::to_string(req.content_length_); - req.set_header("Content-Length", length); - } - } - } else { - if (req.method == "POST" || req.method == "PUT" || - req.method == "PATCH") { - req.set_header("Content-Length", "0"); - } - } - } else { - if (!req.has_header("Content-Type")) { - req.set_header("Content-Type", "text/plain"); - } - - if (!req.has_header("Content-Length")) { - auto length = std::to_string(req.body.size()); - req.set_header("Content-Length", length); - } - } - - if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { - if (!req.has_header("Authorization")) { - req.headers.insert(make_basic_authentication_header( - basic_auth_username_, basic_auth_password_, false)); - } - } - - if (!proxy_basic_auth_username_.empty() && - !proxy_basic_auth_password_.empty()) { - if (!req.has_header("Proxy-Authorization")) { - req.headers.insert(make_basic_authentication_header( - proxy_basic_auth_username_, proxy_basic_auth_password_, true)); - } - } - - if (!bearer_token_auth_token_.empty()) { - if (!req.has_header("Authorization")) { - req.headers.insert(make_bearer_token_authentication_header( - bearer_token_auth_token_, false)); - } - } - - if (!proxy_bearer_token_auth_token_.empty()) { - if (!req.has_header("Proxy-Authorization")) { - req.headers.insert(make_bearer_token_authentication_header( - proxy_bearer_token_auth_token_, true)); - } - } - - // Request line and headers - { - detail::BufferStream bstrm; - - // Extract path and query from req.path - std::string path_part, query_part; - auto query_pos = req.path.find('?'); - if (query_pos != std::string::npos) { - path_part = req.path.substr(0, query_pos); - query_part = req.path.substr(query_pos + 1); - } else { - path_part = req.path; - query_part = ""; - } - - // Encode path and query - auto path_with_query = - path_encode_ ? detail::encode_path(path_part) : path_part; - - detail::parse_query_text(query_part, req.params); - if (!req.params.empty()) { - path_with_query = append_query_params(path_with_query, req.params); - } - - // Write request line and headers - detail::write_request_line(bstrm, req.method, path_with_query); - header_writer_(bstrm, req.headers); - - // Flush buffer - auto &data = bstrm.get_buffer(); - if (!detail::write_data(strm, data.data(), data.size())) { - error = Error::Write; - output_error_log(error, &req); - return false; - } - } - - // Body - if (req.body.empty()) { - return write_content_with_provider(strm, req, error); - } - - if (req.upload_progress) { - auto body_size = req.body.size(); - size_t written = 0; - auto data = req.body.data(); - - while (written < body_size) { - size_t to_write = (std::min)(CPPHTTPLIB_SEND_BUFSIZ, body_size - written); - if (!detail::write_data(strm, data + written, to_write)) { - error = Error::Write; - output_error_log(error, &req); - return false; - } - written += to_write; - - if (!req.upload_progress(written, body_size)) { - error = Error::Canceled; - output_error_log(error, &req); - return false; - } - } - } else { - if (!detail::write_data(strm, req.body.data(), req.body.size())) { - error = Error::Write; - output_error_log(error, &req); - return false; - } - } - - return true; -} - -inline std::unique_ptr ClientImpl::send_with_content_provider( - Request &req, const char *body, size_t content_length, - ContentProvider content_provider, - ContentProviderWithoutLength content_provider_without_length, - const std::string &content_type, Error &error) { - if (!content_type.empty()) { req.set_header("Content-Type", content_type); } - -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - if (compress_) { req.set_header("Content-Encoding", "gzip"); } -#endif - -#ifdef CPPHTTPLIB_ZLIB_SUPPORT - if (compress_ && !content_provider_without_length) { - // TODO: Brotli support - detail::gzip_compressor compressor; - - if (content_provider) { - auto ok = true; - size_t offset = 0; - DataSink data_sink; - - data_sink.write = [&](const char *data, size_t data_len) -> bool { - if (ok) { - auto last = offset + data_len == content_length; - - auto ret = compressor.compress( - data, data_len, last, - [&](const char *compressed_data, size_t compressed_data_len) { - req.body.append(compressed_data, compressed_data_len); - return true; - }); - - if (ret) { - offset += data_len; - } else { - ok = false; - } - } - return ok; - }; - - while (ok && offset < content_length) { - if (!content_provider(offset, content_length - offset, data_sink)) { - error = Error::Canceled; - output_error_log(error, &req); - return nullptr; - } - } - } else { - if (!compressor.compress(body, content_length, true, - [&](const char *data, size_t data_len) { - req.body.append(data, data_len); - return true; - })) { - error = Error::Compression; - output_error_log(error, &req); - return nullptr; - } - } - } else -#endif - { - if (content_provider) { - req.content_length_ = content_length; - req.content_provider_ = std::move(content_provider); - req.is_chunked_content_provider_ = false; - } else if (content_provider_without_length) { - req.content_length_ = 0; - req.content_provider_ = detail::ContentProviderAdapter( - std::move(content_provider_without_length)); - req.is_chunked_content_provider_ = true; - req.set_header("Transfer-Encoding", "chunked"); - } else { - req.body.assign(body, content_length); - } - } - - auto res = detail::make_unique(); - return send(req, *res, error) ? std::move(res) : nullptr; -} - -inline Result ClientImpl::send_with_content_provider( - const std::string &method, const std::string &path, const Headers &headers, - const char *body, size_t content_length, ContentProvider content_provider, - ContentProviderWithoutLength content_provider_without_length, - const std::string &content_type, UploadProgress progress) { - Request req; - req.method = method; - req.headers = headers; - req.path = path; - req.upload_progress = std::move(progress); - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - auto error = Error::Success; - - auto res = send_with_content_provider( - req, body, content_length, std::move(content_provider), - std::move(content_provider_without_length), content_type, error); - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - return Result{std::move(res), error, std::move(req.headers), last_ssl_error_, - last_openssl_error_}; -#else - return Result{std::move(res), error, std::move(req.headers)}; -#endif -} - -inline void ClientImpl::output_log(const Request &req, - const Response &res) const { - if (logger_) { - std::lock_guard guard(logger_mutex_); - logger_(req, res); - } -} - -inline void ClientImpl::output_error_log(const Error &err, - const Request *req) const { - if (error_logger_) { - std::lock_guard guard(logger_mutex_); - error_logger_(err, req); - } -} - -inline bool ClientImpl::process_request(Stream &strm, Request &req, - Response &res, bool close_connection, - Error &error) { - // Send request - if (!write_request(strm, req, close_connection, error)) { return false; } - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (is_ssl()) { - auto is_proxy_enabled = !proxy_host_.empty() && proxy_port_ != -1; - if (!is_proxy_enabled) { - if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { - error = Error::SSLPeerCouldBeClosed_; - output_error_log(error, &req); - return false; - } - } - } -#endif - - // Receive response and headers - if (!read_response_line(strm, req, res) || - !detail::read_headers(strm, res.headers)) { - error = Error::Read; - output_error_log(error, &req); - return false; - } - - // Body - if ((res.status != StatusCode::NoContent_204) && req.method != "HEAD" && - req.method != "CONNECT") { - auto redirect = 300 < res.status && res.status < 400 && - res.status != StatusCode::NotModified_304 && - follow_location_; - - if (req.response_handler && !redirect) { - if (!req.response_handler(res)) { - error = Error::Canceled; - output_error_log(error, &req); - return false; - } - } - - auto out = - req.content_receiver - ? static_cast( - [&](const char *buf, size_t n, size_t off, size_t len) { - if (redirect) { return true; } - auto ret = req.content_receiver(buf, n, off, len); - if (!ret) { - error = Error::Canceled; - output_error_log(error, &req); - } - return ret; - }) - : static_cast( - [&](const char *buf, size_t n, size_t /*off*/, - size_t /*len*/) { - assert(res.body.size() + n <= res.body.max_size()); - res.body.append(buf, n); - return true; - }); - - auto progress = [&](size_t current, size_t total) { - if (!req.download_progress || redirect) { return true; } - auto ret = req.download_progress(current, total); - if (!ret) { - error = Error::Canceled; - output_error_log(error, &req); - } - return ret; - }; - - if (res.has_header("Content-Length")) { - if (!req.content_receiver) { - auto len = res.get_header_value_u64("Content-Length"); - if (len > res.body.max_size()) { - error = Error::Read; - output_error_log(error, &req); - return false; - } - res.body.reserve(static_cast(len)); - } - } - - if (res.status != StatusCode::NotModified_304) { - int dummy_status; - if (!detail::read_content(strm, res, (std::numeric_limits::max)(), - dummy_status, std::move(progress), - std::move(out), decompress_)) { - if (error != Error::Canceled) { error = Error::Read; } - output_error_log(error, &req); - return false; - } - } - } - - // Log - output_log(req, res); - - return true; -} - -inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( - const std::string &boundary, const UploadFormDataItems &items, - const FormDataProviderItems &provider_items) const { - size_t cur_item = 0; - size_t cur_start = 0; - // cur_item and cur_start are copied to within the std::function and - // maintain state between successive calls - return [&, cur_item, cur_start](size_t offset, - DataSink &sink) mutable -> bool { - if (!offset && !items.empty()) { - sink.os << detail::serialize_multipart_formdata(items, boundary, false); - return true; - } else if (cur_item < provider_items.size()) { - if (!cur_start) { - const auto &begin = detail::serialize_multipart_formdata_item_begin( - provider_items[cur_item], boundary); - offset += begin.size(); - cur_start = offset; - sink.os << begin; - } - - DataSink cur_sink; - auto has_data = true; - cur_sink.write = sink.write; - cur_sink.done = [&]() { has_data = false; }; - - if (!provider_items[cur_item].provider(offset - cur_start, cur_sink)) { - return false; - } - - if (!has_data) { - sink.os << detail::serialize_multipart_formdata_item_end(); - cur_item++; - cur_start = 0; - } - return true; - } else { - sink.os << detail::serialize_multipart_formdata_finish(boundary); - sink.done(); - return true; - } - }; -} - -inline bool ClientImpl::process_socket( - const Socket &socket, - std::chrono::time_point start_time, - std::function callback) { - return detail::process_client_socket( - socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, - write_timeout_usec_, max_timeout_msec_, start_time, std::move(callback)); -} - -inline bool ClientImpl::is_ssl() const { return false; } - -inline Result ClientImpl::Get(const std::string &path, - DownloadProgress progress) { - return Get(path, Headers(), std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, - const Headers &headers, - DownloadProgress progress) { - if (params.empty()) { return Get(path, headers); } - - std::string path_with_query = append_query_params(path, params); - return Get(path_with_query, headers, std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, const Headers &headers, - DownloadProgress progress) { - Request req; - req.method = "GET"; - req.path = path; - req.headers = headers; - req.download_progress = std::move(progress); - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Get(const std::string &path, - ContentReceiver content_receiver, - DownloadProgress progress) { - return Get(path, Headers(), nullptr, std::move(content_receiver), - std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver, - DownloadProgress progress) { - return Get(path, headers, nullptr, std::move(content_receiver), - std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - return Get(path, Headers(), std::move(response_handler), - std::move(content_receiver), std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - Request req; - req.method = "GET"; - req.path = path; - req.headers = headers; - req.response_handler = std::move(response_handler); - req.content_receiver = - [content_receiver](const char *data, size_t data_length, - size_t /*offset*/, size_t /*total_length*/) { - return content_receiver(data, data_length); - }; - req.download_progress = std::move(progress); - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, - const Headers &headers, - ContentReceiver content_receiver, - DownloadProgress progress) { - return Get(path, params, headers, nullptr, std::move(content_receiver), - std::move(progress)); -} - -inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, - const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - if (params.empty()) { - return Get(path, headers, std::move(response_handler), - std::move(content_receiver), std::move(progress)); - } - - std::string path_with_query = append_query_params(path, params); - return Get(path_with_query, headers, std::move(response_handler), - std::move(content_receiver), std::move(progress)); -} - -inline Result ClientImpl::Head(const std::string &path) { - return Head(path, Headers()); -} - -inline Result ClientImpl::Head(const std::string &path, - const Headers &headers) { - Request req; - req.method = "HEAD"; - req.headers = headers; - req.path = path; - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Post(const std::string &path) { - return Post(path, std::string(), std::string()); -} - -inline Result ClientImpl::Post(const std::string &path, - const Headers &headers) { - return Post(path, headers, nullptr, 0, std::string()); -} - -inline Result ClientImpl::Post(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return Post(path, Headers(), body, content_length, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return Post(path, Headers(), body, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Params ¶ms) { - return Post(path, Headers(), params); -} - -inline Result ClientImpl::Post(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return Post(path, Headers(), content_length, std::move(content_provider), - content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return Post(path, Headers(), std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const Params ¶ms) { - auto query = detail::params_to_query_str(params); - return Post(path, headers, query, "application/x-www-form-urlencoded"); -} - -inline Result ClientImpl::Post(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return Post(path, Headers(), items, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Post(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - if (!detail::is_multipart_boundary_chars_valid(boundary)) { - return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; - } - - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Post(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("POST", path, headers, body, content_length, - nullptr, nullptr, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("POST", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("POST", path, headers, nullptr, - content_length, std::move(content_provider), - nullptr, content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, - std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - return send_with_content_provider( - "POST", path, headers, nullptr, 0, nullptr, - get_multipart_content_provider(boundary, items, provider_items), - content_type, progress); -} - -inline Result ClientImpl::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - Request req; - req.method = "POST"; - req.path = path; - req.headers = headers; - req.body = body; - req.content_receiver = - [content_receiver](const char *data, size_t data_length, - size_t /*offset*/, size_t /*total_length*/) { - return content_receiver(data, data_length); - }; - req.download_progress = std::move(progress); - - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - if (!content_type.empty()) { req.set_header("Content-Type", content_type); } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Put(const std::string &path) { - return Put(path, std::string(), std::string()); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers) { - return Put(path, headers, nullptr, 0, std::string()); -} - -inline Result ClientImpl::Put(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return Put(path, Headers(), body, content_length, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return Put(path, Headers(), body, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Params ¶ms) { - return Put(path, Headers(), params); -} - -inline Result ClientImpl::Put(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return Put(path, Headers(), content_length, std::move(content_provider), - content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return Put(path, Headers(), std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const Params ¶ms) { - auto query = detail::params_to_query_str(params); - return Put(path, headers, query, "application/x-www-form-urlencoded"); -} - -inline Result ClientImpl::Put(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return Put(path, Headers(), items, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Put(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - if (!detail::is_multipart_boundary_chars_valid(boundary)) { - return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; - } - - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Put(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PUT", path, headers, body, content_length, - nullptr, nullptr, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PUT", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PUT", path, headers, nullptr, - content_length, std::move(content_provider), - nullptr, content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, - std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - return send_with_content_provider( - "PUT", path, headers, nullptr, 0, nullptr, - get_multipart_content_provider(boundary, items, provider_items), - content_type, progress); -} - -inline Result ClientImpl::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - Request req; - req.method = "PUT"; - req.path = path; - req.headers = headers; - req.body = body; - req.content_receiver = - [content_receiver](const char *data, size_t data_length, - size_t /*offset*/, size_t /*total_length*/) { - return content_receiver(data, data_length); - }; - req.download_progress = std::move(progress); - - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - if (!content_type.empty()) { req.set_header("Content-Type", content_type); } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Patch(const std::string &path) { - return Patch(path, std::string(), std::string()); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - UploadProgress progress) { - return Patch(path, headers, nullptr, 0, std::string(), progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return Patch(path, Headers(), body, content_length, content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return Patch(path, Headers(), body, content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Params ¶ms) { - return Patch(path, Headers(), params); -} - -inline Result ClientImpl::Patch(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return Patch(path, Headers(), content_length, std::move(content_provider), - content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return Patch(path, Headers(), std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const Params ¶ms) { - auto query = detail::params_to_query_str(params); - return Patch(path, headers, query, "application/x-www-form-urlencoded"); -} - -inline Result ClientImpl::Patch(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return Patch(path, Headers(), items, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Patch(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - if (!detail::is_multipart_boundary_chars_valid(boundary)) { - return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; - } - - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Patch(path, headers, body, content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PATCH", path, headers, body, - content_length, nullptr, nullptr, - content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PATCH", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PATCH", path, headers, nullptr, - content_length, std::move(content_provider), - nullptr, content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, - std::move(content_provider), content_type, - progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - const auto &boundary = detail::make_multipart_data_boundary(); - const auto &content_type = - detail::serialize_multipart_formdata_get_content_type(boundary); - return send_with_content_provider( - "PATCH", path, headers, nullptr, 0, nullptr, - get_multipart_content_provider(boundary, items, provider_items), - content_type, progress); -} - -inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - Request req; - req.method = "PATCH"; - req.path = path; - req.headers = headers; - req.body = body; - req.content_receiver = - [content_receiver](const char *data, size_t data_length, - size_t /*offset*/, size_t /*total_length*/) { - return content_receiver(data, data_length); - }; - req.download_progress = std::move(progress); - - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - if (!content_type.empty()) { req.set_header("Content-Type", content_type); } - - return send_(std::move(req)); -} - -inline Result ClientImpl::Delete(const std::string &path, - DownloadProgress progress) { - return Delete(path, Headers(), std::string(), std::string(), progress); -} - -inline Result ClientImpl::Delete(const std::string &path, - const Headers &headers, - DownloadProgress progress) { - return Delete(path, headers, std::string(), std::string(), progress); -} - -inline Result ClientImpl::Delete(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - DownloadProgress progress) { - return Delete(path, Headers(), body, content_length, content_type, progress); -} - -inline Result ClientImpl::Delete(const std::string &path, - const std::string &body, - const std::string &content_type, - DownloadProgress progress) { - return Delete(path, Headers(), body.data(), body.size(), content_type, - progress); -} - -inline Result ClientImpl::Delete(const std::string &path, - const Headers &headers, - const std::string &body, - const std::string &content_type, - DownloadProgress progress) { - return Delete(path, headers, body.data(), body.size(), content_type, - progress); -} - -inline Result ClientImpl::Delete(const std::string &path, const Params ¶ms, - DownloadProgress progress) { - return Delete(path, Headers(), params, progress); -} - -inline Result ClientImpl::Delete(const std::string &path, - const Headers &headers, const Params ¶ms, - DownloadProgress progress) { - auto query = detail::params_to_query_str(params); - return Delete(path, headers, query, "application/x-www-form-urlencoded", - progress); -} - -inline Result ClientImpl::Delete(const std::string &path, - const Headers &headers, const char *body, - size_t content_length, - const std::string &content_type, - DownloadProgress progress) { - Request req; - req.method = "DELETE"; - req.headers = headers; - req.path = path; - req.download_progress = std::move(progress); - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - if (!content_type.empty()) { req.set_header("Content-Type", content_type); } - req.body.assign(body, content_length); - - return send_(std::move(req)); -} - -inline Result ClientImpl::Options(const std::string &path) { - return Options(path, Headers()); -} - -inline Result ClientImpl::Options(const std::string &path, - const Headers &headers) { - Request req; - req.method = "OPTIONS"; - req.headers = headers; - req.path = path; - if (max_timeout_msec_ > 0) { - req.start_time_ = std::chrono::steady_clock::now(); - } - - return send_(std::move(req)); -} - -inline void ClientImpl::stop() { - std::lock_guard guard(socket_mutex_); - - // If there is anything ongoing right now, the ONLY thread-safe thing we can - // do is to shutdown_socket, so that threads using this socket suddenly - // discover they can't read/write any more and error out. Everything else - // (closing the socket, shutting ssl down) is unsafe because these actions - // are not thread-safe. - if (socket_requests_in_flight_ > 0) { - shutdown_socket(socket_); - - // Aside from that, we set a flag for the socket to be closed when we're - // done. - socket_should_be_closed_when_request_is_done_ = true; - return; - } - - // Otherwise, still holding the mutex, we can shut everything down ourselves - shutdown_ssl(socket_, true); - shutdown_socket(socket_); - close_socket(socket_); -} - -inline std::string ClientImpl::host() const { return host_; } - -inline int ClientImpl::port() const { return port_; } - -inline size_t ClientImpl::is_socket_open() const { - std::lock_guard guard(socket_mutex_); - return socket_.is_open(); -} - -inline socket_t ClientImpl::socket() const { return socket_.sock; } - -inline void ClientImpl::set_connection_timeout(time_t sec, time_t usec) { - connection_timeout_sec_ = sec; - connection_timeout_usec_ = usec; -} - -inline void ClientImpl::set_read_timeout(time_t sec, time_t usec) { - read_timeout_sec_ = sec; - read_timeout_usec_ = usec; -} - -inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) { - write_timeout_sec_ = sec; - write_timeout_usec_ = usec; -} - -inline void ClientImpl::set_max_timeout(time_t msec) { - max_timeout_msec_ = msec; -} - -inline void ClientImpl::set_basic_auth(const std::string &username, - const std::string &password) { - basic_auth_username_ = username; - basic_auth_password_ = password; -} - -inline void ClientImpl::set_bearer_token_auth(const std::string &token) { - bearer_token_auth_token_ = token; -} - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void ClientImpl::set_digest_auth(const std::string &username, - const std::string &password) { - digest_auth_username_ = username; - digest_auth_password_ = password; -} -#endif - -inline void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } - -inline void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } - -inline void ClientImpl::set_path_encode(bool on) { path_encode_ = on; } - -inline void -ClientImpl::set_hostname_addr_map(std::map addr_map) { - addr_map_ = std::move(addr_map); -} - -inline void ClientImpl::set_default_headers(Headers headers) { - default_headers_ = std::move(headers); -} - -inline void ClientImpl::set_header_writer( - std::function const &writer) { - header_writer_ = writer; -} - -inline void ClientImpl::set_address_family(int family) { - address_family_ = family; -} - -inline void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } - -inline void ClientImpl::set_ipv6_v6only(bool on) { ipv6_v6only_ = on; } - -inline void ClientImpl::set_socket_options(SocketOptions socket_options) { - socket_options_ = std::move(socket_options); -} - -inline void ClientImpl::set_compress(bool on) { compress_ = on; } - -inline void ClientImpl::set_decompress(bool on) { decompress_ = on; } - -inline void ClientImpl::set_interface(const std::string &intf) { - interface_ = intf; -} - -inline void ClientImpl::set_proxy(const std::string &host, int port) { - proxy_host_ = host; - proxy_port_ = port; -} - -inline void ClientImpl::set_proxy_basic_auth(const std::string &username, - const std::string &password) { - proxy_basic_auth_username_ = username; - proxy_basic_auth_password_ = password; -} - -inline void ClientImpl::set_proxy_bearer_token_auth(const std::string &token) { - proxy_bearer_token_auth_token_ = token; -} - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void ClientImpl::set_proxy_digest_auth(const std::string &username, - const std::string &password) { - proxy_digest_auth_username_ = username; - proxy_digest_auth_password_ = password; -} - -inline void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file_path, - const std::string &ca_cert_dir_path) { - ca_cert_file_path_ = ca_cert_file_path; - ca_cert_dir_path_ = ca_cert_dir_path; -} - -inline void ClientImpl::set_ca_cert_store(X509_STORE *ca_cert_store) { - if (ca_cert_store && ca_cert_store != ca_cert_store_) { - ca_cert_store_ = ca_cert_store; - } -} - -inline X509_STORE *ClientImpl::create_ca_cert_store(const char *ca_cert, - std::size_t size) const { - auto mem = BIO_new_mem_buf(ca_cert, static_cast(size)); - auto se = detail::scope_exit([&] { BIO_free_all(mem); }); - if (!mem) { return nullptr; } - - auto inf = PEM_X509_INFO_read_bio(mem, nullptr, nullptr, nullptr); - if (!inf) { return nullptr; } - - auto cts = X509_STORE_new(); - if (cts) { - for (auto i = 0; i < static_cast(sk_X509_INFO_num(inf)); i++) { - auto itmp = sk_X509_INFO_value(inf, i); - if (!itmp) { continue; } - - if (itmp->x509) { X509_STORE_add_cert(cts, itmp->x509); } - if (itmp->crl) { X509_STORE_add_crl(cts, itmp->crl); } - } - } - - sk_X509_INFO_pop_free(inf, X509_INFO_free); - return cts; -} - -inline void ClientImpl::enable_server_certificate_verification(bool enabled) { - server_certificate_verification_ = enabled; -} - -inline void ClientImpl::enable_server_hostname_verification(bool enabled) { - server_hostname_verification_ = enabled; -} - -inline void ClientImpl::set_server_certificate_verifier( - std::function verifier) { - server_certificate_verifier_ = verifier; -} -#endif - -inline void ClientImpl::set_logger(Logger logger) { - logger_ = std::move(logger); -} - -inline void ClientImpl::set_error_logger(ErrorLogger error_logger) { - error_logger_ = std::move(error_logger); -} - -/* - * SSL Implementation - */ -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -namespace detail { - -inline bool is_ip_address(const std::string &host) { - struct in_addr addr4; - struct in6_addr addr6; - return inet_pton(AF_INET, host.c_str(), &addr4) == 1 || - inet_pton(AF_INET6, host.c_str(), &addr6) == 1; -} - -template -inline SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex, - U SSL_connect_or_accept, V setup) { - SSL *ssl = nullptr; - { - std::lock_guard guard(ctx_mutex); - ssl = SSL_new(ctx); - } - - if (ssl) { - set_nonblocking(sock, true); - auto bio = BIO_new_socket(static_cast(sock), BIO_NOCLOSE); - BIO_set_nbio(bio, 1); - SSL_set_bio(ssl, bio, bio); - - if (!setup(ssl) || SSL_connect_or_accept(ssl) != 1) { - SSL_shutdown(ssl); - { - std::lock_guard guard(ctx_mutex); - SSL_free(ssl); - } - set_nonblocking(sock, false); - return nullptr; - } - BIO_set_nbio(bio, 0); - set_nonblocking(sock, false); - } - - return ssl; -} - -inline void ssl_delete(std::mutex &ctx_mutex, SSL *ssl, socket_t sock, - bool shutdown_gracefully) { - // sometimes we may want to skip this to try to avoid SIGPIPE if we know - // the remote has closed the network connection - // Note that it is not always possible to avoid SIGPIPE, this is merely a - // best-efforts. - if (shutdown_gracefully) { - (void)(sock); - // SSL_shutdown() returns 0 on first call (indicating close_notify alert - // sent) and 1 on subsequent call (indicating close_notify alert received) - if (SSL_shutdown(ssl) == 0) { - // Expected to return 1, but even if it doesn't, we free ssl - SSL_shutdown(ssl); - } - } - - std::lock_guard guard(ctx_mutex); - SSL_free(ssl); -} - -template -bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, - U ssl_connect_or_accept, - time_t timeout_sec, time_t timeout_usec, - int *ssl_error) { - auto res = 0; - while ((res = ssl_connect_or_accept(ssl)) != 1) { - auto err = SSL_get_error(ssl, res); - switch (err) { - case SSL_ERROR_WANT_READ: - if (select_read(sock, timeout_sec, timeout_usec) > 0) { continue; } - break; - case SSL_ERROR_WANT_WRITE: - if (select_write(sock, timeout_sec, timeout_usec) > 0) { continue; } - break; - default: break; - } - if (ssl_error) { *ssl_error = err; } - return false; - } - return true; -} - -template -inline bool process_server_socket_ssl( - const std::atomic &svr_sock, SSL *ssl, socket_t sock, - size_t keep_alive_max_count, time_t keep_alive_timeout_sec, - time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, - time_t write_timeout_usec, T callback) { - return process_server_socket_core( - svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, - [&](bool close_connection, bool &connection_closed) { - SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, - write_timeout_sec, write_timeout_usec); - return callback(strm, close_connection, connection_closed); - }); -} - -template -inline bool process_client_socket_ssl( - SSL *ssl, socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, - time_t write_timeout_sec, time_t write_timeout_usec, - time_t max_timeout_msec, - std::chrono::time_point start_time, T callback) { - SSLSocketStream strm(sock, ssl, read_timeout_sec, read_timeout_usec, - write_timeout_sec, write_timeout_usec, max_timeout_msec, - start_time); - return callback(strm); -} - -// SSL socket stream implementation -inline SSLSocketStream::SSLSocketStream( - socket_t sock, SSL *ssl, time_t read_timeout_sec, time_t read_timeout_usec, - time_t write_timeout_sec, time_t write_timeout_usec, - time_t max_timeout_msec, - std::chrono::time_point start_time) - : sock_(sock), ssl_(ssl), read_timeout_sec_(read_timeout_sec), - read_timeout_usec_(read_timeout_usec), - write_timeout_sec_(write_timeout_sec), - write_timeout_usec_(write_timeout_usec), - max_timeout_msec_(max_timeout_msec), start_time_(start_time) { - SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY); -} - -inline SSLSocketStream::~SSLSocketStream() = default; - -inline bool SSLSocketStream::is_readable() const { - return SSL_pending(ssl_) > 0; -} - -inline bool SSLSocketStream::wait_readable() const { - if (max_timeout_msec_ <= 0) { - return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; - } - - time_t read_timeout_sec; - time_t read_timeout_usec; - calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, - read_timeout_usec_, read_timeout_sec, read_timeout_usec); - - return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; -} - -inline bool SSLSocketStream::wait_writable() const { - return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && - is_socket_alive(sock_) && !is_ssl_peer_could_be_closed(ssl_, sock_); -} - -inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { - if (SSL_pending(ssl_) > 0) { - return SSL_read(ssl_, ptr, static_cast(size)); - } else if (wait_readable()) { - auto ret = SSL_read(ssl_, ptr, static_cast(size)); - if (ret < 0) { - auto err = SSL_get_error(ssl_, ret); - auto n = 1000; -#ifdef _WIN32 - while (--n >= 0 && (err == SSL_ERROR_WANT_READ || - (err == SSL_ERROR_SYSCALL && - WSAGetLastError() == WSAETIMEDOUT))) { -#else - while (--n >= 0 && err == SSL_ERROR_WANT_READ) { -#endif - if (SSL_pending(ssl_) > 0) { - return SSL_read(ssl_, ptr, static_cast(size)); - } else if (wait_readable()) { - std::this_thread::sleep_for(std::chrono::microseconds{10}); - ret = SSL_read(ssl_, ptr, static_cast(size)); - if (ret >= 0) { return ret; } - err = SSL_get_error(ssl_, ret); - } else { - break; - } - } - assert(ret < 0); - } - return ret; - } else { - return -1; - } -} - -inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) { - if (wait_writable()) { - auto handle_size = static_cast( - std::min(size, (std::numeric_limits::max)())); - - auto ret = SSL_write(ssl_, ptr, static_cast(handle_size)); - if (ret < 0) { - auto err = SSL_get_error(ssl_, ret); - auto n = 1000; -#ifdef _WIN32 - while (--n >= 0 && (err == SSL_ERROR_WANT_WRITE || - (err == SSL_ERROR_SYSCALL && - WSAGetLastError() == WSAETIMEDOUT))) { -#else - while (--n >= 0 && err == SSL_ERROR_WANT_WRITE) { -#endif - if (wait_writable()) { - std::this_thread::sleep_for(std::chrono::microseconds{10}); - ret = SSL_write(ssl_, ptr, static_cast(handle_size)); - if (ret >= 0) { return ret; } - err = SSL_get_error(ssl_, ret); - } else { - break; - } - } - assert(ret < 0); - } - return ret; - } - return -1; -} - -inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip, - int &port) const { - detail::get_remote_ip_and_port(sock_, ip, port); -} - -inline void SSLSocketStream::get_local_ip_and_port(std::string &ip, - int &port) const { - detail::get_local_ip_and_port(sock_, ip, port); -} - -inline socket_t SSLSocketStream::socket() const { return sock_; } - -inline time_t SSLSocketStream::duration() const { - return std::chrono::duration_cast( - std::chrono::steady_clock::now() - start_time_) - .count(); -} - -} // namespace detail - -// SSL HTTP server implementation -inline SSLServer::SSLServer(const char *cert_path, const char *private_key_path, - const char *client_ca_cert_file_path, - const char *client_ca_cert_dir_path, - const char *private_key_password) { - ctx_ = SSL_CTX_new(TLS_server_method()); - - if (ctx_) { - SSL_CTX_set_options(ctx_, - SSL_OP_NO_COMPRESSION | - SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); - - SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); - - if (private_key_password != nullptr && (private_key_password[0] != '\0')) { - SSL_CTX_set_default_passwd_cb_userdata( - ctx_, - reinterpret_cast(const_cast(private_key_password))); - } - - if (SSL_CTX_use_certificate_chain_file(ctx_, cert_path) != 1 || - SSL_CTX_use_PrivateKey_file(ctx_, private_key_path, SSL_FILETYPE_PEM) != - 1 || - SSL_CTX_check_private_key(ctx_) != 1) { - last_ssl_error_ = static_cast(ERR_get_error()); - SSL_CTX_free(ctx_); - ctx_ = nullptr; - } else if (client_ca_cert_file_path || client_ca_cert_dir_path) { - SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, - client_ca_cert_dir_path); - - // Set client CA list to be sent to clients during TLS handshake - if (client_ca_cert_file_path) { - auto ca_list = SSL_load_client_CA_file(client_ca_cert_file_path); - if (ca_list != nullptr) { - SSL_CTX_set_client_CA_list(ctx_, ca_list); - } else { - // Failed to load client CA list, but we continue since - // SSL_CTX_load_verify_locations already succeeded and - // certificate verification will still work - last_ssl_error_ = static_cast(ERR_get_error()); - } - } - - SSL_CTX_set_verify( - ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); - } - } -} - -inline SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, - X509_STORE *client_ca_cert_store) { - ctx_ = SSL_CTX_new(TLS_server_method()); - - if (ctx_) { - SSL_CTX_set_options(ctx_, - SSL_OP_NO_COMPRESSION | - SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); - - SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); - - if (SSL_CTX_use_certificate(ctx_, cert) != 1 || - SSL_CTX_use_PrivateKey(ctx_, private_key) != 1) { - SSL_CTX_free(ctx_); - ctx_ = nullptr; - } else if (client_ca_cert_store) { - SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); - - // Extract CA names from the store and set them as the client CA list - auto ca_list = extract_ca_names_from_x509_store(client_ca_cert_store); - if (ca_list) { - SSL_CTX_set_client_CA_list(ctx_, ca_list); - } else { - // Failed to extract CA names, record the error - last_ssl_error_ = static_cast(ERR_get_error()); - } - - SSL_CTX_set_verify( - ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); - } - } -} - -inline SSLServer::SSLServer( - const std::function &setup_ssl_ctx_callback) { - ctx_ = SSL_CTX_new(TLS_method()); - if (ctx_) { - if (!setup_ssl_ctx_callback(*ctx_)) { - SSL_CTX_free(ctx_); - ctx_ = nullptr; - } - } -} - -inline SSLServer::~SSLServer() { - if (ctx_) { SSL_CTX_free(ctx_); } -} - -inline bool SSLServer::is_valid() const { return ctx_; } - -inline SSL_CTX *SSLServer::ssl_context() const { return ctx_; } - -inline void SSLServer::update_certs(X509 *cert, EVP_PKEY *private_key, - X509_STORE *client_ca_cert_store) { - - std::lock_guard guard(ctx_mutex_); - - SSL_CTX_use_certificate(ctx_, cert); - SSL_CTX_use_PrivateKey(ctx_, private_key); - - if (client_ca_cert_store != nullptr) { - SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); - } -} - -inline bool SSLServer::process_and_close_socket(socket_t sock) { - auto ssl = detail::ssl_new( - sock, ctx_, ctx_mutex_, - [&](SSL *ssl2) { - return detail::ssl_connect_or_accept_nonblocking( - sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_, - &last_ssl_error_); - }, - [](SSL * /*ssl2*/) { return true; }); - - auto ret = false; - if (ssl) { - std::string remote_addr; - int remote_port = 0; - detail::get_remote_ip_and_port(sock, remote_addr, remote_port); - - std::string local_addr; - int local_port = 0; - detail::get_local_ip_and_port(sock, local_addr, local_port); - - ret = detail::process_server_socket_ssl( - svr_sock_, ssl, sock, keep_alive_max_count_, keep_alive_timeout_sec_, - read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, - write_timeout_usec_, - [&](Stream &strm, bool close_connection, bool &connection_closed) { - return process_request(strm, remote_addr, remote_port, local_addr, - local_port, close_connection, - connection_closed, - [&](Request &req) { req.ssl = ssl; }); - }); - - // Shutdown gracefully if the result seemed successful, non-gracefully if - // the connection appeared to be closed. - const bool shutdown_gracefully = ret; - detail::ssl_delete(ctx_mutex_, ssl, sock, shutdown_gracefully); - } - - detail::shutdown_socket(sock); - detail::close_socket(sock); - return ret; -} - -inline STACK_OF(X509_NAME) * SSLServer::extract_ca_names_from_x509_store( - X509_STORE *store) { - if (!store) { return nullptr; } - - auto ca_list = sk_X509_NAME_new_null(); - if (!ca_list) { return nullptr; } - - // Get all objects from the store - auto objs = X509_STORE_get0_objects(store); - if (!objs) { - sk_X509_NAME_free(ca_list); - return nullptr; - } - - // Iterate through objects and extract certificate subject names - for (int i = 0; i < sk_X509_OBJECT_num(objs); i++) { - auto obj = sk_X509_OBJECT_value(objs, i); - if (X509_OBJECT_get_type(obj) == X509_LU_X509) { - auto cert = X509_OBJECT_get0_X509(obj); - if (cert) { - auto subject = X509_get_subject_name(cert); - if (subject) { - auto name_dup = X509_NAME_dup(subject); - if (name_dup) { sk_X509_NAME_push(ca_list, name_dup); } - } - } - } - } - - // If no names were extracted, free the list and return nullptr - if (sk_X509_NAME_num(ca_list) == 0) { - sk_X509_NAME_free(ca_list); - return nullptr; - } - - return ca_list; -} - -// SSL HTTP client implementation -inline SSLClient::SSLClient(const std::string &host) - : SSLClient(host, 443, std::string(), std::string()) {} - -inline SSLClient::SSLClient(const std::string &host, int port) - : SSLClient(host, port, std::string(), std::string()) {} - -inline SSLClient::SSLClient(const std::string &host, int port, - const std::string &client_cert_path, - const std::string &client_key_path, - const std::string &private_key_password) - : ClientImpl(host, port, client_cert_path, client_key_path) { - ctx_ = SSL_CTX_new(TLS_client_method()); - - SSL_CTX_set_min_proto_version(ctx_, TLS1_2_VERSION); - - detail::split(&host_[0], &host_[host_.size()], '.', - [&](const char *b, const char *e) { - host_components_.emplace_back(b, e); - }); - - if (!client_cert_path.empty() && !client_key_path.empty()) { - if (!private_key_password.empty()) { - SSL_CTX_set_default_passwd_cb_userdata( - ctx_, reinterpret_cast( - const_cast(private_key_password.c_str()))); - } - - if (SSL_CTX_use_certificate_file(ctx_, client_cert_path.c_str(), - SSL_FILETYPE_PEM) != 1 || - SSL_CTX_use_PrivateKey_file(ctx_, client_key_path.c_str(), - SSL_FILETYPE_PEM) != 1) { - last_openssl_error_ = ERR_get_error(); - SSL_CTX_free(ctx_); - ctx_ = nullptr; - } - } -} - -inline SSLClient::SSLClient(const std::string &host, int port, - X509 *client_cert, EVP_PKEY *client_key, - const std::string &private_key_password) - : ClientImpl(host, port) { - ctx_ = SSL_CTX_new(TLS_client_method()); - - detail::split(&host_[0], &host_[host_.size()], '.', - [&](const char *b, const char *e) { - host_components_.emplace_back(b, e); - }); - - if (client_cert != nullptr && client_key != nullptr) { - if (!private_key_password.empty()) { - SSL_CTX_set_default_passwd_cb_userdata( - ctx_, reinterpret_cast( - const_cast(private_key_password.c_str()))); - } - - if (SSL_CTX_use_certificate(ctx_, client_cert) != 1 || - SSL_CTX_use_PrivateKey(ctx_, client_key) != 1) { - last_openssl_error_ = ERR_get_error(); - SSL_CTX_free(ctx_); - ctx_ = nullptr; - } - } -} - -inline SSLClient::~SSLClient() { - if (ctx_) { SSL_CTX_free(ctx_); } - // Make sure to shut down SSL since shutdown_ssl will resolve to the - // base function rather than the derived function once we get to the - // base class destructor, and won't free the SSL (causing a leak). - shutdown_ssl_impl(socket_, true); -} - -inline bool SSLClient::is_valid() const { return ctx_; } - -inline void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { - if (ca_cert_store) { - if (ctx_) { - if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { - // Free memory allocated for old cert and use new store - // `ca_cert_store` - SSL_CTX_set_cert_store(ctx_, ca_cert_store); - ca_cert_store_ = ca_cert_store; - } - } else { - X509_STORE_free(ca_cert_store); - } - } -} - -inline void SSLClient::load_ca_cert_store(const char *ca_cert, - std::size_t size) { - set_ca_cert_store(ClientImpl::create_ca_cert_store(ca_cert, size)); -} - -inline long SSLClient::get_openssl_verify_result() const { - return verify_result_; -} - -inline SSL_CTX *SSLClient::ssl_context() const { return ctx_; } - -inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { - if (!is_valid()) { - error = Error::SSLConnection; - return false; - } - return ClientImpl::create_and_connect_socket(socket, error); -} - -// Assumes that socket_mutex_ is locked and that there are no requests in -// flight -inline bool SSLClient::connect_with_proxy( - Socket &socket, - std::chrono::time_point start_time, - Response &res, bool &success, Error &error) { - success = true; - Response proxy_res; - if (!detail::process_client_socket( - socket.sock, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, - start_time, [&](Stream &strm) { - Request req2; - req2.method = "CONNECT"; - req2.path = host_and_port_; - if (max_timeout_msec_ > 0) { - req2.start_time_ = std::chrono::steady_clock::now(); - } - return process_request(strm, req2, proxy_res, false, error); - })) { - // Thread-safe to close everything because we are assuming there are no - // requests in flight - shutdown_ssl(socket, true); - shutdown_socket(socket); - close_socket(socket); - success = false; - return false; - } - - if (proxy_res.status == StatusCode::ProxyAuthenticationRequired_407) { - if (!proxy_digest_auth_username_.empty() && - !proxy_digest_auth_password_.empty()) { - std::map auth; - if (detail::parse_www_authenticate(proxy_res, auth, true)) { - // Close the current socket and create a new one for the authenticated - // request - shutdown_ssl(socket, true); - shutdown_socket(socket); - close_socket(socket); - - // Create a new socket for the authenticated CONNECT request - if (!create_and_connect_socket(socket, error)) { - success = false; - output_error_log(error, nullptr); - return false; - } - - proxy_res = Response(); - if (!detail::process_client_socket( - socket.sock, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, - start_time, [&](Stream &strm) { - Request req3; - req3.method = "CONNECT"; - req3.path = host_and_port_; - req3.headers.insert(detail::make_digest_authentication_header( - req3, auth, 1, detail::random_string(10), - proxy_digest_auth_username_, proxy_digest_auth_password_, - true)); - if (max_timeout_msec_ > 0) { - req3.start_time_ = std::chrono::steady_clock::now(); - } - return process_request(strm, req3, proxy_res, false, error); - })) { - // Thread-safe to close everything because we are assuming there are - // no requests in flight - shutdown_ssl(socket, true); - shutdown_socket(socket); - close_socket(socket); - success = false; - return false; - } - } - } - } - - // If status code is not 200, proxy request is failed. - // Set error to ProxyConnection and return proxy response - // as the response of the request - if (proxy_res.status != StatusCode::OK_200) { - error = Error::ProxyConnection; - output_error_log(error, nullptr); - res = std::move(proxy_res); - // Thread-safe to close everything because we are assuming there are - // no requests in flight - shutdown_ssl(socket, true); - shutdown_socket(socket); - close_socket(socket); - return false; - } - - return true; -} - -inline bool SSLClient::load_certs() { - auto ret = true; - - std::call_once(initialize_cert_, [&]() { - std::lock_guard guard(ctx_mutex_); - if (!ca_cert_file_path_.empty()) { - if (!SSL_CTX_load_verify_locations(ctx_, ca_cert_file_path_.c_str(), - nullptr)) { - last_openssl_error_ = ERR_get_error(); - ret = false; - } - } else if (!ca_cert_dir_path_.empty()) { - if (!SSL_CTX_load_verify_locations(ctx_, nullptr, - ca_cert_dir_path_.c_str())) { - last_openssl_error_ = ERR_get_error(); - ret = false; - } - } else { - auto loaded = false; -#ifdef _WIN32 - loaded = - detail::load_system_certs_on_windows(SSL_CTX_get_cert_store(ctx_)); -#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC - loaded = detail::load_system_certs_on_macos(SSL_CTX_get_cert_store(ctx_)); -#endif // _WIN32 - if (!loaded) { SSL_CTX_set_default_verify_paths(ctx_); } - } - }); - - return ret; -} - -inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { - auto ssl = detail::ssl_new( - socket.sock, ctx_, ctx_mutex_, - [&](SSL *ssl2) { - if (server_certificate_verification_) { - if (!load_certs()) { - error = Error::SSLLoadingCerts; - output_error_log(error, nullptr); - return false; - } - SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); - } - - if (!detail::ssl_connect_or_accept_nonblocking( - socket.sock, ssl2, SSL_connect, connection_timeout_sec_, - connection_timeout_usec_, &last_ssl_error_)) { - error = Error::SSLConnection; - output_error_log(error, nullptr); - return false; - } - - if (server_certificate_verification_) { - auto verification_status = SSLVerifierResponse::NoDecisionMade; - - if (server_certificate_verifier_) { - verification_status = server_certificate_verifier_(ssl2); - } - - if (verification_status == SSLVerifierResponse::CertificateRejected) { - last_openssl_error_ = ERR_get_error(); - error = Error::SSLServerVerification; - output_error_log(error, nullptr); - return false; - } - - if (verification_status == SSLVerifierResponse::NoDecisionMade) { - verify_result_ = SSL_get_verify_result(ssl2); - - if (verify_result_ != X509_V_OK) { - last_openssl_error_ = static_cast(verify_result_); - error = Error::SSLServerVerification; - output_error_log(error, nullptr); - return false; - } - - auto server_cert = SSL_get1_peer_certificate(ssl2); - auto se = detail::scope_exit([&] { X509_free(server_cert); }); - - if (server_cert == nullptr) { - last_openssl_error_ = ERR_get_error(); - error = Error::SSLServerVerification; - output_error_log(error, nullptr); - return false; - } - - if (server_hostname_verification_) { - if (!verify_host(server_cert)) { - last_openssl_error_ = X509_V_ERR_HOSTNAME_MISMATCH; - error = Error::SSLServerHostnameVerification; - output_error_log(error, nullptr); - return false; - } - } - } - } - - return true; - }, - [&](SSL *ssl2) { - // Set SNI only if host is not IP address - if (!detail::is_ip_address(host_)) { -#if defined(OPENSSL_IS_BORINGSSL) - SSL_set_tlsext_host_name(ssl2, host_.c_str()); -#else - // NOTE: Direct call instead of using the OpenSSL macro to suppress - // -Wold-style-cast warning - SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, - TLSEXT_NAMETYPE_host_name, - static_cast(const_cast(host_.c_str()))); -#endif - } - return true; - }); - - if (ssl) { - socket.ssl = ssl; - return true; - } - - if (ctx_ == nullptr) { - error = Error::SSLConnection; - last_openssl_error_ = ERR_get_error(); - } - - shutdown_socket(socket); - close_socket(socket); - return false; -} - -inline void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracefully) { - shutdown_ssl_impl(socket, shutdown_gracefully); -} - -inline void SSLClient::shutdown_ssl_impl(Socket &socket, - bool shutdown_gracefully) { - if (socket.sock == INVALID_SOCKET) { - assert(socket.ssl == nullptr); - return; - } - if (socket.ssl) { - detail::ssl_delete(ctx_mutex_, socket.ssl, socket.sock, - shutdown_gracefully); - socket.ssl = nullptr; - } - assert(socket.ssl == nullptr); -} - -inline bool SSLClient::process_socket( - const Socket &socket, - std::chrono::time_point start_time, - std::function callback) { - assert(socket.ssl); - return detail::process_client_socket_ssl( - socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, - write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, start_time, - std::move(callback)); -} - -inline bool SSLClient::is_ssl() const { return true; } - -inline bool SSLClient::verify_host(X509 *server_cert) const { - /* Quote from RFC2818 section 3.1 "Server Identity" - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. - - Matching is performed using the matching rules specified by - [RFC2459]. If more than one identity of a given type is present in - the certificate (e.g., more than one dNSName name, a match in any one - of the set is considered acceptable.) Names may contain the wildcard - character * which is considered to match any single domain name - component or component fragment. E.g., *.a.com matches foo.a.com but - not bar.foo.a.com. f*.com matches foo.com but not bar.com. - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. - - */ - return verify_host_with_subject_alt_name(server_cert) || - verify_host_with_common_name(server_cert); -} - -inline bool -SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { - auto ret = false; - - auto type = GEN_DNS; - - struct in6_addr addr6 = {}; - struct in_addr addr = {}; - size_t addr_len = 0; - -#ifndef __MINGW32__ - if (inet_pton(AF_INET6, host_.c_str(), &addr6)) { - type = GEN_IPADD; - addr_len = sizeof(struct in6_addr); - } else if (inet_pton(AF_INET, host_.c_str(), &addr)) { - type = GEN_IPADD; - addr_len = sizeof(struct in_addr); - } -#endif - - auto alt_names = static_cast( - X509_get_ext_d2i(server_cert, NID_subject_alt_name, nullptr, nullptr)); - - if (alt_names) { - auto dsn_matched = false; - auto ip_matched = false; - - auto count = sk_GENERAL_NAME_num(alt_names); - - for (decltype(count) i = 0; i < count && !dsn_matched; i++) { - auto val = sk_GENERAL_NAME_value(alt_names, i); - if (!val || val->type != type) { continue; } - - auto name = - reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); - if (name == nullptr) { continue; } - - auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); - - switch (type) { - case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; - - case GEN_IPADD: - if (!memcmp(&addr6, name, addr_len) || !memcmp(&addr, name, addr_len)) { - ip_matched = true; - } - break; - } - } - - if (dsn_matched || ip_matched) { ret = true; } - } - - GENERAL_NAMES_free(const_cast( - reinterpret_cast(alt_names))); - return ret; -} - -inline bool SSLClient::verify_host_with_common_name(X509 *server_cert) const { - const auto subject_name = X509_get_subject_name(server_cert); - - if (subject_name != nullptr) { - char name[BUFSIZ]; - auto name_len = X509_NAME_get_text_by_NID(subject_name, NID_commonName, - name, sizeof(name)); - - if (name_len != -1) { - return check_host_name(name, static_cast(name_len)); - } - } - - return false; -} - -inline bool SSLClient::check_host_name(const char *pattern, - size_t pattern_len) const { - if (host_.size() == pattern_len && host_ == pattern) { return true; } - - // Wildcard match - // https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/376484 - std::vector pattern_components; - detail::split(&pattern[0], &pattern[pattern_len], '.', - [&](const char *b, const char *e) { - pattern_components.emplace_back(b, e); - }); - - if (host_components_.size() != pattern_components.size()) { return false; } - - auto itr = pattern_components.begin(); - for (const auto &h : host_components_) { - auto &p = *itr; - if (p != h && p != "*") { - auto partial_match = (p.size() > 0 && p[p.size() - 1] == '*' && - !p.compare(0, p.size() - 1, h)); - if (!partial_match) { return false; } - } - ++itr; - } - - return true; -} -#endif - -// Universal client implementation -inline Client::Client(const std::string &scheme_host_port) - : Client(scheme_host_port, std::string(), std::string()) {} - -inline Client::Client(const std::string &scheme_host_port, - const std::string &client_cert_path, - const std::string &client_key_path) { - const static std::regex re( - R"((?:([a-z]+):\/\/)?(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); - - std::smatch m; - if (std::regex_match(scheme_host_port, m, re)) { - auto scheme = m[1].str(); - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - if (!scheme.empty() && (scheme != "http" && scheme != "https")) { -#else - if (!scheme.empty() && scheme != "http") { -#endif -#ifndef CPPHTTPLIB_NO_EXCEPTIONS - std::string msg = "'" + scheme + "' scheme is not supported."; - throw std::invalid_argument(msg); -#endif - return; - } - - auto is_ssl = scheme == "https"; - - auto host = m[2].str(); - if (host.empty()) { host = m[3].str(); } - - auto port_str = m[4].str(); - auto port = !port_str.empty() ? std::stoi(port_str) : (is_ssl ? 443 : 80); - - if (is_ssl) { -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT - cli_ = detail::make_unique(host, port, client_cert_path, - client_key_path); - is_ssl_ = is_ssl; -#endif - } else { - cli_ = detail::make_unique(host, port, client_cert_path, - client_key_path); - } - } else { - // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress) - // if port param below changes. - cli_ = detail::make_unique(scheme_host_port, 80, - client_cert_path, client_key_path); - } -} // namespace detail - -inline Client::Client(const std::string &host, int port) - : cli_(detail::make_unique(host, port)) {} - -inline Client::Client(const std::string &host, int port, - const std::string &client_cert_path, - const std::string &client_key_path) - : cli_(detail::make_unique(host, port, client_cert_path, - client_key_path)) {} - -inline Client::~Client() = default; - -inline bool Client::is_valid() const { - return cli_ != nullptr && cli_->is_valid(); -} - -inline Result Client::Get(const std::string &path, DownloadProgress progress) { - return cli_->Get(path, std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Headers &headers, - DownloadProgress progress) { - return cli_->Get(path, headers, std::move(progress)); -} -inline Result Client::Get(const std::string &path, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, std::move(content_receiver), std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, headers, std::move(content_receiver), - std::move(progress)); -} -inline Result Client::Get(const std::string &path, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, std::move(response_handler), - std::move(content_receiver), std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, headers, std::move(response_handler), - std::move(content_receiver), std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Params ¶ms, - const Headers &headers, DownloadProgress progress) { - return cli_->Get(path, params, headers, std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Params ¶ms, - const Headers &headers, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, params, headers, std::move(content_receiver), - std::move(progress)); -} -inline Result Client::Get(const std::string &path, const Params ¶ms, - const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Get(path, params, headers, std::move(response_handler), - std::move(content_receiver), std::move(progress)); -} - -inline Result Client::Head(const std::string &path) { return cli_->Head(path); } -inline Result Client::Head(const std::string &path, const Headers &headers) { - return cli_->Head(path, headers); -} - -inline Result Client::Post(const std::string &path) { return cli_->Post(path); } -inline Result Client::Post(const std::string &path, const Headers &headers) { - return cli_->Post(path, headers); -} -inline Result Client::Post(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, body, content_length, content_type, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, headers, body, content_length, content_type, - progress); -} -inline Result Client::Post(const std::string &path, const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, body, content_type, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, headers, body, content_type, progress); -} -inline Result Client::Post(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Post(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, std::move(content_provider), content_type, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, headers, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Post(path, headers, std::move(content_provider), content_type, - progress); -} -inline Result Client::Post(const std::string &path, const Params ¶ms) { - return cli_->Post(path, params); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const Params ¶ms) { - return cli_->Post(path, headers, params); -} -inline Result Client::Post(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Post(path, items, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Post(path, headers, items, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - return cli_->Post(path, headers, items, boundary, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - return cli_->Post(path, headers, items, provider_items, progress); -} -inline Result Client::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Post(path, headers, body, content_type, content_receiver, - progress); -} - -inline Result Client::Put(const std::string &path) { return cli_->Put(path); } -inline Result Client::Put(const std::string &path, const Headers &headers) { - return cli_->Put(path, headers); -} -inline Result Client::Put(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, body, content_length, content_type, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, headers, body, content_length, content_type, progress); -} -inline Result Client::Put(const std::string &path, const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, body, content_type, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, headers, body, content_type, progress); -} -inline Result Client::Put(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Put(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, std::move(content_provider), content_type, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, headers, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Put(path, headers, std::move(content_provider), content_type, - progress); -} -inline Result Client::Put(const std::string &path, const Params ¶ms) { - return cli_->Put(path, params); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const Params ¶ms) { - return cli_->Put(path, headers, params); -} -inline Result Client::Put(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Put(path, items, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Put(path, headers, items, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - return cli_->Put(path, headers, items, boundary, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - return cli_->Put(path, headers, items, provider_items, progress); -} -inline Result Client::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Put(path, headers, body, content_type, content_receiver, - progress); -} - -inline Result Client::Patch(const std::string &path) { - return cli_->Patch(path); -} -inline Result Client::Patch(const std::string &path, const Headers &headers) { - return cli_->Patch(path, headers); -} -inline Result Client::Patch(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, body, content_length, content_type, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, headers, body, content_length, content_type, - progress); -} -inline Result Client::Patch(const std::string &path, const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, body, content_type, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, headers, body, content_type, progress); -} -inline Result Client::Patch(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Patch(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, std::move(content_provider), content_type, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, headers, content_length, std::move(content_provider), - content_type, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type, - UploadProgress progress) { - return cli_->Patch(path, headers, std::move(content_provider), content_type, - progress); -} -inline Result Client::Patch(const std::string &path, const Params ¶ms) { - return cli_->Patch(path, params); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const Params ¶ms) { - return cli_->Patch(path, headers, params); -} -inline Result Client::Patch(const std::string &path, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Patch(path, items, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - UploadProgress progress) { - return cli_->Patch(path, headers, items, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const std::string &boundary, - UploadProgress progress) { - return cli_->Patch(path, headers, items, boundary, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const UploadFormDataItems &items, - const FormDataProviderItems &provider_items, - UploadProgress progress) { - return cli_->Patch(path, headers, items, provider_items, progress); -} -inline Result Client::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - ContentReceiver content_receiver, - DownloadProgress progress) { - return cli_->Patch(path, headers, body, content_type, content_receiver, - progress); -} - -inline Result Client::Delete(const std::string &path, - DownloadProgress progress) { - return cli_->Delete(path, progress); -} -inline Result Client::Delete(const std::string &path, const Headers &headers, - DownloadProgress progress) { - return cli_->Delete(path, headers, progress); -} -inline Result Client::Delete(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type, - DownloadProgress progress) { - return cli_->Delete(path, body, content_length, content_type, progress); -} -inline Result Client::Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - DownloadProgress progress) { - return cli_->Delete(path, headers, body, content_length, content_type, - progress); -} -inline Result Client::Delete(const std::string &path, const std::string &body, - const std::string &content_type, - DownloadProgress progress) { - return cli_->Delete(path, body, content_type, progress); -} -inline Result Client::Delete(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - DownloadProgress progress) { - return cli_->Delete(path, headers, body, content_type, progress); -} -inline Result Client::Delete(const std::string &path, const Params ¶ms, - DownloadProgress progress) { - return cli_->Delete(path, params, progress); -} -inline Result Client::Delete(const std::string &path, const Headers &headers, - const Params ¶ms, DownloadProgress progress) { - return cli_->Delete(path, headers, params, progress); -} - -inline Result Client::Options(const std::string &path) { - return cli_->Options(path); -} -inline Result Client::Options(const std::string &path, const Headers &headers) { - return cli_->Options(path, headers); -} - -inline bool Client::send(Request &req, Response &res, Error &error) { - return cli_->send(req, res, error); -} - -inline Result Client::send(const Request &req) { return cli_->send(req); } - -inline void Client::stop() { cli_->stop(); } - -inline std::string Client::host() const { return cli_->host(); } - -inline int Client::port() const { return cli_->port(); } - -inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); } - -inline socket_t Client::socket() const { return cli_->socket(); } - -inline void -Client::set_hostname_addr_map(std::map addr_map) { - cli_->set_hostname_addr_map(std::move(addr_map)); -} - -inline void Client::set_default_headers(Headers headers) { - cli_->set_default_headers(std::move(headers)); -} - -inline void Client::set_header_writer( - std::function const &writer) { - cli_->set_header_writer(writer); -} - -inline void Client::set_address_family(int family) { - cli_->set_address_family(family); -} - -inline void Client::set_tcp_nodelay(bool on) { cli_->set_tcp_nodelay(on); } - -inline void Client::set_socket_options(SocketOptions socket_options) { - cli_->set_socket_options(std::move(socket_options)); -} - -inline void Client::set_connection_timeout(time_t sec, time_t usec) { - cli_->set_connection_timeout(sec, usec); -} - -inline void Client::set_read_timeout(time_t sec, time_t usec) { - cli_->set_read_timeout(sec, usec); -} - -inline void Client::set_write_timeout(time_t sec, time_t usec) { - cli_->set_write_timeout(sec, usec); -} - -inline void Client::set_basic_auth(const std::string &username, - const std::string &password) { - cli_->set_basic_auth(username, password); -} -inline void Client::set_bearer_token_auth(const std::string &token) { - cli_->set_bearer_token_auth(token); -} -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_digest_auth(const std::string &username, - const std::string &password) { - cli_->set_digest_auth(username, password); -} -#endif - -inline void Client::set_keep_alive(bool on) { cli_->set_keep_alive(on); } -inline void Client::set_follow_location(bool on) { - cli_->set_follow_location(on); -} - -inline void Client::set_path_encode(bool on) { cli_->set_path_encode(on); } - -[[deprecated("Use set_path_encode instead")]] -inline void Client::set_url_encode(bool on) { - cli_->set_path_encode(on); -} - -inline void Client::set_compress(bool on) { cli_->set_compress(on); } - -inline void Client::set_decompress(bool on) { cli_->set_decompress(on); } - -inline void Client::set_interface(const std::string &intf) { - cli_->set_interface(intf); -} - -inline void Client::set_proxy(const std::string &host, int port) { - cli_->set_proxy(host, port); -} -inline void Client::set_proxy_basic_auth(const std::string &username, - const std::string &password) { - cli_->set_proxy_basic_auth(username, password); -} -inline void Client::set_proxy_bearer_token_auth(const std::string &token) { - cli_->set_proxy_bearer_token_auth(token); -} -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_proxy_digest_auth(const std::string &username, - const std::string &password) { - cli_->set_proxy_digest_auth(username, password); -} -#endif - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::enable_server_certificate_verification(bool enabled) { - cli_->enable_server_certificate_verification(enabled); -} - -inline void Client::enable_server_hostname_verification(bool enabled) { - cli_->enable_server_hostname_verification(enabled); -} - -inline void Client::set_server_certificate_verifier( - std::function verifier) { - cli_->set_server_certificate_verifier(verifier); -} -#endif - -inline void Client::set_logger(Logger logger) { - cli_->set_logger(std::move(logger)); -} - -inline void Client::set_error_logger(ErrorLogger error_logger) { - cli_->set_error_logger(std::move(error_logger)); -} - -#ifdef CPPHTTPLIB_OPENSSL_SUPPORT -inline void Client::set_ca_cert_path(const std::string &ca_cert_file_path, - const std::string &ca_cert_dir_path) { - cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); -} - -inline void Client::set_ca_cert_store(X509_STORE *ca_cert_store) { - if (is_ssl_) { - static_cast(*cli_).set_ca_cert_store(ca_cert_store); - } else { - cli_->set_ca_cert_store(ca_cert_store); - } -} - -inline void Client::load_ca_cert_store(const char *ca_cert, std::size_t size) { - set_ca_cert_store(cli_->create_ca_cert_store(ca_cert, size)); -} - -inline long Client::get_openssl_verify_result() const { - if (is_ssl_) { - return static_cast(*cli_).get_openssl_verify_result(); - } - return -1; // NOTE: -1 doesn't match any of X509_V_ERR_??? -} - -inline SSL_CTX *Client::ssl_context() const { - if (is_ssl_) { return static_cast(*cli_).ssl_context(); } - return nullptr; -} -#endif -// ---------------------------------------------------------------------------- } // namespace httplib From 3fe36c32389ade876ec505f32df08f5121cf597f Mon Sep 17 00:00:00 2001 From: sudhiarm Date: Tue, 11 Nov 2025 15:58:05 +0000 Subject: [PATCH 160/185] ci: add Arm-hosted Graviton4 runner (#17021) * ci: add Arm-hosted Graviton4 runner * ci: add missing dependencies for graviton4 build * ci: enable LFS checkout on graviton4 * ci: move git-lfs install to dependencies in Graviton4 workflow --- .github/workflows/build.yml | 47 +++++++++++++++++++++++++++++++++++++ ci/run.sh | 7 +++++- 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36084c55078..0112fc323f7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1651,3 +1651,50 @@ jobs: run: | GG_BUILD_KLEIDIAI=1 GG_BUILD_EXTRA_TESTS_0=1 bash ./ci/run.sh ./tmp/results ./tmp/mnt + ggml-ci-arm64-graviton4-kleidiai: + runs-on: ah-ubuntu_22_04-c8g_8x + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v4 + + - name: Dependencies + id: depends + run: | + set -euxo pipefail + sudo apt-get update + sudo DEBIAN_FRONTEND=noninteractive NEEDRESTART_MODE=a \ + apt-get install -y \ + build-essential \ + libcurl4-openssl-dev \ + python3-venv \ + gpg \ + wget \ + time \ + git-lfs + + git lfs install + + # install the latest cmake + sudo install -d /usr/share/keyrings + wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc \ + | gpg --dearmor \ + | sudo tee /usr/share/keyrings/kitware-archive-keyring.gpg >/dev/null + echo 'deb [signed-by=/usr/share/keyrings/kitware-archive-keyring.gpg] https://apt.kitware.com/ubuntu/ jammy main' \ + | sudo tee /etc/apt/sources.list.d/kitware.list + sudo apt-get update + sudo apt-get install -y cmake + + - name: ccache + uses: ggml-org/ccache-action@v1.2.16 + with: + key: ggml-ci-arm64-graviton4-kleidiai + evict-old-files: 1d + + - name: Test + id: ggml-ci + run: | + GG_BUILD_KLEIDIAI=1 \ + GG_BUILD_EXTRA_TESTS_0=1 \ + bash ./ci/run.sh ./tmp/results ./tmp/mnt diff --git a/ci/run.sh b/ci/run.sh index 1a4806976aa..3fec8e9110f 100755 --- a/ci/run.sh +++ b/ci/run.sh @@ -121,7 +121,12 @@ fi if [ -n "${GG_BUILD_KLEIDIAI}" ]; then echo ">>===== Enabling KleidiAI support" - CANDIDATES=("armv9-a+dotprod+i8mm" "armv8.6-a+dotprod+i8mm" "armv8.2-a+dotprod") + CANDIDATES=( + "armv9-a+dotprod+i8mm+sve2" + "armv9-a+dotprod+i8mm" + "armv8.6-a+dotprod+i8mm" + "armv8.2-a+dotprod" + ) CPU="" for cpu in "${CANDIDATES[@]}"; do From 7d019cff744b73084b15ca81ba9916f3efab1223 Mon Sep 17 00:00:00 2001 From: Eve <139727413+netrunnereve@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:53:30 +0000 Subject: [PATCH 161/185] disable rms norm mul rope for chips with no fp16 rte (#17134) --- ggml/src/ggml-vulkan/ggml-vulkan.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ggml/src/ggml-vulkan/ggml-vulkan.cpp b/ggml/src/ggml-vulkan/ggml-vulkan.cpp index e4b7e1ea9e5..c6503f03260 100644 --- a/ggml/src/ggml-vulkan/ggml-vulkan.cpp +++ b/ggml/src/ggml-vulkan/ggml-vulkan.cpp @@ -12670,6 +12670,12 @@ static bool ggml_vk_can_fuse_rms_norm_mul_rope(ggml_backend_vk_context * ctx, co return false; } + // conditions for pipeline creation + if (!(ctx->device->float_controls_rte_fp16 && + sizeof(vk_op_rms_norm_mul_rope_push_constants) <= ctx->device->properties.limits.maxPushConstantsSize)) { + return false; + } + return true; } From c273d7537503e47f7be8c293b767ebad1adbc5d0 Mon Sep 17 00:00:00 2001 From: Max Krasnyansky Date: Tue, 11 Nov 2025 15:25:04 -0800 Subject: [PATCH 162/185] hexagon: various Op fixes (#17135) * hexagon: explicitly check for ops with zero nrows llm_graph_context::build_inp_out_ids() can generate tensors with zero nrows. Somehow other backends seems to handle this without obvious explicit checks. In the hexagon case we need to check explicitly and skip them. * hexagon: introduce fastdiv, fix test-backend-ops for ADD/SUB/MUL Co-authored-by: chraac * hexagon: use fastdiv in ADD_ID * hexagon: use ggml_op_is_empty and ggml_is_empty to check for NOPs --------- Co-authored-by: chraac --- ggml/src/ggml-hexagon/ggml-hexagon.cpp | 37 ++++--------- ggml/src/ggml-hexagon/htp/binary-ops.c | 76 ++++++++++++++++---------- ggml/src/ggml-hexagon/htp/htp-msg.h | 8 +-- ggml/src/ggml-hexagon/htp/htp-ops.h | 11 ++++ ggml/src/ggml-hexagon/htp/ops-utils.h | 33 +++++++++++ 5 files changed, 106 insertions(+), 59 deletions(-) diff --git a/ggml/src/ggml-hexagon/ggml-hexagon.cpp b/ggml/src/ggml-hexagon/ggml-hexagon.cpp index 7064b7486f2..cabd301ad35 100644 --- a/ggml/src/ggml-hexagon/ggml-hexagon.cpp +++ b/ggml/src/ggml-hexagon/ggml-hexagon.cpp @@ -3156,26 +3156,17 @@ static inline bool op_reuse_src1(const ggml_tensor * op1, const ggml_tensor * op return (op0 && op0->src[1] == op1->src[1]); } +static inline bool is_compute_op(ggml_tensor *node) +{ + return !(ggml_op_is_empty(node->op) || ggml_is_empty(node)); +} + // scan the graph and figure out last compute op index static inline int last_compute_op(ggml_cgraph * graph) { - int last; + int last = 0; for (int i = 0; i < graph->n_nodes; ++i) { - ggml_tensor * node = graph->nodes[i]; - - switch (node->op) { - case GGML_OP_MUL_MAT: - case GGML_OP_MUL_MAT_ID: - case GGML_OP_MUL: - case GGML_OP_ADD: - case GGML_OP_SUB: - case GGML_OP_RMS_NORM: - case GGML_OP_GLU: - case GGML_OP_ADD_ID: - last = i; - break; - - default: - break; + if (is_compute_op(graph->nodes[i])) { + last = i; } } @@ -3194,6 +3185,10 @@ static ggml_status ggml_backend_hexagon_graph_compute(ggml_backend_t backend, gg for (int i = 0; i < graph->n_nodes; ++i) { ggml_tensor * node = graph->nodes[i]; + if (!is_compute_op(node)) { + continue; + } + uint32_t flags = 0; // skip quantizer if src1 is reused @@ -3245,14 +3240,6 @@ static ggml_status ggml_backend_hexagon_graph_compute(ggml_backend_t backend, gg ggml_hexagon_rope(node, flags); break; - // non-compute ops - case GGML_OP_NONE: - case GGML_OP_RESHAPE: - case GGML_OP_VIEW: - case GGML_OP_PERMUTE: - case GGML_OP_TRANSPOSE: - break; - default: GGML_ABORT("\nggml-hex: graph-compute %s is not supported\n", ggml_op_desc(node)); } diff --git a/ggml/src/ggml-hexagon/htp/binary-ops.c b/ggml/src/ggml-hexagon/htp/binary-ops.c index 92c0109d287..8ed7f67d9c8 100644 --- a/ggml/src/ggml-hexagon/htp/binary-ops.c +++ b/ggml/src/ggml-hexagon/htp/binary-ops.c @@ -34,6 +34,11 @@ static hvx_elemwise_f32_func func_table_HVX[] = { hvx_mul_f32, hvx_add_f32, static hvx_elemwise_f32_func func_table_HVX_opt[] = { hvx_mul_f32_opt, hvx_add_f32_opt, hvx_sub_f32_opt }; #define htp_binary_preamble \ + const struct htp_tensor * src0 = &octx->src0; \ + const struct htp_tensor * src1 = &octx->src1; \ + const struct htp_tensor * src2 = &octx->src2; \ + struct htp_tensor * dst = &octx->dst; \ + \ const uint32_t ne00 = src0->ne[0]; \ const uint32_t ne01 = src0->ne[1]; \ const uint32_t ne02 = src0->ne[2]; \ @@ -62,16 +67,15 @@ static hvx_elemwise_f32_func func_table_HVX_opt[] = { hvx_mul_f32_opt, hvx_add_f const uint32_t nb0 = dst->nb[0]; \ const uint32_t nb1 = dst->nb[1]; \ const uint32_t nb2 = dst->nb[2]; \ - const uint32_t nb3 = dst->nb[3]; - -static void binary_job_f32_per_thread(const struct htp_tensor * src0, - const struct htp_tensor * src1, - struct htp_tensor * dst, - uint8_t * spad_data, - uint32_t nth, - uint32_t ith, - uint32_t src0_nrows_per_thread, - enum htp_op op) { + const uint32_t nb3 = dst->nb[3]; \ + \ + const uint32_t src0_nrows_per_thread = octx->src0_nrows_per_thread; + +static void binary_job_f32_per_thread(struct htp_ops_context * octx, + uint8_t * spad_data, + uint32_t nth, + uint32_t ith, + enum htp_op op) { htp_binary_preamble; const size_t src0_row_size = nb01; @@ -107,16 +111,23 @@ static void binary_job_f32_per_thread(const struct htp_tensor * src0, uint8_t * restrict spad_data_th = spad_data + (ith * src0_row_size); - const uint32_t nr0 = ne00 / ne10; - const uint8_t * restrict src0_ptr = (const uint8_t *) src0->data + (src0_start_row * src0_row_size); uint8_t * restrict dst_ptr = (uint8_t *) dst->data + (src0_start_row * dst_row_size); const uint8_t * restrict data_src1 = (const uint8_t *) src1->data; - const uint8_t * restrict src1_ptr = NULL; + + const uint32_t ne02_ne01 = ne02 * ne01; for (uint32_t ir = src0_start_row; ir < src0_end_row; ir++) { - src1_ptr = data_src1 + (ir % src1_nrows) * src1_row_size; + const uint32_t i03 = fastdiv(ir, &octx->src0_div21); + const uint32_t i02 = fastdiv(ir - i03 * ne02_ne01, &octx->src0_div1); + const uint32_t i01 = (ir - i03 * ne02_ne01 - i02 * ne01); + + const uint32_t i13 = fastmodulo(i03, ne13, &octx->src1_div3); + const uint32_t i12 = fastmodulo(i02, ne12, &octx->src1_div2); + const uint32_t i11 = fastmodulo(i01, ne11, &octx->src1_div1); + + const uint8_t * restrict src1_ptr = data_src1 + i13 * nb13 + i12 * nb12 + i11 * src1_row_size; if (ir + 1 < src0_end_row) { htp_l2fetch(src0_ptr + ne00, 1, src0_row_size, src0_row_size); @@ -125,6 +136,7 @@ static void binary_job_f32_per_thread(const struct htp_tensor * src0, } } + const uint32_t nr0 = ne00 / ne10; if (nr0 > 1) { if ((1 == is_aligned) && (nr0 == ne00)) { hvx_bcast_fp32_a(spad_data_th, *(float *) src1_ptr, nr0); @@ -149,22 +161,17 @@ static void binary_job_f32_per_thread(const struct htp_tensor * src0, (unsigned) HAP_perf_qtimer_count_to_us(t2 - t1)); } -static void binary_add_id_job_f32_per_thread(const struct htp_tensor * src0, - const struct htp_tensor * src1, - const struct htp_tensor * src2, - struct htp_tensor * dst, - uint8_t * spad_data, - uint32_t nth, - uint32_t ith, - uint32_t src0_nrows_per_thread, - hvx_elemwise_f32_func func_HVX) { +static void binary_add_id_job_f32_per_thread(struct htp_ops_context * octx, + uint8_t * spad_data, + uint32_t nth, + uint32_t ith, + hvx_elemwise_f32_func func_HVX) { htp_binary_preamble; const size_t src0_row_size = nb01; const size_t src1_row_size = nb11; const size_t dst_row_size = nb1; - const uint32_t ne02_ne01 = ne02 * ne01; const uint32_t src0_nrows = ne01 * ne02 * ne03; // src0 rows const uint32_t src0_start_row = src0_nrows_per_thread * ith; @@ -187,10 +194,11 @@ static void binary_add_id_job_f32_per_thread(const struct htp_tensor * src0, const uint8_t * restrict data_src1 = (const uint8_t *) src1->data; uint8_t * restrict data_dst = (uint8_t *) dst->data; + const uint32_t ne02_ne01 = ne02 * ne01; for (uint32_t ir = src0_start_row; ir < src0_end_row; ir++) { // src0 indices - const uint32_t i03 = ir / ne02_ne01; - const uint32_t i02 = (ir - i03 * ne02_ne01) / ne01; + const uint32_t i03 = fastdiv(ir, &octx->src0_div21); + const uint32_t i02 = fastdiv(ir - i03 * ne02_ne01, &octx->src0_div1); const uint32_t i01 = (ir - i03 * ne02_ne01 - i02 * ne01); // src1 indices @@ -234,13 +242,11 @@ static void binary_job_dispatcher_f32(unsigned int n, unsigned int i, void * dat case HTP_OP_MUL: case HTP_OP_ADD: case HTP_OP_SUB: - binary_job_f32_per_thread(&octx->src0, &octx->src1, &octx->dst, octx->src1_spad.data, n, i, - octx->src0_nrows_per_thread, octx->op); + binary_job_f32_per_thread(octx, octx->src1_spad.data, n, i, octx->op); break; case HTP_OP_ADD_ID: - binary_add_id_job_f32_per_thread(&octx->src0, &octx->src1, &octx->src2, &octx->dst, octx->src0_spad.data, n, - i, octx->src0_nrows_per_thread, hvx_add_f32); + binary_add_id_job_f32_per_thread(octx, octx->src0_spad.data, n, i, hvx_add_f32); break; default: @@ -321,6 +327,16 @@ static int execute_op_binary_f32(struct htp_ops_context * octx) { octx->src0_nrows_per_thread = (src0_nrows + n_jobs - 1) / n_jobs; + octx->src0_div21 = init_fastdiv_values(src0->ne[2] * src0->ne[1]); + octx->src0_div3 = init_fastdiv_values(src0->ne[3]); + octx->src0_div2 = init_fastdiv_values(src0->ne[2]); + octx->src0_div1 = init_fastdiv_values(src0->ne[1]); + + octx->src1_div21 = init_fastdiv_values(src1->ne[2] * src1->ne[1]); + octx->src1_div3 = init_fastdiv_values(src1->ne[3]); + octx->src1_div2 = init_fastdiv_values(src1->ne[2]); + octx->src1_div1 = init_fastdiv_values(src1->ne[1]); + worker_pool_run_func(octx->ctx->worker_pool, binary_op_func, octx, n_jobs); } diff --git a/ggml/src/ggml-hexagon/htp/htp-msg.h b/ggml/src/ggml-hexagon/htp/htp-msg.h index f23d5788068..9278f41f4e1 100644 --- a/ggml/src/ggml-hexagon/htp/htp-msg.h +++ b/ggml/src/ggml-hexagon/htp/htp-msg.h @@ -119,10 +119,10 @@ static const char * htp_type_name(uint32_t t) { #define HTP_MAX_DIMS 4 struct htp_tensor { - uint32_t data; // Buffer offset in the messages, and data pointer on the NSP - uint32_t type; // Data type - uint32_t ne[HTP_MAX_DIMS]; // Number of elements - uint32_t nb[HTP_MAX_DIMS]; // Stride in bytes (see ggml.h ggml_tensor) + uint32_t data; // Buffer offset in the messages, and data pointer on the NSP + uint32_t type; // Data type + uint32_t ne[HTP_MAX_DIMS]; // Number of elements + uint32_t nb[HTP_MAX_DIMS]; // Stride in bytes (see ggml.h ggml_tensor) }; #define HTP_MAX_OP_PARAMS 64 diff --git a/ggml/src/ggml-hexagon/htp/htp-ops.h b/ggml/src/ggml-hexagon/htp/htp-ops.h index 45723196791..e87657436f0 100644 --- a/ggml/src/ggml-hexagon/htp/htp-ops.h +++ b/ggml/src/ggml-hexagon/htp/htp-ops.h @@ -4,6 +4,7 @@ #include "htp-ctx.h" #include "htp-msg.h" #include "worker-pool.h" +#include "ops-utils.h" #include #include @@ -38,6 +39,16 @@ struct htp_ops_context { uint32_t src0_nrows_per_thread; uint32_t src1_nrows_per_thread; + struct fastdiv_values src0_div1; // fastdiv values for ne1 + struct fastdiv_values src0_div2; // fastdiv values for ne2 + struct fastdiv_values src0_div3; // fastdiv values for ne3 + struct fastdiv_values src0_div21; // fastdiv values for ne2 * ne1 + + struct fastdiv_values src1_div1; // fastdiv values for ne1 + struct fastdiv_values src1_div2; // fastdiv values for ne2 + struct fastdiv_values src1_div3; // fastdiv values for ne3 + struct fastdiv_values src1_div21; // fastdiv values for ne2 * ne1 + uint32_t flags; }; diff --git a/ggml/src/ggml-hexagon/htp/ops-utils.h b/ggml/src/ggml-hexagon/htp/ops-utils.h index 302f1625216..af9c3305f61 100644 --- a/ggml/src/ggml-hexagon/htp/ops-utils.h +++ b/ggml/src/ggml-hexagon/htp/ops-utils.h @@ -31,6 +31,39 @@ static inline uint32_t htp_round_up(uint32_t n, uint32_t m) { return m * ((n + m - 1) / m); } +// See https://gmplib.org/~tege/divcnst-pldi94.pdf figure 4.1. +// Precompute mp (m' in the paper) and L such that division +// can be computed using a multiply (high 32b of 64b result) +// and a shift: +// +// n/d = (mulhi(n, mp) + n) >> L; +struct fastdiv_values { + uint32_t mp; + uint32_t l; +}; + +static inline struct fastdiv_values init_fastdiv_values(uint32_t d) { + struct fastdiv_values result = { 0, 0 }; + // compute L = ceil(log2(d)); + while (result.l < 32 && ((uint32_t) 1 << result.l) < d) { + ++(result.l); + } + + result.mp = (uint32_t) (((uint64_t) 1 << 32) * (((uint64_t) 1 << result.l) - d) / d + 1); + return result; +} + +static inline uint32_t fastdiv(uint32_t n, const struct fastdiv_values * vals) { + // Compute high 32 bits of n * mp + const uint32_t hi = (uint32_t) (((uint64_t) n * vals->mp) >> 32); // mulhi(n, mp) + // add n, apply bit shift + return (hi + n) >> vals->l; +} + +static inline uint32_t fastmodulo(uint32_t n, uint32_t d, const struct fastdiv_values * vals) { + return n - fastdiv(n, vals) * d; +} + static inline void htp_l2fetch(const void * p, uint32_t height, uint32_t width, uint32_t stride) { const uint64_t control = Q6_P_combine_RR(stride, Q6_R_combine_RlRl(width, height)); asm volatile(" l2fetch(%0,%1) " : : "r"(p), "r"(control)); From 23a46ce972cd1fa08e967f17ee9e024e87dcaadb Mon Sep 17 00:00:00 2001 From: Raul Torres <138264735+rauletorresc@users.noreply.github.com> Date: Wed, 12 Nov 2025 06:37:52 +0000 Subject: [PATCH 163/185] CANN: GGML_CANN_ACL_GRAPH works only USE_ACL_GRAPH enabled (#16861) The documentation should state that `GGML_CANN_ACL_GRAPH` is only effective if `USE_ACL_GRAPH` was enabled at compilation time. --- docs/backend/CANN.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/backend/CANN.md b/docs/backend/CANN.md index e45fc7dd28f..37dcfaef9a8 100755 --- a/docs/backend/CANN.md +++ b/docs/backend/CANN.md @@ -313,7 +313,12 @@ Converting the matmul weight format from ND to NZ to improve performance. Enable ### GGML_CANN_ACL_GRAPH -Operators are executed using ACL graph execution, rather than in op-by-op (eager) mode. Enabled by default. +Operators are executed using ACL graph execution, rather than in op-by-op (eager) mode. Enabled by default. This option is only effective if `USE_ACL_GRAPH` was enabled at compilation time. To enable it, recompile using: + +```sh +cmake -B build -DGGML_CANN=on -DCMAKE_BUILD_TYPE=release -DUSE_ACL_GRAPH=ON +cmake --build build --config release +``` ### GGML_CANN_GRAPH_CACHE_CAPACITY From 5da7664960f93a5602d166326f6375dd7cc112ad Mon Sep 17 00:00:00 2001 From: Neo Zhang Jianyu Date: Wed, 12 Nov 2025 14:44:29 +0800 Subject: [PATCH 164/185] [SYCL]fix ci crash about SSM_CONV (#17169) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix ci crash * Update ggml-sycl.cpp * Update ggml/src/ggml-sycl/ggml-sycl.cpp Co-authored-by: Sigbjørn Skjæret --------- Co-authored-by: Zhang Jianyu Co-authored-by: Sigbjørn Skjæret --- ggml/src/ggml-sycl/ggml-sycl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/ggml/src/ggml-sycl/ggml-sycl.cpp b/ggml/src/ggml-sycl/ggml-sycl.cpp index f3b3e365740..941fd41c0d0 100644 --- a/ggml/src/ggml-sycl/ggml-sycl.cpp +++ b/ggml/src/ggml-sycl/ggml-sycl.cpp @@ -3933,6 +3933,7 @@ static bool ggml_sycl_compute_forward(ggml_backend_sycl_context & ctx, struct gg break; case GGML_OP_SSM_CONV: ggml_sycl_ssm_conv(ctx, dst); + break; case GGML_OP_ROLL: ggml_sycl_roll(ctx, dst); break; From 655cddd174ab49643aaa6b8e20ca28fd3be254a6 Mon Sep 17 00:00:00 2001 From: TecJesh Date: Wed, 12 Nov 2025 15:11:42 +0800 Subject: [PATCH 165/185] CANN: Add L2_NORM op support (#16856) * update L2_NORM op support * update L2_NORM op support * remove extra whitespace --- ggml/src/ggml-cann/aclnn_ops.cpp | 29 +++++++++++++++++++++++++++++ ggml/src/ggml-cann/aclnn_ops.h | 24 ++++++++++++++++++++++++ ggml/src/ggml-cann/ggml-cann.cpp | 4 ++++ 3 files changed, 57 insertions(+) diff --git a/ggml/src/ggml-cann/aclnn_ops.cpp b/ggml/src/ggml-cann/aclnn_ops.cpp index 5df6dc96a3b..4835c5c0387 100644 --- a/ggml/src/ggml-cann/aclnn_ops.cpp +++ b/ggml/src/ggml-cann/aclnn_ops.cpp @@ -448,6 +448,35 @@ void ggml_cann_norm(ggml_backend_cann_context & ctx, ggml_tensor * dst) { ggml_cann_release_resources(ctx, norm, acl_src, acl_dst); } +void ggml_cann_l2_norm(ggml_backend_cann_context & ctx, ggml_tensor * dst) { + ggml_tensor * src = dst->src[0]; + + aclTensor * acl_src = ggml_cann_create_tensor(src); + aclTensor * acl_dst = ggml_cann_create_tensor(dst); + + size_t type_size = ggml_type_size(src->type); + int64_t n_bytes = src->ne[3]* src->ne[2]* src->ne[1]* type_size; + ggml_cann_pool_alloc temp_buffer_allocator(ctx.pool(), n_bytes); + void * buffer = temp_buffer_allocator.get(); + + int64_t div_ne[] = {1, src->ne[1], src->ne[2], src->ne[3]}; + size_t div_nb[GGML_MAX_DIMS]; + div_nb[0] = sizeof(float); + for (int i = 1; i < GGML_MAX_DIMS; ++i) { + div_nb[i] = div_nb[i - 1] * div_ne[i - 1]; + } + aclTensor * acl_div = ggml_cann_create_tensor(buffer, ACL_FLOAT, type_size, div_ne, div_nb, GGML_MAX_DIMS); + + std::vector norm_dims = { 3 }; + aclIntArray * dims_array = aclCreateIntArray(norm_dims.data(), norm_dims.size()); + + float p_value = 2.0f; + aclScalar * p_scalar = aclCreateScalar(&p_value, aclDataType::ACL_FLOAT); + GGML_CANN_CALL_ACLNN_OP(ctx, Norm, acl_src, p_scalar, dims_array, true, acl_div); + GGML_CANN_CALL_ACLNN_OP(ctx, Div, acl_src, acl_div, acl_dst); + ggml_cann_release_resources(ctx, dims_array, p_scalar, acl_src, acl_dst, acl_div); +} + void ggml_cann_group_norm(ggml_backend_cann_context & ctx, ggml_tensor * dst) { ggml_tensor * src = dst->src[0]; diff --git a/ggml/src/ggml-cann/aclnn_ops.h b/ggml/src/ggml-cann/aclnn_ops.h index ec7455af88c..060eedbbb02 100644 --- a/ggml/src/ggml-cann/aclnn_ops.h +++ b/ggml/src/ggml-cann/aclnn_ops.h @@ -46,6 +46,7 @@ #include #include #include +#include #include "acl_tensor.h" #include "common.h" @@ -187,6 +188,29 @@ void ggml_cann_argsort(ggml_backend_cann_context & ctx, ggml_tensor * dst); */ void ggml_cann_norm(ggml_backend_cann_context & ctx, ggml_tensor * dst); +/** + * @brief Computes the L2 Normalization for a ggml tensor using the CANN + * backend. + * + * @details This function applies the L2 Normalization operation on the + * input tensor `src` and stores the result in the destination tensor + * `dst`. L2 Normalization scales the input tensor such that the + * L2 norm along the specified dimension equals 1. This operation + * is commonly used in neural networks for feature normalization + * and vector scaling. + * The operation is defined as: + * \f[ + * \text{out} = \frac{x}{\sqrt{\sum{x^2}}} + * \f] + * The normalization is performed along the last dimension by default. + * + * @param ctx The CANN context used for operations. + * @param dst The destination tensor where the normalized values will be stored. + * @attention The normalization is performed along the last dimension of the + * input tensor by default. + */ +void ggml_cann_l2_norm(ggml_backend_cann_context & ctx, ggml_tensor * dst); + /** * @brief Computes the Group Normalization for a ggml tensor using the CANN * backend. diff --git a/ggml/src/ggml-cann/ggml-cann.cpp b/ggml/src/ggml-cann/ggml-cann.cpp index 51345742ee5..9de9440ac65 100644 --- a/ggml/src/ggml-cann/ggml-cann.cpp +++ b/ggml/src/ggml-cann/ggml-cann.cpp @@ -1777,6 +1777,9 @@ static bool ggml_cann_compute_forward(ggml_backend_cann_context & ctx, struct gg case GGML_OP_GROUP_NORM: ggml_cann_group_norm(ctx, dst); break; + case GGML_OP_L2_NORM: + ggml_cann_l2_norm(ctx, dst); + break; case GGML_OP_CONCAT: ggml_cann_concat(ctx, dst); break; @@ -2515,6 +2518,7 @@ static bool ggml_backend_cann_supports_op(ggml_backend_dev_t dev, const ggml_ten // value of paddingW should be at most half of kernelW return (p0 <= (k0 / 2)) && (p1 <= (k1 / 2)); } + case GGML_OP_L2_NORM: case GGML_OP_DUP: case GGML_OP_SUM: case GGML_OP_IM2COL: From 78010a0d52ad03cd469448df89101579b225582c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Wed, 12 Nov 2025 12:32:50 +0100 Subject: [PATCH 166/185] cmake : move OpenSSL linking to vendor/cpp-httplib (#17177) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * cmake : move OpenSSL linking to vendor/cpp-httplib Signed-off-by: Adrien Gallouët * bring back httplib 0.27.0 * add -DLLAMA_HTTPLIB * update cmake config for visionos --------- Signed-off-by: Adrien Gallouët Co-authored-by: Xuan Son Nguyen --- CMakeLists.txt | 5 +- build-xcframework.sh | 4 + common/CMakeLists.txt | 40 +- common/download.cpp | 76 +- scripts/sync_vendor.py | 2 +- tools/server/CMakeLists.txt | 4 + vendor/cpp-httplib/CMakeLists.txt | 38 +- vendor/cpp-httplib/httplib.cpp | 3147 +++++++++++++++++++++-------- vendor/cpp-httplib/httplib.h | 842 ++++---- 9 files changed, 2866 insertions(+), 1292 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e7410184dfa..3278c4a72c1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -92,6 +92,7 @@ option(LLAMA_TOOLS_INSTALL "llama: install tools" ${LLAMA_TOOLS_INSTALL_ # 3rd party libs option(LLAMA_CURL "llama: use libcurl to download model from an URL" ON) +option(LLAMA_HTTPLIB "llama: if libcurl is disabled, use httplib to download model from an URL" ON) option(LLAMA_OPENSSL "llama: use openssl to support HTTPS" OFF) option(LLAMA_LLGUIDANCE "llama-common: include LLGuidance library for structured output in common utils" OFF) @@ -200,7 +201,9 @@ endif() if (LLAMA_BUILD_COMMON) add_subdirectory(common) - add_subdirectory(vendor/cpp-httplib) + if (LLAMA_HTTPLIB) + add_subdirectory(vendor/cpp-httplib) + endif() endif() if (LLAMA_BUILD_COMMON AND LLAMA_BUILD_TESTS AND NOT CMAKE_JS_VERSION) diff --git a/build-xcframework.sh b/build-xcframework.sh index 796f8016ca6..81280f74977 100755 --- a/build-xcframework.sh +++ b/build-xcframework.sh @@ -454,6 +454,8 @@ cmake -B build-visionos -G Xcode \ -DCMAKE_C_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_CXX_FLAGS}" \ -DLLAMA_CURL=OFF \ + -DLLAMA_HTTPLIB=OFF \ + -DLLAMA_BUILD_SERVER=OFF \ -S . cmake --build build-visionos --config Release -- -quiet @@ -468,6 +470,8 @@ cmake -B build-visionos-sim -G Xcode \ -DCMAKE_C_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_C_FLAGS}" \ -DCMAKE_CXX_FLAGS="-D_XOPEN_SOURCE=700 ${COMMON_CXX_FLAGS}" \ -DLLAMA_CURL=OFF \ + -DLLAMA_HTTPLIB=OFF \ + -DLLAMA_BUILD_SERVER=OFF \ -S . cmake --build build-visionos-sim --config Release -- -quiet diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 1d260507ad5..0c34ce1151c 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -91,47 +91,13 @@ if (LLAMA_CURL) target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_CURL) include_directories(${CURL_INCLUDE_DIRS}) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} ${CURL_LIBRARIES}) -else() +elseif (LLAMA_HTTPLIB) # otherwise, use cpp-httplib + message(FATAL "test") + target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_HTTPLIB) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} cpp-httplib) endif() -if (LLAMA_OPENSSL) - find_package(OpenSSL) - if (OpenSSL_FOUND) - include(CheckCSourceCompiles) - set(SAVED_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) - set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) - check_c_source_compiles(" - #include - #if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER) - # if OPENSSL_VERSION_NUMBER < 0x1010107f - # error bad version - # endif - #else - # if OPENSSL_VERSION_NUMBER < 0x30000000L - # error bad version - # endif - #endif - int main() { return 0; } - " OPENSSL_VERSION_SUPPORTED) - set(CMAKE_REQUIRED_INCLUDES ${SAVED_CMAKE_REQUIRED_INCLUDES}) - if (OPENSSL_VERSION_SUPPORTED) - message(STATUS "OpenSSL found: ${OPENSSL_VERSION}") - target_compile_definitions(${TARGET} PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) - target_link_libraries(${TARGET} PUBLIC OpenSSL::SSL OpenSSL::Crypto) - if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin") - target_compile_definitions(${TARGET} PUBLIC CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) - find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation REQUIRED) - find_library(SECURITY_FRAMEWORK Security REQUIRED) - target_link_libraries(${TARGET} PUBLIC ${CORE_FOUNDATION_FRAMEWORK} ${SECURITY_FRAMEWORK}) - endif() - endif() - else() - message(STATUS "OpenSSL not found, SSL support disabled") - endif() -endif() - if (LLAMA_LLGUIDANCE) include(ExternalProject) set(LLGUIDANCE_SRC ${CMAKE_BINARY_DIR}/llguidance/source) diff --git a/common/download.cpp b/common/download.cpp index 57308a5c6d5..eeb32b6a863 100644 --- a/common/download.cpp +++ b/common/download.cpp @@ -20,7 +20,7 @@ #if defined(LLAMA_USE_CURL) #include #include -#else +#elif defined(LLAMA_USE_HTTPLIB) #include "http.h" #endif @@ -467,7 +467,7 @@ std::pair> common_remote_get_content(const std::string & return { res_code, std::move(res_buffer) }; } -#else +#elif defined(LLAMA_USE_HTTPLIB) static bool is_output_a_tty() { #if defined(_WIN32) @@ -713,6 +713,8 @@ std::pair> common_remote_get_content(const std::string #endif // LLAMA_USE_CURL +#if defined(LLAMA_USE_CURL) || defined(LLAMA_USE_HTTPLIB) + static bool common_download_file_single(const std::string & url, const std::string & path, const std::string & bearer_token, @@ -907,33 +909,6 @@ common_hf_file_res common_get_hf_file(const std::string & hf_repo_with_tag, cons return { hf_repo, ggufFile, mmprojFile }; } -std::vector common_list_cached_models() { - std::vector models; - const std::string cache_dir = fs_get_cache_directory(); - const std::vector files = fs_list_files(cache_dir); - for (const auto & file : files) { - if (string_starts_with(file.name, "manifest=") && string_ends_with(file.name, ".json")) { - common_cached_model_info model_info; - model_info.manifest_path = file.path; - std::string fname = file.name; - string_replace_all(fname, ".json", ""); // remove extension - auto parts = string_split(fname, '='); - if (parts.size() == 4) { - // expect format: manifest==== - model_info.user = parts[1]; - model_info.model = parts[2]; - model_info.tag = parts[3]; - } else { - // invalid format - continue; - } - model_info.size = 0; // TODO: get GGUF size, not manifest size - models.push_back(model_info); - } - } - return models; -} - // // Docker registry functions // @@ -1052,3 +1027,46 @@ std::string common_docker_resolve_model(const std::string & docker) { throw; } } + +#else + +common_hf_file_res common_get_hf_file(const std::string &, const std::string &, bool) { + throw std::runtime_error("download functionality is not enabled in this build"); +} + +bool common_download_model(const common_params_model &, const std::string &, bool) { + throw std::runtime_error("download functionality is not enabled in this build"); +} + +std::string common_docker_resolve_model(const std::string &) { + throw std::runtime_error("download functionality is not enabled in this build"); +} + +#endif // LLAMA_USE_CURL || LLAMA_USE_HTTPLIB + +std::vector common_list_cached_models() { + std::vector models; + const std::string cache_dir = fs_get_cache_directory(); + const std::vector files = fs_list_files(cache_dir); + for (const auto & file : files) { + if (string_starts_with(file.name, "manifest=") && string_ends_with(file.name, ".json")) { + common_cached_model_info model_info; + model_info.manifest_path = file.path; + std::string fname = file.name; + string_replace_all(fname, ".json", ""); // remove extension + auto parts = string_split(fname, '='); + if (parts.size() == 4) { + // expect format: manifest==== + model_info.user = parts[1]; + model_info.model = parts[2]; + model_info.tag = parts[3]; + } else { + // invalid format + continue; + } + model_info.size = 0; // TODO: get GGUF size, not manifest size + models.push_back(model_info); + } + } + return models; +} diff --git a/scripts/sync_vendor.py b/scripts/sync_vendor.py index b578cf1e6af..ac94387dd2f 100755 --- a/scripts/sync_vendor.py +++ b/scripts/sync_vendor.py @@ -14,7 +14,7 @@ "https://github.com/mackron/miniaudio/raw/refs/tags/0.11.22/miniaudio.h": "vendor/miniaudio/miniaudio.h", - "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.20.1/httplib.h": "vendor/cpp-httplib/httplib.h", + "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.27.0/httplib.h": "vendor/cpp-httplib/httplib.h", } for url, filename in vendor.items(): diff --git a/tools/server/CMakeLists.txt b/tools/server/CMakeLists.txt index 5f8a50320d1..c801e84c3d4 100644 --- a/tools/server/CMakeLists.txt +++ b/tools/server/CMakeLists.txt @@ -7,6 +7,10 @@ if (MINGW) add_compile_definitions(_WIN32_WINNT=${GGML_WIN_VER}) endif() +if (NOT LLAMA_HTTPLIB) + message(FATAL_ERROR "LLAMA_HTTPLIB is OFF, cannot build llama-server. Hint: to skip building server, set -DLLAMA_BUILD_SERVER=OFF") +endif() + set(TARGET_SRCS server.cpp utils.hpp diff --git a/vendor/cpp-httplib/CMakeLists.txt b/vendor/cpp-httplib/CMakeLists.txt index 0033d52371f..3b42fc8c1dc 100644 --- a/vendor/cpp-httplib/CMakeLists.txt +++ b/vendor/cpp-httplib/CMakeLists.txt @@ -22,7 +22,39 @@ target_compile_definitions(${TARGET} PRIVATE CPPHTTPLIB_TCP_NODELAY=1 ) -if (${CMAKE_SYSTEM_NAME} MATCHES "visionOS") - # quick fix for https://github.com/ggml-org/llama.cpp/actions/runs/19247291428/job/55024294176?pr=17150 - target_compile_definitions(${TARGET} PRIVATE NI_MAXHOST=1025) +if (LLAMA_OPENSSL) + find_package(OpenSSL) + if (OpenSSL_FOUND) + include(CheckCSourceCompiles) + set(SAVED_CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES}) + set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR}) + check_c_source_compiles(" + #include + #if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER) + # if OPENSSL_VERSION_NUMBER < 0x1010107f + # error bad version + # endif + #else + # if OPENSSL_VERSION_NUMBER < 0x30000000L + # error bad version + # endif + #endif + int main() { return 0; } + " OPENSSL_VERSION_SUPPORTED) + set(CMAKE_REQUIRED_INCLUDES ${SAVED_CMAKE_REQUIRED_INCLUDES}) + if (OPENSSL_VERSION_SUPPORTED) + message(STATUS "OpenSSL found: ${OPENSSL_VERSION}") + target_compile_definitions(${TARGET} PUBLIC CPPHTTPLIB_OPENSSL_SUPPORT) + target_link_libraries(${TARGET} PUBLIC OpenSSL::SSL OpenSSL::Crypto) + if (APPLE AND CMAKE_SYSTEM_NAME STREQUAL "Darwin") + target_compile_definitions(${TARGET} PUBLIC CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) + find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation REQUIRED) + find_library(SECURITY_FRAMEWORK Security REQUIRED) + target_link_libraries(${TARGET} PUBLIC ${CORE_FOUNDATION_FRAMEWORK} ${SECURITY_FRAMEWORK}) + endif() + endif() + else() + message(STATUS "OpenSSL not found, SSL support disabled") + endif() endif() + diff --git a/vendor/cpp-httplib/httplib.cpp b/vendor/cpp-httplib/httplib.cpp index e5c84d2b221..5432db69b4b 100644 --- a/vendor/cpp-httplib/httplib.cpp +++ b/vendor/cpp-httplib/httplib.cpp @@ -168,28 +168,7 @@ bool FileStat::is_dir() const { return ret_ >= 0 && S_ISDIR(st_.st_mode); } -std::string encode_query_param(const std::string &value) { - std::ostringstream escaped; - escaped.fill('0'); - escaped << std::hex; - - for (auto c : value) { - if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || - c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || - c == ')') { - escaped << c; - } else { - escaped << std::uppercase; - escaped << '%' << std::setw(2) - << static_cast(static_cast(c)); - escaped << std::nouppercase; - } - } - - return escaped.str(); -} - -std::string encode_url(const std::string &s) { +std::string encode_path(const std::string &s) { std::string result; result.reserve(s.size()); @@ -221,43 +200,6 @@ std::string encode_url(const std::string &s) { return result; } -std::string decode_url(const std::string &s, - bool convert_plus_to_space) { - std::string result; - - for (size_t i = 0; i < s.size(); i++) { - if (s[i] == '%' && i + 1 < s.size()) { - if (s[i + 1] == 'u') { - auto val = 0; - if (from_hex_to_i(s, i + 2, 4, val)) { - // 4 digits Unicode codes - char buff[4]; - size_t len = to_utf8(val, buff); - if (len > 0) { result.append(buff, len); } - i += 5; // 'u0000' - } else { - result += s[i]; - } - } else { - auto val = 0; - if (from_hex_to_i(s, i + 1, 2, val)) { - // 2 digits hex codes - result += static_cast(val); - i += 2; // '00' - } else { - result += s[i]; - } - } - } else if (convert_plus_to_space && s[i] == '+') { - result += ' '; - } else { - result += s[i]; - } - } - - return result; -} - std::string file_extension(const std::string &path) { std::smatch m; thread_local auto re = std::regex("\\.([a-zA-Z0-9]+)$"); @@ -428,13 +370,8 @@ bool mmap::open(const char *path) { auto wpath = u8string_to_wstring(path); if (wpath.empty()) { return false; } -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 hFile_ = ::CreateFile2(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, NULL); -#else - hFile_ = ::CreateFileW(wpath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, - OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); -#endif if (hFile_ == INVALID_HANDLE_VALUE) { return false; } @@ -450,12 +387,8 @@ bool mmap::open(const char *path) { } size_ = static_cast(size.QuadPart); -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 hMapping_ = ::CreateFileMappingFromApp(hFile_, NULL, PAGE_READONLY, size_, NULL); -#else - hMapping_ = ::CreateFileMappingW(hFile_, NULL, PAGE_READONLY, 0, 0, NULL); -#endif // Special treatment for an empty file... if (hMapping_ == NULL && size_ == 0) { @@ -469,11 +402,7 @@ bool mmap::open(const char *path) { return false; } -#if _WIN32_WINNT >= _WIN32_WINNT_WIN8 addr_ = ::MapViewOfFileFromApp(hMapping_, FILE_MAP_READ, 0, 0); -#else - addr_ = ::MapViewOfFile(hMapping_, FILE_MAP_READ, 0, 0, 0); -#endif if (addr_ == nullptr) { close(); @@ -600,6 +529,23 @@ int poll_wrapper(struct pollfd *fds, nfds_t nfds, int timeout) { template ssize_t select_impl(socket_t sock, time_t sec, time_t usec) { +#ifdef __APPLE__ + if (sock >= FD_SETSIZE) { return -1; } + + fd_set fds, *rfds, *wfds; + FD_ZERO(&fds); + FD_SET(sock, &fds); + rfds = (Read ? &fds : nullptr); + wfds = (Read ? nullptr : &fds); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + return handle_EINTR([&]() { + return select(static_cast(sock + 1), rfds, wfds, nullptr, &tv); + }); +#else struct pollfd pfd; pfd.fd = sock; pfd.events = (Read ? POLLIN : POLLOUT); @@ -607,6 +553,7 @@ ssize_t select_impl(socket_t sock, time_t sec, time_t usec) { auto timeout = static_cast(sec * 1000 + usec / 1000); return handle_EINTR([&]() { return poll_wrapper(&pfd, 1, timeout); }); +#endif } ssize_t select_read(socket_t sock, time_t sec, time_t usec) { @@ -619,6 +566,36 @@ ssize_t select_write(socket_t sock, time_t sec, time_t usec) { Error wait_until_socket_is_ready(socket_t sock, time_t sec, time_t usec) { +#ifdef __APPLE__ + if (sock >= FD_SETSIZE) { return Error::Connection; } + + fd_set fdsr, fdsw; + FD_ZERO(&fdsr); + FD_ZERO(&fdsw); + FD_SET(sock, &fdsr); + FD_SET(sock, &fdsw); + + timeval tv; + tv.tv_sec = static_cast(sec); + tv.tv_usec = static_cast(usec); + + auto ret = handle_EINTR([&]() { + return select(static_cast(sock + 1), &fdsr, &fdsw, nullptr, &tv); + }); + + if (ret == 0) { return Error::ConnectionTimeout; } + + if (ret > 0 && (FD_ISSET(sock, &fdsr) || FD_ISSET(sock, &fdsw))) { + auto error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +#else struct pollfd pfd_read; pfd_read.fd = sock; pfd_read.events = POLLIN | POLLOUT; @@ -640,6 +617,7 @@ Error wait_until_socket_is_ready(socket_t sock, time_t sec, } return Error::Connection; +#endif } bool is_socket_alive(socket_t sock) { @@ -827,11 +805,339 @@ unescape_abstract_namespace_unix_domain(const std::string &s) { return s; } +int getaddrinfo_with_timeout(const char *node, const char *service, + const struct addrinfo *hints, + struct addrinfo **res, time_t timeout_sec) { +#ifdef CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO + if (timeout_sec <= 0) { + // No timeout specified, use standard getaddrinfo + return getaddrinfo(node, service, hints, res); + } + +#ifdef _WIN32 + // Windows-specific implementation using GetAddrInfoEx with overlapped I/O + OVERLAPPED overlapped = {0}; + HANDLE event = CreateEventW(nullptr, TRUE, FALSE, nullptr); + if (!event) { return EAI_FAIL; } + + overlapped.hEvent = event; + + PADDRINFOEXW result_addrinfo = nullptr; + HANDLE cancel_handle = nullptr; + + ADDRINFOEXW hints_ex = {0}; + if (hints) { + hints_ex.ai_flags = hints->ai_flags; + hints_ex.ai_family = hints->ai_family; + hints_ex.ai_socktype = hints->ai_socktype; + hints_ex.ai_protocol = hints->ai_protocol; + } + + auto wnode = u8string_to_wstring(node); + auto wservice = u8string_to_wstring(service); + + auto ret = ::GetAddrInfoExW(wnode.data(), wservice.data(), NS_DNS, nullptr, + hints ? &hints_ex : nullptr, &result_addrinfo, + nullptr, &overlapped, nullptr, &cancel_handle); + + if (ret == WSA_IO_PENDING) { + auto wait_result = + ::WaitForSingleObject(event, static_cast(timeout_sec * 1000)); + if (wait_result == WAIT_TIMEOUT) { + if (cancel_handle) { ::GetAddrInfoExCancel(&cancel_handle); } + ::CloseHandle(event); + return EAI_AGAIN; + } + + DWORD bytes_returned; + if (!::GetOverlappedResult((HANDLE)INVALID_SOCKET, &overlapped, + &bytes_returned, FALSE)) { + ::CloseHandle(event); + return ::WSAGetLastError(); + } + } + + ::CloseHandle(event); + + if (ret == NO_ERROR || ret == WSA_IO_PENDING) { + *res = reinterpret_cast(result_addrinfo); + return 0; + } + + return ret; +#elif TARGET_OS_MAC + // macOS implementation using CFHost API for asynchronous DNS resolution + CFStringRef hostname_ref = CFStringCreateWithCString( + kCFAllocatorDefault, node, kCFStringEncodingUTF8); + if (!hostname_ref) { return EAI_MEMORY; } + + CFHostRef host_ref = CFHostCreateWithName(kCFAllocatorDefault, hostname_ref); + CFRelease(hostname_ref); + if (!host_ref) { return EAI_MEMORY; } + + // Set up context for callback + struct CFHostContext { + bool completed = false; + bool success = false; + CFArrayRef addresses = nullptr; + std::mutex mutex; + std::condition_variable cv; + } context; + + CFHostClientContext client_context; + memset(&client_context, 0, sizeof(client_context)); + client_context.info = &context; + + // Set callback + auto callback = [](CFHostRef theHost, CFHostInfoType /*typeInfo*/, + const CFStreamError *error, void *info) { + auto ctx = static_cast(info); + std::lock_guard lock(ctx->mutex); + + if (error && error->error != 0) { + ctx->success = false; + } else { + Boolean hasBeenResolved; + ctx->addresses = CFHostGetAddressing(theHost, &hasBeenResolved); + if (ctx->addresses && hasBeenResolved) { + CFRetain(ctx->addresses); + ctx->success = true; + } else { + ctx->success = false; + } + } + ctx->completed = true; + ctx->cv.notify_one(); + }; + + if (!CFHostSetClient(host_ref, callback, &client_context)) { + CFRelease(host_ref); + return EAI_SYSTEM; + } + + // Schedule on run loop + CFRunLoopRef run_loop = CFRunLoopGetCurrent(); + CFHostScheduleWithRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + + // Start resolution + CFStreamError stream_error; + if (!CFHostStartInfoResolution(host_ref, kCFHostAddresses, &stream_error)) { + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFRelease(host_ref); + return EAI_FAIL; + } + + // Wait for completion with timeout + auto timeout_time = + std::chrono::steady_clock::now() + std::chrono::seconds(timeout_sec); + bool timed_out = false; + + { + std::unique_lock lock(context.mutex); + + while (!context.completed) { + auto now = std::chrono::steady_clock::now(); + if (now >= timeout_time) { + timed_out = true; + break; + } + + // Run the runloop for a short time + lock.unlock(); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, true); + lock.lock(); + } + } + + // Clean up + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFHostSetClient(host_ref, nullptr, nullptr); + + if (timed_out || !context.completed) { + CFHostCancelInfoResolution(host_ref, kCFHostAddresses); + CFRelease(host_ref); + return EAI_AGAIN; + } + + if (!context.success || !context.addresses) { + CFRelease(host_ref); + return EAI_NODATA; + } + + // Convert CFArray to addrinfo + CFIndex count = CFArrayGetCount(context.addresses); + if (count == 0) { + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_NODATA; + } + + struct addrinfo *result_addrinfo = nullptr; + struct addrinfo **current = &result_addrinfo; + + for (CFIndex i = 0; i < count; i++) { + CFDataRef addr_data = + static_cast(CFArrayGetValueAtIndex(context.addresses, i)); + if (!addr_data) continue; + + const struct sockaddr *sockaddr_ptr = + reinterpret_cast(CFDataGetBytePtr(addr_data)); + socklen_t sockaddr_len = static_cast(CFDataGetLength(addr_data)); + + // Allocate addrinfo structure + *current = static_cast(malloc(sizeof(struct addrinfo))); + if (!*current) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + + memset(*current, 0, sizeof(struct addrinfo)); + + // Set up addrinfo fields + (*current)->ai_family = sockaddr_ptr->sa_family; + (*current)->ai_socktype = hints ? hints->ai_socktype : SOCK_STREAM; + (*current)->ai_protocol = hints ? hints->ai_protocol : IPPROTO_TCP; + (*current)->ai_addrlen = sockaddr_len; + + // Copy sockaddr + (*current)->ai_addr = static_cast(malloc(sockaddr_len)); + if (!(*current)->ai_addr) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + memcpy((*current)->ai_addr, sockaddr_ptr, sockaddr_len); + + // Set port if service is specified + if (service && strlen(service) > 0) { + int port = atoi(service); + if (port > 0) { + if (sockaddr_ptr->sa_family == AF_INET) { + reinterpret_cast((*current)->ai_addr) + ->sin_port = htons(static_cast(port)); + } else if (sockaddr_ptr->sa_family == AF_INET6) { + reinterpret_cast((*current)->ai_addr) + ->sin6_port = htons(static_cast(port)); + } + } + } + + current = &((*current)->ai_next); + } + + CFRelease(context.addresses); + CFRelease(host_ref); + + *res = result_addrinfo; + return 0; +#elif defined(_GNU_SOURCE) && defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) + // Linux implementation using getaddrinfo_a for asynchronous DNS resolution + struct gaicb request; + struct gaicb *requests[1] = {&request}; + struct sigevent sevp; + struct timespec timeout; + + // Initialize the request structure + memset(&request, 0, sizeof(request)); + request.ar_name = node; + request.ar_service = service; + request.ar_request = hints; + + // Set up timeout + timeout.tv_sec = timeout_sec; + timeout.tv_nsec = 0; + + // Initialize sigevent structure (not used, but required) + memset(&sevp, 0, sizeof(sevp)); + sevp.sigev_notify = SIGEV_NONE; + + // Start asynchronous resolution + int start_result = getaddrinfo_a(GAI_NOWAIT, requests, 1, &sevp); + if (start_result != 0) { return start_result; } + + // Wait for completion with timeout + int wait_result = + gai_suspend((const struct gaicb *const *)requests, 1, &timeout); + + if (wait_result == 0 || wait_result == EAI_ALLDONE) { + // Completed successfully, get the result + int gai_result = gai_error(&request); + if (gai_result == 0) { + *res = request.ar_result; + return 0; + } else { + // Clean up on error + if (request.ar_result) { freeaddrinfo(request.ar_result); } + return gai_result; + } + } else if (wait_result == EAI_AGAIN) { + // Timeout occurred, cancel the request + gai_cancel(&request); + return EAI_AGAIN; + } else { + // Other error occurred + gai_cancel(&request); + return wait_result; + } +#else + // Fallback implementation using thread-based timeout for other Unix systems + + struct GetAddrInfoState { + std::mutex mutex; + std::condition_variable result_cv; + bool completed = false; + int result = EAI_SYSTEM; + std::string node = node; + std::string service = service; + struct addrinfo hints = hints; + struct addrinfo *info = nullptr; + }; + + // Allocate on the heap, so the resolver thread can keep using the data. + auto state = std::make_shared(); + + std::thread resolve_thread([=]() { + auto thread_result = getaddrinfo( + state->node.c_str(), state->service.c_str(), hints, &state->info); + + std::lock_guard lock(state->mutex); + state->result = thread_result; + state->completed = true; + state->result_cv.notify_one(); + }); + + // Wait for completion or timeout + std::unique_lock lock(state->mutex); + auto finished = + state->result_cv.wait_for(lock, std::chrono::seconds(timeout_sec), + [&] { return state->completed; }); + + if (finished) { + // Operation completed within timeout + resolve_thread.join(); + *res = state->info; + return state->result; + } else { + // Timeout occurred + resolve_thread.detach(); // Let the thread finish in background + return EAI_AGAIN; // Return timeout error + } +#endif +#else + (void)(timeout_sec); // Unused parameter for non-blocking getaddrinfo + return getaddrinfo(node, service, hints, res); +#endif +} + template socket_t create_socket(const std::string &host, const std::string &ip, int port, int address_family, int socket_flags, bool tcp_nodelay, bool ipv6_v6only, SocketOptions socket_options, - BindOrConnect bind_or_connect) { + BindOrConnect bind_or_connect, time_t timeout_sec = 0) { // Get address info const char *node = nullptr; struct addrinfo hints; @@ -852,6 +1158,7 @@ socket_t create_socket(const std::string &host, const std::string &ip, int port, hints.ai_flags = socket_flags; } +#if !defined(_WIN32) || defined(CPPHTTPLIB_HAVE_AFUNIX_H) if (hints.ai_family == AF_UNIX) { const auto addrlen = host.length(); if (addrlen > sizeof(sockaddr_un::sun_path)) { return INVALID_SOCKET; } @@ -896,10 +1203,12 @@ socket_t create_socket(const std::string &host, const std::string &ip, int port, } return sock; } +#endif auto service = std::to_string(port); - if (getaddrinfo(node, service.c_str(), &hints, &result)) { + if (getaddrinfo_with_timeout(node, service.c_str(), &hints, &result, + timeout_sec)) { #if defined __linux__ && !defined __ANDROID__ res_init(); #endif @@ -997,7 +1306,10 @@ bool bind_ip_address(socket_t sock, const std::string &host) { hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; - if (getaddrinfo(host.c_str(), "0", &hints, &result)) { return false; } + if (getaddrinfo_with_timeout(host.c_str(), "0", &hints, &result, 0)) { + return false; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); auto ret = false; @@ -1102,7 +1414,8 @@ socket_t create_client_socket( error = Error::Success; return true; - }); + }, + connection_timeout_sec); // Pass DNS timeout if (sock != INVALID_SOCKET) { error = Error::Success; @@ -1158,7 +1471,7 @@ void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) { port = ucred.pid; } -#elif defined(SOL_LOCAL) && defined(SO_PEERPID) // __APPLE__ +#elif defined(SOL_LOCAL) && defined(SO_PEERPID) pid_t pid; socklen_t len = sizeof(pid); if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) { @@ -1570,13 +1883,35 @@ bool zstd_decompressor::decompress(const char *data, size_t data_length, } #endif +bool is_prohibited_header_name(const std::string &name) { + using udl::operator""_t; + + switch (str2tag(name)) { + case "REMOTE_ADDR"_t: + case "REMOTE_PORT"_t: + case "LOCAL_ADDR"_t: + case "LOCAL_PORT"_t: return true; + default: return false; + } +} + bool has_header(const Headers &headers, const std::string &key) { + if (is_prohibited_header_name(key)) { return false; } return headers.find(key) != headers.end(); } const char *get_header_value(const Headers &headers, const std::string &key, const char *def, size_t id) { + if (is_prohibited_header_name(key)) { +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "Prohibited header name '" + key + "' is specified."; + throw std::invalid_argument(msg); +#else + return ""; +#endif + } + auto rng = headers.equal_range(key); auto it = rng.first; std::advance(it, static_cast(id)); @@ -1622,7 +1957,7 @@ bool parse_header(const char *beg, const char *end, T fn) { case_ignore::equal(key, "Referer")) { fn(key, val); } else { - fn(key, decode_url(val, false)); + fn(key, decode_path_component(val)); } return true; @@ -1636,6 +1971,8 @@ bool read_headers(Stream &strm, Headers &headers) { char buf[bufsiz]; stream_line_reader line_reader(strm, buf, bufsiz); + size_t header_count = 0; + for (;;) { if (!line_reader.getline()) { return false; } @@ -1656,6 +1993,9 @@ bool read_headers(Stream &strm, Headers &headers) { if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + // Check header count limit + if (header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } + // Exclude line terminator auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; @@ -1665,24 +2005,26 @@ bool read_headers(Stream &strm, Headers &headers) { })) { return false; } + + header_count++; } return true; } -bool read_content_with_length(Stream &strm, uint64_t len, - Progress progress, +bool read_content_with_length(Stream &strm, size_t len, + DownloadProgress progress, ContentReceiverWithProgress out) { char buf[CPPHTTPLIB_RECV_BUFSIZ]; - uint64_t r = 0; + size_t r = 0; while (r < len) { auto read_len = static_cast(len - r); auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); if (n <= 0) { return false; } if (!out(buf, static_cast(n), r, len)) { return false; } - r += static_cast(n); + r += static_cast(n); if (progress) { if (!progress(r, len)) { return false; } @@ -1692,63 +2034,90 @@ bool read_content_with_length(Stream &strm, uint64_t len, return true; } -void skip_content_with_length(Stream &strm, uint64_t len) { +void skip_content_with_length(Stream &strm, size_t len) { char buf[CPPHTTPLIB_RECV_BUFSIZ]; - uint64_t r = 0; + size_t r = 0; while (r < len) { auto read_len = static_cast(len - r); auto n = strm.read(buf, (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ)); if (n <= 0) { return; } - r += static_cast(n); + r += static_cast(n); } } -bool read_content_without_length(Stream &strm, - ContentReceiverWithProgress out) { +enum class ReadContentResult { + Success, // Successfully read the content + PayloadTooLarge, // The content exceeds the specified payload limit + Error // An error occurred while reading the content +}; + +ReadContentResult +read_content_without_length(Stream &strm, size_t payload_max_length, + ContentReceiverWithProgress out) { char buf[CPPHTTPLIB_RECV_BUFSIZ]; - uint64_t r = 0; + size_t r = 0; for (;;) { auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); - if (n == 0) { return true; } - if (n < 0) { return false; } + if (n == 0) { return ReadContentResult::Success; } + if (n < 0) { return ReadContentResult::Error; } + + // Check if adding this data would exceed the payload limit + if (r > payload_max_length || + payload_max_length - r < static_cast(n)) { + return ReadContentResult::PayloadTooLarge; + } - if (!out(buf, static_cast(n), r, 0)) { return false; } - r += static_cast(n); + if (!out(buf, static_cast(n), r, 0)) { + return ReadContentResult::Error; + } + r += static_cast(n); } - return true; + return ReadContentResult::Success; } template -bool read_content_chunked(Stream &strm, T &x, - ContentReceiverWithProgress out) { +ReadContentResult read_content_chunked(Stream &strm, T &x, + size_t payload_max_length, + ContentReceiverWithProgress out) { const auto bufsiz = 16; char buf[bufsiz]; stream_line_reader line_reader(strm, buf, bufsiz); - if (!line_reader.getline()) { return false; } + if (!line_reader.getline()) { return ReadContentResult::Error; } unsigned long chunk_len; + size_t total_len = 0; while (true) { char *end_ptr; chunk_len = std::strtoul(line_reader.ptr(), &end_ptr, 16); - if (end_ptr == line_reader.ptr()) { return false; } - if (chunk_len == ULONG_MAX) { return false; } + if (end_ptr == line_reader.ptr()) { return ReadContentResult::Error; } + if (chunk_len == ULONG_MAX) { return ReadContentResult::Error; } if (chunk_len == 0) { break; } + // Check if adding this chunk would exceed the payload limit + if (total_len > payload_max_length || + payload_max_length - total_len < chunk_len) { + return ReadContentResult::PayloadTooLarge; + } + + total_len += chunk_len; + if (!read_content_with_length(strm, chunk_len, nullptr, out)) { - return false; + return ReadContentResult::Error; } - if (!line_reader.getline()) { return false; } + if (!line_reader.getline()) { return ReadContentResult::Error; } - if (strcmp(line_reader.ptr(), "\r\n") != 0) { return false; } + if (strcmp(line_reader.ptr(), "\r\n") != 0) { + return ReadContentResult::Error; + } - if (!line_reader.getline()) { return false; } + if (!line_reader.getline()) { return ReadContentResult::Error; } } assert(chunk_len == 0); @@ -1765,10 +2134,54 @@ bool read_content_chunked(Stream &strm, T &x, // // According to the reference code in RFC 9112, cpp-httplib now allows // chunked transfer coding data without the final CRLF. - if (!line_reader.getline()) { return true; } + if (!line_reader.getline()) { return ReadContentResult::Success; } + + // RFC 7230 Section 4.1.2 - Headers prohibited in trailers + thread_local case_ignore::unordered_set prohibited_trailers = { + // Message framing + "transfer-encoding", "content-length", + + // Routing + "host", + + // Authentication + "authorization", "www-authenticate", "proxy-authenticate", + "proxy-authorization", "cookie", "set-cookie", + + // Request modifiers + "cache-control", "expect", "max-forwards", "pragma", "range", "te", + + // Response control + "age", "expires", "date", "location", "retry-after", "vary", "warning", + // Payload processing + "content-encoding", "content-type", "content-range", "trailer"}; + + // Parse declared trailer headers once for performance + case_ignore::unordered_set declared_trailers; + if (has_header(x.headers, "Trailer")) { + auto trailer_header = get_header_value(x.headers, "Trailer", "", 0); + auto len = std::strlen(trailer_header); + + split(trailer_header, trailer_header + len, ',', + [&](const char *b, const char *e) { + std::string key(b, e); + if (prohibited_trailers.find(key) == prohibited_trailers.end()) { + declared_trailers.insert(key); + } + }); + } + + size_t trailer_header_count = 0; while (strcmp(line_reader.ptr(), "\r\n") != 0) { - if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { + return ReadContentResult::Error; + } + + // Check trailer header count limit + if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { + return ReadContentResult::Error; + } // Exclude line terminator constexpr auto line_terminator_len = 2; @@ -1776,13 +2189,16 @@ bool read_content_chunked(Stream &strm, T &x, parse_header(line_reader.ptr(), end, [&](const std::string &key, const std::string &val) { - x.headers.emplace(key, val); + if (declared_trailers.find(key) != declared_trailers.end()) { + x.trailers.emplace(key, val); + trailer_header_count++; + } }); - if (!line_reader.getline()) { return false; } + if (!line_reader.getline()) { return ReadContentResult::Error; } } - return true; + return ReadContentResult::Success; } bool is_chunked_transfer_encoding(const Headers &headers) { @@ -1824,7 +2240,7 @@ bool prepare_content_receiver(T &x, int &status, if (decompressor) { if (decompressor->is_valid()) { ContentReceiverWithProgress out = [&](const char *buf, size_t n, - uint64_t off, uint64_t len) { + size_t off, size_t len) { return decompressor->decompress(buf, n, [&](const char *buf2, size_t n2) { return receiver(buf2, n2, off, len); @@ -1838,8 +2254,8 @@ bool prepare_content_receiver(T &x, int &status, } } - ContentReceiverWithProgress out = [&](const char *buf, size_t n, uint64_t off, - uint64_t len) { + ContentReceiverWithProgress out = [&](const char *buf, size_t n, size_t off, + size_t len) { return receiver(buf, n, off, len); }; return callback(std::move(out)); @@ -1847,8 +2263,8 @@ bool prepare_content_receiver(T &x, int &status, template bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, - Progress progress, ContentReceiverWithProgress receiver, - bool decompress) { + DownloadProgress progress, + ContentReceiverWithProgress receiver, bool decompress) { return prepare_content_receiver( x, status, std::move(receiver), decompress, [&](const ContentReceiverWithProgress &out) { @@ -1856,14 +2272,31 @@ bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, auto exceed_payload_max_length = false; if (is_chunked_transfer_encoding(x.headers)) { - ret = read_content_chunked(strm, x, out); + auto result = read_content_chunked(strm, x, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } } else if (!has_header(x.headers, "Content-Length")) { - ret = read_content_without_length(strm, out); + auto result = + read_content_without_length(strm, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } } else { auto is_invalid_value = false; - auto len = get_header_value_u64( - x.headers, "Content-Length", - (std::numeric_limits::max)(), 0, is_invalid_value); + auto len = get_header_value_u64(x.headers, "Content-Length", + (std::numeric_limits::max)(), + 0, is_invalid_value); if (is_invalid_value) { ret = false; @@ -1932,10 +2365,14 @@ bool write_data(Stream &strm, const char *d, size_t l) { } template -bool write_content(Stream &strm, const ContentProvider &content_provider, - size_t offset, size_t length, T is_shutting_down, - Error &error) { +bool write_content_with_progress(Stream &strm, + const ContentProvider &content_provider, + size_t offset, size_t length, + T is_shutting_down, + const UploadProgress &upload_progress, + Error &error) { size_t end_offset = offset + length; + size_t start_offset = offset; auto ok = true; DataSink data_sink; @@ -1943,6 +2380,14 @@ bool write_content(Stream &strm, const ContentProvider &content_provider, if (ok) { if (write_data(strm, d, l)) { offset += l; + + if (upload_progress && length > 0) { + size_t current_written = offset - start_offset; + if (!upload_progress(current_written, length)) { + ok = false; + return false; + } + } } else { ok = false; } @@ -1969,6 +2414,14 @@ bool write_content(Stream &strm, const ContentProvider &content_provider, return true; } +template +bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, T is_shutting_down, + Error &error) { + return write_content_with_progress(strm, content_provider, offset, length, + is_shutting_down, nullptr, error); +} + template bool write_content(Stream &strm, const ContentProvider &content_provider, size_t offset, size_t length, @@ -2152,9 +2605,9 @@ std::string params_to_query_str(const Params ¶ms) { for (auto it = params.begin(); it != params.end(); ++it) { if (it != params.begin()) { query += "&"; } - query += it->first; + query += encode_query_component(it->first); query += "="; - query += encode_query_param(it->second); + query += encode_query_component(it->second); } return query; } @@ -2177,7 +2630,7 @@ void parse_query_text(const char *data, std::size_t size, }); if (!key.empty()) { - params.emplace(decode_url(key, true), decode_url(val, true)); + params.emplace(decode_query_component(key), decode_query_component(val)); } }); } @@ -2272,37 +2725,166 @@ bool parse_range_header(const std::string &s, Ranges &ranges) try { } catch (...) { return false; } #endif -class MultipartFormDataParser { -public: - MultipartFormDataParser() = default; +bool parse_accept_header(const std::string &s, + std::vector &content_types) { + content_types.clear(); - void set_boundary(std::string &&boundary) { - boundary_ = boundary; - dash_boundary_crlf_ = dash_ + boundary_ + crlf_; - crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + // Empty string is considered valid (no preference) + if (s.empty()) { return true; } + + // Check for invalid patterns: leading/trailing commas or consecutive commas + if (s.front() == ',' || s.back() == ',' || + s.find(",,") != std::string::npos) { + return false; } - bool is_valid() const { return is_valid_; } + struct AcceptEntry { + std::string media_type; + double quality; + int order; // Original order in header + }; - bool parse(const char *buf, size_t n, const ContentReceiver &content_callback, - const MultipartContentHeader &header_callback) { + std::vector entries; + int order = 0; + bool has_invalid_entry = false; - buf_append(buf, n); + // Split by comma and parse each entry + split(s.data(), s.data() + s.size(), ',', [&](const char *b, const char *e) { + std::string entry(b, e); + entry = trim_copy(entry); - while (buf_size() > 0) { - switch (state_) { - case 0: { // Initial boundary - buf_erase(buf_find(dash_boundary_crlf_)); - if (dash_boundary_crlf_.size() > buf_size()) { return true; } - if (!buf_start_with(dash_boundary_crlf_)) { return false; } - buf_erase(dash_boundary_crlf_.size()); - state_ = 1; - break; + if (entry.empty()) { + has_invalid_entry = true; + return; + } + + AcceptEntry accept_entry; + accept_entry.quality = 1.0; // Default quality + accept_entry.order = order++; + + // Find q= parameter + auto q_pos = entry.find(";q="); + if (q_pos == std::string::npos) { q_pos = entry.find("; q="); } + + if (q_pos != std::string::npos) { + // Extract media type (before q parameter) + accept_entry.media_type = trim_copy(entry.substr(0, q_pos)); + + // Extract quality value + auto q_start = entry.find('=', q_pos) + 1; + auto q_end = entry.find(';', q_start); + if (q_end == std::string::npos) { q_end = entry.length(); } + + std::string quality_str = + trim_copy(entry.substr(q_start, q_end - q_start)); + if (quality_str.empty()) { + has_invalid_entry = true; + return; } - case 1: { // New entry - clear_file_info(); - state_ = 2; - break; + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + { + std::istringstream iss(quality_str); + iss >> accept_entry.quality; + + // Check if conversion was successful and entire string was consumed + if (iss.fail() || !iss.eof()) { + has_invalid_entry = true; + return; + } + } +#else + try { + accept_entry.quality = std::stod(quality_str); + } catch (...) { + has_invalid_entry = true; + return; + } +#endif + // Check if quality is in valid range [0.0, 1.0] + if (accept_entry.quality < 0.0 || accept_entry.quality > 1.0) { + has_invalid_entry = true; + return; + } + } else { + // No quality parameter, use entire entry as media type + accept_entry.media_type = entry; + } + + // Remove additional parameters from media type + auto param_pos = accept_entry.media_type.find(';'); + if (param_pos != std::string::npos) { + accept_entry.media_type = + trim_copy(accept_entry.media_type.substr(0, param_pos)); + } + + // Basic validation of media type format + if (accept_entry.media_type.empty()) { + has_invalid_entry = true; + return; + } + + // Check for basic media type format (should contain '/' or be '*') + if (accept_entry.media_type != "*" && + accept_entry.media_type.find('/') == std::string::npos) { + has_invalid_entry = true; + return; + } + + entries.push_back(accept_entry); + }); + + // Return false if any invalid entry was found + if (has_invalid_entry) { return false; } + + // Sort by quality (descending), then by original order (ascending) + std::sort(entries.begin(), entries.end(), + [](const AcceptEntry &a, const AcceptEntry &b) { + if (a.quality != b.quality) { + return a.quality > b.quality; // Higher quality first + } + return a.order < b.order; // Earlier order first for same quality + }); + + // Extract sorted media types + content_types.reserve(entries.size()); + for (const auto &entry : entries) { + content_types.push_back(entry.media_type); + } + + return true; +} + +class FormDataParser { +public: + FormDataParser() = default; + + void set_boundary(std::string &&boundary) { + boundary_ = boundary; + dash_boundary_crlf_ = dash_ + boundary_ + crlf_; + crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + } + + bool is_valid() const { return is_valid_; } + + bool parse(const char *buf, size_t n, const FormDataHeader &header_callback, + const ContentReceiver &content_callback) { + + buf_append(buf, n); + + while (buf_size() > 0) { + switch (state_) { + case 0: { // Initial boundary + auto pos = buf_find(dash_boundary_crlf_); + if (pos == buf_size()) { return true; } + buf_erase(pos + dash_boundary_crlf_.size()); + state_ = 1; + break; + } + case 1: { // New entry + clear_file_info(); + state_ = 2; + break; } case 2: { // Headers auto pos = buf_find(crlf_); @@ -2327,6 +2909,16 @@ class MultipartFormDataParser { return false; } + // Parse and emplace space trimmed headers into a map + if (!parse_header( + header.data(), header.data() + header.size(), + [&](const std::string &key, const std::string &val) { + file_.headers.emplace(key, val); + })) { + is_valid_ = false; + return false; + } + constexpr const char header_content_type[] = "Content-Type:"; if (start_with_case_ignore(header, header_content_type)) { @@ -2361,7 +2953,7 @@ class MultipartFormDataParser { std::smatch m2; if (std::regex_match(it->second, m2, re_rfc5987_encoding)) { - file_.filename = decode_url(m2[1], false); // override... + file_.filename = decode_path_component(m2[1]); // override... } else { is_valid_ = false; return false; @@ -2426,6 +3018,7 @@ class MultipartFormDataParser { file_.name.clear(); file_.filename.clear(); file_.content_type.clear(); + file_.headers.clear(); } bool start_with_case_ignore(const std::string &a, const char *b) const { @@ -2447,7 +3040,7 @@ class MultipartFormDataParser { size_t state_ = 0; bool is_valid_ = false; - MultipartFormData file_; + FormData file_; // Buffer bool start_with(const std::string &a, size_t spos, size_t epos, @@ -2585,7 +3178,7 @@ serialize_multipart_formdata_get_content_type(const std::string &boundary) { } std::string -serialize_multipart_formdata(const MultipartFormDataItems &items, +serialize_multipart_formdata(const UploadFormDataItems &items, const std::string &boundary, bool finish = true) { std::string body; @@ -2599,13 +3192,68 @@ serialize_multipart_formdata(const MultipartFormDataItems &items, return body; } +void coalesce_ranges(Ranges &ranges, size_t content_length) { + if (ranges.size() <= 1) return; + + // Sort ranges by start position + std::sort(ranges.begin(), ranges.end(), + [](const Range &a, const Range &b) { return a.first < b.first; }); + + Ranges coalesced; + coalesced.reserve(ranges.size()); + + for (auto &r : ranges) { + auto first_pos = r.first; + auto last_pos = r.second; + + // Handle special cases like in range_error + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = static_cast(content_length); + } + + if (first_pos == -1) { + first_pos = static_cast(content_length) - last_pos; + last_pos = static_cast(content_length) - 1; + } + + if (last_pos == -1 || last_pos >= static_cast(content_length)) { + last_pos = static_cast(content_length) - 1; + } + + // Skip invalid ranges + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos < static_cast(content_length))) { + continue; + } + + // Coalesce with previous range if overlapping or adjacent (but not + // identical) + if (!coalesced.empty()) { + auto &prev = coalesced.back(); + // Check if current range overlaps or is adjacent to previous range + // but don't coalesce identical ranges (allow duplicates) + if (first_pos <= prev.second + 1 && + !(first_pos == prev.first && last_pos == prev.second)) { + // Extend the previous range + prev.second = (std::max)(prev.second, last_pos); + continue; + } + } + + // Add new range + coalesced.emplace_back(first_pos, last_pos); + } + + ranges = std::move(coalesced); +} + bool range_error(Request &req, Response &res) { if (!req.ranges.empty() && 200 <= res.status && res.status < 300) { ssize_t content_len = static_cast( res.content_length_ ? res.content_length_ : res.body.size()); - ssize_t prev_first_pos = -1; - ssize_t prev_last_pos = -1; + std::vector> processed_ranges; size_t overwrapping_count = 0; // NOTE: The following Range check is based on '14.2. Range' in RFC 9110 @@ -2648,18 +3296,21 @@ bool range_error(Request &req, Response &res) { return true; } - // Ranges must be in ascending order - if (first_pos <= prev_first_pos) { return true; } - // Request must not have more than two overlapping ranges - if (first_pos <= prev_last_pos) { - overwrapping_count++; - if (overwrapping_count > 2) { return true; } + for (const auto &processed_range : processed_ranges) { + if (!(last_pos < processed_range.first || + first_pos > processed_range.second)) { + overwrapping_count++; + if (overwrapping_count > 2) { return true; } + break; // Only count once per range + } } - prev_first_pos = (std::max)(prev_first_pos, first_pos); - prev_last_pos = (std::max)(prev_last_pos, last_pos); + processed_ranges.emplace_back(first_pos, last_pos); } + + // After validation, coalesce overlapping ranges as per RFC 9110 + coalesce_ranges(req.ranges, static_cast(content_len)); } return false; @@ -2927,8 +3578,7 @@ bool load_system_certs_on_windows(X509_STORE *store) { return result; } -#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) -#if TARGET_OS_OSX +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC template using CFObjectPtr = std::unique_ptr::type, void (*)(CFTypeRef)>; @@ -3016,7 +3666,6 @@ bool load_system_certs_on_macos(X509_STORE *store) { return result; } -#endif // TARGET_OS_OSX #endif // _WIN32 #endif // CPPHTTPLIB_OPENSSL_SUPPORT @@ -3105,7 +3754,8 @@ void hosted_at(const std::string &hostname, hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = 0; - if (getaddrinfo(hostname.c_str(), nullptr, &hints, &result)) { + if (detail::getaddrinfo_with_timeout(hostname.c_str(), nullptr, &hints, + &result, 0)) { #if defined __linux__ && !defined __ANDROID__ res_init(); #endif @@ -3125,6 +3775,239 @@ void hosted_at(const std::string &hostname, } } +std::string encode_uri_component(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +std::string encode_uri(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || + c == '&' || c == '=' || c == '+' || c == '$' || c == ',' || c == '#') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +std::string decode_uri_component(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +std::string decode_uri(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +std::string encode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986: ALPHA / DIGIT / "-" / "." / "_" / "~" + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Path-safe sub-delimiters: "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / + // "," / ";" / "=" + else if (c == '!' || c == '$' || c == '&' || c == '\'' || c == '(' || + c == ')' || c == '*' || c == '+' || c == ',' || c == ';' || + c == '=') { + result += static_cast(c); + } + // Colon is allowed in path segments except first segment + else if (c == ':') { + result += static_cast(c); + } + // @ is allowed in path + else if (c == '@') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +std::string decode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 1 < component.size()) { + if (component[i + 1] == 'u') { + // Unicode %uXXXX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 2, 4, val)) { + // 4 digits Unicode codes + char buff[4]; + size_t len = detail::to_utf8(val, buff); + if (len > 0) { result.append(buff, len); } + i += 5; // 'u0000' + } else { + result += component[i]; + } + } else { + // Standard %XX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 1, 2, val)) { + // 2 digits hex codes + result += static_cast(val); + i += 2; // 'XX' + } else { + result += component[i]; + } + } + } else { + result += component[i]; + } + } + return result; +} + +std::string encode_query_component(const std::string &component, + bool space_as_plus) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986 + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Space handling + else if (c == ' ') { + if (space_as_plus) { + result += '+'; + } else { + result += "%20"; + } + } + // Plus sign handling + else if (c == '+') { + if (space_as_plus) { + result += "%2B"; + } else { + result += static_cast(c); + } + } + // Query-safe sub-delimiters (excluding & and = which are query delimiters) + else if (c == '!' || c == '$' || c == '\'' || c == '(' || c == ')' || + c == '*' || c == ',' || c == ';') { + result += static_cast(c); + } + // Colon and @ are allowed in query + else if (c == ':' || c == '@') { + result += static_cast(c); + } + // Forward slash is allowed in query values + else if (c == '/') { + result += static_cast(c); + } + // Question mark is allowed in query values (after first ?) + else if (c == '?') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +std::string decode_query_component(const std::string &component, + bool plus_as_space) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 2 < component.size()) { + std::string hex = component.substr(i + 1, 2); + char *end; + unsigned long value = std::strtoul(hex.c_str(), &end, 16); + if (end == hex.c_str() + 2) { + result += static_cast(value); + i += 2; + } else { + result += component[i]; + } + } else if (component[i] == '+' && plus_as_space) { + result += ' '; // + becomes space in form-urlencoded + } else { + result += component[i]; + } + } + return result; +} + std::string append_query_params(const std::string &path, const Params ¶ms) { std::string path_with_query = path; @@ -3188,6 +4071,24 @@ void Request::set_header(const std::string &key, } } +bool Request::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +std::string Request::get_trailer_value(const std::string &key, + size_t id) const { + auto rng = trailers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +size_t Request::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + bool Request::has_param(const std::string &key) const { return params.find(key) != params.end(); } @@ -3211,19 +4112,47 @@ bool Request::is_multipart_form_data() const { return !content_type.rfind("multipart/form-data", 0); } -bool Request::has_file(const std::string &key) const { - return files.find(key) != files.end(); +// Multipart FormData implementation +std::string MultipartFormData::get_field(const std::string &key, + size_t id) const { + auto rng = fields.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.content; } + return std::string(); +} + +std::vector +MultipartFormData::get_fields(const std::string &key) const { + std::vector values; + auto rng = fields.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second.content); + } + return values; +} + +bool MultipartFormData::has_field(const std::string &key) const { + return fields.find(key) != fields.end(); +} + +size_t MultipartFormData::get_field_count(const std::string &key) const { + auto r = fields.equal_range(key); + return static_cast(std::distance(r.first, r.second)); } -MultipartFormData Request::get_file_value(const std::string &key) const { - auto it = files.find(key); - if (it != files.end()) { return it->second; } - return MultipartFormData(); +FormData MultipartFormData::get_file(const std::string &key, + size_t id) const { + auto rng = files.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return FormData(); } -std::vector -Request::get_file_values(const std::string &key) const { - std::vector values; +std::vector +MultipartFormData::get_files(const std::string &key) const { + std::vector values; auto rng = files.equal_range(key); for (auto it = rng.first; it != rng.second; it++) { values.push_back(it->second); @@ -3231,6 +4160,15 @@ Request::get_file_values(const std::string &key) const { return values; } +bool MultipartFormData::has_file(const std::string &key) const { + return files.find(key) != files.end(); +} + +size_t MultipartFormData::get_file_count(const std::string &key) const { + auto r = files.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + // Response implementation bool Response::has_header(const std::string &key) const { return headers.find(key) != headers.end(); @@ -3254,6 +4192,23 @@ void Response::set_header(const std::string &key, headers.emplace(key, val); } } +bool Response::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +std::string Response::get_trailer_value(const std::string &key, + size_t id) const { + auto rng = trailers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return std::string(); +} + +size_t Response::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} void Response::set_redirect(const std::string &url, int stat) { if (detail::fields::is_field_value(url)) { @@ -3518,7 +4473,8 @@ time_t BufferStream::duration() const { return 0; } const std::string &BufferStream::get_buffer() const { return buffer; } -PathParamsMatcher::PathParamsMatcher(const std::string &pattern) { +PathParamsMatcher::PathParamsMatcher(const std::string &pattern) + : MatcherBase(pattern) { constexpr const char marker[] = "/:"; // One past the last ending position of a path param substring @@ -3614,9 +4570,33 @@ bool RegexMatcher::match(Request &request) const { return std::regex_match(request.path, request.matches, regex_); } -} // namespace detail +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl) { + std::string result; -// HTTP server implementation + // Enclose IPv6 address in brackets (but not if already enclosed) + if (host.find(':') == std::string::npos || + (!host.empty() && host[0] == '[')) { + // IPv4, hostname, or already bracketed IPv6 + result = host; + } else { + // IPv6 address without brackets + result = "[" + host + "]"; + } + + // Append port if not default + if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { + ; // do nothing + } else { + result += ":" + std::to_string(port); + } + + return result; +} + +} // namespace detail + +// HTTP server implementation Server::Server() : new_task_queue( [] { return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT); }) { @@ -3769,11 +4749,26 @@ Server &Server::set_post_routing_handler(Handler handler) { return *this; } +Server &Server::set_pre_request_handler(HandlerWithResponse handler) { + pre_request_handler_ = std::move(handler); + return *this; +} + Server &Server::set_logger(Logger logger) { logger_ = std::move(logger); return *this; } +Server &Server::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); + return *this; +} + +Server &Server::set_pre_compression_logger(Logger logger) { + pre_compression_logger_ = std::move(logger); + return *this; +} + Server & Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { expect_100_continue_handler_ = std::move(handler); @@ -3811,6 +4806,12 @@ Server &Server::set_header_writer( return *this; } +Server & +Server::set_trusted_proxies(const std::vector &proxies) { + trusted_proxies_ = proxies; + return *this; +} + Server &Server::set_keep_alive_max_count(size_t count) { keep_alive_max_count_ = count; return *this; @@ -3908,9 +4909,15 @@ bool Server::parse_request_line(const char *s, Request &req) const { "GET", "HEAD", "POST", "PUT", "DELETE", "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; - if (methods.find(req.method) == methods.end()) { return false; } + if (methods.find(req.method) == methods.end()) { + output_error_log(Error::InvalidHTTPMethod, &req); + return false; + } - if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { return false; } + if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { + output_error_log(Error::InvalidHTTPVersion, &req); + return false; + } { // Skip URL fragment @@ -3924,8 +4931,8 @@ bool Server::parse_request_line(const char *s, Request &req) const { detail::divide(req.target, '?', [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, std::size_t rhs_size) { - req.path = detail::decode_url( - std::string(lhs_data, lhs_size), false); + req.path = + decode_path_component(std::string(lhs_data, lhs_size)); detail::parse_query_text(rhs_data, rhs_size, req.params); }); } @@ -4017,7 +5024,7 @@ bool Server::write_response_core(Stream &strm, bool close_connection, } // Log - if (logger_) { logger_(req, res); } + output_log(req, res); return ret; } @@ -4078,8 +5085,10 @@ Server::write_content_with_provider(Stream &strm, const Request &req, } bool Server::read_content(Stream &strm, Request &req, Response &res) { - MultipartFormDataMap::iterator cur; - auto file_count = 0; + FormFields::iterator cur_field; + FormFiles::iterator cur_file; + auto is_text_field = false; + size_t count = 0; if (read_content_core( strm, req, res, // Regular @@ -4088,24 +5097,40 @@ bool Server::read_content(Stream &strm, Request &req, Response &res) { req.body.append(buf, n); return true; }, - // Multipart - [&](const MultipartFormData &file) { - if (file_count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + // Multipart FormData + [&](const FormData &file) { + if (count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + output_error_log(Error::TooManyFormDataFiles, &req); return false; } - cur = req.files.emplace(file.name, file); + + if (file.filename.empty()) { + cur_field = req.form.fields.emplace( + file.name, FormField{file.name, file.content, file.headers}); + is_text_field = true; + } else { + cur_file = req.form.files.emplace(file.name, file); + is_text_field = false; + } return true; }, [&](const char *buf, size_t n) { - auto &content = cur->second.content; - if (content.size() + n > content.max_size()) { return false; } - content.append(buf, n); + if (is_text_field) { + auto &content = cur_field->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } else { + auto &content = cur_file->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } return true; })) { const auto &content_type = req.get_header_value("Content-Type"); if (!content_type.find("application/x-www-form-urlencoded")) { if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { res.status = StatusCode::PayloadTooLarge_413; // NOTE: should be 414? + output_error_log(Error::ExceedMaxPayloadSize, &req); return false; } detail::parse_query_text(req.body, req.params); @@ -4117,19 +5142,16 @@ bool Server::read_content(Stream &strm, Request &req, Response &res) { bool Server::read_content_with_content_receiver( Stream &strm, Request &req, Response &res, ContentReceiver receiver, - MultipartContentHeader multipart_header, - ContentReceiver multipart_receiver) { + FormDataHeader multipart_header, ContentReceiver multipart_receiver) { return read_content_core(strm, req, res, std::move(receiver), std::move(multipart_header), std::move(multipart_receiver)); } -bool -Server::read_content_core(Stream &strm, Request &req, Response &res, - ContentReceiver receiver, - MultipartContentHeader multipart_header, - ContentReceiver multipart_receiver) const { - detail::MultipartFormDataParser multipart_form_data_parser; +bool Server::read_content_core( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) const { + detail::FormDataParser multipart_form_data_parser; ContentReceiverWithProgress out; if (req.is_multipart_form_data()) { @@ -4137,28 +5159,18 @@ Server::read_content_core(Stream &strm, Request &req, Response &res, std::string boundary; if (!detail::parse_multipart_boundary(content_type, boundary)) { res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); return false; } multipart_form_data_parser.set_boundary(std::move(boundary)); - out = [&](const char *buf, size_t n, uint64_t /*off*/, uint64_t /*len*/) { - /* For debug - size_t pos = 0; - while (pos < n) { - auto read_size = (std::min)(1, n - pos); - auto ret = multipart_form_data_parser.parse( - buf + pos, read_size, multipart_receiver, multipart_header); - if (!ret) { return false; } - pos += read_size; - } - return true; - */ - return multipart_form_data_parser.parse(buf, n, multipart_receiver, - multipart_header); + out = [&](const char *buf, size_t n, size_t /*off*/, size_t /*len*/) { + return multipart_form_data_parser.parse(buf, n, multipart_header, + multipart_receiver); }; } else { - out = [receiver](const char *buf, size_t n, uint64_t /*off*/, - uint64_t /*len*/) { return receiver(buf, n); }; + out = [receiver](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { return receiver(buf, n); }; } if (req.method == "DELETE" && !req.has_header("Content-Length")) { @@ -4173,6 +5185,7 @@ Server::read_content_core(Stream &strm, Request &req, Response &res, if (req.is_multipart_form_data()) { if (!multipart_form_data_parser.is_valid()) { res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); return false; } } @@ -4180,8 +5193,7 @@ Server::read_content_core(Stream &strm, Request &req, Response &res, return true; } -bool Server::handle_file_request(const Request &req, Response &res, - bool head) { +bool Server::handle_file_request(const Request &req, Response &res) { for (const auto &entry : base_dirs_) { // Prefix match if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { @@ -4203,7 +5215,10 @@ bool Server::handle_file_request(const Request &req, Response &res, } auto mm = std::make_shared(path.c_str()); - if (!mm->is_open()) { return false; } + if (!mm->is_open()) { + output_error_log(Error::OpenFile, &req); + return false; + } res.set_content_provider( mm->size(), @@ -4214,11 +5229,13 @@ bool Server::handle_file_request(const Request &req, Response &res, return true; }); - if (!head && file_request_handler_) { + if (req.method != "HEAD" && file_request_handler_) { file_request_handler_(req, res); } return true; + } else { + output_error_log(Error::OpenFile, &req); } } } @@ -4233,11 +5250,15 @@ Server::create_server_socket(const std::string &host, int port, return detail::create_socket( host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, ipv6_v6only_, std::move(socket_options), - [](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { + [&](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + output_error_log(Error::BindIPAddress, nullptr); + return false; + } + if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { + output_error_log(Error::Listen, nullptr); return false; } - if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { return false; } return true; }); } @@ -4256,6 +5277,7 @@ int Server::bind_internal(const std::string &host, int port, socklen_t addr_len = sizeof(addr); if (getsockname(svr_sock_, reinterpret_cast(&addr), &addr_len) == -1) { + output_error_log(Error::GetSockName, nullptr); return -1; } if (addr.ss_family == AF_INET) { @@ -4263,6 +5285,7 @@ int Server::bind_internal(const std::string &host, int port, } else if (addr.ss_family == AF_INET6) { return ntohs(reinterpret_cast(&addr)->sin6_port); } else { + output_error_log(Error::UnsupportedAddressFamily, nullptr); return -1; } } else { @@ -4316,6 +5339,7 @@ bool Server::listen_internal() { if (svr_sock_ != INVALID_SOCKET) { detail::close_socket(svr_sock_); ret = false; + output_error_log(Error::Connection, nullptr); } else { ; // The server socket was closed by user. } @@ -4329,6 +5353,7 @@ bool Server::listen_internal() { if (!task_queue->enqueue( [this, sock]() { process_and_close_socket(sock); })) { + output_error_log(Error::ResourceExhaustion, nullptr); detail::shutdown_socket(sock); detail::close_socket(sock); } @@ -4348,9 +5373,8 @@ bool Server::routing(Request &req, Response &res, Stream &strm) { } // File handler - auto is_head_request = req.method == "HEAD"; - if ((req.method == "GET" || is_head_request) && - handle_file_request(req, res, is_head_request)) { + if ((req.method == "GET" || req.method == "HEAD") && + handle_file_request(req, res)) { return true; } @@ -4359,13 +5383,17 @@ bool Server::routing(Request &req, Response &res, Stream &strm) { { ContentReader reader( [&](ContentReceiver receiver) { - return read_content_with_content_receiver( + auto result = read_content_with_content_receiver( strm, req, res, std::move(receiver), nullptr, nullptr); + if (!result) { output_error_log(Error::Read, &req); } + return result; }, - [&](MultipartContentHeader header, ContentReceiver receiver) { - return read_content_with_content_receiver(strm, req, res, nullptr, - std::move(header), - std::move(receiver)); + [&](FormDataHeader header, ContentReceiver receiver) { + auto result = read_content_with_content_receiver( + strm, req, res, nullptr, std::move(header), + std::move(receiver)); + if (!result) { output_error_log(Error::Read, &req); } + return result; }); if (req.method == "POST") { @@ -4396,7 +5424,10 @@ bool Server::routing(Request &req, Response &res, Stream &strm) { } // Read content into `req.body` - if (!read_content(strm, req, res)) { return false; } + if (!read_content(strm, req, res)) { + output_error_log(Error::Read, &req); + return false; + } } // Regular handler @@ -4425,7 +5456,11 @@ bool Server::dispatch_request(Request &req, Response &res, const auto &handler = x.second; if (matcher->match(req)) { - handler(req, res); + req.matched_route = matcher->pattern(); + if (!pre_request_handler_ || + pre_request_handler_(req, res) != HandlerResponse::Handled) { + handler(req, res); + } return true; } } @@ -4506,6 +5541,8 @@ void Server::apply_ranges(const Request &req, Response &res, } if (type != detail::EncodingType::None) { + output_pre_compression_log(req, res); + std::unique_ptr compressor; std::string content_encoding; @@ -4552,13 +5589,51 @@ bool Server::dispatch_request_for_content_reader( const auto &handler = x.second; if (matcher->match(req)) { - handler(req, res, content_reader); + req.matched_route = matcher->pattern(); + if (!pre_request_handler_ || + pre_request_handler_(req, res) != HandlerResponse::Handled) { + handler(req, res, content_reader); + } return true; } } return false; } +std::string +get_client_ip(const std::string &x_forwarded_for, + const std::vector &trusted_proxies) { + // X-Forwarded-For is a comma-separated list per RFC 7239 + std::vector ip_list; + detail::split(x_forwarded_for.data(), + x_forwarded_for.data() + x_forwarded_for.size(), ',', + [&](const char *b, const char *e) { + auto r = detail::trim(b, e, 0, static_cast(e - b)); + ip_list.emplace_back(std::string(b + r.first, b + r.second)); + }); + + for (size_t i = 0; i < ip_list.size(); ++i) { + auto ip = ip_list[i]; + + auto is_trusted_proxy = + std::any_of(trusted_proxies.begin(), trusted_proxies.end(), + [&](const std::string &proxy) { return ip == proxy; }); + + if (is_trusted_proxy) { + if (i == 0) { + // If the trusted proxy is the first IP, there's no preceding client IP + return ip; + } else { + // Return the IP immediately before the trusted proxy + return ip_list[i - 1]; + } + } + } + + // If no trusted proxy is found, return the first IP in the list + return ip_list.front(); +} + bool Server::process_request(Stream &strm, const std::string &remote_addr, int remote_port, const std::string &local_addr, @@ -4573,15 +5648,34 @@ Server::process_request(Stream &strm, const std::string &remote_addr, if (!line_reader.getline()) { return false; } Request req; + req.start_time_ = std::chrono::steady_clock::now(); Response res; res.version = "HTTP/1.1"; res.headers = default_headers_; +#ifdef __APPLE__ + // Socket file descriptor exceeded FD_SETSIZE... + if (strm.socket() >= FD_SETSIZE) { + Headers dummy; + detail::read_headers(strm, dummy); + res.status = StatusCode::InternalServerError_500; + output_error_log(Error::ExceedMaxSocketDescriptorCount, &req); + return write_response(strm, close_connection, req, res); + } +#endif + // Request line and headers - if (!parse_request_line(line_reader.ptr(), req) || - !detail::read_headers(strm, req.headers)) { + if (!parse_request_line(line_reader.ptr(), req)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidRequestLine, &req); + return write_response(strm, close_connection, req, res); + } + + // Request headers + if (!detail::read_headers(strm, req.headers)) { res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidHeaders, &req); return write_response(strm, close_connection, req, res); } @@ -4590,6 +5684,7 @@ Server::process_request(Stream &strm, const std::string &remote_addr, Headers dummy; detail::read_headers(strm, dummy); res.status = StatusCode::UriTooLong_414; + output_error_log(Error::ExceedUriMaxLength, &req); return write_response(strm, close_connection, req, res); } @@ -4602,20 +5697,31 @@ Server::process_request(Stream &strm, const std::string &remote_addr, connection_closed = true; } - req.remote_addr = remote_addr; + if (!trusted_proxies_.empty() && req.has_header("X-Forwarded-For")) { + auto x_forwarded_for = req.get_header_value("X-Forwarded-For"); + req.remote_addr = get_client_ip(x_forwarded_for, trusted_proxies_); + } else { + req.remote_addr = remote_addr; + } req.remote_port = remote_port; - req.set_header("REMOTE_ADDR", req.remote_addr); - req.set_header("REMOTE_PORT", std::to_string(req.remote_port)); req.local_addr = local_addr; req.local_port = local_port; - req.set_header("LOCAL_ADDR", req.local_addr); - req.set_header("LOCAL_PORT", std::to_string(req.local_port)); + + if (req.has_header("Accept")) { + const auto &accept_header = req.get_header_value("Accept"); + if (!detail::parse_accept_header(accept_header, req.accept_content_types)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::HTTPParsing, &req); + return write_response(strm, close_connection, req, res); + } + } if (req.has_header("Range")) { const auto &range_header_value = req.get_header_value("Range"); if (!detail::parse_range_header(range_header_value, req.ranges)) { res.status = StatusCode::RangeNotSatisfiable_416; + output_error_log(Error::InvalidRangeHeader, &req); return write_response(strm, close_connection, req, res); } } @@ -4696,6 +5802,7 @@ Server::process_request(Stream &strm, const std::string &remote_addr, res.content_length_ = 0; res.content_provider_ = nullptr; res.status = StatusCode::NotFound_404; + output_error_log(Error::OpenFile, &req); return write_response(strm, close_connection, req, res); } @@ -4755,6 +5862,29 @@ bool Server::process_and_close_socket(socket_t sock) { return ret; } +void Server::output_log(const Request &req, const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +void Server::output_pre_compression_log(const Request &req, + const Response &res) const { + if (pre_compression_logger_) { + std::lock_guard guard(logger_mutex_); + pre_compression_logger_(req, res); + } +} + +void Server::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } +} + // HTTP client implementation ClientImpl::ClientImpl(const std::string &host) : ClientImpl(host, 80, std::string(), std::string()) {} @@ -4766,7 +5896,7 @@ ClientImpl::ClientImpl(const std::string &host, int port, const std::string &client_cert_path, const std::string &client_key_path) : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), - host_and_port_(adjust_host_string(host_) + ":" + std::to_string(port)), + host_and_port_(detail::make_host_and_port_string(host_, port, is_ssl())), client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} ClientImpl::~ClientImpl() { @@ -4805,7 +5935,7 @@ void ClientImpl::copy_settings(const ClientImpl &rhs) { #endif keep_alive_ = rhs.keep_alive_; follow_location_ = rhs.follow_location_; - url_encode_ = rhs.url_encode_; + path_encode_ = rhs.path_encode_; address_family_ = rhs.address_family_; tcp_nodelay_ = rhs.tcp_nodelay_; ipv6_v6only_ = rhs.ipv6_v6only_; @@ -4833,6 +5963,7 @@ void ClientImpl::copy_settings(const ClientImpl &rhs) { server_certificate_verifier_ = rhs.server_certificate_verifier_; #endif logger_ = rhs.logger_; + error_logger_ = rhs.error_logger_; } socket_t ClientImpl::create_client_socket(Error &error) const { @@ -4946,8 +6077,9 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { { std::lock_guard guard(socket_mutex_); - // Set this to false immediately - if it ever gets set to true by the end of - // the request, we know another thread instructed us to close the socket. + // Set this to false immediately - if it ever gets set to true by the end + // of the request, we know another thread instructed us to close the + // socket. socket_should_be_closed_when_request_is_done_ = false; auto is_alive = false; @@ -4963,10 +6095,10 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { #endif if (!is_alive) { - // Attempt to avoid sigpipe by shutting down non-gracefully if it seems - // like the other side has already closed the connection Also, there - // cannot be any requests in flight from other threads since we locked - // request_mutex_, so safe to close everything immediately + // Attempt to avoid sigpipe by shutting down non-gracefully if it + // seems like the other side has already closed the connection Also, + // there cannot be any requests in flight from other threads since we + // locked request_mutex_, so safe to close everything immediately const bool shutdown_gracefully = false; shutdown_ssl(socket_, shutdown_gracefully); shutdown_socket(socket_); @@ -4975,7 +6107,10 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { } if (!is_alive) { - if (!create_and_connect_socket(socket_, error)) { return false; } + if (!create_and_connect_socket(socket_, error)) { + output_error_log(error, &req); + return false; + } #ifdef CPPHTTPLIB_OPENSSL_SUPPORT // TODO: refactoring @@ -4985,11 +6120,15 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { auto success = false; if (!scli.connect_with_proxy(socket_, req.start_time_, res, success, error)) { + if (!success) { output_error_log(error, &req); } return success; } } - if (!scli.initialize_ssl(socket_, error)) { return false; } + if (!scli.initialize_ssl(socket_, error)) { + output_error_log(error, &req); + return false; + } } #endif } @@ -5035,7 +6174,10 @@ bool ClientImpl::send_(Request &req, Response &res, Error &error) { }); if (!ret) { - if (error == Error::Success) { error = Error::Unknown; } + if (error == Error::Success) { + error = Error::Unknown; + output_error_log(error, &req); + } } return ret; @@ -5050,7 +6192,12 @@ Result ClientImpl::send_(Request &&req) { auto res = detail::make_unique(); auto error = Error::Success; auto ret = send(req, *res, error); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers), + last_ssl_error_, last_openssl_error_}; +#else return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; +#endif } bool ClientImpl::handle_request(Stream &strm, Request &req, @@ -5058,6 +6205,7 @@ bool ClientImpl::handle_request(Stream &strm, Request &req, Error &error) { if (req.path.empty()) { error = Error::Connection; + output_error_log(error, &req); return false; } @@ -5133,6 +6281,7 @@ bool ClientImpl::handle_request(Stream &strm, Request &req, bool ClientImpl::redirect(Request &req, Response &res, Error &error) { if (req.redirect_count_ == 0) { error = Error::ExceedRedirectCount; + output_error_log(error, &req); return false; } @@ -5165,26 +6314,157 @@ bool ClientImpl::redirect(Request &req, Response &res, Error &error) { if (next_host.empty()) { next_host = host_; } if (next_path.empty()) { next_path = "/"; } - auto path = detail::decode_url(next_path, true) + next_query; + auto path = decode_query_component(next_path, true) + next_query; + // Same host redirect - use current client if (next_scheme == scheme && next_host == host_ && next_port == port_) { return detail::redirect(*this, req, res, path, location, error); - } else { - if (next_scheme == "https") { + } + + // Cross-host/scheme redirect - create new client with robust setup + return create_redirect_client(next_scheme, next_host, next_port, req, res, + path, location, error); +} + +// New method for robust redirect client creation +bool ClientImpl::create_redirect_client( + const std::string &scheme, const std::string &host, int port, Request &req, + Response &res, const std::string &path, const std::string &location, + Error &error) { + // Determine if we need SSL + auto need_ssl = (scheme == "https"); + + // Clean up request headers that are host/client specific + // Remove headers that should not be carried over to new host + auto headers_to_remove = + std::vector{"Host", "Proxy-Authorization", "Authorization"}; + + for (const auto &header_name : headers_to_remove) { + auto it = req.headers.find(header_name); + while (it != req.headers.end()) { + it = req.headers.erase(it); + it = req.headers.find(header_name); + } + } + + // Create appropriate client type and handle redirect + if (need_ssl) { #ifdef CPPHTTPLIB_OPENSSL_SUPPORT - SSLClient cli(next_host, next_port); - cli.copy_settings(*this); - if (ca_cert_store_) { cli.set_ca_cert_store(ca_cert_store_); } - return detail::redirect(cli, req, res, path, location, error); + // Create SSL client for HTTPS redirect + SSLClient redirect_client(host, port); + + // Setup basic client configuration first + setup_redirect_client(redirect_client); + + // SSL-specific configuration for proxy environments + if (!proxy_host_.empty() && proxy_port_ != -1) { + // Critical: Disable SSL verification for proxy environments + redirect_client.enable_server_certificate_verification(false); + redirect_client.enable_server_hostname_verification(false); + } else { + // For direct SSL connections, copy SSL verification settings + redirect_client.enable_server_certificate_verification( + server_certificate_verification_); + redirect_client.enable_server_hostname_verification( + server_hostname_verification_); + } + + // Handle CA certificate store and paths if available + if (ca_cert_store_ && X509_STORE_up_ref(ca_cert_store_)) { + redirect_client.set_ca_cert_store(ca_cert_store_); + } + if (!ca_cert_file_path_.empty()) { + redirect_client.set_ca_cert_path(ca_cert_file_path_, ca_cert_dir_path_); + } + + // Client certificates are set through constructor for SSLClient + // NOTE: SSLClient constructor already takes client_cert_path and + // client_key_path so we need to create it properly if client certs are + // needed + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); #else - return false; + // SSL not supported - set appropriate error + error = Error::SSLConnection; + output_error_log(error, &req); + return false; #endif - } else { - ClientImpl cli(next_host, next_port); - cli.copy_settings(*this); - return detail::redirect(cli, req, res, path, location, error); + } else { + // HTTP redirect + ClientImpl redirect_client(host, port); + + // Setup client with robust configuration + setup_redirect_client(redirect_client); + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); + } +} + +// New method for robust client setup (based on basic_manual_redirect.cpp +// logic) +template +void ClientImpl::setup_redirect_client(ClientType &client) { + // Copy basic settings first + client.set_connection_timeout(connection_timeout_sec_); + client.set_read_timeout(read_timeout_sec_, read_timeout_usec_); + client.set_write_timeout(write_timeout_sec_, write_timeout_usec_); + client.set_keep_alive(keep_alive_); + client.set_follow_location( + true); // Enable redirects to handle multi-step redirects + client.set_path_encode(path_encode_); + client.set_compress(compress_); + client.set_decompress(decompress_); + + // Copy authentication settings BEFORE proxy setup + if (!basic_auth_username_.empty()) { + client.set_basic_auth(basic_auth_username_, basic_auth_password_); + } + if (!bearer_token_auth_token_.empty()) { + client.set_bearer_token_auth(bearer_token_auth_token_); + } +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!digest_auth_username_.empty()) { + client.set_digest_auth(digest_auth_username_, digest_auth_password_); + } +#endif + + // Setup proxy configuration (CRITICAL ORDER - proxy must be set + // before proxy auth) + if (!proxy_host_.empty() && proxy_port_ != -1) { + // First set proxy host and port + client.set_proxy(proxy_host_, proxy_port_); + + // Then set proxy authentication (order matters!) + if (!proxy_basic_auth_username_.empty()) { + client.set_proxy_basic_auth(proxy_basic_auth_username_, + proxy_basic_auth_password_); + } + if (!proxy_bearer_token_auth_token_.empty()) { + client.set_proxy_bearer_token_auth(proxy_bearer_token_auth_token_); } +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + if (!proxy_digest_auth_username_.empty()) { + client.set_proxy_digest_auth(proxy_digest_auth_username_, + proxy_digest_auth_password_); + } +#endif } + + // Copy network and socket settings + client.set_address_family(address_family_); + client.set_tcp_nodelay(tcp_nodelay_); + client.set_ipv6_v6only(ipv6_v6only_); + if (socket_options_) { client.set_socket_options(socket_options_); } + if (!interface_.empty()) { client.set_interface(interface_); } + + // Copy logging and headers + if (logger_) { client.set_logger(logger_); } + if (error_logger_) { client.set_error_logger(error_logger_); } + + // NOTE: DO NOT copy default_headers_ as they may contain stale Host headers + // Each new client should generate its own headers based on its target host } bool ClientImpl::write_content_with_provider(Stream &strm, @@ -5207,8 +6487,9 @@ bool ClientImpl::write_content_with_provider(Stream &strm, return detail::write_content_chunked(strm, req.content_provider_, is_shutting_down, *compressor, error); } else { - return detail::write_content(strm, req.content_provider_, 0, - req.content_length_, is_shutting_down, error); + return detail::write_content_with_progress( + strm, req.content_provider_, 0, req.content_length_, is_shutting_down, + req.upload_progress, error); } } @@ -5222,18 +6503,12 @@ bool ClientImpl::write_request(Stream &strm, Request &req, } if (!req.has_header("Host")) { - if (is_ssl()) { - if (port_ == 443) { - req.set_header("Host", host_); - } else { - req.set_header("Host", host_and_port_); - } + // For Unix socket connections, use "localhost" as Host header (similar to + // curl behavior) + if (address_family_ == AF_UNIX) { + req.set_header("Host", "localhost"); } else { - if (port_ == 80) { - req.set_header("Host", host_); - } else { - req.set_header("Host", host_and_port_); - } + req.set_header("Host", host_and_port_); } } @@ -5322,21 +6597,35 @@ bool ClientImpl::write_request(Stream &strm, Request &req, { detail::BufferStream bstrm; - const auto &path_with_query = - req.params.empty() ? req.path - : append_query_params(req.path, req.params); + // Extract path and query from req.path + std::string path_part, query_part; + auto query_pos = req.path.find('?'); + if (query_pos != std::string::npos) { + path_part = req.path.substr(0, query_pos); + query_part = req.path.substr(query_pos + 1); + } else { + path_part = req.path; + query_part = ""; + } - const auto &path = - url_encode_ ? detail::encode_url(path_with_query) : path_with_query; + // Encode path and query + auto path_with_query = + path_encode_ ? detail::encode_path(path_part) : path_part; - detail::write_request_line(bstrm, req.method, path); + detail::parse_query_text(query_part, req.params); + if (!req.params.empty()) { + path_with_query = append_query_params(path_with_query, req.params); + } + // Write request line and headers + detail::write_request_line(bstrm, req.method, path_with_query); header_writer_(bstrm, req.headers); // Flush buffer auto &data = bstrm.get_buffer(); if (!detail::write_data(strm, data.data(), data.size())) { error = Error::Write; + output_error_log(error, &req); return false; } } @@ -5346,9 +6635,32 @@ bool ClientImpl::write_request(Stream &strm, Request &req, return write_content_with_provider(strm, req, error); } - if (!detail::write_data(strm, req.body.data(), req.body.size())) { - error = Error::Write; - return false; + if (req.upload_progress) { + auto body_size = req.body.size(); + size_t written = 0; + auto data = req.body.data(); + + while (written < body_size) { + size_t to_write = (std::min)(CPPHTTPLIB_SEND_BUFSIZ, body_size - written); + if (!detail::write_data(strm, data + written, to_write)) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + written += to_write; + + if (!req.upload_progress(written, body_size)) { + error = Error::Canceled; + output_error_log(error, &req); + return false; + } + } + } else { + if (!detail::write_data(strm, req.body.data(), req.body.size())) { + error = Error::Write; + output_error_log(error, &req); + return false; + } } return true; @@ -5398,6 +6710,7 @@ std::unique_ptr ClientImpl::send_with_content_provider( while (ok && offset < content_length) { if (!content_provider(offset, content_length - offset, data_sink)) { error = Error::Canceled; + output_error_log(error, &req); return nullptr; } } @@ -5408,6 +6721,7 @@ std::unique_ptr ClientImpl::send_with_content_provider( return true; })) { error = Error::Compression; + output_error_log(error, &req); return nullptr; } } @@ -5437,12 +6751,12 @@ Result ClientImpl::send_with_content_provider( const std::string &method, const std::string &path, const Headers &headers, const char *body, size_t content_length, ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const std::string &content_type, Progress progress) { + const std::string &content_type, UploadProgress progress) { Request req; req.method = method; req.headers = headers; req.path = path; - req.progress = progress; + req.upload_progress = std::move(progress); if (max_timeout_msec_ > 0) { req.start_time_ = std::chrono::steady_clock::now(); } @@ -5453,13 +6767,28 @@ Result ClientImpl::send_with_content_provider( req, body, content_length, std::move(content_provider), std::move(content_provider_without_length), content_type, error); +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + return Result{std::move(res), error, std::move(req.headers), last_ssl_error_, + last_openssl_error_}; +#else return Result{std::move(res), error, std::move(req.headers)}; +#endif } -std::string -ClientImpl::adjust_host_string(const std::string &host) const { - if (host.find(':') != std::string::npos) { return "[" + host + "]"; } - return host; +void ClientImpl::output_log(const Request &req, + const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +void ClientImpl::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } } bool ClientImpl::process_request(Stream &strm, Request &req, @@ -5474,6 +6803,7 @@ bool ClientImpl::process_request(Stream &strm, Request &req, if (!is_proxy_enabled) { if (detail::is_ssl_peer_could_be_closed(socket_.ssl, socket_.sock)) { error = Error::SSLPeerCouldBeClosed_; + output_error_log(error, &req); return false; } } @@ -5484,6 +6814,7 @@ bool ClientImpl::process_request(Stream &strm, Request &req, if (!read_response_line(strm, req, res) || !detail::read_headers(strm, res.headers)) { error = Error::Read; + output_error_log(error, &req); return false; } @@ -5497,6 +6828,7 @@ bool ClientImpl::process_request(Stream &strm, Request &req, if (req.response_handler && !redirect) { if (!req.response_handler(res)) { error = Error::Canceled; + output_error_log(error, &req); return false; } } @@ -5504,24 +6836,30 @@ bool ClientImpl::process_request(Stream &strm, Request &req, auto out = req.content_receiver ? static_cast( - [&](const char *buf, size_t n, uint64_t off, uint64_t len) { + [&](const char *buf, size_t n, size_t off, size_t len) { if (redirect) { return true; } auto ret = req.content_receiver(buf, n, off, len); - if (!ret) { error = Error::Canceled; } + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } return ret; }) : static_cast( - [&](const char *buf, size_t n, uint64_t /*off*/, - uint64_t /*len*/) { + [&](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { assert(res.body.size() + n <= res.body.max_size()); res.body.append(buf, n); return true; }); - auto progress = [&](uint64_t current, uint64_t total) { - if (!req.progress || redirect) { return true; } - auto ret = req.progress(current, total); - if (!ret) { error = Error::Canceled; } + auto progress = [&](size_t current, size_t total) { + if (!req.download_progress || redirect) { return true; } + auto ret = req.download_progress(current, total); + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } return ret; }; @@ -5530,6 +6868,7 @@ bool ClientImpl::process_request(Stream &strm, Request &req, auto len = res.get_header_value_u64("Content-Length"); if (len > res.body.max_size()) { error = Error::Read; + output_error_log(error, &req); return false; } res.body.reserve(static_cast(len)); @@ -5542,24 +6881,25 @@ bool ClientImpl::process_request(Stream &strm, Request &req, dummy_status, std::move(progress), std::move(out), decompress_)) { if (error != Error::Canceled) { error = Error::Read; } + output_error_log(error, &req); return false; } } } // Log - if (logger_) { logger_(req, res); } + output_log(req, res); return true; } ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( - const std::string &boundary, const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) const { + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const { size_t cur_item = 0; size_t cur_start = 0; - // cur_item and cur_start are copied to within the std::function and maintain - // state between successive calls + // cur_item and cur_start are copied to within the std::function and + // maintain state between successive calls return [&, cur_item, cur_start](size_t offset, DataSink &sink) mutable -> bool { if (!offset && !items.empty()) { @@ -5608,25 +6948,27 @@ bool ClientImpl::process_socket( bool ClientImpl::is_ssl() const { return false; } -Result ClientImpl::Get(const std::string &path) { - return Get(path, Headers(), Progress()); -} - -Result ClientImpl::Get(const std::string &path, Progress progress) { +Result ClientImpl::Get(const std::string &path, + DownloadProgress progress) { return Get(path, Headers(), std::move(progress)); } -Result ClientImpl::Get(const std::string &path, const Headers &headers) { - return Get(path, headers, Progress()); +Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + DownloadProgress progress) { + if (params.empty()) { return Get(path, headers); } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(progress)); } Result ClientImpl::Get(const std::string &path, const Headers &headers, - Progress progress) { + DownloadProgress progress) { Request req; req.method = "GET"; req.path = path; req.headers = headers; - req.progress = std::move(progress); + req.download_progress = std::move(progress); if (max_timeout_msec_ > 0) { req.start_time_ = std::chrono::steady_clock::now(); } @@ -5634,48 +6976,24 @@ Result ClientImpl::Get(const std::string &path, const Headers &headers, return send_(std::move(req)); } -Result ClientImpl::Get(const std::string &path, - ContentReceiver content_receiver) { - return Get(path, Headers(), nullptr, std::move(content_receiver), nullptr); -} - Result ClientImpl::Get(const std::string &path, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { return Get(path, Headers(), nullptr, std::move(content_receiver), std::move(progress)); } -Result ClientImpl::Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver) { - return Get(path, headers, nullptr, std::move(content_receiver), nullptr); -} - Result ClientImpl::Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { return Get(path, headers, nullptr, std::move(content_receiver), std::move(progress)); } -Result ClientImpl::Get(const std::string &path, - ResponseHandler response_handler, - ContentReceiver content_receiver) { - return Get(path, Headers(), std::move(response_handler), - std::move(content_receiver), nullptr); -} - -Result ClientImpl::Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver) { - return Get(path, headers, std::move(response_handler), - std::move(content_receiver), nullptr); -} - Result ClientImpl::Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { return Get(path, Headers(), std::move(response_handler), std::move(content_receiver), std::move(progress)); } @@ -5683,7 +7001,7 @@ Result ClientImpl::Get(const std::string &path, Result ClientImpl::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { Request req; req.method = "GET"; req.path = path; @@ -5691,10 +7009,10 @@ Result ClientImpl::Get(const std::string &path, const Headers &headers, req.response_handler = std::move(response_handler); req.content_receiver = [content_receiver](const char *data, size_t data_length, - uint64_t /*offset*/, uint64_t /*total_length*/) { + size_t /*offset*/, size_t /*total_length*/) { return content_receiver(data, data_length); }; - req.progress = std::move(progress); + req.download_progress = std::move(progress); if (max_timeout_msec_ > 0) { req.start_time_ = std::chrono::steady_clock::now(); } @@ -5702,18 +7020,10 @@ Result ClientImpl::Get(const std::string &path, const Headers &headers, return send_(std::move(req)); } -Result ClientImpl::Get(const std::string &path, const Params ¶ms, - const Headers &headers, Progress progress) { - if (params.empty()) { return Get(path, headers); } - - std::string path_with_query = append_query_params(path, params); - return Get(path_with_query, headers, std::move(progress)); -} - Result ClientImpl::Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { return Get(path, params, headers, nullptr, std::move(content_receiver), std::move(progress)); } @@ -5722,7 +7032,7 @@ Result ClientImpl::Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress) { + DownloadProgress progress) { if (params.empty()) { return Get(path, headers, std::move(response_handler), std::move(content_receiver), std::move(progress)); @@ -5761,85 +7071,35 @@ Result ClientImpl::Post(const std::string &path, Result ClientImpl::Post(const std::string &path, const char *body, size_t content_length, - const std::string &content_type) { - return Post(path, Headers(), body, content_length, content_type, nullptr); -} - -Result ClientImpl::Post(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return send_with_content_provider("POST", path, headers, body, content_length, - nullptr, nullptr, content_type, nullptr); -} - -Result ClientImpl::Post(const std::string &path, const Headers &headers, - const char *body, size_t content_length, const std::string &content_type, - Progress progress) { - return send_with_content_provider("POST", path, headers, body, content_length, - nullptr, nullptr, content_type, progress); -} - -Result ClientImpl::Post(const std::string &path, const std::string &body, - const std::string &content_type) { - return Post(path, Headers(), body, content_type); + UploadProgress progress) { + return Post(path, Headers(), body, content_length, content_type, progress); } Result ClientImpl::Post(const std::string &path, const std::string &body, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return Post(path, Headers(), body, content_type, progress); } -Result ClientImpl::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type) { - return send_with_content_provider("POST", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - nullptr); -} - -Result ClientImpl::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - Progress progress) { - return send_with_content_provider("POST", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - progress); -} - Result ClientImpl::Post(const std::string &path, const Params ¶ms) { return Post(path, Headers(), params); } Result ClientImpl::Post(const std::string &path, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return Post(path, Headers(), content_length, std::move(content_provider), - content_type); + content_type, progress); } Result ClientImpl::Post(const std::string &path, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return Post(path, Headers(), std::move(content_provider), content_type); -} - -Result ClientImpl::Post(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type) { - return send_with_content_provider("POST", path, headers, nullptr, - content_length, std::move(content_provider), - nullptr, content_type, nullptr); -} - -Result ClientImpl::Post(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, - std::move(content_provider), content_type, - nullptr); + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), std::move(content_provider), content_type, + progress); } Result ClientImpl::Post(const std::string &path, const Headers &headers, @@ -5848,30 +7108,26 @@ Result ClientImpl::Post(const std::string &path, const Headers &headers, return Post(path, headers, query, "application/x-www-form-urlencoded"); } -Result ClientImpl::Post(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress) { - auto query = detail::params_to_query_str(params); - return Post(path, headers, query, "application/x-www-form-urlencoded", - progress); -} - Result ClientImpl::Post(const std::string &path, - const MultipartFormDataItems &items) { - return Post(path, Headers(), items); + const UploadFormDataItems &items, + UploadProgress progress) { + return Post(path, Headers(), items, progress); } Result ClientImpl::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items) { + const UploadFormDataItems &items, + UploadProgress progress) { const auto &boundary = detail::make_multipart_data_boundary(); const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Post(path, headers, body, content_type); + return Post(path, headers, body, content_type, progress); } Result ClientImpl::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const std::string &boundary) { + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { if (!detail::is_multipart_boundary_chars_valid(boundary)) { return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; } @@ -5879,107 +7135,123 @@ Result ClientImpl::Post(const std::string &path, const Headers &headers, const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Post(path, headers, body, content_type); + return Post(path, headers, body, content_type, progress); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("POST", path, headers, body, content_length, + nullptr, nullptr, content_type, progress); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("POST", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + progress); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("POST", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type, progress); +} + +Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("POST", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type, + progress); } -Result -ClientImpl::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) { +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { const auto &boundary = detail::make_multipart_data_boundary(); const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); return send_with_content_provider( "POST", path, headers, nullptr, 0, nullptr, get_multipart_content_provider(boundary, items, provider_items), - content_type, nullptr); + content_type, progress); } -Result ClientImpl::Put(const std::string &path) { - return Put(path, std::string(), std::string()); -} +Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "POST"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); -Result ClientImpl::Put(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type) { - return Put(path, Headers(), body, content_length, content_type); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); } -Result ClientImpl::Put(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return send_with_content_provider("PUT", path, headers, body, content_length, - nullptr, nullptr, content_type, nullptr); +Result ClientImpl::Put(const std::string &path) { + return Put(path, std::string(), std::string()); } -Result ClientImpl::Put(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, - Progress progress) { - return send_with_content_provider("PUT", path, headers, body, content_length, - nullptr, nullptr, content_type, progress); +Result ClientImpl::Put(const std::string &path, const Headers &headers) { + return Put(path, headers, nullptr, 0, std::string()); } -Result ClientImpl::Put(const std::string &path, const std::string &body, - const std::string &content_type) { - return Put(path, Headers(), body, content_type); +Result ClientImpl::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), body, content_length, content_type, progress); } Result ClientImpl::Put(const std::string &path, const std::string &body, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return Put(path, Headers(), body, content_type, progress); } -Result ClientImpl::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type) { - return send_with_content_provider("PUT", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - nullptr); -} - -Result ClientImpl::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, - Progress progress) { - return send_with_content_provider("PUT", path, headers, body.data(), - body.size(), nullptr, nullptr, content_type, - progress); +Result ClientImpl::Put(const std::string &path, const Params ¶ms) { + return Put(path, Headers(), params); } Result ClientImpl::Put(const std::string &path, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return Put(path, Headers(), content_length, std::move(content_provider), - content_type); + content_type, progress); } Result ClientImpl::Put(const std::string &path, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return Put(path, Headers(), std::move(content_provider), content_type); -} - -Result ClientImpl::Put(const std::string &path, const Headers &headers, - size_t content_length, - ContentProvider content_provider, - const std::string &content_type) { - return send_with_content_provider("PUT", path, headers, nullptr, - content_length, std::move(content_provider), - nullptr, content_type, nullptr); -} - -Result ClientImpl::Put(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, - std::move(content_provider), content_type, - nullptr); -} - -Result ClientImpl::Put(const std::string &path, const Params ¶ms) { - return Put(path, Headers(), params); + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), std::move(content_provider), content_type, + progress); } Result ClientImpl::Put(const std::string &path, const Headers &headers, @@ -5988,30 +7260,26 @@ Result ClientImpl::Put(const std::string &path, const Headers &headers, return Put(path, headers, query, "application/x-www-form-urlencoded"); } -Result ClientImpl::Put(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress) { - auto query = detail::params_to_query_str(params); - return Put(path, headers, query, "application/x-www-form-urlencoded", - progress); -} - Result ClientImpl::Put(const std::string &path, - const MultipartFormDataItems &items) { - return Put(path, Headers(), items); + const UploadFormDataItems &items, + UploadProgress progress) { + return Put(path, Headers(), items, progress); } Result ClientImpl::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items) { + const UploadFormDataItems &items, + UploadProgress progress) { const auto &boundary = detail::make_multipart_data_boundary(); const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Put(path, headers, body, content_type); + return Put(path, headers, body, content_type, progress); } Result ClientImpl::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const std::string &boundary) { + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { if (!detail::is_multipart_boundary_chars_valid(boundary)) { return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; } @@ -6019,150 +7287,297 @@ Result ClientImpl::Put(const std::string &path, const Headers &headers, const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); const auto &body = detail::serialize_multipart_formdata(items, boundary); - return Put(path, headers, body, content_type); + return Put(path, headers, body, content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("PUT", path, headers, body, content_length, + nullptr, nullptr, content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("PUT", path, headers, body.data(), + body.size(), nullptr, nullptr, content_type, + progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("PUT", path, headers, nullptr, + content_length, std::move(content_provider), + nullptr, content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider("PUT", path, headers, nullptr, 0, nullptr, + std::move(content_provider), content_type, + progress); } -Result -ClientImpl::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) { +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { const auto &boundary = detail::make_multipart_data_boundary(); const auto &content_type = detail::serialize_multipart_formdata_get_content_type(boundary); return send_with_content_provider( "PUT", path, headers, nullptr, 0, nullptr, get_multipart_content_provider(boundary, items, provider_items), - content_type, nullptr); + content_type, progress); +} + +Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PUT"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); } + Result ClientImpl::Patch(const std::string &path) { return Patch(path, std::string(), std::string()); } -Result ClientImpl::Patch(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type) { - return Patch(path, Headers(), body, content_length, content_type); +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + UploadProgress progress) { + return Patch(path, headers, nullptr, 0, std::string(), progress); } Result ClientImpl::Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return Patch(path, Headers(), body, content_length, content_type, progress); } +Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), body, content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, const Params ¶ms) { + return Patch(path, Headers(), params); +} + +Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), std::move(content_provider), content_type, + progress); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Patch(path, headers, query, "application/x-www-form-urlencoded"); +} + +Result ClientImpl::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Patch(path, Headers(), items, progress); +} + Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return Patch(path, headers, body, content_length, content_type, nullptr); + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Patch(path, headers, body, content_type, progress); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + const auto &body = detail::serialize_multipart_formdata(items, boundary); + return Patch(path, headers, body, content_type, progress); } Result ClientImpl::Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return send_with_content_provider("PATCH", path, headers, body, content_length, nullptr, nullptr, content_type, progress); } -Result ClientImpl::Patch(const std::string &path, - const std::string &body, - const std::string &content_type) { - return Patch(path, Headers(), body, content_type); -} - -Result ClientImpl::Patch(const std::string &path, - const std::string &body, - const std::string &content_type, - Progress progress) { - return Patch(path, Headers(), body, content_type, progress); -} - -Result ClientImpl::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type) { - return Patch(path, headers, body, content_type, nullptr); -} - Result ClientImpl::Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return send_with_content_provider("PATCH", path, headers, body.data(), body.size(), nullptr, nullptr, content_type, progress); } -Result ClientImpl::Patch(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type) { - return Patch(path, Headers(), content_length, std::move(content_provider), - content_type); -} - -Result ClientImpl::Patch(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return Patch(path, Headers(), std::move(content_provider), content_type); -} - Result ClientImpl::Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return send_with_content_provider("PATCH", path, headers, nullptr, content_length, std::move(content_provider), - nullptr, content_type, nullptr); + nullptr, content_type, progress); } Result ClientImpl::Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return send_with_content_provider("PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), content_type, - nullptr); + progress); +} + +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider( + "PATCH", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, progress); } -Result ClientImpl::Delete(const std::string &path) { - return Delete(path, Headers(), std::string(), std::string()); +Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PATCH"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); } Result ClientImpl::Delete(const std::string &path, - const Headers &headers) { - return Delete(path, headers, std::string(), std::string()); + DownloadProgress progress) { + return Delete(path, Headers(), std::string(), std::string(), progress); } -Result ClientImpl::Delete(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type) { - return Delete(path, Headers(), body, content_length, content_type); +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + DownloadProgress progress) { + return Delete(path, headers, std::string(), std::string(), progress); } Result ClientImpl::Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { return Delete(path, Headers(), body, content_length, content_type, progress); } Result ClientImpl::Delete(const std::string &path, - const Headers &headers, const char *body, - size_t content_length, - const std::string &content_type) { - return Delete(path, headers, body, content_length, content_type, nullptr); + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, Headers(), body.data(), body.size(), content_type, + progress); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, headers, body.data(), body.size(), content_type, + progress); +} + +Result ClientImpl::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return Delete(path, Headers(), params, progress); +} + +Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const Params ¶ms, + DownloadProgress progress) { + auto query = detail::params_to_query_str(params); + return Delete(path, headers, query, "application/x-www-form-urlencoded", + progress); } Result ClientImpl::Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { Request req; req.method = "DELETE"; req.headers = headers; req.path = path; - req.progress = progress; + req.download_progress = std::move(progress); if (max_timeout_msec_ > 0) { req.start_time_ = std::chrono::steady_clock::now(); } @@ -6173,36 +7588,6 @@ Result ClientImpl::Delete(const std::string &path, return send_(std::move(req)); } -Result ClientImpl::Delete(const std::string &path, - const std::string &body, - const std::string &content_type) { - return Delete(path, Headers(), body.data(), body.size(), content_type); -} - -Result ClientImpl::Delete(const std::string &path, - const std::string &body, - const std::string &content_type, - Progress progress) { - return Delete(path, Headers(), body.data(), body.size(), content_type, - progress); -} - -Result ClientImpl::Delete(const std::string &path, - const Headers &headers, - const std::string &body, - const std::string &content_type) { - return Delete(path, headers, body.data(), body.size(), content_type); -} - -Result ClientImpl::Delete(const std::string &path, - const Headers &headers, - const std::string &body, - const std::string &content_type, - Progress progress) { - return Delete(path, headers, body.data(), body.size(), content_type, - progress); -} - Result ClientImpl::Options(const std::string &path) { return Options(path, Headers()); } @@ -6226,8 +7611,8 @@ void ClientImpl::stop() { // If there is anything ongoing right now, the ONLY thread-safe thing we can // do is to shutdown_socket, so that threads using this socket suddenly // discover they can't read/write any more and error out. Everything else - // (closing the socket, shutting ssl down) is unsafe because these actions are - // not thread-safe. + // (closing the socket, shutting ssl down) is unsafe because these actions + // are not thread-safe. if (socket_requests_in_flight_ > 0) { shutdown_socket(socket_); @@ -6295,7 +7680,7 @@ void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } -void ClientImpl::set_url_encode(bool on) { url_encode_ = on; } +void ClientImpl::set_path_encode(bool on) { path_encode_ = on; } void ClientImpl::set_hostname_addr_map(std::map addr_map) { @@ -6407,12 +7792,23 @@ void ClientImpl::set_logger(Logger logger) { logger_ = std::move(logger); } +void ClientImpl::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); +} + /* * SSL Implementation */ #ifdef CPPHTTPLIB_OPENSSL_SUPPORT namespace detail { +bool is_ip_address(const std::string &host) { + struct in_addr addr4; + struct in6_addr addr6; + return inet_pton(AF_INET, host.c_str(), &addr4) == 1 || + inet_pton(AF_INET6, host.c_str(), &addr6) == 1; +} + template SSL *ssl_new(socket_t sock, SSL_CTX *ctx, std::mutex &ctx_mutex, U SSL_connect_or_accept, V setup) { @@ -6467,8 +7863,8 @@ void ssl_delete(std::mutex &ctx_mutex, SSL *ssl, socket_t sock, template bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, U ssl_connect_or_accept, - time_t timeout_sec, - time_t timeout_usec) { + time_t timeout_sec, time_t timeout_usec, + int *ssl_error) { auto res = 0; while ((res = ssl_connect_or_accept(ssl)) != 1) { auto err = SSL_get_error(ssl, res); @@ -6481,6 +7877,7 @@ bool ssl_connect_or_accept_nonblocking(socket_t sock, SSL *ssl, break; default: break; } + if (ssl_error) { *ssl_error = err; } return false; } return true; @@ -6574,9 +7971,10 @@ ssize_t SSLSocketStream::read(char *ptr, size_t size) { if (ret >= 0) { return ret; } err = SSL_get_error(ssl_, ret); } else { - return -1; + break; } } + assert(ret < 0); } return ret; } else { @@ -6606,9 +8004,10 @@ ssize_t SSLSocketStream::write(const char *ptr, size_t size) { if (ret >= 0) { return ret; } err = SSL_get_error(ssl_, ret); } else { - return -1; + break; } } + assert(ret < 0); } return ret; } @@ -6659,12 +8058,26 @@ SSLServer::SSLServer(const char *cert_path, const char *private_key_path, SSL_CTX_use_PrivateKey_file(ctx_, private_key_path, SSL_FILETYPE_PEM) != 1 || SSL_CTX_check_private_key(ctx_) != 1) { + last_ssl_error_ = static_cast(ERR_get_error()); SSL_CTX_free(ctx_); ctx_ = nullptr; } else if (client_ca_cert_file_path || client_ca_cert_dir_path) { SSL_CTX_load_verify_locations(ctx_, client_ca_cert_file_path, client_ca_cert_dir_path); + // Set client CA list to be sent to clients during TLS handshake + if (client_ca_cert_file_path) { + auto ca_list = SSL_load_client_CA_file(client_ca_cert_file_path); + if (ca_list != nullptr) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to load client CA list, but we continue since + // SSL_CTX_load_verify_locations already succeeded and + // certificate verification will still work + last_ssl_error_ = static_cast(ERR_get_error()); + } + } + SSL_CTX_set_verify( ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); } @@ -6689,6 +8102,15 @@ SSLServer::SSLServer(X509 *cert, EVP_PKEY *private_key, } else if (client_ca_cert_store) { SSL_CTX_set_cert_store(ctx_, client_ca_cert_store); + // Extract CA names from the store and set them as the client CA list + auto ca_list = extract_ca_names_from_x509_store(client_ca_cert_store); + if (ca_list) { + SSL_CTX_set_client_CA_list(ctx_, ca_list); + } else { + // Failed to extract CA names, record the error + last_ssl_error_ = static_cast(ERR_get_error()); + } + SSL_CTX_set_verify( ctx_, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, nullptr); } @@ -6732,7 +8154,8 @@ bool SSLServer::process_and_close_socket(socket_t sock) { sock, ctx_, ctx_mutex_, [&](SSL *ssl2) { return detail::ssl_connect_or_accept_nonblocking( - sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_); + sock, ssl2, SSL_accept, read_timeout_sec_, read_timeout_usec_, + &last_ssl_error_); }, [](SSL * /*ssl2*/) { return true; }); @@ -6768,6 +8191,44 @@ bool SSLServer::process_and_close_socket(socket_t sock) { return ret; } +STACK_OF(X509_NAME) * SSLServer::extract_ca_names_from_x509_store( + X509_STORE *store) { + if (!store) { return nullptr; } + + auto ca_list = sk_X509_NAME_new_null(); + if (!ca_list) { return nullptr; } + + // Get all objects from the store + auto objs = X509_STORE_get0_objects(store); + if (!objs) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + // Iterate through objects and extract certificate subject names + for (int i = 0; i < sk_X509_OBJECT_num(objs); i++) { + auto obj = sk_X509_OBJECT_value(objs, i); + if (X509_OBJECT_get_type(obj) == X509_LU_X509) { + auto cert = X509_OBJECT_get0_X509(obj); + if (cert) { + auto subject = X509_get_subject_name(cert); + if (subject) { + auto name_dup = X509_NAME_dup(subject); + if (name_dup) { sk_X509_NAME_push(ca_list, name_dup); } + } + } + } + } + + // If no names were extracted, free the list and return nullptr + if (sk_X509_NAME_num(ca_list) == 0) { + sk_X509_NAME_free(ca_list); + return nullptr; + } + + return ca_list; +} + // SSL HTTP client implementation SSLClient::SSLClient(const std::string &host) : SSLClient(host, 443, std::string(), std::string()) {} @@ -6800,6 +8261,7 @@ SSLClient::SSLClient(const std::string &host, int port, SSL_FILETYPE_PEM) != 1 || SSL_CTX_use_PrivateKey_file(ctx_, client_key_path.c_str(), SSL_FILETYPE_PEM) != 1) { + last_openssl_error_ = ERR_get_error(); SSL_CTX_free(ctx_); ctx_ = nullptr; } @@ -6826,6 +8288,7 @@ SSLClient::SSLClient(const std::string &host, int port, if (SSL_CTX_use_certificate(ctx_, client_cert) != 1 || SSL_CTX_use_PrivateKey(ctx_, client_key) != 1) { + last_openssl_error_ = ERR_get_error(); SSL_CTX_free(ctx_); ctx_ = nullptr; } @@ -6846,8 +8309,10 @@ void SSLClient::set_ca_cert_store(X509_STORE *ca_cert_store) { if (ca_cert_store) { if (ctx_) { if (SSL_CTX_get_cert_store(ctx_) != ca_cert_store) { - // Free memory allocated for old cert and use new store `ca_cert_store` + // Free memory allocated for old cert and use new store + // `ca_cert_store` SSL_CTX_set_cert_store(ctx_, ca_cert_store); + ca_cert_store_ = ca_cert_store; } } else { X509_STORE_free(ca_cert_store); @@ -6867,10 +8332,15 @@ long SSLClient::get_openssl_verify_result() const { SSL_CTX *SSLClient::ssl_context() const { return ctx_; } bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { - return is_valid() && ClientImpl::create_and_connect_socket(socket, error); + if (!is_valid()) { + error = Error::SSLConnection; + return false; + } + return ClientImpl::create_and_connect_socket(socket, error); } -// Assumes that socket_mutex_ is locked and that there are no requests in flight +// Assumes that socket_mutex_ is locked and that there are no requests in +// flight bool SSLClient::connect_with_proxy( Socket &socket, std::chrono::time_point start_time, @@ -6903,6 +8373,19 @@ bool SSLClient::connect_with_proxy( !proxy_digest_auth_password_.empty()) { std::map auth; if (detail::parse_www_authenticate(proxy_res, auth, true)) { + // Close the current socket and create a new one for the authenticated + // request + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + + // Create a new socket for the authenticated CONNECT request + if (!create_and_connect_socket(socket, error)) { + success = false; + output_error_log(error, nullptr); + return false; + } + proxy_res = Response(); if (!detail::process_client_socket( socket.sock, read_timeout_sec_, read_timeout_usec_, @@ -6937,6 +8420,7 @@ bool SSLClient::connect_with_proxy( // as the response of the request if (proxy_res.status != StatusCode::OK_200) { error = Error::ProxyConnection; + output_error_log(error, nullptr); res = std::move(proxy_res); // Thread-safe to close everything because we are assuming there are // no requests in flight @@ -6957,11 +8441,13 @@ bool SSLClient::load_certs() { if (!ca_cert_file_path_.empty()) { if (!SSL_CTX_load_verify_locations(ctx_, ca_cert_file_path_.c_str(), nullptr)) { + last_openssl_error_ = ERR_get_error(); ret = false; } } else if (!ca_cert_dir_path_.empty()) { if (!SSL_CTX_load_verify_locations(ctx_, nullptr, ca_cert_dir_path_.c_str())) { + last_openssl_error_ = ERR_get_error(); ret = false; } } else { @@ -6969,10 +8455,8 @@ bool SSLClient::load_certs() { #ifdef _WIN32 loaded = detail::load_system_certs_on_windows(SSL_CTX_get_cert_store(ctx_)); -#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) -#if TARGET_OS_OSX +#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && TARGET_OS_MAC loaded = detail::load_system_certs_on_macos(SSL_CTX_get_cert_store(ctx_)); -#endif // TARGET_OS_OSX #endif // _WIN32 if (!loaded) { SSL_CTX_set_default_verify_paths(ctx_); } } @@ -6988,6 +8472,7 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { if (server_certificate_verification_) { if (!load_certs()) { error = Error::SSLLoadingCerts; + output_error_log(error, nullptr); return false; } SSL_set_verify(ssl2, SSL_VERIFY_NONE, nullptr); @@ -6995,8 +8480,9 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { if (!detail::ssl_connect_or_accept_nonblocking( socket.sock, ssl2, SSL_connect, connection_timeout_sec_, - connection_timeout_usec_)) { + connection_timeout_usec_, &last_ssl_error_)) { error = Error::SSLConnection; + output_error_log(error, nullptr); return false; } @@ -7008,7 +8494,9 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { } if (verification_status == SSLVerifierResponse::CertificateRejected) { + last_openssl_error_ = ERR_get_error(); error = Error::SSLServerVerification; + output_error_log(error, nullptr); return false; } @@ -7016,7 +8504,9 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { verify_result_ = SSL_get_verify_result(ssl2); if (verify_result_ != X509_V_OK) { + last_openssl_error_ = static_cast(verify_result_); error = Error::SSLServerVerification; + output_error_log(error, nullptr); return false; } @@ -7024,13 +8514,17 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { auto se = detail::scope_exit([&] { X509_free(server_cert); }); if (server_cert == nullptr) { + last_openssl_error_ = ERR_get_error(); error = Error::SSLServerVerification; + output_error_log(error, nullptr); return false; } if (server_hostname_verification_) { if (!verify_host(server_cert)) { + last_openssl_error_ = X509_V_ERR_HOSTNAME_MISMATCH; error = Error::SSLServerHostnameVerification; + output_error_log(error, nullptr); return false; } } @@ -7040,14 +8534,18 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { return true; }, [&](SSL *ssl2) { + // Set SNI only if host is not IP address + if (!detail::is_ip_address(host_)) { #if defined(OPENSSL_IS_BORINGSSL) - SSL_set_tlsext_host_name(ssl2, host_.c_str()); + SSL_set_tlsext_host_name(ssl2, host_.c_str()); #else - // NOTE: Direct call instead of using the OpenSSL macro to suppress - // -Wold-style-cast warning - SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, - static_cast(const_cast(host_.c_str()))); + // NOTE: Direct call instead of using the OpenSSL macro to suppress + // -Wold-style-cast warning + SSL_ctrl(ssl2, SSL_CTRL_SET_TLSEXT_HOSTNAME, + TLSEXT_NAMETYPE_host_name, + static_cast(const_cast(host_.c_str()))); #endif + } return true; }); @@ -7056,6 +8554,11 @@ bool SSLClient::initialize_ssl(Socket &socket, Error &error) { return true; } + if (ctx_ == nullptr) { + error = Error::SSLConnection; + last_openssl_error_ = ERR_get_error(); + } + shutdown_socket(socket); close_socket(socket); return false; @@ -7149,21 +8652,22 @@ SSLClient::verify_host_with_subject_alt_name(X509 *server_cert) const { for (decltype(count) i = 0; i < count && !dsn_matched; i++) { auto val = sk_GENERAL_NAME_value(alt_names, i); - if (val->type == type) { - auto name = - reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); - auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); - - switch (type) { - case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; - - case GEN_IPADD: - if (!memcmp(&addr6, name, addr_len) || - !memcmp(&addr, name, addr_len)) { - ip_matched = true; - } - break; + if (!val || val->type != type) { continue; } + + auto name = + reinterpret_cast(ASN1_STRING_get0_data(val->d.ia5)); + if (name == nullptr) { continue; } + + auto name_len = static_cast(ASN1_STRING_length(val->d.ia5)); + + switch (type) { + case GEN_DNS: dsn_matched = check_host_name(name, name_len); break; + + case GEN_IPADD: + if (!memcmp(&addr6, name, addr_len) || !memcmp(&addr, name, addr_len)) { + ip_matched = true; } + break; } } @@ -7287,72 +8791,54 @@ bool Client::is_valid() const { return cli_ != nullptr && cli_->is_valid(); } -Result Client::Get(const std::string &path) { return cli_->Get(path); } -Result Client::Get(const std::string &path, const Headers &headers) { - return cli_->Get(path, headers); -} -Result Client::Get(const std::string &path, Progress progress) { +Result Client::Get(const std::string &path, DownloadProgress progress) { return cli_->Get(path, std::move(progress)); } Result Client::Get(const std::string &path, const Headers &headers, - Progress progress) { + DownloadProgress progress) { return cli_->Get(path, headers, std::move(progress)); } Result Client::Get(const std::string &path, - ContentReceiver content_receiver) { - return cli_->Get(path, std::move(content_receiver)); -} -Result Client::Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver) { - return cli_->Get(path, headers, std::move(content_receiver)); -} -Result Client::Get(const std::string &path, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, std::move(content_receiver), std::move(progress)); } Result Client::Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, headers, std::move(content_receiver), std::move(progress)); } Result Client::Get(const std::string &path, ResponseHandler response_handler, - ContentReceiver content_receiver) { - return cli_->Get(path, std::move(response_handler), - std::move(content_receiver)); -} -Result Client::Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver) { - return cli_->Get(path, headers, std::move(response_handler), - std::move(content_receiver)); -} -Result Client::Get(const std::string &path, - ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, std::move(response_handler), std::move(content_receiver), std::move(progress)); } Result Client::Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, headers, std::move(response_handler), std::move(content_receiver), std::move(progress)); } Result Client::Get(const std::string &path, const Params ¶ms, - const Headers &headers, Progress progress) { + const Headers &headers, DownloadProgress progress) { return cli_->Get(path, params, headers, std::move(progress)); } Result Client::Get(const std::string &path, const Params ¶ms, const Headers &headers, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, params, headers, std::move(content_receiver), std::move(progress)); } Result Client::Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress) { + ContentReceiver content_receiver, + DownloadProgress progress) { return cli_->Get(path, params, headers, std::move(response_handler), std::move(content_receiver), std::move(progress)); } @@ -7368,60 +8854,55 @@ Result Client::Post(const std::string &path, const Headers &headers) { } Result Client::Post(const std::string &path, const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Post(path, body, content_length, content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, body, content_length, content_type, progress); } Result Client::Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Post(path, headers, body, content_length, content_type); -} -Result Client::Post(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Post(path, headers, body, content_length, content_type, progress); } Result Client::Post(const std::string &path, const std::string &body, - const std::string &content_type) { - return cli_->Post(path, body, content_type); -} -Result Client::Post(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Post(path, body, content_type, progress); } Result Client::Post(const std::string &path, const Headers &headers, const std::string &body, - const std::string &content_type) { - return cli_->Post(path, headers, body, content_type); -} -Result Client::Post(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Post(path, headers, body, content_type, progress); } Result Client::Post(const std::string &path, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Post(path, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Post(const std::string &path, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Post(path, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, std::move(content_provider), content_type, progress); } Result Client::Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Post(path, headers, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Post(path, headers, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, std::move(content_provider), content_type, + progress); } Result Client::Post(const std::string &path, const Params ¶ms) { return cli_->Post(path, params); @@ -7430,85 +8911,91 @@ Result Client::Post(const std::string &path, const Headers &headers, const Params ¶ms) { return cli_->Post(path, headers, params); } -Result Client::Post(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress) { - return cli_->Post(path, headers, params, progress); -} Result Client::Post(const std::string &path, - const MultipartFormDataItems &items) { - return cli_->Post(path, items); + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, items, progress); +} +Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, headers, items, progress); } Result Client::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items) { - return cli_->Post(path, headers, items); + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Post(path, headers, items, boundary, progress); } Result Client::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const std::string &boundary) { - return cli_->Post(path, headers, items, boundary); + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Post(path, headers, items, provider_items, progress); } -Result -Client::Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) { - return cli_->Post(path, headers, items, provider_items); +Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, body, content_type, content_receiver, + progress); } + Result Client::Put(const std::string &path) { return cli_->Put(path); } +Result Client::Put(const std::string &path, const Headers &headers) { + return cli_->Put(path, headers); +} Result Client::Put(const std::string &path, const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Put(path, body, content_length, content_type); -} -Result Client::Put(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Put(path, headers, body, content_length, content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, body, content_length, content_type, progress); } Result Client::Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Put(path, headers, body, content_length, content_type, progress); } Result Client::Put(const std::string &path, const std::string &body, - const std::string &content_type) { - return cli_->Put(path, body, content_type); -} -Result Client::Put(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Put(path, body, content_type, progress); } Result Client::Put(const std::string &path, const Headers &headers, const std::string &body, - const std::string &content_type) { - return cli_->Put(path, headers, body, content_type); -} -Result Client::Put(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type, Progress progress) { + const std::string &content_type, + UploadProgress progress) { return cli_->Put(path, headers, body, content_type, progress); } Result Client::Put(const std::string &path, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Put(path, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Put(const std::string &path, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Put(path, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, std::move(content_provider), content_type, progress); } Result Client::Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Put(path, headers, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Put(path, headers, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, std::move(content_provider), content_type, + progress); } Result Client::Put(const std::string &path, const Params ¶ms) { return cli_->Put(path, params); @@ -7517,147 +9004,174 @@ Result Client::Put(const std::string &path, const Headers &headers, const Params ¶ms) { return cli_->Put(path, headers, params); } -Result Client::Put(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress) { - return cli_->Put(path, headers, params, progress); -} Result Client::Put(const std::string &path, - const MultipartFormDataItems &items) { - return cli_->Put(path, items); + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, items, progress); } Result Client::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items) { - return cli_->Put(path, headers, items); + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, headers, items, progress); } Result Client::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const std::string &boundary) { - return cli_->Put(path, headers, items, boundary); + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Put(path, headers, items, boundary, progress); } -Result -Client::Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) { - return cli_->Put(path, headers, items, provider_items); +Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Put(path, headers, items, provider_items, progress); +} +Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Put(path, headers, body, content_type, content_receiver, + progress); } + Result Client::Patch(const std::string &path) { return cli_->Patch(path); } -Result Client::Patch(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type) { - return cli_->Patch(path, body, content_length, content_type); +Result Client::Patch(const std::string &path, const Headers &headers) { + return cli_->Patch(path, headers); } Result Client::Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return cli_->Patch(path, body, content_length, content_type, progress); } -Result Client::Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Patch(path, headers, body, content_length, content_type); -} Result Client::Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return cli_->Patch(path, headers, body, content_length, content_type, progress); } -Result Client::Patch(const std::string &path, const std::string &body, - const std::string &content_type) { - return cli_->Patch(path, body, content_type); -} Result Client::Patch(const std::string &path, const std::string &body, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return cli_->Patch(path, body, content_type, progress); } -Result Client::Patch(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type) { - return cli_->Patch(path, headers, body, content_type); -} Result Client::Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, - Progress progress) { + UploadProgress progress) { return cli_->Patch(path, headers, body, content_type, progress); } Result Client::Patch(const std::string &path, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Patch(path, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Patch(const std::string &path, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Patch(path, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, std::move(content_provider), content_type, progress); } Result Client::Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, - const std::string &content_type) { + const std::string &content_type, + UploadProgress progress) { return cli_->Patch(path, headers, content_length, std::move(content_provider), - content_type); + content_type, progress); } Result Client::Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, - const std::string &content_type) { - return cli_->Patch(path, headers, std::move(content_provider), content_type); + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, std::move(content_provider), content_type, + progress); } -Result Client::Delete(const std::string &path) { - return cli_->Delete(path); +Result Client::Patch(const std::string &path, const Params ¶ms) { + return cli_->Patch(path, params); } -Result Client::Delete(const std::string &path, const Headers &headers) { - return cli_->Delete(path, headers); +Result Client::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Patch(path, headers, params); } -Result Client::Delete(const std::string &path, const char *body, - size_t content_length, - const std::string &content_type) { - return cli_->Delete(path, body, content_length, content_type); +Result Client::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, items, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Patch(path, headers, items, boundary, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, provider_items, progress); +} +Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Patch(path, headers, body, content_type, content_receiver, + progress); +} + +Result Client::Delete(const std::string &path, + DownloadProgress progress) { + return cli_->Delete(path, progress); +} +Result Client::Delete(const std::string &path, const Headers &headers, + DownloadProgress progress) { + return cli_->Delete(path, headers, progress); } Result Client::Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { return cli_->Delete(path, body, content_length, content_type, progress); } -Result Client::Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type) { - return cli_->Delete(path, headers, body, content_length, content_type); -} Result Client::Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { return cli_->Delete(path, headers, body, content_length, content_type, progress); } -Result Client::Delete(const std::string &path, const std::string &body, - const std::string &content_type) { - return cli_->Delete(path, body, content_type); -} Result Client::Delete(const std::string &path, const std::string &body, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { return cli_->Delete(path, body, content_type, progress); } -Result Client::Delete(const std::string &path, const Headers &headers, - const std::string &body, - const std::string &content_type) { - return cli_->Delete(path, headers, body, content_type); -} Result Client::Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, - Progress progress) { + DownloadProgress progress) { return cli_->Delete(path, headers, body, content_type, progress); } +Result Client::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return cli_->Delete(path, params, progress); +} +Result Client::Delete(const std::string &path, const Headers &headers, + const Params ¶ms, DownloadProgress progress) { + return cli_->Delete(path, headers, params, progress); +} + Result Client::Options(const std::string &path) { return cli_->Options(path); } @@ -7736,7 +9250,12 @@ void Client::set_follow_location(bool on) { cli_->set_follow_location(on); } -void Client::set_url_encode(bool on) { cli_->set_url_encode(on); } +void Client::set_path_encode(bool on) { cli_->set_path_encode(on); } + +[[deprecated("Use set_path_encode instead")]] +void Client::set_url_encode(bool on) { + cli_->set_path_encode(on); +} void Client::set_compress(bool on) { cli_->set_compress(on); } @@ -7782,6 +9301,10 @@ void Client::set_logger(Logger logger) { cli_->set_logger(std::move(logger)); } +void Client::set_error_logger(ErrorLogger error_logger) { + cli_->set_error_logger(std::move(error_logger)); +} + #ifdef CPPHTTPLIB_OPENSSL_SUPPORT void Client::set_ca_cert_path(const std::string &ca_cert_file_path, const std::string &ca_cert_dir_path) { diff --git a/vendor/cpp-httplib/httplib.h b/vendor/cpp-httplib/httplib.h index 7ee219380f9..083f7950364 100644 --- a/vendor/cpp-httplib/httplib.h +++ b/vendor/cpp-httplib/httplib.h @@ -8,7 +8,35 @@ #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.20.1" +#define CPPHTTPLIB_VERSION "0.27.0" +#define CPPHTTPLIB_VERSION_NUM "0x001B00" + +/* + * Platform compatibility check + */ + +#if defined(_WIN32) && !defined(_WIN64) +#if defined(_MSC_VER) +#pragma message( \ + "cpp-httplib doesn't support 32-bit Windows. Please use a 64-bit compiler.") +#else +#warning \ + "cpp-httplib doesn't support 32-bit Windows. Please use a 64-bit compiler." +#endif +#elif defined(__SIZEOF_POINTER__) && __SIZEOF_POINTER__ < 8 +#warning \ + "cpp-httplib doesn't support 32-bit platforms. Please use a 64-bit compiler." +#elif defined(__SIZEOF_SIZE_T__) && __SIZEOF_SIZE_T__ < 8 +#warning \ + "cpp-httplib doesn't support platforms where size_t is less than 64 bits." +#endif + +#ifdef _WIN32 +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0A00 +#error \ + "cpp-httplib doesn't support Windows 8 or lower. Please use Windows 10 or later." +#endif +#endif /* * Configuration @@ -76,7 +104,7 @@ #ifndef CPPHTTPLIB_IDLE_INTERVAL_USECOND #ifdef _WIN32 -#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 10000 +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 1000 #else #define CPPHTTPLIB_IDLE_INTERVAL_USECOND 0 #endif @@ -90,6 +118,10 @@ #define CPPHTTPLIB_HEADER_MAX_LENGTH 8192 #endif +#ifndef CPPHTTPLIB_HEADER_MAX_COUNT +#define CPPHTTPLIB_HEADER_MAX_COUNT 100 +#endif + #ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT #define CPPHTTPLIB_REDIRECT_MAX_COUNT 20 #endif @@ -122,6 +154,10 @@ #define CPPHTTPLIB_RECV_BUFSIZ size_t(16384u) #endif +#ifndef CPPHTTPLIB_SEND_BUFSIZ +#define CPPHTTPLIB_SEND_BUFSIZ size_t(16384u) +#endif + #ifndef CPPHTTPLIB_COMPRESSION_BUFSIZ #define CPPHTTPLIB_COMPRESSION_BUFSIZ size_t(16384u) #endif @@ -169,11 +205,7 @@ #pragma comment(lib, "ws2_32.lib") -#ifdef _WIN64 using ssize_t = __int64; -#else -using ssize_t = long; -#endif #endif // _MSC_VER #ifndef S_ISREG @@ -192,8 +224,13 @@ using ssize_t = long; #include #include +#if defined(__has_include) +#if __has_include() // afunix.h uses types declared in winsock2.h, so has to be included after it. #include +#define CPPHTTPLIB_HAVE_AFUNIX_H 1 +#endif +#endif #ifndef WSA_FLAG_NO_HANDLE_INHERIT #define WSA_FLAG_NO_HANDLE_INHERIT 0x80 @@ -236,6 +273,10 @@ using socket_t = int; #endif #endif //_WIN32 +#if defined(__APPLE__) +#include +#endif + #include #include #include @@ -265,6 +306,15 @@ using socket_t = int; #include #include +#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \ + defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) +#if TARGET_OS_MAC +#include +#include +#endif +#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or + // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN + #ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef _WIN32 #include @@ -279,14 +329,14 @@ using socket_t = int; #ifdef _MSC_VER #pragma comment(lib, "crypt32.lib") #endif -#elif defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && defined(__APPLE__) -#include -#if TARGET_OS_OSX -#include -#include -#endif // TARGET_OS_OSX #endif // _WIN32 +#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) +#if TARGET_OS_MAC +#include +#endif +#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO + #include #include #include @@ -308,7 +358,7 @@ using socket_t = int; #error Sorry, OpenSSL versions prior to 3.0.0 are not supported #endif -#endif +#endif // CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_ZLIB_SUPPORT #include @@ -406,6 +456,10 @@ struct hash { } }; +template +using unordered_set = std::unordered_set; + } // namespace case_ignore // This is based on @@ -529,19 +583,53 @@ using Headers = using Params = std::multimap; using Match = std::smatch; -using Progress = std::function; +using DownloadProgress = std::function; +using UploadProgress = std::function; struct Response; using ResponseHandler = std::function; +struct FormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; + Headers headers; +}; + +struct FormField { + std::string name; + std::string content; + Headers headers; +}; +using FormFields = std::multimap; + +using FormFiles = std::multimap; + struct MultipartFormData { + FormFields fields; // Text fields from multipart + FormFiles files; // Files from multipart + + // Text field access + std::string get_field(const std::string &key, size_t id = 0) const; + std::vector get_fields(const std::string &key) const; + bool has_field(const std::string &key) const; + size_t get_field_count(const std::string &key) const; + + // File access + FormData get_file(const std::string &key, size_t id = 0) const; + std::vector get_files(const std::string &key) const; + bool has_file(const std::string &key) const; + size_t get_file_count(const std::string &key) const; +}; + +struct UploadFormData { std::string name; std::string content; std::string filename; std::string content_type; }; -using MultipartFormDataItems = std::vector; -using MultipartFormDataMap = std::multimap; +using UploadFormDataItems = std::vector; class DataSink { public: @@ -584,37 +672,34 @@ using ContentProviderWithoutLength = using ContentProviderResourceReleaser = std::function; -struct MultipartFormDataProvider { +struct FormDataProvider { std::string name; ContentProviderWithoutLength provider; std::string filename; std::string content_type; }; -using MultipartFormDataProviderItems = std::vector; +using FormDataProviderItems = std::vector; -using ContentReceiverWithProgress = - std::function; +using ContentReceiverWithProgress = std::function; using ContentReceiver = std::function; -using MultipartContentHeader = - std::function; +using FormDataHeader = std::function; class ContentReader { public: using Reader = std::function; - using MultipartReader = std::function; + using FormDataReader = + std::function; - ContentReader(Reader reader, MultipartReader multipart_reader) + ContentReader(Reader reader, FormDataReader multipart_reader) : reader_(std::move(reader)), - multipart_reader_(std::move(multipart_reader)) {} + formdata_reader_(std::move(multipart_reader)) {} - bool operator()(MultipartContentHeader header, - ContentReceiver receiver) const { - return multipart_reader_(std::move(header), std::move(receiver)); + bool operator()(FormDataHeader header, ContentReceiver receiver) const { + return formdata_reader_(std::move(header), std::move(receiver)); } bool operator()(ContentReceiver receiver) const { @@ -622,7 +707,7 @@ class ContentReader { } Reader reader_; - MultipartReader multipart_reader_; + FormDataReader formdata_reader_; }; using Range = std::pair; @@ -631,8 +716,10 @@ using Ranges = std::vector; struct Request { std::string method; std::string path; + std::string matched_route; Params params; Headers headers; + Headers trailers; std::string body; std::string remote_addr; @@ -643,16 +730,18 @@ struct Request { // for server std::string version; std::string target; - MultipartFormDataMap files; + MultipartFormData form; Ranges ranges; Match matches; std::unordered_map path_params; std::function is_connection_closed = []() { return true; }; // for client + std::vector accept_content_types; ResponseHandler response_handler; ContentReceiverWithProgress content_receiver; - Progress progress; + DownloadProgress download_progress; + UploadProgress upload_progress; #ifdef CPPHTTPLIB_OPENSSL_SUPPORT const SSL *ssl = nullptr; #endif @@ -660,21 +749,21 @@ struct Request { bool has_header(const std::string &key) const; std::string get_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - uint64_t get_header_value_u64(const std::string &key, uint64_t def = 0, - size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; size_t get_header_value_count(const std::string &key) const; void set_header(const std::string &key, const std::string &val); + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + bool has_param(const std::string &key) const; std::string get_param_value(const std::string &key, size_t id = 0) const; size_t get_param_value_count(const std::string &key) const; bool is_multipart_form_data() const; - bool has_file(const std::string &key) const; - MultipartFormData get_file_value(const std::string &key) const; - std::vector get_file_values(const std::string &key) const; - // private members... size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; size_t content_length_ = 0; @@ -690,17 +779,22 @@ struct Response { int status = -1; std::string reason; Headers headers; + Headers trailers; std::string body; std::string location; // Redirect location bool has_header(const std::string &key) const; std::string get_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - uint64_t get_header_value_u64(const std::string &key, uint64_t def = 0, - size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; size_t get_header_value_count(const std::string &key) const; void set_header(const std::string &key, const std::string &val); + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + void set_redirect(const std::string &url, int status = StatusCode::Found_302); void set_content(const char *s, size_t n, const std::string &content_type); void set_content(const std::string &s, const std::string &content_type); @@ -860,6 +954,10 @@ class ThreadPool final : public TaskQueue { using Logger = std::function; +// Forward declaration for Error type +enum class Error; +using ErrorLogger = std::function; + using SocketOptions = std::function; namespace detail { @@ -882,10 +980,16 @@ namespace detail { class MatcherBase { public: + MatcherBase(std::string pattern) : pattern_(pattern) {} virtual ~MatcherBase() = default; + const std::string &pattern() const { return pattern_; } + // Match request path and populate its matches and virtual bool match(Request &request) const = 0; + +private: + std::string pattern_; }; /** @@ -937,7 +1041,8 @@ class PathParamsMatcher final : public MatcherBase { */ class RegexMatcher final : public MatcherBase { public: - RegexMatcher(const std::string &pattern) : regex_(pattern) {} + RegexMatcher(const std::string &pattern) + : MatcherBase(pattern), regex_(pattern) {} bool match(Request &request) const override; @@ -947,6 +1052,9 @@ class RegexMatcher final : public MatcherBase { ssize_t write_headers(Stream &strm, const Headers &headers); +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl); + } // namespace detail class Server { @@ -1004,11 +1112,16 @@ class Server { } Server &set_exception_handler(ExceptionHandler handler); + Server &set_pre_routing_handler(HandlerWithResponse handler); Server &set_post_routing_handler(Handler handler); + Server &set_pre_request_handler(HandlerWithResponse handler); + Server &set_expect_100_continue_handler(Expect100ContinueHandler handler); Server &set_logger(Logger logger); + Server &set_pre_compression_logger(Logger logger); + Server &set_error_logger(ErrorLogger error_logger); Server &set_address_family(int family); Server &set_tcp_nodelay(bool on); @@ -1019,6 +1132,8 @@ class Server { Server & set_header_writer(std::function const &writer); + Server &set_trusted_proxies(const std::vector &proxies); + Server &set_keep_alive_max_count(size_t count); Server &set_keep_alive_timeout(time_t sec); @@ -1057,6 +1172,9 @@ class Server { const std::function &setup_request); std::atomic svr_sock_{INVALID_SOCKET}; + + std::vector trusted_proxies_; + size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; time_t read_timeout_sec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND; @@ -1087,8 +1205,7 @@ class Server { bool listen_internal(); bool routing(Request &req, Response &res, Stream &strm); - bool handle_file_request(const Request &req, Response &res, - bool head = false); + bool handle_file_request(const Request &req, Response &res); bool dispatch_request(Request &req, Response &res, const Handlers &handlers) const; bool dispatch_request_for_content_reader( @@ -1109,18 +1226,23 @@ class Server { Response &res, const std::string &boundary, const std::string &content_type); bool read_content(Stream &strm, Request &req, Response &res); - bool - read_content_with_content_receiver(Stream &strm, Request &req, Response &res, - ContentReceiver receiver, - MultipartContentHeader multipart_header, - ContentReceiver multipart_receiver); + bool read_content_with_content_receiver(Stream &strm, Request &req, + Response &res, + ContentReceiver receiver, + FormDataHeader multipart_header, + ContentReceiver multipart_receiver); bool read_content_core(Stream &strm, Request &req, Response &res, ContentReceiver receiver, - MultipartContentHeader multipart_header, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) const; virtual bool process_and_close_socket(socket_t sock); + void output_log(const Request &req, const Response &res) const; + void output_pre_compression_log(const Request &req, + const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + std::atomic is_running_{false}; std::atomic is_decommissioned{false}; @@ -1149,9 +1271,13 @@ class Server { ExceptionHandler exception_handler_; HandlerWithResponse pre_routing_handler_; Handler post_routing_handler_; + HandlerWithResponse pre_request_handler_; Expect100ContinueHandler expect_100_continue_handler_; + mutable std::mutex logger_mutex_; Logger logger_; + Logger pre_compression_logger_; + ErrorLogger error_logger_; int address_family_ = AF_UNSPEC; bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; @@ -1180,6 +1306,22 @@ enum class Error { Compression, ConnectionTimeout, ProxyConnection, + ResourceExhaustion, + TooManyFormDataFiles, + ExceedMaxPayloadSize, + ExceedUriMaxLength, + ExceedMaxSocketDescriptorCount, + InvalidRequestLine, + InvalidHTTPMethod, + InvalidHTTPVersion, + InvalidHeaders, + MultipartParsing, + OpenFile, + Listen, + GetSockName, + UnsupportedAddressFamily, + HTTPParsing, + InvalidRangeHeader, // For internal use only SSLPeerCouldBeClosed_, @@ -1196,6 +1338,17 @@ class Result { Headers &&request_headers = Headers{}) : res_(std::move(res)), err_(err), request_headers_(std::move(request_headers)) {} +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error) {} + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error, unsigned long ssl_openssl_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error), + ssl_openssl_error_(ssl_openssl_error) {} +#endif // Response operator bool() const { return res_ != nullptr; } bool operator==(std::nullptr_t) const { return res_ == nullptr; } @@ -1210,19 +1363,30 @@ class Result { // Error Error error() const { return err_; } +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // SSL Error + int ssl_error() const { return ssl_error_; } + // OpenSSL Error + unsigned long ssl_openssl_error() const { return ssl_openssl_error_; } +#endif + // Request Headers bool has_request_header(const std::string &key) const; std::string get_request_header_value(const std::string &key, const char *def = "", size_t id = 0) const; - uint64_t get_request_header_value_u64(const std::string &key, - uint64_t def = 0, size_t id = 0) const; + size_t get_request_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; size_t get_request_header_value_count(const std::string &key) const; private: std::unique_ptr res_; Error err_ = Error::Unknown; Headers request_headers_; +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + int ssl_error_ = 0; + unsigned long ssl_openssl_error_ = 0; +#endif }; class ClientImpl { @@ -1239,185 +1403,86 @@ class ClientImpl { virtual bool is_valid() const; - Result Get(const std::string &path); - Result Get(const std::string &path, const Headers &headers); - Result Get(const std::string &path, Progress progress); - Result Get(const std::string &path, const Headers &headers, - Progress progress); - Result Get(const std::string &path, ContentReceiver content_receiver); - Result Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver); - Result Get(const std::string &path, ContentReceiver content_receiver, - Progress progress); - Result Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver, Progress progress); - Result Get(const std::string &path, ResponseHandler response_handler, - ContentReceiver content_receiver); - Result Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver); - Result Get(const std::string &path, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress); - Result Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress); - - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, Progress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, ContentReceiver content_receiver, - Progress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress = nullptr); + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Head(const std::string &path); Result Head(const std::string &path, const Headers &headers); Result Post(const std::string &path); - Result Post(const std::string &path, const Headers &headers); - Result Post(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Post(const std::string &path, const std::string &body, - const std::string &content_type); - Result Post(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Post(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Post(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type); - Result Post(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, - const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress); - Result Post(const std::string &path, const MultipartFormDataItems &items); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, const std::string &boundary); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Put(const std::string &path); - Result Put(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Put(const std::string &path, const std::string &body, - const std::string &content_type); - Result Put(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Put(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Put(const std::string &path, size_t content_length, - ContentProvider content_provider, const std::string &content_type); - Result Put(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, - const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress); - Result Put(const std::string &path, const MultipartFormDataItems &items); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, const std::string &boundary); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Patch(const std::string &path); - Result Patch(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Patch(const std::string &path, const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const std::string &body, - const std::string &content_type); - Result Patch(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Patch(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type); - Result Patch(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - - Result Delete(const std::string &path); - Result Delete(const std::string &path, const Headers &headers); - Result Delete(const std::string &path, const char *body, - size_t content_length, const std::string &content_type); - Result Delete(const std::string &path, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type); - Result Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Delete(const std::string &path, const std::string &body, - const std::string &content_type); - Result Delete(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Delete(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Delete(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); Result Options(const std::string &path); Result Options(const std::string &path, const Headers &headers); + // clang-format on bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -1469,7 +1534,7 @@ class ClientImpl { void set_keep_alive(bool on); void set_follow_location(bool on); - void set_url_encode(bool on); + void set_path_encode(bool on); void set_compress(bool on); @@ -1501,6 +1566,7 @@ class ClientImpl { #endif void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); protected: struct Socket { @@ -1533,6 +1599,9 @@ class ClientImpl { void copy_settings(const ClientImpl &rhs); + void output_log(const Request &req, const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + // Socket endpoint information const std::string host_; const int port_; @@ -1581,7 +1650,7 @@ class ClientImpl { bool keep_alive_ = false; bool follow_location_ = false; - bool url_encode_ = true; + bool path_encode_ = true; int address_family_ = AF_UNSPEC; bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; @@ -1617,7 +1686,14 @@ class ClientImpl { std::function server_certificate_verifier_; #endif + mutable std::mutex logger_mutex_; Logger logger_; + ErrorLogger error_logger_; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + int last_ssl_error_ = 0; + unsigned long last_openssl_error_ = 0; +#endif private: bool send_(Request &req, Response &res, Error &error); @@ -1629,6 +1705,11 @@ class ClientImpl { bool write_request(Stream &strm, Request &req, bool close_connection, Error &error); bool redirect(Request &req, Response &res, Error &error); + bool create_redirect_client(const std::string &scheme, + const std::string &host, int port, Request &req, + Response &res, const std::string &path, + const std::string &location, Error &error); + template void setup_redirect_client(ClientType &client); bool handle_request(Stream &strm, Request &req, Response &res, bool close_connection, Error &error); std::unique_ptr send_with_content_provider( @@ -1641,12 +1722,10 @@ class ClientImpl { const Headers &headers, const char *body, size_t content_length, ContentProvider content_provider, ContentProviderWithoutLength content_provider_without_length, - const std::string &content_type, Progress progress); + const std::string &content_type, UploadProgress progress); ContentProviderWithoutLength get_multipart_content_provider( - const std::string &boundary, const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items) const; - - std::string adjust_host_string(const std::string &host) const; + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const; virtual bool process_socket(const Socket &socket, @@ -1678,185 +1757,86 @@ class Client { bool is_valid() const; - Result Get(const std::string &path); - Result Get(const std::string &path, const Headers &headers); - Result Get(const std::string &path, Progress progress); - Result Get(const std::string &path, const Headers &headers, - Progress progress); - Result Get(const std::string &path, ContentReceiver content_receiver); - Result Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver); - Result Get(const std::string &path, ContentReceiver content_receiver, - Progress progress); - Result Get(const std::string &path, const Headers &headers, - ContentReceiver content_receiver, Progress progress); - Result Get(const std::string &path, ResponseHandler response_handler, - ContentReceiver content_receiver); - Result Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, - ContentReceiver content_receiver); - Result Get(const std::string &path, const Headers &headers, - ResponseHandler response_handler, ContentReceiver content_receiver, - Progress progress); - Result Get(const std::string &path, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress); - - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, Progress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, ContentReceiver content_receiver, - Progress progress = nullptr); - Result Get(const std::string &path, const Params ¶ms, - const Headers &headers, ResponseHandler response_handler, - ContentReceiver content_receiver, Progress progress = nullptr); + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Head(const std::string &path); Result Head(const std::string &path, const Headers &headers); Result Post(const std::string &path); - Result Post(const std::string &path, const Headers &headers); - Result Post(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Post(const std::string &path, const std::string &body, - const std::string &content_type); - Result Post(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Post(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Post(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type); - Result Post(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Post(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Post(const std::string &path, const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, - const Params ¶ms); - Result Post(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress); - Result Post(const std::string &path, const MultipartFormDataItems &items); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, const std::string &boundary); - Result Post(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Put(const std::string &path); - Result Put(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Put(const std::string &path, const std::string &body, - const std::string &content_type); - Result Put(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Put(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Put(const std::string &path, size_t content_length, - ContentProvider content_provider, const std::string &content_type); - Result Put(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Put(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); Result Put(const std::string &path, const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, - const Params ¶ms); - Result Put(const std::string &path, const Headers &headers, - const Params ¶ms, Progress progress); - Result Put(const std::string &path, const MultipartFormDataItems &items); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, const std::string &boundary); - Result Put(const std::string &path, const Headers &headers, - const MultipartFormDataItems &items, - const MultipartFormDataProviderItems &provider_items); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); Result Patch(const std::string &path); - Result Patch(const std::string &path, const char *body, size_t content_length, - const std::string &content_type); - Result Patch(const std::string &path, const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const std::string &body, - const std::string &content_type); - Result Patch(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Patch(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); - Result Patch(const std::string &path, size_t content_length, - ContentProvider content_provider, - const std::string &content_type); - Result Patch(const std::string &path, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - size_t content_length, ContentProvider content_provider, - const std::string &content_type); - Result Patch(const std::string &path, const Headers &headers, - ContentProviderWithoutLength content_provider, - const std::string &content_type); - - Result Delete(const std::string &path); - Result Delete(const std::string &path, const Headers &headers); - Result Delete(const std::string &path, const char *body, - size_t content_length, const std::string &content_type); - Result Delete(const std::string &path, const char *body, - size_t content_length, const std::string &content_type, - Progress progress); - Result Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type); - Result Delete(const std::string &path, const Headers &headers, - const char *body, size_t content_length, - const std::string &content_type, Progress progress); - Result Delete(const std::string &path, const std::string &body, - const std::string &content_type); - Result Delete(const std::string &path, const std::string &body, - const std::string &content_type, Progress progress); - Result Delete(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type); - Result Delete(const std::string &path, const Headers &headers, - const std::string &body, const std::string &content_type, - Progress progress); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); Result Options(const std::string &path); Result Options(const std::string &path, const Headers &headers); + // clang-format on bool send(Request &req, Response &res, Error &error); Result send(const Request &req); @@ -1907,6 +1887,7 @@ class Client { void set_keep_alive(bool on); void set_follow_location(bool on); + void set_path_encode(bool on); void set_url_encode(bool on); void set_compress(bool on); @@ -1932,6 +1913,7 @@ class Client { #endif void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); // SSL #ifdef CPPHTTPLIB_OPENSSL_SUPPORT @@ -1977,11 +1959,17 @@ class SSLServer : public Server { void update_certs(X509 *cert, EVP_PKEY *private_key, X509_STORE *client_ca_cert_store = nullptr); + int ssl_last_error() const { return last_ssl_error_; } + private: bool process_and_close_socket(socket_t sock) override; + STACK_OF(X509_NAME) * extract_ca_names_from_x509_store(X509_STORE *store); + SSL_CTX *ctx_; std::mutex ctx_mutex_; + + int last_ssl_error_ = 0; }; class SSLClient final : public ClientImpl { @@ -2066,12 +2054,14 @@ template inline constexpr size_t str_len(const char (&)[N]) { } inline bool is_numeric(const std::string &str) { - return !str.empty() && std::all_of(str.begin(), str.end(), ::isdigit); + return !str.empty() && + std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); } -inline uint64_t get_header_value_u64(const Headers &headers, - const std::string &key, uint64_t def, - size_t id, bool &is_invalid_value) { +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id, bool &is_invalid_value) { is_invalid_value = false; auto rng = headers.equal_range(key); auto it = rng.first; @@ -2086,22 +2076,22 @@ inline uint64_t get_header_value_u64(const Headers &headers, return def; } -inline uint64_t get_header_value_u64(const Headers &headers, - const std::string &key, uint64_t def, - size_t id) { - bool dummy = false; +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id) { + auto dummy = false; return get_header_value_u64(headers, key, def, id, dummy); } } // namespace detail -inline uint64_t Request::get_header_value_u64(const std::string &key, - uint64_t def, size_t id) const { +inline size_t Request::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { return detail::get_header_value_u64(headers, key, def, id); } -inline uint64_t Response::get_header_value_u64(const std::string &key, - uint64_t def, size_t id) const { +inline size_t Response::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { return detail::get_header_value_u64(headers, key, def, id); } @@ -2258,6 +2248,7 @@ Server::set_idle_interval(const std::chrono::duration &duration) { inline std::string to_string(const Error error) { switch (error) { case Error::Success: return "Success (no error)"; + case Error::Unknown: return "Unknown"; case Error::Connection: return "Could not establish connection"; case Error::BindIPAddress: return "Failed to bind IP address"; case Error::Read: return "Failed to read connection"; @@ -2274,7 +2265,23 @@ inline std::string to_string(const Error error) { case Error::Compression: return "Compression failed"; case Error::ConnectionTimeout: return "Connection timed out"; case Error::ProxyConnection: return "Proxy connection failed"; - case Error::Unknown: return "Unknown"; + case Error::ResourceExhaustion: return "Resource exhaustion"; + case Error::TooManyFormDataFiles: return "Too many form data files"; + case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; + case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; + case Error::ExceedMaxSocketDescriptorCount: + return "Exceeded maximum socket descriptor count"; + case Error::InvalidRequestLine: return "Invalid request line"; + case Error::InvalidHTTPMethod: return "Invalid HTTP method"; + case Error::InvalidHTTPVersion: return "Invalid HTTP version"; + case Error::InvalidHeaders: return "Invalid headers"; + case Error::MultipartParsing: return "Multipart parsing failed"; + case Error::OpenFile: return "Failed to open file"; + case Error::Listen: return "Failed to listen on socket"; + case Error::GetSockName: return "Failed to get socket name"; + case Error::UnsupportedAddressFamily: return "Unsupported address family"; + case Error::HTTPParsing: return "HTTP parsing failed"; + case Error::InvalidRangeHeader: return "Invalid Range header"; default: break; } @@ -2287,9 +2294,9 @@ inline std::ostream &operator<<(std::ostream &os, const Error &obj) { return os; } -inline uint64_t Result::get_request_header_value_u64(const std::string &key, - uint64_t def, - size_t id) const { +inline size_t Result::get_request_header_value_u64(const std::string &key, + size_t def, + size_t id) const { return detail::get_header_value_u64(request_headers_, key, def, id); } @@ -2341,6 +2348,10 @@ Client::set_write_timeout(const std::chrono::duration &duration) { cli_->set_write_timeout(duration); } +inline void Client::set_max_timeout(time_t msec) { + cli_->set_max_timeout(msec); +} + template inline void Client::set_max_timeout(const std::chrono::duration &duration) { @@ -2356,6 +2367,20 @@ std::string hosted_at(const std::string &hostname); void hosted_at(const std::string &hostname, std::vector &addrs); +// JavaScript-style URL encoding/decoding functions +std::string encode_uri_component(const std::string &value); +std::string encode_uri(const std::string &value); +std::string decode_uri_component(const std::string &value); +std::string decode_uri(const std::string &value); + +// RFC 3986 compliant URL component encoding/decoding functions +std::string encode_path_component(const std::string &component); +std::string decode_path_component(const std::string &component); +std::string encode_query_component(const std::string &component, + bool space_as_plus = true); +std::string decode_query_component(const std::string &component, + bool plus_as_space = true); + std::string append_query_params(const std::string &path, const Params ¶ms); std::pair make_range_header(const Ranges &ranges); @@ -2397,10 +2422,6 @@ struct FileStat { int ret_ = -1; }; -std::string encode_query_param(const std::string &value); - -std::string decode_url(const std::string &s, bool convert_plus_to_space); - std::string trim_copy(const std::string &s); void divide( @@ -2450,6 +2471,9 @@ bool parse_multipart_boundary(const std::string &content_type, bool parse_range_header(const std::string &s, Ranges &ranges); +bool parse_accept_header(const std::string &s, + std::vector &content_types); + int close_socket(socket_t sock); ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags); From 52cf111b312d6747fd553782bee7f9fc808bf564 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Gallou=C3=ABt?= Date: Wed, 12 Nov 2025 13:48:30 +0100 Subject: [PATCH 167/185] cmake : cleanup (#17199) --- common/CMakeLists.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index 0c34ce1151c..706fa32eed0 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -93,7 +93,6 @@ if (LLAMA_CURL) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} ${CURL_LIBRARIES}) elseif (LLAMA_HTTPLIB) # otherwise, use cpp-httplib - message(FATAL "test") target_compile_definitions(${TARGET} PUBLIC LLAMA_USE_HTTPLIB) set(LLAMA_COMMON_EXTRA_LIBS ${LLAMA_COMMON_EXTRA_LIBS} cpp-httplib) endif() From 1c398dc9eca9c366ce98deb0e6f3538e444ebc8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alberto=20Cabrera=20P=C3=A9rez?= Date: Wed, 12 Nov 2025 12:52:19 +0000 Subject: [PATCH 168/185] ggml-cpu: handle 3d tensors in repack mat_mul (#17030) * ggml-cpu: handle 3d tensors in repack mul_mat * Removed unnecessary branch, removed need for * Fixed dst_ptr pointer in chunk + clang_format * GGML_ASSERT to check wdata within bounds * Accidental ggml.h inclusion * Improved GGML_ASSERT on wdata boundaries --- ggml/src/ggml-cpu/repack.cpp | 132 ++++++++++++++++++++++++----------- 1 file changed, 90 insertions(+), 42 deletions(-) diff --git a/ggml/src/ggml-cpu/repack.cpp b/ggml/src/ggml-cpu/repack.cpp index 8421c84ce09..274be146dc5 100644 --- a/ggml/src/ggml-cpu/repack.cpp +++ b/ggml/src/ggml-cpu/repack.cpp @@ -1600,29 +1600,52 @@ template src[0]; const ggml_tensor * src1 = op->src[1]; ggml_tensor * dst = op; GGML_TENSOR_BINARY_OP_LOCALS - const void * src1_wdata = params->wdata; const size_t src1_col_stride = ggml_row_size(PARAM_TYPE, ne10); + GGML_ASSERT(ne03 == 1 && ne13 == 1); + GGML_ASSERT(ne12 % ne02 == 0); + const int64_t r2 = ne12 / ne02; + + const int64_t i12 = src1_start / ne1; + const int64_t i11 = src1_start - i12 * ne1; + + // Determine batch index + const int64_t i02 = i12 / r2; + + const int64_t i1 = i11; + const int64_t i2 = i12; + + const char * src0_ptr = (const char *) src0->data + i02 * nb02; + const char * src1_ptr = (const char *) params->wdata + (i11 + i12 * ne11) * src1_col_stride; + char * dst_ptr = ((char *) dst->data + (i1 * nb1 + i2 * nb2)); + + const int64_t nrows = src1_end - src1_start; + const int64_t ncols = src0_end - src0_start; + + GGML_ASSERT(src1_ptr + src1_col_stride * nrows <= (const char *) params->wdata + params->wsize); + // If there are more than three rows in src1, use gemm; otherwise, use gemv. - if (ne11 > 3) { - gemm(ne00, - (float *) ((char *) dst->data) + src0_start, ne01, - (const char *) src0->data + src0_start * nb01, - (const char *) src1_wdata, ne11 - ne11 % 4, src0_end - src0_start); + if (nrows > 3) { + gemm(ne00, (float *) (dst_ptr) + src0_start, nb1 / nb0, + src0_ptr + src0_start * nb01, src1_ptr, + nrows - (nrows % 4), ncols); } - for (int iter = ne11 - ne11 % 4; iter < ne11; iter++) { - gemv(ne00, - (float *) ((char *) dst->data + (iter * nb1)) + src0_start, ne01, - (const char *) src0->data + src0_start * nb01, - (const char *) src1_wdata + (src1_col_stride * iter), 1, - src0_end - src0_start); + for (int iter = nrows - (nrows % 4); iter < nrows; iter++) { + gemv(ne00, (float *) (dst_ptr + (iter * nb1)) + src0_start, + ne01, src0_ptr + src0_start * nb01, + src1_ptr + (src1_col_stride * iter), 1 /* nrows */, ncols); } } @@ -1647,6 +1670,12 @@ template type == GGML_TYPE_F32); GGML_ASSERT(ggml_n_dims(op->src[0]) == 2); @@ -1654,47 +1683,60 @@ template (params->wdata); const size_t nbw1 = ggml_row_size(PARAM_TYPE, ne10); + const size_t nbw2 = nbw1 * ne11; - assert(params->wsize >= nbw1 * ne11); + assert(params->wsize >= nbw2 * ne12); const ggml_from_float_t from_float = ggml_get_type_traits_cpu(PARAM_TYPE)->from_float; - int64_t i11_processed = 0; - for (int64_t i11 = ith * 4; i11 < ne11 - ne11 % 4; i11 += nth * 4) { - ggml_quantize_mat_t((float *) ((char *) src1->data + i11 * nb11), (void *) (wdata + i11 * nbw1), 4, ne10); - } + for (int64_t i12 = 0; i12 < ne12; i12++) { + char * data_ptr = (char *) src1->data + i12 * nb12; + char * wdata_ptr = wdata + i12 * nbw2; - i11_processed = ne11 - ne11 % 4; - for (int64_t i11 = i11_processed + ith; i11 < ne11; i11 += nth) { - from_float((float *) ((char *) src1->data + i11 * nb11), (void *) (wdata + i11 * nbw1), ne10); + for (int64_t i11 = ith * 4; i11 < ne11 - ne11 % 4; i11 += nth * 4) { + ggml_quantize_mat_t((float *) (data_ptr + i11 * nb11), + (void *) (wdata_ptr + i11 * nbw1), 4, ne10); + } + + const int64_t i11_processed = ne11 - ne11 % 4; + for (int64_t i11 = i11_processed + ith; i11 < ne11; i11 += nth) { + from_float((float *) (data_ptr + i11 * nb11), (void *) (wdata_ptr + i11 * nbw1), ne10); + } } // disable for NUMA const bool disable_chunking = ggml_is_numa(); // 4x chunks per thread - int64_t nr = ggml_nrows(op->src[0]); - int nth_scaled = nth * 4; - int64_t chunk_size = (nr + nth_scaled - 1) / nth_scaled; - int64_t nchunk = (nr + chunk_size - 1) / chunk_size; + const int64_t nr0 = ggml_nrows(op->src[0]); + const int64_t nr1 = ne1 * ne2 * ne3; + + int nth_scaled = nth * 4; + int64_t chunk_size0 = (nr0 + nth_scaled - 1) / nth_scaled; + // avoid too small chunks for narrow src1 + int64_t chunk_size1 = MAX(16, (nr1 + nth - 1) / nth); + int64_t nchunk0 = (nr0 + chunk_size0 - 1) / chunk_size0; + int64_t nchunk1 = (nr1 + chunk_size1 - 1) / chunk_size1; // Ensure minimum chunk size to avoid alignment issues with high thread counts // Minimum chunk size should be at least NB_COLS to prevent overlapping chunks after alignment const int64_t min_chunk_size = NB_COLS; - if (nchunk > 0 && (nr / nchunk) < min_chunk_size && nr >= min_chunk_size) { - nchunk = (nr + min_chunk_size - 1) / min_chunk_size; + if (nchunk0 > 0 && (nr0 / nchunk0) < min_chunk_size && nr0 >= min_chunk_size) { + nchunk0 = (nr0 + min_chunk_size - 1) / min_chunk_size; } - if (nth == 1 || nchunk < nth || disable_chunking) { - nchunk = nth; + if (nth == 1 || nchunk0 * nchunk1 < nth || disable_chunking) { + nchunk0 = nr0 > nr1 ? nth : 1; + nchunk1 = nr0 > nr1 ? 1 : nth; } + const int64_t dr0 = (nr0 + nchunk0 - 1) / nchunk0; + const int64_t dr1 = (nr1 + nchunk1 - 1) / nchunk1; + // Ensure nchunk doesn't exceed the number of rows divided by minimum chunk size // This prevents creating too many tiny chunks that could overlap after alignment - const int64_t max_nchunk = (nr + min_chunk_size - 1) / min_chunk_size; - if (nchunk > max_nchunk) { - nchunk = max_nchunk; - } + const int64_t max_nchunk = (nr0 + min_chunk_size - 1) / min_chunk_size; + nchunk0 = MIN(nchunk0, max_nchunk); if (ith == 0) { // Every thread starts at ith, so the first unprocessed chunk is nth. This save a bit of coordination right at the start. @@ -1706,23 +1748,29 @@ template ne01) { - src0_end = ne01; - } + src0_end = (src0_end % NB_COLS) ? src0_end + NB_COLS - (src0_end % NB_COLS) : src0_end; + src0_end = MIN(src0_end, ne01); + // Make sure current plane is the last one before exiting if (src0_start >= src0_end) { - break; + current_chunk = ggml_threadpool_chunk_add(params->threadpool, 1); + continue; } - forward_mul_mat_one_chunk(params, dst, src0_start, src0_end); + forward_mul_mat_one_chunk(params, dst, src0_start, src0_end, src1_start, src1_end); current_chunk = ggml_threadpool_chunk_add(params->threadpool, 1); } From ee8dd5c6583b25bd7542ef7956ca96e1e81f67a9 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Wed, 12 Nov 2025 14:17:24 +0100 Subject: [PATCH 169/185] server: move res_error/res_ok to static function (#17167) --- tools/server/server.cpp | 61 ++++++++++++++++++++--------------------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/tools/server/server.cpp b/tools/server/server.cpp index 6bd4be3cc17..0cf2f767b33 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -4432,6 +4432,17 @@ static void log_server_request(const httplib::Request & req, const httplib::Resp SRV_DBG("response: %s\n", res.body.c_str()); } +static void res_error(httplib::Response & res, const json & error_data) { + json final_response {{"error", error_data}}; + res.set_content(safe_json_to_str(final_response), MIMETYPE_JSON); + res.status = json_value(error_data, "code", 500); +} + +static void res_ok(httplib::Response & res, const json & data) { + res.set_content(safe_json_to_str(data), MIMETYPE_JSON); + res.status = 200; +} + std::function shutdown_handler; std::atomic_flag is_terminating = ATOMIC_FLAG_INIT; @@ -4501,19 +4512,7 @@ int main(int argc, char ** argv) { svr->set_default_headers({{"Server", "llama.cpp"}}); svr->set_logger(log_server_request); - - auto res_error = [](httplib::Response & res, const json & error_data) { - json final_response {{"error", error_data}}; - res.set_content(safe_json_to_str(final_response), MIMETYPE_JSON); - res.status = json_value(error_data, "code", 500); - }; - - auto res_ok = [](httplib::Response & res, const json & data) { - res.set_content(safe_json_to_str(data), MIMETYPE_JSON); - res.status = 200; - }; - - svr->set_exception_handler([&res_error](const httplib::Request &, httplib::Response & res, const std::exception_ptr & ep) { + svr->set_exception_handler([](const httplib::Request &, httplib::Response & res, const std::exception_ptr & ep) { std::string message; try { std::rethrow_exception(ep); @@ -4532,7 +4531,7 @@ int main(int argc, char ** argv) { } }); - svr->set_error_handler([&res_error](const httplib::Request &, httplib::Response & res) { + svr->set_error_handler([](const httplib::Request &, httplib::Response & res) { if (res.status == 404) { res_error(res, format_error_response("File Not Found", ERROR_TYPE_NOT_FOUND)); } @@ -4562,7 +4561,7 @@ int main(int argc, char ** argv) { // Middlewares // - auto middleware_validate_api_key = [¶ms, &res_error](const httplib::Request & req, httplib::Response & res) { + auto middleware_validate_api_key = [¶ms](const httplib::Request & req, httplib::Response & res) { static const std::unordered_set public_endpoints = { "/health", "/v1/health", @@ -4600,7 +4599,7 @@ int main(int argc, char ** argv) { return false; }; - auto middleware_server_state = [&res_error, &state](const httplib::Request & req, httplib::Response & res) { + auto middleware_server_state = [&state](const httplib::Request & req, httplib::Response & res) { server_state current_state = state.load(); if (current_state == SERVER_STATE_LOADING_MODEL) { auto tmp = string_split(req.path, '.'); @@ -4788,7 +4787,7 @@ int main(int argc, char ** argv) { res.status = 200; // HTTP OK }; - const auto handle_slots_save = [&ctx_server, &res_error, &res_ok, ¶ms](const httplib::Request & req, httplib::Response & res, int id_slot) { + const auto handle_slots_save = [&ctx_server, ¶ms](const httplib::Request & req, httplib::Response & res, int id_slot) { json request_data = json::parse(req.body); std::string filename = request_data.at("filename"); if (!fs_validate_filename(filename)) { @@ -4820,7 +4819,7 @@ int main(int argc, char ** argv) { res_ok(res, result->to_json()); }; - const auto handle_slots_restore = [&ctx_server, &res_error, &res_ok, ¶ms](const httplib::Request & req, httplib::Response & res, int id_slot) { + const auto handle_slots_restore = [&ctx_server, ¶ms](const httplib::Request & req, httplib::Response & res, int id_slot) { json request_data = json::parse(req.body); std::string filename = request_data.at("filename"); if (!fs_validate_filename(filename)) { @@ -4853,7 +4852,7 @@ int main(int argc, char ** argv) { res_ok(res, result->to_json()); }; - const auto handle_slots_erase = [&ctx_server, &res_error, &res_ok](const httplib::Request & /* req */, httplib::Response & res, int id_slot) { + const auto handle_slots_erase = [&ctx_server](const httplib::Request & /* req */, httplib::Response & res, int id_slot) { int task_id = ctx_server.queue_tasks.get_new_id(); { server_task task(SERVER_TASK_TYPE_SLOT_ERASE); @@ -4876,7 +4875,7 @@ int main(int argc, char ** argv) { res_ok(res, result->to_json()); }; - const auto handle_slots_action = [¶ms, &res_error, &handle_slots_save, &handle_slots_restore, &handle_slots_erase](const httplib::Request & req, httplib::Response & res) { + const auto handle_slots_action = [¶ms, &handle_slots_save, &handle_slots_restore, &handle_slots_erase](const httplib::Request & req, httplib::Response & res) { if (params.slot_save_path.empty()) { res_error(res, format_error_response("This server does not support slots action. Start it with `--slot-save-path`", ERROR_TYPE_NOT_SUPPORTED)); return; @@ -4905,7 +4904,7 @@ int main(int argc, char ** argv) { } }; - const auto handle_props = [¶ms, &ctx_server, &res_ok](const httplib::Request &, httplib::Response & res) { + const auto handle_props = [¶ms, &ctx_server](const httplib::Request &, httplib::Response & res) { json default_generation_settings_for_props; { @@ -4947,7 +4946,7 @@ int main(int argc, char ** argv) { res_ok(res, data); }; - const auto handle_props_change = [&ctx_server, &res_error, &res_ok](const httplib::Request & req, httplib::Response & res) { + const auto handle_props_change = [&ctx_server](const httplib::Request & req, httplib::Response & res) { if (!ctx_server.params_base.endpoint_props) { res_error(res, format_error_response("This server does not support changing global properties. Start it with `--props`", ERROR_TYPE_NOT_SUPPORTED)); return; @@ -4960,7 +4959,7 @@ int main(int argc, char ** argv) { res_ok(res, {{ "success", true }}); }; - const auto handle_api_show = [&ctx_server, &res_ok](const httplib::Request &, httplib::Response & res) { + const auto handle_api_show = [&ctx_server](const httplib::Request &, httplib::Response & res) { bool has_mtmd = ctx_server.mctx != nullptr; json data = { { @@ -4991,7 +4990,7 @@ int main(int argc, char ** argv) { // handle completion-like requests (completion, chat, infill) // we can optionally provide a custom format for partial results and final results - const auto handle_completions_impl = [&ctx_server, &res_error, &res_ok]( + const auto handle_completions_impl = [&ctx_server]( server_task_type type, json & data, const std::vector & files, @@ -5139,7 +5138,7 @@ int main(int argc, char ** argv) { OAICOMPAT_TYPE_COMPLETION); }; - const auto handle_infill = [&ctx_server, &res_error, &handle_completions_impl](const httplib::Request & req, httplib::Response & res) { + const auto handle_infill = [&ctx_server, &handle_completions_impl](const httplib::Request & req, httplib::Response & res) { // check model compatibility std::string err; if (llama_vocab_fim_pre(ctx_server.vocab) == LLAMA_TOKEN_NULL) { @@ -5238,7 +5237,7 @@ int main(int argc, char ** argv) { }; // same with handle_chat_completions, but without inference part - const auto handle_apply_template = [&ctx_server, &res_ok](const httplib::Request & req, httplib::Response & res) { + const auto handle_apply_template = [&ctx_server](const httplib::Request & req, httplib::Response & res) { auto body = json::parse(req.body); std::vector files; // dummy, unused json data = oaicompat_chat_params_parse( @@ -5248,7 +5247,7 @@ int main(int argc, char ** argv) { res_ok(res, {{ "prompt", std::move(data.at("prompt")) }}); }; - const auto handle_models = [¶ms, &ctx_server, &state, &res_ok](const httplib::Request &, httplib::Response & res) { + const auto handle_models = [¶ms, &ctx_server, &state](const httplib::Request &, httplib::Response & res) { server_state current_state = state.load(); json model_meta = nullptr; if (current_state == SERVER_STATE_READY) { @@ -5293,7 +5292,7 @@ int main(int argc, char ** argv) { res_ok(res, models); }; - const auto handle_tokenize = [&ctx_server, &res_ok](const httplib::Request & req, httplib::Response & res) { + const auto handle_tokenize = [&ctx_server](const httplib::Request & req, httplib::Response & res) { const json body = json::parse(req.body); json tokens_response = json::array(); @@ -5334,7 +5333,7 @@ int main(int argc, char ** argv) { res_ok(res, data); }; - const auto handle_detokenize = [&ctx_server, &res_ok](const httplib::Request & req, httplib::Response & res) { + const auto handle_detokenize = [&ctx_server](const httplib::Request & req, httplib::Response & res) { const json body = json::parse(req.body); std::string content; @@ -5347,7 +5346,7 @@ int main(int argc, char ** argv) { res_ok(res, data); }; - const auto handle_embeddings_impl = [&ctx_server, &res_error, &res_ok](const httplib::Request & req, httplib::Response & res, oaicompat_type oaicompat) { + const auto handle_embeddings_impl = [&ctx_server](const httplib::Request & req, httplib::Response & res, oaicompat_type oaicompat) { if (!ctx_server.params_base.embedding) { res_error(res, format_error_response("This server does not support embeddings. Start it with `--embeddings`", ERROR_TYPE_NOT_SUPPORTED)); return; @@ -5457,7 +5456,7 @@ int main(int argc, char ** argv) { handle_embeddings_impl(req, res, OAICOMPAT_TYPE_EMBEDDING); }; - const auto handle_rerank = [&ctx_server, &res_error, &res_ok](const httplib::Request & req, httplib::Response & res) { + const auto handle_rerank = [&ctx_server](const httplib::Request & req, httplib::Response & res) { if (!ctx_server.params_base.embedding || ctx_server.params_base.pooling_type != LLAMA_POOLING_TYPE_RANK) { res_error(res, format_error_response("This server does not support reranking. Start it with `--reranking`", ERROR_TYPE_NOT_SUPPORTED)); return; From 017eceed61e885b79f6cf3542e0879be68c6e922 Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Wed, 12 Nov 2025 14:56:02 +0100 Subject: [PATCH 170/185] ci: add check vendor job (#17179) * ci: add check vendor job * use dev version of miniaudio * move to dedicated workflow, only run on related files changed --- .github/workflows/check-vendor.yml | 52 ++++++++++++++++++++++++++++++ scripts/sync_vendor.py | 4 ++- 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/check-vendor.yml diff --git a/.github/workflows/check-vendor.yml b/.github/workflows/check-vendor.yml new file mode 100644 index 00000000000..7b3016079cc --- /dev/null +++ b/.github/workflows/check-vendor.yml @@ -0,0 +1,52 @@ +name: Check vendor + +on: + workflow_dispatch: # allows manual triggering + push: + branches: + - master + paths: [ + 'vendor/**', + 'scripts/sync_vendor.py' + ] + + pull_request: + types: [opened, synchronize, reopened] + paths: [ + 'vendor/**', + 'scripts/sync_vendor.py' + ] + +jobs: + check-vendor: + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Setup Python + uses: actions/setup-python@v4 + with: + python-version: '3.x' + + - name: Run vendor sync + run: | + set -euo pipefail + python3 scripts/sync_vendor.py + + - name: Check for changes + run: | + set -euo pipefail + # detect modified or untracked files + changed=$(git status --porcelain --untracked-files=all || true) + if [ -n "$changed" ]; then + echo "Vendor sync modified files:" + echo "$changed" | awk '{ print $2 }' | sed '/^$/d' + echo "Failing because vendor files mismatch. Please update scripts/sync_vendor.py" + exit 1 + else + echo "Vendor files are up-to-date." + fi diff --git a/scripts/sync_vendor.py b/scripts/sync_vendor.py index ac94387dd2f..4a89d08f805 100755 --- a/scripts/sync_vendor.py +++ b/scripts/sync_vendor.py @@ -12,7 +12,9 @@ "https://raw.githubusercontent.com/nothings/stb/refs/heads/master/stb_image.h": "vendor/stb/stb_image.h", - "https://github.com/mackron/miniaudio/raw/refs/tags/0.11.22/miniaudio.h": "vendor/miniaudio/miniaudio.h", + # not using latest tag to avoid this issue: https://github.com/ggml-org/llama.cpp/pull/17179#discussion_r2515877926 + # "https://github.com/mackron/miniaudio/raw/refs/tags/0.11.23/miniaudio.h": "vendor/miniaudio/miniaudio.h", + "https://github.com/mackron/miniaudio/raw/669ed3e844524fcd883231b13095baee9f6de304/miniaudio.h": "vendor/miniaudio/miniaudio.h", "https://raw.githubusercontent.com/yhirose/cpp-httplib/refs/tags/v0.27.0/httplib.h": "vendor/cpp-httplib/httplib.h", } From 00c94083b3ffd51bb81cd5cb5cf1177168ce286c Mon Sep 17 00:00:00 2001 From: Xuan-Son Nguyen Date: Wed, 12 Nov 2025 18:50:52 +0100 Subject: [PATCH 171/185] server: (refactor) implement generator-based API for task results (#17174) * server: (refactor) implement generator-based API for task results * improve * moving some code * fix "Response ended prematurely" * add sink.done before return false * rm redundant check * rm unused var * rename generator --> reader --- tools/server/server.cpp | 399 +++++++++++++++++++++------------------- tools/server/utils.hpp | 26 ++- 2 files changed, 232 insertions(+), 193 deletions(-) diff --git a/tools/server/server.cpp b/tools/server/server.cpp index 0cf2f767b33..0b3c77879c2 100644 --- a/tools/server/server.cpp +++ b/tools/server/server.cpp @@ -684,7 +684,7 @@ struct server_task_result { } virtual bool is_stop() { // only used by server_task_result_cmpl_* - return false; + return true; } virtual int get_index() { return -1; @@ -3238,105 +3238,6 @@ struct server_context { queue_results.send(std::move(res)); } - // - // Functions to create new task(s) and receive result(s) - // - - void cancel_tasks(const std::unordered_set & id_tasks) { - std::vector cancel_tasks; - cancel_tasks.reserve(id_tasks.size()); - for (const auto & id_task : id_tasks) { - SRV_WRN("cancel task, id_task = %d\n", id_task); - - server_task task(SERVER_TASK_TYPE_CANCEL); - task.id_target = id_task; - queue_results.remove_waiting_task_id(id_task); - cancel_tasks.push_back(std::move(task)); - } - // push to beginning of the queue, so it has highest priority - queue_tasks.post(std::move(cancel_tasks), true); - } - - // receive the results from task(s) - void receive_multi_results( - const std::unordered_set & id_tasks, - const std::function&)> & result_handler, - const std::function & error_handler, - const std::function & is_connection_closed) { - std::vector results(id_tasks.size()); - for (int i = 0; i < (int)id_tasks.size(); i++) { - server_task_result_ptr result = queue_results.recv_with_timeout(id_tasks, HTTP_POLLING_SECONDS); - - if (is_connection_closed()) { - cancel_tasks(id_tasks); - return; - } - - if (result == nullptr) { - i--; // retry - continue; - } - - if (result->is_error()) { - error_handler(result->to_json()); - cancel_tasks(id_tasks); - return; - } - - GGML_ASSERT( - dynamic_cast(result.get()) != nullptr - || dynamic_cast(result.get()) != nullptr - || dynamic_cast(result.get()) != nullptr - ); - const size_t idx = result->get_index(); - GGML_ASSERT(idx < results.size() && "index out of range"); - results[idx] = std::move(result); - } - result_handler(results); - } - - // receive the results from task(s), in stream mode - void receive_cmpl_results_stream( - const std::unordered_set & id_tasks, - const std::function & result_handler, - const std::function & error_handler, - const std::function & is_connection_closed) { - size_t n_finished = 0; - while (true) { - server_task_result_ptr result = queue_results.recv_with_timeout(id_tasks, HTTP_POLLING_SECONDS); - - if (is_connection_closed()) { - cancel_tasks(id_tasks); - return; - } - - if (result == nullptr) { - continue; // retry - } - - if (result->is_error()) { - error_handler(result->to_json()); - cancel_tasks(id_tasks); - return; - } - - GGML_ASSERT( - dynamic_cast(result.get()) != nullptr - || dynamic_cast(result.get()) != nullptr - ); - if (!result_handler(result)) { - cancel_tasks(id_tasks); - break; - } - - if (result->is_stop()) { - if (++n_finished == id_tasks.size()) { - break; - } - } - } - } - // // Functions to process the task // @@ -4418,6 +4319,104 @@ struct server_context { } }; +// generator-like API for server responses, support pooling connection state and aggregating results +struct server_response_reader { + std::unordered_set id_tasks; + server_context & ctx_server; + size_t received_count = 0; + bool cancelled = false; + + server_response_reader(server_context & ctx_server) : ctx_server(ctx_server) {} + ~server_response_reader() { + stop(); + } + + void post_tasks(std::vector && tasks) { + id_tasks = server_task::get_list_id(tasks); + ctx_server.queue_results.add_waiting_tasks(tasks); + ctx_server.queue_tasks.post(std::move(tasks)); + } + + bool has_next() { + return !cancelled && received_count < id_tasks.size(); + } + + // return nullptr if should_stop() is true before receiving a result + // note: if one error is received, it will stop further processing and return error result + server_task_result_ptr next(const std::function & should_stop) { + while (true) { + server_task_result_ptr result = ctx_server.queue_results.recv_with_timeout(id_tasks, HTTP_POLLING_SECONDS); + if (result == nullptr) { + // timeout, check stop condition + if (should_stop()) { + SRV_DBG("%s", "stopping wait for next result due to should_stop condition\n"); + return nullptr; + } + } else { + if (result->is_error()) { + stop(); // cancel remaining tasks + SRV_DBG("%s", "received error result, stopping further processing\n"); + return result; + } + if (result->is_stop()) { + received_count++; + } + return result; + } + } + + // should not reach here + } + + struct batch_response { + bool is_terminated = false; // if true, indicates that processing was stopped before all results were received + std::vector results; + server_task_result_ptr error; // nullptr if no error + }; + + batch_response wait_for_all(const std::function & should_stop) { + batch_response batch_res; + batch_res.results.resize(id_tasks.size()); + while (has_next()) { + auto res = next(should_stop); + if (res == nullptr) { + batch_res.is_terminated = true; + return batch_res; + } + if (res->is_error()) { + batch_res.error = std::move(res); + return batch_res; + } + const size_t idx = res->get_index(); + GGML_ASSERT(idx < batch_res.results.size() && "index out of range"); + GGML_ASSERT(batch_res.results[idx] == nullptr && "duplicate result received"); + batch_res.results[idx] = std::move(res); + } + return batch_res; + } + + void stop() { + ctx_server.queue_results.remove_waiting_task_ids(id_tasks); + if (has_next() && !cancelled) { + // if tasks is not finished yet, cancel them + cancelled = true; + std::vector cancel_tasks; + cancel_tasks.reserve(id_tasks.size()); + for (const auto & id_task : id_tasks) { + SRV_WRN("cancel task, id_task = %d\n", id_task); + server_task task(SERVER_TASK_TYPE_CANCEL); + task.id_target = id_task; + ctx_server.queue_results.remove_waiting_task_id(id_task); + cancel_tasks.push_back(std::move(task)); + } + // push to beginning of the queue, so it has highest priority + ctx_server.queue_tasks.post(std::move(cancel_tasks), true); + } else { + SRV_DBG("%s", "all tasks already finished, no need to cancel\n"); + } + } +}; + static void log_server_request(const httplib::Request & req, const httplib::Response & res) { // skip GH copilot requests when using default port if (req.path == "/v1/health") { @@ -5000,7 +4999,10 @@ int main(int argc, char ** argv) { GGML_ASSERT(type == SERVER_TASK_TYPE_COMPLETION || type == SERVER_TASK_TYPE_INFILL); auto completion_id = gen_chatcmplid(); - std::unordered_set task_ids; + // need to store the reader as a pointer, so that it won't be destroyed when the handle returns + // use shared_ptr as it's shared between the chunked_content_provider() and on_complete() + const auto rd = std::make_shared(ctx_server); + try { std::vector tasks; @@ -5018,17 +5020,8 @@ int main(int argc, char ** argv) { // Everything else, including multimodal completions. inputs = tokenize_input_prompts(ctx_server.vocab, ctx_server.mctx, prompt, true, true); } - const size_t n_ctx_slot = ctx_server.slots.front().n_ctx; tasks.reserve(inputs.size()); for (size_t i = 0; i < inputs.size(); i++) { - auto n_prompt_tokens = inputs[i].size(); - if (n_prompt_tokens >= n_ctx_slot) { - json error_data = format_error_response("the request exceeds the available context size, try increasing it", ERROR_TYPE_EXCEED_CONTEXT_SIZE); - error_data["n_prompt_tokens"] = n_prompt_tokens; - error_data["n_ctx"] = n_ctx_slot; - res_error(res, error_data); - return; - } server_task task = server_task(type); task.id = ctx_server.queue_tasks.get_new_id(); @@ -5049,9 +5042,7 @@ int main(int argc, char ** argv) { tasks.push_back(std::move(task)); } - task_ids = server_task::get_list_id(tasks); - ctx_server.queue_results.add_waiting_tasks(tasks); - ctx_server.queue_tasks.post(std::move(tasks)); + rd->post_tasks(std::move(tasks)); } catch (const std::exception & e) { res_error(res, format_error_response(e.what(), ERROR_TYPE_INVALID_REQUEST)); return; @@ -5060,54 +5051,95 @@ int main(int argc, char ** argv) { bool stream = json_value(data, "stream", false); if (!stream) { - ctx_server.receive_multi_results(task_ids, [&](std::vector & results) { - if (results.size() == 1) { - // single result - res_ok(res, results[0]->to_json()); - } else { - // multiple results (multitask) - json arr = json::array(); - for (auto & res : results) { - arr.push_back(res->to_json()); - } - res_ok(res, arr); + // non-stream, wait for the results + auto all_results = rd->wait_for_all(is_connection_closed); + if (all_results.is_terminated) { + return; // connection is closed + } else if (all_results.error) { + res_error(res, all_results.error->to_json()); + return; + } else { + json arr = json::array(); + for (auto & res : all_results.results) { + GGML_ASSERT(dynamic_cast(res.get()) != nullptr); + arr.push_back(res->to_json()); } - }, [&](const json & error_data) { - res_error(res, error_data); - }, is_connection_closed); + // if single request, return single object instead of array + res_ok(res, arr.size() == 1 ? arr[0] : arr); + } - ctx_server.queue_results.remove_waiting_task_ids(task_ids); } else { - const auto chunked_content_provider = [task_ids, &ctx_server, oaicompat](size_t, httplib::DataSink & sink) { - ctx_server.receive_cmpl_results_stream(task_ids, [&](server_task_result_ptr & result) -> bool { - json res_json = result->to_json(); - if (res_json.is_array()) { - for (const auto & res : res_json) { - if (!server_sent_event(sink, res)) { - // sending failed (HTTP connection closed), cancel the generation - return false; - } - } - return true; - } else { - return server_sent_event(sink, res_json); + // in streaming mode, the first error must be treated as non-stream response + // this is to match the OAI API behavior + // ref: https://github.com/ggml-org/llama.cpp/pull/16486#discussion_r2419657309 + server_task_result_ptr first_result = rd->next(is_connection_closed); + if (first_result == nullptr) { + return; // connection is closed + } else if (first_result->is_error()) { + res_error(res, first_result->to_json()); + return; + } else { + GGML_ASSERT( + dynamic_cast(first_result.get()) != nullptr + || dynamic_cast(first_result.get()) != nullptr + ); + } + + // next responses are streamed + json first_result_json = first_result->to_json(); + const auto chunked_content_provider = [first_result_json, rd, oaicompat](size_t, httplib::DataSink & sink) mutable -> bool { + // flush the first result as it's not an error + if (!first_result_json.empty()) { + if (!server_sent_event(sink, first_result_json)) { + sink.done(); + return false; // sending failed, go to on_complete() } - }, [&](const json & error_data) { - server_sent_event(sink, json{{"error", error_data}}); - }, [&sink]() { - // note: do not use req.is_connection_closed here because req is already destroyed - return !sink.is_writable(); - }); - if (oaicompat != OAICOMPAT_TYPE_NONE) { - static const std::string ev_done = "data: [DONE]\n\n"; - sink.write(ev_done.data(), ev_done.size()); + first_result_json.clear(); // mark as sent } - sink.done(); - return false; + + // receive subsequent results + auto result = rd->next([&sink]{ return !sink.is_writable(); }); + if (result == nullptr) { + sink.done(); + return false; // connection is closed, go to on_complete() + } + + // send the results + json res_json = result->to_json(); + bool ok = false; + if (result->is_error()) { + ok = server_sent_event(sink, json {{ "error", result->to_json() }}); + sink.done(); + return false; // go to on_complete() + } else { + GGML_ASSERT( + dynamic_cast(result.get()) != nullptr + || dynamic_cast(result.get()) != nullptr + ); + ok = server_sent_event(sink, res_json); + } + + if (!ok) { + sink.done(); + return false; // sending failed, go to on_complete() + } + + // check if there is more data + if (!rd->has_next()) { + if (oaicompat != OAICOMPAT_TYPE_NONE) { + static const std::string ev_done = "data: [DONE]\n\n"; + sink.write(ev_done.data(), ev_done.size()); + } + sink.done(); + return false; // no more data, go to on_complete() + } + + // has next data, continue + return true; }; - auto on_complete = [task_ids, &ctx_server] (bool) { - ctx_server.queue_results.remove_waiting_task_ids(task_ids); + auto on_complete = [rd](bool) { + rd->stop(); }; res.set_chunked_content_provider("text/event-stream", chunked_content_provider, on_complete); @@ -5401,8 +5433,7 @@ int main(int argc, char ** argv) { // create and queue the task json responses = json::array(); - bool error = false; - std::unordered_set task_ids; + server_response_reader rd(ctx_server); { std::vector tasks; for (size_t i = 0; i < tokenized_prompts.size(); i++) { @@ -5418,27 +5449,23 @@ int main(int argc, char ** argv) { tasks.push_back(std::move(task)); } - - task_ids = server_task::get_list_id(tasks); - ctx_server.queue_results.add_waiting_tasks(tasks); - ctx_server.queue_tasks.post(std::move(tasks)); + rd.post_tasks(std::move(tasks)); } - // get the result - ctx_server.receive_multi_results(task_ids, [&](std::vector & results) { - for (auto & res : results) { + // wait for the results + auto all_results = rd.wait_for_all(req.is_connection_closed); + + // collect results + if (all_results.is_terminated) { + return; // connection is closed + } else if (all_results.error) { + res_error(res, all_results.error->to_json()); + return; + } else { + for (auto & res : all_results.results) { GGML_ASSERT(dynamic_cast(res.get()) != nullptr); responses.push_back(res->to_json()); } - }, [&](const json & error_data) { - res_error(res, error_data); - error = true; - }, req.is_connection_closed); - - ctx_server.queue_results.remove_waiting_task_ids(task_ids); - - if (error) { - return; } // write JSON response @@ -5492,8 +5519,7 @@ int main(int argc, char ** argv) { // create and queue the task json responses = json::array(); - bool error = false; - std::unordered_set task_ids; + server_response_reader rd(ctx_server); { std::vector tasks; tasks.reserve(documents.size()); @@ -5505,24 +5531,23 @@ int main(int argc, char ** argv) { task.tokens = std::move(tmp); tasks.push_back(std::move(task)); } - - task_ids = server_task::get_list_id(tasks); - ctx_server.queue_results.add_waiting_tasks(tasks); - ctx_server.queue_tasks.post(std::move(tasks)); + rd.post_tasks(std::move(tasks)); } - ctx_server.receive_multi_results(task_ids, [&](std::vector & results) { - for (auto & res : results) { + // wait for the results + auto all_results = rd.wait_for_all(req.is_connection_closed); + + // collect results + if (all_results.is_terminated) { + return; // connection is closed + } else if (all_results.error) { + res_error(res, all_results.error->to_json()); + return; + } else { + for (auto & res : all_results.results) { GGML_ASSERT(dynamic_cast(res.get()) != nullptr); responses.push_back(res->to_json()); } - }, [&](const json & error_data) { - res_error(res, error_data); - error = true; - }, req.is_connection_closed); - - if (error) { - return; } // write JSON response diff --git a/tools/server/utils.hpp b/tools/server/utils.hpp index e9d4431ddfb..b1ecc5af5ed 100644 --- a/tools/server/utils.hpp +++ b/tools/server/utils.hpp @@ -453,15 +453,29 @@ static std::string tokens_to_output_formatted_string(const llama_context * ctx, return out; } +// note: if data is a json array, it will be sent as multiple events, one per item static bool server_sent_event(httplib::DataSink & sink, const json & data) { - const std::string str = - "data: " + - data.dump(-1, ' ', false, json::error_handler_t::replace) + - "\n\n"; // required by RFC 8895 - A message is terminated by a blank line (two line terminators in a row). + static auto send_single = [](httplib::DataSink & sink, const json & data) -> bool { + const std::string str = + "data: " + + data.dump(-1, ' ', false, json::error_handler_t::replace) + + "\n\n"; // required by RFC 8895 - A message is terminated by a blank line (two line terminators in a row). + + LOG_DBG("data stream, to_send: %s", str.c_str()); + return sink.write(str.c_str(), str.size()); + }; - LOG_DBG("data stream, to_send: %s", str.c_str()); + if (data.is_array()) { + for (const auto & item : data) { + if (!send_single(sink, item)) { + return false; + } + } + } else { + return send_single(sink, data); + } - return sink.write(str.c_str(), str.size()); + return true; } // From 8e878f0cb4c893de23455dd0a6bfbbb21bcaad89 Mon Sep 17 00:00:00 2001 From: Aleksander Grygier Date: Wed, 12 Nov 2025 19:01:48 +0100 Subject: [PATCH 172/185] Update packages + upgrade Storybook to v10 (#17201) * chore: Update packages + upgrade Storybook to v10 * fix: Increase timeout for UI tests --- .github/workflows/server.yml | 2 +- tools/server/webui/.storybook/preview.ts | 8 + tools/server/webui/.storybook/vitest.setup.ts | 3 +- tools/server/webui/package-lock.json | 491 +++++++----------- tools/server/webui/package.json | 26 +- .../webui/src/stories/ChatForm.stories.svelte | 2 +- .../src/stories/ChatSidebar.stories.svelte | 2 +- .../stories/MarkdownContent.stories.svelte | 51 +- 8 files changed, 234 insertions(+), 351 deletions(-) diff --git a/.github/workflows/server.yml b/.github/workflows/server.yml index 1ea1300c2e4..ebcd6424bc0 100644 --- a/.github/workflows/server.yml +++ b/.github/workflows/server.yml @@ -209,7 +209,7 @@ jobs: working-directory: tools/server/webui - name: Run UI tests - run: npm run test:ui + run: npm run test:ui -- --testTimeout=60000 working-directory: tools/server/webui - name: Run E2E tests diff --git a/tools/server/webui/.storybook/preview.ts b/tools/server/webui/.storybook/preview.ts index fb91386af46..8d530e43e37 100644 --- a/tools/server/webui/.storybook/preview.ts +++ b/tools/server/webui/.storybook/preview.ts @@ -11,8 +11,16 @@ const preview: Preview = { date: /Date$/i } }, + backgrounds: { disable: true + }, + + a11y: { + // 'todo' - show a11y violations in the test UI only + // 'error' - fail CI on a11y violations + // 'off' - skip a11y checks entirely + test: 'todo' } }, decorators: [ diff --git a/tools/server/webui/.storybook/vitest.setup.ts b/tools/server/webui/.storybook/vitest.setup.ts index e0c1753c849..14715728989 100644 --- a/tools/server/webui/.storybook/vitest.setup.ts +++ b/tools/server/webui/.storybook/vitest.setup.ts @@ -1,8 +1,9 @@ +import * as a11yAddonAnnotations from '@storybook/addon-a11y/preview'; import { setProjectAnnotations } from '@storybook/sveltekit'; import * as previewAnnotations from './preview'; import { beforeAll } from 'vitest'; -const project = setProjectAnnotations([previewAnnotations]); +const project = setProjectAnnotations([a11yAddonAnnotations, previewAnnotations]); beforeAll(async () => { if (project.beforeAll) { diff --git a/tools/server/webui/package-lock.json b/tools/server/webui/package-lock.json index 8fab38f6f14..a11b87ad509 100644 --- a/tools/server/webui/package-lock.json +++ b/tools/server/webui/package-lock.json @@ -22,20 +22,20 @@ "unist-util-visit": "^5.0.0" }, "devDependencies": { - "@chromatic-com/storybook": "^4.0.1", + "@chromatic-com/storybook": "^4.1.2", "@eslint/compat": "^1.2.5", "@eslint/js": "^9.18.0", "@internationalized/date": "^3.8.2", "@lucide/svelte": "^0.515.0", "@playwright/test": "^1.49.1", - "@storybook/addon-a11y": "^9.0.17", - "@storybook/addon-docs": "^9.0.17", - "@storybook/addon-svelte-csf": "^5.0.7", - "@storybook/addon-vitest": "^9.0.17", - "@storybook/sveltekit": "^9.0.17", - "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", + "@storybook/addon-a11y": "^10.0.7", + "@storybook/addon-docs": "^10.0.7", + "@storybook/addon-svelte-csf": "^5.0.10", + "@storybook/addon-vitest": "^10.0.7", + "@storybook/sveltekit": "^10.0.7", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.48.4", + "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tailwindcss/forms": "^0.5.9", "@tailwindcss/typography": "^0.5.15", "@tailwindcss/vite": "^4.0.0", @@ -46,21 +46,21 @@ "dexie": "^4.0.11", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", - "eslint-plugin-storybook": "^9.0.17", + "eslint-plugin-storybook": "^10.0.7", "eslint-plugin-svelte": "^3.0.0", "fflate": "^0.8.2", "globals": "^16.0.0", "http-server": "^14.1.1", "mdast": "^3.0.0", "mdsvex": "^0.12.3", - "playwright": "^1.53.0", + "playwright": "^1.56.1", "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.11", "rehype-katex": "^7.0.1", "remark-math": "^6.0.0", "sass": "^1.93.3", - "storybook": "^9.0.17", + "storybook": "^10.0.7", "svelte": "^5.0.0", "svelte-check": "^4.0.0", "tailwind-merge": "^3.3.1", @@ -71,7 +71,7 @@ "typescript-eslint": "^8.20.0", "unified": "^11.0.5", "uuid": "^13.0.0", - "vite": "^7.0.4", + "vite": "^7.2.2", "vite-plugin-devtools-json": "^0.2.0", "vitest": "^3.2.3", "vitest-browser-svelte": "^0.1.0" @@ -133,9 +133,9 @@ } }, "node_modules/@chromatic-com/storybook": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.0.1.tgz", - "integrity": "sha512-GQXe5lyZl3yLewLJQyFXEpOp2h+mfN2bPrzYaOFNCJjO4Js9deKbRHTOSaiP2FRwZqDLdQwy2+SEGeXPZ94yYw==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-4.1.2.tgz", + "integrity": "sha512-QAWGtHwib0qsP5CcO64aJCF75zpFgpKK3jNpxILzQiPK3sVo4EmnVGJVdwcZWpWrGdH8E4YkncGoitw4EXzKMg==", "dev": true, "license": "MIT", "dependencies": { @@ -150,7 +150,7 @@ "yarn": ">=1.22.18" }, "peerDependencies": { - "storybook": "^0.0.0-0 || ^9.0.0 || ^9.1.0-0" + "storybook": "^0.0.0-0 || ^9.0.0 || ^9.1.0-0 || ^9.2.0-0 || ^10.0.0-0 || ^10.1.0-0 || ^10.2.0-0 || ^10.3.0-0" } }, "node_modules/@esbuild/aix-ppc64": { @@ -894,6 +894,17 @@ "@jridgewell/trace-mapping": "^0.3.24" } }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1502,13 +1513,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz", - "integrity": "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.54.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -1812,9 +1823,9 @@ "license": "MIT" }, "node_modules/@storybook/addon-a11y": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-9.0.17.tgz", - "integrity": "sha512-9cXNK3q/atx3hwJAt9HkJbd9vUxCXfKKiNNuSACbf8h9/j6u3jktulKOf6Xjc3B8lwn6ZpdK/x1HHZN2kTqsvg==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-a11y/-/addon-a11y-10.0.7.tgz", + "integrity": "sha512-JsYPpZ/n67/2bI1XJeyrAWHHQkHemPkPHjCA0tAUnMz1Shlo/LV2q1Ahgpxoihx4strbHwZz71bcS4MqkHBduA==", "dev": true, "license": "MIT", "dependencies": { @@ -1826,20 +1837,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17" + "storybook": "^10.0.7" } }, "node_modules/@storybook/addon-docs": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-9.0.17.tgz", - "integrity": "sha512-LOX/kKgQGnyulrqZHsvf77+ZoH/nSUaplGr5hvZglW/U6ak6fO9seJyXAzVKEnC6p+F8n02kFBZbi3s+znQhSg==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-10.0.7.tgz", + "integrity": "sha512-qQQMoeYZC4W+/8ubfOZiTrE8nYC/f4wWP1uq4peRyDy1N2nIN9SwhyxwMn0m3VpeGmRBga5dLvJY9ko6SnJekg==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/react": "^3.0.0", - "@storybook/csf-plugin": "9.0.17", - "@storybook/icons": "^1.2.12", - "@storybook/react-dom-shim": "9.0.17", + "@storybook/csf-plugin": "10.0.7", + "@storybook/icons": "^1.6.0", + "@storybook/react-dom-shim": "10.0.7", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "ts-dedent": "^2.0.0" @@ -1849,13 +1860,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17" + "storybook": "^10.0.7" } }, "node_modules/@storybook/addon-svelte-csf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@storybook/addon-svelte-csf/-/addon-svelte-csf-5.0.7.tgz", - "integrity": "sha512-6Zmy5HjOlrrG6OoKRTGDr9LR6zRK4/Sa7raFzQRKHGASgMlfKsMdNTNO0sxnMUWCu2JMS6HsuoLtB3Ma8SlYtg==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@storybook/addon-svelte-csf/-/addon-svelte-csf-5.0.10.tgz", + "integrity": "sha512-poSvTS7VdaQ42ZoqW5e4+2Hv1iLO0mekH9fwn/QuBNse48R4WlTyR8XFbHRTfatl9gdc9ZYC4uWzazrmV6zGIA==", "dev": true, "license": "MIT", "dependencies": { @@ -1868,22 +1879,22 @@ "zimmerframe": "^1.1.2" }, "peerDependencies": { - "@storybook/svelte": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0", + "@storybook/svelte": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 || ^10.0.0-0", "@sveltejs/vite-plugin-svelte": "^4.0.0 || ^5.0.0 || ^6.0.0", - "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0", + "storybook": "^0.0.0-0 || ^8.2.0 || ^9.0.0 || ^9.1.0-0 || ^10.0.0-0", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, "node_modules/@storybook/addon-vitest": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-9.0.17.tgz", - "integrity": "sha512-eogqcGbACR1sTedBSE2SP/4QV1ruicHYEhYjBtoPIjvYgymN1g5KSuQNysLx4f0SvAzczrcNjX2WVVLX2DVyzA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-vitest/-/addon-vitest-10.0.7.tgz", + "integrity": "sha512-i6v/mAl+elrUxb+1f4NdnM17t/fg+KGJWL1U9quflXTd3KiLY0xJB4LwNP6yYo7Imc5NIO2fRkJbGvNqLBRe2Q==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.4.0", + "@storybook/icons": "^1.6.0", "prompts": "^2.4.0", "ts-dedent": "^2.2.0" }, @@ -1892,15 +1903,19 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@vitest/browser": "^3.0.0", - "@vitest/runner": "^3.0.0", - "storybook": "^9.0.17", - "vitest": "^3.0.0" + "@vitest/browser": "^3.0.0 || ^4.0.0", + "@vitest/browser-playwright": "^4.0.0", + "@vitest/runner": "^3.0.0 || ^4.0.0", + "storybook": "^10.0.7", + "vitest": "^3.0.0 || ^4.0.0" }, "peerDependenciesMeta": { "@vitest/browser": { "optional": true }, + "@vitest/browser-playwright": { + "optional": true + }, "@vitest/runner": { "optional": true }, @@ -1910,13 +1925,13 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-9.0.17.tgz", - "integrity": "sha512-lyuvgGhb0NaVk1tdB4xwzky6+YXQfxlxfNQqENYZ9uYQZdPfErMa4ZTXVQTV+CQHAa2NL+p/dG2JPAeu39e9UA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-10.0.7.tgz", + "integrity": "sha512-wk2TAoUY5+9t78GWVBndu9rEo9lo6Ec3SRrLT4VpIlcS2GPK+5f26UC2uvIBwOF/N7JrUUKq/zWDZ3m+do9QDg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/csf-plugin": "9.0.17", + "@storybook/csf-plugin": "10.0.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -1924,7 +1939,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17", + "storybook": "^10.0.7", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, @@ -1939,20 +1954,38 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-9.0.17.tgz", - "integrity": "sha512-6Q4eo1ObrLlsnB6bIt6T8+45XAb4to2pQGNrI7QPkLQRLrZinrJcNbLY7AGkyIoCOEsEbq08n09/nClQUbu8HA==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-10.0.7.tgz", + "integrity": "sha512-YaYYlCyJBwxaMk7yREOdz+9MDSgxIYGdeJ9EIq/bUndmkoj9SRo1P9/0lC5dseWQoiGy4T3PbZiWruD8uM5m3g==", "dev": true, "license": "MIT", "dependencies": { - "unplugin": "^1.3.1" + "unplugin": "^2.3.5" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17" + "esbuild": "*", + "rollup": "*", + "storybook": "^10.0.7", + "vite": "*", + "webpack": "*" + }, + "peerDependenciesMeta": { + "esbuild": { + "optional": true + }, + "rollup": { + "optional": true + }, + "vite": { + "optional": true + }, + "webpack": { + "optional": true + } } }, "node_modules/@storybook/global": { @@ -1963,9 +1996,9 @@ "license": "MIT" }, "node_modules/@storybook/icons": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.4.0.tgz", - "integrity": "sha512-Td73IeJxOyalzvjQL+JXx72jlIYHgs+REaHiREOqfpo3A2AYYG71AUbcv+lg7mEDIweKVCxsMQ0UKo634c8XeA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.6.0.tgz", + "integrity": "sha512-hcFZIjW8yQz8O8//2WTIXylm5Xsgc+lW9ISLgUk1xGmptIJQRdlhVIXCpSyLrQaaRiyhQRaVg7l3BD9S216BHw==", "dev": true, "license": "MIT", "engines": { @@ -1977,9 +2010,9 @@ } }, "node_modules/@storybook/react-dom-shim": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-9.0.17.tgz", - "integrity": "sha512-ak/x/m6MDDxdE6rCDymTltaiQF3oiKrPHSwfM+YPgQR6MVmzTTs4+qaPfeev7FZEHq23IkfDMTmSTTJtX7Vs9A==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-10.0.7.tgz", + "integrity": "sha512-bp4OnMtZGwPJQDqNRi4K5iibLbZ2TZZMkWW7oSw5jjPFpGSreSjCe8LH9yj/lDnK8Ox9bGMCBFE5RV5XuML29w==", "dev": true, "license": "MIT", "funding": { @@ -1987,126 +2020,75 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^9.0.17" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^10.0.7" } }, "node_modules/@storybook/svelte": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/svelte/-/svelte-9.0.17.tgz", - "integrity": "sha512-RwOswdq7S3+ZOuoM/oRrcmlsKdjcd/3wMHbuirzYoAhdwsjubSuRepMV64O9RnlXd3x7rZw4fXpq1M/SVo5XiQ==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/svelte/-/svelte-10.0.7.tgz", + "integrity": "sha512-rO+YQhHucy47Vh67z318pALmd6x+K1Kj30Fb4a6oOEw4xn4zCo9KTmkMWs24c4oduEXD/eJu3badlRmsVXzyfA==", "dev": true, "license": "MIT", "dependencies": { "ts-dedent": "^2.0.0", "type-fest": "~2.19" }, - "engines": { - "node": ">=20.0.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17", + "storybook": "^10.0.7", "svelte": "^5.0.0" } }, - "node_modules/@storybook/sveltekit": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/sveltekit/-/sveltekit-9.0.17.tgz", - "integrity": "sha512-CUOATuW5Qk3SjNvmjH+wyx2GCsMF1cvw3gwkujV9kehPebzV20NhgHpbzSoepvwF7+Bj6jl8V6UxiMWk0jJFmA==", + "node_modules/@storybook/svelte-vite": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/svelte-vite/-/svelte-vite-10.0.7.tgz", + "integrity": "sha512-q9/RtrhX1CnznO6AO9MDEy1bsccbGeRxW28FLpgUrztV4IGZ/dFUrFIFurKRyuA3/nFsbtzp1F5jFt3RExmmTw==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/builder-vite": "9.0.17", - "@storybook/svelte": "9.0.17", - "@storybook/svelte-vite": "9.0.17" - }, - "engines": { - "node": ">=20.0.0" + "@storybook/builder-vite": "10.0.7", + "@storybook/svelte": "10.0.7", + "magic-string": "^0.30.0", + "svelte2tsx": "^0.7.44", + "typescript": "^4.9.4 || ^5.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^9.0.17", + "@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0", + "storybook": "^10.0.7", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/@storybook/sveltekit/node_modules/@storybook/svelte-vite": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/@storybook/svelte-vite/-/svelte-vite-9.0.17.tgz", - "integrity": "sha512-fRIxOZy9IRI6BfL1LgFn+B+IckGOlT1SstD01y9ddO4pVKWih/l+vb44bnZs+Z0faJZbrG/LgfnXTOPj052Z8g==", + "node_modules/@storybook/sveltekit": { + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/@storybook/sveltekit/-/sveltekit-10.0.7.tgz", + "integrity": "sha512-ujTW7PfWvgBrzd7jzaZe9JgjUeM5YvBKm+xru6t7Dr4bdfmkKqlZHPRdXn/sy+fQNyfg6JL2WKy2KIIeA+RvSg==", "dev": true, "license": "MIT", "dependencies": { - "@storybook/builder-vite": "9.0.17", - "@storybook/svelte": "9.0.17", - "magic-string": "^0.30.0", - "svelte2tsx": "^0.7.35", - "typescript": "^4.9.4 || ^5.0.0" - }, - "engines": { - "node": ">=20.0.0" + "@storybook/builder-vite": "10.0.7", + "@storybook/svelte": "10.0.7", + "@storybook/svelte-vite": "10.0.7" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", - "storybook": "^9.0.17", + "storybook": "^10.0.7", "svelte": "^5.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0" } }, - "node_modules/@storybook/sveltekit/node_modules/@sveltejs/vite-plugin-svelte": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-5.1.1.tgz", - "integrity": "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", - "debug": "^4.4.1", - "deepmerge": "^4.3.1", - "kleur": "^4.1.5", - "magic-string": "^0.30.17", - "vitefu": "^1.0.6" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22" - }, - "peerDependencies": { - "svelte": "^5.0.0", - "vite": "^6.0.0" - } - }, - "node_modules/@storybook/sveltekit/node_modules/@sveltejs/vite-plugin-svelte/node_modules/@sveltejs/vite-plugin-svelte-inspector": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-4.0.1.tgz", - "integrity": "sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "debug": "^4.3.7" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22" - }, - "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^5.0.0", - "svelte": "^5.0.0", - "vite": "^6.0.0" - } - }, "node_modules/@sveltejs/acorn-typescript": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.5.tgz", @@ -2117,9 +2099,9 @@ } }, "node_modules/@sveltejs/adapter-static": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.9.tgz", - "integrity": "sha512-aytHXcMi7lb9ljsWUzXYQ0p5X1z9oWud2olu/EpmH7aCu4m84h7QLvb5Wp+CFirKcwoNnYvYWhyP/L8Vh1ztdw==", + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.10.tgz", + "integrity": "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2127,9 +2109,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.37.0", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.37.0.tgz", - "integrity": "sha512-xgKtpjQ6Ry4mdShd01ht5AODUsW7+K1iValPDq7QX8zI1hWOKREH9GjG8SRCN5tC4K7UXmMhuQam7gbLByVcnw==", + "version": "2.48.4", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.48.4.tgz", + "integrity": "sha512-TGFX1pZUt9qqY20Cv5NyYvy0iLWHf2jXi8s+eCGsig7jQMdwZWKUFMR6TbvFNhfDSUpc1sH/Y5EHv20g3HHA3g==", "dev": true, "license": "MIT", "dependencies": { @@ -2166,16 +2148,15 @@ } }, "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.1.0.tgz", - "integrity": "sha512-+U6lz1wvGEG/BvQyL4z/flyNdQ9xDNv5vrh+vWBWTHaebqT0c9RNggpZTo/XSPoHsSCWBlYaTlRX8pZ9GATXCw==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-6.2.1.tgz", + "integrity": "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ==", "dev": true, "license": "MIT", "dependencies": { - "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0-next.1", + "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", - "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, @@ -3361,19 +3342,6 @@ "node": ">= 0.8" } }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/bits-ui": { "version": "2.8.11", "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.8.11.tgz", @@ -3844,16 +3812,6 @@ "node": ">=0.10.0" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", @@ -4042,19 +4000,6 @@ "@esbuild/win32-x64": "0.25.8" } }, - "node_modules/esbuild-register": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.6.0.tgz", - "integrity": "sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "^4.3.4" - }, - "peerDependencies": { - "esbuild": ">=0.12 <1" - } - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4146,20 +4091,17 @@ } }, "node_modules/eslint-plugin-storybook": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-9.0.17.tgz", - "integrity": "sha512-IuTdlwCEwoDNobdygRCxNhlKXHmsDfPtPvHGcsY35x2Bx8KItrjfekO19gJrjc1VT2CMfcZMYF8OBKaxHELupw==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-storybook/-/eslint-plugin-storybook-10.0.7.tgz", + "integrity": "sha512-qOQq9KdT1jsBgT3qsxUH2n67aj1WR8D1XCoER8Q6yuVlS5TimNwk1mZeWkXVf/o4RQQT6flT2y5cG2gPLZPvJA==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^8.8.1" }, - "engines": { - "node": ">=20.0.0" - }, "peerDependencies": { "eslint": ">=8", - "storybook": "^9.0.17" + "storybook": "^10.0.7" } }, "node_modules/eslint-plugin-svelte": { @@ -4405,11 +4347,14 @@ } }, "node_modules/fdir": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", - "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -5072,22 +5017,6 @@ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "license": "MIT" }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5133,19 +5062,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -5591,16 +5507,6 @@ "dev": true, "license": "MIT" }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lowlight": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz", @@ -6783,17 +6689,6 @@ "dev": true, "license": "MIT" }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -6815,24 +6710,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/opener": { "version": "1.5.2", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", @@ -6919,17 +6796,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -7000,13 +6866,13 @@ } }, "node_modules/playwright": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz", - "integrity": "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.54.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -7019,9 +6885,9 @@ } }, "node_modules/playwright-core": { - "version": "1.54.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz", - "integrity": "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -7852,6 +7718,13 @@ "dev": true, "license": "MIT" }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, "node_modules/secure-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz", @@ -8052,26 +7925,26 @@ "license": "MIT" }, "node_modules/storybook": { - "version": "9.0.17", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-9.0.17.tgz", - "integrity": "sha512-O+9jgJ+Trlq9VGD1uY4OBLKQWHHDKM/A/pA8vMW6PVehhGHNvpzcIC1bngr6mL5gGHZP2nBv+9XG8pTMcggMmg==", + "version": "10.0.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-10.0.7.tgz", + "integrity": "sha512-7smAu0o+kdm378Q2uIddk32pn0UdIbrtTVU+rXRVtTVTCrK/P2cCui2y4JH+Bl3NgEq1bbBQpCAF/HKrDjk2Qw==", "dev": true, "license": "MIT", "dependencies": { "@storybook/global": "^5.0.0", + "@storybook/icons": "^1.6.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/user-event": "^14.6.1", "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", "@vitest/spy": "3.2.4", - "better-opn": "^3.0.2", "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", - "esbuild-register": "^3.5.0", "recast": "^0.23.5", "semver": "^7.6.2", "ws": "^8.18.0" }, "bin": { - "storybook": "bin/index.cjs" + "storybook": "dist/bin/dispatcher.js" }, "funding": { "type": "opencollective", @@ -8418,14 +8291,14 @@ } }, "node_modules/svelte2tsx": { - "version": "0.7.41", - "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.41.tgz", - "integrity": "sha512-/TUwpyn/Qc1wcGuayf2GSwvZ7htdAOzpo0JFFm96srKnRXoTD0gy4n06g+XgH8w016S3lPtyFVtFAm+0yJ0BZw==", + "version": "0.7.45", + "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.7.45.tgz", + "integrity": "sha512-cSci+mYGygYBHIZLHlm/jYlEc1acjAHqaQaDFHdEBpUueM9kSTnPpvPtSl5VkJOU1qSJ7h1K+6F/LIUYiqC8VA==", "dev": true, "license": "MIT", "dependencies": { "dedent-js": "^1.0.1", - "pascal-case": "^3.1.1" + "scule": "^1.3.0" }, "peerDependencies": { "svelte": "^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0", @@ -8535,14 +8408,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", - "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", "dev": true, "license": "MIT", "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" + "fdir": "^6.5.0", + "picomatch": "^4.0.3" }, "engines": { "node": ">=12.0.0" @@ -8918,17 +8791,19 @@ } }, "node_modules/unplugin": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", - "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.10.tgz", + "integrity": "sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==", "dev": true, "license": "MIT", "dependencies": { - "acorn": "^8.14.0", + "@jridgewell/remapping": "^2.3.5", + "acorn": "^8.15.0", + "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" }, "engines": { - "node": ">=14.0.0" + "node": ">=18.12.0" } }, "node_modules/uri-js": { @@ -9054,18 +8929,18 @@ } }, "node_modules/vite": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz", - "integrity": "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.2.2.tgz", + "integrity": "sha512-BxAKBWmIbrDgrokdGZH1IgkIk/5mMHDreLDmCJ0qpyJaAteP8NvMhkwr/ZCQNqNH97bw/dANTE9PDzqwJghfMQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", - "fdir": "^6.4.6", - "picomatch": "^4.0.2", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", "postcss": "^8.5.6", - "rollup": "^4.40.0", - "tinyglobby": "^0.2.14" + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" diff --git a/tools/server/webui/package.json b/tools/server/webui/package.json index 92c7457bd31..8b88f691a43 100644 --- a/tools/server/webui/package.json +++ b/tools/server/webui/package.json @@ -24,20 +24,20 @@ "cleanup": "rm -rf .svelte-kit build node_modules test-results" }, "devDependencies": { - "@chromatic-com/storybook": "^4.0.1", + "@chromatic-com/storybook": "^4.1.2", "@eslint/compat": "^1.2.5", "@eslint/js": "^9.18.0", "@internationalized/date": "^3.8.2", "@lucide/svelte": "^0.515.0", "@playwright/test": "^1.49.1", - "@storybook/addon-a11y": "^9.0.17", - "@storybook/addon-docs": "^9.0.17", - "@storybook/addon-svelte-csf": "^5.0.7", - "@storybook/addon-vitest": "^9.0.17", - "@storybook/sveltekit": "^9.0.17", - "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/kit": "^2.22.0", - "@sveltejs/vite-plugin-svelte": "^6.0.0", + "@storybook/addon-a11y": "^10.0.7", + "@storybook/addon-docs": "^10.0.7", + "@storybook/addon-svelte-csf": "^5.0.10", + "@storybook/addon-vitest": "^10.0.7", + "@storybook/sveltekit": "^10.0.7", + "@sveltejs/adapter-static": "^3.0.10", + "@sveltejs/kit": "^2.48.4", + "@sveltejs/vite-plugin-svelte": "^6.2.1", "@tailwindcss/forms": "^0.5.9", "@tailwindcss/typography": "^0.5.15", "@tailwindcss/vite": "^4.0.0", @@ -48,21 +48,21 @@ "dexie": "^4.0.11", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", - "eslint-plugin-storybook": "^9.0.17", + "eslint-plugin-storybook": "^10.0.7", "eslint-plugin-svelte": "^3.0.0", "fflate": "^0.8.2", "globals": "^16.0.0", "http-server": "^14.1.1", "mdast": "^3.0.0", "mdsvex": "^0.12.3", - "playwright": "^1.53.0", + "playwright": "^1.56.1", "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.11", "rehype-katex": "^7.0.1", "remark-math": "^6.0.0", "sass": "^1.93.3", - "storybook": "^9.0.17", + "storybook": "^10.0.7", "svelte": "^5.0.0", "svelte-check": "^4.0.0", "tailwind-merge": "^3.3.1", @@ -73,7 +73,7 @@ "typescript-eslint": "^8.20.0", "unified": "^11.0.5", "uuid": "^13.0.0", - "vite": "^7.0.4", + "vite": "^7.2.2", "vite-plugin-devtools-json": "^0.2.0", "vitest": "^3.2.3", "vitest-browser-svelte": "^0.1.0" diff --git a/tools/server/webui/src/stories/ChatForm.stories.svelte b/tools/server/webui/src/stories/ChatForm.stories.svelte index 6a0fc087019..82848e4fbf1 100644 --- a/tools/server/webui/src/stories/ChatForm.stories.svelte +++ b/tools/server/webui/src/stories/ChatForm.stories.svelte @@ -1,7 +1,7 @@

      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�oizAAPM(;bT}+pqxaMpjb2 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 DEDhtrpO0D!A)(yW+#gT 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

    ``A&@ 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