Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuLibTNSim.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#ifndef _GPU_LIB_TN_SIM_H_
16#define _GPU_LIB_TN_SIM_H_
17
18#ifdef __linux__
19
20#include <memory>
21
22#include "GpuDeviceContext.h"
23
24namespace Simulators
25{
26
27class GpuLibTNSim
28{
29 public:
30 explicit GpuLibTNSim(const std::shared_ptr<GpuLibrary> &lib, int device = -1) : lib(lib), obj(nullptr)
31 {
32 if (lib)
33 {
34 auto lock = lib->LockInitialization();
35 if (lib->SetGpuDevice(device == -1 ? lib->GetCreationDevice() : device))
36 obj = lib->CreateTensorNet();
37 }
38 }
39
40 int GetGpuDevice() const
41 {
42 return lib ? lib->TNGetGpuId(obj) : -1;
43 }
44
45 GpuLibTNSim(const std::shared_ptr<GpuLibrary> &lib, void *obj) : lib(lib), obj(obj)
46 {
47 }
48
49 GpuLibTNSim() = delete;
50 GpuLibTNSim(const GpuLibTNSim &) = delete;
51 GpuLibTNSim &operator=(const GpuLibTNSim &) = delete;
52 GpuLibTNSim(GpuLibTNSim &&) = default;
53 GpuLibTNSim &operator=(GpuLibTNSim &&) = default;
54
55 ~GpuLibTNSim()
56 {
57 if (lib && obj)
58 lib->DestroyTensorNet(obj);
59 }
60
61 bool Create(unsigned int nrQubits)
62 {
63 if (obj)
64 return lib->TNCreate(obj, nrQubits);
65
66 return false;
67 }
68
69 bool Reset()
70 {
71 if (obj)
72 return lib->TNReset(obj);
73
74 return false;
75 }
76
77 bool SetSeed(uint64_t seed)
78 {
79 return obj && lib->TNSetSeed(obj, seed);
80 }
81
82 bool IsValid() const
83 {
84 if (obj)
85 return lib->TNIsValid(obj);
86
87 return false;
88 }
89
90 bool IsCreated() const
91 {
92 if (obj)
93 return lib->TNIsCreated(obj);
94
95 return false;
96 }
97
98 bool SetDataType(int useDoublePrecision)
99 {
100 if (obj)
101 return lib->TNSetDataType(obj, useDoublePrecision);
102
103 return false;
104 }
105
106 bool IsDoublePrecision() const
107 {
108 if (obj)
109 return lib->TNIsDoublePrecision(obj);
110
111 return false;
112 }
113
114 bool SetCutoff(double val)
115 {
116 if (obj)
117 return lib->TNSetCutoff(obj, val);
118
119 return false;
120 }
121
122 double GetCutoff() const
123 {
124 if (obj)
125 return lib->TNGetCutoff(obj);
126
127 return 0.;
128 }
129
130 // mode: 0 = RelativeToMax, 1 = DiscardedWeight (default). See
131 // TruncationMode in the GPU library's lib/truncationmode.hpp.
132 bool SetTruncationMode(int mode)
133 {
134 if (obj)
135 return lib->TNSetTruncationMode(obj, mode);
136
137 return false;
138 }
139
140 int GetTruncationMode() const
141 {
142 if (obj)
143 return lib->TNGetTruncationMode(obj);
144
145 return 0;
146 }
147
148 bool SetGesvdJ(int val)
149 {
150 if (obj)
151 return lib->TNSetGesvdJ(obj, val);
152
153 return false;
154 }
155
156 bool GetGesvdJ() const
157 {
158 if (obj)
159 return lib->TNGetGesvdJ(obj);
160
161 return false;
162 }
163
164 // Enabling any of J/P/R clears the other two selectors in the plugin.
165 bool SetGesvdP(bool enable)
166 {
167 return obj && lib->TNSetGesvdP(obj, enable);
168 }
169
170 bool GetGesvdP() const
171 {
172 return lib->TNGetGesvdP(obj);
173 }
174
175 bool SetGesvdR(bool enable)
176 {
177 return obj && lib->TNSetGesvdR(obj, enable);
178 }
179
180 bool GetGesvdR() const
181 {
182 return lib->TNGetGesvdR(obj);
183 }
184
185 bool SetMaxExtent(long int val)
186 {
187 if (obj)
188 return lib->TNSetMaxExtent(obj, val);
189
190 return false;
191 }
192
193 long int GetMaxExtent() const
194 {
195 if (obj)
196 return lib->TNGetMaxExtent(obj);
197
198 return 0;
199 }
200
201 int GetNrQubits() const
202 {
203 if (obj)
204 return lib->TNGetNrQubits(obj);
205
206 return 0;
207 }
208
209 bool Amplitude(long int numFixedValues, long int *fixedValues, double *real, double *imaginary) const
210 {
211 if (obj)
212 return lib->TNAmplitude(obj, numFixedValues, fixedValues, real, imaginary);
213
214 return false;
215 }
216
217 double Probability0(unsigned int qubit) const
218 {
219 if (obj)
220 return lib->TNProbability0(obj, qubit);
221
222 return 0.;
223 }
224
225 bool Measure(unsigned int qubit)
226 {
227 if (obj)
228 return lib->TNMeasure(obj, qubit);
229
230 return 0;
231 }
232
233 bool MeasureQubits(long int numQubits, unsigned int *qubits, int *result)
234 {
235 if (obj)
236 return lib->TNMeasureQubits(obj, numQubits, qubits, result);
237
238 return false;
239 }
240
241 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample() const
242 {
243 if (lib)
244 return lib->TNGetMapForSample();
245
246 return nullptr;
247 }
248
249 bool FreeMapForSample(std::unordered_map<std::vector<bool>, int64_t> *map) const
250 {
251 if (lib)
252 return lib->TNFreeMapForSample(map);
253
254 return false;
255 }
256
257 bool Sample(long int numShots, long int numQubits, unsigned int *qubits, void *resultMap)
258 {
259 if (obj)
260 return lib->TNSample(obj, numShots, numQubits, qubits, resultMap);
261
262 return false;
263 }
264
265 bool SaveState()
266 {
267 if (obj)
268 return lib->TNSaveState(obj);
269
270 return false;
271 }
272
273 bool RestoreState()
274 {
275 if (obj)
276 return lib->TNRestoreState(obj);
277
278 return false;
279 }
280
281 bool CleanSavedState()
282 {
283 if (obj)
284 return lib->TNCleanSavedState(obj);
285
286 return false;
287 }
288
289 std::unique_ptr<GpuLibTNSim> Clone() const
290 {
291 // if (obj) return std::make_unique<GpuLibTNSim>(lib, lib->TNClone(obj));
292
293 return nullptr;
294 }
295
296 double ExpectationValue(const std::string &pauliString) const
297 {
298 if (obj)
299 return lib->TNExpectationValue(obj, pauliString.c_str(), pauliString.length());
300
301 return 0.0;
302 }
303
304 bool ApplyX(unsigned int siteA)
305 {
306 if (obj)
307 return lib->TNApplyX(obj, siteA);
308
309 return false;
310 }
311
312 bool ApplyY(unsigned int siteA)
313 {
314 if (obj)
315 return lib->TNApplyY(obj, siteA);
316
317 return false;
318 }
319
320 bool ApplyZ(unsigned int siteA)
321 {
322 if (obj)
323 return lib->TNApplyZ(obj, siteA);
324
325 return false;
326 }
327
328 bool ApplyH(unsigned int siteA)
329 {
330 if (obj)
331 return lib->TNApplyH(obj, siteA);
332
333 return false;
334 }
335
336 bool ApplyS(unsigned int siteA)
337 {
338 if (obj)
339 return lib->TNApplyS(obj, siteA);
340
341 return false;
342 }
343
344 bool ApplySDG(unsigned int siteA)
345 {
346 if (obj)
347 return lib->TNApplySDG(obj, siteA);
348
349 return false;
350 }
351
352 bool ApplyT(unsigned int siteA)
353 {
354 if (obj)
355 return lib->TNApplyT(obj, siteA);
356
357 return false;
358 }
359
360 bool ApplyTDG(unsigned int siteA)
361 {
362 if (obj)
363 return lib->TNApplyTDG(obj, siteA);
364
365 return false;
366 }
367
368 bool ApplySX(unsigned int siteA)
369 {
370 if (obj)
371 return lib->TNApplySX(obj, siteA);
372
373 return false;
374 }
375
376 bool ApplySXDG(unsigned int siteA)
377 {
378 if (obj)
379 return lib->TNApplySXDG(obj, siteA);
380
381 return false;
382 }
383
384 bool ApplyK(unsigned int siteA)
385 {
386 if (obj)
387 return lib->TNApplyK(obj, siteA);
388
389 return false;
390 }
391
392 bool ApplyP(unsigned int siteA, double theta)
393 {
394 if (obj)
395 return lib->TNApplyP(obj, siteA, theta);
396
397 return false;
398 }
399
400 bool ApplyRx(unsigned int siteA, double theta)
401 {
402 if (obj)
403 return lib->TNApplyRx(obj, siteA, theta);
404
405 return false;
406 }
407
408 bool ApplyRy(unsigned int siteA, double theta)
409 {
410 if (obj)
411 return lib->TNApplyRy(obj, siteA, theta);
412
413 return false;
414 }
415
416 bool ApplyRz(unsigned int siteA, double theta)
417 {
418 if (obj)
419 return lib->TNApplyRz(obj, siteA, theta);
420
421 return false;
422 }
423
424 bool ApplyU(unsigned int siteA, double theta, double phi, double lambda, double gamma)
425 {
426 if (obj)
427 return lib->TNApplyU(obj, siteA, theta, phi, lambda, gamma);
428
429 return false;
430 }
431
432 bool ApplySwap(unsigned int controlQubit, unsigned int targetQubit)
433 {
434 if (obj)
435 return lib->TNApplySwap(obj, controlQubit, targetQubit);
436
437 return false;
438 }
439
440 bool ApplyCX(unsigned int controlQubit, unsigned int targetQubit)
441 {
442 if (obj)
443 return lib->TNApplyCX(obj, controlQubit, targetQubit);
444
445 return false;
446 }
447
448 bool ApplyCY(unsigned int controlQubit, unsigned int targetQubit)
449 {
450 if (obj)
451 return lib->TNApplyCY(obj, controlQubit, targetQubit);
452
453 return false;
454 }
455
456 bool ApplyCZ(unsigned int controlQubit, unsigned int targetQubit)
457 {
458 if (obj)
459 return lib->TNApplyCZ(obj, controlQubit, targetQubit);
460
461 return false;
462 }
463
464 bool ApplyCH(unsigned int controlQubit, unsigned int targetQubit)
465 {
466 if (obj)
467 return lib->TNApplyCH(obj, controlQubit, targetQubit);
468
469 return false;
470 }
471
472 bool ApplyCSX(unsigned int controlQubit, unsigned int targetQubit)
473 {
474 if (obj)
475 return lib->TNApplyCSX(obj, controlQubit, targetQubit);
476
477 return false;
478 }
479
480 bool ApplyCSXDG(unsigned int controlQubit, unsigned int targetQubit)
481 {
482 if (obj)
483 return lib->TNApplyCSXDG(obj, controlQubit, targetQubit);
484
485 return false;
486 }
487
488 bool ApplyCP(unsigned int controlQubit, unsigned int targetQubit, double theta)
489 {
490 if (obj)
491 return lib->TNApplyCP(obj, controlQubit, targetQubit, theta);
492
493 return false;
494 }
495
496 bool ApplyCRx(unsigned int controlQubit, unsigned int targetQubit, double theta)
497 {
498 if (obj)
499 return lib->TNApplyCRx(obj, controlQubit, targetQubit, theta);
500
501 return false;
502 }
503
504 bool ApplyCRy(unsigned int controlQubit, unsigned int targetQubit, double theta)
505 {
506 if (obj)
507 return lib->TNApplyCRy(obj, controlQubit, targetQubit, theta);
508
509 return false;
510 }
511
512 bool ApplyCRz(unsigned int controlQubit, unsigned int targetQubit, double theta)
513 {
514 if (obj)
515 return lib->TNApplyCRz(obj, controlQubit, targetQubit, theta);
516
517 return false;
518 }
519
520 bool ApplyCU(unsigned int controlQubit, unsigned int targetQubit, double theta, double phi, double lambda, double gamma)
521 {
522 if (obj)
523 return lib->TNApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda, gamma);
524
525 return false;
526 }
527
528 bool ApplyCCX(unsigned int controlQubit1, unsigned int controlQubit2, unsigned int targetQubit)
529 {
530 if (obj)
531 return lib->TNApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
532 return false;
533 }
534
535 bool ApplyCSwap(unsigned int controlQubit, unsigned int qubit1, unsigned int qubit2)
536 {
537 if (obj)
538 return lib->TNApplyCSwap(obj, controlQubit, qubit1, qubit2);
539 return false;
540 }
541
542 private:
543 GpuDeviceContext lib;
544 void *obj;
545};
546
547} // namespace Simulators
548
549#endif // __linux__
550
551#endif // _GPU_LIB_TN_SIM_H_
552#pragma once
int ApplyK(void *sim, int qubit)
int RestoreState(void *sim)
int ApplyRx(void *sim, int qubit, double theta)
int ApplyX(void *sim, int qubit)
int ApplyU(void *sim, int qubit, double theta, double phi, double lambda, double gamma)
int ApplyCRy(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyTDG(void *sim, int qubit)
int ApplyCSXDG(void *sim, int controlQubit, int targetQubit)
int ApplyS(void *sim, int qubit)
int ApplyCX(void *sim, int controlQubit, int targetQubit)
int ApplyCRz(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySXDG(void *sim, int qubit)
int ApplySDG(void *sim, int qubit)
unsigned long long int Measure(void *sim, const unsigned long int *qubits, unsigned long int nrQubits)
int ApplyCSwap(void *sim, int controlQubit, int qubit1, int qubit2)
int ApplyCCX(void *sim, int controlQubit1, int controlQubit2, int targetQubit)
int ApplyY(void *sim, int qubit)
double * Amplitude(void *sim, unsigned long long int outcome)
int ApplyZ(void *sim, int qubit)
int ApplyH(void *sim, int qubit)
int ApplyCY(void *sim, int controlQubit, int targetQubit)
int ApplyCU(void *sim, int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
int ApplySwap(void *sim, int qubit1, int qubit2)
int ApplyRy(void *sim, int qubit, double theta)
int ApplyP(void *sim, int qubit, double theta)
int ApplyCH(void *sim, int controlQubit, int targetQubit)
int ApplySX(void *sim, int qubit)
int ApplyCZ(void *sim, int controlQubit, int targetQubit)
int ApplyRz(void *sim, int qubit, double theta)
int ApplyT(void *sim, int qubit)
int ApplyCRx(void *sim, int controlQubit, int targetQubit, double theta)
int ApplyCSX(void *sim, int controlQubit, int targetQubit)
int SaveState(void *sim)
Bounded online routing based on current physical bond dimensions.