8class DistributedGpuLibStateVectorSim {
10 DistributedGpuLibStateVectorSim(std::shared_ptr<DistributedGpuLibrary> lib,
12 : lib(std::move(lib)), obj(obj) {
13 if (!obj)
throw std::runtime_error(
"Null distributed GPU state");
15 virtual ~DistributedGpuLibStateVectorSim() { lib->DestroyNative(obj); }
16 DistributedGpuLibStateVectorSim(
const DistributedGpuLibStateVectorSim &) =
18 DistributedGpuLibStateVectorSim &operator=(
19 const DistributedGpuLibStateVectorSim &) =
delete;
20 DistributedGpuLibStateVectorSim(
21 DistributedGpuLibStateVectorSim &&other) noexcept
22 : lib(other.lib), obj(std::exchange(other.obj,
nullptr)) {}
23 DistributedGpuLibStateVectorSim &operator=(
24 DistributedGpuLibStateVectorSim &&) =
delete;
25 std::unique_ptr<DistributedGpuLibStateVectorSim> Clone()
const {
26 return std::make_unique<DistributedGpuLibStateVectorSim>(
27 lib, lib->CloneNative(obj));
29 int CheckLicense()
const {
30 auto result = lib->CheckLicense(obj);
31 lib->Check(result,
"CheckLicense");
34 int GetBackend()
const {
35 auto result = lib->GetBackend(obj);
36 if (result < 0) lib->Fail(
"GetBackend");
37 const char *error = lib->GetLastError();
38 if (error && *error)
throw std::runtime_error(error);
41 int SetExExecutionConfig(
42 const DistributedGpuApi::MgdExExecutionConfig *config)
const {
43 auto result = lib->SetExExecutionConfig(obj, config);
44 lib->Check(result,
"SetExExecutionConfig");
47 int SetDataType(
int useDoublePrecision)
const {
48 auto result = lib->SetDataType(obj, useDoublePrecision);
49 lib->Check(result,
"SetDataType");
52 int SetSeed(
unsigned long long seed)
const {
53 auto result = lib->SetSeed(obj, seed);
54 lib->Check(result,
"SetSeed");
57 int IsDoublePrecision()
const {
58 auto result = lib->IsDoublePrecision(obj);
59 const char *error = lib->GetLastError();
60 if (error && *error)
throw std::runtime_error(error);
63 int GetNrQubits()
const {
64 auto result = lib->GetNrQubits(obj);
65 if (result < 0) lib->Fail(
"GetNrQubits");
66 const char *error = lib->GetLastError();
67 if (error && *error)
throw std::runtime_error(error);
70 int GetStateVectorGpuId()
const {
71 auto result = lib->GetStateVectorGpuId(obj);
72 const char *error = lib->GetLastError();
73 if (error && *error)
throw std::runtime_error(error);
76 int Create(
unsigned int nrQubits)
const {
77 auto result = lib->Create(obj, nrQubits);
78 lib->Check(result,
"Create");
81 int CreateWithState(
unsigned int nrQubits,
const double *state)
const {
82 auto result = lib->CreateWithState(obj, nrQubits, state);
83 lib->Check(result,
"CreateWithState");
87 auto result = lib->Reset(obj);
88 lib->Check(result,
"Reset");
91 int MeasureQubitCollapse(
int qubitIndex)
const {
92 auto result = lib->MeasureQubitCollapse(obj, qubitIndex);
93 if (result != 0 && result != 1) lib->Fail(
"MeasureQubitCollapse");
96 int MeasureQubitNoCollapse(
int qubitIndex)
const {
97 auto result = lib->MeasureQubitNoCollapse(obj, qubitIndex);
98 if (result != 0 && result != 1) lib->Fail(
"MeasureQubitNoCollapse");
101 int MeasureQubitsCollapse(
int *qubits,
int *bitstring,
102 int bitstringLen)
const {
104 lib->MeasureQubitsCollapse(obj, qubits, bitstring, bitstringLen);
105 lib->Check(result,
"MeasureQubitsCollapse");
108 int MeasureQubitsNoCollapse(
int *qubits,
int *bitstring,
109 int bitstringLen)
const {
111 lib->MeasureQubitsNoCollapse(obj, qubits, bitstring, bitstringLen);
112 lib->Check(result,
"MeasureQubitsNoCollapse");
115 unsigned long long MeasureAllQubitsCollapse()
const {
116 auto result = lib->MeasureAllQubitsCollapse(obj);
117 if (result == UINT64_MAX) lib->Fail(
"MeasureAllQubitsCollapse");
120 unsigned long long MeasureAllQubitsNoCollapse()
const {
121 auto result = lib->MeasureAllQubitsNoCollapse(obj);
122 if (result == UINT64_MAX) lib->Fail(
"MeasureAllQubitsNoCollapse");
126 auto result = lib->SaveState(obj);
127 lib->Check(result,
"SaveState");
130 int SaveStateToHost()
const {
131 auto result = lib->SaveStateToHost(obj);
132 lib->Check(result,
"SaveStateToHost");
135 int SaveStateDestructive()
const {
136 auto result = lib->SaveStateDestructive(obj);
137 lib->Check(result,
"SaveStateDestructive");
140 int RestoreStateFreeSaved()
const {
141 auto result = lib->RestoreStateFreeSaved(obj);
142 lib->Check(result,
"RestoreStateFreeSaved");
145 int RestoreStateNoFreeSaved()
const {
146 auto result = lib->RestoreStateNoFreeSaved(obj);
147 lib->Check(result,
"RestoreStateNoFreeSaved");
150 void FreeSavedState()
const {
151 lib->FreeSavedState(obj);
152 const char *error = lib->GetLastError();
153 if (error && *error)
throw std::runtime_error(error);
155 int Sample(
unsigned int nSamples,
long int *samples,
unsigned int nBits,
156 int *bitOrdering)
const {
157 auto result = lib->Sample(obj, nSamples, samples, nBits, bitOrdering);
158 lib->Check(result,
"Sample");
161 int SampleAll(
unsigned int nSamples,
long int *samples)
const {
162 auto result = lib->SampleAll(obj, nSamples, samples);
163 lib->Check(result,
"SampleAll");
166 int Amplitude(
long long int state,
double *real,
double *imaginary)
const {
167 auto result = lib->Amplitude(obj, state, real, imaginary);
168 lib->Check(result,
"Amplitude");
171 double Probability(
int *qubits,
int *mask,
int len)
const {
172 auto result = lib->Probability(obj, qubits, mask, len);
173 if (!std::isfinite(result)) lib->Fail(
"Probability");
176 double BasisStateProbability(
long long int state)
const {
177 auto result = lib->BasisStateProbability(obj, state);
178 if (!std::isfinite(result)) lib->Fail(
"BasisStateProbability");
182 auto result = lib->AllProbabilities(obj, probabilities);
183 lib->Check(result,
"AllProbabilities");
186 double ExpectationValue(
const char *pauliString,
int len)
const {
187 auto result = lib->ExpectationValue(obj, pauliString, len);
188 if (!std::isfinite(result)) lib->Fail(
"ExpectationValue");
191 int ApplyX(
int qubit)
const {
192 auto result = lib->ApplyX(obj, qubit);
193 lib->Check(result,
"ApplyX");
196 int ApplyY(
int qubit)
const {
197 auto result = lib->ApplyY(obj, qubit);
198 lib->Check(result,
"ApplyY");
201 int ApplyZ(
int qubit)
const {
202 auto result = lib->ApplyZ(obj, qubit);
203 lib->Check(result,
"ApplyZ");
206 int ApplyH(
int qubit)
const {
207 auto result = lib->ApplyH(obj, qubit);
208 lib->Check(result,
"ApplyH");
211 int ApplyS(
int qubit)
const {
212 auto result = lib->ApplyS(obj, qubit);
213 lib->Check(result,
"ApplyS");
217 auto result = lib->ApplySDG(obj, qubit);
218 lib->Check(result,
"ApplySDG");
221 int ApplyT(
int qubit)
const {
222 auto result = lib->ApplyT(obj, qubit);
223 lib->Check(result,
"ApplyT");
227 auto result = lib->ApplyTDG(obj, qubit);
228 lib->Check(result,
"ApplyTDG");
232 auto result = lib->ApplySX(obj, qubit);
233 lib->Check(result,
"ApplySX");
237 auto result = lib->ApplySXDG(obj, qubit);
238 lib->Check(result,
"ApplySXDG");
241 int ApplyK(
int qubit)
const {
242 auto result = lib->ApplyK(obj, qubit);
243 lib->Check(result,
"ApplyK");
246 int ApplyP(
int qubit,
double theta)
const {
247 auto result = lib->ApplyP(obj, qubit, theta);
248 lib->Check(result,
"ApplyP");
251 int ApplyRx(
int qubit,
double theta)
const {
252 auto result = lib->ApplyRx(obj, qubit, theta);
253 lib->Check(result,
"ApplyRx");
256 int ApplyRy(
int qubit,
double theta)
const {
257 auto result = lib->ApplyRy(obj, qubit, theta);
258 lib->Check(result,
"ApplyRy");
261 int ApplyRz(
int qubit,
double theta)
const {
262 auto result = lib->ApplyRz(obj, qubit, theta);
263 lib->Check(result,
"ApplyRz");
266 int ApplyU(
int qubit,
double theta,
double phi,
double lambda,
267 double gamma)
const {
268 auto result = lib->ApplyU(obj, qubit, theta, phi, lambda, gamma);
269 lib->Check(result,
"ApplyU");
272 int ApplyCX(
int controlQubit,
int targetQubit)
const {
273 auto result = lib->ApplyCX(obj, controlQubit, targetQubit);
274 lib->Check(result,
"ApplyCX");
277 int ApplyCY(
int controlQubit,
int targetQubit)
const {
278 auto result = lib->ApplyCY(obj, controlQubit, targetQubit);
279 lib->Check(result,
"ApplyCY");
282 int ApplyCZ(
int controlQubit,
int targetQubit)
const {
283 auto result = lib->ApplyCZ(obj, controlQubit, targetQubit);
284 lib->Check(result,
"ApplyCZ");
287 int ApplyCH(
int controlQubit,
int targetQubit)
const {
288 auto result = lib->ApplyCH(obj, controlQubit, targetQubit);
289 lib->Check(result,
"ApplyCH");
292 int ApplyCSX(
int controlQubit,
int targetQubit)
const {
293 auto result = lib->ApplyCSX(obj, controlQubit, targetQubit);
294 lib->Check(result,
"ApplyCSX");
297 int ApplyCSXDG(
int controlQubit,
int targetQubit)
const {
298 auto result = lib->ApplyCSXDG(obj, controlQubit, targetQubit);
299 lib->Check(result,
"ApplyCSXDG");
302 int ApplyCP(
int controlQubit,
int targetQubit,
double theta)
const {
303 auto result = lib->ApplyCP(obj, controlQubit, targetQubit, theta);
304 lib->Check(result,
"ApplyCP");
307 int ApplyCRx(
int controlQubit,
int targetQubit,
double theta)
const {
308 auto result = lib->ApplyCRx(obj, controlQubit, targetQubit, theta);
309 lib->Check(result,
"ApplyCRx");
312 int ApplyCRy(
int controlQubit,
int targetQubit,
double theta)
const {
313 auto result = lib->ApplyCRy(obj, controlQubit, targetQubit, theta);
314 lib->Check(result,
"ApplyCRy");
317 int ApplyCRz(
int controlQubit,
int targetQubit,
double theta)
const {
318 auto result = lib->ApplyCRz(obj, controlQubit, targetQubit, theta);
319 lib->Check(result,
"ApplyCRz");
322 int ApplyCCX(
int controlQubit1,
int controlQubit2,
int targetQubit)
const {
323 auto result = lib->ApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
324 lib->Check(result,
"ApplyCCX");
327 int ApplySwap(
int qubit1,
int qubit2)
const {
328 auto result = lib->ApplySwap(obj, qubit1, qubit2);
329 lib->Check(result,
"ApplySwap");
332 int ApplyCSwap(
int controlQubit,
int qubit1,
int qubit2)
const {
333 auto result = lib->ApplyCSwap(obj, controlQubit, qubit1, qubit2);
334 lib->Check(result,
"ApplyCSwap");
337 int ApplyCU(
int controlQubit,
int targetQubit,
double theta,
double phi,
338 double lambda,
double gamma)
const {
340 lib->ApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda, gamma);
341 lib->Check(result,
"ApplyCU");
344 int ConfigureDistribution(
345 const DistributedGpuApi::MgdDistributionConfig *config)
const {
346 auto result = lib->ConfigureDistribution(obj, config);
347 lib->Check(result,
"ConfigureDistribution");
350 int GetShardDevices(int32_t *devices, uint32_t capacity)
const {
351 auto result = lib->GetShardDevices(obj, devices, capacity);
352 if (result < 0) lib->Fail(
"GetShardDevices");
353 const char *error = lib->GetLastError();
354 if (error && *error)
throw std::runtime_error(error);
357 int GetGlobalQubits(int32_t *qubits, uint32_t capacity)
const {
358 auto result = lib->GetGlobalQubits(obj, qubits, capacity);
359 if (result < 0) lib->Fail(
"GetGlobalQubits");
360 const char *error = lib->GetLastError();
361 if (error && *error)
throw std::runtime_error(error);
364 int GetQubitLayout(int32_t *wires, uint32_t capacity)
const {
365 auto result = lib->GetQubitLayout(obj, wires, capacity);
366 if (result < 0) lib->Fail(
"GetQubitLayout");
367 const char *error = lib->GetLastError();
368 if (error && *error)
throw std::runtime_error(error);
371 int Redistribute(
const int32_t *global_qubits, uint32_t count)
const {
372 auto result = lib->Redistribute(obj, global_qubits, count);
373 lib->Check(result,
"Redistribute");
376 int SwapGlobalLocalQubits(
const int32_t *global_qubits,
377 const int32_t *local_qubits, uint32_t count)
const {
379 lib->SwapGlobalLocalQubits(obj, global_qubits, local_qubits, count);
380 lib->Check(result,
"SwapGlobalLocalQubits");
383 int Synchronize()
const {
384 auto result = lib->Synchronize(obj);
385 lib->Check(result,
"Synchronize");
388 int GetStateRange(uint64_t begin, uint64_t end,
double *output)
const {
389 auto result = lib->GetStateRange(obj, begin, end, output);
390 lib->Check(result,
"GetStateRange");
393 int SetStateRange(uint64_t begin, uint64_t end,
const double *input)
const {
394 auto result = lib->SetStateRange(obj, begin, end, input);
395 lib->Check(result,
"SetStateRange");
398 int GetLocalStateBounds(uint64_t *begin, uint64_t *end)
const {
399 auto result = lib->GetLocalStateBounds(obj, begin, end);
400 lib->Check(result,
"GetLocalStateBounds");
403 int GetLocalStateRange(uint64_t begin, uint64_t end,
double *output)
const {
404 auto result = lib->GetLocalStateRange(obj, begin, end, output);
405 lib->Check(result,
"GetLocalStateRange");
408 int SetLocalStateRange(uint64_t begin, uint64_t end,
409 const double *input)
const {
410 auto result = lib->SetLocalStateRange(obj, begin, end, input);
411 lib->Check(result,
"SetLocalStateRange");
414 int CreateWithBasisState(uint32_t nrQubits, uint64_t basis)
const {
415 auto result = lib->CreateWithBasisState(obj, nrQubits, basis);
416 lib->Check(result,
"CreateWithBasisState");
419 int ApplyOneQubitMatrix(
int qubit,
const double *matrix)
const {
420 auto result = lib->ApplyOneQubitMatrix(obj, qubit, matrix);
421 lib->Check(result,
"ApplyOneQubitMatrix");
424 int ApplyOneQubitMatrixWithLayout(
int qubit,
const double *matrix,
427 lib->ApplyOneQubitMatrixWithLayout(obj, qubit, matrix, layout);
428 lib->Check(result,
"ApplyOneQubitMatrixWithLayout");
431 int ApplyTwoQubitMatrix(
int qubit0,
int qubit1,
const double *matrix)
const {
432 auto result = lib->ApplyTwoQubitMatrix(obj, qubit0, qubit1, matrix);
433 lib->Check(result,
"ApplyTwoQubitMatrix");
436 int ApplyTwoQubitMatrixWithLayout(
int qubit0,
int qubit1,
437 const double *matrix,
int layout)
const {
439 lib->ApplyTwoQubitMatrixWithLayout(obj, qubit0, qubit1, matrix, layout);
440 lib->Check(result,
"ApplyTwoQubitMatrixWithLayout");
445 std::shared_ptr<DistributedGpuLibrary> lib;
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)