Skip to content

Commit e4db7f1

Browse files
Add qchem gates and generators (#289)
* Add QCHEM gates and gens * Update tests * Update _serialize * Auto update version * Apply codecov suggestions * Update tests * Update gates * Apply clang-tidy errors * Fix clang-tidy warnings * Auto update version * Update CHANGELOG * Update qchem gates * Update lightning * Fix an issue with _serialize_ops * Update formatting * Apply lint comments * Update QChem Gates * Add code review suggestions * Apply code review suggestions * Update CHANGELOG Co-authored-by: Dev version update bot <[email protected]>
1 parent b58394e commit e4db7f1

20 files changed

+1433
-125
lines changed

.github/CHANGELOG.md

+7-1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
### New features since last release
44

5+
* Add `SingleExcitation` and `DoubleExcitation` qchem gates and generators.
6+
[(#289)](https://github.com/PennyLaneAI/pennylane-lightning/pull/289)
7+
58
### Breaking changes
69

710
### Improvements
@@ -25,11 +28,14 @@ dev2 = qml.device('lightning.qubit', wires=4, c_dtype=np.complex128) # for doubl
2528

2629
### Bug fixes
2730

31+
* Fix the issue with using available `clang-format` version in format.
32+
[#(288)](https://github.com/PennyLaneAI/pennylane-lightning/pull/288)
33+
2834
### Contributors
2935

3036
This release contains contributions from (in alphabetical order):
3137

32-
Mikhail Andrenkov, Chae-Yeun Park
38+
Mikhail Andrenkov, Ali Asadi, Chae-Yeun Park
3339

3440
---
3541

pennylane_lightning/_serialize.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ def _serialize_obs(tape: QuantumTape, wires_map: dict, use_csingle: bool = False
117117

118118

119119
def _serialize_ops(
120-
tape: QuantumTape, wires_map: dict, use_csingle: bool = False
120+
tape: QuantumTape, wires_map: dict
121121
) -> Tuple[List[List[str]], List[np.ndarray], List[List[int]], List[bool], List[np.ndarray]]:
122122
"""Serializes the operations of an input tape.
123123
@@ -126,7 +126,6 @@ def _serialize_ops(
126126
Args:
127127
tape (QuantumTape): the input quantum tape
128128
wires_map (dict): a dictionary mapping input wires to the device's backend wires
129-
use_csingle (bool): whether to use np.complex64 instead of np.complex128
130129
131130
Returns:
132131
Tuple[list, list, list, list, list]: A serialization of the operations, containing a list
@@ -139,8 +138,6 @@ def _serialize_ops(
139138
inverses = []
140139
mats = []
141140

142-
sv_py = StateVectorC64 if use_csingle else StateVectorC128
143-
144141
uses_stateprep = False
145142

146143
for o in tape.operations:

pennylane_lightning/_version.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,4 @@
1616
Version number (major.minor.patch[-label])
1717
"""
1818

19-
__version__ = "0.24.0-dev7"
19+
__version__ = "0.24.0-dev8"

pennylane_lightning/lightning_qubit.py

+3-17
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,6 @@
6363
CPP_BINARY_AVAILABLE = False
6464

6565

66-
UNSUPPORTED_PARAM_GATES_ADJOINT = (
67-
"SingleExcitation",
68-
"SingleExcitationPlus",
69-
"SingleExcitationMinus",
70-
"DoubleExcitation",
71-
"DoubleExcitationPlus",
72-
"DoubleExcitationMinus",
73-
)
74-
75-
7666
def _chunk_iterable(it, num_chunks):
7767
"Lazy-evaluated chunking of given iterable from https://stackoverflow.com/a/22045226"
7868
it = iter(it)
@@ -249,9 +239,7 @@ def adjoint_diff_support_check(self, tape):
249239
)
250240

251241
for op in tape.operations:
252-
if (
253-
op.num_params > 1 and not isinstance(op, Rot)
254-
) or op.name in UNSUPPORTED_PARAM_GATES_ADJOINT:
242+
if op.num_params > 1 and not isinstance(op, Rot):
255243
raise QuantumFunctionError(
256244
f"The {op.name} operation is not supported using "
257245
'the "adjoint" differentiation method'
@@ -286,7 +274,7 @@ def adjoint_jacobian(self, tape, starting_state=None, use_device_state=False):
286274
adj = AdjointJacobianC128()
287275

288276
obs_serialized = _serialize_obs(tape, self.wire_map, use_csingle=self.use_csingle)
289-
ops_serialized, use_sp = _serialize_ops(tape, self.wire_map, use_csingle=self.use_csingle)
277+
ops_serialized, use_sp = _serialize_ops(tape, self.wire_map)
290278

291279
ops_serialized = adj.create_ops_list(*ops_serialized)
292280

@@ -421,9 +409,7 @@ def processing_fn(tape):
421409
ket = np.ravel(self._pre_rotated_state)
422410

423411
obs_serialized = _serialize_obs(tape, self.wire_map, use_csingle=self.use_csingle)
424-
ops_serialized, use_sp = _serialize_ops(
425-
tape, self.wire_map, use_csingle=self.use_csingle
426-
)
412+
ops_serialized, use_sp = _serialize_ops(tape, self.wire_map)
427413

428414
ops_serialized = V.create_ops_list(*ops_serialized)
429415

pennylane_lightning/src/gates/AvailableKernels.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "TypeList.hpp"
2222
#include "cpu_kernels/GateImplementationsLM.hpp"
2323
#include "cpu_kernels/GateImplementationsPI.hpp"
24+
#include "cpu_kernels/QChemGateImplementations.hpp"
2425

2526
namespace Pennylane {
2627
/**

pennylane_lightning/src/gates/Constant.hpp

+52
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,21 @@ namespace Pennylane::Gates::Constant {
6868
std::pair<GateOperation, std::string_view>{GateOperation::CRY, "CRY"},
6969
std::pair<GateOperation, std::string_view>{GateOperation::CRZ, "CRZ"},
7070
std::pair<GateOperation, std::string_view>{GateOperation::CRot, "CRot"},
71+
std::pair<GateOperation, std::string_view>{GateOperation::SingleExcitation,
72+
"SingleExcitation"},
73+
std::pair<GateOperation, std::string_view>{
74+
GateOperation::SingleExcitationMinus, "SingleExcitationMinus"},
75+
std::pair<GateOperation, std::string_view>{
76+
GateOperation::SingleExcitationPlus, "SingleExcitationPlus"},
7177
std::pair<GateOperation, std::string_view>{GateOperation::Toffoli,
7278
"Toffoli"},
7379
std::pair<GateOperation, std::string_view>{GateOperation::CSWAP, "CSWAP"},
80+
std::pair<GateOperation, std::string_view>{GateOperation::DoubleExcitation,
81+
"DoubleExcitation"},
82+
std::pair<GateOperation, std::string_view>{
83+
GateOperation::DoubleExcitationMinus, "DoubleExcitationMinus"},
84+
std::pair<GateOperation, std::string_view>{
85+
GateOperation::DoubleExcitationPlus, "DoubleExcitationPlus"},
7486
std::pair<GateOperation, std::string_view>{GateOperation::MultiRZ,
7587
"MultiRZ"},
7688
};
@@ -104,8 +116,24 @@ namespace Pennylane::Gates::Constant {
104116
std::pair<GeneratorOperation, std::string_view>{
105117
GeneratorOperation::ControlledPhaseShift,
106118
"GeneratorControlledPhaseShift"},
119+
std::pair<GeneratorOperation, std::string_view>{
120+
GeneratorOperation::SingleExcitation, "GeneratorSingleExcitation"},
121+
std::pair<GeneratorOperation, std::string_view>{
122+
GeneratorOperation::SingleExcitationMinus,
123+
"GeneratorSingleExcitationMinus"},
124+
std::pair<GeneratorOperation, std::string_view>{
125+
GeneratorOperation::SingleExcitationPlus,
126+
"GeneratorSingleExcitationPlus"},
107127
std::pair<GeneratorOperation, std::string_view>{GeneratorOperation::MultiRZ,
108128
"GeneratorMultiRZ"},
129+
std::pair<GeneratorOperation, std::string_view>{
130+
GeneratorOperation::DoubleExcitation, "GeneratorDoubleExcitation"},
131+
std::pair<GeneratorOperation, std::string_view>{
132+
GeneratorOperation::DoubleExcitationMinus,
133+
"GeneratorDoubleExcitationMinus"},
134+
std::pair<GeneratorOperation, std::string_view>{
135+
GeneratorOperation::DoubleExcitationPlus,
136+
"GeneratorDoubleExcitationPlus"},
109137
};
110138
/**
111139
* @brief Matrix names.
@@ -147,7 +175,13 @@ namespace Pennylane::Gates::Constant {
147175
std::pair<GateOperation, size_t>{GateOperation::CRY, 2},
148176
std::pair<GateOperation, size_t>{GateOperation::CRZ, 2},
149177
std::pair<GateOperation, size_t>{GateOperation::CRot, 2},
178+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitation, 2},
179+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitationMinus, 2},
180+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitationPlus, 2},
150181
std::pair<GateOperation, size_t>{GateOperation::Toffoli, 3},
182+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitation, 4},
183+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitationMinus, 4},
184+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitationPlus, 4},
151185
std::pair<GateOperation, size_t>{GateOperation::CSWAP, 3},
152186
};
153187

@@ -166,8 +200,20 @@ namespace Pennylane::Gates::Constant {
166200
std::pair<GeneratorOperation, std::size_t>{GeneratorOperation::CRX, 2},
167201
std::pair<GeneratorOperation, std::size_t>{GeneratorOperation::CRY, 2},
168202
std::pair<GeneratorOperation, std::size_t>{GeneratorOperation::CRZ, 2},
203+
std::pair<GeneratorOperation, std::size_t>{
204+
GeneratorOperation::SingleExcitation, 2},
205+
std::pair<GeneratorOperation, std::size_t>{
206+
GeneratorOperation::SingleExcitationMinus, 2},
207+
std::pair<GeneratorOperation, std::size_t>{
208+
GeneratorOperation::SingleExcitationPlus, 2},
169209
std::pair<GeneratorOperation, std::size_t>{
170210
GeneratorOperation::ControlledPhaseShift, 2},
211+
std::pair<GeneratorOperation, std::size_t>{
212+
GeneratorOperation::DoubleExcitation, 4},
213+
std::pair<GeneratorOperation, std::size_t>{
214+
GeneratorOperation::DoubleExcitationMinus, 4},
215+
std::pair<GeneratorOperation, std::size_t>{
216+
GeneratorOperation::DoubleExcitationPlus, 4},
171217
};
172218

173219
/**
@@ -197,8 +243,14 @@ namespace Pennylane::Gates::Constant {
197243
std::pair<GateOperation, size_t>{GateOperation::CRX, 1},
198244
std::pair<GateOperation, size_t>{GateOperation::CRY, 1},
199245
std::pair<GateOperation, size_t>{GateOperation::CRZ, 1},
246+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitation, 1},
247+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitationMinus, 1},
248+
std::pair<GateOperation, size_t>{GateOperation::SingleExcitationPlus, 1},
200249
std::pair<GateOperation, size_t>{GateOperation::CRot, 3},
201250
std::pair<GateOperation, size_t>{GateOperation::Toffoli, 0},
251+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitation, 1},
252+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitationMinus, 1},
253+
std::pair<GateOperation, size_t>{GateOperation::DoubleExcitationPlus, 1},
202254
std::pair<GateOperation, size_t>{GateOperation::CSWAP, 0},
203255
std::pair<GateOperation, size_t>{GateOperation::MultiRZ, 1},
204256
};

pennylane_lightning/src/gates/GateOperation.hpp

+13
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,16 @@ enum class GateOperation : uint32_t {
5252
CRY,
5353
CRZ,
5454
CRot,
55+
SingleExcitation,
56+
SingleExcitationMinus,
57+
SingleExcitationPlus,
5558
/* Three-qubit gates */
5659
Toffoli,
5760
CSWAP,
61+
/* Four-qubit gates */
62+
DoubleExcitation,
63+
DoubleExcitationMinus,
64+
DoubleExcitationPlus,
5865
/* Mutli-qubit gates */
5966
MultiRZ,
6067
/* END (placeholder) */
@@ -77,6 +84,12 @@ enum class GeneratorOperation : uint32_t {
7784
CRY,
7885
CRZ,
7986
ControlledPhaseShift,
87+
SingleExcitation,
88+
SingleExcitationMinus,
89+
SingleExcitationPlus,
90+
DoubleExcitation,
91+
DoubleExcitationMinus,
92+
DoubleExcitationPlus,
8093
MultiRZ,
8194
/* END (placeholder) */
8295
END

pennylane_lightning/src/gates/OpToMemberFuncPtr.hpp

+82
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,26 @@ struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
188188
&GateImplementation::template applyCRot<PrecisionT, ParamT>;
189189
};
190190
template <class PrecisionT, class ParamT, class GateImplementation>
191+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
192+
GateOperation::SingleExcitation> {
193+
constexpr static auto value =
194+
&GateImplementation::template applySingleExcitation<PrecisionT, ParamT>;
195+
};
196+
template <class PrecisionT, class ParamT, class GateImplementation>
197+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
198+
GateOperation::SingleExcitationMinus> {
199+
constexpr static auto value =
200+
&GateImplementation::template applySingleExcitationMinus<PrecisionT,
201+
ParamT>;
202+
};
203+
template <class PrecisionT, class ParamT, class GateImplementation>
204+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
205+
GateOperation::SingleExcitationPlus> {
206+
constexpr static auto value =
207+
&GateImplementation::template applySingleExcitationPlus<PrecisionT,
208+
ParamT>;
209+
};
210+
template <class PrecisionT, class ParamT, class GateImplementation>
191211
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
192212
GateOperation::Toffoli> {
193213
constexpr static auto value =
@@ -200,6 +220,26 @@ struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
200220
&GateImplementation::template applyCSWAP<PrecisionT>;
201221
};
202222
template <class PrecisionT, class ParamT, class GateImplementation>
223+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
224+
GateOperation::DoubleExcitation> {
225+
constexpr static auto value =
226+
&GateImplementation::template applyDoubleExcitation<PrecisionT, ParamT>;
227+
};
228+
template <class PrecisionT, class ParamT, class GateImplementation>
229+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
230+
GateOperation::DoubleExcitationMinus> {
231+
constexpr static auto value =
232+
&GateImplementation::template applyDoubleExcitationMinus<PrecisionT,
233+
ParamT>;
234+
};
235+
template <class PrecisionT, class ParamT, class GateImplementation>
236+
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
237+
GateOperation::DoubleExcitationPlus> {
238+
constexpr static auto value =
239+
&GateImplementation::template applyDoubleExcitationPlus<PrecisionT,
240+
ParamT>;
241+
};
242+
template <class PrecisionT, class ParamT, class GateImplementation>
203243
struct GateOpToMemberFuncPtr<PrecisionT, ParamT, GateImplementation,
204244
GateOperation::MultiRZ> {
205245
constexpr static auto value =
@@ -289,6 +329,48 @@ struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
289329
PrecisionT>;
290330
};
291331
template <class PrecisionT, class GateImplementation>
332+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
333+
GeneratorOperation::SingleExcitation> {
334+
constexpr static auto value =
335+
&GateImplementation::template applyGeneratorSingleExcitation<
336+
PrecisionT>;
337+
};
338+
template <class PrecisionT, class GateImplementation>
339+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
340+
GeneratorOperation::SingleExcitationMinus> {
341+
constexpr static auto value =
342+
&GateImplementation::template applyGeneratorSingleExcitationMinus<
343+
PrecisionT>;
344+
};
345+
template <class PrecisionT, class GateImplementation>
346+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
347+
GeneratorOperation::SingleExcitationPlus> {
348+
constexpr static auto value =
349+
&GateImplementation::template applyGeneratorSingleExcitationPlus<
350+
PrecisionT>;
351+
};
352+
template <class PrecisionT, class GateImplementation>
353+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
354+
GeneratorOperation::DoubleExcitation> {
355+
constexpr static auto value =
356+
&GateImplementation::template applyGeneratorDoubleExcitation<
357+
PrecisionT>;
358+
};
359+
template <class PrecisionT, class GateImplementation>
360+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
361+
GeneratorOperation::DoubleExcitationMinus> {
362+
constexpr static auto value =
363+
&GateImplementation::template applyGeneratorDoubleExcitationMinus<
364+
PrecisionT>;
365+
};
366+
template <class PrecisionT, class GateImplementation>
367+
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
368+
GeneratorOperation::DoubleExcitationPlus> {
369+
constexpr static auto value =
370+
&GateImplementation::template applyGeneratorDoubleExcitationPlus<
371+
PrecisionT>;
372+
};
373+
template <class PrecisionT, class GateImplementation>
292374
struct GeneratorOpToMemberFuncPtr<PrecisionT, GateImplementation,
293375
GeneratorOperation::MultiRZ> {
294376
constexpr static auto value =

0 commit comments

Comments
 (0)