Maestro 0.2.5
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
GpuLibMPSSim.h
Go to the documentation of this file.
1
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 Amplitude(long int numFixedValues, long int *fixedValues, double *real,
138 double *imaginary) const {
139 if (obj)
140 return lib->MPSAmplitude(obj, numFixedValues, fixedValues, real,
141 imaginary);
142
143 return false;
144 }
145
146 double Probability0(unsigned int qubit) const {
147 if (obj) return lib->MPSProbability0(obj, qubit);
148
149 return 0.;
150 }
151
152 bool Measure(unsigned int qubit) {
153 if (obj) return lib->MPSMeasure(obj, qubit);
154
155 return 0;
156 }
157
158 bool MeasureQubits(long int numQubits, unsigned int *qubits, int *result) {
159 if (obj) return lib->MPSMeasureQubits(obj, numQubits, qubits, result);
160
161 return false;
162 }
163
164 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample() const {
165 if (lib) return lib->MPSGetMapForSample();
166
167 return nullptr;
168 }
169
170 bool FreeMapForSample(
171 std::unordered_map<std::vector<bool>, int64_t> *map) const {
172 if (lib) return lib->MPSFreeMapForSample(map);
173
174 return false;
175 }
176
177 bool Sample(long int numShots, long int numQubits, unsigned int *qubits,
178 void *resultMap) {
179 if (obj) return lib->MPSSample(obj, numShots, numQubits, qubits, resultMap);
180
181 return false;
182 }
183
184 bool SaveState() {
185 if (obj) return lib->MPSSaveState(obj);
186
187 return false;
188 }
189
190 bool RestoreState() {
191 if (obj) return lib->MPSRestoreState(obj);
192
193 return false;
194 }
195
196 bool CleanSavedState() {
197 if (obj) return lib->MPSCleanSavedState(obj);
198
199 return false;
200 }
201
202 std::unique_ptr<GpuLibMPSSim> Clone() const {
203 if (obj) return std::make_unique<GpuLibMPSSim>(lib, lib->MPSClone(obj));
204
205 return nullptr;
206 }
207
208 double ExpectationValue(const std::string &pauliString) {
209 if (obj)
210 return lib->MPSExpectationValue(obj, pauliString.c_str(),
211 pauliString.length());
212
213 return 0.0;
214 }
215
216 std::complex<double> ProjectOnZero() {
217 if (obj) return lib->MPSProjectOnZero(obj);
218
219 return std::complex<double>(0., 0.);
220 }
221
222 bool ApplyX(unsigned int siteA) {
223 if (obj) return lib->MPSApplyX(obj, siteA);
224
225 return false;
226 }
227
228 bool ApplyY(unsigned int siteA) {
229 if (obj) return lib->MPSApplyY(obj, siteA);
230
231 return false;
232 }
233
234 bool ApplyZ(unsigned int siteA) {
235 if (obj) return lib->MPSApplyZ(obj, siteA);
236
237 return false;
238 }
239
240 bool ApplyH(unsigned int siteA) {
241 if (obj) return lib->MPSApplyH(obj, siteA);
242
243 return false;
244 }
245
246 bool ApplyS(unsigned int siteA) {
247 if (obj) return lib->MPSApplyS(obj, siteA);
248
249 return false;
250 }
251
252 bool ApplySDG(unsigned int siteA) {
253 if (obj) return lib->MPSApplySDG(obj, siteA);
254
255 return false;
256 }
257
258 bool ApplyT(unsigned int siteA) {
259 if (obj) return lib->MPSApplyT(obj, siteA);
260
261 return false;
262 }
263
264 bool ApplyTDG(unsigned int siteA) {
265 if (obj) return lib->MPSApplyTDG(obj, siteA);
266
267 return false;
268 }
269
270 bool ApplySX(unsigned int siteA) {
271 if (obj) return lib->MPSApplySX(obj, siteA);
272
273 return false;
274 }
275
276 bool ApplySXDG(unsigned int siteA) {
277 if (obj) return lib->MPSApplySXDG(obj, siteA);
278
279 return false;
280 }
281
282 bool ApplyK(unsigned int siteA) {
283 if (obj) return lib->MPSApplyK(obj, siteA);
284
285 return false;
286 }
287
288 bool ApplyP(unsigned int siteA, double theta) {
289 if (obj) return lib->MPSApplyP(obj, siteA, theta);
290
291 return false;
292 }
293
294 bool ApplyRx(unsigned int siteA, double theta) {
295 if (obj) return lib->MPSApplyRx(obj, siteA, theta);
296
297 return false;
298 }
299
300 bool ApplyRy(unsigned int siteA, double theta) {
301 if (obj) return lib->MPSApplyRy(obj, siteA, theta);
302
303 return false;
304 }
305
306 bool ApplyRz(unsigned int siteA, double theta) {
307 if (obj) return lib->MPSApplyRz(obj, siteA, theta);
308
309 return false;
310 }
311
312 bool ApplyU(unsigned int siteA, double theta, double phi, double lambda,
313 double gamma) {
314 if (obj) return lib->MPSApplyU(obj, siteA, theta, phi, lambda, gamma);
315
316 return false;
317 }
318
319 bool ApplySwap(unsigned int controlQubit, unsigned int targetQubit) {
320 if (obj) return lib->MPSApplySwap(obj, controlQubit, targetQubit);
321
322 return false;
323 }
324
325 bool ApplyCX(unsigned int controlQubit, unsigned int targetQubit) {
326 if (obj) return lib->MPSApplyCX(obj, controlQubit, targetQubit);
327
328 return false;
329 }
330
331 bool ApplyCY(unsigned int controlQubit, unsigned int targetQubit) {
332 if (obj) return lib->MPSApplyCY(obj, controlQubit, targetQubit);
333
334 return false;
335 }
336
337 bool ApplyCZ(unsigned int controlQubit, unsigned int targetQubit) {
338 if (obj) return lib->MPSApplyCZ(obj, controlQubit, targetQubit);
339
340 return false;
341 }
342
343 bool ApplyCH(unsigned int controlQubit, unsigned int targetQubit) {
344 if (obj) return lib->MPSApplyCH(obj, controlQubit, targetQubit);
345
346 return false;
347 }
348
349 bool ApplyCSX(unsigned int controlQubit, unsigned int targetQubit) {
350 if (obj) return lib->MPSApplyCSX(obj, controlQubit, targetQubit);
351
352 return false;
353 }
354
355 bool ApplyCSXDG(unsigned int controlQubit, unsigned int targetQubit) {
356 if (obj) return lib->MPSApplyCSXDG(obj, controlQubit, targetQubit);
357
358 return false;
359 }
360
361 bool ApplyCP(unsigned int controlQubit, unsigned int targetQubit,
362 double theta) {
363 if (obj) return lib->MPSApplyCP(obj, controlQubit, targetQubit, theta);
364
365 return false;
366 }
367
368 bool ApplyCRx(unsigned int controlQubit, unsigned int targetQubit,
369 double theta) {
370 if (obj) return lib->MPSApplyCRx(obj, controlQubit, targetQubit, theta);
371
372 return false;
373 }
374
375 bool ApplyCRy(unsigned int controlQubit, unsigned int targetQubit,
376 double theta) {
377 if (obj) return lib->MPSApplyCRy(obj, controlQubit, targetQubit, theta);
378
379 return false;
380 }
381
382 bool ApplyCRz(unsigned int controlQubit, unsigned int targetQubit,
383 double theta) {
384 if (obj) return lib->MPSApplyCRz(obj, controlQubit, targetQubit, theta);
385
386 return false;
387 }
388
389 bool ApplyCU(unsigned int controlQubit, unsigned int targetQubit,
390 double theta, double phi, double lambda, double gamma) {
391 if (obj)
392 return lib->MPSApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
393 gamma);
394
395 return false;
396 }
397
398 private:
399 std::shared_ptr<GpuLibrary> lib;
400 void *obj;
401};
402
403} // namespace Simulators
404
405#endif // __linux__
406
407#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)