Skip to content

Commit

Permalink
♻️ remove redundant start parameter from DD multiplication routine (#…
Browse files Browse the repository at this point in the history
…576)

## Description

This small PR removes a no-longer-needed `start` parameter of the DD
multiplication routines.

## Checklist:

<!---
This checklist serves as a reminder of a couple of things that ensure
your pull request will be merged swiftly.
-->

- [x] The pull request only contains commits that are related to it.
- [x] I have added appropriate tests and documentation.
- [x] I have made sure that all CI jobs on GitHub pass.
- [x] The pull request introduces no new warnings and follows the
project's style guidelines.

Signed-off-by: burgholzer <burgholzer@me.com>
  • Loading branch information
burgholzer committed Mar 28, 2024
1 parent df43b4a commit ed17e0c
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 15 deletions.
25 changes: 12 additions & 13 deletions include/mqt-core/dd/Package.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -1109,16 +1109,16 @@ template <class Config> class Package {
auto const measZeroDd = makeGateDD(MEAS_ZERO_MAT, index);

auto tmp0 = conjugateTranspose(measZeroDd);
auto tmp1 = multiply(e, densityFromMatrixEdge(tmp0), 0, false);
auto tmp2 = multiply(densityFromMatrixEdge(measZeroDd), tmp1, 0, true);
auto tmp1 = multiply(e, densityFromMatrixEdge(tmp0), false);
auto tmp2 = multiply(densityFromMatrixEdge(measZeroDd), tmp1, true);
auto densityMatrixTrace = trace(tmp2, nrQubits);

std::uniform_real_distribution<fp> dist(0., 1.);
if (const auto threshold = dist(mt); threshold > densityMatrixTrace.r) {
auto const measOneDd = makeGateDD(MEAS_ONE_MAT, index);
tmp0 = conjugateTranspose(measOneDd);
tmp1 = multiply(e, densityFromMatrixEdge(tmp0), 0, false);
tmp2 = multiply(densityFromMatrixEdge(measOneDd), tmp1, 0, true);
tmp1 = multiply(e, densityFromMatrixEdge(tmp0), false);
tmp2 = multiply(densityFromMatrixEdge(measOneDd), tmp1, true);
measuredResult = '1';
densityMatrixTrace = trace(tmp2, nrQubits);
}
Expand Down Expand Up @@ -1481,8 +1481,8 @@ template <class Config> class Package {

dEdge applyOperationToDensity(dEdge& e, const mEdge& operation) {
auto tmp0 = conjugateTranspose(operation);
auto tmp1 = multiply(e, densityFromMatrixEdge(tmp0), 0, false);
auto tmp2 = multiply(densityFromMatrixEdge(operation), tmp1, 0, true);
auto tmp1 = multiply(e, densityFromMatrixEdge(tmp0), false);
auto tmp2 = multiply(densityFromMatrixEdge(operation), tmp1, true);
incRef(tmp2);
dEdge::alignDensityEdge(e);
decRef(e);
Expand All @@ -1494,7 +1494,6 @@ template <class Config> class Package {
template <class LeftOperandNode, class RightOperandNode>
Edge<RightOperandNode>
multiply(const Edge<LeftOperandNode>& x, const Edge<RightOperandNode>& y,
const Qubit start = 0,
[[maybe_unused]] const bool generateDensityMatrix = false) {
using LEdge = Edge<LeftOperandNode>;
using REdge = Edge<RightOperandNode>;
Expand All @@ -1518,7 +1517,7 @@ template <class Config> class Package {
var = yCopy.p->v;
}

const auto e = multiply2(xCopy, yCopy, var, start, generateDensityMatrix);
const auto e = multiply2(xCopy, yCopy, var, generateDensityMatrix);
dEdge::revertDmChangesToEdges(xCopy, yCopy);
return cn.lookup(e);
} else {
Expand All @@ -1528,7 +1527,7 @@ template <class Config> class Package {
if (!y.isTerminal() && y.p->v > var) {
var = y.p->v;
}
const auto e = multiply2(x, y, var, start);
const auto e = multiply2(x, y, var);
return cn.lookup(e);
}
}
Expand All @@ -1537,7 +1536,7 @@ template <class Config> class Package {
template <class LeftOperandNode, class RightOperandNode>
CachedEdge<RightOperandNode>
multiply2(const Edge<LeftOperandNode>& x, const Edge<RightOperandNode>& y,
const Qubit var, const Qubit start = 0,
const Qubit var,
[[maybe_unused]] const bool generateDensityMatrix = false) {
using LEdge = Edge<LeftOperandNode>;
using REdge = Edge<RightOperandNode>;
Expand Down Expand Up @@ -1630,7 +1629,7 @@ template <class Config> class Package {
// When generateDensityMatrix is false or I have the first edge I
// don't optimize anything and set generateDensityMatrix to false
// for all child edges
m = multiply2(e1, e2, v, start, false);
m = multiply2(e1, e2, v, false);
} else if (idx == 2) {
// When I have the second edge and generateDensityMatrix == false,
// then edge[2] == edge[1]
Expand All @@ -1643,7 +1642,7 @@ template <class Config> class Package {
}
continue;
} else {
m = multiply2(e1, e2, v, start, generateDensityMatrix);
m = multiply2(e1, e2, v, generateDensityMatrix);
}

if (k == 0 || edge[idx].w.exactlyZero()) {
Expand All @@ -1658,7 +1657,7 @@ template <class Config> class Package {
// Undo modifications on density matrices
dEdge::revertDmChangesToEdges(e1, e2);
} else {
auto m = multiply2(e1, e2, v, start);
auto m = multiply2(e1, e2, v);

if (k == 0 || edge[idx].w.exactlyZero()) {
edge[idx] = m;
Expand Down
4 changes: 2 additions & 2 deletions test/dd/test_package.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1495,7 +1495,7 @@ TEST(DDPackageTest, dNodeMulCache1) {
computeTable.lookup(state.p, densityMatrix0.p, false);
ASSERT_NE(cachedResult, nullptr);
ASSERT_NE(cachedResult->p, nullptr);
state = dd->multiply(state, densityMatrix0, 0, false);
state = dd->multiply(state, densityMatrix0, false);
ASSERT_NE(state.p, nullptr);
ASSERT_EQ(state.p, cachedResult->p);

Expand All @@ -1504,7 +1504,7 @@ TEST(DDPackageTest, dNodeMulCache1) {
computeTable.lookup(densityMatrix1.p, state.p, true);
ASSERT_NE(cachedResult1, nullptr);
ASSERT_NE(cachedResult1->p, nullptr);
const auto state2 = dd->multiply(densityMatrix1, state, 0, true);
const auto state2 = dd->multiply(densityMatrix1, state, true);
ASSERT_NE(state2.p, nullptr);
ASSERT_EQ(state2.p, cachedResult1->p);

Expand Down

0 comments on commit ed17e0c

Please sign in to comment.