kapsl-llm 0.1.0

Large language model inference with GGUF and ONNX backend support for Kapsl
Documentation
#[cfg(test)]
mod tests {
    use super::super::{BlockAllocator, BlockManager, PhysicalTokenBlock};

    #[test]
    fn allocator_allocates_and_frees_blocks() {
        let mut allocator = BlockAllocator::new(2, 16, 7);
        assert_eq!(allocator.get_num_total_blocks(), 2);
        assert_eq!(allocator.get_num_free_blocks(), 2);

        let first = allocator.allocate().expect("expected first block");
        assert_eq!(
            first,
            PhysicalTokenBlock {
                block_number: 0,
                block_size: 16,
                device_id: 7,
            }
        );
        let second = allocator.allocate().expect("expected second block");
        assert_eq!(second.block_number, 1);
        assert_eq!(allocator.get_num_free_blocks(), 0);
        assert!(allocator.allocate().is_none());

        allocator.free(first);
        assert_eq!(allocator.get_num_free_blocks(), 1);
        let recycled = allocator.allocate().expect("expected recycled block");
        assert_eq!(recycled.block_number, 0);
    }

    #[test]
    fn block_manager_tracks_block_tables_and_capacity() {
        let mut manager = BlockManager::new(3, 16, 0);
        assert!(manager.can_allocate(3));

        manager.allocate(10).expect("block for seq 10");
        manager.allocate(10).expect("second block for seq 10");
        manager.allocate(11).expect("block for seq 11");

        let table_10 = manager.get_block_table(10).expect("table for seq 10");
        assert_eq!(table_10.len(), 2);
        let table_11 = manager.get_block_table(11).expect("table for seq 11");
        assert_eq!(table_11.len(), 1);
        assert!(!manager.can_allocate(1));

        manager.free(10);
        assert!(manager.get_block_table(10).is_none());
        assert!(manager.can_allocate(2));
    }
}