27 #ifndef MAQUIS_DMRG_BASIS_SECTOR_ITERATOR_H
28 #define MAQUIS_DMRG_BASIS_SECTOR_ITERATOR_H
32 #include <boost/operators.hpp>
33 #include <boost/tuple/tuple.hpp>
34 #include <boost/tuple/tuple_comparison.hpp>
37 template <
class SymmGroup>
39 :
public boost::forward_iterator_helper<
40 basis_sector_iterator_<SymmGroup>
41 , std::vector<boost::tuple<typename SymmGroup::charge, std::size_t> >
43 , std::vector<boost::tuple<typename SymmGroup::charge, std::size_t> > *
44 , std::vector<boost::tuple<typename SymmGroup::charge, std::size_t> > &
48 typedef typename SymmGroup::charge charge;
49 typedef std::size_t size_t;
50 typedef boost::tuple<charge, size_t> local_state;
51 typedef typename std::vector<local_state>::const_iterator states_iterator;
53 typedef const charge& (*get0_fn_t)(
const boost::tuples::cons<charge, boost::tuples::cons<size_t, boost::tuples::null_type> >&);
67 getter_fn = &boost::tuples::get<0, charge, boost::tuples::cons<size_t, boost::tuples::null_type> >;
69 for (
size_t i=0; i<phys.
size(); ++i)
70 for (
size_t j=0; j<phys[i].second; ++j)
71 alllocal.push_back( local_state(phys[i].first, j) );
73 for (
size_t i=0; i<L; ++i) {
74 state[i] = alllocal[it[i]];
77 if (total_charge() != initc)
93 if (valid != rhs.valid)
98 return (L == rhs.L) && (initc == rhs.initc) && (alllocal == rhs.alllocal) &&
std::equal(state.begin(), state.end(), rhs.state.begin());
103 charge total_charge()
const
105 return std::accumulate(state.begin(), state.end(), SymmGroup::IdentityCharge,
106 boost::bind(
static_cast<charge(*)(charge,charge)
>(&
SymmGroup::fuse), _1, boost::bind(getter_fn, _2)) );
113 for (
int i=L-1; (i > 0) && (it[i] == alllocal.size()); --i) {
117 if ( it[0] == alllocal.size() ) {
122 for (
size_t i=0; i<L; ++i)
123 state[i] = alllocal[it[i]];
124 }
while(total_charge() != initc);
132 std::vector<local_state> alllocal;
133 std::vector<size_t> it;
134 std::vector<local_state> state;
138 template <
class SymmGroup>
bool operator==(basis_sector_iterator_< SymmGroup > const &rhs) const
std::pair< basis_sector_iterator_< SymmGroup >, basis_sector_iterator_< SymmGroup > > basis_sector_iterators(size_t L, Index< SymmGroup > const &phys, typename SymmGroup::charge initc=SymmGroup::IdentityCharge)
include one of the Index class definitions
basis_sector_iterator_(size_t L_, Index< SymmGroup > const &phys, charge initc_)
std::pair< bool, typename Matrix::value_type > equal(block_matrix< Matrix, SymmGroup > const &reference, block_matrix< Matrix, SymmGroup > const &sample)
_Tp accumulate(_InputIterator __first, _InputIterator __last, _Tp __init)
std::vector< local_state > const & operator*() const
T fuse(const A &ind, T d)
Fuse indices n[i] into one p = n[i] d^i.