use nalgebra::{ComplexField, DVector, RealField};
use num_traits::Float;
use super::{DiscreteSystem, Siso};
use crate::{Discrete, StateSpace, StateSpaceError};
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Mimo;
impl<T: Float + ComplexField + RealField> DiscreteSystem<T, Mimo> {
pub fn update(&mut self, u: &[T]) -> Result<Vec<T>, StateSpaceError> {
if u.len() != self.model.order.input {
return Err(StateSpaceError::InputVector {
expected_row: self.model.order.input,
actual_rows: u.len()
})
}
let u: DVector<T> = DVector::from_row_slice(u);
self.output = (&self.model.c * &self.state) + (&self.model.d * &u);
self.state = (&self.model.a * &self.state) + (&self.model.b * &u);
Ok(self.output.as_slice().to_vec())
}
}
impl<T: Float + ComplexField + RealField> From<StateSpace<T, Discrete>> for DiscreteSystem<T, Mimo> {
fn from(model: StateSpace<T, Discrete>) -> Self {
Self::at_rest(model)
}
}
impl<T: Float + ComplexField + RealField> From<&StateSpace<T, Discrete>> for DiscreteSystem<T, Mimo> {
fn from(model: &StateSpace<T, Discrete>) -> Self {
Self::at_rest(model.clone())
}
}
impl<T: Float + ComplexField + RealField> From<DiscreteSystem<T, Siso>> for DiscreteSystem<T, Mimo> {
fn from(system: DiscreteSystem<T, Siso>) -> Self {
system.with_kind()
}
}