pub trait Flatten: Sized {
fn flat_dim() -> usize;
fn flatten(&self) -> Vec<f64>;
fn unflatten(flat: &[f64]) -> Self;
}
impl Flatten for f64 {
fn flat_dim() -> usize {
1
}
fn flatten(&self) -> Vec<f64> {
vec![*self]
}
fn unflatten(flat: &[f64]) -> Self {
assert_eq!(flat.len(), 1);
flat[0]
}
}
impl Flatten for Vec<f64> {
fn flat_dim() -> usize {
panic!("Vec<f64> has no fixed dimension; use .flatten().len() on an instance instead")
}
fn flatten(&self) -> Vec<f64> {
self.clone()
}
fn unflatten(flat: &[f64]) -> Self {
flat.to_vec()
}
}