12#include "utils/vec_clone.hpp"
22 class SymmetryType_class{
29 std::string getname(
const int &stype);
31 extern SymmetryType_class
SymType;
35 class Symmetry_base:
public intrusive_ptr_base<Symmetry_base>{
39 Symmetry_base():stype_id(
SymType.Void){};
40 Symmetry_base(
const int &n):stype_id(
SymType.Void){
43 Symmetry_base(
const Symmetry_base &rhs);
44 Symmetry_base& operator=(
const Symmetry_base &rhs);
46 std::vector<cytnx_int64> combine_rule(
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
47 cytnx_int64 combine_rule(
const cytnx_int64 &inL,
const cytnx_int64 &inR);
52 virtual void Init(
const int &n){};
53 virtual boost::intrusive_ptr<Symmetry_base> clone(){
return nullptr;};
54 virtual bool check_qnum(
const cytnx_int64 &in_qnum);
55 virtual bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
56 virtual void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
57 virtual void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
58 virtual void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
59 virtual void print_info()
const;
66 class U1Symmetry :
public Symmetry_base{
68 U1Symmetry(){this->stype_id =
SymType.U;};
69 U1Symmetry(
const int &n){this->Init(n);};
70 void Init(
const int &n){
75 boost::intrusive_ptr<Symmetry_base> clone(){
76 boost::intrusive_ptr<Symmetry_base> out(
new U1Symmetry(this->n));
79 bool check_qnum(
const cytnx_int64 &in_qnum);
80 bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
81 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
82 void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
83 void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
84 void print_info()
const;
89 class ZnSymmetry :
public Symmetry_base{
91 ZnSymmetry(){this->stype_id =
SymType.Z;};
92 ZnSymmetry(
const int &n){this->Init(n);};
93 void Init(
const int &n){
96 if(n<=1)
cytnx_error_msg(1,
"%s",
"[ERROR] ZnSymmetry can only have n > 1");
98 boost::intrusive_ptr<Symmetry_base> clone(){
99 boost::intrusive_ptr<Symmetry_base> out(
new ZnSymmetry(this->n));
102 bool check_qnum(
const cytnx_int64 &in_qnum);
103 bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
104 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
105 void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
106 void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
107 void print_info()
const;
118 boost::intrusive_ptr<Symmetry_base> _impl;
120 Symmetry(
const int &
stype=-1,
const int &
n=0): _impl(
new Symmetry_base()){
124 void Init(
const int &
stype=-1,
const int &
n=0){
126 boost::intrusive_ptr<Symmetry_base> tmp(
new U1Symmetry(1));
129 boost::intrusive_ptr<Symmetry_base> tmp(
new ZnSymmetry(
n));
136 this->_impl = rhs._impl;
140 this->_impl = rhs._impl;
223 out._impl = this->_impl->
clone();
235 return this->_impl->stype_id;
248 return this->_impl->n;
258 return SymType.getname(this->_impl->stype_id) + std::to_string(this->_impl->n);
270 return this->_impl->check_qnum(qnum);
280 return this->_impl->check_qnums(qnums);
290 std::vector<cytnx_int64>
combine_rule(
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR){
291 return this->_impl->combine_rule(inL,inR);
301 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR){
302 this->_impl->combine_rule_(out,inL,inR);
313 return this->_impl->combine_rule(inL,inR);
324 this->_impl->combine_rule_(out,inL,inR);
329 this->_impl->reverse_rule_(out,in);
333 return this->_impl->reverse_rule(in);
336 void Save(
const std::string &fname)
const;
337 void Save(
const char* fname)
const;
342 void _Save(std::fstream &f)
const;
343 void _Load(std::fstream &f);
347 this->_impl->print_info();
the symmetry object
Definition Symmetry.hpp:114
static Symmetry Zn(const int &n)
create a Zn descrete symmetry object with
Definition Symmetry.hpp:203
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number is within the valid value range of current Symmetry.
Definition Symmetry.hpp:269
std::vector< cytnx_int64 > combine_rule(const std::vector< cytnx_int64 > &inL, const std::vector< cytnx_int64 > &inR)
apply combine rule of current symmetry to two quantum number lists.
Definition Symmetry.hpp:290
std::string stype_str() const
return the symmetry type name of current Symmetry object.
Definition Symmetry.hpp:257
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:221
bool check_qnums(const std::vector< cytnx_int64 > &qnums)
check all the quantum numbers are within the valid value range of current Symmetry.
Definition Symmetry.hpp:279
static Symmetry Load(const std::string &fname)
Definition Symmetry.cpp:193
int stype() const
return the symmetry type-id of current Symmetry object.
Definition Symmetry.hpp:234
int & n() const
return the descrete n of current Symmetry object.
Definition Symmetry.hpp:247
bool operator==(const Symmetry &rhs) const
Definition Symmetry.cpp:13
void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR)
apply combine rule of current symmetry to two quantum numbers, and store the combined quntun number i...
Definition Symmetry.hpp:323
void combine_rule_(std::vector< cytnx_int64 > &out, const std::vector< cytnx_int64 > &inL, const std::vector< cytnx_int64 > &inR)
apply combine rule of current symmetry to two quantum number lists, and store it into parameter
Definition Symmetry.hpp:301
cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR)
apply combine rule of current symmetry to two quantum numbers.
Definition Symmetry.hpp:312
void print_info() const
Definition Symmetry.hpp:346
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:172
void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in)
Definition Symmetry.hpp:328
bool operator!=(const Symmetry &rhs) const
Definition Symmetry.cpp:16
void Save(const std::string &fname) const
Definition Symmetry.cpp:173
cytnx_int64 reverse_rule(const cytnx_int64 &in)
Definition Symmetry.hpp:332
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
std::ostream & operator<<(std::ostream &os, const Scalar &in)
Definition Scalar.cpp:14
int64_t cytnx_int64
Definition Type.hpp:25
SymmetryType_class SymType
Definition Symmetry.cpp:247