resopt 0.3.0

Declarative constrained residual optimization in Rust
Documentation
use crate::Vector;

/// Mathematical solution payload.
#[derive(Debug, Clone, PartialEq)]
pub struct Solution {
    x: Vector,
    residual: Option<Vector>,
}

impl Solution {
    pub fn new(x: Vector, residual: Option<Vector>) -> Self {
        Self { x, residual }
    }

    pub fn x(&self) -> &[f64] {
        &self.x
    }

    pub fn residual(&self) -> Option<&[f64]> {
        self.residual.as_deref()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn with_residual() {
        let sol = Solution::new(vec![1.0, 2.0], Some(vec![0.1, -0.2]));
        assert_eq!(sol.x(), &[1.0, 2.0]);
        assert_eq!(sol.residual(), Some(&[0.1, -0.2][..]));
    }

    #[test]
    fn without_residual() {
        let sol = Solution::new(vec![3.0], None);
        assert_eq!(sol.x(), &[3.0]);
        assert!(sol.residual().is_none());
    }

    #[test]
    fn clone_and_eq() {
        let a = Solution::new(vec![1.0], Some(vec![0.0]));
        assert_eq!(a, a.clone());
    }
}