51 /// It is assumed to be a [`Euclidean`] space, and therefore also (identified with) |
51 /// It is assumed to be a [`Euclidean`] space, and therefore also (identified with) |
52 /// the domain of the preadjoint. |
52 /// the domain of the preadjoint. |
53 type Observable : Euclidean<F, Output=Self::Observable> |
53 type Observable : Euclidean<F, Output=Self::Observable> |
54 + AXPY<F> |
54 + AXPY<F> |
55 + Clone; |
55 + Clone; |
56 |
56 /// Finite-dimensional model for weight optimisation |
57 /// Return A_*A and A_* b |
57 type FindimModel : Linear<DVector<F::MixedType>, Codomain=Self::Observable>; |
|
58 |
|
59 /// Return A_*A and A_* b instantiated at the locations of the spikes of `μ`. |
58 fn findim_quadratic_model( |
60 fn findim_quadratic_model( |
59 &self, |
61 &self, |
60 μ : &DiscreteMeasure<Domain, F>, |
62 μ : &DiscreteMeasure<Domain, F>, |
61 b : &Self::Observable |
63 b : &Self::Observable |
62 ) -> (DMatrix<F::MixedType>, DVector<F::MixedType>); |
64 ) -> (DMatrix<F::MixedType>, DVector<F::MixedType>); |
|
65 |
|
66 /// Return A instantiated at the locations of the spikes of `μ` |
|
67 fn findim_model( |
|
68 &self, |
|
69 μ : &DiscreteMeasure<Domain, F>, |
|
70 ) -> Self::FindimModel; |
63 |
71 |
64 /// Write an observable into a file. |
72 /// Write an observable into a file. |
65 fn write_observable(&self, b : &Self::Observable, prefix : String) -> DynError; |
73 fn write_observable(&self, b : &Self::Observable, prefix : String) -> DynError; |
66 |
74 |
67 /// Returns a zero observable |
75 /// Returns a zero observable |
515 P : Spread<F, N>, |
523 P : Spread<F, N>, |
516 Convolution<S, P> : Spread<F, N>, |
524 Convolution<S, P> : Spread<F, N>, |
517 ShiftedSensor<F, S, P, N> : LocalAnalysis<F, BT::Agg, N>, |
525 ShiftedSensor<F, S, P, N> : LocalAnalysis<F, BT::Agg, N>, |
518 Weighted<ShiftedSensor<F, S, P, N>, F> : LocalAnalysis<F, BT::Agg, N> { |
526 Weighted<ShiftedSensor<F, S, P, N>, F> : LocalAnalysis<F, BT::Agg, N> { |
519 type Observable = DVector<F>; |
527 type Observable = DVector<F>; |
|
528 type FindimModel = DMatrix<F>; |
520 |
529 |
521 fn findim_quadratic_model( |
530 fn findim_quadratic_model( |
522 &self, |
531 &self, |
523 μ : &DiscreteMeasure<Loc<F, N>, F>, |
532 μ : &DiscreteMeasure<Loc<F, N>, F>, |
524 b : &Self::Observable |
533 b : &Self::Observable |
525 ) -> (DMatrix<F::MixedType>, DVector<F::MixedType>) { |
534 ) -> (DMatrix<F::MixedType>, DVector<F::MixedType>) { |
526 assert_eq!(b.len(), self.n_sensors()); |
535 assert_eq!(b.len(), self.n_sensors()); |
|
536 let mA = self.findim_model(μ); |
|
537 let mAt = mA.transpose(); |
|
538 (&mAt * mA, &mAt * b) |
|
539 } |
|
540 |
|
541 fn findim_model( |
|
542 &self, |
|
543 μ : &DiscreteMeasure<Loc<F, N>, F>, |
|
544 ) -> DMatrix<F::MixedType> { |
527 let mut mA = DMatrix::zeros(self.n_sensors(), μ.len()); |
545 let mut mA = DMatrix::zeros(self.n_sensors(), μ.len()); |
528 let grid = self.grid(); |
546 let grid = self.grid(); |
529 for (mut mAcol, δ) in mA.column_iter_mut().zip(μ.iter_spikes()) { |
547 for (mut mAcol, δ) in mA.column_iter_mut().zip(μ.iter_spikes()) { |
530 for &d in self.bt.iter_at(&δ.x) { |
548 for &d in self.bt.iter_at(&δ.x) { |
531 let sensor = self.shifted_sensor(grid.entry_linear_unchecked(d)); |
549 let sensor = self.shifted_sensor(grid.entry_linear_unchecked(d)); |
532 mAcol[d] += sensor.apply(&δ.x); |
550 mAcol[d] += sensor.apply(&δ.x); |
533 } |
551 } |
534 } |
552 } |
535 let mAt = mA.transpose(); |
553 mA |
536 (&mAt * mA, &mAt * b) |
|
537 } |
554 } |
538 |
555 |
539 fn write_observable(&self, b : &Self::Observable, prefix : String) -> DynError { |
556 fn write_observable(&self, b : &Self::Observable, prefix : String) -> DynError { |
540 let it = self.grid().into_iter().zip(b.iter()).map(|(x, &v)| (x, v)); |
557 let it = self.grid().into_iter().zip(b.iter()).map(|(x, &v)| (x, v)); |
541 write_csv(it, prefix + ".txt") |
558 write_csv(it, prefix + ".txt") |