Maestro 0.1.0
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 "GpuLibrary.h"
21
22#include <memory>
23
24namespace Simulators {
25
26class GpuLibStateVectorSim {
27public:
28 explicit GpuLibStateVectorSim(const std::shared_ptr<GpuLibrary> &lib)
29 : lib(lib) {
30 if (lib)
31 obj = lib->CreateStateVector();
32 else
33 obj = nullptr;
34 }
35
36 GpuLibStateVectorSim(const std::shared_ptr<GpuLibrary> &lib, void *obj)
37 : lib(lib), obj(obj) {}
38
39 GpuLibStateVectorSim() = delete;
40 GpuLibStateVectorSim(const GpuLibStateVectorSim &) = delete;
41 GpuLibStateVectorSim &operator=(const GpuLibStateVectorSim &) = delete;
42 GpuLibStateVectorSim(GpuLibStateVectorSim &&) = default;
43 GpuLibStateVectorSim &operator=(GpuLibStateVectorSim &&) = default;
44
45 ~GpuLibStateVectorSim() {
46 if (lib && obj)
47 lib->DestroyStateVector(obj);
48 }
49
50 bool Create(unsigned int nrQubits) {
51 if (obj)
52 return lib->Create(obj, nrQubits);
53
54 return false;
55 }
56
57 bool CreateWithState(unsigned int nrQubits, const double *state) {
58 if (obj)
59 return lib->CreateWithState(obj, nrQubits, state);
60
61 return false;
62 }
63
64 bool Reset() {
65 if (obj)
66 return lib->Reset(obj);
67
68 return false;
69 }
70
71 bool SetDataType(bool useDoublePrecision) {
72 if (obj)
73 return lib->SetDataType(obj, useDoublePrecision ? 1 : 0);
74 return false;
75 }
76
77 bool IsDoublePrecision() const {
78 if (obj)
79 return lib->IsDoublePrecision(obj);
80 return false;
81 }
82
83 bool MeasureQubitCollapse(int qubitIndex) {
84 if (obj)
85 return lib->MeasureQubitCollapse(obj, qubitIndex);
86
87 return false;
88 }
89
90 bool MeasureQubitNoCollapse(int qubitIndex) {
91 if (obj)
92 return lib->MeasureQubitNoCollapse(obj, qubitIndex);
93
94 return false;
95 }
96
97 bool MeasureQubitsCollapse(int *qubits, int *bitstring, int bitstringLen) {
98 if (obj)
99 return lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
100
101 return false;
102 }
103
104 bool MeasureQubitsNoCollapse(int *qubits, int *bitstring, int bitstringLen) {
105 if (obj)
106 return lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
107
108 return false;
109 }
110
111 unsigned long long MeasureAllQubitsCollapse() {
112 if (obj)
113 return lib->MeasureAllQubitsCollapse(obj);
114
115 return static_cast<unsigned long long>(-1);
116 }
117
118 unsigned long long MeasureAllQubitsNoCollapse() {
119 if (obj)
120 return lib->MeasureAllQubitsNoCollapse(obj);
121
122 return static_cast<unsigned long long>(-1);
123 }
124
125 bool SaveState() {
126 if (obj)
127 return lib->SaveState(obj);
128
129 return false;
130 }
131
132 bool SaveStateToHost() {
133 if (obj)
134 return lib->SaveStateToHost(obj);
135
136 return false;
137 }
138
139 bool SaveStateDestructive() {
140 if (obj)
141 return lib->SaveStateDestructive(obj);
142
143 return false;
144 }
145
146 bool RestoreStateFreeSaved() {
147 if (obj)
148 return lib->RestoreStateFreeSaved(obj);
149
150 return false;
151 }
152
153 bool RestoreStateNoFreeSaved() {
154 if (obj)
155 return lib->RestoreStateNoFreeSaved(obj);
156
157 return false;
158 }
159
160 void FreeSavedState() {
161 if (obj)
162 lib->FreeSavedState(obj);
163 }
164
165 std::unique_ptr<GpuLibStateVectorSim> Clone() {
166 if (obj)
167 return std::make_unique<GpuLibStateVectorSim>(lib, lib->Clone(obj));
168
169 return nullptr;
170 }
171
172 bool Sample(unsigned int nSamples, long int *samples, unsigned int nBits,
173 int *bits) {
174 if (obj)
175 return lib->Sample(obj, nSamples, samples, nBits, bits);
176 return false;
177 }
178
179 bool SampleAll(unsigned int nSamples, long int *samples) {
180 if (obj)
181 return lib->SampleAll(obj, nSamples, samples);
182
183 return false;
184 }
185
186 bool Amplitude(long long int state, double *real, double *imaginary) const {
187 if (obj)
188 return lib->Amplitude(obj, state, real, imaginary);
189
190 return false;
191 }
192
193 double Probability(int *qubits, int *mask, int len) const {
194 if (obj)
195 return lib->Probability(obj, qubits, mask, len);
196 return 0.0;
197 }
198
199 double BasisStateProbability(long long int state) const {
200 if (obj)
201 return lib->BasisStateProbability(obj, state);
202 return 0.0;
203 }
204
205 bool AllProbabilities(double *probabilities) const {
206 if (obj)
207 return lib->AllProbabilities(obj, probabilities);
208 return false;
209 }
210
211 double ExpectationValue(const std::string &pauliString) const {
212 if (obj)
213 return lib->ExpectationValue(obj, pauliString.c_str(),
214 pauliString.length());
215
216 return 0.0;
217 }
218
219 bool ApplyX(int qubit) {
220 if (obj)
221 return lib->ApplyX(obj, qubit);
222
223 return false;
224 }
225
226 bool ApplyY(int qubit) {
227 if (obj)
228 return lib->ApplyY(obj, qubit);
229
230 return false;
231 }
232
233 bool ApplyZ(int qubit) {
234 if (obj)
235 return lib->ApplyZ(obj, qubit);
236
237 return false;
238 }
239
240 bool ApplyH(int qubit) {
241 if (obj)
242 return lib->ApplyH(obj, qubit);
243
244 return false;
245 }
246
247 bool ApplyS(int qubit) {
248 if (obj)
249 return lib->ApplyS(obj, qubit);
250
251 return false;
252 }
253
254 bool ApplySDG(int qubit) {
255 if (obj)
256 return lib->ApplySDG(obj, qubit);
257
258 return false;
259 }
260
261 bool ApplyT(int qubit) {
262 if (obj)
263 return lib->ApplyT(obj, qubit);
264
265 return false;
266 }
267
268 bool ApplyTDG(int qubit) {
269 if (obj)
270 return lib->ApplyTDG(obj, qubit);
271
272 return false;
273 }
274
275 bool ApplySX(int qubit) {
276 if (obj)
277 return lib->ApplySX(obj, qubit);
278
279 return false;
280 }
281
282 bool ApplySXDG(int qubit) {
283 if (obj)
284 return lib->ApplySXDG(obj, qubit);
285
286 return false;
287 }
288
289 bool ApplyK(int qubit) {
290 if (obj)
291 return lib->ApplyK(obj, qubit);
292
293 return false;
294 }
295
296 bool ApplyP(int qubit, double theta) {
297 if (obj)
298 return lib->ApplyP(obj, qubit, theta);
299
300 return false;
301 }
302
303 bool ApplyRx(int qubit, double theta) {
304 if (obj)
305 return lib->ApplyRx(obj, qubit, theta) == 1;
306
307 return false;
308 }
309
310 bool ApplyRy(int qubit, double theta) {
311 if (obj)
312 return lib->ApplyRy(obj, qubit, theta);
313
314 return false;
315 }
316
317 bool ApplyRz(int qubit, double theta) {
318 if (obj)
319 return lib->ApplyRz(obj, qubit, theta);
320
321 return false;
322 }
323
324 bool ApplyU(int qubit, double theta, double phi, double lambda,
325 double gamma) {
326 if (obj)
327 return lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
328
329 return false;
330 }
331
332 bool ApplyCX(int controlQubit, int targetQubit) {
333 if (obj)
334 return lib->ApplyCX(obj, controlQubit, targetQubit);
335
336 return false;
337 }
338
339 bool ApplyCY(int controlQubit, int targetQubit) {
340 if (obj)
341 return lib->ApplyCY(obj, controlQubit, targetQubit);
342
343 return false;
344 }
345
346 bool ApplyCZ(int controlQubit, int targetQubit) {
347 if (obj)
348 return lib->ApplyCZ(obj, controlQubit, targetQubit);
349
350 return false;
351 }
352
353 bool ApplyCH(int controlQubit, int targetQubit) {
354 if (obj)
355 return lib->ApplyCH(obj, controlQubit, targetQubit);
356
357 return false;
358 }
359
360 bool ApplyCSX(int controlQubit, int targetQubit) {
361 if (obj)
362 return lib->ApplyCSX(obj, controlQubit, targetQubit);
363
364 return false;
365 }
366
367 bool ApplyCSXDG(int controlQubit, int targetQubit) {
368 if (obj)
369 return lib->ApplyCSXDG(obj, controlQubit, targetQubit);
370
371 return false;
372 }
373
374 bool ApplyCP(int controlQubit, int targetQubit, double theta) {
375 if (obj)
376 return lib->ApplyCP(obj, controlQubit, targetQubit, theta);
377
378 return false;
379 }
380
381 bool ApplyCRx(int controlQubit, int targetQubit, double theta) {
382 if (obj)
383 return lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
384
385 return false;
386 }
387
388 bool ApplyCRy(int controlQubit, int targetQubit, double theta) {
389 if (obj)
390 return lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
391
392 return false;
393 }
394
395 bool ApplyCRz(int controlQubit, int targetQubit, double theta) {
396 if (obj)
397 return lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
398
399 return false;
400 }
401
402 bool ApplyCCX(int controlQubit1, int controlQubit2, int targetQubit) {
403 if (obj)
404 return lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
405
406 return false;
407 }
408
409 bool ApplySwap(int qubit1, int qubit2) {
410 if (obj)
411 return lib->ApplySwap(obj, qubit1, qubit2);
412
413 return false;
414 }
415
416 bool ApplyCSwap(int controlQubit, int qubit1, int qubit2) {
417 if (obj)
418 return lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
419
420 return false;
421 }
422
423 bool ApplyCU(int controlQubit, int targetQubit, double theta, double phi,
424 double lambda, double gamma) {
425 if (obj)
426 return lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
427 gamma);
428
429 return false;
430 }
431
432private:
433 std::shared_ptr<GpuLibrary> lib;
434 void *obj;
435};
436} // namespace Simulators
437
438#endif
439
440#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)