Cytnx v0.9.1
Loading...
Searching...
No Matches
Symmetry.hpp
Go to the documentation of this file.
1#ifndef _H_Symmetry
2#define _H_Symmetry
3
4#include "Type.hpp"
5#include "cytnx_error.hpp"
7#include <string>
8#include <cstdio>
9#include <iostream>
10#include <ostream>
11#include "utils/vec_clone.hpp"
12namespace cytnx {
14 struct __sym {
15 enum __stype { U = -1, Z = 0 };
16 };
17
18 class SymmetryType_class {
19 public:
20 enum : int {
21 Void = -99,
22 U = -1,
23 Z = 0,
24 };
25 std::string getname(const int &stype);
26 };
28
41 extern SymmetryType_class SymType;
42
43
44 // helper class, has implicitly conversion to vector<int64>!
45 class Qs{
46 private:
47 std::vector<cytnx_int64> tmpQs;
48
49 public:
50
51 template <class... Ts>
52 Qs(const cytnx_int64 &e1, const Ts... elems) {
53 this->tmpQs = dynamic_arg_int64_resolver(e1, elems...);
54 }
55
56 Qs(const std::vector<cytnx_int64> &qin){
57 this->tmpQs = qin;
58 }
59
60 // interprete as 2d vector directly implicitly convert!
61 explicit operator std::vector<cytnx_int64>() const {
62 return this->tmpQs;
63 };
64
65 std::pair<std::vector<cytnx_int64>, cytnx_uint64> operator>>(const cytnx_uint64 &dim){
66 return make_pair(this->tmpQs,dim);
67 }
68
69 };
70
71 /*
72 template<class... Ts>
73 std::vector<cytnx_int64> Qs(const cytnx_int64 &e1, const Ts &...elems){
74 std::vector<cytnx_int64> argv = dynamic_arg_int64_resolver(e1, elems...);
75 return argv;
76 }
77 */
78
80 class Symmetry_base : public intrusive_ptr_base<Symmetry_base> {
81 public:
82 int stype_id;
83 int n;
84 Symmetry_base() : stype_id(SymType.Void){};
85 Symmetry_base(const int &n) : stype_id(SymType.Void) { this->Init(n); };
86 Symmetry_base(const Symmetry_base &rhs);
87 Symmetry_base &operator=(const Symmetry_base &rhs);
88
89 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL,
90 const std::vector<cytnx_int64> &inR);
91 cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse);
92
93 cytnx_int64 reverse_rule(const cytnx_int64 &in);
94
95 virtual void Init(const int &n){};
96 virtual boost::intrusive_ptr<Symmetry_base> clone() { return nullptr; };
97 virtual bool check_qnum(
98 const cytnx_int64 &in_qnum); // check the passed in qnums satisfy the symmetry requirement.
99 virtual bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
100 virtual void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
101 const std::vector<cytnx_int64> &inR);
102 virtual void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse);
103 virtual void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
104 virtual void print_info() const;
105 // virtual std::vector<cytnx_int64>& combine_rule(const std::vector<cytnx_int64> &inL, const
106 // std::vector<cytnx_int64> &inR);
107 };
109
111 class U1Symmetry : public Symmetry_base {
112 public:
113 U1Symmetry() { this->stype_id = SymType.U; };
114 U1Symmetry(const int &n) { this->Init(n); };
115 void Init(const int &n) {
116 this->stype_id = SymType.U;
117 this->n = n;
118 if (n != 1) cytnx_error_msg(1, "%s", "[ERROR] U1Symmetry should set n = 1");
119 }
120 boost::intrusive_ptr<Symmetry_base> clone() {
121 boost::intrusive_ptr<Symmetry_base> out(new U1Symmetry(this->n));
122 return out;
123 }
124 bool check_qnum(const cytnx_int64 &in_qnum);
125 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
126 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
127 const std::vector<cytnx_int64> &inR);
128 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse);
129 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
130 void print_info() const;
131 };
133
135 class ZnSymmetry : public Symmetry_base {
136 public:
137 ZnSymmetry() { this->stype_id = SymType.Z; };
138 ZnSymmetry(const int &n) { this->Init(n); };
139 void Init(const int &n) {
140 this->stype_id = SymType.Z;
141 this->n = n;
142 if (n <= 1) cytnx_error_msg(1, "%s", "[ERROR] ZnSymmetry can only have n > 1");
143 }
144 boost::intrusive_ptr<Symmetry_base> clone() {
145 boost::intrusive_ptr<Symmetry_base> out(new ZnSymmetry(this->n));
146 return out;
147 }
148 bool check_qnum(const cytnx_int64 &in_qnum);
149 bool check_qnums(const std::vector<cytnx_int64> &in_qnums);
150 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
151 const std::vector<cytnx_int64> &inR);
152 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse);
153 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in);
154 void print_info() const;
155 };
157
158 //=====================================
159 // this is API
161 class Symmetry {
162 public:
163 //[Note] these two are hide from user.
165 boost::intrusive_ptr<Symmetry_base> _impl;
166
167 Symmetry(const int &stype = -1, const int &n = 0) : _impl(new Symmetry_base()) {
168 this->Init(stype, n);
169 }; // default is U1Symmetry
170
171 void Init(const int &stype = -1, const int &n = 0) {
172 if (stype == SymType.U) {
173 boost::intrusive_ptr<Symmetry_base> tmp(new U1Symmetry(1));
174 this->_impl = tmp;
175 } else if (stype == SymType.Z) {
176 boost::intrusive_ptr<Symmetry_base> tmp(new ZnSymmetry(n));
177 this->_impl = tmp;
178 } else {
179 cytnx_error_msg(1, "%s", "[ERROR] invalid symmetry type.");
180 }
181 }
182 Symmetry &operator=(const Symmetry &rhs) {
183 this->_impl = rhs._impl;
184 return *this;
185 }
186 Symmetry(const Symmetry &rhs) { this->_impl = rhs._impl; }
188
189 //[genenrators]
218 static Symmetry U1() { return Symmetry(SymType.U, 1); }
219
249 static Symmetry Zn(const int &n) { return Symmetry(SymType.Z, n); }
250
265 Symmetry clone() const {
266 Symmetry out;
267 out._impl = this->_impl->clone();
268 return out;
269 }
270
277 int stype() const { return this->_impl->stype_id; }
278
288 int &n() const { return this->_impl->n; }
289
296 std::string stype_str() const {
297 return SymType.getname(this->_impl->stype_id) + std::to_string(this->_impl->n);
298 }
299
306 bool check_qnum(const cytnx_int64 &qnum) { return this->_impl->check_qnum(qnum); }
307
314 bool check_qnums(const std::vector<cytnx_int64> &qnums) {
315 return this->_impl->check_qnums(qnums);
316 }
317
324 std::vector<cytnx_int64> combine_rule(const std::vector<cytnx_int64> &inL,
325 const std::vector<cytnx_int64> &inR) {
326 return this->_impl->combine_rule(inL, inR);
327 }
328
336 void combine_rule_(std::vector<cytnx_int64> &out, const std::vector<cytnx_int64> &inL,
337 const std::vector<cytnx_int64> &inR) {
338 this->_impl->combine_rule_(out, inL, inR);
339 }
340
347 cytnx_int64 combine_rule(const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse = false) const {
348 return this->_impl->combine_rule(inL, inR, is_reverse);
349 }
350
358 void combine_rule_(cytnx_int64 &out, const cytnx_int64 &inL, const cytnx_int64 &inR, const bool &is_reverse=false) {
359 this->_impl->combine_rule_(out, inL, inR, is_reverse);
360 }
361
369 void reverse_rule_(cytnx_int64 &out, const cytnx_int64 &in) {
370 this->_impl->reverse_rule_(out, in);
371 }
372
380 cytnx_int64 reverse_rule(const cytnx_int64 &in) const { return this->_impl->reverse_rule(in); }
381
387 void Save(const std::string &fname) const;
388
392 void Save(const char *fname) const;
393
400 static Symmetry Load(const std::string &fname);
401
405 static Symmetry Load(const char *fname);
406
408 void _Save(std::fstream &f) const;
409 void _Load(std::fstream &f);
411
415 void print_info() const { this->_impl->print_info(); }
416
420 bool operator==(const Symmetry &rhs) const;
421
425 bool operator!=(const Symmetry &rhs) const;
426 };
427
428 std::ostream &operator<<(std::ostream &os, const Symmetry &in);
429
430} // namespace cytnx
431#endif
Definition Symmetry.hpp:45
Qs(const cytnx_int64 &e1, const Ts... elems)
Definition Symmetry.hpp:52
Qs(const std::vector< cytnx_int64 > &qin)
Definition Symmetry.hpp:56
std::pair< std::vector< cytnx_int64 >, cytnx_uint64 > operator>>(const cytnx_uint64 &dim)
Definition Symmetry.hpp:65
the symmetry object
Definition Symmetry.hpp:161
static Symmetry Zn(const int &n)
create a Zn descrete symmetry object with
Definition Symmetry.hpp:249
bool check_qnum(const cytnx_int64 &qnum)
check the quantum number qnum is within the valid value range of current Symmetry.
Definition Symmetry.hpp:306
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:324
std::string stype_str() const
return the symmetry type name of current Symmetry object in string form, see cytnx::SymType.
Definition Symmetry.hpp:296
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:347
Symmetry clone() const
return a clone instance of current Symmetry object.
Definition Symmetry.hpp:265
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:314
static Symmetry Load(const std::string &fname)
Load a Symmetry object from a file.
Definition Symmetry.cpp:200
int stype() const
return the symmetry type-id of current Symmetry object, see cytnx::SymType.
Definition Symmetry.hpp:277
int & n() const
return the descrete n of current Symmetry object.
Definition Symmetry.hpp:288
bool operator==(const Symmetry &rhs) const
the equality operator of the Symmetry object.
Definition Symmetry.cpp:12
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:336
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:358
void print_info() const
Print the information of current Symmetry object.
Definition Symmetry.hpp:415
static Symmetry U1()
create a U1 symmetry object
Definition Symmetry.hpp:218
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:380
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:369
bool operator!=(const Symmetry &rhs) const
the inequality operator of the Symmetry object.
Definition Symmetry.cpp:15
void Save(const std::string &fname) const
Save the current Symmetry object to a file.
Definition Symmetry.cpp:180
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:16
Definition Accessor.hpp:12
std::ostream & operator<<(std::ostream &os, const Scalar &in)
The stream operator for Scalar objects.
Definition Scalar.cpp:10
uint64_t cytnx_uint64
Definition Type.hpp:45
int64_t cytnx_int64
Definition Type.hpp:48
SymmetryType_class SymType
Symmetry type.
Definition Symmetry.cpp:250