SOPT
Sparse OPTimisation
utilities.h
Go to the documentation of this file.
1 #ifndef SOPT_MPI_UTILITIES_H
2 #define SOPT_MPI_UTILITIES_H
3 
4 #include "sopt/config.h"
5 #ifdef SOPT_MPI
6 #include <Eigen/Core>
7 #include "sopt/maths.h"
9 #include "sopt/real_type.h"
10 
11 namespace sopt::mpi {
12 
14 template <typename T>
15 typename real_type<typename T::Scalar>::type l2_norm(Eigen::MatrixBase<T> const &x,
16  Communicator const &comm) {
17  return std::sqrt(comm.all_sum_all(x.squaredNorm()));
18 }
19 
21 template <typename T0, typename T1>
22 typename real_type<typename T0::Scalar>::type l2_norm(Eigen::ArrayBase<T0> const &input,
23  Eigen::ArrayBase<T1> const &weights,
24  Communicator const &comm) {
25  if (weights.size() == 1) {
26  auto const weight_2 = std::real(weights(0) * std::conj(weights(0)));
27  return std::sqrt(comm.all_sum_all(input.matrix().squaredNorm() * weight_2));
28  }
29  return sopt::mpi::l2_norm((input * weights).matrix(), comm);
30 }
32 template <typename T0, typename T1>
33 typename real_type<typename T0::Scalar>::type l2_norm(Eigen::MatrixBase<T0> const &input,
34  Eigen::MatrixBase<T1> const &weights,
35  Communicator const &comm) {
36  return sopt::mpi::l2_norm(input.array(), weights.array(), comm);
37 }
38 
40 template <typename T0, typename T1>
41 typename real_type<typename T0::Scalar>::type l1_norm(Eigen::ArrayBase<T0> const &input,
42  Eigen::ArrayBase<T1> const &weights,
43  Communicator const &comm) {
44  return comm.all_sum_all(sopt::l1_norm(input, weights));
45 }
47 template <typename T0, typename T1>
48 typename real_type<typename T0::Scalar>::type l1_norm(Eigen::MatrixBase<T0> const &input,
49  Eigen::MatrixBase<T1> const &weights,
50  Communicator const &comm) {
51  return comm.all_sum_all(sopt::l1_norm(input, weights));
52 }
54 template <typename T0>
55 typename real_type<typename T0::Scalar>::type l1_norm(Eigen::ArrayBase<T0> const &input,
56  Communicator const &comm) {
57  return comm.all_sum_all(sopt::l1_norm(input));
58 }
60 template <typename T0>
61 typename real_type<typename T0::Scalar>::type l1_norm(Eigen::MatrixBase<T0> const &input,
62  Communicator const &comm) {
63  return comm.all_sum_all(sopt::l1_norm(input));
64 }
65 } // namespace sopt::mpi
66 #endif
67 #endif
real_type< typename T0::Scalar >::type l1_norm(Eigen::ArrayBase< T0 > const &input, Eigen::ArrayBase< T1 > const &weights)
Computes weighted L1 norm.
Definition: maths.h:116
real_type< typename T0::Scalar >::type l2_norm(Eigen::ArrayBase< T0 > const &input, Eigen::ArrayBase< T1 > const &weights)
Computes weighted L2 norm.
Definition: maths.h:140