ExaTN
tensor_expansion.hpp
1 
26 #ifndef EXATN_NUMERICS_TENSOR_EXPANSION_HPP_
27 #define EXATN_NUMERICS_TENSOR_EXPANSION_HPP_
28 
29 #include "tensor_basic.hpp"
30 #include "tensor_network.hpp"
31 #include "tensor_operator.hpp"
32 
33 #include <string>
34 #include <vector>
35 #include <complex>
36 #include <memory>
37 
38 namespace exatn{
39 
40 namespace numerics{
41 
43 public:
44 
45  //Tensor network expansion component:
47  //Tensor network:
48  std::shared_ptr<TensorNetwork> network;
49  //Expansion coefficient:
50  std::complex<double> coefficient;
51  };
52 
53  using Iterator = typename std::vector<ExpansionComponent>::iterator;
54  using ConstIterator = typename std::vector<ExpansionComponent>::const_iterator;
55 
57  TensorExpansion(): ket_(true) {}
58 
61  TensorExpansion(const TensorExpansion & expansion, //in: tensor network expansion in some tensor space
62  const TensorOperator & tensor_operator); //in: tensor network operator
63 
68  TensorExpansion(const TensorExpansion & left_expansion, //in: tensor network expansion in some tensor space
69  const TensorExpansion & right_expansion); //in: tensor network expansion from the same or dual space
70 
75  TensorExpansion(const TensorExpansion & left_expansion, //in: tensor network expansion in some tensor space
76  const TensorExpansion & right_expansion, //in: tensor network expansion from the dual tensor space
77  const TensorOperator & tensor_operator); //in: tensor network operator
78 
79  TensorExpansion(const TensorExpansion &) = default;
80  TensorExpansion & operator=(const TensorExpansion &) = default;
81  TensorExpansion(TensorExpansion &&) noexcept = default;
82  TensorExpansion & operator=(TensorExpansion &&) noexcept = default;
83  virtual ~TensorExpansion() = default;
84 
85  inline Iterator begin() {return components_.begin();}
86  inline Iterator end() {return components_.end();}
87  inline ConstIterator cbegin() const {return components_.cbegin();}
88  inline ConstIterator cend() const {return components_.cend();}
89 
91  inline bool isKet() const{
92  return ket_;
93  }
94 
95  inline bool isBra() const{
96  return !ket_;
97  }
98 
101  inline int getRank() const{
102  if(!(components_.empty())) return components_[0].network->getRank();
103  return -1;
104  }
105 
107  inline std::size_t getNumComponents() const{
108  return components_.size();
109  }
110 
112  inline const ExpansionComponent & getComponent(std::size_t component_num){
113  assert(component_num < components_.size());
114  return components_[component_num];
115  }
116 
118  bool appendComponent(std::shared_ptr<TensorNetwork> network, //in: tensor network
119  const std::complex<double> coefficient); //in: expansion coefficient
120 
124  void conjugate();
125 
127  void printIt() const;
128 
129 private:
130 
132  void constructDirectProductTensorExpansion(const TensorExpansion & left_expansion,
133  const TensorExpansion & right_expansion);
134  void constructInnerProductTensorExpansion(const TensorExpansion & left_expansion,
135  const TensorExpansion & right_expansion);
136  bool reorderProductLegs(TensorNetwork & network,
137  const std::vector<std::pair<unsigned int, unsigned int>> & new_legs);
138 
139 protected:
140 
142  bool ket_; //ket or bra
143  std::vector<ExpansionComponent> components_; //ordered components of the tensor network expansion
144 };
145 
146 } //namespace numerics
147 
148 } //namespace exatn
149 
150 #endif //EXATN_NUMERICS_TENSOR_EXPANSION_HPP_
exatn::numerics::TensorExpansion::TensorExpansion
TensorExpansion()
Definition: tensor_expansion.hpp:57
exatn::numerics::TensorNetwork
Definition: tensor_network.hpp:72
exatn::numerics::TensorExpansion::ket_
bool ket_
Definition: tensor_expansion.hpp:142
exatn::numerics::TensorExpansion::conjugate
void conjugate()
Definition: tensor_expansion.cpp:99
exatn::numerics::TensorOperator
Definition: tensor_operator.hpp:39
exatn::numerics::TensorExpansion
Definition: tensor_expansion.hpp:42
exatn
Definition: DriverClient.hpp:10
exatn::numerics::TensorExpansion::getRank
int getRank() const
Definition: tensor_expansion.hpp:101
exatn::numerics::TensorExpansion::isKet
bool isKet() const
Definition: tensor_expansion.hpp:91
exatn::numerics::TensorExpansion::ExpansionComponent
Definition: tensor_expansion.hpp:46
exatn::numerics::TensorExpansion::printIt
void printIt() const
Definition: tensor_expansion.cpp:110
exatn::numerics::TensorExpansion::appendComponent
bool appendComponent(std::shared_ptr< TensorNetwork > network, const std::complex< double > coefficient)
Definition: tensor_expansion.cpp:66
exatn::numerics::TensorExpansion::getNumComponents
std::size_t getNumComponents() const
Definition: tensor_expansion.hpp:107
exatn::numerics::TensorExpansion::getComponent
const ExpansionComponent & getComponent(std::size_t component_num)
Definition: tensor_expansion.hpp:112