Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

⬆️ Update mqt-core submodule #302

Merged
merged 2 commits into from
Oct 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions apps/noise_aware.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape)

auto t1 = std::chrono::steady_clock::now();

const std::map<std::string, double> measurementResults = ddsim->deterministicSimulate();
const auto measurementResults = ddsim->deterministicSimulate();

auto t2 = std::chrono::steady_clock::now();

Expand Down Expand Up @@ -146,6 +146,6 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape)
if (vm.count("pm") > 0) {
outputObj["measurement_results"] = measurementResults;
}
std::cout << std::setw(2) << outputObj << std::endl;
std::cout << std::setw(2) << outputObj << "\n";
}
}
18 changes: 15 additions & 3 deletions apps/simple.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,18 @@

namespace nl = nlohmann;

namespace std {
template<class T>
void to_json(nl::json& j, const std::complex<T>& p) { // NOLINT(readability-identifier-naming)
j = nl::json{p.real(), p.imag()};
}
template<class T>
void from_json(const nl::json& j, std::complex<T>& p) { // NOLINT(readability-identifier-naming)
p.real(j.at(0));
p.imag(j.at(1));
}
} /* namespace std */

int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape)
cxxopts::Options options("MQT DDSIM", "for more information see https://www.cda.cit.tum.de/");
// clang-format off
Expand Down Expand Up @@ -211,9 +223,9 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape)

if (vm.count("pv") > 0) {
if (auto* hsfSim = dynamic_cast<HybridSchrodingerFeynmanSimulator<>*>(ddsim.get())) {
outputObj["state_vector"] = hsfSim->getVectorFromHybridSimulation<std::pair<dd::fp, dd::fp>>();
outputObj["state_vector"] = hsfSim->getVectorFromHybridSimulation();
} else {
outputObj["state_vector"] = ddsim->getVector<std::pair<dd::fp, dd::fp>>();
outputObj["state_vector"] = ddsim->getVector();
}
}

Expand Down Expand Up @@ -245,5 +257,5 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape)
dd::exportEdgeWeights(ddsim->rootEdge, ostream);
}

