Maestro 0.2.11
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Factory.cpp
Go to the documentation of this file.
1
15
16#define _CRT_SECURE_NO_WARNINGS 1
17
18#ifndef NO_QISKIT_AER
19#ifndef __APPLE__
20#ifndef _QV_AVX2_IMPL
21#define _QV_AVX2_IMPL
22#pragma warning(push)
23#pragma warning(disable : 4789)
24#include "simulators/statevector/qv_avx2.cpp"
25#pragma warning(pop)
26#endif
27#endif
28#endif
29
30#include "Factory.h"
31
32#define INCLUDED_BY_FACTORY
33#ifndef NO_QISKIT_AER
34#include "AerSimulator.h"
35#endif
36#include "QCSimSimulator.h"
37#include "Composite.h"
38#include "GpuSimulator.h"
39#include "QuestSimulator.h"
40
41namespace Simulators {
42
43#ifdef __linux__
44std::shared_ptr<GpuLibrary> SimulatorsFactory::gpuLibrary = nullptr;
45std::atomic_bool SimulatorsFactory::firstTime = true;
46
48 if (!gpuLibrary) {
49 gpuLibrary = std::make_shared<GpuLibrary>();
50 if (!firstTime.exchange(false)) gpuLibrary->SetMute(true);
51
52 if (gpuLibrary->Init("libmaestro_gpu_simulators.so"))
53 return true;
54 else
55 gpuLibrary = nullptr;
56 }
57
58 return false;
59}
60
61bool SimulatorsFactory::InitGpuLibraryWithMute() {
62 if (!gpuLibrary) {
63 gpuLibrary = std::make_shared<GpuLibrary>();
64 firstTime = false;
65 gpuLibrary->SetMute(true);
66
67 if (gpuLibrary->Init("libmaestro_gpu_simulators.so"))
68 return true;
69 else
70 gpuLibrary = nullptr;
71 }
72
73 return false;
74}
75
76#endif
77
78std::shared_ptr<QuestLibSim> SimulatorsFactory::questLibrary = nullptr;
79std::atomic_bool SimulatorsFactory::firstTimeQuest = true;
80
82 if (!questLibrary) {
83 questLibrary = std::make_shared<QuestLibSim>();
84 if (!firstTimeQuest.exchange(false)) questLibrary->SetMute(true);
85 if (questLibrary->Init(
86#ifdef _WIN32
87 "maestroquest.dll"
88#elif defined(__APPLE__)
89 "libmaestroquest.dylib"
90#else
91 "libmaestroquest.so"
92#endif
93 ))
94 return true;
95 else
96 questLibrary = nullptr;
97 }
98 return false;
99}
100
101std::shared_ptr<ISimulator> SimulatorsFactory::CreateSimulator(
103 switch (t) {
105 auto sim = std::make_shared<Private::QCSimSimulator>();
107 sim->Configure("method", "matrix_product_state");
108 else if (m == SimulationType::kStabilizer)
109 sim->Configure("method", "stabilizer");
110 else if (m == SimulationType::kTensorNetwork)
111 sim->Configure("method", "tensor_network");
113 sim->Configure("method", "pauli_propagator");
114 else if (m == SimulationType::kPathIntegral)
115 sim->Configure("method", "path_integral");
116 else if (m != SimulationType::kStatevector)
117 throw std::invalid_argument("Simulation Type not supported for QCSim");
118
119 return sim;
120 }
121#ifndef NO_QISKIT_AER
123 auto sim = std::make_shared<Private::AerSimulator>();
125 sim->Configure("method", "matrix_product_state");
126 else if (m == SimulationType::kStabilizer)
127 sim->Configure("method", "stabilizer");
128 else if (m == SimulationType::kTensorNetwork)
129 sim->Configure("method", "tensor_network");
131 sim->Configure("method", "extended_stabilizer");
132 else if (m == SimulationType::kStatevector)
133 sim->Configure("method", "statevector");
134 else
135 throw std::invalid_argument(
136 "Simulation Type not supported for Qiskit Aer");
137
138 return sim;
139 }
141 return std::make_shared<Private::CompositeSimulator>(
143#endif
145 return std::make_shared<Private::CompositeSimulator>(
147#ifdef __linux__
149 if (gpuLibrary && gpuLibrary->IsValid() &&
154 auto sim = std::make_shared<Private::GpuSimulator>();
156 sim->Configure("method", "matrix_product_state");
157 else if (m == SimulationType::kTensorNetwork)
158 sim->Configure("method", "tensor_network");
160 sim->Configure("method", "pauli_propagator");
161 else if (m == SimulationType::kStatevector)
162 sim->Configure("method", "statevector");
163
164 return sim;
165 }
166
167 return nullptr;
168#endif
171 throw std::invalid_argument(
172 "Simulation Type not supported for Quest Simulator");
173 else if (questLibrary && questLibrary->IsValid()) {
174 return std::make_shared<Private::QuestSimulator>();
175 }
176 return nullptr;
177 default:
178 break;
179 }
180
181 throw std::invalid_argument("Simulator Type not supported");
182
183 return nullptr; // keep compillers happy
184}
185
188 switch (t) {
190 auto sim = std::make_unique<Private::QCSimSimulator>();
192 sim->Configure("method", "matrix_product_state");
193 else if (m == SimulationType::kStabilizer)
194 sim->Configure("method", "stabilizer");
195 else if (m == SimulationType::kTensorNetwork)
196 sim->Configure("method", "tensor_network");
198 sim->Configure("method", "pauli_propagator");
199 else if (m == SimulationType::kPathIntegral)
200 sim->Configure("method", "path_integral");
201 else if (m != SimulationType::kStatevector)
202 throw std::invalid_argument("Simulation Type not supported for QCSim");
203
204 return sim;
205 }
206#ifndef NO_QISKIT_AER
208 auto sim = std::make_unique<Private::AerSimulator>();
210 sim->Configure("method", "matrix_product_state");
211 else if (m == SimulationType::kStabilizer)
212 sim->Configure("method", "stabilizer");
213 else if (m == SimulationType::kTensorNetwork)
214 sim->Configure("method", "tensor_network");
216 sim->Configure("method", "extended_stabilizer");
217 else if (m == SimulationType::kStatevector)
218 sim->Configure("method", "statevector");
219 else
220 throw std::invalid_argument(
221 "Simulation Type not supported for Qiskit Aer");
222
223 return sim;
224 }
226 return std::make_unique<Private::CompositeSimulator>(
228#endif
230 return std::make_unique<Private::CompositeSimulator>(
232#ifdef __linux__
234 if (gpuLibrary && gpuLibrary->IsValid() &&
239 auto sim = std::make_unique<Private::GpuSimulator>();
241 sim->Configure("method", "matrix_product_state");
242 else if (m == SimulationType::kTensorNetwork)
243 sim->Configure("method", "tensor_network");
245 sim->Configure("method", "pauli_propagator");
246 else if (m == SimulationType::kStatevector)
247 sim->Configure("method", "statevector");
248
249 return sim;
250 }
251
252 return nullptr;
253#endif
256 throw std::invalid_argument(
257 "Simulation Type not supported for Quest Simulator");
258 else if (questLibrary && questLibrary->IsValid()) {
259 return std::make_unique<Private::QuestSimulator>();
260 }
261 return nullptr;
262 default:
263 break;
264 }
265
266 throw std::invalid_argument("Simulator Type not supported");
267
268 return nullptr; // keep compillers happy
269}
270} // namespace Simulators
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:101
static bool InitQuestLibrary()
Definition Factory.cpp:81
static std::unique_ptr< ISimulator > CreateSimulatorUnique(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:186
SimulationType
The type of simulation.
Definition State.h:85
@ kExtendedStabilizer
Extended stabilizer simulation type.
Definition State.h:91
@ kStatevector
statevector simulation type
Definition State.h:86
@ kMatrixProductState
matrix product state simulation type
Definition State.h:87
@ kStabilizer
Clifford gates simulation type.
Definition State.h:88
@ kPauliPropagator
Pauli propagator simulation type.
Definition State.h:90
@ kTensorNetwork
Tensor network simulation type.
Definition State.h:89
@ kPathIntegral
Path integral simulation type.
Definition State.h:92
SimulatorType
The type of simulator.
Definition State.h:68
@ kCompositeQCSim
composite qcsim simulator type
Definition State.h:76
@ kQCSim
qcsim simulator type
Definition State.h:72
@ kQiskitAer
qiskit aer simulator type
Definition State.h:70
@ kQuestSim
quest simulator type
Definition State.h:78
@ kCompositeQiskitAer
composite qiskit aer simulator type
Definition State.h:74
@ kGpuSim
gpu simulator type
Definition State.h:77