From 156bd704b47f30d3dda640eed331f9a666878363 Mon Sep 17 00:00:00 2001 From: Stefan Hillmich Date: Tue, 18 Jul 2023 15:02:52 +0200 Subject: [PATCH] Upgrade MQT Core (#263) * Upgrade MQT Core - Includes improved memory management - Adapt the simulator code - Added Tests --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .gitignore | 1 + apps/simple.cpp | 3 ++- extern/mqt-core | 2 +- include/DeterministicNoiseSimulator.hpp | 4 ++-- include/Simulator.hpp | 10 +++++----- include/UnitarySimulator.hpp | 2 +- mqt/ddsim/bindings.cpp | 2 +- src/Simulator.cpp | 8 ++++---- test/test_circuit_sim.cpp | 12 ++++-------- 9 files changed, 21 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 5d83cb3e..69a0d218 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ .idea venv/ .venv/ +.vscode/ *.egg-info/ __pycache__/ *.so diff --git a/apps/simple.cpp b/apps/simple.cpp index 3e0b221c..c0859f96 100644 --- a/apps/simple.cpp +++ b/apps/simple.cpp @@ -235,7 +235,8 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) } if (vm.count("pcomplex") > 0) { - outputObj["complex_stats"] = ddsim->dd->cn.complexTable.getStatistics(); + outputObj["complex_stats"]["cache_count"] = ddsim->dd->cn.cacheCount(); + outputObj["complex_stats"]["real_count"] = ddsim->dd->cn.realCount(); } if (vm.count("dump_complex") > 0) { diff --git a/extern/mqt-core b/extern/mqt-core index 58c8e207..48c27719 160000 --- a/extern/mqt-core +++ b/extern/mqt-core @@ -1 +1 @@ -Subproject commit 58c8e2073c35c63c9db9217ae26a10f207fb0dc5 +Subproject commit 48c27719745e7b72c75cfb08a2f1837bb1bba362 diff --git a/include/DeterministicNoiseSimulator.hpp b/include/DeterministicNoiseSimulator.hpp index f3897afa..762ded11 100644 --- a/include/DeterministicNoiseSimulator.hpp +++ b/include/DeterministicNoiseSimulator.hpp @@ -46,8 +46,8 @@ class DeterministicNoiseSimulator: public Simulator { [[nodiscard]] std::string getName() const override { return qc->getName(); }; - [[nodiscard]] std::size_t getActiveNodeCount() const override { return Simulator::dd->dUniqueTable.getActiveNodeCount(); } - [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->dUniqueTable.getMaxActiveNodes(); } + [[nodiscard]] std::size_t getActiveNodeCount() const override { return Simulator::dd->template getUniqueTable().getStats().activeEntryCount; } + [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->template getUniqueTable().getStats().peakActiveEntryCount; } [[nodiscard]] std::size_t countNodesFromRoot() override { if (useDensityMatrixType) { diff --git a/include/Simulator.hpp b/include/Simulator.hpp index c33e83de..1f78253c 100644 --- a/include/Simulator.hpp +++ b/include/Simulator.hpp @@ -84,13 +84,13 @@ class Simulator { return results; } - [[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->vUniqueTable.getActiveNodeCount(); } + [[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->template getUniqueTable().getStats().activeEntryCount; } - [[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->vUniqueTable.getMaxActiveNodes(); } + [[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->template getUniqueTable().getStats().peakActiveEntryCount; } - [[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->mUniqueTable.getMaxActiveNodes(); } + [[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->template getUniqueTable().getStats().activeEntryCount; } - [[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->mUniqueTable.getActiveNodeCount(); } + [[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->template getUniqueTable().getStats().activeEntryCount; } [[nodiscard]] virtual std::size_t countNodesFromRoot() { return dd->size(rootEdge); } @@ -118,7 +118,7 @@ class Simulator { dd->cn.setTolerance(tolerance); } [[nodiscard]] dd::fp getTolerance() const { - return dd->cn.complexTable.tolerance(); + return dd::RealNumber::eps; } [[nodiscard]] std::vector, std::vector>>> getNodeContributions(const dd::vEdge& edge) const; diff --git a/include/UnitarySimulator.hpp b/include/UnitarySimulator.hpp index 6516843e..c4866040 100644 --- a/include/UnitarySimulator.hpp +++ b/include/UnitarySimulator.hpp @@ -46,7 +46,7 @@ class UnitarySimulator: public CircuitSimulator { [[nodiscard]] qc::MatrixDD getConstructedDD() const { return e; } [[nodiscard]] double getConstructionTime() const { return constructionTime; } [[nodiscard]] std::size_t getFinalNodeCount() const { return Simulator::dd->size(e); } - [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->mUniqueTable.getPeakNodeCount(); } + [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->template getUniqueTable().getStats().peakActiveEntryCount; } private: qc::MatrixDD e{}; diff --git a/mqt/ddsim/bindings.cpp b/mqt/ddsim/bindings.cpp index 2c297324..35acb957 100644 --- a/mqt/ddsim/bindings.cpp +++ b/mqt/ddsim/bindings.cpp @@ -75,7 +75,7 @@ std::unique_ptr constructSimulatorWithoutSeed(const py::object& circ, void getNumpyMatrixRec(const qc::MatrixDD& e, const std::complex& amp, std::size_t i, std::size_t j, std::size_t dim, std::complex* mat) { // calculate new accumulated amplitude - auto w = std::complex{dd::CTEntry::val(e.w.r), dd::CTEntry::val(e.w.i)}; + auto w = std::complex{dd::RealNumber::val(e.w.r), dd::RealNumber::val(e.w.i)}; auto c = amp * w; // base case diff --git a/src/Simulator.cpp b/src/Simulator.cpp index 87c638e7..43f62819 100644 --- a/src/Simulator.cpp +++ b/src/Simulator.cpp @@ -157,8 +157,8 @@ double Simulator::approximateByFidelity(std::unique_ptrcn.getCached(std::sqrt(CN::mag2(newEdge.w)), 0); CN::div(c, newEdge.w, c); newEdge.w = localDD->cn.lookup(c); @@ -325,7 +325,7 @@ std::pair Simulator::getPathOfLeastResist } std::string result(getNumberOfQubits(), '0'); - dd::Complex pathValue = dd->cn.getCached(dd::CTEntry::val(rootEdge.w.r), dd::CTEntry::val(rootEdge.w.i)); + dd::Complex pathValue = dd->cn.getCached(dd::RealNumber::val(rootEdge.w.r), dd::RealNumber::val(rootEdge.w.i)); dd::vEdge cur = rootEdge; for (dd::Qubit i = rootEdge.p->v; i >= 0; --i) { dd::fp p0 = dd::ComplexNumbers::mag2(cur.p->e.at(0).w); @@ -347,7 +347,7 @@ std::pair Simulator::getPathOfLeastResist } } - return {{dd::CTEntry::val(pathValue.r), dd::CTEntry::val(pathValue.i)}, + return {{dd::RealNumber::val(pathValue.r), dd::RealNumber::val(pathValue.i)}, std::string{result.rbegin(), result.rend()}}; } diff --git a/test/test_circuit_sim.cpp b/test/test_circuit_sim.cpp index 140459d8..929b0e0f 100644 --- a/test/test_circuit_sim.cpp +++ b/test/test_circuit_sim.cpp @@ -215,19 +215,16 @@ TEST(CircuitSimTest, GRCS4x4Test) { CircuitSimulator ddsim(std::make_unique("circuits/inst_4x4_10_0.txt")); auto m = ddsim.simulate(100); EXPECT_GT(m.size(), 0); - ddsim.dd->cn.complexTable.printStatistics(); } { CircuitSimulator ddsim(std::make_unique("circuits/inst_4x4_10_1.txt")); auto m = ddsim.simulate(100); EXPECT_GT(m.size(), 0); - ddsim.dd->cn.complexTable.printStatistics(); } { CircuitSimulator ddsim(std::make_unique("circuits/inst_4x4_10_2.txt")); auto m = ddsim.simulate(100); EXPECT_GT(m.size(), 0); - ddsim.dd->cn.complexTable.printStatistics(); } } @@ -243,6 +240,8 @@ TEST(CircuitSimTest, TestingProperties) { EXPECT_EQ(ddsim.getMaxMatrixNodeCount(), 0); EXPECT_EQ(ddsim.getMatrixActiveNodeCount(), 0); EXPECT_EQ(ddsim.countNodesFromRoot(), 7); + EXPECT_EQ(ddsim.getSeed(), "1"); + EXPECT_EQ(ddsim.additionalStatistics().at("approximation_runs"), "0"); } TEST(CircuitSimTest, ApproximationTest) { @@ -301,15 +300,12 @@ TEST(CircuitSimTest, ToleranceTest) { // A small test to make sure that setting and getting the tolerance works auto qc = std::make_unique(2); CircuitSimulator ddsim(std::move(qc)); - const auto tolerance = ddsim.getTolerance(); - EXPECT_EQ(tolerance, dd::ComplexTable::tolerance()); - const auto newTolerance = 0.1; + const auto tolerance = ddsim.getTolerance(); + const auto newTolerance = 0.1; ddsim.setTolerance(newTolerance); EXPECT_EQ(ddsim.getTolerance(), newTolerance); - EXPECT_EQ(dd::ComplexTable::tolerance(), newTolerance); ddsim.setTolerance(tolerance); EXPECT_EQ(ddsim.getTolerance(), tolerance); - EXPECT_EQ(dd::ComplexTable::tolerance(), tolerance); } TEST(CircuitSimTest, TooManyQubitsForVectorTest) {