ExaTN
tensor_operator.hpp
1 
24 #ifndef EXATN_NUMERICS_TENSOR_OPERATOR_HPP_
25 #define EXATN_NUMERICS_TENSOR_OPERATOR_HPP_
26 
27 #include "tensor_basic.hpp"
28 #include "tensor_network.hpp"
29 
30 #include <string>
31 #include <vector>
32 #include <complex>
33 #include <memory>
34 
35 namespace exatn{
36 
37 namespace numerics{
38 
40 public:
41 
42  //Tensor operator component:
44  //Tensor network (or a single tensor stored as a tensor network of size 1):
45  std::shared_ptr<TensorNetwork> network;
46  //Ket legs of the tensor network: Global tensor mode id <-- Output tensor leg:
47  std::vector<std::pair<unsigned int, unsigned int>> ket_legs;
48  //Bra legs of the tensor network: Global tensor mode id <-- Output tensor leg:
49  std::vector<std::pair<unsigned int, unsigned int>> bra_legs;
50  //Expansion coefficient of the operator component:
51  std::complex<double> coefficient;
52  };
53 
54  using Iterator = typename std::vector<OperatorComponent>::iterator;
55  using ConstIterator = typename std::vector<OperatorComponent>::const_iterator;
56 
57  TensorOperator(const std::string & name): name_(name) {}
58 
59  TensorOperator(const TensorOperator &) = default;
60  TensorOperator & operator=(const TensorOperator &) = default;
61  TensorOperator(TensorOperator &&) noexcept = default;
62  TensorOperator & operator=(TensorOperator &&) noexcept = default;
63  virtual ~TensorOperator() = default;
64 
65  inline Iterator begin() {return components_.begin();}
66  inline Iterator end() {return components_.end();}
67  inline ConstIterator cbegin() const {return components_.cbegin();}
68  inline ConstIterator cend() const {return components_.cend();}
69 
71  inline const std::string & getName() const{
72  return name_;
73  }
74 
77  inline int getRank() const{
78  if(!(components_.empty())) return components_[0].network->getRank();
79  return -1;
80  }
81 
83  inline std::size_t getNumComponents() const{
84  return components_.size();
85  }
86 
88  inline const OperatorComponent & getComponent(std::size_t component_num){
89  assert(component_num < components_.size());
90  return components_[component_num];
91  }
92 
98  bool appendComponent(std::shared_ptr<TensorNetwork> network, //in: tensor network (or single tensor as a tensor network)
99  const std::vector<std::pair<unsigned int, unsigned int>> & ket_pairing, //in: ket pairing: Global tensor mode id <-- Output tensor leg
100  const std::vector<std::pair<unsigned int, unsigned int>> & bra_pairing, //in: bra pairing: Global tensor mode id <-- Output tensor leg
101  const std::complex<double> coefficient); //in: expansion coefficient
102 
106  void conjugate();
107 
109  void printIt() const;
110 
111 protected:
112 
113  std::string name_; //tensor operator name
114  std::vector<OperatorComponent> components_; //ordered components of the tensor operator
115 };
116 
117 } //namespace numerics
118 
119 } //namespace exatn
120 
121 #endif //EXATN_NUMERICS_TENSOR_OPERATOR_HPP_
exatn::numerics::TensorOperator::conjugate
void conjugate()
Definition: tensor_operator.cpp:26
exatn::numerics::TensorOperator::appendComponent
bool appendComponent(std::shared_ptr< TensorNetwork > network, const std::vector< std::pair< unsigned int, unsigned int >> &ket_pairing, const std::vector< std::pair< unsigned int, unsigned int >> &bra_pairing, const std::complex< double > coefficient)
Definition: tensor_operator.cpp:13
exatn::numerics::TensorOperator::printIt
void printIt() const
Definition: tensor_operator.cpp:37
exatn::numerics::TensorOperator
Definition: tensor_operator.hpp:39
exatn
Definition: DriverClient.hpp:10
exatn::numerics::TensorOperator::OperatorComponent
Definition: tensor_operator.hpp:43
exatn::numerics::TensorOperator::getNumComponents
std::size_t getNumComponents() const
Definition: tensor_operator.hpp:83
exatn::numerics::TensorOperator::getName
const std::string & getName() const
Definition: tensor_operator.hpp:71
exatn::numerics::TensorOperator::getComponent
const OperatorComponent & getComponent(std::size_t component_num)
Definition: tensor_operator.hpp:88
exatn::numerics::TensorOperator::getRank
int getRank() const
Definition: tensor_operator.hpp:77