pub const CHUNK_EMBED_BATCH_SIZE: usize = 8;
pub const ENTITY_EMBED_BATCH_SIZE: usize = 25;
pub const EMBED_BATCH_CALIBRATION_DIM: usize = 64;
pub(crate) fn adaptive_batch_for_dim(base: usize, dim: usize) -> usize {
let base = base.max(1);
(base * EMBED_BATCH_CALIBRATION_DIM / dim.max(1)).clamp(1, base)
}
pub fn chunk_embed_batch_size() -> usize {
let dim = crate::constants::embedding_dim();
let batch = adaptive_batch_for_dim(CHUNK_EMBED_BATCH_SIZE, dim);
tracing::debug!(
dim,
base = CHUNK_EMBED_BATCH_SIZE,
batch,
"adaptive chunk batch size (G44)"
);
batch
}
pub fn entity_embed_batch_size() -> usize {
let dim = crate::constants::embedding_dim();
let batch = adaptive_batch_for_dim(ENTITY_EMBED_BATCH_SIZE, dim);
tracing::debug!(
dim,
base = ENTITY_EMBED_BATCH_SIZE,
batch,
"adaptive entity batch size (G44)"
);
batch
}
pub fn effective_permits(requested: usize) -> usize {
let cpus = std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4);
let by_ram = ((crate::memory_guard::available_memory_mb() / 2)
/ crate::constants::llm_worker_rss_mb().max(1))
.max(1) as usize;
requested
.clamp(1, 32)
.min(cpus)
.min(by_ram)
.min(crate::constants::joint_parallelism_ceiling())
.max(1)
}