OpenKalman
adapters-arithmetic.hpp
Go to the documentation of this file.
1 /* This file is part of OpenKalman, a header-only C++ library for
2  * Kalman filters and other recursive filters.
3  *
4  * Copyright (c) 2019-2021 Christopher Lee Ogden <ogden@gatech.edu>
5  *
6  * This Source Code Form is subject to the terms of the Mozilla Public
7  * License, v. 2.0. If a copy of the MPL was not distributed with this
8  * file, You can obtain one at https://mozilla.org/MPL/2.0/.
9  */
10 
17 #ifndef OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP
18 #define OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP
19 
20 #if false
21 namespace OpenKalman
22 {
26 #ifdef __cpp_concepts
27  template<indexible Arg1, vector_space_descriptors_may_match_with Arg2> requires
28  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
29  (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
30 #else
31  template<typename Arg1, typename Arg2, std::enable_if_t<vector_space_descriptors_may_match_with<Arg1, Arg2> and
32  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
33  (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>), int> = 0>
34 #endif
35  inline auto operator+(Arg1&& arg1, Arg2&& arg2)
36  {
37  return sum(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2));
38  }
39 
40 
44 #ifdef __cpp_concepts
45  template<indexible Arg1, vector_space_descriptors_may_match_with Arg2> requires
46  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
47  (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
48 #else
49  template<typename Arg1, typename Arg2, std::enable_if_t<vector_space_descriptors_may_match_with<Arg1, Arg2> and
50  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1>) or
51  (constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>), int> = 0>
52 #endif
53  constexpr auto operator-(Arg1&& arg1, Arg2&& arg2)
54  {
55  return sum(std::forward<Arg1>(arg1), -std::forward<Arg2>(arg2));
56  }
57 
58 
62 #ifdef __cpp_concepts
63  template<indexible Arg1, indexible Arg2> requires
64  (dynamic_dimension<Arg1, 1> or dynamic_dimension<Arg2, 0> or compares_with<vector_space_descriptor_of_t<Arg1, 1>, vector_space_descriptor_of_t<Arg2, 0>>) and
65  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1> or
66  constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>)
67 #else
68  template<typename Arg1, typename Arg2, std::enable_if_t<
69  (dynamic_dimension<Arg1, 1> or dynamic_dimension<Arg2, 0> or compares_with<typename vector_space_descriptor_of<Arg1, 1>::type, typename vector_space_descriptor_of<Arg2, 0>::type>) and
70  (constant_adapter<Arg1> or internal::diagonal_expr<Arg1> or internal::triangular_expr<Arg1> or internal::hermitian_expr<Arg1> or
71  constant_adapter<Arg2> or internal::diagonal_expr<Arg2> or internal::triangular_expr<Arg2> or internal::hermitian_expr<Arg2>), int> = 0>
72 #endif
73  inline auto operator*(Arg1&& arg1, Arg2&& arg2)
74  {
75  return contract(std::forward<Arg1>(arg1), std::forward<Arg2>(arg2));
76  }
77 
78 } // namespace OpenKalman
79 #endif
80 
81 #endif //OPENKALMAN_SPECIAL_MATRIX_ARITHMETIC_HPP
decltype(auto) constexpr contract(A &&a, B &&b)
Matrix multiplication of A * B.
Definition: contract.hpp:54
The root namespace for OpenKalman.
Definition: basics.hpp:34
constexpr bool constant_adapter
Specifies that T is a ConstantAdapter.
Definition: forward-class-declarations.hpp:78
decltype(auto) constexpr sum(Ts &&...ts)
Element-by-element sum of one or more objects.
Definition: sum.hpp:112