52 it != m2.
left_i.end(); ++it) {
53 if (ret.
left_i.has(it->first))
54 ret.
left_i[ret.
left_i.position(it->first)].second += it->second;
77 for (
size_t t=0; t<2; ++t)
82 for (
size_t b = 0; b < m.
data().n_blocks(); ++b) {
83 typename SymmGroup::charge
const& sl_charge = m.
data().left_basis()[b].first;
84 typename SymmGroup::charge
const& r_charge = m.
data().right_basis()[b].first;
85 size_t out_r_charge_i = out_right.
position(r_charge);
87 if (!ret.
data().has_block(sl_charge, r_charge))
88 ret.
data().insert_block(Matrix(out_left_pb.size(sl_charge), out_right[out_r_charge_i].second),
91 Matrix & nb = ret.
data()(sl_charge, r_charge);
93 size_t in_r_size = m.
data().right_basis()[b].second;
94 size_t out_r_offset = 0;
96 out_r_offset += m1.
col_dim().size_of_block(r_charge,
true);
98 for (
size_t s=0; s<phys_i.size(); ++s) {
99 typename SymmGroup::charge
const& s_charge = phys_i[s].first;
100 typename SymmGroup::charge l_charge =
SymmGroup::fuse(sl_charge, -s_charge);
102 if (!m.
row_dim().has(l_charge))
105 size_t in_l_size = m.
row_dim().size_of_block(l_charge,
true);
106 size_t in_l_offset = in_left(s_charge, l_charge);
108 size_t out_l_size = ret.
row_dim().size_of_block(l_charge,
true);
109 size_t out_l_offset = out_left_pb(s_charge, l_charge);
111 out_l_offset += m1.
row_dim().size_of_block(l_charge,
true);
113 for (
size_t ss=0; ss<phys_i[s].second; ++ss) {
114 copy_block(m.
data()[b], in_l_offset+ss*in_l_size, 0,
115 nb, out_l_offset+ss*out_l_size, out_r_offset,
116 in_l_size, in_r_size);
void make_left_paired() const
Index< SymmGroup > const & col_dim() const
base_t::const_iterator const_iterator
Index< SymmGroup > const & row_dim() const
Index< SymmGroup > phys_i
bool weak_equal(Index< SymmGroup > const &a, Index< SymmGroup > const &b)
std::size_t position(charge c) const
Index< SymmGroup > const & site_dim() const
Index< SymmGroup > left_i
Index< SymmGroup > right_i
block_matrix< Matrix, SymmGroup > & data()
T fuse(const A &ind, T d)
Fuse indices n[i] into one p = n[i] d^i.