@@ -38,8 +38,8 @@ const Operations::OpSet StateOpSet(
38
38
OpType::save_amps_sq, OpType::save_stabilizer, OpType::save_clifford,
39
39
OpType::save_state, OpType::set_stabilizer, OpType::jump, OpType::mark},
40
40
// Gates
41
- {" CX" , " cx" , " cy" , " cz" , " swap" , " id" , " x" , " y" , " z" , " h " , " s " , " sdg " , " sx " ,
42
- " sxdg" , " delay" , " pauli" , " ecr" });
41
+ {" CX" , " cx" , " cy" , " cz" , " swap" , " id" , " x" , " y" , " z" , " h " ,
42
+ " s " , " sdg " , " sx " , " sxdg" , " delay" , " pauli" , " ecr" , " rx " , " ry " , " rz " });
43
43
44
44
enum class Gates {
45
45
id,
@@ -56,7 +56,10 @@ enum class Gates {
56
56
cz,
57
57
swap,
58
58
pauli,
59
- ecr
59
+ ecr,
60
+ rx,
61
+ ry,
62
+ rz
60
63
};
61
64
62
65
// ============================================================================
@@ -101,6 +104,9 @@ class State : public QuantumState::State<Clifford::Clifford> {
101
104
virtual std::vector<reg_t > sample_measure (const reg_t &qubits, uint_t shots,
102
105
RngEngine &rng) override ;
103
106
107
+ bool
108
+ validate_parameters (const std::vector<Operations::Op> &ops) const override ;
109
+
104
110
protected:
105
111
// -----------------------------------------------------------------------
106
112
// Apply instructions
@@ -203,7 +209,10 @@ const stringmap_t<Gates> State::gateset_({
203
209
{" cz" , Gates::cz}, // Controlled-Z gate
204
210
{" swap" , Gates::swap}, // SWAP gate
205
211
{" pauli" , Gates::pauli}, // Pauli gate
206
- {" ecr" , Gates::ecr} // ECR gate
212
+ {" ecr" , Gates::ecr}, // ECR gate
213
+ {" rx" , Gates::rx}, // RX gate (only support k * pi/2 cases)
214
+ {" ry" , Gates::ry}, // RY gate (only support k * pi/2 cases)
215
+ {" rz" , Gates::rz} // RZ gate (only support k * pi/2 cases)
207
216
});
208
217
209
218
// ============================================================================
@@ -245,6 +254,23 @@ void State::set_config(const Config &config) {
245
254
max_qubits_snapshot_probs_ = std::max<uint_t >(max_qubits_snapshot_probs_, 64 );
246
255
}
247
256
257
+ bool State::validate_parameters (const std::vector<Operations::Op> &ops) const {
258
+ for (int_t i = 0 ; i < ops.size (); i++) {
259
+ if (ops[i].type == OpType::gate) {
260
+ // check parameter of R gates
261
+ if (ops[i].name == " rx" || ops[i].name == " ry" || ops[i].name == " rz" ) {
262
+ double pi2 = std::real (ops[i].params [0 ]) * 2.0 / M_PI;
263
+ double pi2_int = (double )std::round (pi2);
264
+
265
+ if (!AER::Linalg::almost_equal (pi2, pi2_int)) {
266
+ return false ;
267
+ }
268
+ }
269
+ }
270
+ }
271
+ return true ;
272
+ }
273
+
248
274
// =========================================================================
249
275
// Implementation: apply operations
250
276
// =========================================================================
@@ -298,6 +324,7 @@ void State::apply_op(const Operations::Op &op, ExperimentResult &result,
298
324
}
299
325
300
326
void State::apply_gate (const Operations::Op &op) {
327
+ int_t pi2;
301
328
// Check Op is supported by State
302
329
auto it = gateset_.find (op.name );
303
330
if (it == gateset_.end ())
@@ -369,6 +396,53 @@ void State::apply_gate(const Operations::Op &op) {
369
396
BaseState::qreg_.append_x (op.qubits [0 ]);
370
397
BaseState::qreg_.append_x (op.qubits [1 ]);
371
398
break ;
399
+ case Gates::rx:
400
+ pi2 = (int_t )std::round (std::real (op.params [0 ]) * 2.0 / M_PI) & 3 ;
401
+ if (pi2 == 1 ) {
402
+ // HSH
403
+ BaseState::qreg_.append_h (op.qubits [0 ]);
404
+ BaseState::qreg_.append_s (op.qubits [0 ]);
405
+ BaseState::qreg_.append_h (op.qubits [0 ]);
406
+ } else if (pi2 == 2 ) {
407
+ // X
408
+ BaseState::qreg_.append_x (op.qubits [0 ]);
409
+ } else if (pi2 == 3 ) {
410
+ // HSdgH
411
+ BaseState::qreg_.append_h (op.qubits [0 ]);
412
+ BaseState::qreg_.append_z (op.qubits [0 ]);
413
+ BaseState::qreg_.append_s (op.qubits [0 ]);
414
+ BaseState::qreg_.append_h (op.qubits [0 ]);
415
+ }
416
+ break ;
417
+ case Gates::ry:
418
+ pi2 = (int_t )std::round (std::real (op.params [0 ]) * 2.0 / M_PI) & 3 ;
419
+ if (pi2 == 1 ) {
420
+ // HX
421
+ BaseState::qreg_.append_x (op.qubits [0 ]);
422
+ BaseState::qreg_.append_h (op.qubits [0 ]);
423
+ } else if (pi2 == 2 ) {
424
+ // Y
425
+ BaseState::qreg_.append_y (op.qubits [0 ]);
426
+ } else if (pi2 == 3 ) {
427
+ // Hdg
428
+ BaseState::qreg_.append_h (op.qubits [0 ]);
429
+ BaseState::qreg_.append_x (op.qubits [0 ]);
430
+ }
431
+ break ;
432
+ case Gates::rz:
433
+ pi2 = (int_t )std::round (std::real (op.params [0 ]) * 2.0 / M_PI) & 3 ;
434
+ if (pi2 == 1 ) {
435
+ // S
436
+ BaseState::qreg_.append_s (op.qubits [0 ]);
437
+ } else if (pi2 == 2 ) {
438
+ // Z
439
+ BaseState::qreg_.append_z (op.qubits [0 ]);
440
+ } else if (pi2 == 3 ) {
441
+ // Sdg
442
+ BaseState::qreg_.append_z (op.qubits [0 ]);
443
+ BaseState::qreg_.append_s (op.qubits [0 ]);
444
+ }
445
+ break ;
372
446
default :
373
447
// We shouldn't reach here unless there is a bug in gateset
374
448
throw std::invalid_argument (
0 commit comments