7#include <initializer_list>
13#include "utils/vec_clone.hpp"
41 class Bond_impl :
public intrusive_ptr_base<Bond_impl> {
47 std::vector<cytnx_uint64> _degs;
52 std::vector<std::vector<cytnx_int64>> _qnums;
53 std::vector<Symmetry> _syms;
55 Bond_impl() : _dim(0), _type(bondType::BD_REG){};
57 void _rm_qnum(
const cytnx_uint64 &q_index) {
59 this->_dim -= this->_degs[q_index];
60 this->_degs.erase(this->_degs.begin() + q_index);
61 this->_qnums.erase(this->_qnums.begin() + q_index);
64 void Init(
const cytnx_uint64 &dim,
const bondType &bd_type = bondType::BD_REG);
67 void Init(
const bondType &bd_type,
const std::vector<std::vector<cytnx_int64>> &in_qnums,
68 const std::vector<cytnx_uint64> °s,
const std::vector<Symmetry> &in_syms = {});
70 bondType type()
const {
return this->_type; };
71 const std::vector<std::vector<cytnx_int64>> &qnums()
const {
return this->_qnums; }
72 std::vector<std::vector<cytnx_int64>> &qnums() {
return this->_qnums; }
73 const cytnx_uint64 &dim()
const {
return this->_dim; }
74 cytnx_uint32 Nsym()
const {
return this->_syms.size(); }
75 const std::vector<Symmetry> &syms()
const {
return this->_syms; }
76 std::vector<Symmetry> &syms() {
return this->_syms; }
79 std::vector<std::vector<cytnx_int64>> qnums_clone()
const {
return this->_qnums; }
80 std::vector<Symmetry> syms_clone()
const {
return vec_clone(this->_syms); }
82 bool has_duplicate_qnums()
const {
83 if (this->_degs.size()) {
84 auto tmp = this->_qnums;
85 std::sort(tmp.begin(), tmp.end());
86 return std::adjacent_find(tmp.begin(), tmp.end()) != tmp.end();
92 void set_type(
const bondType &new_bondType) {
93 if ((this->_type != BD_REG)) {
94 if (new_bondType == BD_REG) {
96 "[ERROR] cannot change type to BD_REG for a symmetry bond.%s",
"\n");
98 if (std::abs(
int(this->_type)) != std::abs(
int(new_bondType))) {
100 "[ERROR] cannot exchange BDtype between BD_* <-> gBD_* .%s",
"\n");
104 this->_type = new_bondType;
108 if (this->_type != BD_REG) {
109 cytnx_error_msg(this->_qnums.size(),
"[ERROR] cannot clear type for a symmetry bond.%s",
112 this->_type = bondType::BD_REG;
115 boost::intrusive_ptr<Bond_impl> clone()
const {
116 boost::intrusive_ptr<Bond_impl> out(
new Bond_impl());
117 out->_dim = this->dim();
118 out->_type = this->type();
119 out->_qnums = this->qnums_clone();
120 out->_syms = this->syms_clone();
121 out->_degs = this->_degs;
127 void combineBond_(
const boost::intrusive_ptr<Bond_impl> &bd_in,
const bool &is_grp =
true);
129 boost::intrusive_ptr<Bond_impl> combineBond(
const boost::intrusive_ptr<Bond_impl> &bd_in,
130 const bool &is_grp =
true) {
131 boost::intrusive_ptr<Bond_impl> out = this->clone();
132 out->combineBond_(bd_in, is_grp);
137 std::vector<std::vector<cytnx_int64>> getUniqueQnums(std::vector<cytnx_uint64> &counts,
138 const bool &return_counts);
141 cytnx_uint64 getDegeneracy(
const std::vector<cytnx_int64> &qnum,
const bool &return_indices,
142 std::vector<cytnx_uint64> &indices);
145 std::vector<std::vector<cytnx_int64>> calc_reverse_qnums();
147 std::vector<cytnx_uint64> &getDegeneracies() {
return this->_degs; };
148 const std::vector<cytnx_uint64> &getDegeneracies()
const {
return this->_degs; };
150 fermionParity get_fermion_parity(
const std::vector<cytnx_int64> &qnum);
152 std::vector<cytnx_uint64> group_duplicates_();
154 boost::intrusive_ptr<Bond_impl> group_duplicates(std::vector<cytnx_uint64> &mapper)
const {
155 boost::intrusive_ptr<Bond_impl> out = this->clone();
156 mapper = out->group_duplicates_();
160 void force_combineBond_(
const boost::intrusive_ptr<Bond_impl> &bd_in,
const bool &is_grp);
181 boost::intrusive_ptr<Bond_impl> _impl;
182 Bond() : _impl(
new Bond_impl()){};
183 Bond(
const Bond &rhs) { this->_impl = rhs._impl; }
185 this->_impl = rhs._impl;
203 : _impl(new Bond_impl()) {
204 this->_impl->Init(
dim, bd_type);
227 Bond(
const bondType &bd_type,
const std::vector<std::vector<cytnx_int64>> &in_qnums,
228 const std::vector<cytnx_uint64> °s,
const std::vector<Symmetry> &in_syms = {})
229 : _impl(new Bond_impl()) {
230 this->_impl->Init(bd_type, in_qnums, degs, in_syms);
240 Bond(
const bondType &bd_type,
const std::initializer_list<std::vector<cytnx_int64>> &in_qnums,
241 const std::vector<cytnx_uint64> °s,
const std::vector<Symmetry> &in_syms = {})
242 : _impl(new Bond_impl()) {
243 this->_impl->Init(bd_type, in_qnums, degs, in_syms);
255 const std::vector<cytnx_uint64> °s,
const std::vector<Symmetry> &in_syms = {})
256 : _impl(new Bond_impl()) {
257 vec2d<cytnx_int64>
qnums(in_qnums.begin(), in_qnums.end());
258 this->_impl->Init(bd_type,
qnums, degs, in_syms);
269 const std::vector<std::pair<std::vector<cytnx_int64>, cytnx_uint64>> &in_qnums_dims,
270 const std::vector<Symmetry> &in_syms = {})
271 : _impl(new Bond_impl()) {
272 this->
Init(bd_type, in_qnums_dims, in_syms);
303 this->_impl->Init(
dim, bd_type);
341 void Init(
const bondType &bd_type,
const std::vector<std::vector<cytnx_int64>> &in_qnums,
342 const std::vector<cytnx_uint64> °s,
const std::vector<Symmetry> &in_syms = {}) {
343 this->_impl->Init(bd_type, in_qnums, degs, in_syms);
352 const std::vector<std::pair<std::vector<cytnx_int64>, cytnx_uint64>> &in_qnums_dims,
353 const std::vector<Symmetry> &in_syms = {}) {
354 vec2d<cytnx_int64>
qnums(in_qnums_dims.size());
355 std::vector<cytnx_uint64> degs(in_qnums_dims.size());
356 for (
int i = 0; i < in_qnums_dims.size(); i++) {
357 qnums[i] = in_qnums_dims[i].first;
358 degs[i] = in_qnums_dims[i].second;
360 this->_impl->Init(bd_type,
qnums, degs, in_syms);
375 const std::vector<std::vector<cytnx_int64>> &
qnums()
const {
return this->_impl->qnums(); };
379 std::vector<std::vector<cytnx_int64>> &
qnums() {
return this->_impl->qnums(); };
388 return this->_impl->qnums_clone();
395 cytnx_uint64
dim()
const {
return this->_impl->dim(); };
401 cytnx_uint32
Nsym()
const {
return this->_impl->syms().size(); };
409 const std::vector<Symmetry> &
syms()
const {
return this->_impl->syms(); };
413 std::vector<Symmetry> &
syms() {
return this->_impl->syms(); };
421 std::vector<Symmetry>
syms_clone()
const {
return this->_impl->syms_clone(); };
431 this->_impl->
set_type(new_bondType);
445 auto out = this->
clone();
446 out.set_type(new_bondType);
455 auto out = this->
clone();
456 out.set_type(
bondType(
int(out.type()) * -1));
492 out._impl = this->_impl->
clone();
523 this->_impl->combineBond_(bd_in._impl, is_grp);
555 out._impl = this->_impl->
combineBond(bd_in._impl, is_grp);
588 for (cytnx_uint64 i = 0; i < bds.size(); i++) {
610 void combineBond_(
const std::vector<Bond> &bds,
const bool &is_grp =
true) {
611 for (cytnx_uint64 i = 0; i < bds.size(); i++) {
648 "Bond combineBond(const Bond &bd_in, const bool &is_grp) const "
650 combineBonds(
const std::vector<Bond> &bds,
const bool &is_grp =
true) {
652 for (cytnx_uint64 i = 0; i < bds.size(); i++) {
689 "combineBond_(const std::vector<Bond> &bds, const bool &is_grp) "
692 for (cytnx_uint64 i = 0; i < bds.size(); i++) {
704 std::vector<std::vector<cytnx_int64>>
getUniqueQnums(std::vector<cytnx_uint64> &counts) {
705 return this->_impl->getUniqueQnums(counts,
true);
715 std::vector<cytnx_uint64> tmp;
716 return this->_impl->getUniqueQnums(tmp,
false);
733 std::vector<cytnx_uint64> tmp;
734 return this->_impl->getDegeneracy(qnum,
false, tmp);
751 std::vector<cytnx_uint64> &indices)
const {
753 return this->_impl->getDegeneracy(qnum,
true, indices);
764 std::vector<cytnx_uint64> &
getDegeneracies() {
return this->_impl->getDegeneracies(); }
770 return this->_impl->getDegeneracies();
779 return this->_impl->get_fermion_parity(qnum);
847 return this->_impl->calc_reverse_qnums();
857 void Save(
const std::string &fname)
const;
862 void Save(
const char *fname)
const;
878 void _Save(std::fstream &f)
const;
879 void _Load(std::fstream &f);
943 std::ostream &operator<<(std::ostream &os,
const Bond &bin);
the object contains auxiliary properties for each Tensor rank (bond)
Definition Bond.hpp:178
std::vector< std::vector< cytnx_int64 > > & qnums()
Definition Bond.hpp:379
Bond & set_type(const bondType &new_bondType)
change the tag-type of the instance Bond
Definition Bond.hpp:430
cytnx_uint64 getDegeneracy(const std::vector< cytnx_int64 > &qnum) const
return the degeneracy of specify qnum set.
Definition Bond.hpp:732
std::vector< cytnx_uint64 > group_duplicates_()
Group the duplicated quantum number, inplacely.
Definition Bond.hpp:798
Bond combineBond(const std::vector< Bond > &bds, const bool &is_grp=true)
combine multiple input bonds with self, and return a new combined Bond instance.
Definition Bond.hpp:586
static cytnx::Bond Load(const std::string &fname)
Load the Bond object from the file.
void Init(const bondType &bd_type, const std::vector< std::pair< std::vector< cytnx_int64 >, cytnx_uint64 > > &in_qnums_dims, const std::vector< Symmetry > &in_syms={})
Definition Bond.hpp:351
Bond retype(const bondType &new_bondType)
create a new instance of Bond with type changed to the new tag-type.
Definition Bond.hpp:444
void combineBonds_(const std::vector< Bond > &bds, const bool &is_grp=true)
combine multiple input bonds with self, inplacely
Definition Bond.hpp:691
Bond & operator*=(const Bond &rhs)
The multiplication assignment operator of the Bond object.
Definition Bond.hpp:936
const std::vector< Symmetry > & syms() const
return the vector of symmetry objects by reference.
Definition Bond.hpp:409
Bond(const cytnx_uint64 &dim, const bondType &bd_type=bondType::BD_REG)
The constructor of the Bond object.
Definition Bond.hpp:202
Bond combineBond(const Bond &bd_in, const bool &is_grp=true) const
combine the input bond with self, and return a new combined Bond instance.
Definition Bond.hpp:553
std::vector< std::vector< cytnx_int64 > > qnums_clone() const
return the clone (deep copy) of the current quantum number set(s)
Definition Bond.hpp:387
Bond combineBonds(const std::vector< Bond > &bds, const bool &is_grp=true)
combine multiple input bonds with self, and return a new combined Bond instance.
Definition Bond.hpp:650
Bond operator*(const Bond &rhs) const
The multiplication operator of the Bond object.
Definition Bond.hpp:917
Bond group_duplicates(std::vector< cytnx_uint64 > &mapper) const
Group the duplicated quantum number and return the new instance of the Bond ojbect.
Definition Bond.hpp:820
void Init(const cytnx_uint64 &dim, const bondType &bd_type=bondType::BD_REG)
init a bond object
Definition Bond.hpp:302
void clear_type()
change the tag-type to the default value bondType.BD_REG.
Definition Bond.hpp:474
Bond(const bondType &bd_type, const std::vector< cytnx::Qs > &in_qnums, const std::vector< cytnx_uint64 > °s, const std::vector< Symmetry > &in_syms={})
Definition Bond.hpp:254
Bond redirect() const
create a new instance of Bond with type changed in between bondType.BD_BRA / bondType....
Definition Bond.hpp:454
const std::vector< cytnx_uint64 > & getDegeneracies() const
Definition Bond.hpp:769
void combineBond_(const std::vector< Bond > &bds, const bool &is_grp=true)
combine multiple input bonds with self, inplacely
Definition Bond.hpp:610
std::vector< cytnx_uint64 > & getDegeneracies()
return all degeneracies.
Definition Bond.hpp:764
fermionParity get_fermion_parity(const std::vector< cytnx_int64 > &qnum)
return fermionic parity for a given quantum number
Definition Bond.hpp:778
bondType type() const
return the current bond type (see cytnx::bondType).
Definition Bond.hpp:367
Bond clone() const
return a copy of the instance Bond
Definition Bond.hpp:490
cytnx_uint64 getDegeneracy(const std::vector< cytnx_int64 > &qnum, std::vector< cytnx_uint64 > &indices) const
return the degeneracy of specify qnum set.
Definition Bond.hpp:750
std::vector< Symmetry > syms_clone() const
return copy of the vector of symmetry objects.
Definition Bond.hpp:421
Bond & redirect_()
Change the bond type between bondType.BD_BRA and bondType.BD_KET in the Bond.
Definition Bond.hpp:464
cytnx_uint64 dim() const
return the dimension of the bond
Definition Bond.hpp:395
std::vector< std::vector< cytnx_int64 > > getUniqueQnums()
return a sorted qnum sets by removing all the duplicate qnum sets.
Definition Bond.hpp:714
const std::vector< std::vector< cytnx_int64 > > & qnums() const
return the current quantum number set(s) by reference
Definition Bond.hpp:375
void combineBond_(const Bond &bd_in, const bool &is_grp=true)
Combine the input bond with self, inplacely.
Definition Bond.hpp:522
std::vector< Symmetry > & syms()
Definition Bond.hpp:413
Bond(const bondType &bd_type, const std::vector< std::pair< std::vector< cytnx_int64 >, cytnx_uint64 > > &in_qnums_dims, const std::vector< Symmetry > &in_syms={})
Definition Bond.hpp:268
void Save(const char *fname) const
cytnx_uint32 Nsym() const
return the number of the symmetries
Definition Bond.hpp:401
bool has_duplicate_qnums() const
Check whether there is duplicated quantum numbers in the Bond.
Definition Bond.hpp:836
std::vector< std::vector< cytnx_int64 > > getUniqueQnums(std::vector< cytnx_uint64 > &counts)
return a sorted qnum sets by removing all the duplicate qnum sets.
Definition Bond.hpp:704
std::vector< std::vector< cytnx_int64 > > calc_reverse_qnums()
Calculate the reverse of the quantum numbers.
Definition Bond.hpp:846
Bond(const bondType &bd_type, const std::vector< std::vector< cytnx_int64 > > &in_qnums, const std::vector< cytnx_uint64 > °s, const std::vector< Symmetry > &in_syms={})
The constructor of the Bond object.
Definition Bond.hpp:227
bool operator!=(const Bond &rhs) const
The comparison operator 'not equal to'.
void Init(const bondType &bd_type, const std::vector< std::vector< cytnx_int64 > > &in_qnums, const std::vector< cytnx_uint64 > °s, const std::vector< Symmetry > &in_syms={})
init a bond object
Definition Bond.hpp:341
void Save(const std::string &fname) const
Save the Bond object to the file.
static cytnx::Bond Load(const char *fname)
Bond(const bondType &bd_type, const std::initializer_list< std::vector< cytnx_int64 > > &in_qnums, const std::vector< cytnx_uint64 > °s, const std::vector< Symmetry > &in_syms={})
Definition Bond.hpp:240
bool operator==(const Bond &rhs) const
The comparison operator 'equal to'.
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:18
Definition Accessor.hpp:12
bondType
bond type
Definition Bond.hpp:31
@ BD_IN
Definition Bond.hpp:36
@ BD_OUT
Definition Bond.hpp:37
@ BD_NONE
Definition Bond.hpp:35
@ BD_REG
Definition Bond.hpp:34
@ BD_BRA
Definition Bond.hpp:33
@ BD_KET
Definition Bond.hpp:32
fermionParity
fermionParity
Definition Symmetry.hpp:40