def test_layers_basic(self): """The layers() method returns a list of layers, each of them with a list of nodes.""" qreg = QuantumRegister(2, 'qr') creg = ClassicalRegister(2, 'cr') qubit0 = qreg[0] qubit1 = qreg[1] clbit0 = creg[0] clbit1 = creg[1] x_gate = XGate() x_gate.condition = (creg, 3) dag = DAGCircuit() dag.add_qreg(qreg) dag.add_creg(creg) dag.apply_operation_back(HGate(), [qubit0], []) dag.apply_operation_back(CXGate(), [qubit0, qubit1], []) dag.apply_operation_back(Measure(), [qubit1, clbit1], []) dag.apply_operation_back(x_gate, [qubit1], []) dag.apply_operation_back(Measure(), [qubit0, clbit0], []) dag.apply_operation_back(Measure(), [qubit1, clbit1], []) layers = list(dag.layers()) self.assertEqual(5, len(layers)) name_layers = [[ node.op.name for node in layer["graph"].nodes() if node.type == "op" ] for layer in layers] self.assertEqual( [['h'], ['cx'], ['measure'], ['x'], ['measure', 'measure']], name_layers)
def test_apply_operation_back(self): """The apply_operation_back() method.""" x_gate = XGate() x_gate.condition = self.condition self.dag.apply_operation_back(HGate(), [self.qubit0], []) self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], []) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], []) self.dag.apply_operation_back(x_gate, [self.qubit1], []) self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], []) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], []) self.assertEqual(len(list(self.dag.nodes())), 16) self.assertEqual(len(list(self.dag.edges())), 17)
def test_edges(self): """Test that DAGCircuit.edges() behaves as expected with ops.""" x_gate = XGate() x_gate.condition = self.condition self.dag.apply_operation_back(HGate(), [self.qubit0], []) self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], []) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], []) self.dag.apply_operation_back(x_gate, [self.qubit1], []) self.dag.apply_operation_back(Measure(), [self.qubit0, self.clbit0], []) self.dag.apply_operation_back(Measure(), [self.qubit1, self.clbit1], []) out_edges = self.dag.edges(self.dag.output_map.values()) self.assertEqual(list(out_edges), []) in_edges = self.dag.edges(self.dag.input_map.values()) # number of edges for input nodes should be the same as number of wires self.assertEqual(len(list(in_edges)), 5)
def _get_rule(self, node): q = QuantumRegister(node.op.num_qubits, "q") if node.name == "u1": rule = [(RZGate(node.op.params[0]), [q[0]], [])] elif node.name == "u2": rule = [ (RZGate(node.op.params[1]), [q[0]], []), (SYGate(), [q[0]], []), (RZGate(node.op.params[0]), [q[0]], []), ] elif node.name == "u3": rule = [ (RZGate(node.op.params[2]), [q[0]], []), (RYGate(node.op.params[0]), [q[0]], []), (RZGate(node.op.params[1]), [q[0]], []), ] elif node.name == "cx": # // controlled-NOT as per Maslov (2017); this implementation takes s = v = +1 # gate cx a,b # { # ry(pi/2) a; # ms(pi/2, 0) a,b; # rx(-pi/2) a; # rx(-pi/2) b; # ry(-pi/2) a; # } rule = [ (SYGate(), [q[0]], []), (MSGate(pi / 2, 0), [q[0], q[1]], []), (RXGate(-pi / 2), [q[0]], []), (RXGate(-pi / 2), [q[1]], []), (RYGate(-pi / 2), [q[0]], []), ] elif node.name == "rx": if node.op.params[0] == pi: rule = [(XGate(), [q[0]], [])] elif node.op.params[0] == pi / 2: rule = [(SXGate(), [q[0]], [])] else: rule = [(RGate(0, node.op.params[0]), [q[0]], [])] elif node.name == "h": rule = [ (ZGate(), [q[0]], []), (SYGate(), [q[0]], []), ] elif node.name == "ry": if node.op.params[0] == pi: rule = [(YGate(), [q[0]], [])] elif node.op.params[0] == pi / 2: rule = [(SYGate(), [q[0]], [])] else: rule = [(RGate(pi / 2, node.op.params[0]), [q[0]], [])] else: rule = node.op.definition return rule
def _define_from_label(self): q = QuantumRegister(self.num_qubits, "q") initialize_circuit = QuantumCircuit(q, name="init_def") for qubit, param in enumerate(reversed(self.params)): initialize_circuit.append(Reset(), [q[qubit]]) if param == "1": initialize_circuit.append(XGate(), [q[qubit]]) elif param == "+": initialize_circuit.append(HGate(), [q[qubit]]) elif param == "-": initialize_circuit.append(XGate(), [q[qubit]]) initialize_circuit.append(HGate(), [q[qubit]]) elif param == "r": # |+i> initialize_circuit.append(HGate(), [q[qubit]]) initialize_circuit.append(SGate(), [q[qubit]]) elif param == "l": # |-i> initialize_circuit.append(HGate(), [q[qubit]]) initialize_circuit.append(SdgGate(), [q[qubit]]) return initialize_circuit
def _define_from_label(self): q = QuantumRegister(self.num_qubits, 'q') initialize_circuit = QuantumCircuit(q, name='init_def') for qubit, param in enumerate(reversed(self.params)): initialize_circuit.append(Reset(), [q[qubit]]) if param == '1': initialize_circuit.append(XGate(), [q[qubit]]) elif param == '+': initialize_circuit.append(HGate(), [q[qubit]]) elif param == '-': initialize_circuit.append(XGate(), [q[qubit]]) initialize_circuit.append(HGate(), [q[qubit]]) elif param == 'r': # |+i> initialize_circuit.append(HGate(), [q[qubit]]) initialize_circuit.append(SGate(), [q[qubit]]) elif param == 'l': # |-i> initialize_circuit.append(HGate(), [q[qubit]]) initialize_circuit.append(SdgGate(), [q[qubit]]) return initialize_circuit
def setUp(self): self.dag = DAGCircuit() qreg = QuantumRegister(3, 'qr') creg = ClassicalRegister(2, 'cr') self.dag.add_qreg(qreg) self.dag.add_creg(creg) self.qubit0 = qreg[0] self.qubit1 = qreg[1] self.qubit2 = qreg[2] self.clbit0 = creg[0] self.clbit1 = creg[1] self.condition = (creg, 3) self.dag.apply_operation_back(HGate(), [self.qubit0], []) self.dag.apply_operation_back(CXGate(), [self.qubit0, self.qubit1], []) self.dag.apply_operation_back(XGate(), [self.qubit1], [])
def _define_from_int(self): q = QuantumRegister(self.num_qubits, 'q') initialize_circuit = QuantumCircuit(q, name='init_def') # Convert to int since QuantumCircuit converted to complex # and make a bit string and reverse it intstr = f'{int(np.real(self.params[0])):0{self.num_qubits}b}'[::-1] # Raise if number of bits is greater than num_qubits if len(intstr) > self.num_qubits: raise QiskitError("Initialize integer has %s bits, but this exceeds the" " number of qubits in the circuit, %s." % (len(intstr), self.num_qubits)) for qubit, bit in enumerate(intstr): initialize_circuit.append(Reset(), [q[qubit]]) if bit == '1': initialize_circuit.append(XGate(), [q[qubit]]) return initialize_circuit
def _define_from_int(self): q = QuantumRegister(self.num_qubits, "q") initialize_circuit = QuantumCircuit(q, name="init_def") # Convert to int since QuantumCircuit converted to complex # and make a bit string and reverse it intstr = f"{int(np.real(self.params[0])):0{self.num_qubits}b}"[::-1] # Raise if number of bits is greater than num_qubits if len(intstr) > self.num_qubits: raise QiskitError( "StatePreparation integer has %s bits, but this exceeds the" " number of qubits in the circuit, %s." % (len(intstr), self.num_qubits)) for qubit, bit in enumerate(intstr): if bit == "1": initialize_circuit.append(XGate(), [q[qubit]]) # note: X is it's own inverse, so even if self._inverse is True, # we don't need to invert anything return initialize_circuit