src/forward_model.rs

changeset 2
7a953a87b6c1
parent 0
eb3c7813b67a
equal deleted inserted replaced
0:eb3c7813b67a 2:7a953a87b6c1
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")

mercurial