use crate::error::Result;
use crate::types::{
GpuCapabilities, GpuDeviceInfo, GpuDistanceMetric, GpuMemoryStats, GpuSearchResult, GpuVector,
HnswConfig,
};
pub trait GpuBackend {
fn device_info(&self) -> GpuDeviceInfo;
fn supports_operations(&self) -> GpuCapabilities;
fn memory_stats(&self) -> GpuMemoryStats;
}
pub trait GpuVectorStorage {
fn add_vectors(&mut self, vectors: &[GpuVector]) -> Result<Vec<usize>>;
fn search(&self, query: &[f32], limit: usize) -> Result<Vec<GpuSearchResult>>;
fn remove_vectors(&mut self, ids: &[String]) -> Result<()>;
fn vector_count(&self) -> usize;
fn dimension(&self) -> usize;
fn get_vector(&self, id: &str) -> Result<Option<GpuVector>>;
fn clear(&mut self) -> Result<()>;
}
pub trait GpuContext {
fn create_storage(
&self,
dimension: usize,
metric: GpuDistanceMetric,
) -> Result<Box<dyn GpuVectorStorage>>;
fn create_storage_with_config(
&self,
dimension: usize,
metric: GpuDistanceMetric,
config: HnswConfig,
) -> Result<Box<dyn GpuVectorStorage>>;
fn memory_stats(&self) -> GpuMemoryStats;
fn device_info(&self) -> Result<GpuDeviceInfo>;
}
pub trait GpuBufferManager {
fn allocate_buffer(&mut self, size: usize) -> Result<GpuBuffer>;
fn deallocate_buffer(&mut self, buffer: GpuBuffer) -> Result<()>;
fn pool_stats(&self) -> BufferPoolStats;
}
#[derive(Debug, Clone)]
pub struct GpuBuffer {
pub id: usize,
pub size: usize,
pub buffer_type: BufferType,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum BufferType {
Vector,
Metadata,
Temporary,
HnswGraph,
}
#[derive(Debug, Clone)]
pub struct BufferPoolStats {
pub total_buffers: usize,
pub available_buffers: usize,
pub utilization: f32,
pub total_memory: usize,
}
pub trait GpuMonitor {
fn get_vram_stats(&self) -> VramStats;
fn validate_all_vram(&self) -> Result<()>;
fn generate_vram_report(&self) -> String;
}
#[derive(Debug, Clone)]
pub struct VramStats {
pub total_vram: usize,
pub allocated_vram: usize,
pub available_vram: usize,
pub utilization: f32,
pub buffer_count: usize,
}
#[derive(Debug, Clone)]
pub struct VramBufferInfo {
pub buffer_id: usize,
pub size: usize,
pub buffer_type: BufferType,
pub allocated_at: u64,
}