Class GateImplementationsLM

Inheritance Relationships

Base Type

Class Documentation

class GateImplementationsLM : public Pennylane::Gates::PauliGenerator<GateImplementationsLM>

A gate operation implementation with less memory.

We use a bitwise operation to calculate the indices where the gate applies to on the fly.

Template Parameters

PrecisionT – Floating point precision of underlying statevector data

Public Static Functions

template<class PrecisionT>
static inline void applySingleQubitOp(std::complex<PrecisionT> *arr, size_t num_qubits, const std::complex<PrecisionT> *matrix, const std::vector<size_t> &wires, bool inverse = false)

Apply a single qubit gate to the statevector.

Parameters
  • arr – Pointer to the statevector.

  • num_qubits – Number of qubits.

  • matrix – Perfect square matrix in row-major order.

  • wire – A wire the gate applies to.

  • inverse – Indicate whether inverse should be taken.

template<class PrecisionT>
static inline void applyTwoQubitOp(std::complex<PrecisionT> *arr, size_t num_qubits, const std::complex<PrecisionT> *matrix, const std::vector<size_t> &wires, bool inverse = false)

Apply a two qubit gate to the statevector.

Parameters
  • arr – Pointer to the statevector.

  • num_qubits – Number of qubits.

  • matrix – Perfect square matrix in row-major order.

  • wires – Wires the gate applies to.

  • inverse – Indicate whether inverse should be taken.

template<class PrecisionT>
static inline void applyMultiQubitOp(std::complex<PrecisionT> *arr, size_t num_qubits, const std::complex<PrecisionT> *matrix, const std::vector<size_t> &wires, bool inverse)
template<class PrecisionT>
static inline void applyIdentity(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyPauliX(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyPauliY(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyPauliZ(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyHadamard(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyS(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyT(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyPhaseShift(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyRX(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyRY(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyRZ(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyRot(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT phi, ParamT theta, ParamT omega)
template<class PrecisionT>
static inline void applyCNOT(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyCY(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT>
static inline void applyCZ(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyCRot(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT phi, ParamT theta, ParamT omega)
template<class PrecisionT>
static inline void applySWAP(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse)
template<class PrecisionT, class ParamT>
static inline void applyIsingXX(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyIsingXY(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyIsingYY(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyIsingZZ(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT = PrecisionT>
static inline void applyControlledPhaseShift(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyCRX(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyCRY(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyCRZ(std::complex<PrecisionT> *arr, const size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static void applySingleExcitation(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static void applySingleExcitationMinus(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static void applySingleExcitationPlus(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT, class ParamT>
static inline void applyMultiRZ(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, bool inverse, ParamT angle)
template<class PrecisionT>
static inline auto applyGeneratorPhaseShift(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorIsingXX(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorIsingXY(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorIsingYY(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorIsingZZ(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorCRX(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorCRY(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorCRZ(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorControlledPhaseShift(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static auto applyGeneratorSingleExcitation(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static auto applyGeneratorSingleExcitationMinus(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static auto applyGeneratorSingleExcitationPlus(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT
template<class PrecisionT>
static inline auto applyGeneratorMultiRZ(std::complex<PrecisionT> *arr, size_t num_qubits, const std::vector<size_t> &wires, [[maybe_unused]] bool adj) -> PrecisionT

Public Static Attributes

static constexpr KernelType kernel_id = KernelType::LM
static constexpr std::string_view name = "LM"
template<typename PrecisionT>
static constexpr size_t required_alignment = std::alignment_of_v<PrecisionT>
template<typename PrecisionT>
static constexpr size_t packed_bytes = sizeof(PrecisionT)
static constexpr std::array implemented_gates = {GateOperation::Identity, GateOperation::PauliX, GateOperation::PauliY, GateOperation::PauliZ, GateOperation::Hadamard, GateOperation::S, GateOperation::T, GateOperation::PhaseShift, GateOperation::RX, GateOperation::RY, GateOperation::RZ, GateOperation::Rot, GateOperation::CNOT, GateOperation::CY, GateOperation::CZ, GateOperation::SWAP, GateOperation::IsingXX, GateOperation::IsingXY, GateOperation::IsingYY, GateOperation::IsingZZ, GateOperation::ControlledPhaseShift, GateOperation::CRX, GateOperation::CRY, GateOperation::CRZ, GateOperation::CRot, GateOperation::SingleExcitation, GateOperation::SingleExcitationMinus, GateOperation::SingleExcitationPlus, GateOperation::MultiRZ}
static constexpr std::array implemented_generators = {GeneratorOperation::PhaseShift, GeneratorOperation::RX, GeneratorOperation::RY, GeneratorOperation::RZ, GeneratorOperation::IsingXX, GeneratorOperation::IsingXY, GeneratorOperation::IsingYY, GeneratorOperation::IsingZZ, GeneratorOperation::CRX, GeneratorOperation::CRY, GeneratorOperation::CRZ, GeneratorOperation::ControlledPhaseShift, GeneratorOperation::SingleExcitation, GeneratorOperation::SingleExcitationMinus, GeneratorOperation::SingleExcitationPlus, GeneratorOperation::MultiRZ,}
static constexpr std::array implemented_matrices = {MatrixOperation::SingleQubitOp, MatrixOperation::TwoQubitOp, MatrixOperation::MultiQubitOp}