onnx-export-rs 0.1.1

Export canonical Rust machine-learning models to ONNX
Documentation
use ndarray::{Array1, Array2};

use crate::{Error, Result};

/// A general affine transform `Y = X * matrix + bias`.
///
/// This representation covers dimensionality-reduction transforms such as
/// PCA/SVD, feature standardization, and multi-output linear estimators.
#[derive(Clone, Debug, PartialEq)]
pub struct AffineModel {
    /// Matrix shaped `[input_features, output_features]`.
    pub matrix: Array2<f64>,
    /// One additive bias per output feature.
    pub bias: Array1<f64>,
}

impl AffineModel {
    /// Creates a validated affine transform.
    ///
    /// # Errors
    ///
    /// Returns an error for empty dimensions, a mismatched bias, or non-finite
    /// parameters.
    pub fn new(matrix: Array2<f64>, bias: Array1<f64>) -> Result<Self> {
        if matrix.nrows() == 0
            || matrix.ncols() == 0
            || bias.len() != matrix.ncols()
            || matrix
                .iter()
                .chain(bias.iter())
                .any(|value| !value.is_finite())
        {
            return Err(Error::InvalidModel(
                "invalid affine transform shape or value".into(),
            ));
        }
        Ok(Self { matrix, bias })
    }

    /// Required number of input features.
    #[must_use]
    pub fn n_features(&self) -> usize {
        self.matrix.nrows()
    }

    /// Number of output features.
    #[must_use]
    pub fn n_outputs(&self) -> usize {
        self.matrix.ncols()
    }
}