#[derive(Debug, Clone)]
pub(in crate::index::hnsw::native) struct BatchEfSchedule {
pub scaffold_ef: usize,
pub bulk_ef: usize,
pub finalize_ef: usize,
pub scaffold_count: usize,
pub finalize_start: usize,
}
impl BatchEfSchedule {
#[inline]
#[must_use]
pub fn ef_for_position(&self, position: usize) -> usize {
if position < self.scaffold_count {
self.scaffold_ef
} else if position >= self.finalize_start {
self.finalize_ef
} else {
self.bulk_ef
}
}
}
#[must_use]
pub(in crate::index::hnsw::native) fn compute_batch_ef_schedule(
base_ef: usize,
batch_size: usize,
m: usize,
) -> BatchEfSchedule {
let floor = 2 * m;
if batch_size < 1000 {
return BatchEfSchedule {
scaffold_ef: base_ef,
bulk_ef: base_ef,
finalize_ef: base_ef,
scaffold_count: batch_size,
finalize_start: batch_size,
};
}
let scaffold_count = batch_size / 10;
let finalize_start = batch_size - (batch_size / 10);
BatchEfSchedule {
scaffold_ef: base_ef,
bulk_ef: (base_ef / 2).max(floor),
finalize_ef: (base_ef * 3 / 4).max(floor),
scaffold_count,
finalize_start,
}
}