ALPS MPS Codes
Reference documentation.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | List of all members
generate_mpo::TaggedMPOMaker< Matrix, SymmGroup > Class Template Reference

#include <tagged_mpo_maker_optim.hpp>

Public Member Functions

 TaggedMPOMaker (Lattice const &lat_, Model< Matrix, SymmGroup > const &model_)
 
void add_term (term_descriptor term)
 
MPO< Matrix, SymmGroup > create_mpo ()
 

Detailed Description

template<class Matrix, class SymmGroup>
class generate_mpo::TaggedMPOMaker< Matrix, SymmGroup >

Definition at line 94 of file tagged_mpo_maker_optim.hpp.

Constructor & Destructor Documentation

template<class Matrix, class SymmGroup>
generate_mpo::TaggedMPOMaker< Matrix, SymmGroup >::TaggedMPOMaker ( Lattice const &  lat_,
Model< Matrix, SymmGroup > const &  model_ 
)
inline

Definition at line 115 of file tagged_mpo_maker_optim.hpp.

116  : lat(lat_)
117  , model(model_)
118  , length(lat.size())
119  , tag_handler(model.operators_table())
120  , prempo(length)
121  , trivial_left(prempo_key_type::trivial_left)
122  , trivial_right(prempo_key_type::trivial_right)
123  , leftmost_right(length)
124  , finalized(false)
125  {
126  for (size_t p = 0; p < length-1; ++p)
127  prempo[p][make_pair(trivial_left,trivial_left)] = prempo_value_type(model.identity_matrix_tag(lat.get_prop<int>("type",p)), 1.);
128 
129  typename Model<Matrix, SymmGroup>::terms_type const& terms = model.hamiltonian_terms();
130  std::for_each(terms.begin(), terms.end(), boost::bind(&TaggedMPOMaker<Matrix,SymmGroup>::add_term, this, _1));
131  }
T get_prop(std::string property, pos_t site) const
Definition: lattice.h:103
pos_t size() const
Definition: lattice.h:115
impl_type::terms_type terms_type
Definition: model.h:107

Member Function Documentation

template<class Matrix, class SymmGroup>
void generate_mpo::TaggedMPOMaker< Matrix, SymmGroup >::add_term ( term_descriptor  term)
inline

Definition at line 133 of file tagged_mpo_maker_optim.hpp.

134  {
135  std::sort(term.begin(), term.end(), pos_tag_lt());
136  index_type nops = term.size();
137 
138  switch (nops) {
139  case 1:
140  add_1term(term);
141  break;
142  case 2:
143  add_2term(term);
144  break;
145  case 3:
146  add_3term(term);
147  break;
148  case 4:
149  add_4term(term);
150  break;
151  default:
152  add_nterm(term); /// here filling has to be done manually
153  break;
154  }
155 
156  leftmost_right = std::min(leftmost_right, boost::get<0>(*term.rbegin()));
157  }
template<class Matrix, class SymmGroup>
MPO<Matrix, SymmGroup> generate_mpo::TaggedMPOMaker< Matrix, SymmGroup >::create_mpo ( )
inline

Definition at line 159 of file tagged_mpo_maker_optim.hpp.

160  {
161  if (!finalized) finalize();
162  MPO<Matrix, SymmGroup> mpo; mpo.reserve(length);
163 
164  typedef std::map<prempo_key_type, index_type> index_map;
165  typedef typename index_map::iterator index_iterator;
166  index_map left;
167  left[trivial_left] = 0;
168 
169  for (pos_t p = 0; p < length; ++p) {
170  std::vector<tag_block> pre_tensor; pre_tensor.reserve(prempo[p].size());
171 
172  index_map right;
173  index_type r = 2;
174  for (typename prempo_map_type::const_iterator it = prempo[p].begin();
175  it != prempo[p].end(); ++it) {
176  prempo_key_type const& k1 = it->first.first;
177  prempo_key_type const& k2 = it->first.second;
178  prempo_value_type const& val = it->second;
179 
180  index_iterator ll = left.find(k1);
181  if (ll == left.end())
182  throw std::runtime_error("k1 not found!");
183 
184  index_iterator rr = right.find(k2);
185  if (k2 == trivial_left && rr == right.end())
186  boost::tie(rr, boost::tuples::ignore) = right.insert( make_pair(k2, 0) );
187  else if (k2 == trivial_right && rr == right.end())
188  boost::tie(rr, boost::tuples::ignore) = right.insert( make_pair(k2, 1) );
189  else if (rr == right.end())
190  boost::tie(rr, boost::tuples::ignore) = right.insert( make_pair(k2, r++) );
191 
192  pre_tensor.push_back( tag_block(ll->second, rr->second, val.first, val.second) );
193  }
194 
195  std::pair<std::size_t, std::size_t> rcd = rcdim(pre_tensor);
196  if (p == 0)
197  mpo.push_back( MPOTensor<Matrix, SymmGroup>(1, rcd.second, pre_tensor, tag_handler->get_operator_table()) );
198  else if (p == length - 1)
199  mpo.push_back( MPOTensor<Matrix, SymmGroup>(rcd.first, 1, pre_tensor, tag_handler->get_operator_table()) );
200  else
201  mpo.push_back( MPOTensor<Matrix, SymmGroup>(rcd.first, rcd.second, pre_tensor, tag_handler->get_operator_table()) );
202 
203  swap(left, right);
204  }
205 
206  return mpo;
207  }
void swap(MPSTensor< Matrix, SymmGroup > &x, MPSTensor< Matrix, SymmGroup > &y)
Definition: mpo.h:36
std::pair< size_t, size_t > rcdim(Vector const &pm)
Definition: utils.hpp:212

The documentation for this class was generated from the following file: