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