tenferro-runtime 0.1.0

Concrete tensor helpers, traced tensors, graph execution, and extension runtime support for tenferro.
Documentation
use tenferro_tensor::Tensor;

use crate::error::{Error, Result};

pub(crate) fn round_real_to_i64(value: f64) -> i64 {
    if value.is_finite() {
        value.round() as i64
    } else {
        0
    }
}

pub fn dynamic_truncate_size(size_tensor: &Tensor, axis_extent: usize) -> Result<usize> {
    let value = scalar_size_value(size_tensor)?;
    let rounded = if value.is_finite() {
        value.round()
    } else {
        0.0
    };
    Ok(rounded.max(0.0).min(axis_extent as f64) as usize)
}

fn scalar_size_value(size_tensor: &Tensor) -> Result<f64> {
    if !size_tensor.shape().is_empty() {
        return Err(Error::Internal(format!(
            "DynamicTruncate size must be an f32, f64, or i64 scalar, got shape {:?}",
            size_tensor.shape()
        )));
    }

    match size_tensor {
        Tensor::F64(inner) => Ok(inner.host_data()?[0]),
        Tensor::F32(inner) => Ok(inner.host_data()?[0] as f64),
        Tensor::I64(inner) => Ok(inner.host_data()?[0] as f64),
        _ => Err(Error::Internal(
            "DynamicTruncate size must be an f32, f64, or i64 scalar".into(),
        )),
    }
}