20 #ifndef TILEDARRAY_TILE_H__INCLUDED 21 #define TILEDARRAY_TILE_H__INCLUDED 89 std::shared_ptr<tensor_type> pimpl_;
105 template <
typename Arg,
106 typename =
typename std::enable_if<
108 not std::is_convertible<Arg,Tile_>::value &&
116 template <
typename Arg1,
typename Arg2,
typename ... Args>
117 Tile(Arg1&& arg1, Arg2&& arg2, Args&&... args) :
119 std::forward<Arg2>(arg2),
120 std::forward<Args>(args)...))
136 *pimpl_ = std::move(
tensor);
144 return not bool(pimpl_);
160 {
return std::begin(
tensor()); }
166 {
return std::begin(
tensor()); }
172 {
return std::end(
tensor()); }
177 decltype(
auto)
end()
const 178 {
return std::end(
tensor()); }
187 {
return tensor().size(); }
193 {
return tensor().range(); }
202 decltype(
auto) operator[](
std::
size_t i)
const 209 decltype(
auto) operator[](
std::
size_t i)
217 template <
typename... I>
218 decltype(
auto) operator()(const I... i)
const 219 {
return tensor()(i...); }
226 template <
typename... I>
227 decltype(
auto) operator()(const I... i)
228 {
return tensor()(i...); }
233 template <
typename Archive,
234 typename std::enable_if<madness::archive::is_output_archive<Archive>::value>::type* =
nullptr>
237 bool empty = !
static_cast<bool>(pimpl_);
245 template <
typename Archive,
246 typename std::enable_if<madness::archive::is_input_archive<Archive>::value>::type* =
nullptr>
258 pimpl_ = std::make_shared<T>(std::move(
tensor));
278 template <
typename T>
291 template <
typename Arg>
304 template <
typename Arg>
318 template <
typename Arg>
334 template <
typename Arg,
typename Index>
335 inline decltype(
auto)
shift(const
Tile<Arg>& arg, const Index& range_shift)
345 template <
typename Arg,
typename Index>
361 template <
typename Left,
typename Right>
362 inline decltype(
auto)
add(const
Tile<Left>& left, const
Tile<Right>& right)
374 template <
typename Left,
typename Right,
typename Scalar,
375 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
376 inline decltype(
auto)
add(const
Tile<Left>& left, const
Tile<Right>& right, const Scalar factor)
387 template <
typename Left,
typename Right>
401 template <
typename Left,
typename Right,
typename Scalar,
402 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
403 inline decltype(
auto)
add(const
Tile<Left>& left, const
Tile<Right>& right,
414 template <
typename Arg,
typename Scalar,
415 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
416 inline decltype(
auto)
add(const
Tile<Arg>& arg, const Scalar value)
427 template <
typename Arg,
typename Scalar,
428 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
429 inline decltype(
auto)
440 template <
typename Result,
typename Arg>
455 template <
typename Result,
typename Arg,
typename Scalar,
456 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
470 template <
typename Result,
typename Scalar,
471 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
487 template <
typename Left,
typename Right>
488 inline decltype(
auto)
500 template <
typename Left,
typename Right,
typename Scalar,
501 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
502 inline decltype(
auto)
503 subt(const
Tile<Left>& left, const
Tile<Right>& right, const Scalar factor)
514 template <
typename Left,
typename Right>
515 inline decltype(
auto)
528 template <
typename Left,
typename Right,
typename Scalar,
529 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
530 inline decltype(
auto)
531 subt(const
Tile<Left>& left, const
Tile<Right>& right, const Scalar factor,
541 template <
typename Arg,
typename Scalar,
542 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
543 inline decltype(
auto)
554 template <
typename Arg,
typename Scalar,
555 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
556 inline decltype(
auto)
567 template <
typename Result,
typename Arg>
581 template <
typename Result,
typename Arg,
typename Scalar,
582 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
595 template <
typename Result,
typename Scalar,
596 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
613 template <
typename Left,
typename Right>
614 inline decltype(
auto)
mult(const
Tile<Left>& left, const
Tile<Right>& right)
625 template <
typename Left,
typename Right,
typename Scalar,
626 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
627 inline decltype(
auto)
628 mult(const
Tile<Left>& left, const
Tile<Right>& right, const Scalar factor)
639 template <
typename Left,
typename Right>
640 inline decltype(
auto)
653 template <
typename Left,
typename Right,
typename Scalar,
654 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
655 inline decltype(
auto)
656 mult(const
Tile<Left>& left, const
Tile<Right>& right, const Scalar factor,
667 template <
typename Result,
typename Arg>
681 template <
typename Result,
typename Arg,
typename Scalar,
682 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
699 template <
typename Arg,
typename Scalar,
700 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
701 inline decltype(
auto)
scale(const
Tile<Arg>& arg, const Scalar factor)
711 template <
typename Arg,
typename Scalar,
712 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
713 inline decltype(
auto)
723 template <
typename Result,
typename Scalar,
724 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
738 template <
typename Arg>
739 inline decltype(
auto)
neg(const
Tile<Arg>& arg)
748 template <
typename Arg>
757 template <
typename Result>
771 template <
typename Arg>
782 template <
typename Arg,
typename Scalar,
783 typename std::enable_if<
786 inline decltype(
auto)
conj(const
Tile<Arg>& arg, const Scalar factor)
795 template <
typename Arg>
807 template <
typename Arg,
typename Scalar,
808 typename std::enable_if<
819 template <
typename Result>
832 template <
typename Result,
typename Scalar,
833 typename std::enable_if<
855 template <
typename Left,
typename Right,
typename Scalar,
856 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
857 inline decltype(
auto)
gemm(const
Tile<Left>& left, const
Tile<Right>& right,
858 const Scalar factor, const math::GemmHelper& gemm_config)
874 template <
typename Result,
typename Left,
typename Right,
typename Scalar,
875 typename std::enable_if<detail::is_numeric<Scalar>::value>::type* =
nullptr>
892 template <
typename Arg>
894 {
return trace(arg.tensor()); }
901 template <
typename Arg>
902 inline decltype(
auto)
sum(const
Tile<Arg>& arg)
903 {
return sum(arg.tensor()); }
910 template <
typename Arg>
912 {
return product(arg.tensor()); }
920 template <
typename Arg>
929 template <
typename Arg>
931 {
return norm(arg.tensor()); }
938 template <
typename Arg>
939 inline decltype(
auto)
max(const
Tile<Arg>& arg)
940 {
return max(arg.tensor()); }
947 template <
typename Arg>
948 inline decltype(
auto)
min(const
Tile<Arg>& arg)
949 {
return min(arg.tensor()); }
956 template <
typename Arg>
958 {
return abs_max(arg.tensor()); }
965 template <
typename Arg>
967 {
return abs_min(arg.tensor()); }
976 template <
typename Left,
typename Right>
977 inline decltype(
auto)
dot(const
Tile<Left>& left, const
Tile<Right>& right)
978 {
return dot(left.tensor(), right.tensor()); }
990 template <
typename Left,
typename Right>
991 inline decltype(
auto) operator+(const
Tile<Left>& left, const
Tile<Right>& right)
992 {
return add(left, right); }
1002 template <
typename Left,
typename Right>
1004 {
return add_to(left, right); }
1013 template <
typename Left,
typename Right>
1014 inline decltype(
auto) operator-(const
Tile<Left>& left, const
Tile<Right>& right)
1015 {
return subt(left, right); }
1025 template <
typename Left,
typename Right>
1027 {
return subt_to(left, right); }
1036 template <
typename Left,
typename Right>
1037 inline decltype(
auto) operator*(const
Tile<Left>& left, const
Tile<Right>& right)
1038 {
return mult(left, right); }
1047 template <
typename Left,
typename Right,
1048 typename std::enable_if<detail::is_numeric<Right>::value>::type* =
nullptr>
1049 inline decltype(
auto) operator*(const
Tile<Left>& left, const Right right)
1050 {
return scale(left, right); }
1059 template <
typename Left,
typename Right,
1060 typename std::enable_if<TiledArray::detail::is_numeric<Left>::value>::type* =
nullptr>
1061 inline decltype(
auto) operator*(const Left left, const
Tile<Right>& right)
1062 {
return scale(right, left); }
1072 template <
typename Left,
typename Right>
1074 {
return mult_to(left, right); }
1081 template <
typename Arg>
1082 inline decltype(
auto) operator-(const
Tile<Arg>& arg)
1083 {
return neg(arg); }
1091 template <
typename Arg>
1093 {
return permute(arg, perm); }
1101 template <
typename T>
1102 inline std::ostream &operator<<(std::ostream &os, const Tile<T>& tile) {
1103 os << tile.tensor();
1108 template<
typename Allocator,
typename T>
1111 detail::void_t<decltype(std::declval<TiledArray::Cast<TiledArray::Tensor<typename T::value_type, Allocator>,
1112 T>>()(std::declval<const T &>()))>> {
1123 #endif // TILEDARRAY_TILE_H__INCLUDED detail::ShiftWrapper< T > shift(T &tensor)
Shift a tensor from one range to another.
decltype(auto) product(const Tile< Arg > &arg)
Multiply the elements of a tile.
decltype(auto) subt(const Tile< Left > &left, const Tile< Right > &right)
Subtract tile arguments.
decltype(auto) begin()
Iterator factory.
decltype(auto) min(const Tile< Arg > &arg)
Minimum element of a tile.
decltype(auto) squared_norm(const Tile< Arg > &arg)
Squared vector 2-norm of the elements of a tile.
decltype(auto) size() const
Size accessors.
Tile< Result > & scale_to(Tile< Result > &result, const Scalar factor)
Scale to the result tile.
An N-dimensional tensor object.
Tile< Result > & mult_to(Tile< Result > &result, const Tile< Arg > &arg)
Multiply to the result tile.
void scale(DistArray< Tile, Policy > &a, typename DistArray< Tile, Policy >::element_type scaling_factor)
T tensor_type
Tensor type used to represent tile data.
void serialize(Archive &ar) const
decltype(auto) norm(const Tile< Arg > &arg)
Vector 2-norm of a tile.
Tile< Result > & add_to(Tile< Result > &result, const Tile< Arg > &arg)
Add to the result tile.
decltype(auto) end()
Iterator factory.
decltype(auto) conj(const Tile< Arg > &arg)
Create a complex conjugated copy of a tile.
Tile_ & operator=(Tile_ &&)=default
decltype(auto) add(const Tile< Left > &left, const Tile< Right > &right)
Add tile arguments.
const tensor_type & tensor() const
DistArray< Tile, Policy > clone(const DistArray< Tile, Policy > &arg)
Create a deep copy of an array.
auto operator+=(T1 &left, const T2 &right)
Tensor plus operator.
decltype(auto) abs_min(const Tile< Arg > &arg)
Absolute mainimum element of a tile.
typename make_void< Ts... >::type void_t
Tile(Arg1 &&arg1, Arg2 &&arg2, Args &&... args)
decltype(auto) abs_max(const Tile< Arg > &arg)
Absolute maximum element of a tile.
Tile_ & operator=(tensor_type &&tensor)
void serialize(Archive &ar)
Tile_ & operator=(const tensor_type &tensor)
Tile(Arg &&arg)
Forwarding ctor.
TiledArray::expressions::ExprTrait< Left >::scalar_type dot(const TiledArray::expressions::Expr< Left > &a1, const TiledArray::expressions::Expr< Right > &a2)
Tile< T > Tile_
This object type.
std::array< T, N > & operator*=(std::array< T, N > &, const Permutation &)
In-place permute a std::array.
Tile< Result > & neg_to(Tile< Result > &result)
Multiplication constant scalar to a tile.
auto operator-=(T1 &left, const T2 &right)
Tensor minus operator.
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)
Tile< T > make_tile(T &&t)
Factory function for tiles.
Tile< Arg > & shift_to(Tile< Arg > &arg, const Index &range_shift)
Shift the range of arg in place.
decltype(auto) range() const
Range accessor.
decltype(auto) sum(const Tile< Arg > &arg)
Sum the elements of a tile.
TiledArray::Range permute(const TiledArray::Range &r, const Perm &p)
decltype(auto) mult(const Tile< Left > &left, const Tile< Right > &right)
Multiplication tile arguments.
auto operator()(const Tile< T > &arg) const
Tile< Result > & subt_to(Tile< Result > &result, const Tile< Arg > &arg)
Subtract from the result tile.
An N-dimensional shallow copy wrapper for tile objects.
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.