4 #ifndef DDECAL_SOLVER_BASE_H
5 #define DDECAL_SOLVER_BASE_H
15 #include <aocommon/recursivefor.h>
17 #include "../constraints/Constraint.h"
18 #include "../linear_solvers/LLSSolver.h"
33 : data_(columns * rows,
Complex(0.0, 0.0)), columns_(columns) {}
36 return data_[column + row * columns_];
43 void Reset(
size_t columns,
size_t rows) {
44 size_t size = columns * rows;
46 if (size < data_.size()) {
51 data_.resize(size,
Complex(0.0, 0.0));
57 std::vector<Complex> data_;
64 std::vector<std::vector<ConstraintResult>>
results;
77 const std::vector<size_t>& n_solutions_per_direction,
78 size_t n_channel_blocks);
91 constraints_.push_back(std::move(constraint));
119 max_iterations_ = max_iterations;
129 min_iterations_ = min_iterations;
146 constraint_accuracy_ = constraint_accuracy;
165 detect_stalling_ = detect_stalling;
166 step_diff_sigma_ = step_diff_sigma;
206 std::vector<std::vector<DComplex>>& solutions,
208 throw std::logic_error(
209 "Full-visibility solver called for a solver that does not "
210 "support full-visibility solving");
214 std::vector<std::vector<DComplex>>& solutions,
216 throw std::logic_error(
217 "Duo-visibility (xx/yy) solver called for a solver that does not "
218 "support duo-visibility solving");
222 std::vector<std::vector<DComplex>>& solutions,
224 throw std::logic_error(
225 "Single-visibility (xx/yy) solver called for a solver that does not "
226 "support single-visibility solving");
233 void Step(
const std::vector<std::vector<DComplex>>& solutions,
237 const std::vector<double>& step_magnitudes);
240 std::vector<std::vector<DComplex>>& solutions);
243 std::vector<std::vector<DComplex>>& solutions);
246 std::vector<std::vector<DComplex>>& solutions);
251 bool has_previously_converged,
254 bool has_previously_converged,
258 bool constraints_satisfied)
const;
267 bool use_constraint_accuracy,
double& avg_abs_diff,
268 std::vector<double>& step_magnitudes)
const;
271 bool use_constraint_accuracy,
double& avg_abs_diff,
272 std::vector<double>& step_magnitudes)
const;
275 bool constraints_satisfied,
276 const std::vector<double>& step_magnitudes) {
277 bool has_stalled =
false;
278 if (detect_stalling_ && constraints_satisfied)
279 has_stalled =
DetectStall(iteration, step_magnitudes);
281 const bool is_ready = iteration >= max_iterations_ ||
282 (has_converged && constraints_satisfied) ||
284 return iteration >= min_iterations_ && is_ready;
332 size_t n_directions_;
333 size_t n_channel_blocks_;
334 size_t n_sub_solutions_;
340 size_t min_iterations_;
341 size_t max_iterations_;
343 double constraint_accuracy_;
345 bool detect_stalling_;
346 double step_diff_sigma_;
349 std::vector<std::unique_ptr<Constraint>> constraints_;
Definition: SolveData.h:29
Definition: SolverBase.h:29
void Reset(size_t columns, size_t rows)
Definition: SolverBase.h:43
Matrix(size_t columns, size_t rows)
Definition: SolverBase.h:32
Complex * data()
Definition: SolverBase.h:38
void SetZero()
Definition: SolverBase.h:34
Matrix()
Definition: SolverBase.h:31
Complex & operator()(size_t column, size_t row)
Definition: SolverBase.h:35
Definition: SolverBase.h:24
bool GetDetectStalling() const
Definition: SolverBase.h:168
double GetStepSize() const
Definition: SolverBase.h:157
LLSSolverType GetLLSSolverType() const
Definition: SolverBase.h:177
void SetStepSize(double step_size)
Definition: SolverBase.h:156
bool ReachedStoppingCriterion(size_t iteration, bool has_converged, bool constraints_satisfied, const std::vector< double > &step_magnitudes)
Definition: SolverBase.h:274
void PrepareConstraints()
SolveResult MakeResult(size_t iteration, bool has_converged, bool constraints_satisfied) const
bool DetectStall(size_t iteration, const std::vector< double > &step_magnitudes)
size_t NSubThreads() const
size_t GetMaxIterations() const
Definition: SolverBase.h:117
void SetMinIterations(size_t min_iterations)
Definition: SolverBase.h:128
double GetAccuracy() const
Definition: SolverBase.h:138
virtual void Initialize(size_t n_antennas, const std::vector< size_t > &n_solutions_per_direction, size_t n_channel_blocks)
void SetLLSSolverType(LLSSolverType solver_type)
bool ApplyConstraints(size_t iteration, double time, bool has_previously_converged, SolutionTensor &next_solutions) const
const std::vector< std::unique_ptr< Constraint > > & GetConstraints()
Definition: SolverBase.h:99
static void MakeSolutionsFinite1Pol(std::vector< std::vector< DComplex >> &solutions)
size_t NAntennas() const
Definition: SolverBase.h:287
virtual bool SupportsDdSolutionIntervals() const
Definition: SolverBase.h:185
bool GetPhaseOnly() const
Definition: SolverBase.h:109
void SetAccuracy(double accuracy)
Definition: SolverBase.h:137
void SetPhaseOnly(bool phase_only)
Definition: SolverBase.h:110
double GetConstraintAccuracy() const
Definition: SolverBase.h:148
bool AssignSolutions(std::vector< std::vector< DComplex >> &solutions, SolutionSpan &new_solutions, bool use_constraint_accuracy, double &avg_abs_diff, std::vector< double > &step_magnitudes) const
std::complex< float > Complex
Definition: SolverBase.h:27
void Step(const std::vector< std::vector< DComplex >> &solutions, SolutionTensor &next_solutions) const
size_t NChannelBlocks() const
Definition: SolverBase.h:289
static void MakeSolutionsFinite4Pol(std::vector< std::vector< DComplex >> &solutions)
size_t NDirections() const
Definition: SolverBase.h:288
std::complex< double > DComplex
Definition: SolverBase.h:26
virtual ~SolverBase()=default
void SetMaxIterations(size_t max_iterations)
Definition: SolverBase.h:118
bool ApplyConstraints(size_t iteration, double time, bool has_previously_converged, SolutionSpan &next_solutions) const
void SetConstraintAccuracy(double constraint_accuracy)
Definition: SolverBase.h:145
std::unique_ptr< LLSSolver > CreateLLSSolver(size_t m, size_t n, size_t nrhs) const
static void MakeSolutionsFinite2Pol(std::vector< std::vector< DComplex >> &solutions)
void SetDdConstraintWeights(const std::vector< std::vector< double >> &weights)
virtual std::vector< SolverBase * > ConstraintSolvers()
Definition: SolverBase.h:193
size_t NSubSolutions() const
Definition: SolverBase.h:295
virtual SolveResult Solve(const DuoSolveData &data, std::vector< std::vector< DComplex >> &solutions, double time)
Definition: SolverBase.h:213
size_t NVisibilities() const
Definition: SolverBase.h:299
void GetTimings(std::ostream &os, double duration) const
virtual SolveResult Solve(const FullSolveData &data, std::vector< std::vector< DComplex >> &solutions, double time)
Definition: SolverBase.h:205
bool AssignSolutions(std::vector< std::vector< DComplex >> &solutions, SolutionTensor &new_solutions, bool use_constraint_accuracy, double &avg_abs_diff, std::vector< double > &step_magnitudes) const
virtual SolveResult Solve(const UniSolveData &data, std::vector< std::vector< DComplex >> &solutions, double time)
Definition: SolverBase.h:221
virtual size_t NSolutionPolarizations() const =0
void SetDetectStalling(bool detect_stalling, double step_diff_sigma)
Definition: SolverBase.h:164
std::unique_ptr< aocommon::RecursiveFor > MakeOptionalRecursiveFor() const
size_t GetMinIterations() const
Definition: SolverBase.h:127
void AddConstraint(std::unique_ptr< Constraint > constraint)
Definition: SolverBase.h:89
xt::xtensor< std::complex< double >, 4 > SolutionTensor
Definition: Solutions.h:19
aocommon::xt::Span< std::complex< double >, 4 > SolutionSpan
Definition: Solutions.h:20
LLSSolverType
Definition: LLSSolver.h:18
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53
Definition: SolverBase.h:61
size_t iterations
Definition: SolverBase.h:62
size_t constraint_iterations
Definition: SolverBase.h:63
std::vector< std::vector< ConstraintResult > > results
Definition: SolverBase.h:64