Maestro 0.1.0
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 IsValid() const {
61 if (obj) return lib->MPSIsValid(obj);
62
63 return false;
64 }
65
66 bool IsCreated() const {
67 if (obj) return lib->MPSIsCreated(obj);
68
69 return false;
70 }
71
72 bool SetDataType(int useDoublePrecision) {
73 if (obj) return lib->MPSSetDataType(obj, useDoublePrecision);
74
75 return false;
76 }
77
78 bool IsDoublePrecision() const {
79 if (obj) return lib->MPSIsDoublePrecision(obj);
80
81 return false;
82 }
83
84 bool SetCutoff(double val) {
85 if (obj) return lib->MPSSetCutoff(obj, val);
86
87 return false;
88 }
89
90 double GetCutoff() const {
91 if (obj) return lib->MPSGetCutoff(obj);
92
93 return 0.;
94 }
95
96 bool SetGesvdJ(int val) {
97 if (obj) return lib->MPSSetGesvdJ(obj, val);
98
99 return false;
100 }
101
102 bool GetGesvdJ() const {
103 if (obj) return lib->MPSGetGesvdJ(obj);
104
105 return false;
106 }
107
108 bool SetMaxExtent(long int val) {
109 if (obj) return lib->MPSSetMaxExtent(obj, val);
110
111 return false;
112 }
113
114 long int GetMaxExtent() const {
115 if (obj) return lib->MPSGetMaxExtent(obj);
116
117 return 0;
118 }
119
120 int GetNrQubits() const {
121 if (obj) return lib->MPSGetNrQubits(obj);
122
123 return 0;
124 }
125
126 bool Amplitude(long int numFixedValues, long int *fixedValues, double *real,
127 double *imaginary) const {
128 if (obj)
129 return lib->MPSAmplitude(obj, numFixedValues, fixedValues, real,
130 imaginary);
131
132 return false;
133 }
134
135 double Probability0(unsigned int qubit) const {
136 if (obj) return lib->MPSProbability0(obj, qubit);
137
138 return 0.;
139 }
140
141 bool Measure(unsigned int qubit) {
142 if (obj) return lib->MPSMeasure(obj, qubit);
143
144 return 0;
145 }
146
147 bool MeasureQubits(long int numQubits, unsigned int *qubits, int *result) {
148 if (obj) return lib->MPSMeasureQubits(obj, numQubits, qubits, result);
149
150 return false;
151 }
152
153 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample() const {
154 if (lib) return lib->MPSGetMapForSample();
155
156 return nullptr;
157 }
158
159 bool FreeMapForSample(
160 std::unordered_map<std::vector<bool>, int64_t> *map) const {
161 if (lib) return lib->MPSFreeMapForSample(map);
162
163 return false;
164 }
165
166 bool Sample(long int numShots, long int numQubits, unsigned int *qubits,
167 void *resultMap) {
168 if (obj) return lib->MPSSample(obj, numShots, numQubits, qubits, resultMap);
169
170 return false;
171 }
172
173 bool SaveState() {
174 if (obj) return lib->MPSSaveState(obj);
175
176 return false;
177 }
178
179 bool RestoreState() {
180 if (obj) return lib->MPSRestoreState(obj);
181
182 return false;
183 }
184
185 bool CleanSavedState() {
186 if (obj) return lib->MPSCleanSavedState(obj);
187
188 return false;
189 }
190
191 std::unique_ptr<GpuLibMPSSim> Clone() const {
192 if (obj) return std::make_unique<GpuLibMPSSim>(lib, lib->MPSClone(obj));
193
194 return nullptr;
195 }
196
197 double ExpectationValue(const std::string &pauliString) const {
198 if (obj)
199 return lib->MPSExpectationValue(obj, pauliString.c_str(),
200 pauliString.length());
201
202 return 0.0;
203 }
204
205 bool ApplyX(unsigned int siteA) {
206 if (obj) return lib->MPSApplyX(obj, siteA);
207
208 return false;
209 }
210
211 bool ApplyY(unsigned int siteA) {
212 if (obj) return lib->MPSApplyY(obj, siteA);
213
214 return false;
215 }
216
217 bool ApplyZ(unsigned int siteA) {
218 if (obj) return lib->MPSApplyZ(obj, siteA);
219
220 return false;
221 }
222
223 bool ApplyH(unsigned int siteA) {
224 if (obj) return lib->MPSApplyH(obj, siteA);
225
226 return false;
227 }
228
229 bool ApplyS(unsigned int siteA) {
230 if (obj) return lib->MPSApplyS(obj, siteA);
231
232 return false;
233 }
234
235 bool ApplySDG(unsigned int siteA) {
236 if (obj) return lib->MPSApplySDG(obj, siteA);
237
238 return false;
239 }
240
241 bool ApplyT(unsigned int siteA) {
242 if (obj) return lib->MPSApplyT(obj, siteA);
243
244 return false;
245 }
246
247 bool ApplyTDG(unsigned int siteA) {
248 if (obj) return lib->MPSApplyTDG(obj, siteA);
249
250 return false;
251 }
252
253 bool ApplySX(unsigned int siteA) {
254 if (obj) return lib->MPSApplySX(obj, siteA);
255
256 return false;
257 }
258
259 bool ApplySXDG(unsigned int siteA) {
260 if (obj) return lib->MPSApplySXDG(obj, siteA);
261
262 return false;
263 }
264
265 bool ApplyK(unsigned int siteA) {
266 if (obj) return lib->MPSApplyK(obj, siteA);
267
268 return false;
269 }
270
271 bool ApplyP(unsigned int siteA, double theta) {
272 if (obj) return lib->MPSApplyP(obj, siteA, theta);
273
274 return false;
275 }
276
277 bool ApplyRx(unsigned int siteA, double theta) {
278 if (obj) return lib->MPSApplyRx(obj, siteA, theta);
279
280 return false;
281 }
282
283 bool ApplyRy(unsigned int siteA, double theta) {
284 if (obj) return lib->MPSApplyRy(obj, siteA, theta);
285
286 return false;
287 }
288
289 bool ApplyRz(unsigned int siteA, double theta) {
290 if (obj) return lib->MPSApplyRz(obj, siteA, theta);
291
292 return false;
293 }
294
295 bool ApplyU(unsigned int siteA, double theta, double phi, double lambda,
296 double gamma) {
297 if (obj) return lib->MPSApplyU(obj, siteA, theta, phi, lambda, gamma);
298
299 return false;
300 }
301
302 bool ApplySwap(unsigned int controlQubit, unsigned int targetQubit) {
303 if (obj) return lib->MPSApplySwap(obj, controlQubit, targetQubit);
304
305 return false;
306 }
307
308 bool ApplyCX(unsigned int controlQubit, unsigned int targetQubit) {
309 if (obj) return lib->MPSApplyCX(obj, controlQubit, targetQubit);
310
311 return false;
312 }
313
314 bool ApplyCY(unsigned int controlQubit, unsigned int targetQubit) {
315 if (obj) return lib->MPSApplyCY(obj, controlQubit, targetQubit);
316
317 return false;
318 }
319
320 bool ApplyCZ(unsigned int controlQubit, unsigned int targetQubit) {
321 if (obj) return lib->MPSApplyCZ(obj, controlQubit, targetQubit);
322
323 return false;
324 }
325
326 bool ApplyCH(unsigned int controlQubit, unsigned int targetQubit) {
327 if (obj) return lib->MPSApplyCH(obj, controlQubit, targetQubit);
328
329 return false;
330 }
331
332 bool ApplyCSX(unsigned int controlQubit, unsigned int targetQubit) {
333 if (obj) return lib->MPSApplyCSX(obj, controlQubit, targetQubit);
334
335 return false;
336 }
337
338 bool ApplyCSXDG(unsigned int controlQubit, unsigned int targetQubit) {
339 if (obj) return lib->MPSApplyCSXDG(obj, controlQubit, targetQubit);
340
341 return false;
342 }
343
344 bool ApplyCP(unsigned int controlQubit, unsigned int targetQubit,
345 double theta) {
346 if (obj) return lib->MPSApplyCP(obj, controlQubit, targetQubit, theta);
347
348 return false;
349 }
350
351 bool ApplyCRx(unsigned int controlQubit, unsigned int targetQubit,
352 double theta) {
353 if (obj) return lib->MPSApplyCRx(obj, controlQubit, targetQubit, theta);
354
355 return false;
356 }
357
358 bool ApplyCRy(unsigned int controlQubit, unsigned int targetQubit,
359 double theta) {
360 if (obj) return lib->MPSApplyCRy(obj, controlQubit, targetQubit, theta);
361
362 return false;
363 }
364
365 bool ApplyCRz(unsigned int controlQubit, unsigned int targetQubit,
366 double theta) {
367 if (obj) return lib->MPSApplyCRz(obj, controlQubit, targetQubit, theta);
368
369 return false;
370 }
371
372 bool ApplyCU(unsigned int controlQubit, unsigned int targetQubit,
373 double theta, double phi, double lambda, double gamma) {
374 if (obj)
375 return lib->MPSApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
376 gamma);
377
378 return false;
379 }
380
381 private:
382 std::shared_ptr<GpuLibrary> lib;
383 void *obj;
384};
385
386} // namespace Simulators
387
388#endif // __linux__
389
390#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)