27 #ifndef GENERATE_MPO_MPO_MAKER_H
28 #define GENERATE_MPO_MPO_MAKER_H
43 namespace generate_mpo
45 template<
class Matrix,
class SymmGroup>
49 typedef boost::tuple<size_t, size_t, op_t> block;
68 , leftmost_right(length)
71 for (
size_t p = 0; p < length; ++p)
74 prempo[p].push_back(boost::make_tuple(std::size_t(0), std::size_t(0), identities[lat.
get_prop<
int>(
"type",p)]));
81 std::vector<std::pair<typename Lattice::pos_t, op_t> > ops = term.
operators;
83 std::sort(ops.begin(), ops.end(), compare<std::pair<typename Lattice::pos_t, op_t> >);
85 vector<size_t> positions;
86 for (
typename vector<pair<typename Lattice::pos_t, op_t> >::const_iterator
88 it != ops.end(); ++it)
89 positions.push_back( it->first );
90 size_t minp = *min_element(positions.begin(), positions.end());
91 size_t maxp = *max_element(positions.begin(), positions.end());
93 size_t use_b = maximum++;
95 vector<bool> done(length,
false);
96 for (
typename vector<pair<typename Lattice::pos_t, op_t> >::const_iterator it = ops.begin();
97 it != ops.end(); ++it)
99 size_t first_use_b = (it->first == minp ? 0 : use_b);
100 size_t second_use_b = (it->first == maxp ? 1 : use_b);
101 assert( it->first < prempo.size() );
103 prempo[it->first].push_back(boost::make_tuple(first_use_b, second_use_b, it->second));
104 used_dims[it->first].insert(use_b);
106 site_terms[it->first] += it->second;
107 done[it->first] =
true;
110 for (
size_t p = minp; p <= maxp; ++p)
113 prempo[p].push_back( boost::make_tuple(use_b, use_b, current_filling));
114 used_dims[p].insert(use_b);
118 leftmost_right = std::min(leftmost_right, maxp);
123 if (!finalized) finalize();
125 for (
size_t p = 1; p < length - 1; ++p)
126 r[p] = as_bulk(prempo[p]);
127 r[0] = as_left(prempo[0]);
128 r[length-1] = as_right(prempo[length-1]);
135 if (!finalized) finalize();
137 for (
size_t p = 1; p < length - 1; ++p)
138 r[p] = as_bulk(prempo[p]);
139 r[0] = as_left(prempo[0]);
140 r[length-1] = as_right(prempo[length-1]);
147 cpor.compress(mpo_sorted, mpo_out, cutoff);
160 std::vector<block_matrix<Matrix, SymmGroup> > identities, fillings;
161 vector<set<size_t> > used_dims;
162 vector<vector<block> > prempo;
163 std::map<std::size_t, op_t> site_terms;
164 size_t maximum, leftmost_right;
169 for (
typename std::map<std::size_t, op_t>::const_iterator it = site_terms.begin();
170 it != site_terms.end(); ++it)
171 prempo[it->first].push_back( boost::make_tuple(0, 1, it->second) );
173 for (
size_t p = leftmost_right + 1; p < length; ++p)
174 prempo[p].push_back( boost::make_tuple(1, 1, identities[lat.
get_prop<
int>(
"type",p)]) );
176 for (
typename vector<vector<block> >::iterator it = prempo.begin();
177 it + 1 != prempo.end();
186 pair<size_t, size_t> rcd =
rcdim(ops);
188 for (
typename vector<block>::const_iterator it = ops.begin();
189 it != ops.end(); ++it)
191 r.set(get<0>(*it), get<1>(*it), get<2>(*it));
198 pair<size_t, size_t> rcd =
rcdim(ops);
200 for (
typename vector<block>::const_iterator it = ops.begin();
201 it != ops.end(); ++it)
203 r.set(0, get<1>(*it), get<2>(*it));
210 pair<size_t, size_t> rcd =
rcdim(ops);
212 for (
typename vector<block>::const_iterator it = ops.begin();
213 it != ops.end(); ++it)
215 r.set(get<0>(*it), 0, get<2>(*it));
definition of Lattice base class
include all symmetry definitions
MPO< Matrix, SymmGroup > create_compressed_mpo(Index< SymmGroup > const &phys, double cutoff)
declaration of block_matrix class
definition of MPO class (vector of MPOTensor)
T get_prop(std::string property, pos_t site) const
std::vector< std::vector< block > > & get_prempo()
std::vector< op_pair_t > operators
std::pair< size_t, size_t > rcdim(Vector const &pm)
void compress_on_bond(Vector &pm1, Vector &pm2)
MPOMaker(Lattice const &lat_, const std::vector< block_matrix< Matrix, SymmGroup > > &ident_, const std::vector< block_matrix< Matrix, SymmGroup > > &fill_)
algorithms for block_matrix (gemm, svd, etc.)
void add_term(Operator_Term< Matrix, SymmGroup > const &term)
MPO< Matrix, SymmGroup > create_mpo()