16 #ifndef OPENKALMAN_EIGEN_TRAITS_FUNCTORS_REDUX_HPP 17 #define OPENKALMAN_EIGEN_TRAITS_FUNCTORS_REDUX_HPP 19 #include <type_traits> 25 template<
typename MemberOp, std::
size_t direction>
28 template<
typename C,
typename Factor,
typename Dim>
29 static constexpr
auto get_constant(
const C&,
const Factor& factor,
const Dim& dim)
31 return std::monostate{};
34 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
35 static constexpr
auto get_constant_diagonal(
const C&,
const Factor& factor,
const Dim& dim)
37 return std::monostate{};
42 #ifndef __cpp_concepts 45 template<
typename C,
typename =
void>
49 struct const_is_zero<C,
std::enable_if_t<values::to_number(C{}) == 0>> : std::true_type {};
58 #if EIGEN_VERSION_AT_LEAST(3,4,0) 59 template<
int p,
typename ResultType,
typename Scalar, std::
size_t direction>
60 struct ReduxTraits<Eigen::internal::member_lpnorm<p, ResultType, Scalar>, direction>
62 template<int p, typename ResultType, std::size_t direction>
63 struct
ReduxTraits<Eigen::internal::member_lpnorm<p, ResultType>, direction>
71 constexpr Scalar operator()(X x, std::size_t dim)
const 74 if constexpr (p == 1)
return static_cast<Scalar
>(dim) * abs_x;
75 else if constexpr (p == 2)
return values::sqrt(static_cast<Scalar>(dim)) * abs_x;
76 else return values::pow(static_cast<Scalar>(dim), static_cast<Scalar>(1)/p) * abs_x;
84 constexpr Scalar operator()(X x)
const {
return values::abs(x); }
88 template<
bool diag,
bool at_least_square,
typename C,
typename Factor,
typename Dim>
89 static constexpr
auto get_constant_impl(
const C& c,
const Factor& factor,
const Dim& dim)
94 if constexpr (std::numeric_limits<ResultType>::has_infinity)
return std::numeric_limits<ResultType>::infinity();
95 else throw std::domain_error {
"Domain error in lpnorm<0>: result is infinity"};
105 else if constexpr (not at_least_square)
107 return std::monostate{};
109 else if constexpr (p == Eigen::Infinity)
113 else if constexpr (diag)
126 template<
typename C,
typename Factor,
typename Dim>
127 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
129 return get_constant_impl<false, true>(c, factor, dim);
133 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
134 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
136 return get_constant_impl<true, at_least_square>(c, factor, dim);
141 #if EIGEN_VERSION_AT_LEAST(3,4,0) 142 template<
typename ResultType,
typename Scalar, std::
size_t direction>
143 struct ReduxTraits<Eigen::internal::member_stableNorm<ResultType, Scalar>, direction>
144 :
ReduxTraits<Eigen::internal::member_lpnorm<2, ResultType, Scalar>, direction> {};
146 template<
typename ResultType, std::
size_t direction>
147 struct ReduxTraits<Eigen::internal::member_stableNorm<ResultType>, direction>
148 :
ReduxTraits<Eigen::internal::member_lpnorm<2, ResultType>, direction> {};
152 #if EIGEN_VERSION_AT_LEAST(3,4,0) 153 template<
typename ResultType,
typename Scalar, std::
size_t direction>
154 struct ReduxTraits<Eigen::internal::member_hypotNorm<ResultType, Scalar>, direction>
155 :
ReduxTraits<Eigen::internal::member_lpnorm<2, ResultType, Scalar>, direction> {};
157 template<
typename ResultType, std::
size_t direction>
158 struct ReduxTraits<Eigen::internal::member_hypotNorm<ResultType>, direction>
159 :
ReduxTraits<Eigen::internal::member_lpnorm<2, ResultType>, direction> {};
163 # if not EIGEN_VERSION_AT_LEAST(3,4,0) 164 template<
typename...Args, std::size_t direction>
165 struct ReduxTraits<Eigen::internal::member_squaredNorm<Args...>, direction>
169 template<
typename Scalar>
170 constexpr Scalar operator()(Scalar x, std::size_t dim)
const 172 if constexpr (values::complex<Scalar>)
176 if constexpr (constant_diagonal_matrix<XprType>)
return r * r + i * i;
177 else return dim * (r * r + i * i);
179 else return dim * x * x;
184 template<
typename C,
typename Factor,
typename Dim>
185 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
187 #ifdef __cpp_concepts 199 template<
bool at_least_square,
typename C,
typename Factor>
200 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim&)
202 #ifdef __cpp_concepts 208 else if constexpr (at_least_square)
211 return std::monostate{};
216 template<
typename...Args, std::size_t direction>
217 struct ReduxTraits<Eigen::internal::member_norm<Args...>, direction>
221 template<
typename Scalar>
222 constexpr Scalar operator()(Scalar x, std::size_t dim)
const 224 if constexpr (values::complex<Scalar>)
228 if constexpr (constant_diagonal_matrix<XprType>)
return r * r + i * i;
239 template<
typename XprType,
typename Factor,
typename Dim>
240 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
242 #ifdef __cpp_concepts 254 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
255 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
257 if constexpr (at_least_square)
260 return std::monostate{};
265 template<
typename...Args, std::size_t direction>
266 struct ReduxTraits<Eigen::internal::member_mean<Args...>, direction>
268 template<
typename C,
typename Factor,
typename Dim>
269 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim&)
275 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
276 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
278 #ifdef __cpp_concepts 284 else if constexpr (at_least_square)
285 return (c * factor) / dim;
287 return std::monostate{};
297 template<
typename T,
typename Scalar, std::
size_t direction>
298 struct ReduxTraits<Eigen::internal::member_redux<std::plus<T>, Scalar>, direction>
300 template<
typename C,
typename Factor,
typename Dim>
301 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
303 #ifdef __cpp_concepts 315 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
316 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
318 #ifdef __cpp_concepts 324 else if constexpr (at_least_square)
327 return std::monostate{};
332 #if EIGEN_VERSION_AT_LEAST(3,4,0) 333 template<
typename ResultType,
typename Scalar, std::
size_t direction>
334 struct ReduxTraits<Eigen::internal::member_sum<ResultType, Scalar>, direction>
336 template<typename ResultType, std::size_t direction>
337 struct
ReduxTraits<Eigen::internal::member_sum<ResultType>, direction>
339 :
ReduxTraits<Eigen::internal::member_redux<std::plus<Scalar>, Scalar>, direction> {};
342 template<
typename LhsScalar,
typename RhsScalar,
typename Scalar, std::
size_t direction>
343 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_sum_op<LhsScalar, RhsScalar>, Scalar>, direction>
344 :
ReduxTraits<Eigen::internal::member_redux<std::plus<Scalar>, Scalar>, direction> {};
351 #if EIGEN_VERSION_AT_LEAST(3,4,0) 352 template<
typename ResultType,
typename Scalar, std::
size_t direction>
353 struct ReduxTraits<Eigen::internal::member_minCoeff<ResultType, Scalar>, direction>
355 template<typename ResultType, std::size_t direction>
356 struct
ReduxTraits<Eigen::internal::member_minCoeff<ResultType>, direction>
361 template<
typename X,
typename Dim>
362 constexpr
auto operator()(X x, Dim dim)
const 364 if (dim > 1)
return std::min<ResultType>(x, 0);
370 template<
typename C,
typename Factor,
typename Dim>
371 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
377 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
378 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
380 if constexpr (at_least_square)
384 else if constexpr (values::fixed<C>)
386 if constexpr (
C::value < 0)
return std::monostate{};
389 else return std::monostate{};
394 template<
typename LhsScalar,
typename RhsScalar,
typename Scalar, std::
size_t direction>
395 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_min_op<LhsScalar, RhsScalar>, Scalar>, direction>
396 #if EIGEN_VERSION_AT_LEAST(3,4,0) 397 :
ReduxTraits<Eigen::internal::member_minCoeff<Scalar, Scalar>, direction> {};
407 #if EIGEN_VERSION_AT_LEAST(3,4,0) 408 template<
typename ResultType,
typename Scalar, std::
size_t direction>
409 struct ReduxTraits<Eigen::internal::member_maxCoeff<ResultType, Scalar>, direction>
411 template<typename ResultType, std::size_t direction>
412 struct
ReduxTraits<Eigen::internal::member_maxCoeff<ResultType>, direction>
417 template<
typename X,
typename Dim>
418 constexpr
auto operator()(X x, Dim dim)
const 420 if (dim > 1)
return std::max<ResultType>(x, 0);
426 template<
typename C,
typename Factor,
typename Dim>
427 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
433 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
434 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
436 if constexpr (at_least_square)
440 else if constexpr (values::fixed<C>)
442 if constexpr (
C::value > 0)
return std::monostate{};
445 else return std::monostate{};
450 template<
typename LhsScalar,
typename RhsScalar,
typename Scalar, std::
size_t direction>
451 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_max_op<LhsScalar, RhsScalar>, Scalar>, direction>
452 #if EIGEN_VERSION_AT_LEAST(3,4,0) 453 :
ReduxTraits<Eigen::internal::member_maxCoeff<Scalar, Scalar>, direction> {};
463 #if EIGEN_VERSION_AT_LEAST(3,4,0) 464 template<
typename ResultType,
typename Scalar, std::
size_t direction>
465 struct ReduxTraits<Eigen::internal::member_all<ResultType, Scalar>, direction>
467 template<typename ResultType, std::size_t direction>
468 struct
ReduxTraits<Eigen::internal::member_all<ResultType>, direction>
474 constexpr
bool operator()(X x)
const {
return static_cast<bool>(x); }
478 template<
typename C,
typename Factor,
typename Dim>
479 static constexpr
auto get_constant(
const C& c,
const Factor&,
const Dim&)
485 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
486 static constexpr
auto get_constant_diagonal(
const C&,
const Factor&,
const Dim&)
488 return std::false_type{};
493 template<
typename T,
typename Scalar, std::
size_t direction>
494 struct ReduxTraits<Eigen::internal::member_redux<std::logical_and<T>, Scalar>, direction>
495 #if EIGEN_VERSION_AT_LEAST(3,4,0) 496 :
ReduxTraits<Eigen::internal::member_all<bool, Scalar>, direction> {};
502 template<
typename Scalar, std::
size_t direction>
503 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_boolean_and_op, Scalar>, direction>
504 #if EIGEN_VERSION_AT_LEAST(3,4,0) 505 :
ReduxTraits<Eigen::internal::member_all<bool, Scalar>, direction> {};
515 #if EIGEN_VERSION_AT_LEAST(3,4,0) 516 template<
typename ResultType,
typename Scalar, std::
size_t direction>
517 struct ReduxTraits<Eigen::internal::member_any<ResultType, Scalar>, direction>
519 template<typename ResultType, std::size_t direction>
520 struct
ReduxTraits<Eigen::internal::member_any<ResultType>, direction>
526 constexpr
bool operator()(X x)
const {
return static_cast<bool>(x); }
530 template<
typename C,
typename Factor,
typename Dim>
531 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
537 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
538 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
540 if constexpr (at_least_square)
543 return std::monostate{};
548 template<
typename T,
typename Scalar, std::
size_t direction>
549 struct ReduxTraits<Eigen::internal::member_redux<std::logical_or<T>, Scalar>, direction>
550 #if EIGEN_VERSION_AT_LEAST(3,4,0) 551 :
ReduxTraits<Eigen::internal::member_any<bool, Scalar>, direction> {};
557 template<
typename Scalar, std::
size_t direction>
558 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_boolean_or_op, Scalar>, direction>
559 #if EIGEN_VERSION_AT_LEAST(3,4,0) 560 :
ReduxTraits<Eigen::internal::member_any<bool, Scalar>, direction> {};
570 #if EIGEN_VERSION_AT_LEAST(3,4,0) 571 template<
typename ResultType,
typename Scalar, std::
size_t direction>
572 struct ReduxTraits<Eigen::internal::member_count<ResultType, Scalar>, direction>
574 template<typename ResultType, std::size_t direction>
575 struct
ReduxTraits<Eigen::internal::member_count<ResultType>, direction>
581 constexpr Eigen::Index operator()(X x, std::size_t dim)
const 583 return static_cast<bool>(x) ? static_cast<Eigen::Index>(dim) : Eigen::Index{0};
588 template<
typename C,
typename Factor,
typename Dim>
589 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
596 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
597 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim&)
599 if constexpr (at_least_square)
602 return std::monostate{};
611 #if EIGEN_VERSION_AT_LEAST(3,4,0) 612 template<
typename ResultType,
typename Scalar, std::
size_t direction>
613 struct ReduxTraits<Eigen::internal::member_prod<ResultType, Scalar>, direction>
615 template<typename ResultType, std::size_t direction>
616 struct
ReduxTraits<Eigen::internal::member_prod<ResultType>, direction>
622 constexpr Scalar operator()(X x, std::size_t dim)
const {
return values::pow(x, dim); }
626 template<
typename C,
typename Factor,
typename Dim>
627 static constexpr
auto get_constant(
const C& c,
const Factor& factor,
const Dim& dim)
629 #ifdef __cpp_concepts 641 template<
bool at_least_square,
typename C,
typename Factor,
typename Dim>
642 static constexpr
auto get_constant_diagonal(
const C& c,
const Factor& factor,
const Dim& dim)
649 template<
typename LhsScalar,
typename RhsScalar,
typename Scalar, std::
size_t direction>
650 struct ReduxTraits<Eigen::internal::member_redux<Eigen::internal::scalar_product_op<LhsScalar, RhsScalar>, Scalar>, direction>
651 #if EIGEN_VERSION_AT_LEAST(3,4,0) 652 :
ReduxTraits<Eigen::internal::member_prod<Scalar, Scalar>, direction> {};
658 template<
typename T,
typename Scalar, std::
size_t direction>
659 struct ReduxTraits<Eigen::internal::member_redux<std::multiplies<T>, Scalar>, direction>
660 #if EIGEN_VERSION_AT_LEAST(3,4,0) 661 :
ReduxTraits<Eigen::internal::member_prod<Scalar, Scalar>, direction> {};
668 #endif //OPENKALMAN_EIGEN_TRAITS_FUNCTORS_REDUX_HPP An operation involving some number of values.
Definition: operation.hpp:69
constexpr auto imag(Arg arg)
A constexpr function to obtain the imaginary part of a (complex) number.
Definition: imag.hpp:40
Definition: tuple_reverse.hpp:103
constexpr bool value
T is numerical value or is reducible to a numerical value.
Definition: value.hpp:31
constexpr auto to_number(Arg arg)
Convert any values::value to a values::number.
Definition: to_number.hpp:34
constexpr auto sqrt(const Arg &arg)
A constexpr alternative to std::sqrt.
Definition: sqrt.hpp:46
Definition: eigen-forward-declarations.hpp:22
constexpr auto real(Arg arg)
A constexpr function to obtain the real part of a (complex) number.
Definition: real.hpp:40
constexpr auto abs(const Arg &arg)
A constexpr alternative to std::abs.
Definition: abs.hpp:38