def test_while_loop_invalid_params_setter(self): """Verify we catch invalid param settings for WhileLoopOp.""" body = QuantumCircuit(3, 1) condition = (body.clbits[0], True) bad_body = QuantumCircuit(2, 1) op = WhileLoopOp(condition, body) with self.assertRaisesRegex( CircuitError, r"num_clbits different than that of the WhileLoopOp"): op.params = [bad_body]
def test_while_loop_invalid_instantiation(self): """Verify we catch invalid instantiations of WhileLoopOp.""" body = QuantumCircuit(3, 1) condition = (body.clbits[0], True) with self.assertRaisesRegex( CircuitError, r"A classical condition should be a 2-tuple"): _ = WhileLoopOp(0, body) with self.assertRaisesRegex( CircuitError, r"A classical condition should be a 2-tuple"): _ = WhileLoopOp((Clbit(), None), body) with self.assertRaisesRegex(CircuitError, r"of type QuantumCircuit"): _ = WhileLoopOp(condition, XGate())
def generate_control_flow_circuits(): """Test qpy serialization with control flow instructions.""" from qiskit.circuit.controlflow import WhileLoopOp, IfElseOp, ForLoopOp # If instruction circuits = [] qc = QuantumCircuit(2, 2, name="control_flow") qc.h(0) qc.measure(0, 0) true_body = QuantumCircuit(1) true_body.x(0) if_op = IfElseOp((qc.clbits[0], True), true_body=true_body) qc.append(if_op, [1]) qc.measure(1, 1) circuits.append(qc) # If else instruction qc = QuantumCircuit(2, 2, name="if_else") qc.h(0) qc.measure(0, 0) false_body = QuantumCircuit(1) false_body.y(0) if_else_op = IfElseOp((qc.clbits[0], True), true_body, false_body) qc.append(if_else_op, [1]) qc.measure(1, 1) circuits.append(qc) # While loop qc = QuantumCircuit(2, 1, name="while_loop") block = QuantumCircuit(2, 1) block.h(0) block.cx(0, 1) block.measure(0, 0) while_loop = WhileLoopOp((qc.clbits[0], 0), block) qc.append(while_loop, [0, 1], [0]) circuits.append(qc) # for loop range qc = QuantumCircuit(2, 1, name="for_loop") body = QuantumCircuit(2, 1) body.h(0) body.cx(0, 1) body.measure(0, 0) body.break_loop().c_if(0, True) for_loop_op = ForLoopOp(range(5), None, body=body) qc.append(for_loop_op, [0, 1], [0]) circuits.append(qc) # For loop iterator qc = QuantumCircuit(2, 1, name="for_loop_iterator") for_loop_op = ForLoopOp(iter(range(5)), None, body=body) qc.append(for_loop_op, [0, 1], [0]) circuits.append(qc) return circuits
def test_while_loop_instantiation(self, condition): """Verify creation and properties of a WhileLoopOp.""" body = QuantumCircuit(3, 1) body.add_register([condition[0]] if isinstance(condition[0], Clbit ) else condition[0]) op = WhileLoopOp(condition, body) self.assertIsInstance(op, ControlFlowOp) self.assertIsInstance(op, Instruction) self.assertEqual(op.name, "while_loop") self.assertEqual(op.num_qubits, body.num_qubits) self.assertEqual(op.num_clbits, body.num_clbits) self.assertEqual(op.condition, condition) self.assertEqual(op.params, [body]) self.assertEqual(op.blocks, (body, ))
def test_appending_while_loop_op(self, condition): """Verify we can append a WhileLoopOp to a QuantumCircuit.""" body = QuantumCircuit(3, 1) body.add_register([condition[0]] if isinstance(condition[0], Clbit ) else condition[0]) op = WhileLoopOp(condition, body) qc = QuantumCircuit(5, 2) qc.append(op, [1, 2, 3], [1]) self.assertEqual(qc.data[0].operation.name, "while_loop") self.assertEqual(qc.data[0].operation.params, [body]) self.assertEqual(qc.data[0].operation.condition, condition) self.assertEqual(qc.data[0].qubits, tuple(qc.qubits[1:4])) self.assertEqual(qc.data[0].clbits, (qc.clbits[1], ))