Maestro 0.3.1
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
26class GpuLibTNSim {
27 public:
28 explicit GpuLibTNSim(const std::shared_ptr<GpuLibrary>& lib, int device = -1)
29 : lib(lib), obj(nullptr) {
30 if (lib) {
31 auto lock = lib->LockInitialization();
32 if (lib->SetGpuDevice(device == -1 ? lib->GetCreationDevice() : device))
33 obj = lib->CreateTensorNet();
34 }
35 }
36
37 int GetGpuDevice() const { return lib ? lib->TNGetGpuId(obj) : -1; }
38
39 GpuLibTNSim(const std::shared_ptr<GpuLibrary> &lib, void *obj)
40 : lib(lib), obj(obj) {}
41
42 GpuLibTNSim() = delete;
43 GpuLibTNSim(const GpuLibTNSim &) = delete;
44 GpuLibTNSim &operator=(const GpuLibTNSim &) = delete;
45 GpuLibTNSim(GpuLibTNSim &&) = default;
46 GpuLibTNSim &operator=(GpuLibTNSim &&) = default;
47
48 ~GpuLibTNSim() {
49 if (lib && obj) lib->DestroyTensorNet(obj);
50 }
51
52 bool Create(unsigned int nrQubits) {
53 if (obj) return lib->TNCreate(obj, nrQubits);
54
55 return false;
56 }
57
58 bool Reset() {
59 if (obj) return lib->TNReset(obj);
60
61 return false;
62 }
63
64 bool SetSeed(uint64_t seed) { return obj && lib->TNSetSeed(obj, seed); }
65
66 bool IsValid() const {
67 if (obj) return lib->TNIsValid(obj);
68
69 return false;
70 }
71
72 bool IsCreated() const {
73 if (obj) return lib->TNIsCreated(obj);
74
75 return false;
76 }
77
78 bool SetDataType(int useDoublePrecision) {
79 if (obj) return lib->TNSetDataType(obj, useDoublePrecision);
80
81 return false;
82 }
83
84 bool IsDoublePrecision() const {
85 if (obj) return lib->TNIsDoublePrecision(obj);
86
87 return false;
88 }
89
90 bool SetCutoff(double val) {
91 if (obj) return lib->TNSetCutoff(obj, val);
92
93 return false;
94 }
95
96 double GetCutoff() const {
97 if (obj) return lib->TNGetCutoff(obj);
98
99 return 0.;
100 }
101
102 // mode: 0 = RelativeToMax, 1 = DiscardedWeight (default). See
103 // TruncationMode in the GPU library's lib/truncationmode.hpp.
104 bool SetTruncationMode(int mode) {
105 if (obj) return lib->TNSetTruncationMode(obj, mode);
106
107 return false;
108 }
109
110 int GetTruncationMode() const {
111 if (obj) return lib->TNGetTruncationMode(obj);
112
113 return 0;
114 }
115
116 bool SetGesvdJ(int val) {
117 if (obj) return lib->TNSetGesvdJ(obj, val);
118
119 return false;
120 }
121
122 bool GetGesvdJ() const {
123 if (obj) return lib->TNGetGesvdJ(obj);
124
125 return false;
126 }
127
128 // Enabling any of J/P/R clears the other two selectors in the plugin.
129 bool SetGesvdP(bool enable) {
130 return obj && lib->TNSetGesvdP(obj, enable);
131 }
132 bool GetGesvdP() const { return lib->TNGetGesvdP(obj); }
133 bool SetGesvdR(bool enable) {
134 return obj && lib->TNSetGesvdR(obj, enable);
135 }
136 bool GetGesvdR() const { return lib->TNGetGesvdR(obj); }
137
138 bool SetMaxExtent(long int val) {
139 if (obj) return lib->TNSetMaxExtent(obj, val);
140
141 return false;
142 }
143
144 long int GetMaxExtent() const {
145 if (obj) return lib->TNGetMaxExtent(obj);
146
147 return 0;
148 }
149
150 int GetNrQubits() const {
151 if (obj) return lib->TNGetNrQubits(obj);
152
153 return 0;
154 }
155
156 bool Amplitude(long int numFixedValues, long int *fixedValues, double *real,
157 double *imaginary) const {
158 if (obj)
159 return lib->TNAmplitude(obj, numFixedValues, fixedValues, real,
160 imaginary);
161
162 return false;
163 }
164
165 double Probability0(unsigned int qubit) const {
166 if (obj) return lib->TNProbability0(obj, qubit);
167
168 return 0.;
169 }
170
171 bool Measure(unsigned int qubit) {
172 if (obj) return lib->TNMeasure(obj, qubit);
173
174 return 0;
175 }
176
177 bool MeasureQubits(long int numQubits, unsigned int *qubits, int *result) {
178 if (obj) return lib->TNMeasureQubits(obj, numQubits, qubits, result);
179
180 return false;
181 }
182
183 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample() const {
184 if (lib) return lib->TNGetMapForSample();
185
186 return nullptr;
187 }
188
189 bool FreeMapForSample(
190 std::unordered_map<std::vector<bool>, int64_t> *map) const {
191 if (lib) return lib->TNFreeMapForSample(map);
192
193 return false;
194 }
195
196 bool Sample(long int numShots, long int numQubits, unsigned int *qubits,
197 void *resultMap) {
198 if (obj) return lib->TNSample(obj, numShots, numQubits, qubits, resultMap);
199
200 return false;
201 }
202
203 bool SaveState() {
204 if (obj) return lib->TNSaveState(obj);
205
206 return false;
207 }
208
209 bool RestoreState() {
210 if (obj) return lib->TNRestoreState(obj);
211
212 return false;
213 }
214
215 bool CleanSavedState() {
216 if (obj) return lib->TNCleanSavedState(obj);
217
218 return false;
219 }
220
221 std::unique_ptr<GpuLibTNSim> Clone() const {
222 // if (obj) return std::make_unique<GpuLibTNSim>(lib, lib->TNClone(obj));
223
224 return nullptr;
225 }
226
227 double ExpectationValue(const std::string &pauliString) const {
228 if (obj)
229 return lib->TNExpectationValue(obj, pauliString.c_str(),
230 pauliString.length());
231
232 return 0.0;
233 }
234
235 bool ApplyX(unsigned int siteA) {
236 if (obj) return lib->TNApplyX(obj, siteA);
237
238 return false;
239 }
240
241 bool ApplyY(unsigned int siteA) {
242 if (obj) return lib->TNApplyY(obj, siteA);
243
244 return false;
245 }
246
247 bool ApplyZ(unsigned int siteA) {
248 if (obj) return lib->TNApplyZ(obj, siteA);
249
250 return false;
251 }
252
253 bool ApplyH(unsigned int siteA) {
254 if (obj) return lib->TNApplyH(obj, siteA);
255
256 return false;
257 }
258
259 bool ApplyS(unsigned int siteA) {
260 if (obj) return lib->TNApplyS(obj, siteA);
261
262 return false;
263 }
264
265 bool ApplySDG(unsigned int siteA) {
266 if (obj) return lib->TNApplySDG(obj, siteA);
267
268 return false;
269 }
270
271 bool ApplyT(unsigned int siteA) {
272 if (obj) return lib->TNApplyT(obj, siteA);
273
274 return false;
275 }
276
277 bool ApplyTDG(unsigned int siteA) {
278 if (obj) return lib->TNApplyTDG(obj, siteA);
279
280 return false;
281 }
282
283 bool ApplySX(unsigned int siteA) {
284 if (obj) return lib->TNApplySX(obj, siteA);
285
286 return false;
287 }
288
289 bool ApplySXDG(unsigned int siteA) {
290 if (obj) return lib->TNApplySXDG(obj, siteA);
291
292 return false;
293 }
294
295 bool ApplyK(unsigned int siteA) {
296 if (obj) return lib->TNApplyK(obj, siteA);
297
298 return false;
299 }
300
301 bool ApplyP(unsigned int siteA, double theta) {
302 if (obj) return lib->TNApplyP(obj, siteA, theta);
303
304 return false;
305 }
306
307 bool ApplyRx(unsigned int siteA, double theta) {
308 if (obj) return lib->TNApplyRx(obj, siteA, theta);
309
310 return false;
311 }
312
313 bool ApplyRy(unsigned int siteA, double theta) {
314 if (obj) return lib->TNApplyRy(obj, siteA, theta);
315
316 return false;
317 }
318
319 bool ApplyRz(unsigned int siteA, double theta) {
320 if (obj) return lib->TNApplyRz(obj, siteA, theta);
321
322 return false;
323 }
324
325 bool ApplyU(unsigned int siteA, double theta, double phi, double lambda,
326 double gamma) {
327 if (obj) return lib->TNApplyU(obj, siteA, theta, phi, lambda, gamma);
328
329 return false;
330 }
331
332 bool ApplySwap(unsigned int controlQubit, unsigned int targetQubit) {
333 if (obj) return lib->TNApplySwap(obj, controlQubit, targetQubit);
334
335 return false;
336 }
337
338 bool ApplyCX(unsigned int controlQubit, unsigned int targetQubit) {
339 if (obj) return lib->TNApplyCX(obj, controlQubit, targetQubit);
340
341 return false;
342 }
343
344 bool ApplyCY(unsigned int controlQubit, unsigned int targetQubit) {
345 if (obj) return lib->TNApplyCY(obj, controlQubit, targetQubit);
346
347 return false;
348 }
349
350 bool ApplyCZ(unsigned int controlQubit, unsigned int targetQubit) {
351 if (obj) return lib->TNApplyCZ(obj, controlQubit, targetQubit);
352
353 return false;
354 }
355
356 bool ApplyCH(unsigned int controlQubit, unsigned int targetQubit) {
357 if (obj) return lib->TNApplyCH(obj, controlQubit, targetQubit);
358
359 return false;
360 }
361
362 bool ApplyCSX(unsigned int controlQubit, unsigned int targetQubit) {
363 if (obj) return lib->TNApplyCSX(obj, controlQubit, targetQubit);
364
365 return false;
366 }
367
368 bool ApplyCSXDG(unsigned int controlQubit, unsigned int targetQubit) {
369 if (obj) return lib->TNApplyCSXDG(obj, controlQubit, targetQubit);
370
371 return false;
372 }
373
374 bool ApplyCP(unsigned int controlQubit, unsigned int targetQubit,
375 double theta) {
376 if (obj) return lib->TNApplyCP(obj, controlQubit, targetQubit, theta);
377
378 return false;
379 }
380
381 bool ApplyCRx(unsigned int controlQubit, unsigned int targetQubit,
382 double theta) {
383 if (obj) return lib->TNApplyCRx(obj, controlQubit, targetQubit, theta);
384
385 return false;
386 }
387
388 bool ApplyCRy(unsigned int controlQubit, unsigned int targetQubit,
389 double theta) {
390 if (obj) return lib->TNApplyCRy(obj, controlQubit, targetQubit, theta);
391
392 return false;
393 }
394
395 bool ApplyCRz(unsigned int controlQubit, unsigned int targetQubit,
396 double theta) {
397 if (obj) return lib->TNApplyCRz(obj, controlQubit, targetQubit, theta);
398
399 return false;
400 }
401
402 bool ApplyCU(unsigned int controlQubit, unsigned int targetQubit,
403 double theta, double phi, double lambda, double gamma) {
404 if (obj)
405 return lib->TNApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
406 gamma);
407
408 return false;
409 }
410
411 bool ApplyCCX(unsigned int controlQubit1, unsigned int controlQubit2,
412 unsigned int targetQubit) {
413 if (obj)
414 return lib->TNApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
415 return false;
416 }
417
418 bool ApplyCSwap(unsigned int controlQubit, unsigned int qubit1,
419 unsigned int qubit2) {
420 if (obj) return lib->TNApplyCSwap(obj, controlQubit, qubit1, qubit2);
421 return false;
422 }
423
424 private:
425 GpuDeviceContext lib;
426 void *obj;
427};
428
429} // namespace Simulators
430
431#endif // __linux__
432
433#endif // _GPU_LIB_TN_SIM_H_
434#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)