Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Maestro.h
Go to the documentation of this file.
1
8
9#pragma once
10
11#ifdef COMPOSER
12#include "../../composer/composer/Network/SimpleFullyConnectedNetwork.h"
13#else
15#endif
16
18
19class Maestro {
20public:
21 Maestro() = default;
22 ~Maestro() = default;
23
24 // Add methods to expose functionality to Maestro here.
25 // For example, methods to create circuits, simulators, run simulations, etc.
26 unsigned long int CreateSimpleSimulator(int nrQubits) {
27 if (nrQubits <= 0)
28 return 0;
29
30 const std::vector<Types::qubit_t> qubits{
31 static_cast<Types::qubit_t>(nrQubits)};
32 const std::vector<size_t> cbits{static_cast<size_t>(nrQubits)};
33
34#ifdef COMPOSER
35 auto network = std::make_shared<Network::SimpleNetwork<>>(qubits, cbits);
36#else
37 auto network =
38 std::make_shared<Network::SimpleDisconnectedNetwork<>>(qubits, cbits);
39#endif
40
41 // lock the mutex to safely add the simulator
42 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
43
44 if (curHandle == std::numeric_limits<unsigned long int>::max()) {
45 // Handle overflow, reset to 0
46 curHandle = 0;
47 }
48 const unsigned long int handle = ++curHandle;
49
50 simpleSimulators[handle] = network;
51
52 return handle;
53 }
54
55 void DestroySimpleSimulator(unsigned long int simHandle) {
56 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
57
58 simpleSimulators.erase(simHandle);
59 }
60
61 std::shared_ptr<Network::INetwork<>>
62 GetSimpleSimulator(unsigned long int simHandle) {
63 std::lock_guard<std::mutex> lock(simpleSimulatorsMutex);
64 auto it = simpleSimulators.find(simHandle);
65 if (it != simpleSimulators.end())
66 return it->second;
67
68 return nullptr;
69 }
70
72 unsigned long int simHandle, Simulators::SimulatorType simType,
73 Simulators::SimulationType simExecType) {
74 auto sim = GetSimpleSimulator(simHandle);
75 if (!sim)
76 return 0;
77
78 sim->RemoveAllOptimizationSimulatorsAndAdd(simType, simExecType);
79
80 return 1;
81 }
82
83 int AddOptimizationSimulator(unsigned long int simHandle,
85 Simulators::SimulationType simExecType) {
86 auto sim = GetSimpleSimulator(simHandle);
87 if (!sim)
88 return 0;
89 sim->AddOptimizationSimulator(simType, simExecType);
90 return 1;
91 }
92
93 unsigned long int CreateSimulator(
95 Simulators::SimulationType simExecType =
97 auto simulator =
99
100 std::lock_guard<std::mutex> lock(simulatorsMutex);
101 if (curSimulatorHandle == std::numeric_limits<unsigned long int>::max()) {
102 // Handle overflow, reset to 0
103 curSimulatorHandle = 0;
104 }
105 const unsigned long int handle = ++curSimulatorHandle;
106
107 simulators[handle] = simulator;
108
109 return handle;
110 }
111
112 void *GetSimulator(unsigned long int simHandle) {
113 std::lock_guard<std::mutex> lock(simulatorsMutex);
114 auto it = simulators.find(simHandle);
115 if (it != simulators.end())
116 return it->second.get();
117
118 return nullptr;
119 }
120
121 void DestroySimulator(unsigned long int simHandle) {
122 std::lock_guard<std::mutex> lock(simulatorsMutex);
123 simulators.erase(simHandle);
124 }
125
126private:
127 // allow multithreaded access
128 std::mutex simpleSimulatorsMutex;
129 std::mutex simulatorsMutex;
130
131 std::unordered_map<unsigned long int, std::shared_ptr<Network::INetwork<>>>
132 simpleSimulators; // map for network simulators
133 std::unordered_map<unsigned long int, std::shared_ptr<Simulators::ISimulator>>
134 simulators; // map for simulators
135
136 unsigned long int curHandle = 0;
137 unsigned long int curSimulatorHandle = 0; // current handle for simulators
138};
Maestro()=default
int RemoveAllOptimizationSimulatorsAndAdd(unsigned long int simHandle, Simulators::SimulatorType simType, Simulators::SimulationType simExecType)
Definition Maestro.h:71
unsigned long int CreateSimulator(Simulators::SimulatorType simType=Simulators::SimulatorType::kQCSim, Simulators::SimulationType simExecType=Simulators::SimulationType::kMatrixProductState)
Definition Maestro.h:93
void DestroySimulator(unsigned long int simHandle)
Definition Maestro.h:121
int AddOptimizationSimulator(unsigned long int simHandle, Simulators::SimulatorType simType, Simulators::SimulationType simExecType)
Definition Maestro.h:83
void DestroySimpleSimulator(unsigned long int simHandle)
Definition Maestro.h:55
std::shared_ptr< Network::INetwork<> > GetSimpleSimulator(unsigned long int simHandle)
Definition Maestro.h:62
unsigned long int CreateSimpleSimulator(int nrQubits)
Definition Maestro.h:26
~Maestro()=default
void * GetSimulator(unsigned long int simHandle)
Definition Maestro.h:112
static std::shared_ptr< ISimulator > CreateSimulator(SimulatorType t=SimulatorType::kQCSim, SimulationType method=SimulationType::kMatrixProductState)
Create a quantum computing simulator.
Definition Factory.cpp:78
SimulationType
The type of simulation.
Definition State.h:82
@ kMatrixProductState
matrix product state simulation type
Definition State.h:84
SimulatorType
The type of simulator.
Definition State.h:63
@ kQCSim
qcsim simulator type
Definition State.h:67
uint_fast64_t qubit_t
The type of a qubit.
Definition Types.h:20