1use std::sync::Arc;
2
3use diffsol::{DefaultDenseMatrix, DenseMatrix, Solution as DiffsolSolution, Vector};
4
5use crate::tensor::{shared_tensor, Tensor, TensorLayout};
6
7pub(crate) trait Solution: Send + Sync {
13 fn get_ys(self: Arc<Self>) -> Tensor;
15 fn get_ts(self: Arc<Self>) -> Tensor;
17 fn get_sens(self: Arc<Self>) -> Vec<Tensor>;
19}
20
21impl<V> Solution for DiffsolSolution<V>
22where
23 V: Vector + DefaultDenseMatrix + Send + Sync + 'static,
24 <V as DefaultDenseMatrix>::M: DenseMatrix + Send + Sync + TensorLayout,
25 Vec<V::T>: TensorLayout,
26{
27 fn get_sens(self: Arc<Self>) -> Vec<Tensor> {
28 (0..self.y_sens.len())
29 .map(|i| {
30 let nt = self.ts.len();
31 shared_tensor(self.clone(), |s| &s.y_sens[i]).truncate_axis(1, nt)
33 })
34 .collect()
35 }
36
37 fn get_ts(self: Arc<Self>) -> Tensor {
38 shared_tensor(self, |s| &s.ts)
39 }
40
41 fn get_ys(self: Arc<Self>) -> Tensor {
42 let nt = self.ts.len();
43 shared_tensor(self, |s| &s.ys).truncate_axis(1, nt)
45 }
46}