15#ifndef _GPU_LIB_MPS_SIM_H_
16#define _GPU_LIB_MPS_SIM_H_
28 explicit GpuLibMPSSim(
const std::shared_ptr<GpuLibrary> &lib) : lib(lib) {
30 obj = lib->CreateMPS();
35 GpuLibMPSSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj)
36 : lib(lib), obj(obj) {}
38 GpuLibMPSSim() =
delete;
39 GpuLibMPSSim(
const GpuLibMPSSim &) =
delete;
40 GpuLibMPSSim &operator=(
const GpuLibMPSSim &) =
delete;
41 GpuLibMPSSim(GpuLibMPSSim &&) =
default;
42 GpuLibMPSSim &operator=(GpuLibMPSSim &&) =
default;
45 if (lib && obj) lib->DestroyMPS(obj);
48 bool Create(
unsigned int nrQubits) {
49 if (obj)
return lib->MPSCreate(obj, nrQubits);
55 if (obj)
return lib->MPSReset(obj);
60 bool SetInitialQubitsMap(
const std::vector<long long int> &initialMap) {
61 if (obj)
return lib->MPSSetInitialQubitsMap(obj, initialMap);
66 bool SetUseOptimalMeetingPosition(
bool useOptimalMeetingPosition) {
67 if (obj)
return lib->MPSSetUseOptimalMeetingPosition(obj, useOptimalMeetingPosition);
71 bool IsValid()
const {
72 if (obj)
return lib->MPSIsValid(obj);
77 bool IsCreated()
const {
78 if (obj)
return lib->MPSIsCreated(obj);
83 bool SetDataType(
int useDoublePrecision) {
84 if (obj)
return lib->MPSSetDataType(obj, useDoublePrecision);
89 bool IsDoublePrecision()
const {
90 if (obj)
return lib->MPSIsDoublePrecision(obj);
95 bool SetCutoff(
double val) {
96 if (obj)
return lib->MPSSetCutoff(obj, val);
101 double GetCutoff()
const {
102 if (obj)
return lib->MPSGetCutoff(obj);
107 bool SetGesvdJ(
int val) {
108 if (obj)
return lib->MPSSetGesvdJ(obj, val);
113 bool GetGesvdJ()
const {
114 if (obj)
return lib->MPSGetGesvdJ(obj);
119 bool SetMaxExtent(
long int val) {
120 if (obj)
return lib->MPSSetMaxExtent(obj, val);
125 long int GetMaxExtent()
const {
126 if (obj)
return lib->MPSGetMaxExtent(obj);
131 int GetNrQubits()
const {
132 if (obj)
return lib->MPSGetNrQubits(obj);
137 bool SetCallbackContext(
void *context) {
138 if (obj)
return lib->MPSSetCallbackContext(obj, context);
142 bool SetMeetingPositionCallback(int64_t (*callback)(
void *,
const int64_t *)) {
143 if (obj)
return lib->MPSSetMeetingPositionCallback(obj, callback);
147 bool Amplitude(
long int numFixedValues,
long int *fixedValues,
double *real,
148 double *imaginary)
const {
150 return lib->MPSAmplitude(obj, numFixedValues, fixedValues, real,
156 double Probability0(
unsigned int qubit)
const {
157 if (obj)
return lib->MPSProbability0(obj, qubit);
162 bool Measure(
unsigned int qubit) {
163 if (obj)
return lib->MPSMeasure(obj, qubit);
168 bool MeasureQubits(
long int numQubits,
unsigned int *qubits,
int *result) {
169 if (obj)
return lib->MPSMeasureQubits(obj, numQubits, qubits, result);
174 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample()
const {
175 if (lib)
return lib->MPSGetMapForSample();
180 bool FreeMapForSample(
181 std::unordered_map<std::vector<bool>, int64_t> *map)
const {
182 if (lib)
return lib->MPSFreeMapForSample(map);
187 bool Sample(
long int numShots,
long int numQubits,
unsigned int *qubits,
189 if (obj)
return lib->MPSSample(obj, numShots, numQubits, qubits, resultMap);
195 if (obj)
return lib->MPSSaveState(obj);
201 if (obj)
return lib->MPSRestoreState(obj);
206 bool CleanSavedState() {
207 if (obj)
return lib->MPSCleanSavedState(obj);
212 std::unique_ptr<GpuLibMPSSim> Clone()
const {
213 if (obj)
return std::make_unique<GpuLibMPSSim>(lib, lib->MPSClone(obj));
218 double ExpectationValue(
const std::string &pauliString) {
220 return lib->MPSExpectationValue(obj, pauliString.c_str(),
221 pauliString.length());
226 std::complex<double> ProjectOnZero() {
227 if (obj)
return lib->MPSProjectOnZero(obj);
229 return std::complex<double>(0., 0.);
232 bool ApplyX(
unsigned int siteA) {
233 if (obj)
return lib->MPSApplyX(obj, siteA);
238 bool ApplyY(
unsigned int siteA) {
239 if (obj)
return lib->MPSApplyY(obj, siteA);
244 bool ApplyZ(
unsigned int siteA) {
245 if (obj)
return lib->MPSApplyZ(obj, siteA);
250 bool ApplyH(
unsigned int siteA) {
251 if (obj)
return lib->MPSApplyH(obj, siteA);
256 bool ApplyS(
unsigned int siteA) {
257 if (obj)
return lib->MPSApplyS(obj, siteA);
263 if (obj)
return lib->MPSApplySDG(obj, siteA);
268 bool ApplyT(
unsigned int siteA) {
269 if (obj)
return lib->MPSApplyT(obj, siteA);
275 if (obj)
return lib->MPSApplyTDG(obj, siteA);
280 bool ApplySX(
unsigned int siteA) {
281 if (obj)
return lib->MPSApplySX(obj, siteA);
287 if (obj)
return lib->MPSApplySXDG(obj, siteA);
292 bool ApplyK(
unsigned int siteA) {
293 if (obj)
return lib->MPSApplyK(obj, siteA);
298 bool ApplyP(
unsigned int siteA,
double theta) {
299 if (obj)
return lib->MPSApplyP(obj, siteA, theta);
304 bool ApplyRx(
unsigned int siteA,
double theta) {
305 if (obj)
return lib->MPSApplyRx(obj, siteA, theta);
310 bool ApplyRy(
unsigned int siteA,
double theta) {
311 if (obj)
return lib->MPSApplyRy(obj, siteA, theta);
316 bool ApplyRz(
unsigned int siteA,
double theta) {
317 if (obj)
return lib->MPSApplyRz(obj, siteA, theta);
322 bool ApplyU(
unsigned int siteA,
double theta,
double phi,
double lambda,
324 if (obj)
return lib->MPSApplyU(obj, siteA, theta, phi, lambda, gamma);
329 bool ApplySwap(
unsigned int controlQubit,
unsigned int targetQubit) {
330 if (obj)
return lib->MPSApplySwap(obj, controlQubit, targetQubit);
335 bool ApplyCX(
unsigned int controlQubit,
unsigned int targetQubit) {
336 if (obj)
return lib->MPSApplyCX(obj, controlQubit, targetQubit);
341 bool ApplyCY(
unsigned int controlQubit,
unsigned int targetQubit) {
342 if (obj)
return lib->MPSApplyCY(obj, controlQubit, targetQubit);
347 bool ApplyCZ(
unsigned int controlQubit,
unsigned int targetQubit) {
348 if (obj)
return lib->MPSApplyCZ(obj, controlQubit, targetQubit);
353 bool ApplyCH(
unsigned int controlQubit,
unsigned int targetQubit) {
354 if (obj)
return lib->MPSApplyCH(obj, controlQubit, targetQubit);
359 bool ApplyCSX(
unsigned int controlQubit,
unsigned int targetQubit) {
360 if (obj)
return lib->MPSApplyCSX(obj, controlQubit, targetQubit);
365 bool ApplyCSXDG(
unsigned int controlQubit,
unsigned int targetQubit) {
366 if (obj)
return lib->MPSApplyCSXDG(obj, controlQubit, targetQubit);
371 bool ApplyCP(
unsigned int controlQubit,
unsigned int targetQubit,
373 if (obj)
return lib->MPSApplyCP(obj, controlQubit, targetQubit, theta);
378 bool ApplyCRx(
unsigned int controlQubit,
unsigned int targetQubit,
380 if (obj)
return lib->MPSApplyCRx(obj, controlQubit, targetQubit, theta);
385 bool ApplyCRy(
unsigned int controlQubit,
unsigned int targetQubit,
387 if (obj)
return lib->MPSApplyCRy(obj, controlQubit, targetQubit, theta);
392 bool ApplyCRz(
unsigned int controlQubit,
unsigned int targetQubit,
394 if (obj)
return lib->MPSApplyCRz(obj, controlQubit, targetQubit, theta);
399 bool ApplyCU(
unsigned int controlQubit,
unsigned int targetQubit,
400 double theta,
double phi,
double lambda,
double gamma) {
402 return lib->MPSApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda,
409 std::shared_ptr<GpuLibrary> lib;
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)