libmir-cuda 0.3.0

CUDA inference backend for libmir
use runtime::backend::SamplingLogits;

use super::{bucket_sizes, build_outputs, sample_policies};

#[test]
fn prepares_common_and_maximum_decode_buckets() {
    assert_eq!(bucket_sizes(1).collect::<Vec<_>>(), Vec::<usize>::new());
    assert_eq!(bucket_sizes(7).collect::<Vec<_>>(), [2, 4, 5, 7]);
    assert_eq!(bucket_sizes(16).collect::<Vec<_>>(), [2, 4, 5, 8, 10, 16]);
}

#[test]
fn preserves_mixed_host_and_device_sampling_rows() -> crate::Result<()> {
    let policies = [SamplingLogits::Full, SamplingLogits::None];
    assert_eq!(sample_policies(&policies), [SamplingLogits::None, SamplingLogits::None]);
    let outputs = build_outputs(&policies, &[7, 8], Some(&[1.0, 2.0, 3.0, 4.0]), 2)?;
    assert_eq!(outputs[0].event.token_id, None);
    assert_eq!(
        outputs[0].logits.as_ref().map(|trace| trace.values.as_slice()),
        Some(&[1.0, 2.0][..])
    );
    assert_eq!(outputs[1].event.token_id, Some(8));
    assert!(outputs[1].logits.is_none());
    Ok(())
}