26 #ifndef TILEDARRAY_TENSOR_OPERATORS_H__INCLUDED 27 #define TILEDARRAY_TENSOR_OPERATORS_H__INCLUDED 43 template <
typename T1,
typename T2,
44 typename std::enable_if<
45 detail::is_tensor<T1, T2>::value ||
46 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
49 {
return left.add(right); }
59 template <
typename T1,
typename T2,
60 typename std::enable_if<
61 detail::is_tensor<T1, T2>::value ||
62 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
65 {
return left.subt(right); }
75 template <
typename T1,
typename T2,
76 typename std::enable_if<
77 detail::is_tensor<T1, T2>::value||
78 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
81 {
return left.mult(right); }
92 template <
typename T,
typename N,
93 typename std::enable_if<
96 detail::is_numeric<N>::value>::type* =
nullptr>
97 inline auto operator*(
const T& left, N right)
98 {
return left.scale(right); }
107 template <
typename N,
typename T,
108 typename std::enable_if<
109 detail::is_numeric<N>::value &&
112 inline auto operator*(N left,
const T& right)
113 {
return right.scale(left); }
120 template <
typename T,
121 typename std::enable_if<
124 inline auto operator-(
const T& arg) -> decltype(arg.neg())
125 {
return arg.neg(); }
132 template <
typename T,
133 typename std::enable_if<
138 {
return arg.permute(perm); }
148 template <
typename T1,
typename T2,
149 typename std::enable_if<
150 detail::is_tensor<T1, T2>::value ||
151 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
154 {
return left.add_to(right); }
164 template <
typename T1,
typename T2,
165 typename std::enable_if<
166 detail::is_tensor<T1, T2>::value ||
167 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
170 {
return left.subt_to(right); }
180 template <
typename T1,
typename T2,
181 typename std::enable_if<
182 detail::is_tensor<T1, T2>::value||
183 detail::is_tensor_of_tensor<T1, T2>::value>::type* =
nullptr>
186 {
return left.mult_to(right); }
197 template <
typename T,
typename N,
198 typename std::enable_if<
201 detail::is_numeric<N>::value>::type* =
nullptr>
202 inline auto operator+=(T& left, N right)
203 {
return left.add_to(right); }
213 template <
typename T,
typename N,
214 typename std::enable_if<
217 detail::is_numeric<N>::value>::type* =
nullptr>
218 inline auto operator-=(T& left, N right)
219 {
return left.subt_to(right); }
229 template <
typename T,
typename N,
230 typename std::enable_if<
233 detail::is_numeric<N>::value>::type* =
nullptr>
234 inline auto operator*=(T& left, N right)
235 {
return left.scale_to(right); }
239 #endif // TILEDARRAY_TENSOR_OPERATORS_H__INCLUDED auto operator+(const T1 &left, const T2 &right)
Tensor plus operator.
static constexpr bool value
std::array< T, N > operator*(const Permutation &, const std::array< T, N > &)
Permute a std::array.
auto operator+=(T1 &left, const T2 &right)
Tensor plus operator.
Permutation operator-(const Permutation &perm)
Inverse permutation operator.
std::array< T, N > & operator*=(std::array< T, N > &, const Permutation &)
In-place permute a std::array.
auto operator-=(T1 &left, const T2 &right)
Tensor minus operator.
Permutation of a sequence of objects indexed by base-0 indices.
static constexpr bool value