diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index b41152626..9fe1ce143 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -55,6 +55,9 @@ * The `setBasisState` and `setStateVector` methods of `StateVectorLQubit` and `StateVectorKokkos` are overloaded to support PennyLane-like parameters. [(#843)](https://github.com/PennyLaneAI/pennylane-lightning/pull/843) +* Add `SetState` and `SetBasisState` to `LightningKokkosSimulator`. + [(#861)](https://github.com/PennyLaneAI/pennylane-lightning/pull/861) + * `ENABLE_LAPACK` is off by default for all Lightning backends. [(#825)](https://github.com/PennyLaneAI/pennylane-lightning/pull/825) diff --git a/pennylane_lightning/core/_version.py b/pennylane_lightning/core/_version.py index 8dd47c9d0..f81fe12cd 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.38.0-dev45" +__version__ = "0.38.0-dev46" diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/StateVectorKokkos.hpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/StateVectorKokkos.hpp index 13f4889bb..3b7305d90 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/StateVectorKokkos.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/StateVectorKokkos.hpp @@ -189,6 +189,8 @@ class StateVectorKokkos final */ void setStateVector(const std::vector &indices, const std::vector &values) { + PL_ABORT_IF_NOT(indices.size() == values.size(), + "Inconsistent indices and values dimensions.") initZeros(); auto d_indices = vector2view(indices); auto d_values = vector2view(values); 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 14f2d54c3..f42a39207 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.cpp @@ -137,6 +137,23 @@ void LightningKokkosSimulator::PrintState() { } /// LCOV_EXCL_STOP +void LightningKokkosSimulator::SetState(DataView, 1> &data, + std::vector &wires) { + std::size_t expected_wires = static_cast(log2(data.size())); + RT_ASSERT(expected_wires == wires.size()); + std::vector> data_vector(data.begin(), data.end()); + std::vector wires_size_t(wires.begin(), wires.end()); + + this->device_sv->setStateVector(data_vector, wires_size_t); +} + +void LightningKokkosSimulator::SetBasisState(DataView &data, + std::vector &wires) { + std::vector basis_state(data.begin(), data.end()); + std::vector wires_size_t(wires.begin(), wires.end()); + this->device_sv->setBasisState(basis_state, wires_size_t); +} + auto LightningKokkosSimulator::Zero() const -> Result { return const_cast(&GLOBAL_RESULT_FALSE_CONST); } 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 faaae9715..c20b0ded7 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/LightningKokkosSimulator.hpp @@ -118,9 +118,13 @@ class LightningKokkosSimulator final : public Catalyst::Runtime::QuantumDevice { [[nodiscard]] auto GetNumQubits() const -> size_t override; void StartTapeRecording() override; void StopTapeRecording() override; - void SetDeviceShots(size_t shots) override; + void SetDeviceShots(std::size_t shots) override; void SetDevicePRNG(std::mt19937 *) override; - [[nodiscard]] auto GetDeviceShots() const -> size_t override; + void SetState(DataView, 1> &, + std::vector &) override; + void SetBasisState(DataView &, + std::vector &) override; + [[nodiscard]] auto GetDeviceShots() const -> std::size_t override; void PrintState() override; [[nodiscard]] auto Zero() const -> Result override; [[nodiscard]] auto One() const -> Result override; diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosSimulator.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosSimulator.cpp index 4df813266..8b6eacb46 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosSimulator.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/catalyst/tests/Test_LightningKokkosSimulator.cpp @@ -659,4 +659,46 @@ TEST_CASE("LightningKokkosSimulator::GateSet", "[GateSet]") { expected{3, 0, 1, {"Hadamard", "Hadamard", "IsingZZ"}, {}}; REQUIRE(LKsim->CacheManagerInfo() == expected); } + + SECTION("Test setStateVector") { + std::unique_ptr LKsim = std::make_unique(); + constexpr std::size_t n_qubits = 2; + std::vector Qs = LKsim->AllocateQubits(n_qubits); + + std::vector> data = {{0.5, 0.5}, {0.0, 0.0}}; + DataView, 1> data_view(data); + std::vector wires = {1}; + LKsim->SetState(data_view, wires); + + std::vector> state(1U << LKsim->GetNumQubits()); + DataView, 1> view(state); + LKsim->State(view); + + std::complex c1{0.5, 0.5}; + std::complex c2{0.0, 0.0}; + CHECK(state[0] == PLApproxComplex(c1).epsilon(1e-5)); + CHECK(state[1] == PLApproxComplex(c2).epsilon(1e-5)); + CHECK(state[2] == PLApproxComplex(c2).epsilon(1e-5)); + CHECK(state[3] == PLApproxComplex(c2).epsilon(1e-5)); + } + + SECTION("Test setBasisState") { + std::unique_ptr LKsim = std::make_unique(); + constexpr std::size_t n_qubits = 1; + std::vector Qs = LKsim->AllocateQubits(n_qubits); + + std::vector data = {0}; + DataView data_view(data); + std::vector wires = {0}; + LKsim->SetBasisState(data_view, wires); + + std::vector> state(1U << LKsim->GetNumQubits()); + DataView, 1> view(state); + LKsim->State(view); + + std::complex c1{1.0, 0.0}; + std::complex c2{0.0, 0.0}; + CHECK(state[0] == PLApproxComplex(c1).epsilon(1e-5)); + CHECK(state[1] == PLApproxComplex(c2).epsilon(1e-5)); + } } diff --git a/pennylane_lightning/core/src/simulators/lightning_kokkos/tests/Test_StateVectorLKokkos.cpp b/pennylane_lightning/core/src/simulators/lightning_kokkos/tests/Test_StateVectorLKokkos.cpp index ea82dfcb3..0d2161ebd 100644 --- a/pennylane_lightning/core/src/simulators/lightning_kokkos/tests/Test_StateVectorLKokkos.cpp +++ b/pennylane_lightning/core/src/simulators/lightning_kokkos/tests/Test_StateVectorLKokkos.cpp @@ -129,7 +129,13 @@ TEMPLATE_PRODUCT_TEST_CASE("StateVectorKokkos::setState", "[errors]", "wires must take values lower than the number of qubits.")); } - SECTION("setStateVector incompatible dimensions") { + SECTION("setStateVector incompatible dimensions indices & values") { + REQUIRE_THROWS_WITH( + sv.setStateVector({0, 1}, std::vector(4, 0.0)), + Catch::Contains("Inconsistent indices and values dimensions.")); + } + + SECTION("setStateVector incompatible dimensions state & wires") { REQUIRE_THROWS_WITH( sv.setStateVector(std::vector(2, 0.0), {0, 1}), Catch::Contains("Inconsistent state and wires dimensions."));