Maestro 0.1.0
Unified interface for quantum circuit simulation
Loading...
Searching...
No Matches
Remapper.h
Go to the documentation of this file.
1
14
15#pragma once
16
17#ifndef _REMAPPER_H_
18#define _REMAPPER_H_
19
20#include "../Circuit/Circuit.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>> {
48public:
55 virtual ~IRemapper() = default;
56
67 virtual std::shared_ptr<Circuits::Circuit<Time>>
68 Remap(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
123 static bool
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))
136 return true;
137 }
138 }
139
140 return false;
141 }
142
160 virtual std::shared_ptr<Circuits::Circuit<Time>> SplitCompositeOperations(
161 const std::shared_ptr<Network::INetwork<Time>> &network,
162 const std::shared_ptr<Circuits::Circuit<Time>> &distCirc) const {
163 // Measurement, RandomGen, ConditionalMeasurement, ConditionalRandomGen,
164 // Reset... might involve qubits/classical bits that are on different hosts
165 // - split them so they could be executed in any order independently on top
166 // of that, conditional gates might need classical bits from different
167 // hosts, handle that as well in the future such classical bits transfers
168 // might be simulated using 'resources' involving queues or something like
169 // that to simulate the classical network
170
171 std::shared_ptr<Circuits::Circuit<Time>> newDistributedCircuit =
172 std::make_shared<Circuits::Circuit<Time>>();
173
174 for (const auto &op : distCirc->GetOperations()) {
175 // the measurement, conditional measurement and reset are split based on
176 // the qubits they operate on the others based on the classical bits
177 // involved
178
179 switch (op->GetType()) {
181 std::unordered_map<size_t,
182 std::vector<std::pair<Types::qubit_t, size_t>>>
183 bits;
184 const auto qbits = op->AffectedQubits();
185 const auto cbits = op->AffectedBits();
186
187 for (size_t q = 0; q < qbits.size(); ++q) {
188 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
189 bits[host].push_back({qbits[q], cbits[q]});
190 }
191
192 for (const auto &hostQubits : bits)
193 newDistributedCircuit->AddOperation(
194 std::make_shared<Circuits::MeasurementOperation<Time>>(
195 hostQubits.second));
196 } break;
198 std::unordered_map<size_t,
199 std::vector<std::pair<Types::qubit_t, size_t>>>
200 bits;
201 auto condOp =
202 std::static_pointer_cast<Circuits::ConditionalMeasurement<Time>>(
203 op);
204
205 const auto qbits = condOp->GetOperation()->AffectedQubits();
206 const auto cbits = condOp->GetOperation()->AffectedBits();
207
208 for (size_t q = 0; q < qbits.size(); ++q) {
209 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
210 bits[host].push_back({qbits[q], cbits[q]});
211 }
212
213 for (const auto &hostQubits : bits) {
214 auto measOp = std::make_shared<Circuits::MeasurementOperation<Time>>(
215 hostQubits.second);
216 newDistributedCircuit->AddOperation(
218 measOp, condOp->GetCondition())); // condition stays the same
219 }
220 } break;
222 std::unordered_map<size_t, Types::qubits_vector> bits;
223 const auto qbits = op->AffectedQubits();
224
225 for (const auto q : qbits) {
226 const size_t host = network->GetHostIdForAnyQubit(q);
227 bits[host].emplace_back(q);
228 }
229
230 for (const auto &hostQubits : bits)
231 newDistributedCircuit->AddOperation(
232 std::make_shared<Circuits::Reset<Time>>(hostQubits.second));
233 } break;
235 std::unordered_map<size_t, std::vector<size_t>> bits;
236 const std::vector<size_t> cbits = op->AffectedBits();
237
238 for (const size_t c : cbits) {
239 const size_t host = network->GetHostIdForClassicalBit(c);
240 bits[host].emplace_back(c);
241 }
242
243 for (const auto &hostQubits : bits)
244 newDistributedCircuit->AddOperation(
245 std::make_shared<Circuits::Random<Time>>(hostQubits.second));
246 } break;
248 std::unordered_map<size_t, std::vector<size_t>> bits;
249 // split by operation (as in random gen), not by condition, that should
250 // stay whole and be dealt with accordingly if classical network
251 // simulation details are to be done
252 auto condOp =
253 std::static_pointer_cast<Circuits::ConditionalRandomGen<Time>>(op);
254 const std::vector<size_t> cbits =
255 condOp->GetOperation()->AffectedBits();
256
257 for (const size_t c : cbits) {
258 const size_t host = network->GetHostIdForClassicalBit(c);
259 bits[host].emplace_back(c);
260 }
261
262 for (const auto &hostQubits : bits) {
263 auto randomOp =
264 std::make_shared<Circuits::Random<Time>>(hostQubits.second);
265 newDistributedCircuit->AddOperation(
266 std::make_shared<Circuits::ConditionalRandomGen<Time>>(
267 randomOp,
268 condOp->GetCondition())); // condition stays the same
269 }
270 } break;
271 default:
272 newDistributedCircuit->AddOperation(op);
273 break;
274 }
275 }
276
277 return newDistributedCircuit;
278 }
279};
280
281} // namespace Distribution
282
283#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:361
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:124
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:160
The network interface.
Definition Network.h:56
@ kRandomGen
random classical bit generator, result in 'OperationState'
Definition Operations.h:29
@ kConditionalRandomGen
conditional random generator, similar with random gen, but conditioned on something from 'OperationSt...
Definition Operations.h:35
@ kConditionalMeasurement
conditional measurement, similar with measurement, but conditioned on something from 'OperationState'
Definition Operations.h:32
@ kMeasurement
measurement, result in 'OperationState'
Definition Operations.h:28
@ kReset
reset, no result in 'state', just apply measurement, then apply not on all qubits that were measured ...
Definition Operations.h:38
RemapperType
The type of remapper to use.
Definition Remapper.h:31
@ kLayersRemapper
Remapper that uses intermediate layers for conversion.
Definition Remapper.h:32
@ kGreedyDirectRemapper
Remapper that uses a greedy algorithm for conversion, avoiding conversion to intermediate layers.
Definition Remapper.h:33