19#ifndef GM2_EIGEN_UTILS_HPP
20#define GM2_EIGEN_UTILS_HPP
28template <
typename Derived>
32 typename Derived::PlainObject tmp;
33 tmp.setConstant(mass);
35 (
v - tmp).abs().minCoeff(&pos);
40template <
class Derived>
41bool is_equal(
const Eigen::ArrayBase<Derived>& a,
42 const Eigen::ArrayBase<Derived>& b,
43 double precision_goal)
45 return (a - b).cwiseAbs().maxCoeff() < precision_goal;
48template <
class Derived>
49bool is_zero(
const Eigen::ArrayBase<Derived>& a,
double eps)
51 return a.cwiseAbs().maxCoeff() < eps;
63template <
int M,
int N>
67 const auto size = m.size();
69 for (
int i = 0; i < size; i++) {
72 }
else if (data[i] > max) {
87template <
typename DerivedArray,
typename DerivedMatrix>
89 Eigen::MatrixBase<DerivedMatrix>& z)
96 const int sign = (idx - pos) < 0 ? -1 : 1;
97 int steps = std::abs(idx - pos);
101 const int new_pos = pos +
sign;
102 v.row(new_pos).swap(
v.row(pos));
103 z.row(new_pos).swap(z.row(pos));
117template<
class Real,
int Nsrc,
int Ncmp>
119 const Eigen::Array<Real,Nsrc,1>& src,
120 const Eigen::Array<Real,Ncmp,1>& cmp)
122 static_assert(Nsrc > Ncmp,
"Error: size of source vector is not greater "
123 "than size of comparison vector.");
125 Eigen::Array<Real,Nsrc,1> non_equal(src);
126 Eigen::Array<Real,Nsrc - Ncmp,1> dst;
128 for (
int i = 0; i < Ncmp; i++) {
130 non_equal(idx) = std::numeric_limits<double>::infinity();
133 std::remove_copy_if(non_equal.data(), non_equal.data() + Nsrc,
134 dst.data(), [] (
auto x) { return !std::isfinite(x); });
144template<
class Real,
int N>
146 Eigen::Array<Real,N,1>&
v,
147 const Eigen::Array<Real,N,1>& v2)
149 Eigen::PermutationMatrix<N> p;
151 std::sort(p.indices().data(), p.indices().data() + p.indices().size(),
152 [&v2] (
int i,
int j) { return std::abs(v2[i]) < std::abs(v2[j]); });
154#if EIGEN_VERSION_AT_LEAST(3,1,4)
155 v.matrix().transpose() *= p.inverse();
157 Eigen::Map<Eigen::Matrix<Real,N,1> >(
v.data()).transpose() *= p.inverse();
166template<
class Derived>
168 Eigen::Array<
double,Eigen::MatrixBase<Derived>::RowsAtCompileTime,1>&
v,
169 const Eigen::MatrixBase<Derived>& matrix)
174template <
typename Derived>
177 static_assert(Eigen::MatrixBase<Derived>::RowsAtCompileTime ==
178 Eigen::MatrixBase<Derived>::ColsAtCompileTime,
179 "symmetrize is only defined for squared matrices");
181 for (
int i = 0; i < Eigen::MatrixBase<Derived>::RowsAtCompileTime; i++) {
182 for (
int k = 0; k < i; k++) {
void move_goldstone_to(int idx, double mass, Eigen::ArrayBase< DerivedArray > &v, Eigen::MatrixBase< DerivedMatrix > &z)
The element of v, which is closest to mass, is moved to the position idx.
void normalize_to_interval(Eigen::Matrix< double, M, N > &m, double min=-1., double max=1.)
Normalize each element of the given real matrix to be within the interval [min, max].
bool is_zero(const Eigen::ArrayBase< Derived > &a, double eps)
unsigned closest_index(double mass, const Eigen::ArrayBase< Derived > &v)
int sign(double x) noexcept
returns sign of real number
bool is_equal(const Eigen::ArrayBase< Derived > &a, const Eigen::ArrayBase< Derived > &b, double precision_goal)
void reorder_vector(Eigen::Array< Real, N, 1 > &v, const Eigen::Array< Real, N, 1 > &v2)
reorders vector v according to ordering in vector v2
void symmetrize(Eigen::MatrixBase< Derived > &m)
Eigen::Array< Real, Nsrc - Ncmp, 1 > remove_if_equal(const Eigen::Array< Real, Nsrc, 1 > &src, const Eigen::Array< Real, Ncmp, 1 > &cmp)
Returns all elements from src, which are not close to the elements in cmp.