| 51 use alg_tools::error::DynResult; |
51 use alg_tools::error::DynResult; |
| 52 use alg_tools::iterate::AlgIteratorFactory; |
52 use alg_tools::iterate::AlgIteratorFactory; |
| 53 use alg_tools::linops::{Mapping, Space, AXPY}; |
53 use alg_tools::linops::{Mapping, Space, AXPY}; |
| 54 use alg_tools::mapping::{DataTerm, Instance}; |
54 use alg_tools::mapping::{DataTerm, Instance}; |
| 55 use alg_tools::nalgebra_support::ToNalgebraRealField; |
55 use alg_tools::nalgebra_support::ToNalgebraRealField; |
| |
56 use alg_tools::norms::Norm; |
| 56 use anyhow::ensure; |
57 use anyhow::ensure; |
| 57 use clap::ValueEnum; |
58 use clap::ValueEnum; |
| |
59 use measures::Radon; |
| 58 use numeric_literals::replace_float_literals; |
60 use numeric_literals::replace_float_literals; |
| 59 use serde::{Deserialize, Serialize}; |
61 use serde::{Deserialize, Serialize}; |
| 60 |
62 |
| 61 /// Acceleration |
63 /// Acceleration |
| 62 #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, ValueEnum, Debug)] |
64 #[derive(Clone, Copy, Eq, PartialEq, Serialize, Deserialize, ValueEnum, Debug)] |
| 154 F: Float + ToNalgebraRealField, |
156 F: Float + ToNalgebraRealField, |
| 155 I: AlgIteratorFactory<IterInfo<F>>, |
157 I: AlgIteratorFactory<IterInfo<F>>, |
| 156 A: ForwardModel<DiscreteMeasure<U, F>, F>, |
158 A: ForwardModel<DiscreteMeasure<U, F>, F>, |
| 157 for<'b> &'b A::Observable: Instance<A::Observable>, |
159 for<'b> &'b A::Observable: Instance<A::Observable>, |
| 158 A::Observable: AXPY<Field = F>, |
160 A::Observable: AXPY<Field = F>, |
| 159 DiscreteMeasure<U, F>: SpikeMerging<F>, |
161 DiscreteMeasure<U, F>: SpikeMerging<F> + Norm<Radon, F>, |
| 160 Reg: RegTerm<U, F>, |
162 Reg: RegTerm<U, F>, |
| 161 Phi: Conjugable<A::Observable, F>, |
163 Phi: Conjugable<A::Observable, F>, |
| 162 for<'b> Phi::Conjugate<'b>: Prox<A::Observable>, |
164 for<'b> Phi::Conjugate<'b>: Prox<A::Observable>, |
| 163 P: ProxPenalty<U, A::PreadjointCodomain, Reg, F> |
165 P: ProxPenalty<U, A::PreadjointCodomain, Reg, F> |
| 164 + StepLengthBoundPD<F, A, DiscreteMeasure<U, F>>, |
166 + StepLengthBoundPD<F, A, DiscreteMeasure<U, F>>, |
| 190 let mut μ = μ0.unwrap_or_else(|| DiscreteMeasure::new()); |
192 let mut μ = μ0.unwrap_or_else(|| DiscreteMeasure::new()); |
| 191 let mut y = f.residual(&μ); |
193 let mut y = f.residual(&μ); |
| 192 let full_stats = |μ: &DiscreteMeasure<U, F>, ε, stats| IterInfo { |
194 let full_stats = |μ: &DiscreteMeasure<U, F>, ε, stats| IterInfo { |
| 193 value: f.apply(μ) + reg.apply(μ), |
195 value: f.apply(μ) + reg.apply(μ), |
| 194 n_spikes: μ.len(), |
196 n_spikes: μ.len(), |
| |
197 μ_norm: μ.norm(Radon), |
| 195 ε, |
198 ε, |
| 196 // postprocessing: config.postprocessing.then(|| μ.clone()), |
199 // postprocessing: config.postprocessing.then(|| μ.clone()), |
| 197 ..stats |
200 ..stats |
| 198 }; |
201 }; |
| 199 let mut stats = IterInfo::new(); |
202 let mut stats = IterInfo::new(); |