28 #ifndef MAQUIS_DMRG_MODELS_OP_HANDLER_HPP
29 #define MAQUIS_DMRG_MODELS_OP_HANDLER_HPP
31 template <
class Matrix,
class SymmGroup>
40 template <
class Matrix,
class SymmGroup>
44 std::pair<bool, mvalue_type> cmp_result;
45 typename std::vector<op_t>::iterator it_pt = this->begin();
46 for (; it_pt != this->end(); ++it_pt) {
52 if (it_pt == this->end()) {
53 return std::make_pair(this->register_op(sample), 1.0);
55 return std::make_pair(it_pt - this->begin(), cmp_result.second);
59 template <
class Matrix,
class SymmGroup>
61 sign_table.push_back(kind);
62 return operator_table->register_op(op_);
85 template <
class Matrix,
class SymmGroup>
93 assert( t1 < operator_table->size() && t2 < operator_table->size() );
97 #if defined(__xlC__) || defined(__FCC_VERSION)
98 if (product_tags.count(std::make_pair(t1, t2)) == 0)
99 throw std::out_of_range(
"");
101 return product_tags[std::make_pair(t1, t2)];
103 return product_tags.at(std::make_pair(t1, t2));
108 catch(
const std::out_of_range& e) {
111 op_t& op1 = (*operator_table)[t1];
112 op_t& op2 = (*operator_table)[t2];
114 gemm(op1, op2, product);
116 if (sign_table[t1] != sign_table[t2])
119 std::pair<tag_type, value_type> ret = this->checked_register(product, prod_kind);
120 product_tags[std::make_pair(t1, t2)] = ret;
126 template <
class Matrix,
class SymmGroup>
129 typedef typename Map::const_iterator it_t;
131 std::vector<tag_type> unique_ops;
132 for (it_t it_s = sample.begin(); it_s != sample.end(); ++it_s)
135 for (
typename std::vector<tag_type>::iterator it_unique = unique_ops.begin(); it_unique != unique_ops.end(); ++it_unique)
136 if (
equal((*operator_table)[(*it_s).second.first], (*operator_table)[*it_unique]).first)
143 unique_ops.push_back((*it_s).second.first);
146 return sample.size() - unique_ops.size();
149 template <
class Matrix,
class SymmGroup>
151 std::set<tag_type> utags;
152 for (
pair_map_it_t it = product_tags.begin(); it != product_tags.end(); ++it)
153 utags.insert(it->second.first);
159 template <
class Matrix,
class SymmGroup>
166 assert( t1 < base::get_operator_table()->size() && t2 < base::get_operator_table()->size() );
170 #if defined(__xlC__) || defined(__FCC_VERSION)
171 if (kron_tags.count(std::make_pair(t1, t2)) == 0)
172 throw std::out_of_range(
"");
174 return kron_tags[std::make_pair(t1, t2)].first;
176 return kron_tags.at(std::make_pair(t1, t2)).first;
180 catch(
const std::out_of_range& e) {
183 op_t& op1 = (*base::get_operator_table())[t1];
184 op_t& op2 = (*base::get_operator_table())[t2];
186 op_kron(phys_i1, phys_i2, op1, op2, product);
190 tag_type ret = kronecker_table->register_op(product);
191 kron_tags[std::make_pair(t1, t2)] = std::make_pair(ret, 1.0);
197 template <
class Matrix,
class SymmGroup>
199 return kronecker_table->size();
std::pair< tag_type, mvalue_type > checked_register(op_t const &sample)
tag_type register_op(op_t const &op_)
pair_map_t::const_iterator pair_map_it_t
tag_type get_kron_tag(Index< SymmGroup > const &phys_i1, Index< SymmGroup > const &phys_i2, tag_type t1, tag_type t2)
tag_detail::tag_type tag_type
void remove_empty_blocks(block_matrix< Matrix, SymmGroup > &op)
void op_kron(Index< SymmGroup > const &phys_A, Index< SymmGroup > const &phys_B, block_matrix< Matrix1, SymmGroup > const &A, block_matrix< Matrix1, SymmGroup > const &B, block_matrix< Matrix2, SymmGroup > &C)
tag_type get_num_products() const
tag_type get_num_kron_products() const
OPTable< Matrix, SymmGroup >::tag_type tag_type
Matrix::value_type value_type
std::pair< bool, typename Matrix::value_type > equal(block_matrix< Matrix, SymmGroup > const &reference, block_matrix< Matrix, SymmGroup > const &sample)
void gemm(block_matrix< Matrix1, SymmGroup > const &A, block_matrix< Matrix2, SymmGroup > const &B, block_matrix< Matrix3, SymmGroup > &C)
tag_type register_op(const op_t &op_, tag_detail::operator_kind kind)
std::pair< tag_type, value_type > get_product_tag(const tag_type t1, const tag_type t2)