38 #ifndef EXATN_NUMERICS_TENSOR_HPP_
39 #define EXATN_NUMERICS_TENSOR_HPP_
41 #include "tensor_basic.hpp"
42 #include "tensor_shape.hpp"
43 #include "tensor_signature.hpp"
44 #include "tensor_leg.hpp"
50 #include <type_traits>
52 #include <initializer_list>
61 using TensorHashType = std::size_t;
67 Tensor(
const std::string & name,
72 Tensor(
const std::string & name,
76 Tensor(
const std::string & name,
77 std::initializer_list<T> extents,
78 std::initializer_list<std::pair<SpaceId,SubspaceId>> subspaces);
80 Tensor(
const std::string & name,
81 const std::vector<T> & extents,
82 const std::vector<std::pair<SpaceId,SubspaceId>> & subspaces);
86 Tensor(
const std::string & name,
87 std::initializer_list<T> extents);
89 Tensor(
const std::string & name,
90 const std::vector<T> & extents);
92 Tensor(
const std::string & name);
101 Tensor(
const std::string & name,
102 const Tensor & left_tensor,
103 const Tensor & right_tensor,
104 const std::vector<TensorLeg> & contraction);
109 Tensor & operator=(
Tensor && tensor) noexcept =
default;
110 virtual ~
Tensor() =
default;
114 void printItFile(std::ofstream & output_file)
const;
117 const std::string &
getName()
const;
132 SubspaceId getDimSubspaceId(
unsigned int dim_id)
const;
133 std::pair<SpaceId,SubspaceId> getDimSpaceAttr(
unsigned int dim_id)
const;
144 DimExtent dim_extent);
151 const std::vector<int> & mode_mask,
174 TensorElementType element_type_;
175 std::list<std::vector<unsigned int>> isometries_;
182 std::initializer_list<T> extents,
183 std::initializer_list<std::pair<SpaceId,SubspaceId>> subspaces):
184 name_(name), shape_(extents), signature_(subspaces), element_type_(TensorElementType::VOID)
187 if(signature_.
getRank() != shape_.
getRank()) std::cout <<
"ERROR(Tensor::Tensor): Signature/Shape size mismatch!" << std::endl;
193 const std::vector<T> & extents,
194 const std::vector<std::pair<SpaceId,SubspaceId>> & subspaces):
195 name_(name), shape_(extents), signature_(subspaces), element_type_(TensorElementType::VOID)
198 if(signature_.
getRank() != shape_.
getRank()) std::cout <<
"ERROR(Tensor::Tensor): Signature/Shape size mismatch!" << std::endl;
204 std::initializer_list<T> extents):
205 name_(name), shape_(extents), signature_(static_cast<unsigned int>(extents.size())), element_type_(TensorElementType::VOID)
211 const std::vector<T> & extents):
212 name_(name), shape_(extents), signature_(static_cast<unsigned int>(extents.size())), element_type_(TensorElementType::VOID)
218 template<
typename... Args>
219 inline std::shared_ptr<numerics::Tensor> makeSharedTensor(Args&&... args)
221 return std::make_shared<numerics::Tensor>(args...);
226 #endif //EXATN_NUMERICS_TENSOR_HPP_