DP3
HybridSolver.h
Go to the documentation of this file.
1 // Copyright (C) 2021 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DDECAL_HYBRID_SOLVER_H
5 #define DDECAL_HYBRID_SOLVER_H
6 
7 #include "SolverBase.h"
8 
9 namespace dp3 {
10 namespace ddecal {
11 
24 class HybridSolver final : public SolverBase {
25  public:
26  HybridSolver() : stop_on_convergence_(false) {}
27 
28  void Initialize(size_t n_antennas,
29  const std::vector<size_t>& n_solutions_per_direction,
30  size_t n_channel_blocks) override {
31  SolverBase::Initialize(n_antennas, n_solutions_per_direction,
32  n_channel_blocks);
33  for (const std::pair<std::unique_ptr<SolverBase>, size_t>& solver_info :
34  solvers_) {
35  solver_info.first->Initialize(n_antennas, n_solutions_per_direction,
36  n_channel_blocks);
37  }
38  }
39 
40  size_t NSolutionPolarizations() const override {
41  return solvers_.empty() ? 0
42  : solvers_.front().first->NSolutionPolarizations();
43  }
44 
50  void AddSolver(std::unique_ptr<SolverBase> solver);
51 
57  std::vector<SolverBase*> ConstraintSolvers() override {
58  std::vector<SolverBase*> solvers;
59  for (const auto& solverinfo : solvers_)
60  solvers.push_back(solverinfo.first.get());
61  return solvers;
62  }
63 
69  bool StopOnConvergence() const { return stop_on_convergence_; }
70  void SetStopOnConvergence(bool stop_on_convergence) {
71  stop_on_convergence_ = stop_on_convergence;
72  }
75  SolveResult Solve(const FullSolveData& solve_data,
76  std::vector<std::vector<DComplex>>& solutions,
77  double time) override;
78 
79  private:
80  bool RunSolver(SolverBase& solver, size_t& available_iterations,
81  SolveResult& result, const FullSolveData& solve_data,
82  std::vector<std::vector<DComplex>>& solutions, double time);
83 
84  // List of solvers with their maximum number of iterations
85  std::vector<std::pair<std::unique_ptr<SolverBase>, size_t>> solvers_;
86  bool stop_on_convergence_;
87 };
88 
89 } // namespace ddecal
90 } // namespace dp3
91 
92 #endif // DDECAL_HYBRID_SOLVER_H
Definition: HybridSolver.h:24
size_t NSolutionPolarizations() const override
Definition: HybridSolver.h:40
void SetStopOnConvergence(bool stop_on_convergence)
Definition: HybridSolver.h:70
std::vector< SolverBase * > ConstraintSolvers() override
Definition: HybridSolver.h:57
SolveResult Solve(const FullSolveData &solve_data, std::vector< std::vector< DComplex >> &solutions, double time) override
HybridSolver()
Definition: HybridSolver.h:26
bool StopOnConvergence() const
Definition: HybridSolver.h:69
void AddSolver(std::unique_ptr< SolverBase > solver)
void Initialize(size_t n_antennas, const std::vector< size_t > &n_solutions_per_direction, size_t n_channel_blocks) override
Definition: HybridSolver.h:28
Definition: SolveData.h:29
Definition: SolverBase.h:24
virtual void Initialize(size_t n_antennas, const std::vector< size_t > &n_solutions_per_direction, size_t n_channel_blocks)
This file has generic helper routines for testing steps.
Definition: AntennaConfig.h:53
Definition: SolverBase.h:61