libmir-metal 0.2.0

Metal inference backend for libmir
use super::DecoderExecution;
use crate::engine::{Array, DecoderCache, Result, Stream, dense::swiglu::DenseSwiGluModel};

mod routed;

impl DecoderExecution for DenseSwiGluModel {
    fn prefers_packed_decode(&self, stream: &Stream) -> bool {
        stream.config().batch.dense_decode.packed()
    }

    fn new_cache(&self, stream: &Stream) -> Result<DecoderCache> {
        self.new_cache(stream)
    }

    fn forward_decode(
        &self,
        token_ids: &Array,
        cache: &mut DecoderCache,
        position: i32,
        stream: &Stream,
    ) -> Result<Array> {
        self.forward_decode(token_ids, cache, position, stream)
    }

    fn forward_packed_decode(
        &self,
        token_ids: &Array,
        caches: &mut [&mut DecoderCache],
        positions: &[i32],
        stream: &Stream,
    ) -> Result<Array> {
        self.forward_packed_decode(token_ids, caches, positions, stream)
    }

    fn forward_prefill(
        &self,
        token_ids: &Array,
        cache: &mut DecoderCache,
        position: i32,
        stream: &Stream,
    ) -> Result<Array> {
        self.forward_prefill(token_ids, cache, position, stream)
    }

    fn fusion_summary(&self) -> (usize, usize, usize, usize) {
        let (attention, gate_up) = self.fusion_summary();
        (attention, 0, gate_up, 0)
    }

    fn expert_fusion_summary(&self) -> String {
        "expert gate/up fusion is not applicable to dense feed-forward".into()
    }
}