From 044c6f1b71b1bba23294db9a0ec0fa00254a9627 Mon Sep 17 00:00:00 2001 From: burgholzer Date: Sun, 1 Oct 2023 11:42:38 +0200 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=91=BD=20adjust=20to=20new=20mqt-core?= =?UTF-8?q?=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- apps/noise_aware.cpp | 4 +- apps/simple.cpp | 18 +++- extern/mqt-core | 2 +- include/DeterministicNoiseSimulator.hpp | 12 +-- include/HybridSchrodingerFeynmanSimulator.hpp | 16 +--- include/Simulator.hpp | 36 ++----- include/UnitarySimulator.hpp | 4 +- src/CircuitSimulator.cpp | 4 +- src/DeterministicNoiseSimulator.cpp | 7 +- src/HybridSchrodingerFeynmanSimulator.cpp | 6 +- src/ShorFastSimulator.cpp | 2 +- src/ShorSimulator.cpp | 4 +- src/Simulator.cpp | 28 +----- src/StochasticNoiseSimulator.cpp | 11 ++- src/python/bindings.cpp | 4 +- test/test_circuit_sim.cpp | 35 +++---- test/test_det_noise_sim.cpp | 94 +++++++++---------- test/test_hybridsim.cpp | 20 ++-- test/test_path_sim.cpp | 53 +++++------ test/test_stoch_noise_sim.cpp | 50 +++++----- 20 files changed, 182 insertions(+), 228 deletions(-) diff --git a/apps/noise_aware.cpp b/apps/noise_aware.cpp index 1c1161b6..305a625c 100644 --- a/apps/noise_aware.cpp +++ b/apps/noise_aware.cpp @@ -118,7 +118,7 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) auto t1 = std::chrono::steady_clock::now(); - const std::map measurementResults = ddsim->deterministicSimulate(); + const auto measurementResults = ddsim->deterministicSimulate(); auto t2 = std::chrono::steady_clock::now(); @@ -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"; } } diff --git a/apps/simple.cpp b/apps/simple.cpp index c0859f96..fac3f473 100644 --- a/apps/simple.cpp +++ b/apps/simple.cpp @@ -19,6 +19,18 @@ namespace nl = nlohmann; +namespace std { + template + void to_json(nl::json& j, const std::complex& p) { // NOLINT(readability-identifier-naming) + j = nl::json{p.real(), p.imag()}; + } + template + void from_json(const nl::json& j, std::complex& 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 @@ -211,9 +223,9 @@ int main(int argc, char** argv) { // NOLINT(bugprone-exception-escape) if (vm.count("pv") > 0) { if (auto* hsfSim = dynamic_cast*>(ddsim.get())) { - outputObj["state_vector"] = hsfSim->getVectorFromHybridSimulation>(); + outputObj["state_vector"] = hsfSim->getVectorFromHybridSimulation(); } else { - outputObj["state_vector"] = ddsim->getVector>(); + outputObj["state_vector"] = ddsim->getVector(); } } @@ -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"; } diff --git a/extern/mqt-core b/extern/mqt-core index 0e8afc48..0d1b4f41 160000 --- a/extern/mqt-core +++ b/extern/mqt-core @@ -1 +1 @@ -Subproject commit 0e8afc486515df7258f1dd47800803b0154f0bbb +Subproject commit 0d1b4f4185be5547300d0c33e3f0a2ff982d05e2 diff --git a/include/DeterministicNoiseSimulator.hpp b/include/DeterministicNoiseSimulator.hpp index e1440e62..5aa4d30f 100644 --- a/include/DeterministicNoiseSimulator.hpp +++ b/include/DeterministicNoiseSimulator.hpp @@ -36,9 +36,9 @@ class DeterministicNoiseSimulator: public Simulator { return sampleFromProbabilityMap(deterministicSimulate(), shots); }; - std::map deterministicSimulate(); + dd::SparsePVecStrKeys deterministicSimulate(); - std::map sampleFromProbabilityMap(const std::map& resultProbabilityMap, std::size_t shots); + std::map sampleFromProbabilityMap(const dd::SparsePVecStrKeys& resultProbabilityMap, std::size_t shots); [[nodiscard]] std::size_t getNumberOfQubits() const override { return qc->getNqubits(); }; @@ -46,17 +46,17 @@ class DeterministicNoiseSimulator: public Simulator { [[nodiscard]] std::string getName() const override { return qc->getName(); }; - [[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 getActiveNodeCount() const override { return Simulator::dd->template getUniqueTable().getNumActiveEntries(); } + [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->template getUniqueTable().getPeakNumActiveEntries(); } [[nodiscard]] std::size_t countNodesFromRoot() override { if (useDensityMatrixType) { qc::DensityMatrixDD::alignDensityEdge(rootEdge); - const std::size_t tmp = Simulator::dd->size(rootEdge); + const std::size_t tmp = rootEdge.size(); qc::DensityMatrixDD::setDensityMatrixTrue(rootEdge); return tmp; } - return Simulator::dd->size(rootEdge); + return rootEdge.size(); } qc::DensityMatrixDD rootEdge{}; diff --git a/include/HybridSchrodingerFeynmanSimulator.hpp b/include/HybridSchrodingerFeynmanSimulator.hpp index 52a9dafb..71271081 100644 --- a/include/HybridSchrodingerFeynmanSimulator.hpp +++ b/include/HybridSchrodingerFeynmanSimulator.hpp @@ -49,21 +49,15 @@ class HybridSchrodingerFeynmanSimulator: public CircuitSimulator { Mode mode = Mode::Amplitude; - template - [[nodiscard]] std::vector getVectorFromHybridSimulation() const { + [[nodiscard]] dd::CVec getVectorFromHybridSimulation() const { if (CircuitSimulator::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) { - return finalAmplitudes; - } - std::vector amplitudes; - std::transform(finalAmplitudes.begin(), finalAmplitudes.end(), std::back_inserter(amplitudes), [](std::complex x) -> ReturnType { return {x.real(), x.imag()}; }); - return amplitudes; + return finalAmplitudes; } - return CircuitSimulator::template getVector(); + return CircuitSimulator::getVector(); } // Get # of decisions for given split_qubit, so that lower slice: q0 < i < qubit; upper slice: qubit <= i < nqubits @@ -72,8 +66,8 @@ class HybridSchrodingerFeynmanSimulator: public CircuitSimulator { [[nodiscard]] Mode getMode() const { return mode; } private: - std::size_t nthreads = 2; - std::vector> finalAmplitudes{}; + std::size_t nthreads = 2; + dd::CVec finalAmplitudes{}; void simulateHybridTaskflow(qc::Qubit splitQubit); void simulateHybridAmplitudes(qc::Qubit splitQubit); diff --git a/include/Simulator.hpp b/include/Simulator.hpp index 7a368697..d6a3b775 100644 --- a/include/Simulator.hpp +++ b/include/Simulator.hpp @@ -66,33 +66,23 @@ class Simulator { std::map sampleFromAmplitudeVectorInPlace(std::vector>& amplitudes, std::size_t shots); - template - [[nodiscard]] std::vector 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 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().getStats().activeEntryCount; } + [[nodiscard]] virtual std::size_t getActiveNodeCount() const { return dd->template getUniqueTable().getNumActiveEntries(); } - [[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->template getUniqueTable().getStats().peakActiveEntryCount; } + [[nodiscard]] virtual std::size_t getMaxNodeCount() const { return dd->template getUniqueTable().getPeakNumActiveEntries(); } - [[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->template getUniqueTable().getStats().activeEntryCount; } + [[nodiscard]] virtual std::size_t getMaxMatrixNodeCount() const { return dd->template getUniqueTable().getPeakNumActiveEntries(); } - [[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->template getUniqueTable().getStats().activeEntryCount; } + [[nodiscard]] virtual std::size_t getMatrixActiveNodeCount() const { return dd->template getUniqueTable().getNumActiveEntries(); } - [[nodiscard]] virtual std::size_t countNodesFromRoot() { return dd->size(rootEdge); } + [[nodiscard]] virtual std::size_t countNodesFromRoot() { return rootEdge.size(); } [[nodiscard]] std::pair getPathOfLeastResistance() const; @@ -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); } @@ -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 { diff --git a/include/UnitarySimulator.hpp b/include/UnitarySimulator.hpp index c4866040..a8f78103 100644 --- a/include/UnitarySimulator.hpp +++ b/include/UnitarySimulator.hpp @@ -45,8 +45,8 @@ class UnitarySimulator: public CircuitSimulator { [[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::dd->size(e); } - [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->template getUniqueTable().getStats().peakActiveEntryCount; } + [[nodiscard]] std::size_t getFinalNodeCount() const { return e.size(); } + [[nodiscard]] std::size_t getMaxNodeCount() const override { return Simulator::dd->template getUniqueTable().getPeakNumActiveEntries(); } private: qc::MatrixDD e{}; diff --git a/src/CircuitSimulator.cpp b/src/CircuitSimulator.cpp index e5b089f3..24817bc3 100644 --- a/src/CircuitSimulator.cpp +++ b/src/CircuitSimulator.cpp @@ -185,7 +185,7 @@ std::map CircuitSimulator::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::dd->size(Simulator::rootEdge); + [[maybe_unused]] const auto sizeBefore = Simulator::rootEdge.size(); const auto apFid = Simulator::approximateByFidelity(approximationInfo.stepFidelity, false, true); approximationRuns++; finalFidelity *= static_cast(apFid); @@ -197,7 +197,7 @@ std::map CircuitSimulator::singleShot(const bool igno << "; #runs=" << approximation_runs << "\n";//*/ } else if (approximationInfo.strategy == ApproximationInfo::MemoryDriven) { - [[maybe_unused]] const auto sizeBefore = Simulator::dd->size(Simulator::rootEdge); + [[maybe_unused]] const auto sizeBefore = Simulator::rootEdge.size(); if (Simulator::dd->template getUniqueTable().possiblyNeedsCollection()) { const auto apFid = Simulator::approximateByFidelity(approximationInfo.stepFidelity, false, true); approximationRuns++; diff --git a/src/DeterministicNoiseSimulator.cpp b/src/DeterministicNoiseSimulator.cpp index 43b30877..abc25648 100644 --- a/src/DeterministicNoiseSimulator.cpp +++ b/src/DeterministicNoiseSimulator.cpp @@ -5,7 +5,7 @@ using CN = dd::ComplexNumbers; template -std::map DeterministicNoiseSimulator::deterministicSimulate() { +dd::SparsePVecStrKeys DeterministicNoiseSimulator::deterministicSimulate() { rootEdge = Simulator::dd->makeZeroDensityOperator(static_cast(qc->getNqubits())); Simulator::dd->incRef(rootEdge); @@ -42,12 +42,11 @@ std::map DeterministicNoiseSimulator::deterministic deterministicNoiseFunctionality.applyNoiseEffects(rootEdge, op); } - return Simulator::dd->getProbVectorFromDensityMatrix(rootEdge, measurementThreshold); + return rootEdge.getSparseProbabilityVectorStrKeys(measurementThreshold); } template -std::map DeterministicNoiseSimulator::sampleFromProbabilityMap(const std::map& resultProbabilityMap, std::size_t shots) { - // Create probability distribution from measure probabilities +std::map DeterministicNoiseSimulator::sampleFromProbabilityMap(const dd::SparsePVecStrKeys& resultProbabilityMap, std::size_t shots) { std::vector weights; weights.reserve(resultProbabilityMap.size()); diff --git a/src/HybridSchrodingerFeynmanSimulator.cpp b/src/HybridSchrodingerFeynmanSimulator.cpp index 1f1845c0..3366294b 100644 --- a/src/HybridSchrodingerFeynmanSimulator.cpp +++ b/src/HybridSchrodingerFeynmanSimulator.cpp @@ -244,11 +244,11 @@ void HybridSchrodingerFeynmanSimulator::simulateHybridAmplitudes(qc::Qub const auto requiredVectors = static_cast(std::ceil(static_cast(maxControl) / static_cast(nslicesOnOneCpu))); Simulator::rootEdge = qc::VectorDD::zero; - std::vector>> amplitudes(requiredVectors, std::vector>(1U << nqubits, {0, 0})); + std::vector 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, &litudes, nslicesOnOneCpu, control, nqubits, splitQubit, maxControl]() { + executor.silent_async([this, i, &litudes, nslicesOnOneCpu, control, splitQubit, maxControl]() { const auto currentThread = i; std::vector>& threadAmplitudes = amplitudes.at(currentThread); @@ -259,7 +259,7 @@ void HybridSchrodingerFeynmanSimulator::simulateHybridAmplitudes(qc::Qub } std::unique_ptr> sliceDD = std::make_unique>(CircuitSimulator::getNumberOfQubits()); auto result = simulateSlicing(sliceDD, splitQubit, totalControl); - sliceDD->addAmplitudes(result, threadAmplitudes, static_cast(nqubits)); + result.addToVector(threadAmplitudes); } }); } diff --git a/src/ShorFastSimulator.cpp b/src/ShorFastSimulator.cpp index 9707115b..e6e9d2ba 100644 --- a/src/ShorFastSimulator.cpp +++ b/src/ShorFastSimulator.cpp @@ -63,7 +63,7 @@ std::map ShorFastSimulator::simulate([[maybe_u uAEmulate2(as[i]); if (verbose) { - std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator::dd->size(Simulator::rootEdge) + std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator::rootEdge.size() << "\n"; } diff --git a/src/ShorSimulator.cpp b/src/ShorSimulator.cpp index 836cb7d7..1bf20f1b 100644 --- a/src/ShorSimulator.cpp +++ b/src/ShorSimulator.cpp @@ -68,13 +68,13 @@ std::map ShorSimulator::simulate([[maybe_unuse } if (verbose) { - std::clog << "Nodes before QFT: " << Simulator::dd->size(Simulator::rootEdge) << "\n"; + std::clog << "Nodes before QFT: " << Simulator::rootEdge.size() << "\n"; } //EXACT QFT for (std::int32_t i = 0; i < static_cast(2 * requiredBits); i++) { if (verbose) { - std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator::dd->size(Simulator::rootEdge) + std::clog << "[ " << i + 1 << "/" << 2 * requiredBits << " ] QFT Pass. dd size=" << Simulator::rootEdge.size() << "\n"; } double q = 2; diff --git a/src/Simulator.cpp b/src/Simulator.cpp index 352ee3e9..09b1cd87 100644 --- a/src/Simulator.cpp +++ b/src/Simulator.cpp @@ -28,30 +28,12 @@ std::map Simulator::sampleFromAmplitudeVectorI auto m = std::distance(amplitudes.begin(), mit); // construct basis state string - auto basisState = toBinaryString(static_cast(m), getNumberOfQubits()); + auto basisState = dd::intToBinaryString(static_cast(m), getNumberOfQubits()); results[basisState]++; } return results; } -template -void Simulator::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('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 @@ -169,8 +151,8 @@ double Simulator::approximateByFidelity(std::unique_ptrsize(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 @@ -258,8 +240,8 @@ double Simulator::approximateBySampling(std::unique_ptrsize(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 diff --git a/src/StochasticNoiseSimulator.cpp b/src/StochasticNoiseSimulator.cpp index d4e01377..4fa815b6 100644 --- a/src/StochasticNoiseSimulator.cpp +++ b/src/StochasticNoiseSimulator.cpp @@ -243,10 +243,12 @@ void StochasticNoiseSimulator::runStochSimulationForId(std::size_t controls = op->getControls(); if (targets.size() == 1 && controls.empty()) { - operation = localDD->stochasticNoiseOperationCache.lookup(op->getType(), static_cast(targets.front())); - if (operation.p == nullptr) { + auto* oper = localDD->stochasticNoiseOperationCache.lookup(op->getType(), static_cast(targets.front())); + if (oper == nullptr) { operation = dd::getDD(op.get(), localDD); localDD->stochasticNoiseOperationCache.insert(op->getType(), static_cast(targets.front()), operation); + } else { + operation = *oper; } } else { operation = dd::getDD(op.get(), localDD); @@ -293,9 +295,8 @@ void StochasticNoiseSimulator::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); } } } diff --git a/src/python/bindings.cpp b/src/python/bindings.cpp index e1850c23..e1b5ac61 100644 --- a/src/python/bindings.cpp +++ b/src/python/bindings.cpp @@ -161,7 +161,7 @@ py::class_ createSimulator(py::module_ m, const std::string& name) { sim.def("construct", &Sim::construct, "Construct the DD representing the unitary matrix of the circuit."); } else { sim.def("simulate", &Sim::simulate, "shots"_a, "Simulate the circuit and return the result as a dictionary of counts."); - sim.def("get_vector", &Sim::template getVector>, "Get the state vector resulting from the simulation."); + sim.def("get_vector", &Sim::getVector, "Get the state vector resulting from the simulation."); } return sim; } @@ -195,7 +195,7 @@ PYBIND11_MODULE(pyddsim, m) { "mode"_a = HybridSchrodingerFeynmanSimulator<>::Mode::Amplitude, "nthreads"_a = 2) .def("get_mode", &HybridSchrodingerFeynmanSimulator<>::getMode) - .def("get_final_amplitudes", &HybridSchrodingerFeynmanSimulator<>::template getVectorFromHybridSimulation>); + .def("get_final_amplitudes", &HybridSchrodingerFeynmanSimulator<>::getVectorFromHybridSimulation); // Path Simulator py::enum_::Configuration::Mode>(m, "PathSimulatorMode") diff --git a/test/test_circuit_sim.cpp b/test/test_circuit_sim.cpp index 11a285f2..cc68e5b6 100644 --- a/test/test_circuit_sim.cpp +++ b/test/test_circuit_sim.cpp @@ -109,7 +109,7 @@ TEST(CircuitSimTest, DestructiveMeasurementAll) { CircuitSimulator ddsim(std::move(quantumComputation), 42); ddsim.simulate(1); - const std::vector vBefore = ddsim.getVector(); + const auto vBefore = ddsim.getVector(); ASSERT_EQ(vBefore[0], vBefore[1]); ASSERT_EQ(vBefore[0], vBefore[2]); ASSERT_EQ(vBefore[0], vBefore[3]); @@ -118,8 +118,8 @@ TEST(CircuitSimTest, DestructiveMeasurementAll) { const auto vAfter = ddsim.getVector(); const std::size_t i = std::stoul(m, nullptr, 2); - ASSERT_EQ(vAfter[i].r, 1.0); - ASSERT_EQ(vAfter[i].i, 0.0); + ASSERT_EQ(vAfter[i].real(), 1.0); + ASSERT_EQ(vAfter[i].imag(), 0.0); } TEST(CircuitSimTest, DestructiveMeasurementOne) { @@ -133,27 +133,18 @@ TEST(CircuitSimTest, DestructiveMeasurementOne) { const auto vAfter = ddsim.getVector(); if (m == '0') { - ASSERT_EQ(vAfter[0], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[2], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[1], dd::complex_zero); - ASSERT_EQ(vAfter[3], dd::complex_zero); + ASSERT_EQ(vAfter[0], dd::SQRT2_2); + ASSERT_EQ(vAfter[2], dd::SQRT2_2); + ASSERT_EQ(vAfter[1], 0.); + ASSERT_EQ(vAfter[3], 0.); } else if (m == '1') { - ASSERT_EQ(vAfter[0], dd::complex_zero); - ASSERT_EQ(vAfter[2], dd::complex_zero); - ASSERT_EQ(vAfter[1], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[3], dd::complex_SQRT2_2); + ASSERT_EQ(vAfter[0], 0.); + ASSERT_EQ(vAfter[2], 0.); + ASSERT_EQ(vAfter[1], dd::SQRT2_2); + ASSERT_EQ(vAfter[3], dd::SQRT2_2); } else { FAIL() << "Measurement result not in {0,1}!"; } - - const auto vAfterPairs = ddsim.getVector>(); - const auto vAfterCompl = ddsim.getVector>(); - - ASSERT_EQ(vAfterPairs.size(), vAfterCompl.size()); - for (std::size_t i = 0; i < vAfterPairs.size(); i++) { - ASSERT_EQ(vAfterPairs.at(i).first, vAfterCompl.at(i).real()); - ASSERT_EQ(vAfterPairs.at(i).second, vAfterCompl.at(i).imag()); - } } TEST(CircuitSimTest, ApproximateByFidelity) { @@ -256,7 +247,7 @@ TEST(CircuitSimTest, ApproximationTest) { // approximating the state with fidelity 0.98 should allow to eliminate the 1-successor of the first qubit CircuitSimulator ddsim(std::move(qc), ApproximationInfo(0.98, 2, ApproximationInfo::FidelityDriven)); ddsim.simulate(4096); - const auto vec = ddsim.getVector>(); + const auto vec = ddsim.getVector(); EXPECT_EQ(abs(vec[2]), 0); EXPECT_EQ(abs(vec[3]), 0); } @@ -315,7 +306,7 @@ TEST(CircuitSimTest, TooManyQubitsForVectorTest) { auto qc = std::make_unique(61); CircuitSimulator ddsim(std::move(qc)); ddsim.simulate(0); - EXPECT_THROW({ [[maybe_unused]] auto _ = ddsim.getVector>(); }, std::range_error); + EXPECT_THROW({ [[maybe_unused]] auto _ = ddsim.getVector(); }, std::range_error); } TEST(CircuitSimTest, BernsteinVaziraniDynamicTest) { diff --git a/test/test_det_noise_sim.cpp b/test/test_det_noise_sim.cpp index 0094abf2..0558ad57 100644 --- a/test/test_det_noise_sim.cpp +++ b/test/test_det_noise_sim.cpp @@ -61,7 +61,7 @@ TEST(DeterministicNoiseSimTest, TestingBarrierGate) { auto m = ddsim->deterministicSimulate(); ASSERT_EQ(ddsim->getNumberOfOps(), 2); - ASSERT_EQ(m.find("10")->second, 1); + ASSERT_EQ(m.find("01")->second, 1); std::cout << ddsim->getName() << "\n"; } @@ -80,7 +80,7 @@ TEST(DeterministicNoiseSimTest, SingleOneQubitGateOnTwoQubitCircuit) { auto m = ddsim->deterministicSimulate(); ASSERT_EQ(ddsim->getNumberOfOps(), 1); - ASSERT_EQ(m.find("10")->second, 1); + ASSERT_EQ(m.find("01")->second, 1); } TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAPDApplySequential) { @@ -92,19 +92,19 @@ TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAPDApplySequential) { const double tolerance = 1e-10; EXPECT_NEAR(m.find("0000")->second, 0.0969332192741, tolerance); - EXPECT_NEAR(m.find("0001")->second, 0.0907888041538, tolerance); - EXPECT_NEAR(m.find("0010")->second, 0.0141409660985, tolerance); - EXPECT_NEAR(m.find("0100")->second, 0.0238203475524, tolerance); - EXPECT_NEAR(m.find("0101")->second, 0.0235097990017, tolerance); + EXPECT_NEAR(m.find("0001")->second, 0.1731941264570, tolerance); + EXPECT_NEAR(m.find("0010")->second, 0.0238203475524, tolerance); + EXPECT_NEAR(m.find("0011")->second, 0.0242454336917, tolerance); + EXPECT_NEAR(m.find("0100")->second, 0.0141409660985, tolerance); + EXPECT_NEAR(m.find("0101")->second, 0.0138062113213, tolerance); EXPECT_NEAR(m.find("0110")->second, 0.0244576087400, tolerance); - EXPECT_NEAR(m.find("0111")->second, 0.0116282811276, tolerance); - EXPECT_NEAR(m.find("1000")->second, 0.1731941264570, tolerance); + EXPECT_NEAR(m.find("0111")->second, 0.0239296920989, tolerance); + EXPECT_NEAR(m.find("1000")->second, 0.0907888041538, tolerance); EXPECT_NEAR(m.find("1001")->second, 0.4145855071998, tolerance); - EXPECT_NEAR(m.find("1010")->second, 0.0138062113213, tolerance); - EXPECT_NEAR(m.find("1011")->second, 0.0184033482066, tolerance); - EXPECT_NEAR(m.find("1100")->second, 0.0242454336917, tolerance); - EXPECT_NEAR(m.find("1101")->second, 0.0262779844799, tolerance); - EXPECT_NEAR(m.find("1110")->second, 0.0239296920989, tolerance); + EXPECT_NEAR(m.find("1010")->second, 0.0235097990017, tolerance); + EXPECT_NEAR(m.find("1011")->second, 0.0262779844799, tolerance); + EXPECT_NEAR(m.find("1101")->second, 0.0184033482066, tolerance); + EXPECT_NEAR(m.find("1110")->second, 0.0116282811276, tolerance); EXPECT_NEAR(m.find("1111")->second, 0.0110373166627, tolerance); } @@ -117,15 +117,15 @@ TEST(DeterministicNoiseSimTest, SimulateAdder4TrackD) { const double tolerance = 1e-10; EXPECT_NEAR(m.find("0000")->second, 0.0332328704931, tolerance); - EXPECT_NEAR(m.find("0001")->second, 0.0328434857577, tolerance); - EXPECT_NEAR(m.find("0010")->second, 0.0129643065735, tolerance); - EXPECT_NEAR(m.find("1000")->second, 0.0683938280189, tolerance); + EXPECT_NEAR(m.find("0001")->second, 0.0683938280189, tolerance); + EXPECT_NEAR(m.find("0011")->second, 0.0117061689898, tolerance); + EXPECT_NEAR(m.find("0100")->second, 0.0129643065735, tolerance); + EXPECT_NEAR(m.find("0101")->second, 0.0107812802908, tolerance); + EXPECT_NEAR(m.find("0111")->second, 0.0160082331009, tolerance); + EXPECT_NEAR(m.find("1000")->second, 0.0328434857577, tolerance); EXPECT_NEAR(m.find("1001")->second, 0.7370101351171, tolerance); - EXPECT_NEAR(m.find("1010")->second, 0.0107812802908, tolerance); - EXPECT_NEAR(m.find("1011")->second, 0.0275086747656, tolerance); - EXPECT_NEAR(m.find("1100")->second, 0.0117061689898, tolerance); - EXPECT_NEAR(m.find("1101")->second, 0.0186346925411, tolerance); - EXPECT_NEAR(m.find("1110")->second, 0.0160082331009, tolerance); + EXPECT_NEAR(m.find("1011")->second, 0.0186346925411, tolerance); + EXPECT_NEAR(m.find("1101")->second, 0.0275086747656, tolerance); } TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAPD) { @@ -137,19 +137,19 @@ TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAPD) { const double tolerance = 1e-10; EXPECT_NEAR(m.find("0000")->second, 0.0969332192741, tolerance); - EXPECT_NEAR(m.find("0001")->second, 0.0907888041538, tolerance); - EXPECT_NEAR(m.find("0010")->second, 0.0141409660985, tolerance); - EXPECT_NEAR(m.find("0100")->second, 0.0238203475524, tolerance); - EXPECT_NEAR(m.find("0101")->second, 0.0235097990017, tolerance); + EXPECT_NEAR(m.find("0001")->second, 0.1731941264570, tolerance); + EXPECT_NEAR(m.find("0010")->second, 0.0238203475524, tolerance); + EXPECT_NEAR(m.find("0011")->second, 0.0242454336917, tolerance); + EXPECT_NEAR(m.find("0100")->second, 0.0141409660985, tolerance); + EXPECT_NEAR(m.find("0101")->second, 0.0138062113213, tolerance); EXPECT_NEAR(m.find("0110")->second, 0.0244576087400, tolerance); - EXPECT_NEAR(m.find("0111")->second, 0.0116282811276, tolerance); - EXPECT_NEAR(m.find("1000")->second, 0.1731941264570, tolerance); + EXPECT_NEAR(m.find("0111")->second, 0.0239296920989, tolerance); + EXPECT_NEAR(m.find("1000")->second, 0.0907888041538, tolerance); EXPECT_NEAR(m.find("1001")->second, 0.4145855071998, tolerance); - EXPECT_NEAR(m.find("1010")->second, 0.0138062113213, tolerance); - EXPECT_NEAR(m.find("1011")->second, 0.0184033482066, tolerance); - EXPECT_NEAR(m.find("1100")->second, 0.0242454336917, tolerance); - EXPECT_NEAR(m.find("1101")->second, 0.0262779844799, tolerance); - EXPECT_NEAR(m.find("1110")->second, 0.0239296920989, tolerance); + EXPECT_NEAR(m.find("1010")->second, 0.0235097990017, tolerance); + EXPECT_NEAR(m.find("1011")->second, 0.0262779844799, tolerance); + EXPECT_NEAR(m.find("1101")->second, 0.0184033482066, tolerance); + EXPECT_NEAR(m.find("1110")->second, 0.0116282811276, tolerance); EXPECT_NEAR(m.find("1111")->second, 0.0110373166627, tolerance); } @@ -161,7 +161,7 @@ TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAP) { std::cout << std::setw(2) << nlohmann::json(m) << "\n"; const double tolerance = 1e-10; - EXPECT_NEAR(m.find("1000")->second, 0.03008702498522842, tolerance); + EXPECT_NEAR(m.find("0001")->second, 0.03008702498522842, tolerance); EXPECT_NEAR(m.find("1001")->second, 0.9364832248561167, tolerance); } @@ -179,16 +179,16 @@ TEST(DeterministicNoiseSimTest, SimulateAdder4TrackAPDCustomProb) { const double tolerance = 1e-10; EXPECT_NEAR(m.find("0000")->second, 0.0616548044047, tolerance); - EXPECT_NEAR(m.find("0001")->second, 0.0570878674208, tolerance); - EXPECT_NEAR(m.find("0100")->second, 0.0155601736851, tolerance); - EXPECT_NEAR(m.find("0101")->second, 0.0157508473593, tolerance); + EXPECT_NEAR(m.find("0001")->second, 0.1487734834937, tolerance); + EXPECT_NEAR(m.find("0010")->second, 0.0155601736851, tolerance); + EXPECT_NEAR(m.find("0011")->second, 0.0166178042857, tolerance); EXPECT_NEAR(m.find("0110")->second, 0.0301651684817, tolerance); - EXPECT_NEAR(m.find("1000")->second, 0.1487734834937, tolerance); + EXPECT_NEAR(m.find("0111")->second, 0.0301853251959, tolerance); + EXPECT_NEAR(m.find("1000")->second, 0.0570878674208, tolerance); EXPECT_NEAR(m.find("1001")->second, 0.5519250213313, tolerance); - EXPECT_NEAR(m.find("1011")->second, 0.0132640682125, tolerance); - EXPECT_NEAR(m.find("1100")->second, 0.0166178042857, tolerance); - EXPECT_NEAR(m.find("1101")->second, 0.0187340765889, tolerance); - EXPECT_NEAR(m.find("1110")->second, 0.0301853251959, tolerance); + EXPECT_NEAR(m.find("1010")->second, 0.0157508473593, tolerance); + EXPECT_NEAR(m.find("1011")->second, 0.0187340765889, tolerance); + EXPECT_NEAR(m.find("1101")->second, 0.0132640682125, tolerance); } TEST(DeterministicNoiseSimTest, SimulateAdder4NoNoise1) { @@ -237,8 +237,6 @@ TEST(DeterministicNoiseSimTest, TestFunctionsUnOptimized) { EXPECT_EQ(ddsim->getMaxMatrixNodeCount(), 0); EXPECT_EQ(ddsim->getMatrixActiveNodeCount(), 0); EXPECT_EQ(ddsim->countNodesFromRoot(), 30); - - EXPECT_TRUE(ddsim->toBinaryString(9, 6) == "001001"); } TEST(DeterministicNoiseSimTest, TestingSimulatorFunctionality) { @@ -265,8 +263,9 @@ TEST(DeterministicNoiseSimTest, sampleFromProbabilityMap1) { auto sampledShots = ddsim->sampleFromProbabilityMap(m, shots); double const tolerance = 0.01; - for (auto& result: m) { - EXPECT_NEAR(result.second, static_cast(sampledShots.find(result.first)->second) / shots, tolerance); + for (const auto& [state, prob]: m) { + const auto relFreq = static_cast(sampledShots.find(state)->second) / shots; + EXPECT_NEAR(prob, relFreq, tolerance); } } @@ -280,7 +279,8 @@ TEST(DeterministicNoiseSimTest, sampleFromProbabilityMap2) { auto m = ddsim->deterministicSimulate(); double const tolerance = 0.01; - for (auto& result: m) { - EXPECT_NEAR(result.second, static_cast(sampledShots.find(result.first)->second) / shots, tolerance); + for (const auto& [state, prob]: m) { + const auto relFreq = static_cast(sampledShots.find(state)->second) / shots; + EXPECT_NEAR(prob, relFreq, tolerance); } } diff --git a/test/test_hybridsim.cpp b/test/test_hybridsim.cpp index 9ceccc91..5e3c6c91 100644 --- a/test/test_hybridsim.cpp +++ b/test/test_hybridsim.cpp @@ -91,8 +91,8 @@ TEST(HybridSimTest, GRCSTestDD) { if (result != ref) { // if edges are not equal -> compare amplitudes - auto refAmplitudes = dd->getVector(ref); - auto resultAmplitudes = dd->getVector(result); + auto refAmplitudes = ref.getVector(); + auto resultAmplitudes = result.getVector(); for (std::size_t i = 0; i < refAmplitudes.size(); ++i) { if (std::abs(refAmplitudes[i].real() - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].imag() - resultAmplitudes[i].imag()) > 1e-6) { FAIL() << "Differing values on entry " << i; @@ -114,9 +114,9 @@ TEST(HybridSimTest, GRCSTestAmplitudes) { // if edges are not equal -> compare amplitudes const auto refAmplitudes = ddsim.getVector(); - const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation>(); + const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation(); for (std::size_t i = 0; i < refAmplitudes.size(); ++i) { - if (std::abs(refAmplitudes[i].r - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].i - resultAmplitudes[i].imag()) > 1e-6) { + if (std::abs(refAmplitudes[i].real() - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].imag() - resultAmplitudes[i].imag()) > 1e-6) { FAIL() << "Differing values on entry " << i; } } @@ -136,9 +136,9 @@ TEST(HybridSimTest, GRCSTestFixedSeed) { // if edges are not equal -> compare amplitudes const auto refAmplitudes = ddsim.getVector(); - const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation>(); + const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation(); for (std::size_t i = 0; i < refAmplitudes.size(); ++i) { - if (std::abs(refAmplitudes[i].r - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].i - resultAmplitudes[i].imag()) > 1e-6) { + if (std::abs(refAmplitudes[i].real() - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].imag() - resultAmplitudes[i].imag()) > 1e-6) { FAIL() << "Differing values on entry " << i; } } @@ -158,10 +158,10 @@ TEST(HybridSimTest, GRCSTestFixedSeedDifferentVectorType) { ddsimHybridDD.simulate(0); // if edges are not equal -> compare amplitudes - const auto refAmplitudes = ddsimHybridDD.getVectorFromHybridSimulation(); - const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation>(); + const auto refAmplitudes = ddsimHybridDD.getVectorFromHybridSimulation(); + const auto resultAmplitudes = ddsimHybridAmp.getVectorFromHybridSimulation(); for (std::size_t i = 0; i < refAmplitudes.size(); ++i) { - if (std::abs(refAmplitudes[i].r - resultAmplitudes[i].first) > 1e-6 || std::abs(refAmplitudes[i].i - resultAmplitudes[i].second) > 1e-6) { + if (std::abs(refAmplitudes[i].real() - resultAmplitudes[i].real()) > 1e-6 || std::abs(refAmplitudes[i].imag() - resultAmplitudes[i].imag()) > 1e-6) { FAIL() << "Differing values on entry " << i; } } @@ -183,7 +183,7 @@ TEST(HybridSimTest, NonStandardOperation) { TEST(HybridSimTest, TooManyQubitsForVectorTest) { auto qc = std::make_unique(61); const HybridSchrodingerFeynmanSimulator<> ddsim(std::move(qc), ApproximationInfo{}, HybridSchrodingerFeynmanSimulator<>::Mode::Amplitude); - EXPECT_THROW({ [[maybe_unused]] auto _ = ddsim.getVectorFromHybridSimulation>(); }, std::range_error); + EXPECT_THROW({ [[maybe_unused]] auto _ = ddsim.getVectorFromHybridSimulation(); }, std::range_error); } TEST(HybridSimTest, RegressionTestDDModeUnevenChunks) { diff --git a/test/test_path_sim.cpp b/test/test_path_sim.cpp index 2152c5cd..9c17ef2b 100644 --- a/test/test_path_sim.cpp +++ b/test/test_path_sim.cpp @@ -30,16 +30,16 @@ TEST(TaskBasedSimTest, Configuration) { config.mode = PathSimulator<>::Configuration::Mode::BracketGrouping; config.bracketSize = 3; - std::cout << config.toString() << std::endl; + std::cout << config.toString() << "\n"; config.mode = PathSimulator<>::Configuration::Mode::Alternating; config.startingPoint = 13; - std::cout << config.toString() << std::endl; + std::cout << config.toString() << "\n"; config.mode = PathSimulator<>::Configuration::Mode::GateCost; config.startingPoint = 2; config.gateCost = {2, 2, 1, 1}; - std::cout << config.toString() << std::endl; + std::cout << config.toString() << "\n"; } TEST(TaskBasedSimTest, SimpleCircuit) { @@ -53,11 +53,11 @@ TEST(TaskBasedSimTest, SimpleCircuit) { // simulate circuit auto counts = tbs.simulate(1024); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 0).approximatelyEquals({dd::SQRT2_2, 0})); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 3).approximatelyEquals({dd::SQRT2_2, 0})); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(0).real(), dd::SQRT2_2, 1e-10); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(3).real(), dd::SQRT2_2, 1e-10); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -72,11 +72,11 @@ TEST(TaskBasedSimTest, SimpleCircuitArgumentConstructor) { // simulate circuit auto counts = tbs.simulate(1024); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 0).approximatelyEquals({dd::SQRT2_2, 0})); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 3).approximatelyEquals({dd::SQRT2_2, 0})); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(0).real(), dd::SQRT2_2, 1e-10); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(3).real(), dd::SQRT2_2, 1e-10); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -93,11 +93,11 @@ TEST(TaskBasedSimTest, SimpleCircuitAssumeFalseOrder) { // simulate circuit auto counts = tbs.simulate(1024); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 0).approximatelyEquals({dd::SQRT2_2, 0})); - EXPECT_TRUE(tbs.dd->getValueByPath(tbs.rootEdge, 3).approximatelyEquals({dd::SQRT2_2, 0})); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(0).real(), dd::SQRT2_2, 1e-10); + EXPECT_NEAR(tbs.rootEdge.getValueByIndex(3).real(), dd::SQRT2_2, 1e-10); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -118,7 +118,7 @@ TEST(TaskBasedSimTest, SimpleCircuitBracket) { auto counts = tbs.simulate(1024); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -137,14 +137,13 @@ TEST(TaskBasedSimTest, GroverCircuitBracket) { auto counts = tbs.simulate(4096); const auto target = targetValue.to_ullong() | (1ULL << 4); - auto c = tbs.dd->getValueByPath(tbs.rootEdge, target); - auto prob = c.r * c.r + c.i * c.i; - EXPECT_GT(prob, 0.9); + const auto c = tbs.rootEdge.getValueByIndex(target); + EXPECT_GT(std::norm(c), 0.9); dd::export2Dot(tbs.rootEdge, "result_grover.dot", true, true); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -162,14 +161,13 @@ TEST(TaskBasedSimTest, GroverCircuitAlternatingMiddle) { auto counts = tbs.simulate(4096); const auto target = targetValue.to_ullong() | (1ULL << 4); - auto c = tbs.dd->getValueByPath(tbs.rootEdge, target); - auto prob = c.r * c.r + c.i * c.i; - EXPECT_GT(prob, 0.9); + const auto c = tbs.rootEdge.getValueByIndex(target); + EXPECT_GT(std::norm(c), 0.9); dd::export2Dot(tbs.rootEdge, "result_grover.dot", true, true); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << '\n'; } } @@ -187,14 +185,13 @@ TEST(TaskBasedSimTest, GroverCircuitPairwiseGrouping) { auto counts = tbs.simulate(4096); const auto target = targetValue.to_ullong() | (1ULL << 4); - auto c = tbs.dd->getValueByPath(tbs.rootEdge, target); - auto prob = c.r * c.r + c.i * c.i; - EXPECT_GT(prob, 0.9); + const auto c = tbs.rootEdge.getValueByIndex(target); + EXPECT_GT(std::norm(c), 0.9); dd::export2Dot(tbs.rootEdge, "result_grouping.dot", true, true); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -211,7 +208,7 @@ TEST(TaskBasedSimTest, EmptyCircuit) { for (const auto& [state, count]: counts) { EXPECT_EQ(state, "00"); EXPECT_EQ(count, shots); - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -232,7 +229,7 @@ TEST(TaskBasedSimTest, SimpleCircuitGatecost) { auto counts = tbs.simulate(1024); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } @@ -257,6 +254,6 @@ TEST(TaskBasedSimTest, SimpleCircuitGatecostConfigurationObject) { auto counts = tbs.simulate(1024); for (const auto& [state, count]: counts) { - std::cout << state << ": " << count << std::endl; + std::cout << state << ": " << count << "\n"; } } diff --git a/test/test_stoch_noise_sim.cpp b/test/test_stoch_noise_sim.cpp index ddcb2eaa..09d5bd58 100644 --- a/test/test_stoch_noise_sim.cpp +++ b/test/test_stoch_noise_sim.cpp @@ -76,17 +76,17 @@ TEST(StochNoiseSimTest, DestructiveMeasurementAll) { ddsim.simulate(1); - const std::vector vBefore = ddsim.getVector(); + const auto vBefore = ddsim.getVector(); ASSERT_EQ(vBefore[0], vBefore[1]); ASSERT_EQ(vBefore[0], vBefore[2]); ASSERT_EQ(vBefore[0], vBefore[3]); - const std::string m = ddsim.measureAll(true); - const std::vector vAfter = ddsim.getVector(); - const std::size_t i = std::stoul(m, nullptr, 2); + const std::string m = ddsim.measureAll(true); + const auto vAfter = ddsim.getVector(); + const std::size_t i = std::stoul(m, nullptr, 2); - ASSERT_EQ(vAfter[i].r, 1.0); - ASSERT_EQ(vAfter[i].i, 0.0); + ASSERT_EQ(vAfter[i].real(), 1.0); + ASSERT_EQ(vAfter[i].imag(), 0.0); } TEST(StochNoiseSimTest, DestructiveMeasurementOne) { @@ -97,19 +97,19 @@ TEST(StochNoiseSimTest, DestructiveMeasurementOne) { ddsim.simulate(1); - const char m = ddsim.measureOneCollapsing(0); - const std::vector vAfter = ddsim.getVector(); + const char m = ddsim.measureOneCollapsing(0); + const auto vAfter = ddsim.getVector(); if (m == '0') { - ASSERT_EQ(vAfter[0], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[2], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[1], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[3], (dd::ComplexValue{0, 0})); + ASSERT_EQ(vAfter[0], dd::SQRT2_2); + ASSERT_EQ(vAfter[2], dd::SQRT2_2); + ASSERT_EQ(vAfter[1], 0.); + ASSERT_EQ(vAfter[3], 0.); } else if (m == '1') { - ASSERT_EQ(vAfter[0], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[2], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[1], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[3], dd::complex_SQRT2_2); + ASSERT_EQ(vAfter[0], 0.); + ASSERT_EQ(vAfter[2], 0.); + ASSERT_EQ(vAfter[1], dd::SQRT2_2); + ASSERT_EQ(vAfter[3], dd::SQRT2_2); } else { FAIL() << "Measurement result not in {0,1}!"; } @@ -127,7 +127,7 @@ TEST(StochNoiseSimTest, DestructiveMeasurementOneArbitraryNormalization) { char const m = ddsim.dd->measureOneCollapsing(ddsim.rootEdge, 0, false, gen); - const std::vector vAfter = ddsim.getVector(); + const auto vAfter = ddsim.getVector(); for (auto const& e: vAfter) { std::cout << e << " "; @@ -135,15 +135,15 @@ TEST(StochNoiseSimTest, DestructiveMeasurementOneArbitraryNormalization) { std::cout << "\n"; if (m == '0') { - ASSERT_EQ(vAfter[0], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[2], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[1], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[3], (dd::ComplexValue{0, 0})); + ASSERT_EQ(vAfter[0], dd::SQRT2_2); + ASSERT_EQ(vAfter[2], dd::SQRT2_2); + ASSERT_EQ(vAfter[1], 0.); + ASSERT_EQ(vAfter[3], 0.); } else if (m == '1') { - ASSERT_EQ(vAfter[0], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[2], (dd::ComplexValue{0, 0})); - ASSERT_EQ(vAfter[1], dd::complex_SQRT2_2); - ASSERT_EQ(vAfter[3], dd::complex_SQRT2_2); + ASSERT_EQ(vAfter[0], 0.); + ASSERT_EQ(vAfter[2], 0.); + ASSERT_EQ(vAfter[1], dd::SQRT2_2); + ASSERT_EQ(vAfter[3], dd::SQRT2_2); } else { FAIL() << "Measurement result not in {0,1}!"; } From 45079867626d0a5373eccc8809d17423756133ed Mon Sep 17 00:00:00 2001 From: burgholzer Date: Mon, 2 Oct 2023 15:41:00 +0200 Subject: [PATCH 2/2] =?UTF-8?q?=E2=AC=86=EF=B8=8F=20update=20taskflow?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: burgholzer --- extern/taskflow | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/taskflow b/extern/taskflow index 9316d989..12646d76 160000 --- a/extern/taskflow +++ b/extern/taskflow @@ -1 +1 @@ -Subproject commit 9316d98937e992968f1fb3a5836bf3500f756df7 +Subproject commit 12646d7634ddd1157802e0e03825f5cf6bd1bf41