DP3
Constraint.h
Go to the documentation of this file.
1 // Copyright (C) 2020 ASTRON (Netherlands Institute for Radio Astronomy)
2 // SPDX-License-Identifier: GPL-3.0-or-later
3 
4 #ifndef DP3_DDECAL_CONSTRAINT_H_
5 #define DP3_DDECAL_CONSTRAINT_H_
6 
7 #include <complex>
8 #include <numeric>
9 #include <ostream>
10 #include <vector>
11 
12 #include <xtensor/containers/xtensor.hpp>
13 
14 #include "ConstraintResult.h"
15 
16 #include "../Solutions.h"
17 
18 namespace dp3::ddecal {
19 
27 class Constraint {
28  public:
29  typedef std::complex<double> dcomplex;
30  virtual ~Constraint() = default;
31 
47  virtual void PrepareIteration([[maybe_unused]] bool hasReachedPrecision,
48  [[maybe_unused]] size_t iteration,
49  [[maybe_unused]] bool finalIter) {}
50 
58  virtual bool Satisfied() const { return true; }
59 
69  virtual void Apply(SolutionSpan& solutions, double time) = 0;
70 
81  virtual std::vector<ConstraintResult> GetResult() const { return {}; }
82 
88  virtual void Initialize(size_t n_antennas,
89  const std::vector<uint32_t>& solutions_per_direction,
90  const std::vector<double>& frequencies) {
91  assert(n_antennas != 0);
92  assert(!solutions_per_direction.empty());
93  assert(!frequencies.empty());
94  n_antennas_ = n_antennas;
95  solutions_per_direction_ = solutions_per_direction;
96  n_channel_blocks_ = frequencies.size();
97  n_sub_solutions_ = std::accumulate(solutions_per_direction.begin(),
98  solutions_per_direction.end(), 0u);
99  assert(n_sub_solutions_ != 0);
100  }
101 
106  virtual void SetWeights([[maybe_unused]] const std::vector<double>& weights) {
107  }
108 
116  virtual void SetSubSolutionWeights(
117  const std::vector<std::vector<double>>& solution_weights) {}
118 
119  virtual void GetTimings([[maybe_unused]] std::ostream& os,
120  [[maybe_unused]] double duration) const {}
121 
122  size_t NAntennas() const { return n_antennas_; }
123  size_t NDirections() const { return solutions_per_direction_.size(); }
129  size_t NSubSolutions() const { return n_sub_solutions_; }
130  size_t NChannelBlocks() const { return n_channel_blocks_; }
131  uint32_t GetSubSolutions(size_t direction) const {
132  return solutions_per_direction_[direction];
133  }
134 
135  static bool isfinite(const dcomplex& value) {
136  return std::isfinite(value.real()) && std::isfinite(value.imag());
137  }
138 
144 
145  private:
146  size_t n_antennas_ = 0;
147  size_t n_channel_blocks_ = 0;
148  size_t n_sub_solutions_ = 0;
149  std::vector<uint32_t> solutions_per_direction_;
150 };
151 
152 } // namespace dp3::ddecal
153 
154 #endif
This class is the base class for classes that implement a constraint on calibration solutions....
Definition: Constraint.h:27
size_t NAntennas() const
Definition: Constraint.h:122
size_t NChannelBlocks() const
Definition: Constraint.h:130
void ApplyReferenceAntenna(SolutionSpan &solutions)
static bool isfinite(const dcomplex &value)
Definition: Constraint.h:135
std::complex< double > dcomplex
Definition: Constraint.h:29
size_t NDirections() const
Definition: Constraint.h:123
virtual bool Satisfied() const
Definition: Constraint.h:58
virtual std::vector< ConstraintResult > GetResult() const
Definition: Constraint.h:81
virtual void SetWeights([[maybe_unused]] const std::vector< double > &weights)
Definition: Constraint.h:106
virtual void Initialize(size_t n_antennas, const std::vector< uint32_t > &solutions_per_direction, const std::vector< double > &frequencies)
Definition: Constraint.h:88
virtual ~Constraint()=default
virtual void Apply(SolutionSpan &solutions, double time)=0
uint32_t GetSubSolutions(size_t direction) const
Definition: Constraint.h:131
virtual void SetSubSolutionWeights(const std::vector< std::vector< double >> &solution_weights)
Definition: Constraint.h:116
virtual void PrepareIteration([[maybe_unused]] bool hasReachedPrecision, [[maybe_unused]] size_t iteration, [[maybe_unused]] bool finalIter)
Definition: Constraint.h:47
size_t NSubSolutions() const
Definition: Constraint.h:129
virtual void GetTimings([[maybe_unused]] std::ostream &os, [[maybe_unused]] double duration) const
Definition: Constraint.h:119
Definition: AmplitudeOnlyConstraint.h:12
aocommon::xt::Span< std::complex< double >, 4 > SolutionSpan
Definition: Solutions.h:20