Maestro 0.2.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuLibMPSSim.h
Go to the documentation of this file.
1
12
13#pragma once
14
15#ifndef _GPU_LIB_MPS_SIM_H_
16#define _GPU_LIB_MPS_SIM_H_
17
18#ifdef __linux__
19
20#include <memory>
21
22#include "GpuLibrary.h"
23
24namespace Simulators {
25
26class GpuLibMPSSim {
27 public:
28 explicit GpuLibMPSSim(const std::shared_ptr<GpuLibrary> &lib) : lib(lib) {
29 if (lib)
30 obj = lib->CreateMPS();
31 else
32 obj = nullptr;
33 }
34
35 GpuLibMPSSim(const std::shared_ptr<GpuLibrary> &lib, void *obj)
36 : lib(lib), obj(obj) {}
37
38 GpuLibMPSSim() = delete;
39 GpuLibMPSSim(const GpuLibMPSSim &) = delete;
40 GpuLibMPSSim &operator=(const GpuLibMPSSim &) = delete;
41 GpuLibMPSSim(GpuLibMPSSim &&) = default;
42 GpuLibMPSSim &operator=(GpuLibMPSSim &&) = default;
43
44 ~GpuLibMPSSim() {
45 if (lib && obj) lib->DestroyMPS(obj);
46 }
47
48 bool Create(unsigned int nrQubits) {
49 if (obj) return lib->MPSCreate(obj, nrQubits);
50
51 return false;
52 }
53
54 bool Reset() {
55 if (obj) return lib->MPSReset(obj);
56
57 return false;
58 }
59
60 bool SetInitialQubitsMap(const std::vector<long long int> &initialMap) {
61 if (obj) return lib->MPSSetInitialQubitsMap(obj, initialMap);
62
63 return false;
64 }
65
66 bool SetUseOptimalMeetingPosition(bool useOptimalMeetingPosition) {
67 if (obj) return lib->MPSSetUseOptimalMeetingPosition(obj, useOptimalMeetingPosition);
68 return false;
69 }
70
71 bool IsValid() const {
72 if (obj) return lib->MPSIsValid(obj);
73
74 return false;
75 }
76
77 bool IsCreated() const {
78 if (obj) return lib->MPSIsCreated(obj);
79
80 return false;
81 }
82
83 bool SetDataType(int useDoublePrecision) {
84 if (obj) return lib->MPSSetDataType(obj, useDoublePrecision);
85
86 return false;
87 }
88
89 bool IsDoublePrecision() const {
90 if (obj) return lib->MPSIsDoublePrecision(obj);
91
92 return false;
93 }
94
95 bool SetCutoff(double val) {
96 if (obj) return lib->MPSSetCutoff(obj, val);
97
98 return false;
99 }
100
101 double GetCutoff() const {
102 if (obj) return lib->MPSGetCutoff(obj);
103
104 return 0.;
105 }
106
107 bool SetGesvdJ(int val) {
108 if (obj) return lib->MPSSetGesvdJ(obj, val);
109
110 return false;
111 }
112
113 bool GetGesvdJ() const {
114 if (obj) return lib->MPSGetGesvdJ(obj);
115
116 return false;
117 }
118
119 bool SetMaxExtent(long int val) {
120 if (obj) return lib->MPSSetMaxExtent(obj, val);
121
122 return false;
123 }
124
125 long int GetMaxExtent() const {
126 if (obj) return lib->MPSGetMaxExtent(obj);
127
128 return 0;
129 }
130
131 int GetNrQubits() const {
132 if (obj) return lib->MPSGetNrQubits(obj);
133
134 return 0;
135 }
136
137 bool SetCallbackContext(void *context) {
138 if (obj) return lib->MPSSetCallbackContext(obj, context);
139 return false;
140 }
141
142 bool SetMeetingPositionCallback(int64_t (*callback)(void *, const int64_t *)) {
143 if (obj) return lib->MPSSetMeetingPositionCallback(obj, callback);
144 return false;
145 }
146
147 bool Amplitude(long int numFixedValues, long int *fixedValues, double *real,
148 double *imaginary) const {
149 if (obj)
150 return lib->MPSAmplitude(obj, numFixedValues, fixedValues, real,
151 imaginary);
152
153 return false;
154 }
155
156 double Probability0(unsigned int qubit) const {
157 if (obj) return lib->MPSProbability0(obj, qubit);
158
159 return 0.;
160 }
161
162 bool Measure(unsigned int qubit) {
163 if (obj) return lib->MPSMeasure(obj, qubit);
164
165 return 0;
166 }
167
168 bool MeasureQubits(long int numQubits, unsigned int *qubits, int *result) {
169 if (obj) return lib->MPSMeasureQubits(obj, numQubits, qubits, result);
170
171 return false;
172 }
173
174 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample() const {
175 if (lib) return lib->MPSGetMapForSample();
176
177 return nullptr;
178 }
179
180 bool FreeMapForSample(
181 std::unordered_map<std::vector<bool>, int64_t> *map) const {
182 if (lib) return lib->MPSFreeMapForSample(map);
183
184 return false;
185 }
186
187 bool Sample(long int numShots, long int numQubits, unsigned int *qubits,
188 void *resultMap) {
189 if (obj) return lib->MPSSample(obj, numShots, numQubits, qubits, resultMap);
190
191 return false;
192 }
193
194 bool SaveState() {
195 if (obj) return lib->MPSSaveState(obj);
196
197 return false;
198 }
199
200 bool RestoreState() {
201 if (obj) return lib->MPSRestoreState(obj);
202
203 return false;
204 }
205
206 bool CleanSavedState() {
207 if (obj) return lib->MPSCleanSavedState(obj);
208
209 return false;
210 }
211
212 std::unique_ptr<GpuLibMPSSim> Clone() const {
213 if (obj) return std::make_unique<GpuLibMPSSim>(lib, lib->MPSClone(obj));
214
215 return nullptr;
216 }
217
218 double ExpectationValue(const std::string &pauliString) {
219 if (obj)
220 return lib->MPSExpectationValue(obj, pauliString.c_str(),
221 pauliString.length());
222
223 return 0.0;
224 }
225
226 std::complex<double> ProjectOnZero() {
227 if (obj) return lib->MPSProjectOnZero(obj);
228
229 return std::complex<double>(0., 0.);
230 }
231
232 bool ApplyX(unsigned int siteA) {
233 if (obj) return lib->MPSApplyX(obj, siteA);
234
235 return false;
236 }
237
238 bool ApplyY(unsigned int siteA) {
239 if (obj) return lib->MPSApplyY(obj, siteA);
240
241 return false;
242 }
243
244 bool ApplyZ(unsigned int siteA) {
245 if (obj) return lib->MPSApplyZ(obj, siteA);
246
247 return false;
248 }
249
250 bool ApplyH(unsigned int siteA) {
251 if (obj) return lib->MPSApplyH(obj, siteA);
252
253 return false;
254 }
255
256 bool ApplyS(unsigned int siteA) {
257 if (obj) return lib->MPSApplyS(obj, siteA);
258
259 return false;
260 }
261
262 bool ApplySDG(unsigned int siteA) {
263 if (obj) return lib->MPSApplySDG(obj, siteA);
264
265 return false;
266 }
267
268 bool ApplyT(unsigned int siteA) {
269 if (obj) return lib->MPSApplyT(obj, siteA);
270
271 return false;
272 }
273
274 bool ApplyTDG(unsigned int siteA) {
275 if (obj) return lib->MPSApplyTDG(obj, siteA);
276
277 return false;
278 }
279
280 bool ApplySX(unsigned int siteA) {
281 if (obj) return lib->MPSApplySX(obj, siteA);
282
283 return false;
284 }
285
286 bool ApplySXDG(unsigned int siteA) {
287 if (obj) return lib->MPSApplySXDG(obj, siteA);
288
289 return false;
290 }
291
292 bool ApplyK(unsigned int siteA) {
293 if (obj) return lib->MPSApplyK(obj, siteA);
294
295 return false;
296 }
297
298 bool ApplyP(unsigned int siteA, double theta) {
299 if (obj) return lib->MPSApplyP(obj, siteA, theta);
300
301 return false;
302 }
303
304 bool ApplyRx(unsigned int siteA, double theta) {
305 if (obj) return lib->MPSApplyRx(obj, siteA, theta);
306
307 return false;
308 }
309
310 bool ApplyRy(unsigned int siteA, double theta) {
311 if (obj) return lib->MPSApplyRy(obj, siteA, theta);
312
313 return false;
314 }
315
316 bool ApplyRz(unsigned int siteA, double theta) {
317 if (obj) return lib->MPSApplyRz(obj, siteA, theta);
318
319 return false;
320 }
321
322 bool ApplyU(unsigned int siteA, double theta, double phi, double lambda,
323 double gamma) {
324 if (obj) return lib->MPSApplyU(obj, siteA, theta, phi, lambda, gamma);
325
326 return false;
327 }
328
329 bool ApplySwap(unsigned int controlQubit, unsigned int targetQubit) {
330 if (obj) return lib->MPSApplySwap(obj, controlQubit, targetQubit);
331
332 return false;
333 }
334
335 bool ApplyCX(unsigned int controlQubit, unsigned int targetQubit) {
336 if (obj) return lib->MPSApplyCX(obj, controlQubit, targetQubit);
337
338 return false;
339 }
340
341 bool ApplyCY(unsigned int controlQubit, unsigned int targetQubit) {
342 if (obj) return lib->MPSApplyCY(obj, controlQubit, targetQubit);
343
344 return false;
345 }
346
347 bool ApplyCZ(unsigned int controlQubit, unsigned int targetQubit) {
348 if (obj) return lib->MPSApplyCZ(obj, controlQubit, targetQubit);
349
350 return false;
351 }
352
353 bool ApplyCH(unsigned int controlQubit, unsigned int targetQubit) {
354 if (obj) return lib->MPSApplyCH(obj, controlQubit, targetQubit);
355
356 return false;
357 }
358
359 bool ApplyCSX(unsigned int controlQubit, unsigned int targetQubit) {
360 if (obj) return lib->MPSApplyCSX(obj, controlQubit, targetQubit);
361
362 return false;
363 }
364
365 bool ApplyCSXDG(unsigned int controlQubit, unsigned int targetQubit) {
366 if (obj) return lib->MPSApplyCSXDG(obj, controlQubit, targetQubit);
367
368 return false;
369 }
370
371 bool ApplyCP(unsigned int controlQubit, unsigned int targetQubit,
372 double theta) {
373 if (obj) return lib->MPSApplyCP(obj, controlQubit, targetQubit, theta);
374
375 return false;
376 }
377
378 bool ApplyCRx(unsigned int controlQubit, unsigned int targetQubit,
379 double theta) {
380 if (obj) return lib->MPSApplyCRx(obj, controlQubit, targetQubit, theta);
381
382 return false;
383 }
384
385 bool ApplyCRy(unsigned int controlQubit, unsigned int targetQubit,
386 double theta) {
387 if (obj) return lib->MPSApplyCRy(obj, controlQubit, targetQubit, theta);
388
389 return false;
390 }
391
392 bool ApplyCRz(unsigned int controlQubit, unsigned int targetQubit,
393 double theta) {
394 if (obj) return lib->MPSApplyCRz(obj, controlQubit, targetQubit, theta);
395
396 return false;
397 }
398
399 bool ApplyCU(unsigned int controlQubit, unsigned int targetQubit,
400 double theta, double phi, double lambda, double gamma) {
401 if (obj)
402 return lib->MPSApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
403 gamma);
404
405 return false;
406 }
407
408 private:
409 std::shared_ptr<GpuLibrary> lib;
410 void *obj;
411};
412
413} // namespace Simulators
414
415#endif // __linux__
416
417#endif // _GPU_LIB_MPS_SIM_H_
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 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)