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