DP3
DiagonalLowRankSolver.h
Go to the documentation of this file.
1 // Copyright (C) 2024 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DDECAL_DIAGONAL_LOW_RANK_SOLVER_H_
5 #define DDECAL_DIAGONAL_LOW_RANK_SOLVER_H_
6 
7 #include "SolverBase.h"
8 #include "SolveData.h"
9 
10 namespace dp3::ddecal {
11 
20 float DominantEigenPair(const xt::xtensor<std::complex<float>, 2>& matrix,
21  xt::xtensor<std::complex<float>, 1>& eigen_vector,
22  size_t n_iterations);
23 
33 float DominantEigenPairNear(const xt::xtensor<std::complex<float>, 2>& matrix,
34  xt::xtensor<std::complex<float>, 1>& eigen_vector,
35  size_t n_iterations);
36 
50 class DiagonalLowRankSolver final : public SolverBase {
51  public:
52  DiagonalLowRankSolver(size_t n_low_rank_approximation_iterations,
53  size_t n_power_iterations)
54  : SolverBase(),
55  n_low_rank_approximation_iterations_(
56  n_low_rank_approximation_iterations),
57  n_power_iterations_(n_power_iterations) {}
58 
60  std::vector<std::vector<DComplex>>& solutions,
61  double time) override;
62 
63  size_t NSolutionPolarizations() const override { return 2; }
64 
69  void SetNPowerIterations(size_t n_power_iterations) {
70  n_power_iterations_ = n_power_iterations;
71  }
72 
76  void SetNLowRankApproximationIterations(size_t n_iterations) {
77  n_low_rank_approximation_iterations_ = n_iterations;
78  }
79 
80  private:
81  void PerformIteration(size_t ch_block,
82  const FullSolveData::ChannelBlockData& cb_data,
83  std::vector<aocommon::MC2x2F>& v_residual,
84  const std::vector<DComplex>& solutions,
85  SolutionTensor& next_solutions, size_t iteration);
86 
91  double ChiSquared(const FullSolveData::ChannelBlockData& cb_data,
92  std::vector<aocommon::MC2x2F>& v_residual, size_t direction,
93  const SolutionSpan& solutions) const;
94 
95  void SolveDirectionSolution(size_t ch_block,
96  const FullSolveData::ChannelBlockData& cb_data,
97  const std::vector<aocommon::MC2x2F>& v_residual,
98  size_t direction_index, size_t solution_index,
99  const std::vector<DComplex>& solutions,
100  SolutionTensor& next_solutions);
101 
102  void CalculateNormPerDirection(const FullSolveData& data);
103 
104  std::vector<size_t> direction_ordering_;
105  size_t n_low_rank_approximation_iterations_ = 25;
106  size_t n_power_iterations_ = 10;
107 };
108 
109 } // namespace dp3::ddecal
110 
111 #endif // DDECAL_DIAGONAL_LOW_RANK_SOLVER_H_
Definition: DiagonalLowRankSolver.h:50
SolveResult Solve(const FullSolveData &data, std::vector< std::vector< DComplex >> &solutions, double time) override
void SetNPowerIterations(size_t n_power_iterations)
Definition: DiagonalLowRankSolver.h:69
DiagonalLowRankSolver(size_t n_low_rank_approximation_iterations, size_t n_power_iterations)
Definition: DiagonalLowRankSolver.h:52
size_t NSolutionPolarizations() const override
Definition: DiagonalLowRankSolver.h:63
void SetNLowRankApproximationIterations(size_t n_iterations)
Definition: DiagonalLowRankSolver.h:76
Definition: SolveData.h:29
Definition: SolverBase.h:24
Definition: AmplitudeOnlyConstraint.h:12
float DominantEigenPairNear(const xt::xtensor< std::complex< float >, 2 > &matrix, xt::xtensor< std::complex< float >, 1 > &eigen_vector, size_t n_iterations)
xt::xtensor< std::complex< double >, 4 > SolutionTensor
Definition: Solutions.h:19
aocommon::xt::Span< std::complex< double >, 4 > SolutionSpan
Definition: Solutions.h:20
float DominantEigenPair(const xt::xtensor< std::complex< float >, 2 > &matrix, xt::xtensor< std::complex< float >, 1 > &eigen_vector, size_t n_iterations)
Definition: SolverBase.h:61