| 106 | } |
| 107 | |
| 108 | std::vector<ggml_fp16_t> build_prefill_attention_mask_values(const std::vector<int32_t> & attention_mask) { |
| 109 | const int64_t tokens = static_cast<int64_t>(attention_mask.size()); |
| 110 | const ggml_fp16_t neg_inf = ggml_fp32_to_fp16(-std::numeric_limits<float>::infinity()); |
| 111 | const ggml_fp16_t visible = ggml_fp32_to_fp16(0.0F); |
| 112 | std::vector<ggml_fp16_t> values(static_cast<size_t>(tokens * tokens), visible); |
| 113 | for (int64_t q = 0; q < tokens; ++q) { |
| 114 | if (attention_mask[static_cast<size_t>(q)] == 0) { |
| 115 | for (int64_t k = 0; k < tokens; ++k) { |
| 116 | values[static_cast<size_t>(q * tokens + k)] = neg_inf; |
| 117 | } |
| 118 | values[static_cast<size_t>(q * tokens + q)] = visible; |
| 119 | continue; |
| 120 | } |
| 121 | for (int64_t k = 0; k < tokens; ++k) { |
| 122 | if (k > q || attention_mask[static_cast<size_t>(k)] == 0) { |
| 123 | values[static_cast<size_t>(q * tokens + k)] = neg_inf; |
| 124 | } |
| 125 | } |
| 126 | } |
| 127 | return values; |
| 128 | } |
| 129 | |
| 130 | std::vector<ggml_fp16_t> build_cfg_prefill_attention_mask_values( |
| 131 | const std::vector<int32_t> & conditional_attention_mask, |
no test coverage detected