use rlx_runtime::Device;
use std::ops::Range;
pub fn locateanything_kv_bucket_ranges(max_past: usize) -> Vec<Range<u64>> {
let max_past = max_past.max(1) as u64;
let mut ranges = Vec::new();
let mut start = 1u64;
let mut step = 32u64;
loop {
let end = (start + step).min(max_past + 1);
ranges.push(start..end);
if end > max_past {
break;
}
start = end;
if start >= 512 {
step = 128;
}
}
ranges
}
pub fn locateanything_kv_bucket_ranges_for_device(
device: Device,
max_past: usize,
) -> Vec<Range<u64>> {
let max_past = max_past.max(1) as u64;
if matches!(device, Device::Gpu | Device::Vulkan) {
return std::iter::once(1..max_past + 1).collect();
}
locateanything_kv_bucket_ranges(max_past as usize)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn wgpu_uses_single_bucket() {
let buckets = locateanything_kv_bucket_ranges_for_device(Device::Gpu, 1024);
assert_eq!(buckets.len(), 1);
assert_eq!(buckets[0].end - 1, 1024);
}
#[test]
fn past_200_uses_upper_224_not_256() {
let buckets = locateanything_kv_bucket_ranges(2048);
let idx = buckets
.iter()
.position(|r| r.contains(&200))
.expect("bucket");
let upper = buckets[idx].end - 1;
assert_eq!(upper, 224, "expected 32-wide bucket ending at 224");
}
}