15#ifndef _GPU_LIB_TN_SIM_H_
16#define _GPU_LIB_TN_SIM_H_
30 explicit GpuLibTNSim(
const std::shared_ptr<GpuLibrary> &lib,
int device = -1) : lib(lib), obj(
nullptr)
34 auto lock = lib->LockInitialization();
35 if (lib->SetGpuDevice(device == -1 ? lib->GetCreationDevice() : device))
36 obj = lib->CreateTensorNet();
40 int GetGpuDevice()
const
42 return lib ? lib->TNGetGpuId(obj) : -1;
45 GpuLibTNSim(
const std::shared_ptr<GpuLibrary> &lib,
void *obj) : lib(lib), obj(obj)
49 GpuLibTNSim() =
delete;
50 GpuLibTNSim(
const GpuLibTNSim &) =
delete;
51 GpuLibTNSim &operator=(
const GpuLibTNSim &) =
delete;
52 GpuLibTNSim(GpuLibTNSim &&) =
default;
53 GpuLibTNSim &operator=(GpuLibTNSim &&) =
default;
58 lib->DestroyTensorNet(obj);
61 bool Create(
unsigned int nrQubits)
64 return lib->TNCreate(obj, nrQubits);
72 return lib->TNReset(obj);
77 bool SetSeed(uint64_t seed)
79 return obj && lib->TNSetSeed(obj, seed);
85 return lib->TNIsValid(obj);
90 bool IsCreated()
const
93 return lib->TNIsCreated(obj);
98 bool SetDataType(
int useDoublePrecision)
101 return lib->TNSetDataType(obj, useDoublePrecision);
106 bool IsDoublePrecision()
const
109 return lib->TNIsDoublePrecision(obj);
114 bool SetCutoff(
double val)
117 return lib->TNSetCutoff(obj, val);
122 double GetCutoff()
const
125 return lib->TNGetCutoff(obj);
132 bool SetTruncationMode(
int mode)
135 return lib->TNSetTruncationMode(obj, mode);
140 int GetTruncationMode()
const
143 return lib->TNGetTruncationMode(obj);
148 bool SetGesvdJ(
int val)
151 return lib->TNSetGesvdJ(obj, val);
156 bool GetGesvdJ()
const
159 return lib->TNGetGesvdJ(obj);
165 bool SetGesvdP(
bool enable)
167 return obj && lib->TNSetGesvdP(obj, enable);
170 bool GetGesvdP()
const
172 return lib->TNGetGesvdP(obj);
175 bool SetGesvdR(
bool enable)
177 return obj && lib->TNSetGesvdR(obj, enable);
180 bool GetGesvdR()
const
182 return lib->TNGetGesvdR(obj);
185 bool SetMaxExtent(
long int val)
188 return lib->TNSetMaxExtent(obj, val);
193 long int GetMaxExtent()
const
196 return lib->TNGetMaxExtent(obj);
201 int GetNrQubits()
const
204 return lib->TNGetNrQubits(obj);
209 bool Amplitude(
long int numFixedValues,
long int *fixedValues,
double *real,
double *imaginary)
const
212 return lib->TNAmplitude(obj, numFixedValues, fixedValues, real, imaginary);
217 double Probability0(
unsigned int qubit)
const
220 return lib->TNProbability0(obj, qubit);
225 bool Measure(
unsigned int qubit)
228 return lib->TNMeasure(obj, qubit);
233 bool MeasureQubits(
long int numQubits,
unsigned int *qubits,
int *result)
236 return lib->TNMeasureQubits(obj, numQubits, qubits, result);
241 std::unordered_map<std::vector<bool>, int64_t> *GetMapForSample()
const
244 return lib->TNGetMapForSample();
249 bool FreeMapForSample(std::unordered_map<std::vector<bool>, int64_t> *map)
const
252 return lib->TNFreeMapForSample(map);
257 bool Sample(
long int numShots,
long int numQubits,
unsigned int *qubits,
void *resultMap)
260 return lib->TNSample(obj, numShots, numQubits, qubits, resultMap);
268 return lib->TNSaveState(obj);
276 return lib->TNRestoreState(obj);
281 bool CleanSavedState()
284 return lib->TNCleanSavedState(obj);
289 std::unique_ptr<GpuLibTNSim> Clone()
const
296 double ExpectationValue(
const std::string &pauliString)
const
299 return lib->TNExpectationValue(obj, pauliString.c_str(), pauliString.length());
304 bool ApplyX(
unsigned int siteA)
307 return lib->TNApplyX(obj, siteA);
312 bool ApplyY(
unsigned int siteA)
315 return lib->TNApplyY(obj, siteA);
320 bool ApplyZ(
unsigned int siteA)
323 return lib->TNApplyZ(obj, siteA);
328 bool ApplyH(
unsigned int siteA)
331 return lib->TNApplyH(obj, siteA);
336 bool ApplyS(
unsigned int siteA)
339 return lib->TNApplyS(obj, siteA);
347 return lib->TNApplySDG(obj, siteA);
352 bool ApplyT(
unsigned int siteA)
355 return lib->TNApplyT(obj, siteA);
363 return lib->TNApplyTDG(obj, siteA);
368 bool ApplySX(
unsigned int siteA)
371 return lib->TNApplySX(obj, siteA);
379 return lib->TNApplySXDG(obj, siteA);
384 bool ApplyK(
unsigned int siteA)
387 return lib->TNApplyK(obj, siteA);
392 bool ApplyP(
unsigned int siteA,
double theta)
395 return lib->TNApplyP(obj, siteA, theta);
400 bool ApplyRx(
unsigned int siteA,
double theta)
403 return lib->TNApplyRx(obj, siteA, theta);
408 bool ApplyRy(
unsigned int siteA,
double theta)
411 return lib->TNApplyRy(obj, siteA, theta);
416 bool ApplyRz(
unsigned int siteA,
double theta)
419 return lib->TNApplyRz(obj, siteA, theta);
424 bool ApplyU(
unsigned int siteA,
double theta,
double phi,
double lambda,
double gamma)
427 return lib->TNApplyU(obj, siteA, theta, phi, lambda, gamma);
432 bool ApplySwap(
unsigned int controlQubit,
unsigned int targetQubit)
435 return lib->TNApplySwap(obj, controlQubit, targetQubit);
440 bool ApplyCX(
unsigned int controlQubit,
unsigned int targetQubit)
443 return lib->TNApplyCX(obj, controlQubit, targetQubit);
448 bool ApplyCY(
unsigned int controlQubit,
unsigned int targetQubit)
451 return lib->TNApplyCY(obj, controlQubit, targetQubit);
456 bool ApplyCZ(
unsigned int controlQubit,
unsigned int targetQubit)
459 return lib->TNApplyCZ(obj, controlQubit, targetQubit);
464 bool ApplyCH(
unsigned int controlQubit,
unsigned int targetQubit)
467 return lib->TNApplyCH(obj, controlQubit, targetQubit);
472 bool ApplyCSX(
unsigned int controlQubit,
unsigned int targetQubit)
475 return lib->TNApplyCSX(obj, controlQubit, targetQubit);
480 bool ApplyCSXDG(
unsigned int controlQubit,
unsigned int targetQubit)
483 return lib->TNApplyCSXDG(obj, controlQubit, targetQubit);
488 bool ApplyCP(
unsigned int controlQubit,
unsigned int targetQubit,
double theta)
491 return lib->TNApplyCP(obj, controlQubit, targetQubit, theta);
496 bool ApplyCRx(
unsigned int controlQubit,
unsigned int targetQubit,
double theta)
499 return lib->TNApplyCRx(obj, controlQubit, targetQubit, theta);
504 bool ApplyCRy(
unsigned int controlQubit,
unsigned int targetQubit,
double theta)
507 return lib->TNApplyCRy(obj, controlQubit, targetQubit, theta);
512 bool ApplyCRz(
unsigned int controlQubit,
unsigned int targetQubit,
double theta)
515 return lib->TNApplyCRz(obj, controlQubit, targetQubit, theta);
520 bool ApplyCU(
unsigned int controlQubit,
unsigned int targetQubit,
double theta,
double phi,
double lambda,
double gamma)
523 return lib->TNApplyCU(obj, controlQubit, targetQubit, theta, phi, lambda, gamma);
528 bool ApplyCCX(
unsigned int controlQubit1,
unsigned int controlQubit2,
unsigned int targetQubit)
531 return lib->TNApplyCCX(obj, controlQubit1, controlQubit2, targetQubit);
535 bool ApplyCSwap(
unsigned int controlQubit,
unsigned int qubit1,
unsigned int qubit2)
538 return lib->TNApplyCSwap(obj, controlQubit, qubit1, qubit2);
543 GpuDeviceContext 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 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)
Bounded online routing based on current physical bond dimensions.