@@ -95,10 +95,10 @@ Device::Device() {
95
95
// NOLINTBEGIN(cppcoreguidelines-prefer-member-initializer)
96
96
INITIALIZE_NAME (name_);
97
97
INITIALIZE_QUBITSNUM (qubitsNum_);
98
+ INITIALIZE_MINATOMDISTANCE (minAtomDistance_);
98
99
// NOLINTEND(cppcoreguidelines-prefer-member-initializer)
99
100
INITIALIZE_LENGTHUNIT (lengthUnit_);
100
101
INITIALIZE_DURATIONUNIT (durationUnit_);
101
- INITIALIZE_MINATOMDISTANCE (minAtomDistance_);
102
102
// NOLINTNEXTLINE(misc-const-correctness)
103
103
INITIALIZE_SITES (sites_);
104
104
INITIALIZE_OPERATIONS (operations_);
@@ -365,12 +365,12 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
365
365
supportedSites_.emplace_back (zone);
366
366
}
367
367
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
+ }
374
374
MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d (
375
375
std::string name, const size_t numParameters, const size_t numQubits,
376
376
const uint64_t duration, const double fidelity,
@@ -379,7 +379,9 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
379
379
: name_(std::move(name)), numParameters_(numParameters),
380
380
numQubits_(numQubits), duration_(duration), fidelity_(fidelity),
381
381
interactionRadius_(interactionRadius), blockingRadius_(blockingRadius),
382
- supportedSites_(sites) {}
382
+ supportedSites_(sites) {
383
+ sortSites ();
384
+ }
383
385
MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d (
384
386
std::string name, size_t numParameters, uint64_t duration, double fidelity,
385
387
MQT_NA_QDMI_Site zone)
@@ -394,11 +396,36 @@ MQT_NA_QDMI_Operation_impl_d::MQT_NA_QDMI_Operation_impl_d(
394
396
meanShuttlingSpeed_(meanShuttlingSpeed), isZoned_(true ) {
395
397
supportedSites_.emplace_back (zone);
396
398
}
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
+ }
397
424
auto MQT_NA_QDMI_Operation_impl_d::makeUniqueGlobalSingleQubit (
398
425
const std::string& name, const size_t numParameters,
399
426
const uint64_t duration, const double fidelity, MQT_NA_QDMI_Site zone)
400
427
-> 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,
402
429
zone);
403
430
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move (op));
404
431
}
@@ -418,7 +445,7 @@ auto MQT_NA_QDMI_Operation_impl_d::makeUniqueLocalSingleQubit(
418
445
const uint64_t duration, const double fidelity,
419
446
const std::vector<MQT_NA_QDMI_Site>& sites)
420
447
-> 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,
422
449
sites);
423
450
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move (op));
424
451
}
@@ -428,15 +455,10 @@ auto MQT_NA_QDMI_Operation_impl_d::makeUniqueLocalTwoQubit(
428
455
const uint64_t interactionRadius, const uint64_t blockingRadius,
429
456
const std::vector<std::pair<MQT_NA_QDMI_Site, MQT_NA_QDMI_Site>>& sites)
430
457
-> 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));
440
462
return std::make_unique<MQT_NA_QDMI_Operation_impl_d>(std::move (op));
441
463
}
442
464
auto MQT_NA_QDMI_Operation_impl_d::makeUniqueShuttlingLoad (
@@ -476,27 +498,24 @@ auto MQT_NA_QDMI_Operation_impl_d::queryProperty(
476
498
return QDMI_ERROR_INVALIDARGUMENT;
477
499
}
478
500
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)) {
485
504
return QDMI_ERROR_NOTSUPPORTED;
486
505
}
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) ) {
497
516
return QDMI_ERROR_NOTSUPPORTED;
498
517
}
499
- }
518
+ } // this device does not support operations with more than two qubits
500
519
}
501
520
ADD_STRING_PROPERTY (QDMI_OPERATION_PROPERTY_NAME, name_.c_str (), prop, size,
502
521
value, sizeRet)
0 commit comments