1mod adaptive_alternating_projection;
13mod admm;
14mod alternating_projection;
15mod common;
16mod epry;
17mod fpie;
18mod gauge;
19mod global_gauss_newton;
20mod gradient_descent;
21mod joint_reconstruction;
22mod metrics;
23mod mpie;
24pub mod objective;
25mod regularization;
26
27pub use adaptive_alternating_projection::{
28 AdaptiveAlternatingProjection, AdaptiveAlternatingProjectionIterationMetrics,
29};
30pub use admm::{Admm, AdmmIterationMetrics};
31pub use alternating_projection::AlternatingProjection;
32pub use epry::Epry;
33pub use fpie::Fpie;
34pub use global_gauss_newton::{GlobalGaussNewton, GlobalGaussNewtonIterationMetrics};
35pub use gradient_descent::{GradientDescent, GradientDescentIterationMetrics};
36pub use joint_reconstruction::{
37 JointIterationMetrics, JointReconstruction, JointReconstructionResult,
38};
39pub use metrics::{AlgorithmIterationMetrics, NoIterationMetrics, StepOutput, StepSummary};
40pub use mpie::Mpie;
41
42use crate::{
43 Result,
44 backend::Backend,
45 callbacks::Callback,
46 measurements::MeasurementRead,
47 reconstruction::{
48 Batch, ReconstructionCheckpoint, ReconstructionProblem, ReconstructionResult,
49 ReconstructionState, RunOptions, Runner,
50 },
51};
52use std::sync::Arc;
53
54pub trait ReconstructionAlgorithm {
61 type IterationMetrics: AlgorithmIterationMetrics;
63
64 fn validate(&self) -> Result<()> {
66 Ok(())
67 }
68
69 fn validate_problem<M: MeasurementRead>(
71 &self,
72 _problem: &ReconstructionProblem<M>,
73 ) -> Result<()> {
74 Ok(())
75 }
76
77 fn initialize<M: MeasurementRead>(
79 &self,
80 problem: &ReconstructionProblem<M>,
81 ) -> Result<ReconstructionState> {
82 ReconstructionState::initialize(problem)
83 }
84
85 fn initialize_with_backend<M: MeasurementRead>(
87 &self,
88 problem: &ReconstructionProblem<M>,
89 backend: Arc<dyn Backend>,
90 ) -> Result<ReconstructionState> {
91 ReconstructionState::initialize_with_backend(problem, backend)
92 }
93
94 fn canonicalize_state<M: MeasurementRead>(
104 &self,
105 _problem: &ReconstructionProblem<M>,
106 _state: &mut ReconstructionState,
107 ) -> Result<()> {
108 Ok(())
109 }
110
111 fn supports_joint_reconstruction(&self) -> bool {
118 true
119 }
120
121 fn step<M: MeasurementRead>(
123 &mut self,
124 problem: &ReconstructionProblem<M>,
125 state: &mut ReconstructionState,
126 batch: &Batch,
127 iteration: usize,
128 ) -> Result<StepOutput<Self::IterationMetrics>>;
129
130 fn iterations(&self) -> usize;
132
133 fn batch_size(&self) -> usize {
135 1
136 }
137
138 fn run<M: MeasurementRead>(
140 self,
141 problem: &ReconstructionProblem<M>,
142 ) -> Result<ReconstructionResult>
143 where
144 Self: Sized,
145 {
146 let options = RunOptions {
147 max_iterations: self.iterations(),
148 batch_size: self.batch_size(),
149 ..RunOptions::default()
150 };
151 Runner::new(self, options).run(problem)
152 }
153
154 fn run_with_callbacks<M: MeasurementRead>(
156 self,
157 problem: &ReconstructionProblem<M>,
158 callbacks: Vec<Box<dyn Callback>>,
159 ) -> Result<ReconstructionResult>
160 where
161 Self: Sized,
162 {
163 let options = RunOptions {
164 max_iterations: self.iterations(),
165 batch_size: self.batch_size(),
166 ..RunOptions::default()
167 };
168 Runner::new(self, options)
169 .with_callbacks(callbacks)
170 .run(problem)
171 }
172
173 fn run_from_checkpoint<M: MeasurementRead>(
175 self,
176 problem: &ReconstructionProblem<M>,
177 checkpoint: ReconstructionCheckpoint,
178 ) -> Result<ReconstructionResult>
179 where
180 Self: Sized,
181 {
182 let options = RunOptions {
183 max_iterations: self.iterations(),
184 batch_size: self.batch_size(),
185 ..RunOptions::default()
186 };
187 Runner::new(self, options)
188 .resume_from(checkpoint)
189 .run(problem)
190 }
191}