src/dataterm.rs

branch
dev
changeset 35
b087e3eab191
parent 34
efa60bc4f743
equal deleted inserted replaced
34:efa60bc4f743 35:b087e3eab191
2 Basid definitions for data terms 2 Basid definitions for data terms
3 */ 3 */
4 4
5 use numeric_literals::replace_float_literals; 5 use numeric_literals::replace_float_literals;
6 6
7 use alg_tools::loc::Loc;
8 use alg_tools::euclidean::Euclidean; 7 use alg_tools::euclidean::Euclidean;
9 use alg_tools::linops::GEMV; 8 use alg_tools::linops::GEMV;
10 pub use alg_tools::norms::L1; 9 pub use alg_tools::norms::L1;
11 use alg_tools::norms::Norm; 10 use alg_tools::norms::Norm;
11 use alg_tools::instance::{Instance, Space};
12 12
13 use crate::types::*; 13 use crate::types::*;
14 pub use crate::types::L2Squared; 14 pub use crate::types::L2Squared;
15 use crate::measures::DiscreteMeasure; 15 use crate::measures::RNDM;
16 16
17 /// Calculates the residual $Aμ-b$. 17 /// Calculates the residual $Aμ-b$.
18 #[replace_float_literals(F::cast_from(literal))] 18 #[replace_float_literals(F::cast_from(literal))]
19 pub(crate) fn calculate_residual< 19 pub(crate) fn calculate_residual<
20 X : Space,
21 I : Instance<X>,
20 F : Float, 22 F : Float,
21 V : Euclidean<F> + Clone, 23 V : Euclidean<F> + Clone,
22 A : GEMV<F, DiscreteMeasure<Loc<F, N>, F>, Codomain = V>, 24 A : GEMV<F, X, Codomain = V>,
23 const N : usize
24 >( 25 >(
25 μ : &DiscreteMeasure<Loc<F, N>, F>, 26 μ : I,
26 opA : &A, 27 opA : &A,
27 b : &V 28 b : &V
28 ) -> V { 29 ) -> V {
29 let mut r = b.clone(); 30 let mut r = b.clone();
30 opA.gemv(&mut r, 1.0, μ, -1.0); 31 opA.gemv(&mut r, 1.0, μ, -1.0);
33 34
34 /// Calculates the residual $A(μ+μ_delta)-b$. 35 /// Calculates the residual $A(μ+μ_delta)-b$.
35 #[replace_float_literals(F::cast_from(literal))] 36 #[replace_float_literals(F::cast_from(literal))]
36 pub(crate) fn calculate_residual2< 37 pub(crate) fn calculate_residual2<
37 F : Float, 38 F : Float,
39 X : Space,
40 I : Instance<X>,
41 J : Instance<X>,
38 V : Euclidean<F> + Clone, 42 V : Euclidean<F> + Clone,
39 A : GEMV<F, DiscreteMeasure<Loc<F, N>, F>, Codomain = V>, 43 A : GEMV<F, X, Codomain = V>,
40 const N : usize
41 >( 44 >(
42 μ : &DiscreteMeasure<Loc<F, N>, F>, 45 μ : I,
43 μ_delta : &DiscreteMeasure<Loc<F, N>, F>, 46 μ_delta : J,
44 opA : &A, 47 opA : &A,
45 b : &V 48 b : &V
46 ) -> V { 49 ) -> V {
47 let mut r = b.clone(); 50 let mut r = b.clone();
48 opA.gemv(&mut r, 1.0, μ, -1.0); 51 opA.gemv(&mut r, 1.0, μ, -1.0);
56 pub trait DataTerm<F : Float, V, const N : usize> { 59 pub trait DataTerm<F : Float, V, const N : usize> {
57 /// Calculates $F(y)$, where $F$ is the data fidelity. 60 /// Calculates $F(y)$, where $F$ is the data fidelity.
58 fn calculate_fit(&self, _residual : &V) -> F; 61 fn calculate_fit(&self, _residual : &V) -> F;
59 62
60 /// Calculates $F(Aμ-b)$, where $F$ is the data fidelity. 63 /// Calculates $F(Aμ-b)$, where $F$ is the data fidelity.
61 fn calculate_fit_op<A : GEMV<F, DiscreteMeasure<Loc<F, N>, F>, Codomain = V>>( 64 fn calculate_fit_op<I, A : GEMV<F, RNDM<F, N>, Codomain = V>>(
62 &self, 65 &self,
63 μ : &DiscreteMeasure<Loc<F, N>, F>, 66 μ : I,
64 opA : &A, 67 opA : &A,
65 b : &V 68 b : &V
66 ) -> F 69 ) -> F
67 where V : Euclidean<F> + Clone { 70 where
68 let r = calculate_residual(&μ, opA, b); 71 V : Euclidean<F> + Clone,
72 I : Instance<RNDM<F, N>>,
73 {
74 let r = calculate_residual(μ, opA, b);
69 self.calculate_fit(&r) 75 self.calculate_fit(&r)
70 } 76 }
71 } 77 }
72 78
73 impl<F : Float, V : Euclidean<F>, const N : usize> 79 impl<F : Float, V : Euclidean<F>, const N : usize>

mercurial