use std::fmt;
use super::compute::{compute_max_batch_size, compute_max_chunks};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum MemoryTier {
Medium,
Large,
XLarge,
}
impl fmt::Display for MemoryTier {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(match self {
MemoryTier::Medium => "Medium",
MemoryTier::Large => "Large",
MemoryTier::XLarge => "XLarge",
})
}
}
impl MemoryTier {
pub fn batch_size_hard_cap(self) -> usize {
match self {
MemoryTier::Medium => 128,
MemoryTier::Large => 256,
MemoryTier::XLarge => 512,
}
}
pub fn from_total_ram_mb(total_ram_mb: u64) -> Self {
let gb = total_ram_mb / 1024;
match gb {
0..=31 => MemoryTier::Medium,
32..=63 => MemoryTier::Large,
_ => MemoryTier::XLarge,
}
}
pub(super) fn defaults(
self,
memory_limit_mb: usize,
index_memory_limit_mb: usize,
) -> TierDefaults {
let (embedding_cache, bm25_corpus_cap, max_kg_nodes) = match self {
MemoryTier::Medium => (1_000, 100_000, 150_000),
MemoryTier::Large => (10_000, 200_000, 300_000),
MemoryTier::XLarge => (20_000, 400_000, 500_000),
};
TierDefaults {
memory_limit_mb,
index_memory_limit_mb,
max_chunks: compute_max_chunks(memory_limit_mb),
embedding_cache,
max_batch_size: compute_max_batch_size(index_memory_limit_mb),
bm25_corpus_cap,
max_kg_nodes,
}
}
}
#[derive(Debug, Clone, Copy)]
pub(super) struct TierDefaults {
pub(super) memory_limit_mb: usize,
pub(super) index_memory_limit_mb: usize,
pub(super) max_chunks: usize,
pub(super) embedding_cache: usize,
pub(super) max_batch_size: usize,
pub(super) bm25_corpus_cap: usize,
pub(super) max_kg_nodes: usize,
}