172 std::shared_ptr<Circuits::Circuit<Time>> newDistributedCircuit = std::make_shared<Circuits::Circuit<Time>>();
174 for (
const auto &op : distCirc->GetOperations())
180 switch (op->GetType())
183 std::unordered_map<size_t, std::vector<std::pair<Types::qubit_t, size_t>>> bits;
184 const auto qbits = op->AffectedQubits();
185 const auto cbits = op->AffectedBits();
186 const auto measurement = std::static_pointer_cast<Circuits::MeasurementOperation<Time>>(op);
187 std::unordered_map<size_t, std::vector<Circuits::ReadoutRates>> rates;
189 for (
size_t q = 0; q < qbits.size(); ++q)
191 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
192 bits[host].push_back({qbits[q], cbits[q]});
193 if (measurement->HasReadout())
194 rates[host].push_back(measurement->GetReadout()[q]);
197 for (
const auto &hostQubits : bits)
199 auto split = std::make_shared<Circuits::MeasurementOperation<Time>>(hostQubits.second);
200 if (measurement->HasReadout())
201 split->SetReadout(std::move(rates[hostQubits.first]));
202 newDistributedCircuit->AddOperation(split);
207 std::unordered_map<size_t, std::vector<std::pair<Types::qubit_t, size_t>>> bits;
208 auto condOp = std::static_pointer_cast<Circuits::ConditionalMeasurement<Time>>(op);
210 const auto qbits = condOp->GetOperation()->AffectedQubits();
211 const auto cbits = condOp->GetOperation()->AffectedBits();
212 const auto measurement = std::static_pointer_cast<Circuits::MeasurementOperation<Time>>(condOp->GetOperation());
213 std::unordered_map<size_t, std::vector<Circuits::ReadoutRates>> rates;
215 for (
size_t q = 0; q < qbits.size(); ++q)
217 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
218 bits[host].push_back({qbits[q], cbits[q]});
219 if (measurement->HasReadout())
220 rates[host].push_back(measurement->GetReadout()[q]);
223 for (
const auto &hostQubits : bits)
225 auto measOp = std::make_shared<Circuits::MeasurementOperation<Time>>(hostQubits.second);
226 if (measurement->HasReadout())
227 measOp->SetReadout(std::move(rates[hostQubits.first]));
228 newDistributedCircuit->AddOperation(
230 condOp->GetCondition()));
235 std::unordered_map<size_t, Types::qubits_vector> bits;
236 const auto qbits = op->AffectedQubits();
237 const auto reset = std::static_pointer_cast<Circuits::Reset<Time>>(op);
238 const auto &resetTargets = reset->GetResetTargets();
239 std::unordered_map<size_t, std::vector<bool>> targets;
241 for (
size_t q = 0; q < qbits.size(); ++q)
243 const size_t host = network->GetHostIdForAnyQubit(qbits[q]);
244 bits[host].emplace_back(qbits[q]);
245 if (!resetTargets.empty())
246 targets[host].push_back(q < resetTargets.size() && resetTargets[q]);
249 for (
const auto &hostQubits : bits)
250 newDistributedCircuit->AddOperation(
251 std::make_shared<
Circuits::Reset<Time>>(hostQubits.second, reset->GetDelay(), targets[hostQubits.first]));
255 std::unordered_map<size_t, std::vector<size_t>> bits;
256 const std::vector<size_t> cbits = op->AffectedBits();
258 for (
const size_t c : cbits)
260 const size_t host = network->GetHostIdForClassicalBit(c);
261 bits[host].emplace_back(c);
264 for (
const auto &hostQubits : bits)
269 std::unordered_map<size_t, std::vector<size_t>> bits;
273 auto condOp = std::static_pointer_cast<Circuits::ConditionalRandomGen<Time>>(op);
274 const std::vector<size_t> cbits = condOp->GetOperation()->AffectedBits();
276 for (
const size_t c : cbits)
278 const size_t host = network->GetHostIdForClassicalBit(c);
279 bits[host].emplace_back(c);
282 for (
const auto &hostQubits : bits)
284 auto randomOp = std::make_shared<Circuits::Random<Time>>(hostQubits.second);
285 newDistributedCircuit->AddOperation(
287 condOp->GetCondition()));
292 newDistributedCircuit->AddOperation(op);
297 return newDistributedCircuit;