25 #include "common/cudaengine.cuh"
29 #if ENABLE_OPENCL || ENABLE_CUDA
48 template <
typename... Ts>
53 std::vector<QInterfaceEngine> engines{ engine2, engine3 };
57 return std::make_shared<QStabilizer>(args...);
59 return std::make_shared<QUnitClifford>(args...);
62 return std::make_shared<QBdt>(engines, args...);
64 return std::make_shared<QBdtHybrid>(engines, args...);
67 return std::make_shared<QPager>(engines, args...);
69 return std::make_shared<QStabilizerHybrid>(engines, args...);
71 return std::make_shared<QUnit>(engines, args...);
73 return std::make_shared<QTensorNetwork>(engines, args...);
76 return std::make_shared<QEngineOCL>(args...);
80 return std::make_shared<QEngineCUDA>(args...);
82 #if ENABLE_OPENCL || ENABLE_CUDA
84 return std::make_shared<QHybrid>(args...);
86 return std::make_shared<QUnitMulti>(engines, args...);
89 return std::make_shared<QEngineCPU>(args...);
91 return std::make_shared<QInterfaceNoisy>(engines, args...);
93 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
97 template <
typename... Ts>
101 std::vector<QInterfaceEngine> engines{ engine2 };
105 return std::make_shared<QStabilizer>(args...);
107 return std::make_shared<QUnitClifford>(args...);
110 return std::make_shared<QBdt>(engines, args...);
112 return std::make_shared<QBdtHybrid>(engines, args...);
115 return std::make_shared<QPager>(engines, args...);
117 return std::make_shared<QStabilizerHybrid>(engines, args...);
119 return std::make_shared<QUnit>(engines, args...);
121 return std::make_shared<QTensorNetwork>(engines, args...);
124 return std::make_shared<QEngineOCL>(args...);
128 return std::make_shared<QEngineCUDA>(args...);
130 #if ENABLE_OPENCL || ENABLE_CUDA
132 return std::make_shared<QHybrid>(args...);
134 return std::make_shared<QUnitMulti>(engines, args...);
137 return std::make_shared<QEngineCPU>(args...);
139 return std::make_shared<QInterfaceNoisy>(engines, args...);
141 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
149 return std::make_shared<QStabilizer>(args...);
151 return std::make_shared<QUnitClifford>(args...);
154 return std::make_shared<QBdt>(args...);
156 return std::make_shared<QBdtHybrid>(args...);
159 return std::make_shared<QPager>(args...);
161 return std::make_shared<QStabilizerHybrid>(args...);
163 return std::make_shared<QUnit>(args...);
165 return std::make_shared<QTensorNetwork>(args...);
168 return std::make_shared<QEngineOCL>(args...);
172 return std::make_shared<QEngineCUDA>(args...);
174 #if ENABLE_OPENCL || ENABLE_CUDA
176 return std::make_shared<QHybrid>(args...);
178 return std::make_shared<QUnitMulti>(args...);
181 return std::make_shared<QEngineCPU>(args...);
183 return std::make_shared<QInterfaceNoisy>(args...);
185 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
192 engines.erase(engines.begin());
196 return std::make_shared<QStabilizer>(args...);
198 return std::make_shared<QUnitClifford>(args...);
201 if (engines.size()) {
202 return std::make_shared<QBdt>(engines, args...);
204 return std::make_shared<QBdt>(args...);
206 if (engines.size()) {
207 return std::make_shared<QBdtHybrid>(engines, args...);
209 return std::make_shared<QBdtHybrid>(args...);
212 if (engines.size()) {
213 return std::make_shared<QPager>(engines, args...);
215 return std::make_shared<QPager>(args...);
217 if (engines.size()) {
218 return std::make_shared<QStabilizerHybrid>(engines, args...);
220 return std::make_shared<QStabilizerHybrid>(args...);
222 if (engines.size()) {
223 return std::make_shared<QUnit>(engines, args...);
225 return std::make_shared<QUnit>(args...);
227 if (engines.size()) {
228 return std::make_shared<QTensorNetwork>(engines, args...);
230 return std::make_shared<QTensorNetwork>(args...);
233 return std::make_shared<QEngineOCL>(args...);
237 return std::make_shared<QEngineCUDA>(args...);
239 #if ENABLE_OPENCL || ENABLE_CUDA
241 return std::make_shared<QHybrid>(args...);
243 if (engines.size()) {
244 return std::make_shared<QUnitMulti>(engines, args...);
246 return std::make_shared<QUnitMulti>(args...);
249 return std::make_shared<QEngineCPU>(args...);
251 if (engines.size()) {
252 return std::make_shared<QInterfaceNoisy>(engines, args...);
254 return std::make_shared<QInterfaceNoisy>(args...);
256 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
261 #define DEVICE_COUNT (OCLEngine::Instance().GetDeviceCount())
263 #define DEVICE_COUNT (CUDAEngine::Instance().GetDeviceCount())
265 template <
typename... Ts>
267 bool nw,
bool md,
bool sd,
bool sh,
bool bdt,
bool pg,
bool tn,
bool hy,
bool oc, Ts... args)
269 #if ENABLE_OPENCL || ENABLE_CUDA
270 bool isOcl = oc && (DEVICE_COUNT > 0);
271 bool isOclMulti = oc && md && (DEVICE_COUNT > 1);
274 bool isOclMulti =
false;
278 std::vector<QInterfaceEngine> simulatorType;
286 if (pg && isOcl && !hy) {
311 std::reverse(simulatorType.begin(), simulatorType.end());
315 template <
typename... Ts>
GLOSSARY: bitLenInt - "bit-length integer" - unsigned integer ID of qubit position in register bitCap...
Definition: complex16x2simd.hpp:25
QInterfaceEngine
Enumerated list of supported engines.
Definition: qinterface.hpp:37
@ QINTERFACE_QPAGER
Create a QPager, which breaks up the work of a QEngine into equally sized "pages.".
Definition: qinterface.hpp:82
@ QINTERFACE_CUDA
Create a QEngineCUDA, leveraging CUDA hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:52
@ QINTERFACE_STABILIZER_HYBRID
Create a QStabilizerHybrid, switching between a QStabilizer and a QHybrid as efficient.
Definition: qinterface.hpp:77
@ QINTERFACE_HYBRID
Create a QHybrid, switching between QEngineCPU and QEngineOCL as efficient.
Definition: qinterface.hpp:57
@ QINTERFACE_BDT_HYBRID
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:67
@ QINTERFACE_BDT
Create a QBinaryDecisionTree, (CPU-based).
Definition: qinterface.hpp:62
@ QINTERFACE_TENSOR_NETWORK
Circuit-simplification layer.
Definition: qinterface.hpp:107
@ QINTERFACE_NOISY
Noisy wrapper layer.
Definition: qinterface.hpp:112
@ QINTERFACE_QUNIT_CLIFFORD
Clifford-specialized QUnit.
Definition: qinterface.hpp:102
@ QINTERFACE_OPENCL
Create a QEngineOCL, leveraging OpenCL hardware to increase the speed of certain calculations.
Definition: qinterface.hpp:47
@ QINTERFACE_STABILIZER
Create a QStabilizer, limited to Clifford/Pauli operations, but efficient.
Definition: qinterface.hpp:72
@ QINTERFACE_QUNIT
Create a QUnit, which utilizes other QInterface classes to minimize the amount of work that's needed ...
Definition: qinterface.hpp:91
@ QINTERFACE_QUNIT_MULTI
Create a QUnitMulti, which distributes the explicitly separated "shards" of a QUnit across available ...
Definition: qinterface.hpp:97
@ QINTERFACE_CPU
Create a QEngineCPU leveraging only local CPU and memory resources.
Definition: qinterface.hpp:42
std::shared_ptr< QInterface > QInterfacePtr
Definition: qinterface.hpp:29
QInterfacePtr CreateQuantumInterface(QInterfaceEngine engine1, QInterfaceEngine engine2, QInterfaceEngine engine3, Ts... args)
Factory method to create specific engine implementations.
Definition: qfactory.hpp:49
QInterfacePtr CreateArrangedLayers(bool md, bool sd, bool sh, bool bdt, bool pg, bool tn, bool hy, bool oc, Ts... args)
Definition: qfactory.hpp:316
QInterfacePtr CreateArrangedLayersFull(bool nw, bool md, bool sd, bool sh, bool bdt, bool pg, bool tn, bool hy, bool oc, Ts... args)
Definition: qfactory.hpp:266
void reverse(BidirectionalIterator first, BidirectionalIterator last, const bitCapInt &stride)