std::cout << std::setw(2) << outputObj << std::endl;
std::cout << std::setw(2) << outputObj << "\n";
}
2 changes: 1 addition & 1 deletion extern/mqt-core
Submodule mqt-core updated 80 files
+17 −2 .github/workflows/cd.yml
+1 −1 .github/workflows/reusable-change-detection.yml
+1 −2 .github/workflows/reusable-code-ql-cpp.yml
+3 −4 .github/workflows/reusable-code-ql-python.yml
+1 −1 .github/workflows/reusable-cpp-coverage.yml
+1 −1 .github/workflows/reusable-cpp-linter.yml
+1 −1 .github/workflows/reusable-cpp-tests-macos.yml
+1 −1 .github/workflows/reusable-cpp-tests-ubuntu.yml
+1 −1 .github/workflows/reusable-cpp-tests-windows.yml
+2 −2 .github/workflows/reusable-python-ci.yml
+1 −1 .github/workflows/reusable-python-coverage.yml
+1 −1 .github/workflows/reusable-python-linter.yml
+8 −29 .github/workflows/reusable-python-packaging.yml
+1 −1 .github/workflows/reusable-python-tests.yml
+5 −6 .pre-commit-config.yaml
+1 −1 extern/boost/config
+1 −1 extern/googletest
+1 −1 extern/json
+46 −0 include/dd/CachedEdge.hpp
+7 −0 include/dd/Complex.hpp
+27 −25 include/dd/ComputeTable.hpp
+32 −6 include/dd/DDDefinitions.hpp
+28 −32 include/dd/DensityNoiseTable.hpp
+318 −38 include/dd/Edge.hpp
+9 −42 include/dd/MemoryManager.hpp
+5 −0 include/dd/Node.hpp
+22 −10 include/dd/NoiseFunctionality.hpp
+45 −627 include/dd/Package.hpp
+1 −1 include/dd/RealNumberUniqueTable.hpp
+2 −2 include/dd/Simulation.hpp
+20 −30 include/dd/StochasticNoiseOperationTable.hpp
+27 −30 include/dd/UnaryComputeTable.hpp
+111 −35 include/dd/UniqueTable.hpp
+0 −94 include/dd/UniqueTableStatistics.hpp
+66 −0 include/dd/statistics/MemoryManagerStatistics.hpp
+293 −0 include/dd/statistics/PackageStatistics.hpp
+32 −0 include/dd/statistics/Statistics.hpp
+68 −0 include/dd/statistics/TableStatistics.hpp
+28 −0 include/dd/statistics/UniqueTableStatistics.hpp
+13 −1 include/operations/ClassicControlledOperation.hpp
+42 −0 include/operations/CompoundOperation.hpp
+35 −0 include/operations/NonUnitaryOperation.hpp
+32 −1 include/operations/Operation.hpp
+26 −0 include/operations/StandardOperation.hpp
+6 −0 include/operations/SymbolicOperation.hpp
+3 −3 include/python/pybind11.hpp
+3 −3 noxfile.py
+4 −1 pyproject.toml
+14 −14 src/CircuitOptimizer.cpp
+1 −1 src/algorithms/QPE.cpp
+5 −1 src/dd/CMakeLists.txt
+33 −0 src/dd/CachedEdge.cpp
+4 −0 src/dd/Complex.cpp
+2 −2 src/dd/ComplexNumbers.cpp
+408 −50 src/dd/Edge.cpp
+15 −25 src/dd/MemoryManager.cpp
+1 −1 src/dd/Operations.cpp
+13 −11 src/dd/RealNumberUniqueTable.cpp
+4 −6 src/dd/Simulation.cpp
+0 −55 src/dd/UniqueTableStatistics.cpp
+97 −0 src/dd/statistics/MemoryManagerStatistics.cpp
+11 −0 src/dd/statistics/Statistics.cpp
+64 −0 src/dd/statistics/TableStatistics.cpp
+29 −0 src/dd/statistics/UniqueTableStatistics.cpp
+7 −0 src/operations/NonUnitaryOperation.cpp
+91 −0 src/operations/StandardOperation.cpp
+60 −0 src/operations/SymbolicOperation.cpp
+11 −28 src/python/CMakeLists.txt
+2 −2 src/python/module.cpp
+2 −0 test/CMakeLists.txt
+7 −7 test/algorithms/eval_dynamic_circuits.cpp
+2 −4 test/algorithms/test_entanglement.cpp
+8 −8 test/algorithms/test_grover.cpp
+18 −18 test/algorithms/test_qft.cpp
+9 −10 test/algorithms/test_qpe.cpp
+17 −16 test/dd/test_complex.cpp
+14 −14 test/dd/test_dd_noise_functionality.cpp
+451 −0 test/dd/test_edge_functionality.cpp
+155 −105 test/dd/test_package.cpp
+275 −9 test/unittests/test_qfr_functionality.cpp
2 changes: 1 addition & 1 deletion extern/taskflow
Submodule taskflow updated 576 files
12 changes: 6 additions & 6 deletions include/DeterministicNoiseSimulator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,27 +36,27 @@ class DeterministicNoiseSimulator: public Simulator<Config> {
return sampleFromProbabilityMap(deterministicSimulate(), shots);
};

std::map<std::string, dd::fp> deterministicSimulate();
dd::SparsePVecStrKeys deterministicSimulate();

std::map<std::string, std::size_t> sampleFromProbabilityMap(const std::map<std::string, dd::fp>& resultProbabilityMap, std::size_t shots);
std::map<std::string, std::size_t> sampleFromProbabilityMap(const dd::SparsePVecStrKeys& resultProbabilityMap, std::size_t shots);

[[nodiscard]] std::size_t getNumberOfQubits() const override { return qc->getNqubits(); };

[[nodiscard]] std::size_t getNumberOfOps() const override { return qc->getNops(); };

[[nodiscard]] std::string getName() const override { return qc->getName(); };

