25 #include "common/cudaengine.cuh"
29 #if ENABLE_OPENCL || ENABLE_CUDA
46 template <
typename... Ts>
51 std::vector<QInterfaceEngine> engines{ engine2, engine3 };
55 return std::make_shared<QStabilizer>(args...);
57 return std::make_shared<QUnitClifford>(args...);
60 return std::make_shared<QBdt>(engines, args...);
62 return std::make_shared<QBdtHybrid>(engines, args...);
65 return std::make_shared<QPager>(engines, args...);
67 return std::make_shared<QStabilizerHybrid>(engines, args...);
69 return std::make_shared<QUnit>(engines, args...);
71 return std::make_shared<QTensorNetwork>(engines, args...);
74 return std::make_shared<QEngineOCL>(args...);
78 return std::make_shared<QEngineCUDA>(args...);
80 #if ENABLE_OPENCL || ENABLE_CUDA
82 return std::make_shared<QHybrid>(args...);
84 return std::make_shared<QUnitMulti>(engines, args...);
87 return std::make_shared<QEngineCPU>(args...);
89 return std::make_shared<QInterfaceNoisy>(engines, args...);
91 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
95 template <
typename... Ts>
99 std::vector<QInterfaceEngine> engines{ engine2 };
103 return std::make_shared<QStabilizer>(args...);
105 return std::make_shared<QUnitClifford>(args...);
108 return std::make_shared<QBdt>(engines, args...);
110 return std::make_shared<QBdtHybrid>(engines, args...);
113 return std::make_shared<QPager>(engines, args...);
115 return std::make_shared<QStabilizerHybrid>(engines, args...);
117 return std::make_shared<QUnit>(engines, args...);
119 return std::make_shared<QTensorNetwork>(engines, args...);
122 return std::make_shared<QEngineOCL>(args...);
126 return std::make_shared<QEngineCUDA>(args...);
128 #if ENABLE_OPENCL || ENABLE_CUDA
130 return std::make_shared<QHybrid>(args...);
132 return std::make_shared<QUnitMulti>(engines, args...);
135 return std::make_shared<QEngineCPU>(args...);
137 return std::make_shared<QInterfaceNoisy>(engines, args...);
139 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
147 return std::make_shared<QStabilizer>(args...);
149 return std::make_shared<QUnitClifford>(args...);
152 return std::make_shared<QBdt>(args...);
154 return std::make_shared<QBdtHybrid>(args...);
157 return std::make_shared<QPager>(args...);
159 return std::make_shared<QStabilizerHybrid>(args...);
161 return std::make_shared<QUnit>(args...);
163 return std::make_shared<QTensorNetwork>(args...);
166 return std::make_shared<QEngineOCL>(args...);
170 return std::make_shared<QEngineCUDA>(args...);
172 #if ENABLE_OPENCL || ENABLE_CUDA
174 return std::make_shared<QHybrid>(args...);
176 return std::make_shared<QUnitMulti>(args...);
179 return std::make_shared<QEngineCPU>(args...);
181 return std::make_shared<QInterfaceNoisy>(args...);
183 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
190 engines.erase(engines.begin());
194 return std::make_shared<QStabilizer>(args...);
196 return std::make_shared<QUnitClifford>(args...);
199 if (engines.size()) {
200 return std::make_shared<QBdt>(engines, args...);
202 return std::make_shared<QBdt>(args...);
204 if (engines.size()) {
205 return std::make_shared<QBdtHybrid>(engines, args...);
207 return std::make_shared<QBdtHybrid>(args...);
210 if (engines.size()) {
211 return std::make_shared<QPager>(engines, args...);
213 return std::make_shared<QPager>(args...);
215 if (engines.size()) {
216 return std::make_shared<QStabilizerHybrid>(engines, args...);
218 return std::make_shared<QStabilizerHybrid>(args...);
220 if (engines.size()) {
221 return std::make_shared<QUnit>(engines, args...);
223 return std::make_shared<QUnit>(args...);
225 if (engines.size()) {
226 return std::make_shared<QTensorNetwork>(engines, args...);
228 return std::make_shared<QTensorNetwork>(args...);
231 return std::make_shared<QEngineOCL>(args...);
235 return std::make_shared<QEngineCUDA>(args...);
237 #if ENABLE_OPENCL || ENABLE_CUDA
239 return std::make_shared<QHybrid>(args...);
241 if (engines.size()) {
242 return std::make_shared<QUnitMulti>(engines, args...);
244 return std::make_shared<QUnitMulti>(args...);
247 return std::make_shared<QEngineCPU>(args...);
249 return std::make_shared<QInterfaceNoisy>(engines, args...);
251 throw std::invalid_argument(
"CreateQuantumInterface received a request to create a nonexistent type instance!");
256 #define DEVICE_COUNT (OCLEngine::Instance().GetDeviceCount())
258 #define DEVICE_COUNT (CUDAEngine::Instance().GetDeviceCount())
260 template <
typename... Ts>
262 bool nw,
bool md,
bool sd,
bool sh,
bool bdt,
bool pg,
bool tn,
bool hy,
bool oc, Ts... args)
264 #if ENABLE_OPENCL || ENABLE_CUDA
265 bool isOcl = oc && (DEVICE_COUNT > 0);
266 bool isOclMulti = oc && md && (DEVICE_COUNT > 1);
269 bool isOclMulti =
false;
273 std::vector<QInterfaceEngine> simulatorType;
281 if (pg && isOcl && !hy) {
306 std::reverse(simulatorType.begin(), simulatorType.end());
310 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:47
QInterfacePtr CreateArrangedLayers(bool md, bool sd, bool sh, bool bdt, bool pg, bool tn, bool hy, bool oc, Ts... args)
Definition: qfactory.hpp:311
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:261
void reverse(BidirectionalIterator first, BidirectionalIterator last, const bitCapInt &stride)