Skip to content

Commit

Permalink
No QUnit::TrySeparate() tolerance overload
Browse files Browse the repository at this point in the history
  • Loading branch information
WrathfulSpatula committed Oct 21, 2024
1 parent 29a3d90 commit d458dac
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 88 deletions.
2 changes: 1 addition & 1 deletion include/qunit.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -450,7 +450,7 @@ class QUnit : public QParity, public QInterface {
using QInterface::isClifford;
virtual bool isClifford(bitLenInt qubit) { return shards[qubit].isClifford(); };

virtual bool TrySeparate(const std::vector<bitLenInt>& qubits, real1_f error_tol);
using QInterface::TrySeparate;
virtual bool TrySeparate(bitLenInt qubit);
virtual bool TrySeparate(bitLenInt qubit1, bitLenInt qubit2);
virtual double GetUnitaryFidelity();
Expand Down
15 changes: 6 additions & 9 deletions src/qengine/utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ QInterfacePtr QEngineCPU::Clone()
return CloneEmpty();
}

QEngineCPUPtr clone =
std::make_shared<QEngineCPU>(qubitCount, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize, randGlobalPhase,
false, -1, (hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);
QEngineCPUPtr clone = std::make_shared<QEngineCPU>(qubitCount, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize,
randGlobalPhase, false, -1, (hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);

Finish();
clone->Finish();
Expand All @@ -34,9 +33,8 @@ QInterfacePtr QEngineCPU::Clone()

QEnginePtr QEngineCPU::CloneEmpty()
{
QEngineCPUPtr clone =
std::make_shared<QEngineCPU>(0U, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize, randGlobalPhase, false, -1,
(hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);
QEngineCPUPtr clone = std::make_shared<QEngineCPU>(0U, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize,
randGlobalPhase, false, -1, (hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);

clone->SetQubitCount(qubitCount);

Expand All @@ -53,9 +51,8 @@ bitLenInt QEngineCPU::Allocate(bitLenInt start, bitLenInt length)
return start;
}

QEngineCPUPtr nQubits =
std::make_shared<QEngineCPU>(length, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize, randGlobalPhase, false,
-1, (hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);
QEngineCPUPtr nQubits = std::make_shared<QEngineCPU>(length, ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize,
randGlobalPhase, false, -1, (hardware_rand_generator == NULL) ? false : true, false, (real1_f)amplitudeFloor);
return Compose(nQubits, start);
}

Expand Down
78 changes: 0 additions & 78 deletions src/qunit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -620,84 +620,6 @@ bool QUnit::TrySeparateClifford(bitLenInt qubit)
return true;
}

bool QUnit::TrySeparate(const std::vector<bitLenInt>& qubits, real1_f error_tol)
{
ThrowIfQbIdArrayIsBad(qubits, qubitCount,
"QUnit::TrySeparate parameter controls array values must be within allocated qubit bounds!");

if (qubits.size() == 1U) {
const bitLenInt qubit = qubits[0U];
QEngineShard& shard = shards[qubit];

if (shard.GetQubitCount() == 1U) {
if (shard.unit) {
ProbBase(qubit);
}
return true;
}

if (BLOCKED_SEPARATE(shard)) {
return false;
}

bitLenInt mapped = shard.mapped;
QInterfacePtr oUnit = shard.unit;
QInterfacePtr nUnit = MakeEngine(1U, ZERO_BCI);
if (oUnit->TryDecompose(mapped, nUnit, error_tol)) {
for (bitLenInt i = 0; i < qubitCount; ++i) {
if ((shards[i].unit == oUnit) && (shards[i].mapped > mapped)) {
--(shards[i].mapped);
}
}

shard.unit = nUnit;
shard.mapped = 0U;
shard.MakeDirty();
ProbBase(qubit);

if (oUnit->GetQubitCount() == 1U) {
return true;
}

for (bitLenInt i = 0U; i < qubitCount; ++i) {
if (shard.unit == oUnit) {
ProbBase(i);
break;
}
}

return true;
}

return false;
}

std::vector<bitLenInt> q(qubits.begin(), qubits.end());
std::sort(q.begin(), q.end());

// Swap gate is free, so just bring into the form of the contiguous overload.
for (size_t i = 0U; i < q.size(); ++i) {
Swap(i, q[i]);
}

QUnitPtr dest = std::dynamic_pointer_cast<QUnit>(std::make_shared<QUnit>(
engines, q.size(), ZERO_BCI, rand_generator, ONE_CMPLX, doNormalize, randGlobalPhase, useHostRam));

const bool toRet = TryDecompose(0U, dest, error_tol);
if (toRet) {
if (q.size() == 1U) {
dest->ProbBase(0U);
}
Compose(dest, 0U);
}

for (size_t i = 0U; i < q.size(); ++i) {
Swap(i, q[i]);
}

return toRet;
}

bool QUnit::TrySeparate(bitLenInt qubit)
{
if (qubit >= qubitCount) {
Expand Down

0 comments on commit d458dac

Please sign in to comment.