Cytnx v1.0.0
Loading...
Searching...
No Matches
Network.hpp
Go to the documentation of this file.
1#ifndef CYTNX_NETWORK_H_
2#define CYTNX_NETWORK_H_
3
4#include "Type.hpp"
5#include "cytnx_error.hpp"
6#include <initializer_list>
7#include <vector>
8#include <map>
9#include <fstream>
11#include "utils/utils.hpp"
12#include "UniTensor.hpp"
13#include "contraction_tree.hpp"
14
15#ifdef UNI_GPU
16 #ifdef UNI_CUQUANTUM
17 #include <cutensornet.h>
18 #endif
19#endif
20
21namespace cytnx {
23 struct __ntwk {
24 enum __nttype { Void = -1, Regular = 0, Fermion = 1 };
25 };
26 class NetworkType_class {
27 public:
28 enum : int { Void = -1, Regular = 0, Fermion = 1 };
29 std::string getname(const int &nwrktype_id);
30 };
31 extern NetworkType_class NtType;
33
35 class Network_base : public intrusive_ptr_base<Network_base> {
36 // protected:
37 public:
38 int nwrktype_id;
39 std::string filename;
40 std::vector<UniTensor> tensors;
41 std::vector<std::string> TOUT_labels;
42
43 cytnx_uint64 TOUT_iBondNum;
44
45 // bool ordered;
46
47 // Contraction order.
48 ContractionTree CtTree;
49 std::vector<std::string> ORDER_tokens;
50 // order line
51 std::string order_line = "";
52 // einsum path representation of order
53 std::vector<std::pair<cytnx_int64, cytnx_int64>> einsum_path;
54
55 // labels corr to the tn list.
56 std::vector<std::vector<std::string>> label_arr;
57 std::vector<cytnx_int64> iBondNums;
58
59 // name of tn.
60 std::vector<std::string> names;
61 std::map<std::string, cytnx_uint64> name2pos;
62
63 // maintan tout leg position : (tesnor id, leg idx) for each open leg.
64 std::vector<std::pair<int, int>> TOUT_pos;
65
66 // pure int version of the contract labels
67 std::vector<std::vector<cytnx_int64>> int_modes;
68 std::vector<cytnx_int64> int_out_mode;
69
70#ifdef UNI_GPU
71 #ifdef UNI_CUQUANTUM
72 // // stream
73 // cudaStream_t stream;
74 // // cutensornet handle
75 // cutensornetHandle_t handle;
76
77 // network descriptor
78 cutensornetNetworkDescriptor_t descNet;
79 // optimizer info
80 cutensornetContractionOptimizerInfo_t optimizerInfo;
81 #endif
82#endif
83 friend class FermionNetwork;
84 friend class RegularNetwork;
85 friend class Network;
86 Network_base() : nwrktype_id(NtType.Void){};
87
88 bool HasPutAllUniTensor() {
89 for (cytnx_uint64 i = 0; i < this->tensors.size(); i++) {
90 if (this->tensors[i].uten_type() == UTenType.Void) return false;
91 }
92 return true;
93 }
94
95 // void print_network() const;
96
97 // void PreConstruct(bool force = true);
98
99 // void PutTensor(cytnx_int64 idx, const UniTensor& UniT, bool force = true);
100
101 // void PutTensor(const std::string &name, const UniTensor &UniT, bool force = true);
102
103 // UniTensor Launch(const std::string &Tname="");
104
105 // std::string GetContractOrder() const;
106 virtual void PutUniTensor(const std::string &name, const UniTensor &utensor);
107 virtual void PutUniTensor(const cytnx_uint64 &idx, const UniTensor &utensor);
108 virtual void PutUniTensors(const std::vector<std::string> &name,
109 const std::vector<UniTensor> &utensors);
110
111 virtual void RmUniTensor(const cytnx_uint64 &idx);
112 virtual void RmUniTensor(const std::string &name);
113 virtual void RmUniTensors(const std::vector<std::string> &name);
114
115 virtual void Contract_plan(const std::vector<UniTensor> &utensors, const std::string &Tout,
116 const std::vector<std::string> &alias,
117 const std::string &contract_order);
118
119 virtual void Fromfile(const std::string &fname);
120 virtual void FromString(const std::vector<std::string> &content);
121 virtual void clear();
122 virtual std::string getOptimalOrder();
123 // virtual UniTensor Launch(const bool &optimal = false, const std::string &contract_order =
124 // "");
125
126 virtual std::string getOrder();
127 virtual void setOrder(const bool &optimal = false, const std::string &contract_order = "");
128
129 virtual UniTensor Launch();
130
131 virtual void construct(const std::vector<std::string> &alias,
132 const std::vector<std::vector<std::string>> &labels,
133 const std::vector<std::string> &outlabel, const cytnx_int64 &outrk,
134 const std::string &order, const bool optim);
135 virtual void PrintNet(std::ostream &os);
136 virtual boost::intrusive_ptr<Network_base> clone();
137 virtual void Savefile(const std::string &fname);
138 virtual ~Network_base(){};
139
140 }; // Network_base
141
142 class RegularNetwork : public Network_base {
143 public:
144 RegularNetwork() { this->nwrktype_id = NtType.Regular; };
145 void Fromfile(const std::string &fname);
146 void FromString(const std::vector<std::string> &contents);
147 void PutUniTensor(const std::string &name, const UniTensor &utensor);
148 void PutUniTensor(const cytnx_uint64 &idx, const UniTensor &utensor);
149 void PutUniTensors(const std::vector<std::string> &name,
150 const std::vector<UniTensor> &utensors);
151 // void initialize_CtTree();
152 void RmUniTensor(const cytnx_uint64 &idx);
153 void RmUniTensor(const std::string &name);
154 void RmUniTensors(const std::vector<std::string> &name);
155
156 void Contract_plan(const std::vector<UniTensor> &utensors, const std::string &Tout,
157 const std::vector<std::string> &alias = {},
158 const std::string &contract_order = "");
159 void clear() {
160 this->tensors.clear();
161 this->name2pos.clear();
162 this->CtTree.clear();
163 this->names.clear();
164 this->iBondNums.clear();
165 this->label_arr.clear();
166 this->TOUT_labels.clear();
167 this->TOUT_iBondNum = 0;
168 this->ORDER_tokens.clear();
169 }
170 std::string getOptimalOrder();
171 // UniTensor Launch(const bool &optimal = false, const std::string &contract_order = "");
172
173 std::string getOrder();
174 void setOrder(const bool &optimal = false, const std::string &contract_order = "");
175 UniTensor Launch();
176
177 void construct(const std::vector<std::string> &alias,
178 const std::vector<std::vector<std::string>> &labels,
179 const std::vector<std::string> &outlabel, const cytnx_int64 &outrk,
180 const std::string &order, const bool optim);
181 boost::intrusive_ptr<Network_base> clone() {
182 RegularNetwork *tmp = new RegularNetwork();
183 tmp->name2pos = this->name2pos;
184 tmp->CtTree = this->CtTree;
185 tmp->names = this->names;
186 tmp->iBondNums = this->iBondNums;
187 tmp->label_arr = this->label_arr;
188 tmp->TOUT_labels = this->TOUT_labels;
189 tmp->TOUT_iBondNum = this->TOUT_iBondNum;
190 tmp->ORDER_tokens = this->ORDER_tokens;
191 boost::intrusive_ptr<Network_base> out(tmp);
192 return out;
193 }
194 void PrintNet(std::ostream &os);
195 void Savefile(const std::string &fname);
196 ~RegularNetwork(){};
197 };
198
199 // Under dev!!
200 class FermionNetwork : public Network_base {
201 protected:
202 // [Future] Swap gates.
203
204 public:
205 FermionNetwork() { this->nwrktype_id = NtType.Fermion; };
206 void Fromfile(const std::string &fname){};
207 void FromString(const std::vector<std::string> &contents){};
208 void RmUniTensor(const cytnx_uint64 &idx){};
209 void RmUniTensor(const std::string &name){};
210 void RmUniTensors(const std::vector<std::string> &name){};
211
212 void PutUniTensor(const std::string &name, const UniTensor &utensor){};
213 void PutUniTensor(const cytnx_uint64 &idx, const UniTensor &utensor){};
214 void PutUniTensors(const std::vector<std::string> &name,
215 const std::vector<UniTensor> &utensors){};
216 void Contract_plan(const std::vector<UniTensor> &utensors, const std::string &Tout,
217 const std::vector<std::string> &alias = {},
218 const std::string &contract_order = ""){};
219 void clear() {
220 this->name2pos.clear();
221 this->CtTree.clear();
222 this->names.clear();
223 this->iBondNums.clear();
224 this->label_arr.clear();
225 this->TOUT_labels.clear();
226 this->TOUT_iBondNum = 0;
227 this->ORDER_tokens.clear();
228 }
229 UniTensor Launch(const bool &optimal = false, const std::string &contract_order = "") {
230 return UniTensor();
231 };
232 boost::intrusive_ptr<Network_base> clone() {
233 FermionNetwork *tmp = new FermionNetwork();
234 tmp->name2pos = this->name2pos;
235 tmp->CtTree = this->CtTree;
236 tmp->names = this->names;
237 tmp->iBondNums = this->iBondNums;
238 tmp->label_arr = this->label_arr;
239 tmp->TOUT_labels = this->TOUT_labels;
240 tmp->TOUT_iBondNum = this->TOUT_iBondNum;
241 tmp->ORDER_tokens = this->ORDER_tokens;
242 boost::intrusive_ptr<Network_base> out(tmp);
243 return out;
244 }
245 void PrintNet(std::ostream &os){};
246 void Savefile(const std::string &fname){};
247 ~FermionNetwork(){};
248 };
249
251
252 /* @brief the Network object for easy build tensor network.
253
254 The Network is an object that allow one to create a complex network from a pre-defined
255 Network file. By putting the Tensors into the Network, the user simply call “Network.Launch()”
256 to get the out-come.
257 */
258 class Network {
259 public:
261 boost::intrusive_ptr<Network_base> _impl;
262 Network() : _impl(new Network_base()){};
263 Network(const Network &rhs) { this->_impl = rhs._impl; }
264 Network &operator=(const Network &rhs) {
265 this->_impl = rhs._impl;
266 return *this;
267 }
269
317 void Fromfile(const std::string &fname, const int &network_type = NtType.Regular) {
318 if (network_type == NtType.Regular) {
319 boost::intrusive_ptr<Network_base> tmp(new RegularNetwork());
320 this->_impl = tmp;
321 } else {
322 cytnx_error_msg(true, "[Developing] currently only support regular type network.%s", "\n");
323 }
324 this->_impl->Fromfile(fname);
325 }
326
354 void FromString(const std::vector<std::string> &contents,
355 const int &network_type = NtType.Regular) {
356 if (network_type == NtType.Regular) {
357 boost::intrusive_ptr<Network_base> tmp(new RegularNetwork());
358 this->_impl = tmp;
359 } else {
360 cytnx_error_msg(true, "[Developing] currently only support regular type network.%s", "\n");
361 }
362 this->_impl->FromString(contents);
363 }
364 // void Savefile(const std::string &fname);
365
366 static Network Contract(const std::vector<UniTensor> &tensors, const std::string &Tout,
367 const std::vector<std::string> &alias = {},
368 const std::string &contract_order = "") {
369 boost::intrusive_ptr<Network_base> tmp(new RegularNetwork());
370 Network out;
371 out._impl = tmp;
372 out._impl->Contract_plan(tensors, Tout, alias, contract_order);
373 return out;
374 }
375
376 Network(const std::string &fname, const int &network_type = NtType.Regular) {
377 this->Fromfile(fname, network_type);
378 }
379
380 void RmUniTensor(const std::string &name) { this->_impl->RmUniTensor(name); }
381 void RmUniTensor(const cytnx_uint64 &idx) { this->_impl->RmUniTensor(idx); }
382 void RmUniTensors(const std::vector<std::string> &names) { this->_impl->RmUniTensors(names); }
383 void PutUniTensor(const std::string &name, const UniTensor &utensor,
384 const std::vector<std::string> &label_order = {}) {
385 if (label_order.size()) {
386 auto tmpu = utensor.permute(label_order);
387 this->_impl->PutUniTensor(name, tmpu);
388 } else
389 this->_impl->PutUniTensor(name, utensor);
390 }
391 void PutUniTensor(const cytnx_uint64 &idx, const UniTensor &utensor,
392 const std::vector<std::string> &label_order = {}) {
393 if (label_order.size()) {
394 auto tmpu = utensor.permute(label_order);
395 this->_impl->PutUniTensor(idx, tmpu);
396 } else
397 this->_impl->PutUniTensor(idx, utensor);
398 }
399
400 void PutUniTensors(const std::vector<std::string> &name,
401 const std::vector<UniTensor> &utensors) {
402 this->_impl->PutUniTensors(name, utensors);
403 }
404 std::string getOptimalOrder(const int &network_type = NtType.Regular) {
405 if (network_type == NtType.Regular) {
406 return this->_impl->getOptimalOrder();
407 } else {
408 cytnx_error_msg(true, "[Developing] currently only support regular type network.%s", "\n");
409 }
410 }
411
412 std::string getOrder() { return this->_impl->getOrder(); }
413
414 void setOrder(const bool &optimal, const std::string &contract_order /*default ""*/) {
415 return this->_impl->setOrder(optimal, contract_order);
416 }
417
418 UniTensor Launch(const int &network_type = NtType.Regular) {
419 if (network_type == NtType.Regular) {
420 return this->_impl->Launch();
421 } else {
422 cytnx_error_msg(true, "[Developing] currently only support regular type network.%s", "\n");
423 }
424 }
425
426 void construct(const std::vector<std::string> &alias,
427 const std::vector<std::vector<std::string>> &labels,
428 const std::vector<std::string> &outlabel = std::vector<std::string>(),
429 const cytnx_int64 &outrk = 0, const std::string &order = "",
430 const bool optim = false, const int &network_type = NtType.Regular) {
431 if (network_type == NtType.Regular) {
432 boost::intrusive_ptr<Network_base> tmp(new RegularNetwork());
433 this->_impl = tmp;
434 } else {
435 cytnx_error_msg(true, "[Developing] currently only support regular type network.%s", "\n");
436 }
437 this->_impl->construct(alias, labels, outlabel, outrk, order, optim);
438 }
439
440 void clear() {
441 // boost::intrusive_ptr<Network_base> tmp(new Network_base());
442 this->_impl->clear();
443 }
444
446 Network out;
447 out._impl = this->_impl->clone();
448 return out;
449 }
450 void PrintNet() { this->_impl->PrintNet(std::cout); }
451
452 void Savefile(const std::string &fname) { this->_impl->Savefile(fname); }
453 };
454
456 std::ostream &operator<<(std::ostream &os, const Network &bin);
458} // namespace cytnx
459
460#endif // CYTNX_NETWORK_H_
Definition Network.hpp:258
void Fromfile(const std::string &fname, const int &network_type=NtType.Regular)
Construct Network from network file.
Definition Network.hpp:317
Network(const std::string &fname, const int &network_type=NtType.Regular)
Definition Network.hpp:376
Network clone()
Definition Network.hpp:445
void setOrder(const bool &optimal, const std::string &contract_order)
Definition Network.hpp:414
void construct(const std::vector< std::string > &alias, const std::vector< std::vector< std::string > > &labels, const std::vector< std::string > &outlabel=std::vector< std::string >(), const cytnx_int64 &outrk=0, const std::string &order="", const bool optim=false, const int &network_type=NtType.Regular)
Definition Network.hpp:426
void PrintNet()
Definition Network.hpp:450
std::string getOptimalOrder(const int &network_type=NtType.Regular)
Definition Network.hpp:404
void RmUniTensors(const std::vector< std::string > &names)
Definition Network.hpp:382
UniTensor Launch(const int &network_type=NtType.Regular)
Definition Network.hpp:418
void RmUniTensor(const cytnx_uint64 &idx)
Definition Network.hpp:381
static Network Contract(const std::vector< UniTensor > &tensors, const std::string &Tout, const std::vector< std::string > &alias={}, const std::string &contract_order="")
Definition Network.hpp:366
void FromString(const std::vector< std::string > &contents, const int &network_type=NtType.Regular)
Construct Network from a list of strings, where each string is the same as each line in network file.
Definition Network.hpp:354
void clear()
Definition Network.hpp:440
void RmUniTensor(const std::string &name)
Definition Network.hpp:380
std::string getOrder()
Definition Network.hpp:412
void PutUniTensors(const std::vector< std::string > &name, const std::vector< UniTensor > &utensors)
Definition Network.hpp:400
void PutUniTensor(const cytnx_uint64 &idx, const UniTensor &utensor, const std::vector< std::string > &label_order={})
Definition Network.hpp:391
void PutUniTensor(const std::string &name, const UniTensor &utensor, const std::vector< std::string > &label_order={})
Definition Network.hpp:383
void Savefile(const std::string &fname)
Definition Network.hpp:452
An Enhanced tensor specifically designed for physical Tensor network simulation.
Definition UniTensor.hpp:2773
UniTensor permute(const std::vector< cytnx_int64 > &mapper, const cytnx_int64 &rowrank=-1) const
permute the legs of the UniTensor
Definition UniTensor.hpp:3778
#define cytnx_error_msg(is_true, format,...)
Definition cytnx_error.hpp:118
Definition Accessor.hpp:12
UniTensorType_class UTenType
UniTensor type.
@ Void
Definition Symmetry.hpp:30