Spaces:
Runtime error
Runtime error
// | |
// logging | |
// | |
LLAMA_ATTRIBUTE_FORMAT(2, 3) | |
void llama_log_internal (ggml_log_level level, const char * format, ...); | |
void llama_log_callback_default(ggml_log_level level, const char * text, void * user_data); | |
// | |
// helpers | |
// | |
struct time_meas { | |
time_meas(int64_t & t_acc, bool disable = false) : t_start_us(disable ? -1 : ggml_time_us()), t_acc(t_acc) {} | |
~time_meas() { | |
if (t_start_us >= 0) { | |
t_acc += ggml_time_us() - t_start_us; | |
} | |
} | |
const int64_t t_start_us; | |
int64_t & t_acc; | |
}; | |
static void replace_all(std::string & s, const std::string & search, const std::string & replace) { | |
if (search.empty()) { | |
return; | |
} | |
std::string builder; | |
builder.reserve(s.length()); | |
size_t pos = 0; | |
size_t last_pos = 0; | |
while ((pos = s.find(search, last_pos)) != std::string::npos) { | |
builder.append(s, last_pos, pos - last_pos); | |
builder.append(replace); | |
last_pos = pos + search.length(); | |
} | |
builder.append(s, last_pos, std::string::npos); | |
s = std::move(builder); | |
} | |
const std::vector<std::pair<std::string, struct ggml_tensor *>> & llama_internal_get_tensor_map( | |
struct llama_context * ctx | |
); | |
// the ring buffer works similarly to std::deque, but with a fixed capacity | |
template<typename T> | |
struct ring_buffer { | |
ring_buffer(size_t cap) : capacity(cap), data(cap) {} | |
T & front() { | |
if (sz == 0) { | |
throw std::runtime_error("ring buffer is empty"); | |
} | |
return data[first]; | |
} | |
const T & front() const { | |
if (sz == 0) { | |
throw std::runtime_error("ring buffer is empty"); | |
} | |
return data[first]; | |
} | |
T & back() { | |
if (sz == 0) { | |
throw std::runtime_error("ring buffer is empty"); | |
} | |
return data[pos]; | |
} | |
const T & back() const { | |
if (sz == 0) { | |
throw std::runtime_error("ring buffer is empty"); | |
} | |
return data[pos]; | |
} | |
void push_back(const T & value) { | |
if (capacity == 0) { | |
throw std::runtime_error("ring buffer: capacity is zero"); | |
} | |
if (sz == capacity) { | |
// advance the start when buffer is full | |
first = (first + 1) % capacity; | |
} else { | |
sz++; | |
} | |
data[pos] = value; | |
pos = (pos + 1) % capacity; | |
} | |
T pop_front() { | |
if (sz == 0) { | |
throw std::runtime_error("ring buffer is empty"); | |
} | |
T value = data[first]; | |
first = (first + 1) % capacity; | |
sz--; | |
return value; | |
} | |
//T & operator[](size_t i) { | |
// if (i >= sz) { | |
// throw std::runtime_error("ring buffer: index out of bounds"); | |
// } | |
// return data[(first + i) % capacity]; | |
//} | |
//const T & at(size_t i) const { | |
// if (i >= sz) { | |
// throw std::runtime_error("ring buffer: index out of bounds"); | |
// } | |
// return data[(first + i) % capacity]; | |
//} | |
const T & rat(size_t i) const { | |
if (i >= sz) { | |
throw std::runtime_error("ring buffer: index out of bounds"); | |
} | |
return data[(first + sz - i - 1) % capacity]; | |
} | |
std::vector<T> to_vector() const { | |
std::vector<T> result; | |
result.reserve(sz); | |
for (size_t i = 0; i < sz; i++) { | |
result.push_back(data[(first + i) % capacity]); | |
} | |
return result; | |
} | |
void clear() { | |
// here only reset the status of the buffer | |
sz = 0; | |
first = 0; | |
pos = 0; | |
} | |
bool empty() const { | |
return sz == 0; | |
} | |
size_t size() const { | |
return sz; | |
} | |
size_t capacity = 0; | |
size_t sz = 0; | |
size_t first = 0; | |
size_t pos = 0; | |
std::vector<T> data; | |
}; | |