1#ifndef _GLUCAT_GENERATION_IMP_H
2#define _GLUCAT_GENERATION_IMP_H
38namespace glucat {
namespace gen
47 template<
class Matrix_T >
55 template<
class Matrix_T >
61 const auto bott =
pos_mod(p-q, 8);
67 return &(gen_vector(p, q)[q]);
72 return &(gen_vector(super_p, super_q)[super_q]);
77 template<
class Matrix_T >
82 using result_t = std::vector<Matrix_T>;
83 const auto card = p + q;
84 const auto bias = p - q;
85 const auto bott =
pos_mod(bias, 8);
87 if (this->find(sig) == this->end())
93 gen_from_pp4_qm4(gen_vector(p+4, q-4), sig);
96 gen_from_pm4_qp4(gen_vector(p-4, q+4), sig);
99 auto result = result_t(1, matrix::unit<Matrix_T>(1));
100 this->insert(make_pair(sig, result));
104 gen_from_pm1_qm1(gen_vector(p-1, q-1), sig);
109 gen_from_pp4_qm4(gen_vector(p+4, q-4), sig);
112 gen_from_pm4_qp4(gen_vector(p-4, q+4), sig);
115 gen_from_qp1_pm1(gen_vector(q+1, p-1), sig);
125 template<
class Matrix_T >
130 const auto new_size = old.size() + 2;
131 using size_t =
decltype(new_size);
132 using result_t = std::vector<Matrix_T>;
133 auto result = result_t(new_size);
135 const auto old_dim = old[0].size1();
136 const auto& eye = matrix::unit<Matrix_T>(old_dim);
138 auto neg = Matrix_T(2,2,2);
145 auto dup = Matrix_T(2,2,2);
158 this->insert(make_pair(sig, result));
163 template<
class Matrix_T >
168 const auto old_size = old.size();
169 using size_t =
decltype(old_size);
170 using result_t = std::vector<Matrix_T>;
171 auto result = result_t(old_size);
184 result[k] = old[k+4];
191 this->insert(make_pair(sig, result));
196 template<
class Matrix_T >
201 const auto old_size = old.size();
202 using size_t =
decltype(old_size);
203 using result_t = std::vector<Matrix_T>;
204 auto result = result_t(old_size);
206 auto h = old[old_size-1];
222 result[k] = old[k-4];
224 this->insert(make_pair(sig, result));
229 template<
class Matrix_T >
234 const auto old_size = old.size();
235 using size_t =
decltype(old_size);
236 using result_t = std::vector<Matrix_T>;
237 auto result = result_t(old_size);
239 const auto& h = old[old_size-1];
245 result[old_size-1] = h;
248 this->insert(make_pair(sig, result));
Table of generators for specific signatures.
auto gen_vector(const index_t p, const index_t q) -> const std::vector< Matrix_T > &
Construct a vector of generators for a specific signature.
void gen_from_pm4_qp4(const std::vector< Matrix_T > &old, const signature_t sig)
Construct generators for p,q given generators for p-4,q+4.
static auto generator() -> generator_table< Matrix_T > &
Single instance of generator table.
void gen_from_qp1_pm1(const std::vector< Matrix_T > &old, const signature_t sig)
Construct generators for p,q given generators for q+1,p-1.
auto operator()(const index_t p, const index_t q) -> const Matrix_T *
Pointer to generators for a specific signature.
void gen_from_pp4_qm4(const std::vector< Matrix_T > &old, const signature_t sig)
Construct generators for p,q given generators for p+4,q-4.
void gen_from_pm1_qm1(const std::vector< Matrix_T > &old, const signature_t sig)
Construct generators for p,q given generators for p-1,q-1.
static const std::array< index_t, 8 > offset_to_super
Offsets between the current signature and that of the real superalgebra.
std::pair< index_t, index_t > signature_t
A signature is a pair of indices, p, q, with p == frame.max(), q == -frame.min()
auto mono_kron(const LHS_T &lhs, const RHS_T &rhs) -> const RHS_T
Sparse Kronecker tensor product of monomial matrices.
auto mono_prod(const ublas::matrix_expression< LHS_T > &lhs, const ublas::matrix_expression< RHS_T > &rhs) -> const typename RHS_T::expression_type
Product of monomial matrices.
int index_t
Size of index_t should be enough to represent LO, HI.
auto pos_mod(LHS_T lhs, RHS_T rhs) -> LHS_T
Modulo function which works reliably for lhs < 0.