Maestro 0.3.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuLibStateVectorSim.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#ifndef _GPU_LIB_STATEVECTOR_SIM
16#define _GPU_LIB_STATEVECTOR_SIM 1
17
18#ifdef __linux__
19
20#include "GpuDeviceContext.h"
21
22#include <memory>
23
24namespace Simulators
25{
26
27class GpuLibStateVectorSim
28{
29 public:
30 explicit GpuLibStateVectorSim(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->CreateStateVector();
37 }
38 }
39
40 int GetGpuDevice() const
41 {
42 return lib ? lib->GetStateVectorGpuId(obj) : -1;
43 }
44
45 GpuLibStateVectorSim(const std::shared_ptr<GpuLibrary> &lib, void *obj) : lib(lib), obj(obj)
46 {
47 }
48
49 GpuLibStateVectorSim() = delete;
50 GpuLibStateVectorSim(const GpuLibStateVectorSim &) = delete;
51 GpuLibStateVectorSim &operator=(const GpuLibStateVectorSim &) = delete;
52 GpuLibStateVectorSim(GpuLibStateVectorSim &&) = default;
53 GpuLibStateVectorSim &operator=(GpuLibStateVectorSim &&) = default;
54
55 ~GpuLibStateVectorSim()
56 {
57 if (lib && obj)
58 lib->DestroyStateVector(obj);
59 }
60
61 bool Create(unsigned int nrQubits)
62 {
63 if (obj)
64 return lib->Create(obj, nrQubits);
65
66 return false;
67 }
68
69 bool CreateWithState(unsigned int nrQubits, const double *state)
70 {
71 if (obj)
72 return lib->CreateWithState(obj, nrQubits, state);
73
74 return false;
75 }
76
77 bool Synchronize()
78 {
79 return lib->StateVectorSynchronize(obj);
80 }
81
82 bool Reset()
83 {
84 if (obj)
85 return lib->Reset(obj);
86
87 return false;
88 }
89
90 bool SetSeed(uint64_t seed)
91 {
92 return obj && lib->SetSeed(obj, seed);
93 }
94
95 bool SetDataType(bool useDoublePrecision)
96 {
97 if (obj)
98 return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
99 return false;
100 }
101
102 bool IsDoublePrecision() const
103 {
104 if (obj)
105 return lib->IsDoublePrecision(obj);
106 return false;
107 }
108
109 int GetNrQubits() const
110 {
111 if (obj)
112 return lib->GetNrQubits(obj);
113 return 0;
114 }
115
116 bool MeasureQubitCollapse(int qubitIndex)
117 {
118 if (obj)
119 return lib->MeasureQubitCollapse(obj, qubitIndex);
120
121 return false;
122 }
123
124 bool MeasureQubitNoCollapse(int qubitIndex)
125 {
126 if (obj)
127 return lib->MeasureQubitNoCollapse(obj, qubitIndex);
128
129 return false;
130 }
131
132 bool MeasureQubitsCollapse(int *qubits, int *bitstring, int bitstringLen)
133 {
134 if (obj)
135 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
136
137 return false;
138 }
139
140 bool MeasureQubitsNoCollapse(int *qubits, int *bitstring, int bitstringLen)
141 {
142 if (obj)
143 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
144
145 return false;
146 }
147
148 unsigned long long MeasureAllQubitsCollapse()
149 {
150 if (obj)
151 return lib->MeasureAllQubitsCollapse(obj);
152
153 return static_cast<unsigned long long>(-1);
154 }
155
156 unsigned long long MeasureAllQubitsNoCollapse()
157 {
158 if (obj)
159 return lib->MeasureAllQubitsNoCollapse(obj);
160
161 return static_cast<unsigned long long>(-1);
162 }
163
164 bool SaveState()
165 {
166 if (obj)
167 return lib->SaveState(obj);
168
169 return false;
170 }
171
172 bool SaveStateToHost()
173 {
174 if (obj)
175 return lib->SaveStateToHost(obj);
176
177 return false;
178 }
179
180 bool SaveStateDestructive()
181 {
182 if (obj)
183 return lib->SaveStateDestructive(obj);
184
185 return false;
186 }
187
188 bool RestoreStateFreeSaved()
189 {
190 if (obj)
191 return lib->RestoreStateFreeSaved(obj);
192
193 return false;
194 }
195
196 bool RestoreStateNoFreeSaved()
197 {
198 if (obj)
199 return lib->RestoreStateNoFreeSaved(obj);
200
201 return false;
202 }
203
204 void FreeSavedState()
205 {
206 if (obj)
207 lib->FreeSavedState(obj);
208 }
209
210 std::unique_ptr<GpuLibStateVectorSim> Clone()
211 {
212 if (obj)
213 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
214
215 return nullptr;
216 }
217
218 bool Sample(unsigned int nSamples, long int *samples, unsigned int nBits, int *bits)
219 {
220 if (obj)
221 return lib->Sample(obj, nSamples, samples, nBits, bits);
222 return false;
223 }
224
225 bool SampleAll(unsigned int nSamples, long int *samples)
226 {
227 if (obj)
228 return lib->SampleAll(obj, nSamples, samples);
229
230 return false;
231 }
232
233 bool Amplitude(long long int state, double *real, double *imaginary) const
234 {
235 if (obj)
236 return lib->Amplitude(obj, state, real, imaginary);
237
238 return false;
239 }
240
241 double Probability(int *qubits, int *mask, int len) const
242 {
243 if (obj)
244 return lib->Probability(obj, qubits, mask, len);
245 return 0.0;
246 }
247
248 double BasisStateProbability(long long int state) const
249 {
250 if (obj)
251 return lib->BasisStateProbability(obj, state);
252 return 0.0;
253 }
254
255 bool AllProbabilities(double *probabilities) const
256 {
257 if (obj)
258 return lib->AllProbabilities(obj, probabilities);
259 return false;
260 }
261
262 double ExpectationValue(const std::string &pauliString) const
263 {
264 if (obj)
265 return lib->ExpectationValue(obj, pauliString.c_str(), pauliString.length());
266
267 return 0.0;
268 }
269
270 bool ApplyX(int qubit)
271 {
272 if (obj)
273 return lib->ApplyX(obj, qubit);
274
275 return false;
276 }
277
278 bool ApplyY(int qubit)
279 {
280 if (obj)
281 return lib->ApplyY(obj, qubit);
282
283 return false;
284 }
285
286 bool ApplyZ(int qubit)
287 {
288 if (obj)
289 return lib->ApplyZ(obj, qubit);
290
291 return false;
292 }
293
294 bool ApplyH(int qubit)
295 {
296 if (obj)
297 return lib->ApplyH(obj, qubit);
298
299 return false;
300 }
301
302 bool ApplyS(int qubit)
303 {
304 if (obj)
305 return lib->ApplyS(obj, qubit);
306
307 return false;
308 }
309
310 bool ApplySDG(int qubit)
311 {
312 if (obj)
313 return lib->ApplySDG(obj, qubit);
314
315 return false;
316 }
317
318 bool ApplyT(int qubit)
319 {
320 if (obj)
321 return lib->ApplyT(obj, qubit);
322
323 return false;
324 }
325
326 bool ApplyTDG(int qubit)
327 {
328 if (obj)
329 return lib->ApplyTDG(obj, qubit);
330
331 return false;
332 }
333
334 bool ApplySX(int qubit)
335 {
336 if (obj)
337 return lib->ApplySX(obj, qubit);
338
339 return false;
340 }
341
342 bool ApplySXDG(int qubit)
343 {
344 if (obj)
345 return lib->ApplySXDG(obj, qubit);
346
347 return false;
348 }
349
350 bool ApplyK(int qubit)
351 {
352 if (obj)
353 return lib->ApplyK(obj, qubit);
354
355 return false;
356 }
357
358 bool ApplyP(int qubit, double theta)
359 {
360 if (obj)
361 return lib->ApplyP(obj, qubit, theta);
362
363 return false;
364 }
365
366 bool ApplyRx(int qubit, double theta)
367 {
368 if (obj)
369 return lib->ApplyRx(obj, qubit, theta) == 1;
370
371 return false;
372 }
373
374 bool ApplyRy(int qubit, double theta)
375 {
376 if (obj)
377 return lib->ApplyRy(obj, qubit, theta);
378
379 return false;
380 }
381
382 bool ApplyRz(int qubit, double theta)
383 {
384 if (obj)
385 return lib->ApplyRz(obj, qubit, theta);
386
387 return false;
388 }
389
390 bool ApplyU(int qubit, double theta, double phi, double lambda, double gamma)
391 {
392 if (obj)
393 return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
394
395 return false;
396 }
397
398 bool ApplyCX(int controlQubit, int targetQubit)
399 {
400 if (obj)
401 return lib->ApplyCX(obj, controlQubit, targetQubit);
402
403 return false;
404 }
405
406 bool ApplyCY(int controlQubit, int targetQubit)
407 {
408 if (obj)
409 return lib->ApplyCY(obj, controlQubit, targetQubit);
410
411 return false;
412 }
413
414 bool ApplyCZ(int controlQubit, int targetQubit)
415 {
416 if (obj)
417 return lib->ApplyCZ(obj, controlQubit, targetQubit);
418
419 return false;
420 }
421
422 bool ApplyCH(int controlQubit, int targetQubit)
423 {
424 if (obj)
425 return lib->ApplyCH(obj, controlQubit, targetQubit);
426
427 return false;
428 }
429
430 bool ApplyCSX(int controlQubit, int targetQubit)
431 {
432 if (obj)
433 return lib->ApplyCSX(obj, controlQubit, targetQubit);
434
435 return false;
436 }
437
438 bool ApplyCSXDG(int controlQubit, int targetQubit)
439 {
440 if (obj)
441 return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
442
443 return false;
444 }
445
446 bool ApplyCP(int controlQubit, int targetQubit, double theta)
447 {
448 if (obj)
449 return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
450
451 return false;
452 }
453
454 bool ApplyCRx(int controlQubit, int targetQubit, double theta)
455 {
456 if (obj)
457 return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
458
459 return false;
460 }
461
462 bool ApplyCRy(int controlQubit, int targetQubit, double theta)
463 {
464 if (obj)
465 return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
466
467 return false;
468 }
469
470 bool ApplyCRz(int controlQubit, int targetQubit, double theta)
471 {
472 if (obj)
473 return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
474
475 return false;
476 }
477
478 bool ApplyCCX(int controlQubit1, int controlQubit2, int targetQubit)
479 {
480 if (obj)
481 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
482
483 return false;
484 }
485
486 bool ApplySwap(int qubit1, int qubit2)
487 {
488 if (obj)
489 return lib->ApplySwap(obj, qubit1, qubit2);
490
491 return false;
492 }
493
494 bool ApplyCSwap(int controlQubit, int qubit1, int qubit2)
495 {
496 if (obj)
497 return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
498
499 return false;
500 }
501
502 bool ApplyCU(int controlQubit, int targetQubit, double theta, double phi, double lambda, double gamma)
503 {
504 if (obj)
505 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda, gamma);
506
507 return false;
508 }
509
510 // Default matrices are row-major; WithLayout also accepts column-major.
511 bool ApplyOneQubitMatrix(int q0, const double *matrix)
512 {
513 return obj && lib->ApplyOneQubitMatrix(obj, q0, matrix);
514 }
515
516 bool ApplyOneQubitMatrixWithLayout(int q0, const double *matrix, int layout)
517 {
518 return obj && lib->ApplyOneQubitMatrixWithLayout(obj, q0, matrix, layout);
519 }
520
521 bool ApplyTwoQubitMatrix(int q0, int q1, const double *matrix)
522 {
523 return obj && lib->ApplyTwoQubitMatrix(obj, q0, q1, matrix);
524 }
525
526 bool ApplyTwoQubitMatrixWithLayout(int q0, int q1, const double *matrix, int layout)
527 {
528 return obj && lib->ApplyTwoQubitMatrixWithLayout(obj, q0, q1, matrix, layout);
529 }
530
531 bool ApplyThreeQubitMatrix(int q0, int q1, int q2, const double *matrix)
532 {
533 return obj && lib->ApplyThreeQubitMatrix(obj, q0, q1, q2, matrix);
534 }
535
536 bool ApplyThreeQubitMatrixWithLayout(int q0, int q1, int q2, const double *matrix, int layout)
537 {
538 return obj && lib->ApplyThreeQubitMatrixWithLayout(obj, q0, q1, q2, matrix, layout);
539 }
540
541 private:
542 GpuDeviceContext lib;
543 void *obj;
544};
545} // namespace Simulators
546
547#endif
548
549#endif
int ApplyK(void *sim, int qubit)
double Probability(void *sim, unsigned long long int outcome)
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)
double * AllProbabilities(void *sim)
int ApplyCP(void *sim, int controlQubit, int targetQubit, double theta)
int ApplySXDG(void *sim, int qubit)
int ApplySDG(void *sim, int qubit)
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.