Cytnx v1.0.0
Loading...
Searching...
No Matches
Symmetry.hpp
Go to the documentation of this file.
1#ifndef CYTNX_SYMMETRY_H_
2#define CYTNX_SYMMETRY_H_
3
4#include <fstream>
5#include <ostream>
6#include <string>
7#include <vector>
8
9#include "boost/smart_ptr/intrusive_ptr.hpp"
10
11#include "cytnx_error.hpp"
13#include "Type.hpp"
14#include "utils/dynamic_arg_resolver.hpp"
15
16namespace cytnx {
32 enum SymmetryType : int { Void = -99, U = -1, Z = 0, fPar = -2, fNum = -3 };
33
40 enum fermionParity : bool { EVEN = false, ODD = true };
41
42 // helper class, has implicitly conversion to vector<int64>!
43 class Qs {
44 private:
45 std::vector<cytnx_int64> tmpQs;
46
47 public:
48 template <class... Ts>
49 Qs(const cytnx_int64 &e1, const Ts... elems) {
50 this->tmpQs = dynamic_arg_int64_resolver(e1, elems...);
51 }
52
53 Qs(const std::vector<cytnx_int64> &qin) { this->tmpQs = qin; }
54
55 // interprete as 2d vector directly implicitly convert!
56 explicit operator std::vector<cytnx_int64>() const { return this->tmpQs; };
57
58 std::pair<std::vector<cytnx_int64>, cytnx_uint64> operator>>(const cytnx_uint64 &dim) {
59 return std::make_pair(this->tmpQs, dim);
60 }
61 };
62
64 class Symmetry_base : public intrusive_ptr_base<Symmetry_base> {
65 public:
66 int stype_id;
67 int n;
68 Symmetry_base() : stype_id(SymmetryType::Void){};
69 Symmetry_base(const int &n) : stype_id(SymmetryType::Void) { this->Init(n); };
70 Symmetry_base(const Symmetry_base &rhs);
71 Symmetry_base &operator=(const Symmetry_base &rhs);
72
73 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL,
74 const std::vector<cytnx_int64> &inR);
75 cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR,
76 const bool &is_reverse);
77
78 cytnx_int64 reverse_rule(const cytnx_int64 &in);
79
80 virtual void Init(const int &n){};
81 virtual boost::intrusive_ptr<Symmetry_base> clone() { return nullptr; };
82 virtual bool check_qnum(
83 const cytnx_int64 &in_qnum); // check the passed in qnums satisfy the symmetry requirement.
84 virtual bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
85 virtual void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
86 const std::vector<cytnx_int64> &inR);
87 virtual void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
88 const bool &is_reverse);
89 virtual void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
90 virtual fermionParity get_fermion_parity(const cytnx_int64 &in_qnum) const;
91 virtual bool is_fermionic() const { return false; };
92
93 virtual void print_info() const;
94 virtual std::string stype_str() const;
95 // virtual std::vector<cytnx_int64>& combine_rule(const std::vector<cytnx_int64> &inL, const
96 // std::vector<cytnx_int64> &inR);
97 };
99
101 class U1Symmetry : public Symmetry_base {
102 public:
103 U1Symmetry() { this->stype_id = SymmetryType::U; };
104 U1Symmetry(const int &n) { this->Init(n); };
105 void Init(const int &n) {
106 this->stype_id = SymmetryType::U;
107 this->n = n;
108 if (n != 1) cytnx_error_msg(1, "%s", "[ERROR] U1Symmetry should set n = 1");
109 }
110 boost::intrusive_ptr<Symmetry_base> clone() {
111 boost::intrusive_ptr<Symmetry_base> out(new U1Symmetry(this->n));
112 return out;
113 }
114 bool check_qnum(const cytnx_int64 &in_qnum);
115 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
116 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
117 const std::vector<cytnx_int64> &inR);
118 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
119 const bool &is_reverse);
120 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
121 void print_info() const;
122 std::string stype_str() const override { return "U1"; };
123 };
125
127 class ZnSymmetry : public Symmetry_base {
128 public:
129 ZnSymmetry() { this->stype_id = SymmetryType::Z; };
130 ZnSymmetry(const int &n) { this->Init(n); };
131 void Init(const int &n) {
132 this->stype_id = SymmetryType::Z;
133 this->n = n;
134 if (n <= 1) cytnx_error_msg(1, "%s", "[ERROR] ZnSymmetry can only have n > 1");
135 }
136 boost::intrusive_ptr<Symmetry_base> clone() {
137 boost::intrusive_ptr<Symmetry_base> out(new ZnSymmetry(this->n));
138 return out;
139 }
140 bool check_qnum(const cytnx_int64 &in_qnum);
141 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
142 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
143 const std::vector<cytnx_int64> &inR);
144 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
145 const bool &is_reverse);
146 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
147 void print_info() const;
148 std::string stype_str() const override { return "Z" + std::to_string(this->n); };
149 };
151
153 class FermionParitySymmetry : public Symmetry_base {
154 public:
155 FermionParitySymmetry() {
156 this->stype_id = SymmetryType::fPar;
157 this->n = -2;
158 };
159 boost::intrusive_ptr<Symmetry_base> clone() {
160 boost::intrusive_ptr<Symmetry_base> out(new FermionParitySymmetry());
161 return out;
162 }
163 bool check_qnum(const cytnx_int64 &in_qnum);
164 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
165 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
166 const std::vector<cytnx_int64> &inR);
167 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
168 const bool &is_reverse);
169 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
170 fermionParity get_fermion_parity(const cytnx_int64 &in_qnum) const override;
171 bool is_fermionic() const override { return true; };
172 void print_info() const;
173 std::string stype_str() const override { return "fP"; }
174 };
176
178 class FermionNumberSymmetry : public Symmetry_base {
179 public:
180 FermionNumberSymmetry() {
181 this->stype_id = SymmetryType::fNum;
182 this->n = -1;
183 };
184 boost::intrusive_ptr<Symmetry_base> clone() {
185 boost::intrusive_ptr<Symmetry_base> out(new FermionNumberSymmetry());
186 return out;
187 }
188 bool check_qnum(const cytnx_int64 &in_qnum);
189 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
190 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
191 const std::vector<cytnx_int64> &inR);
192 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
193 const bool &is_reverse);
194 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
195 fermionParity get_fermion_parity(const cytnx_int64 &in_qnum) const override;
196 bool is_fermionic() const override { return true; };
197 void print_info() const;
198 std::string stype_str() const override { return "f#"; }
199 };
201
202 //=====================================
203 // this is API
205 class Symmetry {
206 public:
207 //[Note] these two are hide from user.
209 boost::intrusive_ptr<Symmetry_base> _impl;
210
211 Symmetry(const int &stype = -1, const int &n = 0) : _impl(new Symmetry_base()) {
212 this->Init(stype, n);
213 }; // default is U1Symmetry
214
215 void Init(const int &stype = -1, const int &n = 0) {
216 if (stype == SymmetryType::U) {
217 boost::intrusive_ptr<Symmetry_base> tmp(new U1Symmetry(1));
218 this->_impl = tmp;
219 } else if (stype == SymmetryType::Z) {
220 boost::intrusive_ptr<Symmetry_base> tmp(new ZnSymmetry(n));
221 this->_impl = tmp;
222 } else if (stype == SymmetryType::fPar) {
223 boost::intrusive_ptr<Symmetry_base> tmp(new FermionParitySymmetry());
224 this->_impl = tmp;
225 } else if (stype == SymmetryType::fNum) {
226 boost::intrusive_ptr<Symmetry_base> tmp(new FermionNumberSymmetry());
227 this->_impl = tmp;
228 } else {
229 cytnx_error_msg(1, "%s", "[ERROR] invalid symmetry type.");
230 }
231 }
232 Symmetry &operator=(const Symmetry &rhs) {
233 this->_impl = rhs._impl;
234 return *this;
235 }
236 Symmetry(const Symmetry &rhs) { this->_impl = rhs._impl; }
238
239 //[genenrators]
268 static Symmetry U1() { return Symmetry(SymmetryType::U, 1); }
269
299 static Symmetry Zn(const int &n) { return Symmetry(SymmetryType::Z, n); }
300
321
342
357 Symmetry clone() const {
358 Symmetry out;
359 out._impl = this->_impl->clone();
360 return out;
361 }
362
369 int stype() const { return this->_impl->stype_id; }
370
380 int &n() const { return this->_impl->n; }
381
389 std::string stype_str() const { return this->_impl->stype_str(); }
390
397 bool check_qnum(const cytnx_int64 &qnum) { return this->_impl->check_qnum(qnum); }
398
406 bool check_qnums(const std::vector<cytnx_int64> &qnums) {
407 return this->_impl->check_qnums(qnums);
408 }
409
416 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL,
417 const std::vector<cytnx_int64> &inR) {
418 return this->_impl->combine_rule(inL, inR);
419 }
420
428 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
429 const std::vector<cytnx_int64> &inR) {
430 this->_impl->combine_rule_(out, inL, inR);
431 }
432
439 cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR,
440 const bool &is_reverse = false) const {
441 return this->_impl->combine_rule(inL, inR, is_reverse);
442 }
443
451 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR,
452 const bool &is_reverse = false) {
453 this->_impl->combine_rule_(out, inL, inR, is_reverse);
454 }
455
464 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in) {
465 this->_impl->reverse_rule_(out, in);
466 }
467
476 cytnx_int64 reverse_rule(const cytnx_int64 &in) const { return this->_impl->reverse_rule(in); }
477
484 fermionParity get_fermion_parity(const cytnx_int64 &in_qnum) const {
485 return this->_impl->get_fermion_parity(in_qnum);
486 }
487
492 bool is_fermionic() const { return this->_impl->is_fermionic(); }
493
499 void Save(const std::string &fname) const;
500
504 void Save(const char *fname) const;
505
512 static Symmetry Load(const std::string &fname);
513
517 static Symmetry Load(const char *fname);
518
520 void _Save(std::fstream &f) const;
521 void _Load(std::fstream &f);
523
527 void print_info() const { this->_impl->print_info(); }
528
532 bool operator==(const Symmetry &rhs) const;
533
537 bool operator!=(const Symmetry &rhs) const;
538 }; // Symmetry
539
541 std::ostream &operator<<(std::ostream &os, const Symmetry &in);
543
544}; // namespace cytnx
545#endif // CYTNX_SYMMETRY_H_
Definition Symmetry.hpp:43
Qs(const cytnx_int64 &e1, const Ts... elems)
Definition Symmetry.hpp:49
Qs(const std::vector< cytnx_int64 > &qin)
Definition Symmetry.hpp:53
std::pair< std::vector< cytnx_int64 >, cytnx_uint64 > operator>>(const cytnx_uint64 &dim)
Definition Symmetry.hpp:58
the symmetry object
Definition Symmetry.hpp:205
static Symmetry Zn(const int &n)
create a Zn discrete symmetry object with
Definition Symmetry.hpp:299
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number qnum is within the valid value range of current Symmetry.
Definition Symmetry.hpp:397
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:416
std::string stype_str() const
return the symmetry type name of current Symmetry object in string form, see cytnx::SymmetryType::
Definition Symmetry.hpp:389
static Symmetry FermionParity()
create a fermionic parity symmetry object
Definition Symmetry.hpp:320
void Save(const char *fname) const
Same as Save(const std::string &fname) const;.
cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse=false) const
apply combine rule of current symmetry to two quantum numbers.
Definition Symmetry.hpp:439
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:357
static Symmetry FermionNumber()
create a fermionic occupation number symmetry object
Definition Symmetry.hpp:341
bool check_qnums(const std::vector< cytnx_int64 > &qnums)
check all the quantum numbers \qnums are within the valid value range of current Symmetry.
Definition Symmetry.hpp:406
int stype() const
return the symmetry type-id of current Symmetry object, see cytnx::SymmetryType::
Definition Symmetry.hpp:369
int & n() const
return the discrete n of current Symmetry object.
Definition Symmetry.hpp:380
bool operator==(const Symmetry &rhs) const
the equality operator of the Symmetry object.
bool is_fermionic() const
check if the Symmetry is fermionic or not
Definition Symmetry.hpp:492
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 out.
Definition Symmetry.hpp:428
void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse=false)
apply combine rule of current symmetry to two quantum numbers, and store the combined quntun number i...
Definition Symmetry.hpp:451
void print_info() const
Print the information of current Symmetry object.
Definition Symmetry.hpp:527
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:268
cytnx_int64 reverse_rule(const cytnx_int64 &in) const
Apply reverse rule of current symmetry to a given quantum number and return the result.
Definition Symmetry.hpp:476
static Symmetry Load(const char *fname)
Same as static Symmetry Load(const std::string &fname);.
void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in)
Apply reverse rule of current symmetry to a given quantum number and store in parameter out.
Definition Symmetry.hpp:464
bool operator!=(const Symmetry &rhs) const
the inequality operator of the Symmetry object.
void Save(const std::string &fname) const
Save the current Symmetry object to a file.
static Symmetry Load(const std::string &fname)
Load a Symmetry object from a file.
fermionParity get_fermion_parity(const cytnx_int64 &in_qnum) const
fermionic parity for a given quantum number
Definition Symmetry.hpp:484
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
SymmetryType
Symmetry type.
Definition Symmetry.hpp:32
@ U
Definition Symmetry.hpp:32
@ fNum
Definition Symmetry.hpp:32
@ Z
Definition Symmetry.hpp:32
@ Void
Definition Symmetry.hpp:32
@ fPar
Definition Symmetry.hpp:32
fermionParity
fermionParity
Definition Symmetry.hpp:40
@ EVEN
Definition Symmetry.hpp:40
@ ODD
Definition Symmetry.hpp:40