[[nodiscard]] std::size_t getActiveNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::dNode>().getStats().activeEntryCount; }
[[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::dNode>().getStats().peakActiveEntryCount; }
[[nodiscard]] std::size_t getActiveNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::dNode>().getNumActiveEntries(); }
[[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::dNode>().getPeakNumActiveEntries(); }

[[nodiscard]] std::size_t countNodesFromRoot() override {
if (useDensityMatrixType) {
qc::DensityMatrixDD::alignDensityEdge(rootEdge);
const std::size_t tmp = Simulator<Config>::dd->size(rootEdge);
const std::size_t tmp = rootEdge.size();
qc::DensityMatrixDD::setDensityMatrixTrue(rootEdge);
return tmp;
}
return Simulator<Config>::dd->size(rootEdge);
return rootEdge.size();
}

qc::DensityMatrixDD rootEdge{};
Expand Down
16 changes: 5 additions & 11 deletions include/HybridSchrodingerFeynmanSimulator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,21 +49,15 @@ class HybridSchrodingerFeynmanSimulator: public CircuitSimulator<Config> {

Mode mode = Mode::Amplitude;

template<class ReturnType = dd::ComplexValue>
[[nodiscard]] std::vector<ReturnType> getVectorFromHybridSimulation() const {
[[nodiscard]] dd::CVec getVectorFromHybridSimulation() const {
if (CircuitSimulator<Config>::getNumberOfQubits() >= 60) {
// On 64bit system the vector can hold up to (2^60)-1 elements, if memory permits
throw std::range_error("getVector only supports less than 60 qubits.");
}
if (getMode() == Mode::Amplitude) {
if constexpr (std::is_same_v<ReturnType, decltype(finalAmplitudes)>) {
return finalAmplitudes;
}
std::vector<ReturnType> amplitudes;
std::transform(finalAmplitudes.begin(), finalAmplitudes.end(), std::back_inserter(amplitudes), [](std::complex<dd::fp> x) -> ReturnType { return {x.real(), x.imag()}; });
return amplitudes;
return finalAmplitudes;
}
return CircuitSimulator<Config>::template getVector<ReturnType>();
return CircuitSimulator<Config>::getVector();
}

// Get # of decisions for given split_qubit, so that lower slice: q0 < i < qubit; upper slice: qubit <= i < nqubits
Expand All @@ -72,8 +66,8 @@ class HybridSchrodingerFeynmanSimulator: public CircuitSimulator<Config> {
[[nodiscard]] Mode getMode() const { return mode; }

private:
std::size_t nthreads = 2;
std::vector<std::complex<dd::fp>> finalAmplitudes{};
std::size_t nthreads = 2;
dd::CVec finalAmplitudes{};

void simulateHybridTaskflow(qc::Qubit splitQubit);
void simulateHybridAmplitudes(qc::Qubit splitQubit);
Expand Down
36 changes: 7 additions & 29 deletions include/Simulator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,33 +66,23 @@ class Simulator {

std::map<std::string, std::size_t> sampleFromAmplitudeVectorInPlace(std::vector<std::complex<dd::fp>>& amplitudes, std::size_t shots);

template<class ReturnType = dd::ComplexValue>
[[nodiscard]] std::vector<ReturnType> getVector() const {
[[nodiscard]] dd::CVec getVector() const {
if (getNumberOfQubits() >= 60) {
// On 64bit system the vector can hold up to (2^60)-1 elements, if memory permits
throw std::range_error("getVector only supports less than 60 qubits.");
}
std::string path(getNumberOfQubits(), '0');
std::vector<ReturnType> results;
results.resize(1ULL << getNumberOfQubits());
for (std::size_t i = 0; i < 1ULL << getNumberOfQubits(); ++i) {
const std::string correctedPath{path.rbegin(), path.rend()};
const dd::ComplexValue cv = dd->getValueByPath(rootEdge, correctedPath);
results[i] = {cv.r, cv.i};
nextPath(path);
}
return results;
return rootEdge.getVector();
}

[[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->template getUniqueTable<dd::vNode>().getStats().activeEntryCount; }
[[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->template getUniqueTable<dd::vNode>().getNumActiveEntries(); }

[[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->template getUniqueTable<dd::vNode>().getStats().peakActiveEntryCount; }
[[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->template getUniqueTable<dd::vNode>().getPeakNumActiveEntries(); }

[[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->template getUniqueTable<dd::mNode>().getStats().activeEntryCount; }
[[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->template getUniqueTable<dd::mNode>().getPeakNumActiveEntries(); }

[[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->template getUniqueTable<dd::mNode>().getStats().activeEntryCount; }
[[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->template getUniqueTable<dd::mNode>().getNumActiveEntries(); }

[[nodiscard]] virtual std::size_t countNodesFromRoot() { return dd->size(rootEdge); }
[[nodiscard]] virtual std::size_t countNodesFromRoot() { return rootEdge.size(); }

[[nodiscard]] std::pair<dd::ComplexValue, std::string> getPathOfLeastResistance() const;

Expand All @@ -104,16 +94,6 @@ class Simulator {

[[nodiscard]] virtual std::string getName() const = 0;

[[nodiscard]] static inline std::string toBinaryString(const std::size_t value, const std::size_t numberOfQubits) {
std::string binary(numberOfQubits, '0');
for (std::size_t j = 0; j < numberOfQubits; ++j) {
if ((value & (1U << j)) != 0U) {
binary[numberOfQubits - 1 - j] = '1';
}
}
return binary;
}

void setTolerance(const dd::fp tolerance) {
dd->cn.setTolerance(tolerance);
}
Expand Down Expand Up @@ -144,8 +124,6 @@ class Simulator {
std::uint64_t seed = 0;
bool hasFixedSeed;
dd::fp epsilon = 0.001;

static void nextPath(std::string& s);
};

struct StochasticNoiseSimulatorDDPackageConfig: public dd::DDPackageConfig {
Expand Down
4 changes: 2 additions & 2 deletions include/UnitarySimulator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ class UnitarySimulator: public CircuitSimulator<Config> {
[[nodiscard]] Mode getMode() const { return mode; }
[[nodiscard]] qc::MatrixDD getConstructedDD() const { return e; }
[[nodiscard]] double getConstructionTime() const { return constructionTime; }
[[nodiscard]] std::size_t getFinalNodeCount() const { return Simulator<Config>::dd->size(e); }
[[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::mNode>().getStats().peakActiveEntryCount; }
[[nodiscard]] std::size_t getFinalNodeCount() const { return e.size(); }
[[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator<Config>::dd->template getUniqueTable<dd::mNode>().getPeakNumActiveEntries(); }

private:
qc::MatrixDD e{};
Expand Down
4 changes: 2 additions & 2 deletions src/CircuitSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -185,7 +185,7 @@ std::map<std::size_t, bool> CircuitSimulator<Config>::singleShot(const bool igno
if (approximationInfo.stepNumber > 0 && approximationInfo.stepFidelity < 1.0) {
if (approximationInfo.strategy == ApproximationInfo::FidelityDriven && (opNum + 1) % approxMod == 0 &&
approximationRuns < approximationInfo.stepNumber) {
[[maybe_unused]] const auto sizeBefore = Simulator<Config>::dd->size(Simulator<Config>::rootEdge);
[[maybe_unused]] const auto sizeBefore = Simulator<Config>::rootEdge.size();
const auto apFid = Simulator<Config>::approximateByFidelity(approximationInfo.stepFidelity, false, true);
approximationRuns++;
finalFidelity *= static_cast<long double>(apFid);
Expand All @@ -197,7 +197,7 @@ std::map<std::size_t, bool> CircuitSimulator<Config>::singleShot(const bool igno
<< "; #runs=" << approximation_runs
<< "\n";//*/
} else if (approximationInfo.strategy == ApproximationInfo::MemoryDriven) {
[[maybe_unused]] const auto sizeBefore = Simulator<Config>::dd->size(Simulator<Config>::rootEdge);
[[maybe_unused]] const auto sizeBefore = Simulator<Config>::rootEdge.size();
if (Simulator<Config>::dd->template getUniqueTable<dd::vNode>().possiblyNeedsCollection()) {
const auto apFid = Simulator<Config>::approximateByFidelity(approximationInfo.stepFidelity, false, true);
approximationRuns++;
Expand Down
7 changes: 3 additions & 4 deletions src/DeterministicNoiseSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
using CN = dd::ComplexNumbers;

template<class Config>
std::map<std::string, double> DeterministicNoiseSimulator<Config>::deterministicSimulate() {
dd::SparsePVecStrKeys DeterministicNoiseSimulator<Config>::deterministicSimulate() {
rootEdge = Simulator<Config>::dd->makeZeroDensityOperator(static_cast<dd::Qubit>(qc->getNqubits()));
Simulator<Config>::dd->incRef(rootEdge);

Expand Down Expand Up @@ -42,12 +42,11 @@ std::map<std::string, double> DeterministicNoiseSimulator<Config>::deterministic

deterministicNoiseFunctionality.applyNoiseEffects(rootEdge, op);
}
return Simulator<Config>::dd->getProbVectorFromDensityMatrix(rootEdge, measurementThreshold);
return rootEdge.getSparseProbabilityVectorStrKeys(measurementThreshold);
}

template<class Config>
std::map<std::string, std::size_t> DeterministicNoiseSimulator<Config>::sampleFromProbabilityMap(const std::map<std::string, dd::fp>& resultProbabilityMap, std::size_t shots) {
// Create probability distribution from measure probabilities
std::map<std::string, std::size_t> DeterministicNoiseSimulator<Config>::sampleFromProbabilityMap(const dd::SparsePVecStrKeys& resultProbabilityMap, std::size_t shots) {
std::vector<dd::fp> weights;
weights.reserve(resultProbabilityMap.size());

Expand Down
6 changes: 3 additions & 3 deletions src/HybridSchrodingerFeynmanSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -244,11 +244,11 @@ void HybridSchrodingerFeynmanSimulator<Config>::simulateHybridAmplitudes(qc::Qub
const auto requiredVectors = static_cast<std::size_t>(std::ceil(static_cast<double>(maxControl) / static_cast<double>(nslicesOnOneCpu)));
Simulator<Config>::rootEdge = qc::VectorDD::zero;

std::vector<std::vector<std::complex<dd::fp>>> amplitudes(requiredVectors, std::vector<std::complex<dd::fp>>(1U << nqubits, {0, 0}));
std::vector<dd::CVec> amplitudes(requiredVectors, dd::CVec(1ULL << nqubits, 0));

tf::Executor executor(actuallyUsedThreads);
for (std::size_t control = 0, i = 0; control < maxControl; control += nslicesOnOneCpu, i++) {
executor.silent_async([this, i, &amplitudes, nslicesOnOneCpu, control, nqubits, splitQubit, maxControl]() {
executor.silent_async([this, i, &amplitudes, nslicesOnOneCpu, control, splitQubit, maxControl]() {
const auto currentThread = i;
std::vector<std::complex<dd::fp>>& threadAmplitudes = amplitudes.at(currentThread);

Expand All @@ -259,7 +259,7 @@ void HybridSchrodingerFeynmanSimulator<Config>::simulateHybridAmplitudes(qc::Qub
}
std::unique_ptr<dd::Package<Config>> sliceDD = std::make_unique<dd::Package<Config>>(CircuitSimulator<Config>::getNumberOfQubits());
auto result = simulateSlicing(sliceDD, splitQubit, totalControl);
sliceDD->addAmplitudes(result, threadAmplitudes, static_cast<dd::Qubit>(nqubits));
result.addToVector(threadAmplitudes);
}
});
}
Expand Down
2 changes: 1 addition & 1 deletion src/ShorFastSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ std::map<std::string, std::size_t> ShorFastSimulator<Config>::simulate([[maybe_u
uAEmulate2(as[i]);

if (verbose) {
std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator<Config>::dd->size(Simulator<Config>::rootEdge)
std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator<Config>::rootEdge.size()
<< "\n";
}

Expand Down
4 changes: 2 additions & 2 deletions src/ShorSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,13 @@ std::map<std::string, std::size_t> ShorSimulator<Config>::simulate([[maybe_unuse
}

if (verbose) {
std::clog << "Nodes before QFT: " << Simulator<Config>::dd->size(Simulator<Config>::rootEdge) << "\n";
std::clog << "Nodes before QFT: " << Simulator<Config>::rootEdge.size() << "\n";
}

//EXACT QFT
for (std::int32_t i = 0; i < static_cast<std::int32_t>(2 * requiredBits); i++) {
if (verbose) {
std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator<Config>::dd->size(Simulator<Config>::rootEdge)
std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator<Config>::rootEdge.size()
<< "\n";
}
double q = 2;
Expand Down
28 changes: 5 additions & 23 deletions src/Simulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,30 +28,12 @@ std::map<std::string, std::size_t> Simulator<Config>::sampleFromAmplitudeVectorI
auto m = std::distance(amplitudes.begin(), mit);

// construct basis state string
auto basisState = toBinaryString(static_cast<std::size_t>(m), getNumberOfQubits());
auto basisState = dd::intToBinaryString(static_cast<std::size_t>(m), getNumberOfQubits());
results[basisState]++;
}
return results;
}

template<class Config>
void Simulator<Config>::nextPath(std::string& s) {
std::string::reverse_iterator iter = s.rbegin();
const std::string::reverse_iterator end = s.rend();

int carry = 1;

while ((carry != 0) && iter != end) {
const int value = (*iter - '0') + carry;
carry = (value / 2);
*iter = static_cast<char>('0' + (value % 2));
++iter;
}
if (carry != 0) {
s.insert(0, "1");
}
}

/**
* Calculate the contributions of each node and return as vector of priority queues (each queue corresponds to a level in the decision diagram)
* @tparam Config Configuration for the underlying DD package
Expand Down Expand Up @@ -169,8 +151,8 @@ double Simulator<Config>::approximateByFidelity(std::unique_ptr<dd::Package<Conf
}

if (verbose) {
const auto sizeBefore = localDD->size(edge);
const auto sizeAfter = localDD->size(newEdge);
const auto sizeBefore = edge.size();
const auto sizeAfter = newEdge.size();
std::cout
<< getName() << ","
<< +getNumberOfQubits() << "," // unary plus for int promotion
Expand Down Expand Up @@ -258,8 +240,8 @@ double Simulator<Config>::approximateBySampling(std::unique_ptr<dd::Package<Conf
}

if (verbose) {
const auto sizeAfter = localDD->size(newEdge);
const auto sizeBefore = localDD->size(edge);
const auto sizeAfter = newEdge.size();
const auto sizeBefore = edge.size();
std::cout
<< getName() << ","
<< +getNumberOfQubits() << "," // unary plus for int promotion
Expand Down
11 changes: 6 additions & 5 deletions src/StochasticNoiseSimulator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -243,10 +243,12 @@ void StochasticNoiseSimulator<Config>::runStochSimulationForId(std::size_t
controls = op->getControls();

if (targets.size() == 1 && controls.empty()) {
operation = localDD->stochasticNoiseOperationCache.lookup(op->getType(), static_cast<dd::Qubit>(targets.front()));
if (operation.p == nullptr) {
auto* oper = localDD->stochasticNoiseOperationCache.lookup(op->getType(), static_cast<dd::Qubit>(targets.front()));
if (oper == nullptr) {
operation = dd::getDD(op.get(), localDD);
localDD->stochasticNoiseOperationCache.insert(op->getType(), static_cast<dd::Qubit>(targets.front()), operation);
} else {
operation = *oper;
}
} else {
operation = dd::getDD(op.get(), localDD);
Expand Down Expand Up @@ -293,9 +295,8 @@ void StochasticNoiseSimulator<Config>::runStochSimulationForId(std::size_t
} else {
// extract amplitude for state
const auto basisVector = recordedPropertiesList[i].second;
const auto amplitude = localDD->getValueByPath(localRootEdge, basisVector);
const auto prob = amplitude.r * amplitude.r + amplitude.i * amplitude.i;
recordedPropertiesStorage[i] += prob;
const auto amplitude = localRootEdge.getValueByPath(basisVector);
recordedPropertiesStorage[i] += std::norm(amplitude);
}
}
}
Expand Down
Loading