Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Remapper.h
Go to the documentation of this file.
1
15#pragma once
16
17#ifndef _REMAPPER_H_
18#define _REMAPPER_H_
19
20#include "../Circuit/Circuit.h"
21#include "../Circuit/Operations.h"
22#include "../Circuit/Reset.h"
23#include "../Network/Network.h"
24
25namespace Distribution {
26
37
46template <typename Time = Types::time_type>
47class IRemapper : public std::enable_shared_from_this<IRemapper<Time>> {
48 public:
55 virtual ~IRemapper() = default;
56
67 virtual std::shared_ptr<Circuits::Circuit<Time>> Remap(
68 const std::shared_ptr<Network::INetwork<Time>> &network,
69 const std::shared_ptr<Circuits::Circuit<Time>> &circuit) = 0;
70
80 virtual unsigned int GetNumberOfOperationsForDistribution() const = 0;
81
89 virtual unsigned int GetNumberOfDistributions() const = 0;
90
98 std::shared_ptr<IRemapper<Time>> getptr() {
99 return std::enable_shared_from_this<IRemapper<Time>>::shared_from_this();
100 }
101
109 virtual RemapperType GetType() const = 0;
110
124 const std::shared_ptr<Circuits::IOperation<Time>> &op,
125 const std::shared_ptr<Network::INetwork<Time>> &network) {
126 if (op->NeedsEntanglementForDistribution()) {
127 auto qubits = op->AffectedQubits();
128
129 if (qubits.size() >=
130 2) // there should be no 3 qubit gates at this point, though
131 {
132 const size_t ctrlQubit = qubits[0];
133 const size_t targetQubit = qubits[1];
134
135 if (!network->AreQubitsOnSameHost(ctrlQubit, targetQubit)) return true;
136 }
137 }
138
139 return false;
140 }
141
159 virtual std::shared_ptr<Circuits::Circuit<Time>> SplitCompositeOperations(
160 const std::shared_ptr<Network::INetwork<Time>> &network,
161 const std::shared_ptr<Circuits::Circuit<Time>> &distCirc) const {
162 // Measurement, RandomGen, ConditionalMeasurement, ConditionalRandomGen,
163 // Reset... might involve qubits/classical bits that are on different hosts
164 // - split them so they could be executed in any order independently on top
165 // of that, conditional gates might need classical bits from different
166 // hosts, handle that as well in the future such classical bits transfers
167 // might be simulated using 'resources' involving queues or something like
168 // that to simulate the classical network
169
170 std::shared_ptr<Circuits::Circuit<Time>> newDistributedCircuit =
171 std::make_shared<Circuits::Circuit<Time>>();
172
173 for (const auto &op : distCirc->GetOperations()) {
174 // the measurement, conditional measurement and reset are split based on
175 // the qubits they operate on the others based on the classical bits
176 // involved
177
178 switch (op->GetType()) {
180 std::unordered_map<size_t,
181 std::vector<std::pair<Types::qubit_t, size_t>>>
182 bits;
183 const auto qbits = op->AffectedQubits();
184 const auto cbits = op->AffectedBits();
185
186 for (size_t q = 0; q < qbits.size(); ++q) {
187 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
188 bits[host].push_back({qbits[q], cbits[q]});
189 }
190
191 for (const auto &hostQubits : bits)
192 newDistributedCircuit->AddOperation(
193 std::make_shared<Circuits::MeasurementOperation<Time>>(
194 hostQubits.second));
195 } break;
197 std::unordered_map<size_t,
198 std::vector<std::pair<Types::qubit_t, size_t>>>
199 bits;
200 auto condOp =
201 std::static_pointer_cast<Circuits::ConditionalMeasurement<Time>>(
202 op);
203
204 const auto qbits = condOp->GetOperation()->AffectedQubits();
205 const auto cbits = condOp->GetOperation()->AffectedBits();
206
207 for (size_t q = 0; q < qbits.size(); ++q) {
208 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
209 bits[host].push_back({qbits[q], cbits[q]});
210 }
211
212 for (const auto &hostQubits : bits) {
213 auto measOp =
214 std::make_shared<Circuits::MeasurementOperation<Time>>(
215 hostQubits.second);
216 newDistributedCircuit->AddOperation(
218 measOp,
219 condOp->GetCondition())); // condition stays the same
220 }
221 } break;
223 std::unordered_map<size_t, Types::qubits_vector> bits;
224 const auto qbits = op->AffectedQubits();
225
226 for (const auto q : qbits) {
227 const size_t host = network->GetHostIdForAnyQubit(q);
228 bits[host].emplace_back(q);
229 }
230
231 for (const auto &hostQubits : bits)
232 newDistributedCircuit->AddOperation(
233 std::make_shared<Circuits::Reset<Time>>(hostQubits.second));
234 } break;
236 std::unordered_map<size_t, std::vector<size_t>> bits;
237 const std::vector<size_t> cbits = op->AffectedBits();
238
239 for (const size_t c : cbits) {
240 const size_t host = network->GetHostIdForClassicalBit(c);
241 bits[host].emplace_back(c);
242 }
243
244 for (const auto &hostQubits : bits)
245 newDistributedCircuit->AddOperation(
246 std::make_shared<Circuits::Random<Time>>(hostQubits.second));
247 } break;
249 std::unordered_map<size_t, std::vector<size_t>> bits;
250 // split by operation (as in random gen), not by condition, that
251 // should stay whole and be dealt with accordingly if classical
252 // network simulation details are to be done
253 auto condOp =
254 std::static_pointer_cast<Circuits::ConditionalRandomGen<Time>>(
255 op);
256 const std::vector<size_t> cbits =
257 condOp->GetOperation()->AffectedBits();
258
259 for (const size_t c : cbits) {
260 const size_t host = network->GetHostIdForClassicalBit(c);
261 bits[host].emplace_back(c);
262 }
263
264 for (const auto &hostQubits : bits) {
265 auto randomOp =
266 std::make_shared<Circuits::Random<Time>>(hostQubits.second);
267 newDistributedCircuit->AddOperation(
268 std::make_shared<Circuits::ConditionalRandomGen<Time>>(
269 randomOp,
270 condOp->GetCondition())); // condition stays the same
271 }
272 } break;
273 default:
274 newDistributedCircuit->AddOperation(op);
275 break;
276 }
277 }
278
279 return newDistributedCircuit;
280 }
281};
282
283} // namespace Distribution
284
285#endif // !_REMAPPER_H_
Circuit class for holding the sequence of operations.
Definition Circuit.h:45
A conditional measurement.
A conditional random generator.
The operation interface.
Definition Operations.h:357
Measurement operation class.
Random operation.
Definition RandomOp.h:33
Reset operation class.
Definition Reset.h:32
Remapper abstract class.
Definition Remapper.h:47
virtual ~IRemapper()=default
Default virtual destructor.
static bool IsNonLocalOperation(const std::shared_ptr< Circuits::IOperation< Time > > &op, const std::shared_ptr< Network::INetwork< Time > > &network)
Checks if an operation is non local.
Definition Remapper.h:123
std::shared_ptr< IRemapper< Time > > getptr()
Get a shared pointer to this object.
Definition Remapper.h:98
virtual unsigned int GetNumberOfDistributions() const =0
Get the number of distribution circuits for the last remapped circuit.
virtual std::shared_ptr< Circuits::Circuit< Time > > Remap(const std::shared_ptr< Network::INetwork< Time > > &network, const std::shared_ptr< Circuits::Circuit< Time > > &circuit)=0
Remap the circuit.
virtual unsigned int GetNumberOfOperationsForDistribution() const =0
Get the number of operations for distribution.
virtual RemapperType GetType() const =0
Returns the type of the remapper.
virtual std::shared_ptr< Circuits::Circuit< Time > > SplitCompositeOperations(const std::shared_ptr< Network::INetwork< Time > > &network, const std::shared_ptr< Circuits::Circuit< Time > > &distCirc) const
Split composite operations.
Definition Remapper.h:159
The network interface.
Definition Network.h:56
@ kRandomGen
random classical bit generator, result in 'OperationState'
@ kConditionalRandomGen
conditional random generator, similar with random gen, but conditioned on something from 'OperationSt...
@ kConditionalMeasurement
conditional measurement, similar with measurement, but conditioned on something from 'OperationState'
@ kMeasurement
measurement, result in 'OperationState'
@ kReset
reset, no result in 'state', just apply measurement, then apply not on all qubits that were measured ...
RemapperType
The type of remapper to use.
Definition Remapper.h:31
@ kLayersRemapper
Remapper that uses intermediate layers for conversion.
@ kGreedyDirectRemapper
Remapper that uses a greedy algorithm for conversion, avoiding conversion to intermediate layers.