26 #ifndef TILEDARRAY_NONINTRUSIVE_API_TENSOR_H__INCLUDED 27 #define TILEDARRAY_NONINTRUSIVE_API_TENSOR_H__INCLUDED 40 template <
typename,
typename>
class LazyArrayTile;
266 template <
typename Arg>
281 template <
typename Left,
typename Right>
282 inline auto subt(
const Left& left,
const Right& right)
283 {
return left.subt(right); }
294 template <
typename Left,
typename Right,
typename Scalar,
295 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
296 inline auto subt(
const Left& left,
const Right& right,
const Scalar factor)
297 {
return left.subt(right, factor); }
307 template <
typename Left,
typename Right>
310 {
return left.subt(right, perm); }
322 template <
typename Left,
typename Right,
typename Scalar,
323 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
324 inline auto subt(
const Left& left,
const Right& right,
const Scalar factor,
326 {
return left.subt(right, factor, perm); }
335 template <
typename Arg,
typename Scalar,
336 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
337 inline auto subt(
const Arg& arg,
const Scalar value)
338 {
return arg.subt(value); }
348 template <
typename Arg,
typename Scalar,
349 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
352 {
return arg.subt(value,perm); }
361 template <
typename Result,
typename Arg>
362 inline Result&
subt_to(Result& result,
const Arg& arg)
363 {
return result.subt_to(arg); }
374 template <
typename Result,
typename Arg,
typename Scalar,
375 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
376 inline Result&
subt_to(Result& result,
const Arg& arg,
const Scalar factor)
377 {
return result.subt_to(arg, factor); }
386 template <
typename Result,
typename Scalar,
387 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
388 inline Result&
subt_to(Result& result,
const Scalar value)
389 {
return result.subt_to(value); }
392 template <
typename... T>
395 template <
typename... T>
408 template <
typename Left,
typename Right>
409 inline auto mult(
const Left& left,
const Right& right)
410 {
return left.mult(right); }
421 template <
typename Left,
typename Right,
typename Scalar,
422 typename std::enable_if<TiledArray::detail::is_numeric<Scalar>::value>::type* =
nullptr>
423 inline auto mult(
const Left& left,
const Right& right,
const Scalar factor)
424 {
return left.mult(right, factor); }
434 template <
typename Left,
typename Right>
437 {
return left.mult(right, perm); }
449 template <
typename Left,
typename Right,
typename Scalar,
450 typename std::enable_if<TiledArray::detail::is_numeric<Scalar>::value>::type* =
nullptr>
451 inline auto mult(
const Left& left,
const Right& right,
const Scalar factor,
453 {
return left.mult(right, factor, perm); }
462 template <
typename Result,
typename Arg>
463 inline Result&
mult_to(Result& result,
const Arg& arg)
464 {
return result.mult_to(arg); }
475 template <
typename Result,
typename Arg,
typename Scalar,
476 typename std::enable_if<TiledArray::detail::is_numeric<Scalar>::value>::type* =
nullptr>
477 inline Result&
mult_to(Result& result,
const Arg& arg,
479 {
return result.mult_to(arg, factor); }
482 template <
typename... T>
485 template <
typename... T>
497 template <
typename Arg>
498 inline auto neg(
const Arg& arg)
499 {
return arg.neg(); }
507 template <
typename Arg>
509 {
return arg.neg(perm); }
516 template <
typename Result>
518 {
return result.neg_to(); }
521 template <
typename... T>
524 template <
typename... T>
535 template <
typename Arg>
536 inline auto conj(
const Arg& arg)
537 {
return arg.conj(); }
546 template <
typename Arg,
typename Scalar,
547 typename std::enable_if<
550 inline auto conj(
const Arg& arg,
const Scalar factor)
551 {
return arg.conj(factor); }
559 template <
typename Arg>
561 {
return arg.conj(perm); }
571 template <
typename Arg,
typename Scalar,
572 typename std::enable_if<
576 {
return arg.conj(factor, perm); }
583 template <
typename Result>
585 return result.conj_to();
595 template <
typename Result,
typename Scalar,
596 typename std::enable_if<
599 inline Result&
conj_to(Result& result,
const Scalar factor) {
600 return result.conj_to(factor);
604 template <
typename... T>
607 template <
typename... T>
625 template <
typename Left,
typename Right,
typename Scalar,
626 typename std::enable_if<TiledArray::detail::is_numeric<Scalar>::value>::type* =
nullptr>
627 inline auto gemm(
const Left& left,
const Right& right,
const Scalar factor,
629 {
return left.gemm(right, factor, gemm_config); }
645 template <
typename Result,
typename Left,
typename Right,
typename Scalar,
646 typename std::enable_if<TiledArray::detail::is_numeric<Scalar>::value>::type* =
nullptr>
647 inline Result&
gemm(Result& result,
const Left& left,
const Right& right,
650 return result.gemm(left, right, factor, gemm_config);
654 template <
typename... T>
664 template <
typename Arg>
666 {
return arg.trace(); }
673 template <
typename Arg>
674 inline auto sum(
const Arg& arg)
675 {
return arg.sum(); }
682 template <
typename Arg>
684 {
return arg.product(); }
692 template <
typename Arg>
694 {
return arg.squared_norm(); }
701 template <
typename Arg>
702 inline auto norm(
const Arg& arg)
703 {
return arg.norm(); }
710 template <
typename Arg>
711 inline auto max(
const Arg& arg)
712 {
return arg.max(); }
719 template <
typename Arg>
720 inline auto min(
const Arg& arg)
721 {
return arg.min(); }
728 template <
typename Arg>
730 {
return arg.abs_max(); }
737 template <
typename Arg>
739 {
return arg.abs_min(); }
748 template <
typename Left,
typename Right>
749 inline auto dot(
const Left& left,
const Right& right)
750 {
return left.dot(right); }
759 template <
typename Left,
typename Right>
761 {
return left.inner_product(right); }
763 template <
typename T>
766 template <
typename T>
769 template <
typename T>
772 template <
typename T>
775 template <
typename T>
778 template <
typename T>
781 template <
typename T>
784 template <
typename T>
787 template <
typename T>
790 template <
typename L,
typename R>
decltype(neg(std::declval< T >()...)) result_of_neg_t
decltype(mult_to(std::declval< T >()...)) result_of_mult_to_t
decltype(auto) product(const Tile< Arg > &arg)
Multiply the elements of a tile.
decltype(abs_min(std::declval< T >())) result_of_abs_min_t
decltype(auto) subt(const Tile< Left > &left, const Tile< Right > &right)
Subtract tile arguments.
decltype(auto) min(const Tile< Arg > &arg)
Minimum element of a tile.
decltype(gemm(std::declval< T >()...)) result_of_gemm_t
decltype(auto) squared_norm(const Tile< Arg > &arg)
Squared vector 2-norm of the elements of a tile.
decltype(conj_to(std::declval< T >()...)) result_of_conj_to_t
decltype(abs_max(std::declval< T >())) result_of_abs_max_t
decltype(subt_to(std::declval< T >()...)) result_of_subt_to_t
Tile< Result > & mult_to(Tile< Result > &result, const Tile< Arg > &arg)
Multiply to the result tile.
decltype(auto) norm(const Tile< Arg > &arg)
Vector 2-norm of a tile.
decltype(auto) conj(const Tile< Arg > &arg)
Create a complex conjugated copy of a tile.
decltype(mult(std::declval< T >()...)) result_of_mult_t
decltype(auto) abs_min(const Tile< Arg > &arg)
Absolute mainimum element of a tile.
decltype(auto) abs_max(const Tile< Arg > &arg)
Absolute maximum element of a tile.
TiledArray::expressions::ExprTrait< Left >::scalar_type dot(const TiledArray::expressions::Expr< Left > &a1, const TiledArray::expressions::Expr< Right > &a2)
decltype(conj(std::declval< T >()...)) result_of_conj_t
decltype(product(std::declval< T >())) result_of_product_t
Tile< Result > & neg_to(Tile< Result > &result)
Multiplication constant scalar to a tile.
decltype(min(std::declval< T >())) result_of_min_t
decltype(auto) max(const Tile< Arg > &arg)
Maximum element of a tile.
decltype(auto) neg(const Tile< Arg > &arg)
Negate the tile argument.
Contraction to *GEMM helper.
Permutation of a sequence of objects indexed by base-0 indices.
bool empty(const Tile< Arg > &arg)
Check that arg is empty (no data)
decltype(auto) sum(const Tile< Arg > &arg)
Sum the elements of a tile.
decltype(neg_to(std::declval< T >()...)) result_of_neg_to_t
decltype(auto) mult(const Tile< Left > &left, const Tile< Right > &right)
Multiplication tile arguments.
decltype(sum(std::declval< T >())) result_of_sum_t
auto inner_product(const Left &left, const Right &right)
Vector inner product of two tiles.
decltype(max(std::declval< T >())) result_of_max_t
decltype(mult(std::declval< T >())) result_of_trace_t
decltype(dot(std::declval< L >(), std::declval< R >())) result_of_dot_t
decltype(subt(std::declval< T >()...)) result_of_subt_t
Tile< Result > & subt_to(Tile< Result > &result, const Tile< Arg > &arg)
Subtract from the result tile.
decltype(squared_norm(std::declval< T >())) result_of_squared_norm_t
decltype(norm(std::declval< T >())) result_of_norm_t
decltype(auto) gemm(const Tile< Left > &left, const Tile< Right > &right, const Scalar factor, const math::GemmHelper &gemm_config)
Contract and scale tile arguments.
Result & conj_to(Tile< Result > &result)
In-place complex conjugate a tile.
decltype(auto) trace(const Tile< Arg > &arg)
Sum the hyper-diagonal elements a tile.