33 template<
class Matrix,
class SymmGroup>
43 typedef std::size_t size_t;
44 typedef typename SymmGroup::charge charge;
48 boost::lambda::bind(
static_cast<charge(*)(charge, charge)
>(
SymmGroup::fuse),
49 -boost::lambda::_1, boost::lambda::_2));
55 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
57 for (
size_t s = 0; s < physical_i.
size(); ++s)
60 if(r == right_i.
size())
continue;
62 -physical_i[s].first));
63 if(l == left_i.
size())
continue;
66 bool pretend = (
run == 0);
68 charge in_l_charge =
SymmGroup::fuse(physical_i[s].first, left_i[l].first);
69 charge in_r_charge = right_i[r].first;
70 charge out_l_charge = left_i[l].first;
71 charge out_r_charge =
SymmGroup::fuse(-physical_i[s].first, right_i[r].first);
73 if (! m1.
has_block(in_l_charge, in_r_charge) )
76 size_t in_left_offset = in_left(physical_i[s].first, left_i[l].first);
77 size_t out_right_offset = out_right(physical_i[s].first, right_i[r].first);
80 Matrix
const & in_block = m1(in_l_charge, in_r_charge);
81 Matrix & out_block = m2(out_l_charge, out_r_charge);
84 physical_i[s].second, left_i[l].second, right_i[r].second);
88 m2.
reserve(out_l_charge, out_r_charge,
89 left_i[l].second, out_right_offset + physical_i[s].second * right_i[r].second);
126 template<
class Matrix,
class SymmGroup>
138 typedef std::size_t size_t;
139 typedef typename SymmGroup::charge charge;
142 boost::lambda::bind(
static_cast<charge(*)(charge, charge)
>(
SymmGroup::fuse),
143 -boost::lambda::_1, boost::lambda::_2));
151 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
153 for (
size_t s = 0; s < physical_i.
size(); ++s)
156 if(l == left_i.
size())
continue;
158 physical_i[s].first));
159 if(r == right_i.
size())
continue;
162 bool pretend = (
run == 0);
164 charge in_l_charge = left_i[l].first;
165 charge in_r_charge =
SymmGroup::fuse(-physical_i[s].first, right_i[r].first);
166 charge out_l_charge =
SymmGroup::fuse(physical_i[s].first, left_i[l].first);
167 charge out_r_charge = right_i[r].first;
169 if (! m1.
has_block(in_l_charge, in_r_charge) )
172 size_t in_right_offset = in_right(physical_i[s].first, right_i[r].first);
173 size_t out_left_offset = out_left(physical_i[s].first, left_i[l].first);
176 Matrix
const & in_block = m1(in_l_charge, in_r_charge);
177 Matrix & out_block = m2(out_l_charge, out_r_charge);
179 physical_i[s].second, left_i[l].second, right_i[r].second);
183 m2.
reserve(out_l_charge, out_r_charge,
184 out_left_offset + physical_i[s].second * left_i[l].second, right_i[r].second);
196 template<
class Matrix,
class OtherMatrix,
class SymmGroup>
205 typedef std::size_t size_t;
206 typedef typename SymmGroup::charge charge;
210 boost::lambda::bind(
static_cast<charge(*)(charge, charge)
>(
SymmGroup::fuse),
211 -boost::lambda::_1, boost::lambda::_2));
213 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
216 if(r == right_i.
size())
continue;
217 charge in_r_charge = right_i[r].first;
218 charge in_l_charge = m1.
left_basis()[block].first;
220 for (
size_t s = 0; s < physical_i.
size(); ++s)
223 if(l == left_i.
size())
continue;
225 charge out_l_charge = left_i[l].first;
226 charge out_r_charge =
SymmGroup::fuse(-physical_i[s].first, in_r_charge);
228 if(!m2.
has_block(out_l_charge, out_r_charge))
230 out_l_charge, out_r_charge);
232 size_t in_left_offset = in_left(physical_i[s].first, left_i[l].first);
233 size_t out_right_offset = out_right(physical_i[s].first, in_r_charge);
235 OtherMatrix
const & in_block = m1[block];
236 Matrix & out_block = m2(out_l_charge, out_r_charge);
239 physical_i[s].second, left_i[l].second, right_i[r].second);
244 template<
class Matrix,
class SymmGroup>
255 typedef std::size_t size_t;
256 typedef typename SymmGroup::charge charge;
261 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
263 for (
size_t s = 0; s < physical_i.
size(); ++s)
266 if(r == in_right_i.
size())
continue;
269 -physical_i[s].first));
270 if(l == in_left_i.
size())
continue;
273 charge l_charge =
SymmGroup::fuse(physical_i[s].first, in_left_i[l].first);
274 charge r_charge = in_right_i[r].first;
276 if (! out_left_i.
has(in_left_i[l].first))
continue;
277 if (! m1.
has_block(l_charge, r_charge) )
continue;
278 if (! m2.
has_block(l_charge, r_charge) )
continue;
280 size_t in_left_offset = in_left(physical_i[s].first, in_left_i[l].first);
281 size_t out_left_offset = out_left(physical_i[s].first, in_left_i[l].first);
283 Matrix
const & in_block = m1(l_charge, r_charge);
284 Matrix & out_block = m2(l_charge, r_charge);
286 for (
size_t ss = 0; ss < physical_i[s].second; ++ss)
287 for (
size_t rr = 0; rr < in_right_i[r].second; ++rr)
288 for (
size_t ll = 0; ll < in_left_i[l].second; ++ll)
289 out_block(out_left_offset + ss*in_left_i[l].second+ll, rr)
290 = in_block(in_left_offset + ss*in_left_i[l].second+ll, rr);
305 template<
class Matrix,
class OtherMatrix,
class SymmGroup>
317 typedef std::size_t size_t;
318 typedef typename SymmGroup::charge charge;
321 boost::lambda::bind(
static_cast<charge(*)(charge, charge)
>(
SymmGroup::fuse),
322 -boost::lambda::_1, boost::lambda::_2));
325 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
328 if(l == left_i.
size())
continue;
329 charge in_l_charge = left_i[l].first;
330 charge in_r_charge = m1.
right_basis()[block].first;
332 for (
size_t s = 0; s < physical_i.
size(); ++s)
335 physical_i[s].first));
336 if(r == right_i.
size())
continue;
338 charge out_l_charge =
SymmGroup::fuse(physical_i[s].first, in_l_charge);
339 charge out_r_charge = right_i[r].first;
340 if (! m2.
has_block(out_l_charge, out_r_charge))
341 m2.
insert_block(Matrix(out_left.
size(physical_i[s].first, in_l_charge), right_i[r].second, 0),
342 out_l_charge, out_r_charge);
344 size_t in_right_offset = in_right(physical_i[s].first, out_r_charge);
345 size_t out_left_offset = out_left(physical_i[s].first, in_l_charge);
347 OtherMatrix
const & in_block = m1[block];
348 Matrix & out_block = m2(out_l_charge, out_r_charge);
351 physical_i[s].second, left_i[l].second, right_i[r].second);
358 template<
class Matrix,
class SymmGroup>
367 typedef std::size_t size_t;
368 typedef typename SymmGroup::charge charge;
372 boost::lambda::bind(
static_cast<charge(*)(charge, charge)
>(
SymmGroup::fuse),
373 -boost::lambda::_1, boost::lambda::_2));
375 for (
size_t block = 0; block < m1.
n_blocks(); ++block)
377 for (
size_t s = 0; s < physical_i.
size(); ++s)
380 if(r == right_i.
size())
continue;
382 -physical_i[s].first));
383 if(l == left_i.
size())
continue;
386 charge in_l_charge =
SymmGroup::fuse(physical_i[s].first, left_i[l].first);
387 charge in_r_charge = right_i[r].first;
388 charge out_l_charge = physical_i[s].first;
389 charge out_r_charge =
SymmGroup::fuse(-left_i[l].first, right_i[r].first);
391 if (! m1.
has_block(in_l_charge, in_r_charge) )
394 if (! m2.
has_block(out_l_charge, out_r_charge) )
395 m2.
insert_block(Matrix(physical_i[s].second, out_right.
size(out_r_charge), 0),
396 out_l_charge, out_r_charge);
398 size_t in_left_offset = in_left(physical_i[s].first, left_i[l].first);
399 size_t out_right_offset = out_right(left_i[l].first, right_i[r].first);
401 Matrix
const & in_block = m1(in_l_charge, in_r_charge);
402 Matrix & out_block = m2(out_l_charge, out_r_charge);
404 for (
size_t ss = 0; ss < physical_i[s].second; ++ss)
405 for (
size_t rr = 0; rr < right_i[r].second; ++rr)
406 for (
size_t ll = 0; ll < left_i[l].second; ++ll)
407 out_block(ss, out_right_offset + ll*right_i[r].second+rr) = in_block(in_left_offset + ss*left_i[l].second+ll, rr);
416 template<
class Matrix,
class SymmGroup>
421 typedef typename SymmGroup::charge charge;
448 if (!ret.
has_block(out_left_c, out_right_c))
450 pb_out_right.
size(s4->first, -s2->first),
452 out_left_c, out_right_c);
454 std::size_t in_left_offset = pb(s1->first, s2->first);
455 std::size_t in_right_offset = pb(s3->first, s4->first);
457 std::size_t out_left_offset = pb_out_left(s1->first, -s3->first);
458 std::size_t out_right_offset = pb_out_right(s4->first, -s2->first);
460 ret(std::make_pair(out_left_c, out_left_offset + s1->second*phys1.
size_of_block(s3->first)+s3->second),
461 std::make_pair(out_right_c, out_right_offset + s2->second*phys2.
size_of_block(s4->first)+s4->second))
462 = A(std::make_pair(in_left_c, in_left_offset + s1->second*phys2.
size_of_block(s2->first) + s2->second),
463 std::make_pair(in_right_c, in_right_offset + s3->second*phys2.
size_of_block(s4->first) + s4->second));
476 if (!ret.
has_block(it1->first, it2->first))
continue;
478 Matrix tmp = ret(it1->first, it2->first);
482 if (tmp(i,j) !=
typename Matrix::value_type()) {
497 template<
class Matrix,
class SymmGroup>
501 typedef typename SymmGroup::charge charge;
502 std::vector<block_matrix<Matrix, SymmGroup> > ret;
515 charge in_right_c = b->first;
520 charge out_left_c = s1->first;
521 charge out_right_c = s2->first;
523 if (!Ai.
has_block(out_left_c, out_right_c))
527 out_left_c, out_right_c);
529 std::size_t in_left_offset = pb(s1->first, -s2->first);
530 std::size_t in_right_offset = 0;
532 std::size_t out_left_offset = 0;
533 std::size_t out_right_offset = 0;
536 = A(std::make_pair(in_left_c, in_left_offset + s1->second*phys.
size_of_block(s2->first) + s2->second),
545 for (
int i=0; i<
num_rows(Ai[n]) && empty; ++i)
546 for (
int j=0; j<
num_cols(Ai[n]) && empty; ++j)
547 if (Ai[n](i,j) !=
typename Matrix::value_type())
561 template<
class Matrix,
class SymmGroup>
565 typedef typename SymmGroup::charge charge;
566 std::vector<block_matrix<Matrix, SymmGroup> > ret;
579 charge in_left_c = b->first;
584 charge out_left_c = s1->first;
585 charge out_right_c = s2->first;
587 if (!Ai.
has_block(out_left_c, out_right_c))
591 out_left_c, out_right_c);
593 std::size_t in_left_offset = 0;
594 std::size_t in_right_offset = pb(s2->first, -s1->first);
596 std::size_t out_left_offset = 0;
597 std::size_t out_right_offset = 0;
599 Ai(std::make_pair(out_left_c, out_left_offset + s1->second),
600 std::make_pair(out_right_c, out_right_offset + s2->second))
601 = A(std::make_pair(in_left_c, in_left_offset + b->second),
602 std::make_pair(in_right_c, in_right_offset + s1->second*phys.
size_of_block(s2->first) + s2->second));
610 for (
int i=0; i<
num_rows(Ai[n]) && empty; ++i)
611 for (
int j=0; j<
num_cols(Ai[n]) && empty; ++j)
612 if (Ai[n](i,j) !=
typename Matrix::value_type())
void run(std::string const &chkp1, std::string const &chkp2)
void reshape_l2r(const alps::numeric::matrix< T, A1 > &left, alps::numeric::matrix< T, A2 > &right, size_t left_offset, size_t right_offset, size_t sdim, size_t ldim, size_t rdim)
base_t::const_iterator const_iterator
block_matrix< Matrix, SymmGroup > reshape_left_to_physleft(Index< SymmGroup > physical_i, Index< SymmGroup > left_i, Index< SymmGroup > right_i, block_matrix< Matrix, SymmGroup > const &m1)
size_type n_blocks() const
void reshape_right_to_left_new(Index< SymmGroup > physical_i, Index< SymmGroup > left_i, Index< SymmGroup > right_i, block_matrix< OtherMatrix, SymmGroup > const &m1, block_matrix< Matrix, SymmGroup > &m2)
basis_iterator basis_begin() const
size_t size(charge pc) const
size_type insert_block(Matrix const &, charge, charge)
std::size_t size_of_block(charge c) const
std::vector< block_matrix< Matrix, SymmGroup > > reshape_right_to_list(Index< SymmGroup > const &phys, block_matrix< Matrix, SymmGroup > const &A)
block_matrix< Matrix, SymmGroup > reshape_2site_op(Index< SymmGroup > const &phys1, Index< SymmGroup > const &phys2, block_matrix< Matrix, SymmGroup > const &A)
std::size_t num_rows(maquis::dmrg::one_matrix< T > const &m)
include one of the Index class definitions
block_matrix< Matrix, SymmGroup > adjoin(block_matrix< Matrix, SymmGroup > const &m)
std::vector< block_matrix< Matrix, SymmGroup > > reshape_left_to_list(Index< SymmGroup > const &phys, block_matrix< Matrix, SymmGroup > const &A)
void reshape_right_to_left(Index< SymmGroup > physical_i, Index< SymmGroup > left_i, Index< SymmGroup > right_i, block_matrix< Matrix, SymmGroup > const &m1, block_matrix< Matrix, SymmGroup > &m2)
bool has_block(charge r, charge c) const
std::size_t num_cols(maquis::dmrg::one_matrix< T > const &m)
Index< SymmGroup > const & right_basis() const
void remove_block(charge r, charge c)
std::size_t position(charge c) const
void reserve(charge, charge, std::size_t, std::size_t)
void reshape_r2l(alps::numeric::matrix< T, A1 > &left, const alps::numeric::matrix< T, A2 > &right, size_t left_offset, size_t right_offset, size_t sdim, size_t ldim, size_t rdim)
void reshape_left_to_right_new(Index< SymmGroup > physical_i, Index< SymmGroup > left_i, Index< SymmGroup > right_i, block_matrix< OtherMatrix, SymmGroup > const &m1, block_matrix< Matrix, SymmGroup > &m2)
Index< SymmGroup > const & left_basis() const
void reshape_left_to_right(Index< SymmGroup > physical_i, Index< SymmGroup > left_i, Index< SymmGroup > right_i, block_matrix< Matrix, SymmGroup > const &m1, block_matrix< Matrix, SymmGroup > &m2)
void reshape_and_pad_left(Index< SymmGroup > physical_i, Index< SymmGroup > in_left_i, Index< SymmGroup > in_right_i, Index< SymmGroup > out_left_i, Index< SymmGroup > out_right_i, block_matrix< Matrix, SymmGroup > const &m1, block_matrix< Matrix, SymmGroup > &m2)
std::size_t sum_of_sizes() const
T fuse(const A &ind, T d)
Fuse indices n[i] into one p = n[i] d^i.