def test_while_loop_continue(self, method): backend = self.backend(method=method) qreg = QuantumRegister(1) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) circ.y(0) circ.measure(0, 0) # does not work # while circ.while_loop((creg, 1)): # circ.y(0) # circ.measure(0, 0) # circ.continue_loop() # circ.y(0) circ_while = QuantumCircuit(qreg, creg) circ_while.y(0) circ_while.measure(0, 0) circ_while.continue_loop() circ_while.y(0) circ_while.break_loop() circ.while_loop((creg, 1), circ_while, [0], [0]) circ.measure_all() result = backend.run(circ, method=method).result() self.assertSuccess(result) counts = result.get_counts() self.assertEqual(len(counts), 1) self.assertIn('0 0', counts)
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_qpy_with_for_loop_iterator(self): """Test qpy serialization with a for loop.""" qc = QuantumCircuit(2, 1) with qc.for_loop(iter(range(5))): qc.h(0) qc.cx(0, 1) qc.measure(0, 0) qc.break_loop().c_if(0, True) qpy_file = io.BytesIO() dump(qc, qpy_file) qpy_file.seek(0) new_circuit = load(qpy_file)[0] self.assertEqual(qc, new_circuit)
def test_for_loop_break_builder(self, method): backend = self.backend(method=method) qreg = QuantumRegister(5) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(0)) as a: circ.ry(a * numpy.pi, 0) circ.measure(0, 0) with circ.if_test((creg, 1)): circ.break_loop() with circ.for_loop(range(1)) as a: circ.ry(a * numpy.pi, 1) circ.measure(1, 0) with circ.if_test((creg, 1)): circ.break_loop() with circ.for_loop(range(2)) as a: circ.ry(a * numpy.pi, 2) circ.measure(2, 0) with circ.if_test((creg, 1)): circ.break_loop() with circ.for_loop(range(3)) as a: circ.ry(a * numpy.pi, 3) circ.measure(3, 0) with circ.if_test((creg, 1)): circ.break_loop() with circ.for_loop(range(4)) as a: circ.ry(a * numpy.pi, 4) circ.measure(4, 0) with circ.if_test((creg, 1)): circ.break_loop() circ.measure_all() result = backend.run(circ, method=method).result() self.assertSuccess(result) counts = result.get_counts() self.assertEqual(len(counts), 1) self.assertIn('11100 1', counts)