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