27 #ifndef GENERATE_MPO_UTILS_H
28 #define GENERATE_MPO_UTILS_H
40 #include <boost/bind.hpp>
42 namespace generate_mpo
44 template<
class Matrix,
class SymmGroup>
53 typename Matrix::value_type
scale;
61 boost::bind(&op_pair_t::first, _1) <
62 boost::bind(&op_pair_t::first, _2));
77 for (std::size_t p=0; p<
operators.size() && ret; ++p)
86 throw std::runtime_error(
"site_match not implemented for this type of operator." );
98 template<
class Matrix,
class SymmGroup>
99 std::ostream & operator<< (std::ostream & os, Operator_Tag_Term<Matrix, SymmGroup>
const& op)
101 os <<
"fill: " << op.fill_operator << std::endl;
102 os <<
"sign: " << op.with_sign << std::endl;
103 os <<
"scale: " << op.scale << std::endl;
105 for (
int i=0; i<op.operators.size(); ++i)
106 os <<
" {" << op.operators[i].first <<
"," << op.operators[i].second <<
"}";
111 template<
class Matrix,
class SymmGroup>
127 boost::bind(&op_pair_t::first, _1) <
128 boost::bind(&op_pair_t::first, _2));
143 for (std::size_t p=0; p<
operators.size() && ret; ++p)
152 throw std::runtime_error(
"site_match not implemented for this type of operator." );
166 using namespace boost::tuples;
168 inline size_t next_free(vector<size_t>
const & out_taken,
169 vector<size_t>
const & in_taken)
171 for (
size_t k = 0;
true; ++k)
173 if (count(out_taken.begin(), out_taken.end(), k) == 0 &&
174 count(in_taken.begin(), in_taken.end(), k) == 0)
181 for (
size_t k = 2;
true; ++k)
186 template<
class Vector>
189 std::set<size_t> bond_used_dims;
190 for (
typename Vector::iterator it = pm1.begin(); it != pm1.end(); ++it)
192 bond_used_dims.insert(get<1>(*it));
193 for (
typename Vector::iterator it = pm2.begin(); it != pm2.end(); ++it)
195 bond_used_dims.insert(get<0>(*it));
197 std::map<size_t, size_t> compression_map;
199 for (set<size_t>::iterator it = bond_used_dims.begin();
200 it != bond_used_dims.end(); ++it)
201 compression_map[*it] = c++;
203 for (
typename Vector::iterator it = pm1.begin(); it != pm1.end(); ++it)
204 if (compression_map.count(get<1>(*it)) > 0)
205 get<1>(*it) = compression_map[get<1>(*it)];
206 for (
typename Vector::iterator it = pm2.begin(); it != pm2.end(); ++it)
207 if (compression_map.count(get<0>(*it)) > 0)
208 get<0>(*it) = compression_map[get<0>(*it)];
211 template<
class Vector>
212 std::pair<size_t, size_t>
rcdim(Vector
const & pm)
214 std::list<size_t> l, r;
215 for (
typename Vector::const_iterator it = pm.begin(); it != pm.end(); ++it) {
216 l.push_back( get<0>(*it) );
217 r.push_back( get<1>(*it) );
220 size_t ldim=0, rdim=0;
221 if (l.size() > 0) ldim = *max_element(l.begin(), l.end())+1;
222 if (r.size() > 0) rdim = *max_element(r.begin(), r.end())+1;
223 return make_pair(ldim, rdim);
227 bool compare(Pair
const & p1, Pair
const & p2)
229 return p1.first < p2.first;
236 return (boost::get<0>(lhs) < boost::get<0>(rhs));
std::pair< pos_t, tag_type > op_pair_t
bool compare(Pair const &p1, Pair const &p2)
definition of Lattice base class
bool operator<(Operator_Tag_Term const &rhs) const
boost::tuple< int, unsigned int > value_type
include all symmetry definitions
block_matrix< Matrix, SymmGroup > op_t
OPTable< Matrix, SymmGroup >::tag_type tag_type
tag_detail::tag_type tag_type
declaration of block_matrix class
bool overlap(Operator_Tag_Term const &rhs) const
std::pair< pos_t, op_t > op_pair_t
bool site_match(Operator_Term const &rhs) const
std::vector< op_pair_t > operators
std::pair< size_t, size_t > rcdim(Vector const &pm)
void compress_on_bond(Vector &pm1, Vector &pm2)
algorithms for block_matrix (gemm, svd, etc.)
size_t next_free(vector< size_t > const &out_taken, vector< size_t > const &in_taken)
bool site_match(Operator_Tag_Term const &rhs) const
declaration of OPTable, TagHandler and KronHandler
std::vector< op_pair_t > operators
bool overlap(Operator_Term const &rhs) const
bool operator<(Operator_Term const &rhs) const