use crate::{types::admat, Ad};
use itertools::Itertools;
use na::{SMatrix, SVector};
#[inline]
pub fn scalar<const N: usize>(value: f64) -> Ad<N> {
Ad::inactive_scalar(value)
}
#[inline]
pub fn vector_from_slice<const N: usize, const L: usize>(values: &[f64]) -> SVector<Ad<N>, L> {
Ad::inactive_from_slice(values)
}
pub fn vectpr<const N: usize, const L: usize>(values: &[f64]) -> SVector<Ad<N>, L> {
Ad::inactive_from_slice(values)
}
pub fn matrix_from_row_slice<const N: usize, const R: usize, const C: usize>(
values: &[f64],
) -> SMatrix<Ad<N>, R, C> {
assert_eq!(
values.len(),
R * C,
"Slice mismatch matrix dimensions: found {}, expected : {} ({}x{})",
values.len(),
R * C,
R,
C
);
let mut res: admat<N, R, C> = SMatrix::zeros();
for (r, c) in (0..R).cartesian_product(0..C) {
res[(r, c)].value = values[r * C + c];
}
res
}
pub fn matrix_from_column_slice<const N: usize, const R: usize, const C: usize>(
values: &[f64],
) -> SMatrix<Ad<N>, R, C> {
assert_eq!(
values.len(),
R * C,
"Slice mismatch matrix dimensions: found {}, expected: {} ({}x{})",
values.len(),
R * C,
R,
C
);
let mut res: admat<N, R, C> = SMatrix::zeros();
for (r, c) in (0..R).cartesian_product(0..C) {
res[(r, c)].value = values[c * R + r];
}
res
}
pub fn valmat<const N: usize, const R: usize, const C: usize>(
matrix: SMatrix<f64, R, C>,
) -> SMatrix<Ad<N>, R, C> {
let mut res: admat<N, R, C> = SMatrix::zeros();
for (r, c) in (0..R).cartesian_product(0..C) {
res[(r, c)].value = matrix[(r, c)];
}
res
}