Skip to content

Commit e42a734

Browse files
committed
🎨 Solve todos
1 parent e2b9f72 commit e42a734

File tree

2 files changed

+62
-38
lines changed

2 files changed

+62
-38
lines changed

include/mqt-core/na/device/Device.hpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@
1616

1717
#include "mqt_na_qdmi/device.h"
1818

19+
#include <algorithm>
1920
#include <cstddef>
2021
#include <cstdint>
2122
#include <memory>
2223
#include <string>
2324
#include <unordered_map>
25+
#include <utility>
2426
#include <vector>
2527

2628
namespace qdmi {
@@ -331,8 +333,7 @@ struct MQT_NA_QDMI_Operation_impl_d {
331333
MQT_NA_QDMI_Site zone);
332334
/// @brief Constructor for the single-qubit operations.
333335
MQT_NA_QDMI_Operation_impl_d(std::string name, size_t numParameters,
334-
size_t numQubits, uint64_t duration,
335-
double fidelity,
336+
uint64_t duration, double fidelity,
336337
const std::vector<MQT_NA_QDMI_Site>& sites);
337338
/// @brief Constructor for the multi-qubit operations.
338339
MQT_NA_QDMI_Operation_impl_d(std::string name, size_t numParameters,
@@ -349,6 +350,10 @@ struct MQT_NA_QDMI_Operation_impl_d {
349350
MQT_NA_QDMI_Site zone,
350351
uint64_t meanShuttlingSpeed);
351352

353+
/// @brief Sort the sites such that the occurrence of a given site can be
354+
/// determined in O(log n) time.
355+
auto sortSites() -> void;
356+
352357
public:
353358
/// @brief Factory function for the global single-qubit operations.
354359
[[nodiscard]] static auto

src/na/device/Device.cpp

Lines changed: 55 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,10 @@ Device::Device() {
9595
// NOLINTBEGIN(cppcoreguidelines-prefer-member-initializer)
9696
INITIALIZE_NAME(name_);
9797
INITIALIZE_QUBITSNUM(qubitsNum_);
98+
INITIALIZE_MINATOMDISTANCE(minAtomDistance_);
9899
// NOLINTEND(cppcoreguidelines-prefer-member-initializer)
99100
INITIALIZE_LENGTHUNIT(lengthUnit_);
100101
INITIALIZE_DURATIONUNIT(durationUnit_);
101-
INITIALIZE_MINATOMDISTANCE(minAtomDistance_);
102102
// NOLINTNEXTLINE(misc-const-correctness)
103103
INITIALIZE_SITES(sites_);
104104
INITIALIZE_OPERATIONS(operations_);
@@ -365,12 +365,12 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
365365
supportedSites_.emplace_back(zone);
366366
}
367367
MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
368-
std::string name, const size_t numParameters, const size_t numQubits,
369-
const uint64_t duration, const double fidelity,
370-
const std::vector<MQT_NA_QDMI_Site>& sites)
371-
: name_(std::move(name)), numParameters_(numParameters),
372-
numQubits_(numQubits), duration_(duration), fidelity_(fidelity),
373-
supportedSites_(sites) {}
368+
std::string name, const size_t numParameters, const uint64_t duration,
369+
const double fidelity, const std::vector<MQT_NA_QDMI_Site>& sites)
370+
: name_(std::move(name)), numParameters_(numParameters), numQubits_(1),
371+
duration_(duration), fidelity_(fidelity), supportedSites_(sites) {
372+
sortSites();
373+
}
374374
MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
375375
std::string name, const size_t numParameters, const size_t numQubits,
376376
const uint64_t duration, const double fidelity,
@@ -379,7 +379,9 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
379379
: name_(std::move(name)), numParameters_(numParameters),
380380
numQubits_(numQubits), duration_(duration), fidelity_(fidelity),
381381
interactionRadius_(interactionRadius), blockingRadius_(blockingRadius),
382-
supportedSites_(sites) {}
382+
supportedSites_(sites) {
383+
sortSites();
384+
}
383385
MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
384386
std::string name, size_t numParameters, uint64_t duration, double fidelity,
385387
MQT_NA_QDMI_Site zone)
@@ -394,11 +396,36 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
394396
meanShuttlingSpeed_(meanShuttlingSpeed), isZoned_(true) {
395397
supportedSites_.emplace_back(zone);
396398
}
399+
auto MQT_NA_QDMI_Operation_impl_d::sortSites() -> void {
400+
if (!isZoned_) {
401+
if (numQubits_ == 1) {
402+
// sort sites by their pointer address
403+
std::ranges::sort(supportedSites_);
404+
} else if (numQubits_ == 2) {
405+
// First ensure that in each site's pair the first site is the one
406+
// with the smaller pointer address
407+
std::ranges::for_each(
408+
reinterpret_cast<
409+
std::vector<std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>>&>(
410+
supportedSites_),
411+
[](auto& p) {
412+
if (p.first < p.second) {
413+
std::swap(p.first, p.second);
414+
}
415+
});
416+
// Then sort the pairs
417+
std::ranges::sort(
418+
reinterpret_cast<
419+
std::vector<std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>>&>(
420+
supportedSites_));
421+
}
422+
}
423+
}
397424
auto MQT_NA_QDMI_Operation_impl_d::makeUniqueGlobalSingleQubit(
398425
const std::string& name, const size_t numParameters,
399426
const uint64_t duration, const double fidelity, MQT_NA_QDMI_Site zone)
400427
-> std::unique_ptr<MQT_NA_QDMI_Operation_impl_d> {
401-
MQT_NA_QDMI_Operation_impl_d op(name, numParameters, 1, duration, fidelity,
428+
MQT_NA_QDMI_Operation_impl_d op(name, numParameters, duration, fidelity,
402429
zone);
403430
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move(op));
404431
}
@@ -418,7 +445,7 @@ auto MQT_NA_QDMI_Operation_impl_d::makeUniqueLocalSingleQubit(
418445
const uint64_t duration, const double fidelity,
419446
const std::vector<MQT_NA_QDMI_Site>& sites)
420447
-> std::unique_ptr<MQT_NA_QDMI_Operation_impl_d> {
421-
MQT_NA_QDMI_Operation_impl_d op(name, numParameters, 1, duration, fidelity,
448+
MQT_NA_QDMI_Operation_impl_d op(name, numParameters, duration, fidelity,
422449
sites);
423450
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move(op));
424451
}
@@ -428,15 +455,10 @@ auto MQT_NA_QDMI_Operation_impl_d::makeUniqueLocalTwoQubit(
428455
const uint64_t interactionRadius, const uint64_t blockingRadius,
429456
const std::vector<std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>>& sites)
430457
-> std::unique_ptr<MQT_NA_QDMI_Operation_impl_d> {
431-
// TODO: can that be solved by a cast from one vector to the other
432-
std::vector<MQT_NA_QDMI_Site> sitesFlattened;
433-
std::ranges::for_each(sites, [&sitesFlattened](const auto& sitePair) {
434-
sitesFlattened.emplace_back(sitePair.first);
435-
sitesFlattened.emplace_back(sitePair.second);
436-
});
437-
MQT_NA_QDMI_Operation_impl_d op(name, numParameters, numQubits, duration,
438-
fidelity, interactionRadius, blockingRadius,
439-
sitesFlattened);
458+
MQT_NA_QDMI_Operation_impl_d op(
459+
name, numParameters, numQubits, duration, fidelity, interactionRadius,
460+
blockingRadius,
461+
reinterpret_cast<const std::vector<MQT_NA_QDMI_Site>&>(sites));
440462
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move(op));
441463
}
442464
auto MQT_NA_QDMI_Operation_impl_d::makeUniqueShuttlingLoad(
@@ -476,27 +498,24 @@ auto MQT_NA_QDMI_Operation_impl_d::queryProperty(
476498
return QDMI_ERROR_INVALIDARGUMENT;
477499
}
478500
if (sites != nullptr) {
479-
// todo: Can this be improves, esp. the linear running time to
480-
// constant/logartihmic
481-
for (const MQT_NA_QDMI_Site* site = sites;
482-
// NOLINTNEXTLINE(cppcoreguidelines-pro-bounds-pointer-arithmetic)
483-
std::cmp_less(site - sites, numSites); ++site) {
484-
if (std::ranges::find(supportedSites_, *site) == supportedSites_.cend()) {
501+
if (numQubits_ == 1) {
502+
// if the (single) site is not supported, return with an error
503+
if (!std::ranges::binary_search(supportedSites_, *sites)) {
485504
return QDMI_ERROR_NOTSUPPORTED;
486505
}
487-
}
488-
// Check for 2-qubit gates whether sites are within interaction radius
489-
if (numSites == 2) {
490-
const auto* sitePair = reinterpret_cast<
491-
const std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>*>(sites);
492-
const auto xDistance = sitePair->second->x_ - sitePair->first->x_;
493-
const auto yDistance = sitePair->second->y_ - sitePair->first->y_;
494-
const auto distance =
495-
std::sqrt(std::pow(xDistance, 2) + std::pow(yDistance, 2));
496-
if (distance > interactionRadius_) {
506+
} else if (numQubits_ == 2) {
507+
const std::pair needle = sites[0] < sites[1]
508+
? std::make_pair(sites[0], sites[1])
509+
: std::make_pair(sites[1], sites[0]);
510+
// if the pair of sites is not supported, return with an error
511+
if (!std::ranges::binary_search(
512+
reinterpret_cast<const std::vector<
513+
std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>>&>(
514+
supportedSites_),
515+
needle)) {
497516
return QDMI_ERROR_NOTSUPPORTED;
498517
}
499-
}
518+
} // this device does not support operations with more than two qubits
500519
}
501520
ADD_STRING_PROPERTY(QDMI_OPERATION_PROPERTY_NAME, name_.c_str(), prop, size,
502521
value, sizeRet)

0 commit comments

Comments
 (0)