use gmt_dos_clients_fem::{DiscreteStateSpace, StateSpaceError, solvers::ExponentialMatrix};
use nalgebra::{DMatrix, DMatrixView};
use crate::builder::Include;
#[derive(Debug, Default, Clone)]
pub struct VoiceCoils {
ins_transforms: Vec<DMatrix<f64>>,
outs_transforms: Vec<DMatrix<f64>>,
}
impl VoiceCoils {
pub fn new(ins_transforms: Vec<DMatrix<f64>>) -> Self {
let outs_transforms: Vec<_> = ins_transforms.iter().map(|x| x.transpose()).collect();
Self {
ins_transforms,
outs_transforms,
}
}
pub fn n_modes(&self) -> Option<Vec<usize>> {
if self.ins_transforms.is_empty() {
None
} else {
Some(self.ins_transforms.iter().map(|x| x.ncols()).collect())
}
}
pub(crate) fn ins_transforms_view<'a>(&'a self) -> Vec<DMatrixView<'a, f64>> {
self.ins_transforms.iter().map(|x| x.as_view()).collect()
}
pub(crate) fn outs_transforms_view<'a>(&'a self) -> Vec<DMatrixView<'a, f64>> {
self.outs_transforms.iter().map(|x| x.as_view()).collect()
}
}
impl<'a> Include<'a, VoiceCoils> for DiscreteStateSpace<'a, ExponentialMatrix> {
fn including(self, voice_coils: Option<&'a mut VoiceCoils>) -> Result<Self, StateSpaceError> {
if let Some(voice_coils) = voice_coils {
self.including_asms(
Some(vec![1, 2, 3, 4, 5, 6, 7]),
Some(voice_coils.ins_transforms_view()),
Some(voice_coils.outs_transforms_view()),
)
} else {
self.including_asms(Some(vec![1, 2, 3, 4, 5, 6, 7]), None, None)
}
}
}