10#include "utils/vec_clone.hpp"
20 class SymmetryType_class{
27 std::string getname(
const int &stype);
29 extern SymmetryType_class
SymType;
33 class Symmetry_base:
public intrusive_ptr_base<Symmetry_base>{
37 Symmetry_base():stype_id(
SymType.Void){};
38 Symmetry_base(
const int &n):stype_id(
SymType.Void){
41 Symmetry_base(
const Symmetry_base &rhs);
42 Symmetry_base& operator=(
const Symmetry_base &rhs);
44 std::vector<cytnx_int64> combine_rule(
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
45 cytnx_int64 combine_rule(
const cytnx_int64 &inL,
const cytnx_int64 &inR);
50 virtual void Init(
const int &n){};
51 virtual boost::intrusive_ptr<Symmetry_base> clone(){
return nullptr;};
52 virtual bool check_qnum(
const cytnx_int64 &in_qnum);
53 virtual bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
54 virtual void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
55 virtual void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
56 virtual void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
63 class U1Symmetry :
public Symmetry_base{
65 U1Symmetry(){this->stype_id =
SymType.U;};
66 U1Symmetry(
const int &n){this->Init(n);};
67 void Init(
const int &n){
72 boost::intrusive_ptr<Symmetry_base> clone(){
73 boost::intrusive_ptr<Symmetry_base> out(
new U1Symmetry(this->n));
76 bool check_qnum(
const cytnx_int64 &in_qnum);
77 bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
78 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
79 void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
80 void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
85 class ZnSymmetry :
public Symmetry_base{
87 ZnSymmetry(){this->stype_id =
SymType.Z;};
88 ZnSymmetry(
const int &n){this->Init(n);};
89 void Init(
const int &n){
92 if(n<=1)
cytnx_error_msg(1,
"%s",
"[ERROR] ZnSymmetry can only have n > 1");
94 boost::intrusive_ptr<Symmetry_base> clone(){
95 boost::intrusive_ptr<Symmetry_base> out(
new ZnSymmetry(this->n));
98 bool check_qnum(
const cytnx_int64 &in_qnum);
99 bool check_qnums(
const std::vector<cytnx_int64> &in_qnums);
100 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR);
101 void combine_rule_(cytnx_int64 &out,
const cytnx_int64 &inL,
const cytnx_int64 &inR);
102 void reverse_rule_(cytnx_int64 &out,
const cytnx_int64 &in);
113 boost::intrusive_ptr<Symmetry_base> _impl;
115 Symmetry(
const int &
stype=-1,
const int &
n=0): _impl(
new Symmetry_base()){
119 void Init(
const int &
stype=-1,
const int &
n=0){
121 boost::intrusive_ptr<Symmetry_base> tmp(
new U1Symmetry(1));
124 boost::intrusive_ptr<Symmetry_base> tmp(
new ZnSymmetry(
n));
131 this->_impl = rhs._impl;
135 this->_impl = rhs._impl;
218 out._impl = this->_impl->
clone();
230 return this->_impl->stype_id;
243 return this->_impl->n;
253 return SymType.getname(this->_impl->stype_id) + std::to_string(this->_impl->n);
265 return this->_impl->check_qnum(qnum);
275 return this->_impl->check_qnums(qnums);
285 std::vector<cytnx_int64>
combine_rule(
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR){
286 return this->_impl->combine_rule(inL,inR);
296 void combine_rule_(std::vector<cytnx_int64> &out,
const std::vector<cytnx_int64> &inL,
const std::vector<cytnx_int64> &inR){
297 this->_impl->combine_rule_(out,inL,inR);
308 return this->_impl->combine_rule(inL,inR);
319 this->_impl->combine_rule_(out,inL,inR);
324 this->_impl->reverse_rule_(out,in);
328 return this->_impl->reverse_rule(in);
331 void Save(
const std::string &fname)
const;
332 void Save(
const char* fname)
const;
337 void _Save(std::fstream &f)
const;
338 void _Load(std::fstream &f);
the symmetry object
Definition Symmetry.hpp:109
static Symmetry Zn(const int &n)
create a Zn descrete symmetry object with
Definition Symmetry.hpp:198
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number is within the valid value range of current Symmetry.
Definition Symmetry.hpp:264
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:285
std::string stype_str() const
return the symmetry type name of current Symmetry object.
Definition Symmetry.hpp:252
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:216
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:274
static Symmetry Load(const std::string &fname)
Definition Symmetry.cpp:171
int stype() const
return the symmetry type-id of current Symmetry object.
Definition Symmetry.hpp:229
int & n() const
return the descrete n of current Symmetry object.
Definition Symmetry.hpp:242
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:318
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:296
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:307
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:167
void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in)
Definition Symmetry.hpp:323
bool operator!=(const Symmetry &rhs) const
Definition Symmetry.cpp:16
void Save(const std::string &fname) const
Definition Symmetry.cpp:151
cytnx_int64 reverse_rule(const cytnx_int64 &in)
Definition Symmetry.hpp:327
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
int64_t cytnx_int64
Definition Type.hpp:25
SymmetryType_class SymType
Definition Symmetry.cpp:218