From 290a497c858dc8d220ada717b4b8149a54693cef Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 13:52:18 -0400 Subject: [PATCH 01/35] try getting catalyst's rng for generating samples --- .../core/src/measurements/MeasurementsBase.hpp | 9 +++++++-- .../catalyst/LightningKokkosSimulator.cpp | 4 ++-- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 5 +++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 50a76610dc..2d1559bb05 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -76,10 +76,15 @@ template class MeasurementsBase { /** * @brief Randomly set the seed of the internal random generator + * If catalyst already provides a random generator, use the provided one * - * @param seed Seed + * @param catalyst_rng Seed */ - void setRandomSeed() { + void setRandomSeed(std::mt19937 *catalyst_rng = nullptr) { + if (catalyst_rng){ + this->rng = *catalyst_rng; + return; + } std::random_device rd; setSeed(rd()); } diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 655b305a5a..fe8689a336 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -348,7 +348,7 @@ void LightningKokkosSimulator::Sample(DataView &samples, *(this->device_sv)}; // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + auto li_samples = m.generate_samples(shots, this->gen); RT_FAIL_IF(samples.size() != li_samples.size(), "Invalid size for the pre-allocated samples"); @@ -387,7 +387,7 @@ void LightningKokkosSimulator::PartialSample( // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + auto li_samples = m.generate_samples(shots, this->gen); // The lightning samples are layed out as a single vector of size // shots*qubits, where each element represents a single bit. The diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 4bf72e332b..53f79f6fdb 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -588,15 +588,16 @@ class Measurements final * * @param wires Sample are generated for the specified wires. * @param num_samples The number of samples to generate. + * @param catalyst_rng The seeded random number generator from catalyst. * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ std::vector generate_samples(const std::vector &wires, - const std::size_t num_samples) { + const std::size_t num_samples, std::mt19937 *catalyst_rng) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); - this->setRandomSeed(); + this->setRandomSeed(catalyst_rng); DiscreteRandomVariable drv{this->rng, probs(wires)}; // The Python layer expects a 2D array with dimensions (n_samples x // n_wires) and hence the linear index is `s * n_wires + (n_wires - 1 - From 133bc2902a79a90b81cb26dcf43b2c9cb297a7d1 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 13:55:52 -0400 Subject: [PATCH 02/35] set default to nullptr --- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 53f79f6fdb..728681c79b 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -594,7 +594,7 @@ class Measurements final */ std::vector generate_samples(const std::vector &wires, - const std::size_t num_samples, std::mt19937 *catalyst_rng) { + const std::size_t num_samples, std::mt19937 *catalyst_rng = nullptr) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); this->setRandomSeed(catalyst_rng); From d0f07770f758a963a745a1096bff7a136c89c1be Mon Sep 17 00:00:00 2001 From: ringo-but-quantum Date: Mon, 30 Sep 2024 19:14:01 +0000 Subject: [PATCH 03/35] Auto update version from '0.39.0-dev33' to '0.39.0-dev34' --- pennylane_lightning/core/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index 4b8d31ae9d..05a5ab3841 100644 --- a/pennylane_lightning/core/_version.py +++ b/pennylane_lightning/core/_version.py @@ -16,4 +16,4 @@ Version number (major.minor.patch[-label]) """ -__version__ = "0.39.0-dev33" +__version__ = "0.39.0-dev34" From ea8290b4048a03735937da34177d0ee6a76402db Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 15:28:23 -0400 Subject: [PATCH 04/35] make the other `generate_samples` take in the rng as well --- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 728681c79b..0e146e6355 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -576,11 +576,11 @@ class Measurements final * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector generate_samples(const std::size_t num_samples) { + std::vector generate_samples(const std::size_t num_samples, std::mt19937 *catalyst_rng = nullptr) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); - return generate_samples(wires, num_samples); + return generate_samples(wires, num_samples, catalyst_rng); } /** From ce4c532df18d7694c323b2e6ad93f47579e28b76 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 16:05:01 -0400 Subject: [PATCH 05/35] undo kokkos changes for now --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index fe8689a336..655b305a5a 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -348,7 +348,7 @@ void LightningKokkosSimulator::Sample(DataView &samples, *(this->device_sv)}; // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots, this->gen); + auto li_samples = m.generate_samples(shots); RT_FAIL_IF(samples.size() != li_samples.size(), "Invalid size for the pre-allocated samples"); @@ -387,7 +387,7 @@ void LightningKokkosSimulator::PartialSample( // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots, this->gen); + auto li_samples = m.generate_samples(shots); // The lightning samples are layed out as a single vector of size // shots*qubits, where each element represents a single bit. The From 9e5eb3342b2af794ed04507ecad9846182e9055c Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 16:08:16 -0400 Subject: [PATCH 06/35] remove unnecessary `this->` --- pennylane_lightning/core/src/measurements/MeasurementsBase.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 2d1559bb05..7245ec6722 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -82,7 +82,7 @@ template class MeasurementsBase { */ void setRandomSeed(std::mt19937 *catalyst_rng = nullptr) { if (catalyst_rng){ - this->rng = *catalyst_rng; + rng = *catalyst_rng; return; } std::random_device rd; From 6aa6d4724af4a7d43091dfe3f8c9c7cebbb7613a Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 16:19:26 -0400 Subject: [PATCH 07/35] passing pointers as const reference --- .../core/src/measurements/MeasurementsBase.hpp | 4 ++-- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 6 ++++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 7245ec6722..fe4de1581e 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -80,8 +80,8 @@ template class MeasurementsBase { * * @param catalyst_rng Seed */ - void setRandomSeed(std::mt19937 *catalyst_rng = nullptr) { - if (catalyst_rng){ + void setRandomSeed(const std::mt19937 *&catalyst_rng = nullptr) { + if (catalyst_rng != nullptr){ rng = *catalyst_rng; return; } diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 0e146e6355..b469d69718 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -576,7 +576,8 @@ class Measurements final * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector generate_samples(const std::size_t num_samples, std::mt19937 *catalyst_rng = nullptr) { + std::vector generate_samples(const std::size_t num_samples, + const std::mt19937 *&catalyst_rng = nullptr) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); @@ -594,7 +595,8 @@ class Measurements final */ std::vector generate_samples(const std::vector &wires, - const std::size_t num_samples, std::mt19937 *catalyst_rng = nullptr) { + const std::size_t num_samples, + const std::mt19937 *&catalyst_rng = nullptr) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); this->setRandomSeed(catalyst_rng); From cfb16b41ecf5be2b6aef21889eca8cc783fae02b Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 16:21:17 -0400 Subject: [PATCH 08/35] format --- .../core/src/measurements/MeasurementsBase.hpp | 2 +- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index fe4de1581e..cd68d9208b 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -81,7 +81,7 @@ template class MeasurementsBase { * @param catalyst_rng Seed */ void setRandomSeed(const std::mt19937 *&catalyst_rng = nullptr) { - if (catalyst_rng != nullptr){ + if (catalyst_rng != nullptr) { rng = *catalyst_rng; return; } diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index b469d69718..313a95d47f 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -573,11 +573,13 @@ class Measurements final * Reference: https://en.wikipedia.org/wiki/Alias_method * * @param num_samples The number of samples to generate. + * @param catalyst_rng The seeded random number generator from catalyst. * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector generate_samples(const std::size_t num_samples, - const std::mt19937 *&catalyst_rng = nullptr) { + std::vector + generate_samples(const std::size_t num_samples, + const std::mt19937 *&catalyst_rng = nullptr) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); From 3047599f0fd21c1e4a5f94a2bd5f0baede48b3ce Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 16:59:01 -0400 Subject: [PATCH 09/35] convert to std::optional to avoid (pointers + default value of nullptr); split setRandomSeed and setRNG into different functions --- .../core/src/measurements/MeasurementsBase.hpp | 15 ++++++++------- .../measurements/MeasurementsLQubit.hpp | 10 +++++++--- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index cd68d9208b..9c8912d6de 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -76,19 +76,20 @@ template class MeasurementsBase { /** * @brief Randomly set the seed of the internal random generator - * If catalyst already provides a random generator, use the provided one * - * @param catalyst_rng Seed */ - void setRandomSeed(const std::mt19937 *&catalyst_rng = nullptr) { - if (catalyst_rng != nullptr) { - rng = *catalyst_rng; - return; - } + void setRandomSeed() { std::random_device rd; setSeed(rd()); } + /** + * @brief Set the internal random generator to an already existing instance + * + * @param catalyst_rng Seed + */ + void setRNG(std::mt19937 rng) { this->rng = std::move(rng); } + /** * @brief Calculate the expectation value for a general Observable. * diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 313a95d47f..78d89f9494 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -579,7 +579,7 @@ class Measurements final */ std::vector generate_samples(const std::size_t num_samples, - const std::mt19937 *&catalyst_rng = nullptr) { + const std::optional &catalyst_rng) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); @@ -598,10 +598,14 @@ class Measurements final std::vector generate_samples(const std::vector &wires, const std::size_t num_samples, - const std::mt19937 *&catalyst_rng = nullptr) { + const std::optional &catalyst_rng) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); - this->setRandomSeed(catalyst_rng); + if (catalyst_rng.has_value()) { + this->setRNG(catalyst_rng); + } else { + this->setRandomSeed(); + } DiscreteRandomVariable drv{this->rng, probs(wires)}; // The Python layer expects a 2D array with dimensions (n_samples x // n_wires) and hence the linear index is `s * n_wires + (n_wires - 1 - From 0b943f1ba2acb49266e30802869f1e305d093992 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Mon, 30 Sep 2024 17:11:39 -0400 Subject: [PATCH 10/35] give std::nullopt default to std::optional --- .../lightning_qubit/measurements/MeasurementsLQubit.hpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 78d89f9494..bcb84ca6c8 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -579,7 +580,7 @@ class Measurements final */ std::vector generate_samples(const std::size_t num_samples, - const std::optional &catalyst_rng) { + const std::optional& catalyst_rng = std::nullopt) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); @@ -598,11 +599,11 @@ class Measurements final std::vector generate_samples(const std::vector &wires, const std::size_t num_samples, - const std::optional &catalyst_rng) { + const std::optional& catalyst_rng = std::nullopt) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); if (catalyst_rng.has_value()) { - this->setRNG(catalyst_rng); + this->setRNG(catalyst_rng.value()); } else { this->setRandomSeed(); } From f496df8943efbe80b738ce7c5e6e1da5ad0b110a Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 11:43:47 -0400 Subject: [PATCH 11/35] test --- .../src/measurements/MeasurementsBase.hpp | 2 +- .../tests/Test_MeasurementsBase.cpp | 20 +++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 9c8912d6de..7cd8110f6b 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -86,7 +86,7 @@ template class MeasurementsBase { /** * @brief Set the internal random generator to an already existing instance * - * @param catalyst_rng Seed + * @param rng An already existing instance of a random number generator */ void setRNG(std::mt19937 rng) { this->rng = std::move(rng); } diff --git a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp index 674659a9cc..389f16fb36 100644 --- a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp +++ b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp @@ -20,6 +20,8 @@ using Pennylane::Util::isApproxEqual; } // namespace /// @endcond #include +#include +#include #include #ifdef _ENABLE_PLQUBIT @@ -1251,7 +1253,9 @@ TEST_CASE("Var Shot- TensorProdObs", "[MeasurementsBase][Observables]") { testTensorProdObsVarShot(); } } -template void testSamples() { + +template void testSamples( + const std::optional& rng = std::nullopt) { if constexpr (!std::is_same_v) { using StateVectorT = typename TypeList::Type; using PrecisionT = typename StateVectorT::PrecisionT; @@ -1281,7 +1285,8 @@ template void testSamples() { std::size_t num_qubits = 3; std::size_t N = std::pow(2, num_qubits); std::size_t num_samples = 100000; - auto &&samples = Measurer.generate_samples(num_samples); + auto &&samples = rng.has_value() ? + Measurer.generate_samples(num_samples, rng.value()) : Measurer.generate_samples(num_samples); std::vector counts(N, 0); std::vector samples_decimal(num_samples, 0); @@ -1307,7 +1312,7 @@ template void testSamples() { REQUIRE_THAT(probabilities, Catch::Approx(expected_probabilities).margin(.05)); } - testSamples(); + testSamples(rng); } } @@ -1317,6 +1322,13 @@ TEST_CASE("Samples", "[MeasurementsBase]") { } } +TEST_CASE("Seeded samples", "[MeasurementsBase]") { + if constexpr (BACKEND_FOUND) { + std::mt19937 rng(37.42); + testSamples(rng); + } +} + template void testSamplesCountsObs() { if constexpr (!std::is_same_v) { using StateVectorT = typename TypeList::Type; @@ -1729,4 +1741,4 @@ TEST_CASE("Measure Shot - SparseHObs ", "[MeasurementsBase][Observables]") { if constexpr (BACKEND_FOUND) { testSparseHObsMeasureShot(); } -} \ No newline at end of file +} From e116f5cb334c4cac9d098f8326baa018290333cc Mon Sep 17 00:00:00 2001 From: ringo-but-quantum Date: Tue, 1 Oct 2024 15:44:14 +0000 Subject: [PATCH 12/35] Auto update version from '0.39.0-dev34' to '0.39.0-dev35' --- pennylane_lightning/core/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index 05a5ab3841..cb8540718b 100644 --- a/pennylane_lightning/core/_version.py +++ b/pennylane_lightning/core/_version.py @@ -16,4 +16,4 @@ Version number (major.minor.patch[-label]) """ -__version__ = "0.39.0-dev34" +__version__ = "0.39.0-dev35" From 5216ccac52d46ae44d4e666251ba4a32c2552fb1 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 11:59:53 -0400 Subject: [PATCH 13/35] apply clang tidy comments --- pennylane_lightning/core/src/measurements/MeasurementsBase.hpp | 2 +- .../core/src/measurements/tests/Test_MeasurementsBase.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 7cd8110f6b..813b4a377a 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -88,7 +88,7 @@ template class MeasurementsBase { * * @param rng An already existing instance of a random number generator */ - void setRNG(std::mt19937 rng) { this->rng = std::move(rng); } + void setRNG(std::mt19937 rng) { this->rng = rng; } /** * @brief Calculate the expectation value for a general Observable. diff --git a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp index 389f16fb36..cab606f2da 100644 --- a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp +++ b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp @@ -1324,7 +1324,7 @@ TEST_CASE("Samples", "[MeasurementsBase]") { TEST_CASE("Seeded samples", "[MeasurementsBase]") { if constexpr (BACKEND_FOUND) { - std::mt19937 rng(37.42); + std::mt19937 rng(37); testSamples(rng); } } From 234ced7ff8e1f55cd20b88e4d1f29e2c71b33994 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 12:11:28 -0400 Subject: [PATCH 14/35] format --- .../measurements/tests/Test_MeasurementsBase.cpp | 10 ++++++---- .../measurements/MeasurementsLQubit.hpp | 13 ++++++------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp index cab606f2da..1c2f55e3c9 100644 --- a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp +++ b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp @@ -1254,8 +1254,8 @@ TEST_CASE("Var Shot- TensorProdObs", "[MeasurementsBase][Observables]") { } } -template void testSamples( - const std::optional& rng = std::nullopt) { +template +void testSamples(const std::optional &rng = std::nullopt) { if constexpr (!std::is_same_v) { using StateVectorT = typename TypeList::Type; using PrecisionT = typename StateVectorT::PrecisionT; @@ -1285,8 +1285,10 @@ template void testSamples( std::size_t num_qubits = 3; std::size_t N = std::pow(2, num_qubits); std::size_t num_samples = 100000; - auto &&samples = rng.has_value() ? - Measurer.generate_samples(num_samples, rng.value()) : Measurer.generate_samples(num_samples); + auto &&samples = + rng.has_value() + ? Measurer.generate_samples(num_samples, rng.value()) + : Measurer.generate_samples(num_samples); std::vector counts(N, 0); std::vector samples_decimal(num_samples, 0); diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index bcb84ca6c8..46914caf4a 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -578,9 +578,9 @@ class Measurements final * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector - generate_samples(const std::size_t num_samples, - const std::optional& catalyst_rng = std::nullopt) { + std::vector generate_samples( + const std::size_t num_samples, + const std::optional &catalyst_rng = std::nullopt) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); @@ -596,10 +596,9 @@ class Measurements final * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector - generate_samples(const std::vector &wires, - const std::size_t num_samples, - const std::optional& catalyst_rng = std::nullopt) { + std::vector generate_samples( + const std::vector &wires, const std::size_t num_samples, + const std::optional &catalyst_rng = std::nullopt) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); if (catalyst_rng.has_value()) { From c4c53413a4891793cd35ecd9db3790f436dabfb4 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 15:38:53 -0400 Subject: [PATCH 15/35] pass the seeding integer, instead of the rng instance; add kokkos --- .../src/measurements/MeasurementsBase.hpp | 7 ---- .../tests/Test_MeasurementsBase.cpp | 11 +++-- .../catalyst/LightningKokkosSimulator.cpp | 40 ++++++++----------- .../catalyst/LightningKokkosSimulator.hpp | 1 + .../measurements/MeasurementsKokkos.hpp | 15 ++++--- .../measurements/MeasurementsLQubit.hpp | 23 ++++++----- 6 files changed, 44 insertions(+), 53 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp index 813b4a377a..62fd82e1ab 100644 --- a/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp +++ b/pennylane_lightning/core/src/measurements/MeasurementsBase.hpp @@ -83,13 +83,6 @@ template class MeasurementsBase { setSeed(rd()); } - /** - * @brief Set the internal random generator to an already existing instance - * - * @param rng An already existing instance of a random number generator - */ - void setRNG(std::mt19937 rng) { this->rng = rng; } - /** * @brief Calculate the expectation value for a general Observable. * diff --git a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp index 1c2f55e3c9..205b94fe33 100644 --- a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp +++ b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp @@ -1255,7 +1255,7 @@ TEST_CASE("Var Shot- TensorProdObs", "[MeasurementsBase][Observables]") { } template -void testSamples(const std::optional &rng = std::nullopt) { +void testSamples(const std::optional &seed = std::nullopt) { if constexpr (!std::is_same_v) { using StateVectorT = typename TypeList::Type; using PrecisionT = typename StateVectorT::PrecisionT; @@ -1286,8 +1286,8 @@ void testSamples(const std::optional &rng = std::nullopt) { std::size_t N = std::pow(2, num_qubits); std::size_t num_samples = 100000; auto &&samples = - rng.has_value() - ? Measurer.generate_samples(num_samples, rng.value()) + seed.has_value() + ? Measurer.generate_samples(num_samples, seed.value()) : Measurer.generate_samples(num_samples); std::vector counts(N, 0); @@ -1314,7 +1314,7 @@ void testSamples(const std::optional &rng = std::nullopt) { REQUIRE_THAT(probabilities, Catch::Approx(expected_probabilities).margin(.05)); } - testSamples(rng); + testSamples(seed); } } @@ -1326,8 +1326,7 @@ TEST_CASE("Samples", "[MeasurementsBase]") { TEST_CASE("Seeded samples", "[MeasurementsBase]") { if constexpr (BACKEND_FOUND) { - std::mt19937 rng(37); - testSamples(rng); + testSamples(37); } } diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 655b305a5a..38cb471a7c 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -342,13 +342,23 @@ void LightningKokkosSimulator::PartialProbs( std::move(dv_probs.begin(), dv_probs.end(), probs.begin()); } -void LightningKokkosSimulator::Sample(DataView &samples, - std::size_t shots) { +std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { + + // generate_samples is a member function of the Measures class. Pennylane::LightningKokkos::Measures::Measurements m{ *(this->device_sv)}; + // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + if (this->gen) { + return m.generate_samples(shots, (*(this->gen))()); + } + return m.generate_samples(shots); +} + +void LightningKokkosSimulator::Sample(DataView &samples, + std::size_t shots) { + auto li_samples = this->GenerateSamples(shots); RT_FAIL_IF(samples.size() != li_samples.size(), "Invalid size for the pre-allocated samples"); @@ -381,13 +391,7 @@ void LightningKokkosSimulator::PartialSample( // get device wires auto &&dev_wires = getDeviceWires(wires); - // generate_samples is a member function of the MeasuresKokkos class. - Pennylane::LightningKokkos::Measures::Measurements m{ - *(this->device_sv)}; - - // PL-Lightning-Kokkos generates samples using the alias method. - // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + auto li_samples = this->GenerateSamples(shots); // The lightning samples are layed out as a single vector of size // shots*qubits, where each element represents a single bit. The @@ -411,13 +415,7 @@ void LightningKokkosSimulator::Counts(DataView &eigvals, RT_FAIL_IF(eigvals.size() != numElements || counts.size() != numElements, "Invalid size for the pre-allocated counts"); - // generate_samples is a member function of the MeasuresKokkos class. - Pennylane::LightningKokkos::Measures::Measurements m{ - *(this->device_sv)}; - - // PL-Lightning-Kokkos generates samples using the alias method. - // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + auto li_samples = this->GenerateSamples(shots); // Fill the eigenvalues with the integer representation of the corresponding // computational basis bitstring. In the future, eigenvalues can also be @@ -455,13 +453,7 @@ void LightningKokkosSimulator::PartialCounts( // get device wires auto &&dev_wires = getDeviceWires(wires); - // generate_samples is a member function of the MeasuresKokkos class. - Pennylane::LightningKokkos::Measures::Measurements m{ - *(this->device_sv)}; - - // PL-Lightning-Kokkos generates samples using the alias method. - // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - auto li_samples = m.generate_samples(shots); + auto li_samples = this->GenerateSamples(shots); // Fill the eigenvalues with the integer representation of the corresponding // computational basis bitstring. In the future, eigenvalues can also be diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp index 890c3a267f..f0b4151628 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp @@ -174,6 +174,7 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { auto CacheManagerInfo() -> std::tuple, std::vector>; + auto GenerateSamples(size_t shots) -> std::vector; }; } // namespace Catalyst::Runtime::Simulator diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp index 28449e5015..87c69cc9c0 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp @@ -649,13 +649,16 @@ class Measurements final * Reference https://en.wikipedia.org/wiki/Inverse_transform_sampling * * @param num_samples Number of Samples + * @param seed Seed to generate the samples from * * @return std::vector to the samples. * Each sample has a length equal to the number of qubits. Each sample can * be accessed using the stride sample_id*num_qubits, where sample_id is a * number between 0 and num_samples-1. */ - auto generate_samples(std::size_t num_samples) -> std::vector { + auto generate_samples(std::size_t num_samples, + const std::optional &seed = std::nullopt) + -> std::vector { const std::size_t num_qubits = this->_statevector.getNumQubits(); const std::size_t N = this->_statevector.getLength(); Kokkos::View samples("num_samples", @@ -674,10 +677,12 @@ class Measurements final }); // Sampling using Random_XorShift64_Pool - Kokkos::Random_XorShift64_Pool<> rand_pool( - std::chrono::high_resolution_clock::now() - .time_since_epoch() - .count()); + Kokkos::Random_XorShift64_Pool<> rand_pool = + seed.has_value() ? Kokkos::Random_XorShift64_Pool<>((seed.value())) + : Kokkos::Random_XorShift64_Pool<>( + std::chrono::high_resolution_clock::now() + .time_since_epoch() + .count()); Kokkos::parallel_for( Kokkos::RangePolicy(0, num_samples), diff --git a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp index 46914caf4a..d57bd70631 100644 --- a/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_qubit/measurements/MeasurementsLQubit.hpp @@ -574,17 +574,17 @@ class Measurements final * Reference: https://en.wikipedia.org/wiki/Alias_method * * @param num_samples The number of samples to generate. - * @param catalyst_rng The seeded random number generator from catalyst. + * @param seed Seed to generate the samples from * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector generate_samples( - const std::size_t num_samples, - const std::optional &catalyst_rng = std::nullopt) { + std::vector + generate_samples(const std::size_t num_samples, + const std::optional &seed = std::nullopt) { const std::size_t num_qubits = this->_statevector.getNumQubits(); std::vector wires(num_qubits); std::iota(wires.begin(), wires.end(), 0); - return generate_samples(wires, num_samples, catalyst_rng); + return generate_samples(wires, num_samples, seed); } /** @@ -592,17 +592,18 @@ class Measurements final * * @param wires Sample are generated for the specified wires. * @param num_samples The number of samples to generate. - * @param catalyst_rng The seeded random number generator from catalyst. + * @param seed Seed to generate the samples from * @return 1-D vector of samples in binary, each sample is * separated by a stride equal to the number of qubits. */ - std::vector generate_samples( - const std::vector &wires, const std::size_t num_samples, - const std::optional &catalyst_rng = std::nullopt) { + std::vector + generate_samples(const std::vector &wires, + const std::size_t num_samples, + const std::optional &seed = std::nullopt) { const std::size_t n_wires = wires.size(); std::vector samples(num_samples * n_wires); - if (catalyst_rng.has_value()) { - this->setRNG(catalyst_rng.value()); + if (seed.has_value()) { + this->setSeed(seed.value()); } else { this->setRandomSeed(); } From 2a2420eb99e4505aa875beb5dd0d7140732c43d0 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 15:41:13 -0400 Subject: [PATCH 16/35] codefactor --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 38cb471a7c..cfe3a9c5d0 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -343,7 +343,6 @@ void LightningKokkosSimulator::PartialProbs( } std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { - // generate_samples is a member function of the Measures class. Pennylane::LightningKokkos::Measures::Measurements m{ *(this->device_sv)}; From 671fed432a4009910a6cf57e165b374e80dec13e Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 15:57:42 -0400 Subject: [PATCH 17/35] debug push --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index cfe3a9c5d0..3fd435f59f 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -350,6 +350,7 @@ std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling if (this->gen) { + std::cout << "seeded kokkos sample: " << (*(this->gen))() << "\n"; return m.generate_samples(shots, (*(this->gen))()); } return m.generate_samples(shots); From 1f861dfda1d756219677275ec6a4ef7f3cdc8e83 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Tue, 1 Oct 2024 16:14:37 -0400 Subject: [PATCH 18/35] debug --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 3fd435f59f..15088a6c55 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -349,6 +349,7 @@ std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling + std::cout << "hi! " << ((this->gen) == nullptr) << std::endl; if (this->gen) { std::cout << "seeded kokkos sample: " << (*(this->gen))() << "\n"; return m.generate_samples(shots, (*(this->gen))()); From 3624cb027c7def682a9cfccb6ba102c03274ca41 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 09:46:27 -0400 Subject: [PATCH 19/35] remove debug prints --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 15088a6c55..cfe3a9c5d0 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -349,9 +349,7 @@ std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { // PL-Lightning-Kokkos generates samples using the alias method. // Reference: https://en.wikipedia.org/wiki/Inverse_transform_sampling - std::cout << "hi! " << ((this->gen) == nullptr) << std::endl; if (this->gen) { - std::cout << "seeded kokkos sample: " << (*(this->gen))() << "\n"; return m.generate_samples(shots, (*(this->gen))()); } return m.generate_samples(shots); From 58961190dc0e0a3275bc94ff098980704baf0fca Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 10:36:12 -0400 Subject: [PATCH 20/35] small comments --- .../core/src/measurements/tests/Test_MeasurementsBase.cpp | 1 - .../lightning_kokkos/measurements/MeasurementsKokkos.hpp | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp index 205b94fe33..0cd7223bf6 100644 --- a/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp +++ b/pennylane_lightning/core/src/measurements/tests/Test_MeasurementsBase.cpp @@ -21,7 +21,6 @@ using Pennylane::Util::isApproxEqual; /// @endcond #include #include -#include #include #ifdef _ENABLE_PLQUBIT diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp index 87c69cc9c0..708b8542ee 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp @@ -14,6 +14,7 @@ #pragma once #include #include +#include #include #include @@ -678,7 +679,7 @@ class Measurements final // Sampling using Random_XorShift64_Pool Kokkos::Random_XorShift64_Pool<> rand_pool = - seed.has_value() ? Kokkos::Random_XorShift64_Pool<>((seed.value())) + seed.has_value() ? Kokkos::Random_XorShift64_Pool<>(seed.value()) : Kokkos::Random_XorShift64_Pool<>( std::chrono::high_resolution_clock::now() .time_since_epoch() From b2e3759169a39f163f4b68ad88241a7c779a3139 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 10:37:51 -0400 Subject: [PATCH 21/35] changelog --- .github/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 6a9b55cf8f..d3ace09d2d 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -34,6 +34,9 @@ ### Improvements +* The `generate_samples` methods of lightning.{qubit/kokkos} can now take in a seed number to make the generated samples deterministic. This can be useful when, among other things, fixing flaky tests in CI. + [(#927)](https://github.com/PennyLaneAI/pennylane-lightning/pull/927) + * Always decompose `qml.QFT` in Lightning. [(#924)](https://github.com/PennyLaneAI/pennylane-lightning/pull/924) From 9e98e33f2d9aebe2f8801acc8f6602fbf2b39a47 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 11:23:56 -0400 Subject: [PATCH 22/35] changelog author --- .github/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index d3ace09d2d..c9e9140793 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -105,7 +105,7 @@ This release contains contributions from (in alphabetical order): -Ali Asadi, Amintor Dusko, Luis Alfredo Nuñez Meneses, Vincent Michaud-Rioux, Lee J. O'Riordan, Mudit Pandey, Shuli Shu +Ali Asadi, Amintor Dusko, Luis Alfredo Nuñez Meneses, Vincent Michaud-Rioux, Lee J. O'Riordan, Mudit Pandey, Shuli Shu, Haochen Paul Wang --- From e57ada494badaea7c1fb06ba9c77fec057e4244b Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 11:30:56 -0400 Subject: [PATCH 23/35] `auto` for kokkos random pool type when type is obvious; `const` to shots arguments --- .../catalyst/LightningKokkosSimulator.cpp | 10 +++++----- .../catalyst/LightningKokkosSimulator.hpp | 10 +++++----- .../measurements/MeasurementsKokkos.hpp | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index cfe3a9c5d0..3221ce64c9 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -342,7 +342,7 @@ void LightningKokkosSimulator::PartialProbs( std::move(dv_probs.begin(), dv_probs.end(), probs.begin()); } -std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { +std::vector LightningKokkosSimulator::GenerateSamples(const size_t shots) { // generate_samples is a member function of the Measures class. Pennylane::LightningKokkos::Measures::Measurements m{ *(this->device_sv)}; @@ -356,7 +356,7 @@ std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { } void LightningKokkosSimulator::Sample(DataView &samples, - std::size_t shots) { + const std::size_t shots) { auto li_samples = this->GenerateSamples(shots); RT_FAIL_IF(samples.size() != li_samples.size(), @@ -378,7 +378,7 @@ void LightningKokkosSimulator::Sample(DataView &samples, } void LightningKokkosSimulator::PartialSample( DataView &samples, const std::vector &wires, - std::size_t shots) { + const std::size_t shots) { const std::size_t numWires = wires.size(); const std::size_t numQubits = this->GetNumQubits(); @@ -407,7 +407,7 @@ void LightningKokkosSimulator::PartialSample( void LightningKokkosSimulator::Counts(DataView &eigvals, DataView &counts, - std::size_t shots) { + const std::size_t shots) { const std::size_t numQubits = this->GetNumQubits(); const std::size_t numElements = 1U << numQubits; @@ -439,7 +439,7 @@ void LightningKokkosSimulator::Counts(DataView &eigvals, void LightningKokkosSimulator::PartialCounts( DataView &eigvals, DataView &counts, - const std::vector &wires, std::size_t shots) { + const std::vector &wires, const std::size_t shots) { const std::size_t numWires = wires.size(); const std::size_t numQubits = this->GetNumQubits(); const std::size_t numElements = 1U << numWires; diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp index f0b4151628..e89993ff60 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp @@ -155,16 +155,16 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { void Probs(DataView &probs) override; void PartialProbs(DataView &probs, const std::vector &wires) override; - void Sample(DataView &samples, std::size_t shots) override; + void Sample(DataView &samples, const std::size_t shots) override; void PartialSample(DataView &samples, const std::vector &wires, - std::size_t shots) override; + const std::size_t shots) override; void Counts(DataView &eigvals, DataView &counts, - std::size_t shots) override; + const std::size_t shots) override; void PartialCounts(DataView &eigvals, DataView &counts, const std::vector &wires, - std::size_t shots) override; + const std::size_t shots) override; auto Measure(QubitIdType wire, std::optional postselect = std::nullopt) -> Result override; @@ -174,7 +174,7 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { auto CacheManagerInfo() -> std::tuple, std::vector>; - auto GenerateSamples(size_t shots) -> std::vector; + auto GenerateSamples(const size_t shots) -> std::vector; }; } // namespace Catalyst::Runtime::Simulator diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp index 708b8542ee..02236cb2af 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp @@ -678,7 +678,7 @@ class Measurements final }); // Sampling using Random_XorShift64_Pool - Kokkos::Random_XorShift64_Pool<> rand_pool = + auto rand_pool = seed.has_value() ? Kokkos::Random_XorShift64_Pool<>(seed.value()) : Kokkos::Random_XorShift64_Pool<>( std::chrono::high_resolution_clock::now() From f082ea1a4199c7ffeb3d459a91515b16e672b1d1 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 12:09:23 -0400 Subject: [PATCH 24/35] catalyst kokkos seed sample test --- .../tests/Test_LightningKokkosMeasures.cpp | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp index 7208732a3b..7942f40493 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp @@ -1777,3 +1777,46 @@ TEST_CASE("Measurement with a seeded device", "[Measures]") { CHECK(*m == *m1); } } + +TEST_CASE("Sample with a seeded device", "[Measures]") { + for (std::size_t _ = 0; _ < 5; _++) { + std::unique_ptr sim = std::make_unique(); + std::unique_ptr sim1 = std::make_unique(); + + std::size_t shots = 100; + + std::vector samples(shots * 4); + MemRefT buffer{ + samples.data(), samples.data(), 0, {shots, 1}, {1, 1}}; + DataView view(buffer.data_aligned, buffer.offset, + buffer.sizes, buffer.strides); + + std::vector samples1(shots * 4); + MemRefT buffer1{ + samples1.data(), samples1.data(), 0, {shots, 1}, {1, 1}}; + DataView view1(buffer1.data_aligned, buffer1.offset, + buffer1.sizes, buffer1.strides); + + std::mt19937 gen(37); + sim->SetDevicePRNG(&gen); + std::vector Qs; + Qs.reserve(1); + Qs.push_back(sim->AllocateQubit()); + sim->NamedOperation("Hadamard", {}, {Qs[0]}, false); + sim->NamedOperation("RX", {0.5}, {Qs[0]}, false); + sim->Sample(view, shots); + + std::mt19937 gen1(37); + sim1->SetDevicePRNG(&gen1); + std::vector Qs1; + Qs1.reserve(1); + Qs1.push_back(sim1->AllocateQubit()); + sim1->NamedOperation("Hadamard", {}, {Qs1[0]}, false); + sim1->NamedOperation("RX", {0.5}, {Qs1[0]}, false); + sim1->Sample(view1, shots); + + for (std::size_t i = 0; i < shots * 4; i++){ + CHECK((samples[i] == samples1[i])); + } + } +} From 5edfdfaa598ec247c8197feed663eb2bbda8fd9c Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 12:12:23 -0400 Subject: [PATCH 25/35] format --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.cpp | 3 ++- .../catalyst/tests/Test_LightningKokkosMeasures.cpp | 4 ++-- .../lightning_kokkos/measurements/MeasurementsKokkos.hpp | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index 3221ce64c9..d37d550b28 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -342,7 +342,8 @@ void LightningKokkosSimulator::PartialProbs( std::move(dv_probs.begin(), dv_probs.end(), probs.begin()); } -std::vector LightningKokkosSimulator::GenerateSamples(const size_t shots) { +std::vector +LightningKokkosSimulator::GenerateSamples(const size_t shots) { // generate_samples is a member function of the Measures class. Pennylane::LightningKokkos::Measures::Measurements m{ *(this->device_sv)}; diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp index 7942f40493..c6c9f88bdc 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp @@ -1789,7 +1789,7 @@ TEST_CASE("Sample with a seeded device", "[Measures]") { MemRefT buffer{ samples.data(), samples.data(), 0, {shots, 1}, {1, 1}}; DataView view(buffer.data_aligned, buffer.offset, - buffer.sizes, buffer.strides); + buffer.sizes, buffer.strides); std::vector samples1(shots * 4); MemRefT buffer1{ @@ -1815,7 +1815,7 @@ TEST_CASE("Sample with a seeded device", "[Measures]") { sim1->NamedOperation("RX", {0.5}, {Qs1[0]}, false); sim1->Sample(view1, shots); - for (std::size_t i = 0; i < shots * 4; i++){ + for (std::size_t i = 0; i < shots * 4; i++) { CHECK((samples[i] == samples1[i])); } } diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp index 02236cb2af..ee8684e814 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/measurements/MeasurementsKokkos.hpp @@ -678,8 +678,8 @@ class Measurements final }); // Sampling using Random_XorShift64_Pool - auto rand_pool = - seed.has_value() ? Kokkos::Random_XorShift64_Pool<>(seed.value()) + auto rand_pool = seed.has_value() + ? Kokkos::Random_XorShift64_Pool<>(seed.value()) : Kokkos::Random_XorShift64_Pool<>( std::chrono::high_resolution_clock::now() .time_since_epoch() From 3fca3d4a478f76675d2181fef230a48f50de2122 Mon Sep 17 00:00:00 2001 From: ringo-but-quantum Date: Wed, 2 Oct 2024 16:13:58 +0000 Subject: [PATCH 26/35] Auto update version from '0.39.0-dev35' to '0.39.0-dev36' --- pennylane_lightning/core/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index cb8540718b..9b3cc2f16a 100644 --- a/pennylane_lightning/core/_version.py +++ b/pennylane_lightning/core/_version.py @@ -16,4 +16,4 @@ Version number (major.minor.patch[-label]) """ -__version__ = "0.39.0-dev35" +__version__ = "0.39.0-dev36" From 5101ff45656168c4f750fccabd7ec689aeebda1b Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 12:25:12 -0400 Subject: [PATCH 27/35] change helper to private --- .../lightning_kokkos/catalyst/LightningKokkosSimulator.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp index e89993ff60..6b43404d45 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp @@ -96,6 +96,8 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { return res; } + auto GenerateSamples(const size_t shots) -> std::vector; + public: explicit LightningKokkosSimulator(const std::string &kwargs = "{}") { auto &&args = Catalyst::Runtime::parse_kwargs(kwargs); @@ -174,7 +176,6 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { auto CacheManagerInfo() -> std::tuple, std::vector>; - auto GenerateSamples(const size_t shots) -> std::vector; }; } // namespace Catalyst::Runtime::Simulator From a127f33cac51548132a04d7a979272b5ab3e5569 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 13:24:44 -0400 Subject: [PATCH 28/35] fix lightning.gpu test failure --- .../lightning_gpu/measurements/MeasurementsGPU.hpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp b/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp index 460a4fa8cb..af630986e4 100644 --- a/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp @@ -218,7 +218,9 @@ class Measurements final * be accessed using the stride sample_id*num_qubits, where sample_id is a * number between 0 and num_samples-1. */ - auto generate_samples(std::size_t num_samples) -> std::vector { + auto generate_samples(std::size_t num_samples, + const std::optional &seed = std::nullopt) + -> std::vector { std::vector rand_nums(num_samples); custatevecSamplerDescriptor_t sampler; @@ -238,7 +240,11 @@ class Measurements final data_type = CUDA_C_32F; } - this->setRandomSeed(); + if (seed.has_value()) { + this->setSeed(seed.value()); + } else { + this->setRandomSeed(); + } std::uniform_real_distribution dis(0.0, 1.0); for (std::size_t n = 0; n < num_samples; n++) { rand_nums[n] = dis(this->rng); From c70de5dacc53b6de8f47e9ef0b277bc3fdb9909d Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Wed, 2 Oct 2024 13:58:42 -0400 Subject: [PATCH 29/35] optional header --- .../simulators/lightning_gpu/measurements/MeasurementsGPU.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp b/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp index af630986e4..f61b213937 100644 --- a/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_gpu/measurements/MeasurementsGPU.hpp @@ -25,6 +25,7 @@ #include #include #include // custatevecApplyMatrix +#include #include #include #include From 3be52d6a570c80034eb295a3a160973719bc9e29 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Thu, 3 Oct 2024 10:10:39 -0400 Subject: [PATCH 30/35] factor out common furnitures for all loop iterations for kokkos catalyst test --- .../tests/Test_LightningKokkosMeasures.cpp | 72 ++++++++++--------- 1 file changed, 37 insertions(+), 35 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp index c6c9f88bdc..a58f6bb879 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp @@ -1779,44 +1779,46 @@ TEST_CASE("Measurement with a seeded device", "[Measures]") { } TEST_CASE("Sample with a seeded device", "[Measures]") { - for (std::size_t _ = 0; _ < 5; _++) { - std::unique_ptr sim = std::make_unique(); - std::unique_ptr sim1 = std::make_unique(); - - std::size_t shots = 100; - - std::vector samples(shots * 4); - MemRefT buffer{ - samples.data(), samples.data(), 0, {shots, 1}, {1, 1}}; - DataView view(buffer.data_aligned, buffer.offset, - buffer.sizes, buffer.strides); - - std::vector samples1(shots * 4); - MemRefT buffer1{ - samples1.data(), samples1.data(), 0, {shots, 1}, {1, 1}}; - DataView view1(buffer1.data_aligned, buffer1.offset, - buffer1.sizes, buffer1.strides); - - std::mt19937 gen(37); - sim->SetDevicePRNG(&gen); + std::size_t shots = 100; + std::array, 2> sims; + std::vector> sample_vec(2, + std::vector(shots * 4)); + + std::vector> buffers{ + MemRefT{ + sample_vec[0].data(), sample_vec[0].data(), 0, {shots, 1}, {1, 1}}, + MemRefT{ + sample_vec[1].data(), sample_vec[1].data(), 0, {shots, 1}, {1, 1}}, + }; + std::vector> views{ + DataView(buffers[0].data_aligned, buffers[0].offset, + buffers[0].sizes, buffers[0].strides), + DataView(buffers[1].data_aligned, buffers[1].offset, + buffers[1].sizes, buffers[1].strides)}; + + std::vector gens{std::mt19937{37}, std::mt19937{37}}; + + auto circ = [shots](LKSimulator &sim, DataView &view, + std::mt19937 &gen) { + sim.SetDevicePRNG(&gen); std::vector Qs; Qs.reserve(1); - Qs.push_back(sim->AllocateQubit()); - sim->NamedOperation("Hadamard", {}, {Qs[0]}, false); - sim->NamedOperation("RX", {0.5}, {Qs[0]}, false); - sim->Sample(view, shots); - - std::mt19937 gen1(37); - sim1->SetDevicePRNG(&gen1); - std::vector Qs1; - Qs1.reserve(1); - Qs1.push_back(sim1->AllocateQubit()); - sim1->NamedOperation("Hadamard", {}, {Qs1[0]}, false); - sim1->NamedOperation("RX", {0.5}, {Qs1[0]}, false); - sim1->Sample(view1, shots); + Qs.push_back(sim.AllocateQubit()); + sim.NamedOperation("Hadamard", {}, {Qs[0]}, false); + sim.NamedOperation("RX", {0.5}, {Qs[0]}, false); + sim.Sample(view, shots); + }; + + for (std::size_t trial = 0; trial < 5; trial++) { + sims[0] = std::make_unique(); + sims[1] = std::make_unique(); + + for (std::size_t sim_idx = 0; sim_idx < sims.size(); sim_idx++) { + circ(*(sims[sim_idx]), views[sim_idx], gens[sim_idx]); + } - for (std::size_t i = 0; i < shots * 4; i++) { - CHECK((samples[i] == samples1[i])); + for (std::size_t i = 0; i < sample_vec[0].size(); i++) { + CHECK((sample_vec[0][i] == sample_vec[1][i])); } } } From 92b64f74644546abd11845c027e66eea76aba258 Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Thu, 3 Oct 2024 10:16:25 -0400 Subject: [PATCH 31/35] remove const for size_t --- .../catalyst/LightningKokkosSimulator.cpp | 11 +++++------ .../catalyst/LightningKokkosSimulator.hpp | 10 +++++----- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp index d37d550b28..cfe3a9c5d0 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -342,8 +342,7 @@ void LightningKokkosSimulator::PartialProbs( std::move(dv_probs.begin(), dv_probs.end(), probs.begin()); } -std::vector -LightningKokkosSimulator::GenerateSamples(const size_t shots) { +std::vector LightningKokkosSimulator::GenerateSamples(size_t shots) { // generate_samples is a member function of the Measures class. Pennylane::LightningKokkos::Measures::Measurements m{ *(this->device_sv)}; @@ -357,7 +356,7 @@ LightningKokkosSimulator::GenerateSamples(const size_t shots) { } void LightningKokkosSimulator::Sample(DataView &samples, - const std::size_t shots) { + std::size_t shots) { auto li_samples = this->GenerateSamples(shots); RT_FAIL_IF(samples.size() != li_samples.size(), @@ -379,7 +378,7 @@ void LightningKokkosSimulator::Sample(DataView &samples, } void LightningKokkosSimulator::PartialSample( DataView &samples, const std::vector &wires, - const std::size_t shots) { + std::size_t shots) { const std::size_t numWires = wires.size(); const std::size_t numQubits = this->GetNumQubits(); @@ -408,7 +407,7 @@ void LightningKokkosSimulator::PartialSample( void LightningKokkosSimulator::Counts(DataView &eigvals, DataView &counts, - const std::size_t shots) { + std::size_t shots) { const std::size_t numQubits = this->GetNumQubits(); const std::size_t numElements = 1U << numQubits; @@ -440,7 +439,7 @@ void LightningKokkosSimulator::Counts(DataView &eigvals, void LightningKokkosSimulator::PartialCounts( DataView &eigvals, DataView &counts, - const std::vector &wires, const std::size_t shots) { + const std::vector &wires, std::size_t shots) { const std::size_t numWires = wires.size(); const std::size_t numQubits = this->GetNumQubits(); const std::size_t numElements = 1U << numWires; diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp index 6b43404d45..d28959f7c3 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp @@ -96,7 +96,7 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { return res; } - auto GenerateSamples(const size_t shots) -> std::vector; + auto GenerateSamples(size_t shots) -> std::vector; public: explicit LightningKokkosSimulator(const std::string &kwargs = "{}") { @@ -157,16 +157,16 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { void Probs(DataView &probs) override; void PartialProbs(DataView &probs, const std::vector &wires) override; - void Sample(DataView &samples, const std::size_t shots) override; + void Sample(DataView &samples, std::size_t shots) override; void PartialSample(DataView &samples, const std::vector &wires, - const std::size_t shots) override; + std::size_t shots) override; void Counts(DataView &eigvals, DataView &counts, - const std::size_t shots) override; + std::size_t shots) override; void PartialCounts(DataView &eigvals, DataView &counts, const std::vector &wires, - const std::size_t shots) override; + std::size_t shots) override; auto Measure(QubitIdType wire, std::optional postselect = std::nullopt) -> Result override; From edfa8fd9ad0981e89a542cc342826e59dd660f2b Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Thu, 3 Oct 2024 11:06:11 -0400 Subject: [PATCH 32/35] rewrite the measurement seeding kokkos test to reuse common furniture as well --- .../tests/Test_LightningKokkosMeasures.cpp | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp index a58f6bb879..7e7df84228 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp @@ -1754,27 +1754,27 @@ TEST_CASE("Counts and PartialCounts tests with numWires=0-4 shots=100", } TEST_CASE("Measurement with a seeded device", "[Measures]") { - for (std::size_t _ = 0; _ < 5; _++) { - std::unique_ptr sim = std::make_unique(); - std::unique_ptr sim1 = std::make_unique(); + std::array, 2> sims; + std::vector gens{std::mt19937{37}, std::mt19937{37}}; - std::mt19937 gen(37); - sim->SetDevicePRNG(&gen); + auto circuit = [](LKSimulator &sim, std::mt19937 &gen) { + sim.SetDevicePRNG(&gen); std::vector Qs; Qs.reserve(1); - Qs.push_back(sim->AllocateQubit()); - sim->NamedOperation("Hadamard", {}, {Qs[0]}, false); + Qs.push_back(sim.AllocateQubit()); + sim.NamedOperation("Hadamard", {}, {Qs[0]}, false); auto m = sim->Measure(Qs[0]); + return m; + }; + + for (std::size_t trial = 0; trial < 5; trial++) { + sims[0] = std::make_unique(); + sims[1] = std::make_unique(); - std::mt19937 gen1(37); - sim1->SetDevicePRNG(&gen1); - std::vector Qs1; - Qs1.reserve(1); - Qs1.push_back(sim1->AllocateQubit()); - sim1->NamedOperation("Hadamard", {}, {Qs1[0]}, false); - auto m1 = sim1->Measure(Qs1[0]); + auto m0 = circuit(*(sims[0]), gens[0]); + auto m1 = circuit(*(sims[1]), gens[1]); - CHECK(*m == *m1); + CHECK(*m0 == *m1); } } @@ -1798,8 +1798,8 @@ TEST_CASE("Sample with a seeded device", "[Measures]") { std::vector gens{std::mt19937{37}, std::mt19937{37}}; - auto circ = [shots](LKSimulator &sim, DataView &view, - std::mt19937 &gen) { + auto circuit = [shots](LKSimulator &sim, DataView &view, + std::mt19937 &gen) { sim.SetDevicePRNG(&gen); std::vector Qs; Qs.reserve(1); @@ -1814,7 +1814,7 @@ TEST_CASE("Sample with a seeded device", "[Measures]") { sims[1] = std::make_unique(); for (std::size_t sim_idx = 0; sim_idx < sims.size(); sim_idx++) { - circ(*(sims[sim_idx]), views[sim_idx], gens[sim_idx]); + circuit(*(sims[sim_idx]), views[sim_idx], gens[sim_idx]); } for (std::size_t i = 0; i < sample_vec[0].size(); i++) { From 5306829f1b9df672a88af9161ea7419d3f0556b5 Mon Sep 17 00:00:00 2001 From: ringo-but-quantum Date: Thu, 3 Oct 2024 15:07:01 +0000 Subject: [PATCH 33/35] Auto update version from '0.39.0-dev36' to '0.39.0-dev37' --- pennylane_lightning/core/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index 9b3cc2f16a..eb1de07d4e 100644 --- a/pennylane_lightning/core/_version.py +++ b/pennylane_lightning/core/_version.py @@ -16,4 +16,4 @@ Version number (major.minor.patch[-label]) """ -__version__ = "0.39.0-dev36" +__version__ = "0.39.0-dev37" From ddc67326f7d9b22d5bf743c43c99606371e8ea8d Mon Sep 17 00:00:00 2001 From: Haochen Wang Date: Thu, 3 Oct 2024 11:09:53 -0400 Subject: [PATCH 34/35] small bug --- .../catalyst/tests/Test_LightningKokkosMeasures.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp index 7e7df84228..d32e6100ef 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosMeasures.cpp @@ -1763,7 +1763,7 @@ TEST_CASE("Measurement with a seeded device", "[Measures]") { Qs.reserve(1); Qs.push_back(sim.AllocateQubit()); sim.NamedOperation("Hadamard", {}, {Qs[0]}, false); - auto m = sim->Measure(Qs[0]); + auto m = sim.Measure(Qs[0]); return m; }; From c4d67f42aac3fe43433d0969c39a3365b025b2bb Mon Sep 17 00:00:00 2001 From: ringo-but-quantum Date: Thu, 3 Oct 2024 16:01:04 +0000 Subject: [PATCH 35/35] Auto update version from '0.39.0-dev37' to '0.39.0-dev38' --- pennylane_lightning/core/_version.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index eb1de07d4e..df5a1de733 100644 --- a/pennylane_lightning/core/_version.py +++ b/pennylane_lightning/core/_version.py @@ -16,4 +16,4 @@ Version number (major.minor.patch[-label]) """ -__version__ = "0.39.0-dev37" +__version__ = "0.39.0-dev38"