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> |