37 return std::min(std::min(a, b),
41 template <
class SymmGroup>
42 inline std::vector<Index<SymmGroup> >
allowed_sectors(std::vector<int>
const& site_type,
44 typename SymmGroup::charge right_end,
47 bool finitegroup = SymmGroup::finite;
49 std::size_t L = site_type.size();
51 typedef typename SymmGroup::subcharge subcharge;
53 std::vector<typename SymmGroup::charge> maximum_charges(phys_dims.size()), minimum_charges(phys_dims.size());
54 for (
int type=0; type<phys_dims.size(); ++type) {
57 maximum_charges[type] = physc.
begin()->first;
58 minimum_charges[type] = physc.
rbegin()->first;
59 if (minimum_charges[type] > maximum_charges[type])
std::swap(maximum_charges[type], minimum_charges[type]);
62 typename SymmGroup::charge maximum_total_charge=SymmGroup::IdentityCharge, minimum_total_charge=SymmGroup::IdentityCharge;
63 for (
int i = 1; i < L; ++i) {
64 maximum_total_charge =
SymmGroup::fuse(maximum_total_charge, maximum_charges[site_type[i-1]]);
65 minimum_total_charge =
SymmGroup::fuse(minimum_total_charge, minimum_charges[site_type[i-1]]);
69 l_triv.
insert( std::make_pair(SymmGroup::IdentityCharge, 1) );
70 r_triv.
insert( std::make_pair(right_end, 1) );
72 std::vector<Index<SymmGroup> > left_allowed(L+1), right_allowed(L+1), allowed(L+1);
73 left_allowed[0] = l_triv;
74 right_allowed[L] = r_triv;
76 typename SymmGroup::charge cmaxi=maximum_total_charge, cmini=minimum_total_charge;
77 for (
int i = 1; i < L+1; ++i) {
78 left_allowed[i] = phys_dims[site_type[i-1]] * left_allowed[i-1];
80 while ( it != left_allowed[i].end() )
83 it = left_allowed[i].
erase(it);
85 it = left_allowed[i].
erase(it);
87 it->second = std::min(Mmax, it->second);
95 cmaxi=maximum_total_charge; cmini=minimum_total_charge;
96 for (
int i = L-1; i >= 0; --i) {
97 right_allowed[i] =
adjoin(phys_dims[site_type[i]]) * right_allowed[i+1];
100 while ( it != right_allowed[i].end() )
102 if (!finitegroup &&
SymmGroup::fuse(it->first, -cmaxi) > SymmGroup::IdentityCharge)
103 it = right_allowed[i].
erase(it);
104 else if (!finitegroup &&
SymmGroup::fuse(it->first, -cmini) < SymmGroup::IdentityCharge)
105 it = right_allowed[i].
erase(it);
107 it->second = std::min(Mmax, it->second);
116 for (
int i = 0; i < L+1; ++i) {
117 allowed[i] =
common_subset(left_allowed[i], right_allowed[i]);
119 it != allowed[i].end(); ++it)
121 left_allowed[i].size_of_block(it->first),
122 right_allowed[i].size_of_block(it->first));
void swap(MPSTensor< Matrix, SymmGroup > &x, MPSTensor< Matrix, SymmGroup > &y)
include one of the Index class definitions
block_matrix< Matrix, SymmGroup > adjoin(block_matrix< Matrix, SymmGroup > const &m)
std::vector< Index< SymmGroup > > allowed_sectors(std::vector< int > const &site_type, std::vector< Index< SymmGroup > > const &phys_dims, typename SymmGroup::charge right_end, std::size_t Mmax)
reverse_iterator rbegin()
iterator erase(iterator p)
std::size_t insert(std::pair< charge, std::size_t > const &x)
Index< SymmGroup > common_subset(Index< SymmGroup > &a, Index< SymmGroup > &b)
base_t::iterator iterator
T fuse(const A &ind, T d)
Fuse indices n[i] into one p = n[i] d^i.